From 4c48396c13eb0540c620f0fffcd507eeb94d0262 Mon Sep 17 00:00:00 2001 From: helmutm Date: Sat, 12 Aug 2006 22:11:47 +0000 Subject: [PATCH] work in progress: wysiwyg editing with dojo - preparing node macros git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@1297 fd906abe-77d9-0310-91a1-e0d9ade77398 --- README.txt | 8 +++++ browser/common.py | 4 +-- browser/concept_macros.pt | 3 +- browser/node.pt | 10 +++++- browser/node.py | 48 +++++++++++++++++++++++------ browser/node_macros.pt | 64 +++++++++++++++++++++++++++------------ resource.py | 2 ++ search/README.txt | 2 -- search/browser.py | 10 ++---- search/search.pt | 2 +- 10 files changed, 109 insertions(+), 44 deletions(-) diff --git a/README.txt b/README.txt index 33e81d3..b903314 100755 --- a/README.txt +++ b/README.txt @@ -465,6 +465,14 @@ Node Views ... print item.url, view.selected(item) http://127.0.0.1/loops/views/m1/m11 True +A NodeView provides an itemNum attribute that may be used to count elements +appearing on a page. Thus a template may construct unique ids for elements. + + >>> view.itemNum + 1 + >>> view.itemNum + 2 + There is an openEditWindow() method that returns a JavaScript call for opening a new browser window for editing; but only if the view is editable: diff --git a/browser/common.py b/browser/common.py index 6a735b8..ff3eb86 100644 --- a/browser/common.py +++ b/browser/common.py @@ -169,7 +169,6 @@ class BaseView(object): @Lazy def uniqueId(self): return zapi.getUtility(IRelationRegistry).getUniqueIdForObject(self.context) - #return zapi.getUtility(IIntIds).getId(self.context) @Lazy def editable(self): @@ -182,7 +181,8 @@ class BaseView(object): @Lazy def xeditable(self): - return getattr(self.context, 'contentType', '').startswith('text/') + return self.request.principal.id == 'rootadmin' + #return getattr(self.context, 'contentType', '').startswith('text/') class LoopsTerms(object): diff --git a/browser/concept_macros.pt b/browser/concept_macros.pt index c6824c3..ffe1a9e 100644 --- a/browser/concept_macros.pt +++ b/browser/concept_macros.pt @@ -13,8 +13,7 @@ -
+
diff --git a/browser/node.pt b/browser/node.pt index 238f9f5..2fe2b51 100644 --- a/browser/node.pt +++ b/browser/node.pt @@ -1,4 +1,4 @@ - + @@ -13,6 +13,14 @@ controller.macros.register('js', resourceName='ajax.dojo/dojo.js');" /> + + + + + diff --git a/browser/node.py b/browser/node.py index fe107fb..91393d1 100644 --- a/browser/node.py +++ b/browser/node.py @@ -31,7 +31,7 @@ from zope.app.container.browser.contents import JustContents from zope.app.container.browser.adding import ContentAdding from zope.app.event.objectevent import ObjectCreatedEvent, ObjectModifiedEvent from zope.app.pagetemplate import ViewPageTemplateFile -from zope.app.intid.interfaces import IIntIds +#from zope.app.intid.interfaces import IIntIds from zope.dottedname.resolve import resolve from zope.event import notify from zope.formlib.namedtemplate import NamedTemplate @@ -51,15 +51,13 @@ from loops.browser.concept import ConceptView class NodeView(BaseView): + _itemNum = 0 + template = NamedTemplate('loops.node_macros') @Lazy def macro(self): return self.template.macros['content'] - #macroName = self.request.get('loops.viewName') - #if not macroName: - # macroName = self.context.viewName or 'content' - #return self.template.macros[macroName] @Lazy def view(self): @@ -95,6 +93,11 @@ class NodeView(BaseView): return [NodeView(child, self.request) for child in self.context.getPageItems()] + @property + def itemNum(self): + self._itemNum += 1 + return self._itemNum + @Lazy def nodeType(self): return self.context.nodeType @@ -139,13 +142,13 @@ class NodeView(BaseView): @Lazy def bodyMacro(self): - # ?TODO: replace by: return self.target.macroName + # TODO: replace by: return self.target.macroName target = self.targetObject if target is None or IDocument.providedBy(target): return 'textbody' if IConcept.providedBy(target): return 'conceptbody' - if IMediaAsset.providedBy(target) and target.contentType.startswith('image/'): + if IResource.providedBy(target) and target.contentType.startswith('image/'): return 'imagebody' return 'filebody' @@ -223,12 +226,39 @@ class NodeView(BaseView): return targetView() return u'' - def targetId(self): + @Lazy + def virtualTarget(self): target = self.request.annotations.get('loops.view', {}).get('target') if target is None: target = self.targetObject + return target + + @Lazy + def targetId(self): + target = self.virtualTarget if target is not None: - return zapi.getUtility(IIntIds).getId(target) + return BaseView(target, self.request).uniqueId + #return target.uniqueId + #return zapi.getUtility(IIntIds).getId(target) + + @Lazy + def virtualTargetUrl(self): + targetId = self.targetId + if targetId is not None: + return '%s/.target%s' % (self.url, targetId) + + @Lazy + def realTargetUrl(self): + target = self.virtualTarget + if target is not None: + return BaseView(target, self.request).url + + @Lazy + def richEditable(self): + target = self.virtualTarget + if target is None: + return False + return canWrite(target, 'title') class ListPages(NodeView): diff --git a/browser/node_macros.pt b/browser/node_macros.pt index aea1bd3..a569075 100644 --- a/browser/node_macros.pt +++ b/browser/node_macros.pt @@ -5,28 +5,45 @@ - + + + - -
+
The body
-
- The body +
+
+ Edit +
+
+ The body +
@@ -34,8 +51,9 @@ -
Node Body
@@ -50,8 +68,9 @@ -
@@ -84,11 +104,12 @@
+ tal:content="structure item/body" + tal:attributes="ondblclick view/openEditWindow; + id string:${view/itemNum}.body;"> Listing

-
+
Item @@ -97,13 +118,18 @@ + tal:define="target item/target">
+ tal:content="structure item/body" + tal:attributes="ondblclick python: + target and target.openEditWindow('resources.html') + or item.openEditWindow(); + id string:${view/itemNum}.body;"> Listing

-
+
Error) return concepts and concepts[0] or cm.get('file', None) def setResourceType(self, concept): + if concept is None: + return current = self.getResourceType() if current != concept: typePred = self.getLoopsRoot().getConceptManager().getTypePredicate() diff --git a/search/README.txt b/search/README.txt index 91d4a9d..51c4183 100755 --- a/search/README.txt +++ b/search/README.txt @@ -59,8 +59,6 @@ The search view provides values for identifying the search form itself and the parameter rows; the rowNum is auto-incremented, so it should be accessed exactly once per row: - >>> searchView.itemNum - 1 >>> searchView.rowNum 1 >>> searchView.rowNum diff --git a/search/browser.py b/search/browser.py index bd961dd..8a4d943 100644 --- a/search/browser.py +++ b/search/browser.py @@ -48,16 +48,10 @@ class Search(BaseView): def macro(self): return self.template.macros['search'] - @Lazy - def itemNum(self): - """ Return a number identifying the item (the current search form) - on the page. - """ - return self.request.get('loops.itemNum', 1) - @property def rowNum(self): - """ Return the rowNum to be used for identifying the current row. + """ Return the rowNum to be used for identifying the current search + parameter row. """ n = self.request.get('loops.rowNum', 0) if n: # if given directly we don't use the calculation diff --git a/search/search.pt b/search/search.pt index 63b83a0..dc96372 100644 --- a/search/search.pt +++ b/search/search.pt @@ -7,7 +7,7 @@