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 |
+
+ |
+
+
+
+ |
+
+
+ |
+
+