From 490b6216f5ec41157dac70f953a35a4d81846af9 Mon Sep 17 00:00:00 2001 From: helmutm Date: Fri, 7 Dec 2007 16:22:35 +0000 Subject: [PATCH] more on knowledge.glossary: edit, assign children git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@2219 fd906abe-77d9-0310-91a1-e0d9ade77398 --- browser/common.py | 1 + browser/configure.zcml | 1 + browser/form.py | 2 +- browser/form_macros.pt | 11 ++- browser/loops.js | 12 +-- browser/loops1.js | 148 ++++++++++++++++++++++++++++++ browser/node.py | 1 + knowledge/README.txt | 9 ++ knowledge/glossary/browser.py | 90 ++++++++++++++++-- knowledge/glossary/configure.zcml | 16 ++++ knowledge/glossary/view_macros.pt | 36 +++++++- 11 files changed, 310 insertions(+), 17 deletions(-) create mode 100644 browser/loops1.js diff --git a/browser/common.py b/browser/common.py index a1bb085..1af60ff 100644 --- a/browser/common.py +++ b/browser/common.py @@ -379,6 +379,7 @@ class BaseView(GenericView): def registerDojo(self): cm = self.controller.macros cm.register('js', 'dojo.js', resourceName='ajax.dojo/dojo.js') + #cm.register('js', 'dojo.js', resourceName='ajax.dojo1/dojo/dojo.js') # vocabulary stuff diff --git a/browser/configure.zcml b/browser/configure.zcml index 77175e8..4acabda 100644 --- a/browser/configure.zcml +++ b/browser/configure.zcml @@ -15,6 +15,7 @@ + diff --git a/browser/form.py b/browser/form.py index 5b3d5f8..cb786ca 100644 --- a/browser/form.py +++ b/browser/form.py @@ -202,7 +202,7 @@ class EditConceptForm(EditObjectForm): def assignments(self): for c in self.target.getParentRelations(): r = ConceptRelationView(c, self.request) - if not r.isProtected: + if not r.isProtected and r.context != self.target: yield r diff --git a/browser/form_macros.pt b/browser/form_macros.pt index fde5191..7fcaee0 100644 --- a/browser/form_macros.pt +++ b/browser/form_macros.pt @@ -155,11 +155,20 @@ name="concept.search.text" id="concept.search.text" tal:attributes="dataUrl string:listConceptsForComboBox.js?searchString=%{searchString}&searchType=" /> + +
+
+ +
+ onClick="addConceptAssignment('concept', 'assignments')" /> diff --git a/browser/loops.js b/browser/loops.js index 2cfb56b..96aee1f 100644 --- a/browser/loops.js +++ b/browser/loops.js @@ -120,15 +120,15 @@ function objectDialog(dlgName, url) { dlg.show(); } -function addConceptAssignment() { +function addConceptAssignment(prefix, suffix) { dojo.require('dojo.html') - node = dojo.byId('form.assignments'); + node = dojo.byId('form.' + suffix); els = document.forms[0].elements; for (var i=0; i' + title + ''; + td.innerHTML = '' + title + ''; var tr = document.createElement('tr'); tr.appendChild(td); node.appendChild(tr); diff --git a/browser/loops1.js b/browser/loops1.js new file mode 100644 index 0000000..eb76aa6 --- /dev/null +++ b/browser/loops1.js @@ -0,0 +1,148 @@ +/* $Id: loops.js 1965 2007-08-27 17:33:07Z helmutm $ */ + +function openEditWindow(url) { + zmi = window.open(url, 'zmi'); + zmi.focus(); + return false; +} + +function focusOpener() { + if (typeof(opener) != 'undefined' && opener != null) { + opener.location.reload(); + opener.focus(); + } +} + +function replaceFieldsNode(targetId, typeId, url) { + token = dojo.byId(typeId).value; + uri = url + '?form.type=' + token; + dojo.io.updateNode(targetId, uri); +} + +function submitReplacing(targetId, formId, actionUrl) { + dojo.io.updateNode(targetId, { + url: actionUrl, + formNode: dojo.byId(formId), + method: 'post' + }); + return false; +} + +function submitReplacingOrReloading(targetId, formId, actionUrl) { + node = dojo.byId(targetId); + var args = { + url: actionUrl, + formNode: dojo.byId(formId), + method: 'post', + mimetype: "text/html" + }; + args.load = function (t, d, e) { + if (d.length < 10) { + document.location.reload(false); + } else { + while (node.firstChild) { + dojo.dom.destroyNode(node.firstChild); + } + node.innerHTML = d; + } + }; + dojo.io.bind(args); + return false; +} + +function inlineEdit(id, saveUrl) { + var iconNode = dojo.byId('inlineedit_icon'); + iconNode.style.visibility = 'hidden'; + editor = dojo.widget.createWidget('Editor', + {items: ['save', '|', 'formatblock', '|', + 'insertunorderedlist', 'insertorderedlist', '|', + 'bold', 'italic', '|', 'createLink', 'insertimage'], + saveUrl: saveUrl, + //closeOnSave: true, + htmlEditing: true + //onClose: function() { + /* onSave: function() { + this.disableToolbar(true); + iconNode.style.visibility = 'visible'; + //window.location.reload(); + }*/ + }, dojo.byId(id)); + editor._save = function (e) { + if (!this._richText.isClosed) { + if (this.saveUrl.length) { + var content = {}; + this._richText.contentFilters = []; + content[this.saveArgName] = this.getHtml(); + content['version'] = 'this'; + dojo.io.bind({method:this.saveMethod, + url:this.saveUrl, + content:content, + handle:function(type, data, ti, kwargs) { + location.reload(false); + } + }); //alert('save'); + } else { + dojo.debug("please set a saveUrl for the editor"); + } + if (this.closeOnSave) { + this._richText.close(e.getName().toLowerCase() == "save"); + } + } + } + return false; +} + +function setConceptTypeForComboBox(typeId, cbId) { + var t = dojo.byId(typeId).value; + var cb = dijit.byId(cbId) + var dp = cb.store; + var baseUrl = dp.url.split('&')[0]; + var newUrl = baseUrl + '&searchType=' + t; + dp.url = newUrl; + cb.setValue(''); +} +x +var dialogs = {} + +function objectDialog(dlgName, url) { + dojo.require('dijit.Dialog'); + dojo.require('dijit.form.ComboBox'); + dojo.require('dojox.data.QueryReadStore'); + dlg = dialogs[dlgName]; + if (!dlg) { + dlg = new dijit.Dialog( + {bgColor: 'white', bgOpacity: 0.5, toggle: 'fade', toggleDuration: 250, + executeScripts: true, + href: url + }, dojo.byId('dialog.' + dlgName)); + dialogs[dlgName] = dlg; + } + dlg.show(); +} + +function addConceptAssignment() { + dojo.require('dojo.html') + node = dojo.byId('form.assignments'); + els = document.forms[0].elements; + for (var i=0; i' + title + ''; + var tr = document.createElement('tr'); + tr.appendChild(td); + node.appendChild(tr); +} + diff --git a/browser/node.py b/browser/node.py index fb27b8d..632478e 100644 --- a/browser/node.py +++ b/browser/node.py @@ -76,6 +76,7 @@ class NodeView(BaseView): cm.register('css', identifier='loops.css', resourceName='loops.css', media='all', position=3) cm.register('js', 'loops.js', resourceName='loops.js') + #cm.register('js', 'loops.js', resourceName='loops1.js') cm.register('portlet_left', 'navigation', title='Navigation', subMacro=node_macros.macros['menu']) #if not IUnauthenticatedPrincipal.providedBy(self.request.principal): diff --git a/knowledge/README.txt b/knowledge/README.txt index b168650..ebfb43c 100644 --- a/knowledge/README.txt +++ b/knowledge/README.txt @@ -162,6 +162,15 @@ For testing, we first have to provide the needed utilities and settings >>> view = MyKnowledge(task01C, request) >>> prov = view.myKnowledgeProvidersForTask() +Glossaries +========== + +Glossary items are topic-like concepts that may be edited by end users. + + >>> from loops.knowledge.glossary.browser import CreateGlossaryItemForm + >>> from loops.knowledge.glossary.browser import EditGlossaryItemForm + >>> from loops.knowledge.glossary.browser import CreateGlossaryItem + >>> from loops.knowledge.glossary.browser import EditGlossaryItem Fin de partie diff --git a/knowledge/glossary/browser.py b/knowledge/glossary/browser.py index efd790b..73bfd12 100755 --- a/knowledge/glossary/browser.py +++ b/knowledge/glossary/browser.py @@ -76,18 +76,92 @@ class GlossaryItemView(ConceptView): return actions -class CreateGlossaryItemForm(CreateConceptForm): - - @Lazy - def customMacro(self): - return view_macros.macros['children'] - - -class EditGlossaryItemForm(CreateGlossaryItemForm, EditConceptForm): +class EditGlossaryItemForm(EditConceptForm, ConceptView): title = _(u'Edit Glossary Item') + form_action = 'edit_glossaryitem' @Lazy def macro(self): return self.template.macros['edit'] + @Lazy + def customMacro(self): + return view_macros.macros['children'] + + def children(self): + return ConceptView.children(self.virtualTarget) + + @Lazy + def relatedPredicate(self): + return self.loopsRoot.getConceptManager().get('related') + + @Lazy + def relatedPredicateUid(self): + pred = self.relatedPredicate + return pred and util.getUidForObject(pred) or self.defaultPredicateUid + + +class CreateGlossaryItemForm(CreateConceptForm, EditGlossaryItemForm): + + form_action = 'create_glossaryitem' + + def children(self): + return [] + + +class EditGlossaryItem(EditConcept): + + childPrefix = 'children.' + + oldChildren = None + selectedChildren = None + + def updateFields(self): + obj = self.object + form = self.request.form + formState = EditConcept.updateFields(self) + for k in form.keys(): + if k.startswith(self.prefix): + fn = k[len(self.prefix):] + value = form[k] + if fn.startswith(self.childPrefix) and value: + self.collectChildren(fn[len(self.childPrefix):], value) + if self.oldChildren or self.selectedChildren: + self.assignChildren(obj) + return formState + + def collectChildren(self, fieldName, value): + if self.oldChildren is None: + self.oldChildren = [] + if self.selectedChildren is None: + self.selectedChildren = [] + for v in value: + if fieldName == 'old': + self.oldChildren.append(v) + elif fieldName == 'selected' and v not in self.selectedChildren: + self.selectedChildren.append(v) + + def assignChildren(self, obj): + for v in self.oldChildren: + if v not in self.selectedChildren: + c, p = v.split(':') + concept = util.getObjectForUid(c) + predicate = util.getObjectForUid(p) + obj.deassignChild(concept, [predicate]) + for v in self.selectedChildren: + if v != 'none' and v not in self.oldChildren: + c, p = v.split(':') + concept = util.getObjectForUid(c) + predicate = util.getObjectForUid(p) + exists = obj.getChildRelations([p], concept) + if not exists: + obj.assignChild(concept, predicate) + + +class CreateGlossaryItem(EditGlossaryItem, CreateConcept): + + def update(self): + result = CreateConcept.update(self) + return result + diff --git a/knowledge/glossary/configure.zcml b/knowledge/glossary/configure.zcml index a219532..6919ed3 100755 --- a/knowledge/glossary/configure.zcml +++ b/knowledge/glossary/configure.zcml @@ -38,4 +38,20 @@ permission="zope.ManageContent" /> + + + + diff --git a/knowledge/glossary/view_macros.pt b/knowledge/glossary/view_macros.pt index bdcc429..a0866a6 100755 --- a/knowledge/glossary/view_macros.pt +++ b/knowledge/glossary/view_macros.pt @@ -35,4 +35,38 @@ Assign Child Concepts - \ No newline at end of file + + + + + + Something + (Something) + + + + + Type: + Glossary Item + + + + + + + + + + +