more on inline editing with dojo
git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@1299 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
parent
4c48396c13
commit
689b6ca34a
9 changed files with 107 additions and 41 deletions
|
@ -184,6 +184,21 @@ class BaseView(object):
|
||||||
return self.request.principal.id == 'rootadmin'
|
return self.request.principal.id == 'rootadmin'
|
||||||
#return getattr(self.context, 'contentType', '').startswith('text/')
|
#return getattr(self.context, 'contentType', '').startswith('text/')
|
||||||
|
|
||||||
|
@Lazy
|
||||||
|
def inlineEditingActive(self):
|
||||||
|
return self.request.principal.id == 'rootadmin'
|
||||||
|
# this may depend on system and user settings...
|
||||||
|
return True
|
||||||
|
|
||||||
|
@Lazy
|
||||||
|
def inlineEditable(self):
|
||||||
|
if not self.inlineEditingActive:
|
||||||
|
return False
|
||||||
|
return canWrite(self.context, 'title')
|
||||||
|
|
||||||
|
def inlineEdit(self, id):
|
||||||
|
return 'return inlineEdit("%s")' %id
|
||||||
|
|
||||||
|
|
||||||
class LoopsTerms(object):
|
class LoopsTerms(object):
|
||||||
""" Provide the ITerms interface, e.g. for usage in selection
|
""" Provide the ITerms interface, e.g. for usage in selection
|
||||||
|
|
|
@ -530,6 +530,15 @@
|
||||||
permission="zope.View"
|
permission="zope.View"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
<!-- inner HTML views -->
|
||||||
|
|
||||||
|
<page
|
||||||
|
name="inline_edit.html"
|
||||||
|
for="loops.interfaces.INode"
|
||||||
|
class="loops.browser.node.InlineEdit"
|
||||||
|
permission="zope.View"
|
||||||
|
/>
|
||||||
|
|
||||||
<!-- render file or image assigned to a node as target -->
|
<!-- render file or image assigned to a node as target -->
|
||||||
|
|
||||||
<page
|
<page
|
||||||
|
|
|
@ -21,3 +21,11 @@ function submitReplacing(targetId, formId, actionUrl) {
|
||||||
});
|
});
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function inlineEdit(id) {
|
||||||
|
var editor = dojo.widget.fromScript("Editor",
|
||||||
|
{items: ["save", "|", "formatblock", "|",
|
||||||
|
"insertunorderedlist", "insertorderedlist", "|",
|
||||||
|
"bold", "italic", "|", "createLink"]}, dojo.byId(id));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
|
|
||||||
|
|
||||||
<metal:block fill-slot="ecmascript_slot"
|
<metal:block fill-slot="ecmascript_slot"
|
||||||
tal:condition="nothing">
|
tal:condition="view/inlineEditingActive | nothing">
|
||||||
<script>
|
<script>
|
||||||
dojo.require("dojo.widget.Editor");
|
dojo.require("dojo.widget.Editor");
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -39,6 +39,7 @@ from zope.proxy import removeAllProxies
|
||||||
from zope.security import canAccess, canWrite
|
from zope.security import canAccess, canWrite
|
||||||
from zope.security.proxy import removeSecurityProxy
|
from zope.security.proxy import removeSecurityProxy
|
||||||
|
|
||||||
|
from cybertools.ajax import innerHtml
|
||||||
from cybertools.browser import configurator
|
from cybertools.browser import configurator
|
||||||
from cybertools.typology.interfaces import ITypeManager
|
from cybertools.typology.interfaces import ITypeManager
|
||||||
from loops.interfaces import IConcept, IResource, IDocument, IMediaAsset, INode
|
from loops.interfaces import IConcept, IResource, IDocument, IMediaAsset, INode
|
||||||
|
@ -227,19 +228,25 @@ class NodeView(BaseView):
|
||||||
return u''
|
return u''
|
||||||
|
|
||||||
@Lazy
|
@Lazy
|
||||||
def virtualTarget(self):
|
def virtualTargetObject(self):
|
||||||
target = self.request.annotations.get('loops.view', {}).get('target')
|
target = self.request.annotations.get('loops.view', {}).get('target')
|
||||||
if target is None:
|
if target is None:
|
||||||
target = self.targetObject
|
target = self.targetObject
|
||||||
return target
|
return target
|
||||||
|
|
||||||
|
@Lazy
|
||||||
|
def virtualTarget(self):
|
||||||
|
obj = self.virtualTargetObject
|
||||||
|
if obj is not None:
|
||||||
|
basicView = zapi.getMultiAdapter((obj, self.request))
|
||||||
|
basicView._viewName = self.context.viewName
|
||||||
|
return basicView.view
|
||||||
|
|
||||||
@Lazy
|
@Lazy
|
||||||
def targetId(self):
|
def targetId(self):
|
||||||
target = self.virtualTarget
|
target = self.virtualTargetObject
|
||||||
if target is not None:
|
if target is not None:
|
||||||
return BaseView(target, self.request).uniqueId
|
return BaseView(target, self.request).uniqueId
|
||||||
#return target.uniqueId
|
|
||||||
#return zapi.getUtility(IIntIds).getId(target)
|
|
||||||
|
|
||||||
@Lazy
|
@Lazy
|
||||||
def virtualTargetUrl(self):
|
def virtualTargetUrl(self):
|
||||||
|
@ -249,18 +256,35 @@ class NodeView(BaseView):
|
||||||
|
|
||||||
@Lazy
|
@Lazy
|
||||||
def realTargetUrl(self):
|
def realTargetUrl(self):
|
||||||
target = self.virtualTarget
|
target = self.virtualTargetObject
|
||||||
if target is not None:
|
if target is not None:
|
||||||
return BaseView(target, self.request).url
|
return BaseView(target, self.request).url
|
||||||
|
|
||||||
@Lazy
|
@Lazy
|
||||||
def richEditable(self):
|
def inlineEditable(self):
|
||||||
target = self.virtualTarget
|
target = self.virtualTarget
|
||||||
if target is None:
|
return target and target.inlineEditable or False
|
||||||
return False
|
|
||||||
return canWrite(target, 'title')
|
|
||||||
|
|
||||||
|
|
||||||
|
# inner HTML views
|
||||||
|
|
||||||
|
class InlineEdit(NodeView):
|
||||||
|
""" Provides inline editor as inner HTML - OBSOLETE, use as an example only!"""
|
||||||
|
|
||||||
|
@Lazy
|
||||||
|
def macro(self):
|
||||||
|
return self.template.macros['inline_edit']
|
||||||
|
|
||||||
|
def __call__(self):
|
||||||
|
return innerHtml(self)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def body(self):
|
||||||
|
return self.virtualTargetObject.data
|
||||||
|
|
||||||
|
|
||||||
|
# special (named) views for nodes
|
||||||
|
|
||||||
class ListPages(NodeView):
|
class ListPages(NodeView):
|
||||||
|
|
||||||
@Lazy
|
@Lazy
|
||||||
|
|
|
@ -11,13 +11,10 @@
|
||||||
</metal:block>
|
</metal:block>
|
||||||
|
|
||||||
|
|
||||||
<!-- dojoType="Editor"
|
|
||||||
items="formatblock;|;insertunorderedlist;insertorderedlist;|;bold;italic;|;createLink;"
|
|
||||||
-->
|
|
||||||
|
|
||||||
<metal:body define-macro="textbody">
|
<metal:body define-macro="textbody">
|
||||||
<tal:body define="body item/body;
|
<tal:body define="body item/body;
|
||||||
id string:${view/itemNum}.body">
|
itemNum view/itemNum;
|
||||||
|
id string:$itemNum.body;">
|
||||||
<div class="content-1" id="1.body"
|
<div class="content-1" id="1.body"
|
||||||
tal:condition="body"
|
tal:condition="body"
|
||||||
tal:attributes="class string:content-$level;
|
tal:attributes="class string:content-$level;
|
||||||
|
@ -26,7 +23,8 @@
|
||||||
tal:content="structure body">
|
tal:content="structure body">
|
||||||
The body
|
The body
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div tal:define="target item/target"
|
||||||
|
tal:condition="target">
|
||||||
<div class="subcolumn"
|
<div class="subcolumn"
|
||||||
tal:condition="item/xeditable | nothing">
|
tal:condition="item/xeditable | nothing">
|
||||||
<a href="#" title="Edit" style="padding: 5px"
|
<a href="#" title="Edit" style="padding: 5px"
|
||||||
|
@ -35,9 +33,15 @@
|
||||||
src="edit.gif" alt="Edit"
|
src="edit.gif" alt="Edit"
|
||||||
tal:attributes="src context/++resource++edit.gif" /></a>
|
tal:attributes="src context/++resource++edit.gif" /></a>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="subcolumn"
|
||||||
|
tal:condition="item/inlineEditable">
|
||||||
|
<a href="#" title="Edit" style="padding: 5px"
|
||||||
|
tal:attributes="title string:Edit ${item/title};
|
||||||
|
onclick python: item.inlineEdit(id)"><img
|
||||||
|
src="edit.gif" alt="Edit"
|
||||||
|
tal:attributes="src context/++resource++edit.gif" /></a>
|
||||||
|
</div>
|
||||||
<div class="content-1 subcolumn" id="1.body"
|
<div class="content-1 subcolumn" id="1.body"
|
||||||
tal:define="target item/target"
|
|
||||||
tal:condition="target"
|
|
||||||
tal:attributes="class string:content-$level;
|
tal:attributes="class string:content-$level;
|
||||||
id id;
|
id id;
|
||||||
ondblclick python: item.openEditWindow('configure.html')"
|
ondblclick python: item.openEditWindow('configure.html')"
|
||||||
|
@ -60,7 +64,6 @@
|
||||||
<tal:concepts define="item item/target;
|
<tal:concepts define="item item/target;
|
||||||
macro item/macro">
|
macro item/macro">
|
||||||
<div metal:use-macro="macro" />
|
<div metal:use-macro="macro" />
|
||||||
<!--<div metal:use-macro="views/concept_macros/conceptlisting2" />-->
|
|
||||||
</tal:concepts>
|
</tal:concepts>
|
||||||
</tal:body>
|
</tal:body>
|
||||||
</metal:body>
|
</metal:body>
|
||||||
|
@ -159,7 +162,24 @@
|
||||||
</metal:menu>
|
</metal:menu>
|
||||||
|
|
||||||
|
|
||||||
<!-- and other stuff -->
|
<!-- inner HTML macros -->
|
||||||
|
|
||||||
|
<div metal:define-macro="inline_edit"
|
||||||
|
class="content-1" id="1.body">
|
||||||
|
<form action="." method="post" id="1.form">
|
||||||
|
<div dojoType="Editor"
|
||||||
|
tal:content="structure view/body">
|
||||||
|
The body
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- dojoType="Editor"
|
||||||
|
items="formatblock;|;insertunorderedlist;insertorderedlist;|;bold;italic;|;createLink;"
|
||||||
|
-->
|
||||||
|
|
||||||
|
|
||||||
|
<!-- edit and other links -->
|
||||||
|
|
||||||
<metal:editlink define-macro="editlink">
|
<metal:editlink define-macro="editlink">
|
||||||
<a target="zmi"
|
<a target="zmi"
|
||||||
|
|
|
@ -29,24 +29,22 @@ from zope.cachedescriptors.property import Lazy
|
||||||
from zope.formlib.namedtemplate import NamedTemplate, NamedTemplateImplementation
|
from zope.formlib.namedtemplate import NamedTemplate, NamedTemplateImplementation
|
||||||
from zope.i18nmessageid import MessageFactory
|
from zope.i18nmessageid import MessageFactory
|
||||||
|
|
||||||
|
from cybertools.ajax import innerHtml
|
||||||
from loops.browser.common import BaseView
|
from loops.browser.common import BaseView
|
||||||
|
|
||||||
_ = MessageFactory('zope')
|
_ = MessageFactory('zope')
|
||||||
|
|
||||||
|
template = ViewPageTemplateFile('search.pt')
|
||||||
search_macros = NamedTemplateImplementation(
|
|
||||||
ViewPageTemplateFile('search.pt'))
|
|
||||||
|
|
||||||
|
|
||||||
class Search(BaseView):
|
class Search(BaseView):
|
||||||
|
|
||||||
template = NamedTemplate('loops.search_macros')
|
|
||||||
|
|
||||||
maxRowNum = 0
|
maxRowNum = 0
|
||||||
|
|
||||||
|
template = template
|
||||||
|
|
||||||
@Lazy
|
@Lazy
|
||||||
def macro(self):
|
def macro(self):
|
||||||
return self.template.macros['search']
|
return template.macros['search']
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def rowNum(self):
|
def rowNum(self):
|
||||||
|
@ -67,11 +65,12 @@ class Search(BaseView):
|
||||||
|
|
||||||
|
|
||||||
class SearchResults(BaseView):
|
class SearchResults(BaseView):
|
||||||
|
""" Provides results as inner HTML """
|
||||||
|
|
||||||
innerHtml_template = NamedTemplate('loops.search_macros')
|
@Lazy
|
||||||
innerHtml_macro = 'search_results'
|
def macro(self):
|
||||||
template = NamedTemplate('ajax.inner.html')
|
return template.macros['search_results']
|
||||||
|
|
||||||
def __call__(self):
|
def __call__(self):
|
||||||
return self.template(self)
|
return innerHtml(self)
|
||||||
|
|
||||||
|
|
|
@ -6,15 +6,6 @@
|
||||||
i18n_domain="zope"
|
i18n_domain="zope"
|
||||||
>
|
>
|
||||||
|
|
||||||
<!-- named templates -->
|
|
||||||
|
|
||||||
<zope:adapter
|
|
||||||
factory="loops.search.browser.search_macros"
|
|
||||||
for="loops.browser.common.BaseView"
|
|
||||||
name="loops.search_macros" />
|
|
||||||
|
|
||||||
<!-- the real view -->
|
|
||||||
|
|
||||||
<zope:adapter
|
<zope:adapter
|
||||||
name="search"
|
name="search"
|
||||||
for="loops.interfaces.IConcept
|
for="loops.interfaces.IConcept
|
||||||
|
|
|
@ -39,7 +39,7 @@
|
||||||
id="1.results">
|
id="1.results">
|
||||||
<fieldset class="box">
|
<fieldset class="box">
|
||||||
Search results
|
Search results
|
||||||
<p tal:content="python:request.get('1.search.1.text', 'nothing')" />
|
<p tal:content="python:request.get('2.search.1.text', 'nothing')" />
|
||||||
</fieldset>
|
</fieldset>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue