more on knowledge.glossary: edit, assign children
git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@2219 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
parent
880fe69837
commit
490b6216f5
11 changed files with 310 additions and 17 deletions
|
@ -379,6 +379,7 @@ class BaseView(GenericView):
|
||||||
def registerDojo(self):
|
def registerDojo(self):
|
||||||
cm = self.controller.macros
|
cm = self.controller.macros
|
||||||
cm.register('js', 'dojo.js', resourceName='ajax.dojo/dojo.js')
|
cm.register('js', 'dojo.js', resourceName='ajax.dojo/dojo.js')
|
||||||
|
#cm.register('js', 'dojo.js', resourceName='ajax.dojo1/dojo/dojo.js')
|
||||||
|
|
||||||
|
|
||||||
# vocabulary stuff
|
# vocabulary stuff
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
|
|
||||||
<resource name="loops.css" file="loops.css" />
|
<resource name="loops.css" file="loops.css" />
|
||||||
<resource name="loops.js" file="loops.js" />
|
<resource name="loops.js" file="loops.js" />
|
||||||
|
<resource name="loops1.js" file="loops1.js" />
|
||||||
|
|
||||||
|
|
||||||
<!-- new style pages -->
|
<!-- new style pages -->
|
||||||
|
|
|
@ -202,7 +202,7 @@ class EditConceptForm(EditObjectForm):
|
||||||
def assignments(self):
|
def assignments(self):
|
||||||
for c in self.target.getParentRelations():
|
for c in self.target.getParentRelations():
|
||||||
r = ConceptRelationView(c, self.request)
|
r = ConceptRelationView(c, self.request)
|
||||||
if not r.isProtected:
|
if not r.isProtected and r.context != self.target:
|
||||||
yield r
|
yield r
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -155,11 +155,20 @@
|
||||||
name="concept.search.text" id="concept.search.text"
|
name="concept.search.text" id="concept.search.text"
|
||||||
tal:attributes="dataUrl
|
tal:attributes="dataUrl
|
||||||
string:listConceptsForComboBox.js?searchString=%{searchString}&searchType=" />
|
string:listConceptsForComboBox.js?searchString=%{searchString}&searchType=" />
|
||||||
|
<tal:dojo1 condition="nothing">
|
||||||
|
<div dojoType="dojox.data.QueryReadStore" jsId="conceptSearch"
|
||||||
|
tal:attributes="url
|
||||||
|
string:listConceptsForComboBox.js?searchString=%{searchString}&searchType=" >
|
||||||
|
</div>
|
||||||
|
<input dojoType="dijit.form.ComboBox" store="conceptSearch"
|
||||||
|
autoComplete="False"
|
||||||
|
name="concept.search.text" id="concept.search.text" />
|
||||||
|
</tal:dojo1>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<input type="button" value="Select"
|
<input type="button" value="Select"
|
||||||
i18n:attributes="value"
|
i18n:attributes="value"
|
||||||
onClick="addConceptAssignment()" />
|
onClick="addConceptAssignment('concept', 'assignments')" />
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
||||||
|
|
|
@ -120,15 +120,15 @@ function objectDialog(dlgName, url) {
|
||||||
dlg.show();
|
dlg.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
function addConceptAssignment() {
|
function addConceptAssignment(prefix, suffix) {
|
||||||
dojo.require('dojo.html')
|
dojo.require('dojo.html')
|
||||||
node = dojo.byId('form.assignments');
|
node = dojo.byId('form.' + suffix);
|
||||||
els = document.forms[0].elements;
|
els = document.forms[0].elements;
|
||||||
for (var i=0; i<els.length; i++) { //getElementsByName does not work here in IE
|
for (var i=0; i<els.length; i++) { //getElementsByName does not work here in IE
|
||||||
el = els[i];
|
el = els[i];
|
||||||
if (el.name == 'concept.search.text_selected') {
|
if (el.name == prefix + '.search.text_selected') {
|
||||||
cToken = el.value;
|
cToken = el.value;
|
||||||
} else if (el.name == 'concept.search.text') {
|
} else if (el.name == prefix + '.search.text') {
|
||||||
title = el.value;
|
title = el.value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -136,11 +136,11 @@ function addConceptAssignment() {
|
||||||
alert('Please select a concept!');
|
alert('Please select a concept!');
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
pToken = dojo.byId('concept.search.predicate').value;
|
pToken = dojo.byId(prefix + '.search.predicate').value;
|
||||||
token = cToken + ':' + pToken;
|
token = cToken + ':' + pToken;
|
||||||
var td = document.createElement('td');
|
var td = document.createElement('td');
|
||||||
td.colSpan = 5;
|
td.colSpan = 5;
|
||||||
td.innerHTML = '<input type="checkbox" name="form.assignments.selected:list" value="' + token + '" checked><span>' + title + '</span>';
|
td.innerHTML = '<input type="checkbox" name="form.' + suffix + '.selected:list" value="' + token + '" checked><span>' + title + '</span>';
|
||||||
var tr = document.createElement('tr');
|
var tr = document.createElement('tr');
|
||||||
tr.appendChild(td);
|
tr.appendChild(td);
|
||||||
node.appendChild(tr);
|
node.appendChild(tr);
|
||||||
|
|
148
browser/loops1.js
Normal file
148
browser/loops1.js
Normal file
|
@ -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<els.length; i++) { //getElementsByName does not work here in IE
|
||||||
|
el = els[i];
|
||||||
|
if (el.name == 'concept.search.text_selected') {
|
||||||
|
cToken = el.value;
|
||||||
|
} else if (el.name == 'concept.search.text') {
|
||||||
|
title = el.value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (cToken.length == 0) {
|
||||||
|
alert('Please select a concept!');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
pToken = dojo.byId('concept.search.predicate').value;
|
||||||
|
token = cToken + ':' + pToken;
|
||||||
|
var td = document.createElement('td');
|
||||||
|
td.colSpan = 5;
|
||||||
|
td.innerHTML = '<input type="checkbox" name="form.assignments.selected:list" value="' + token + '" checked><span>' + title + '</span>';
|
||||||
|
var tr = document.createElement('tr');
|
||||||
|
tr.appendChild(td);
|
||||||
|
node.appendChild(tr);
|
||||||
|
}
|
||||||
|
|
|
@ -76,6 +76,7 @@ class NodeView(BaseView):
|
||||||
cm.register('css', identifier='loops.css', resourceName='loops.css',
|
cm.register('css', identifier='loops.css', resourceName='loops.css',
|
||||||
media='all', position=3)
|
media='all', position=3)
|
||||||
cm.register('js', 'loops.js', resourceName='loops.js')
|
cm.register('js', 'loops.js', resourceName='loops.js')
|
||||||
|
#cm.register('js', 'loops.js', resourceName='loops1.js')
|
||||||
cm.register('portlet_left', 'navigation', title='Navigation',
|
cm.register('portlet_left', 'navigation', title='Navigation',
|
||||||
subMacro=node_macros.macros['menu'])
|
subMacro=node_macros.macros['menu'])
|
||||||
#if not IUnauthenticatedPrincipal.providedBy(self.request.principal):
|
#if not IUnauthenticatedPrincipal.providedBy(self.request.principal):
|
||||||
|
|
|
@ -162,6 +162,15 @@ For testing, we first have to provide the needed utilities and settings
|
||||||
>>> view = MyKnowledge(task01C, request)
|
>>> view = MyKnowledge(task01C, request)
|
||||||
>>> prov = view.myKnowledgeProvidersForTask()
|
>>> 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
|
Fin de partie
|
||||||
|
|
|
@ -76,18 +76,92 @@ class GlossaryItemView(ConceptView):
|
||||||
return actions
|
return actions
|
||||||
|
|
||||||
|
|
||||||
class CreateGlossaryItemForm(CreateConceptForm):
|
class EditGlossaryItemForm(EditConceptForm, ConceptView):
|
||||||
|
|
||||||
@Lazy
|
|
||||||
def customMacro(self):
|
|
||||||
return view_macros.macros['children']
|
|
||||||
|
|
||||||
|
|
||||||
class EditGlossaryItemForm(CreateGlossaryItemForm, EditConceptForm):
|
|
||||||
|
|
||||||
title = _(u'Edit Glossary Item')
|
title = _(u'Edit Glossary Item')
|
||||||
|
form_action = 'edit_glossaryitem'
|
||||||
|
|
||||||
@Lazy
|
@Lazy
|
||||||
def macro(self):
|
def macro(self):
|
||||||
return self.template.macros['edit']
|
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
|
||||||
|
|
||||||
|
|
|
@ -38,4 +38,20 @@
|
||||||
permission="zope.ManageContent"
|
permission="zope.ManageContent"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
<zope:adapter
|
||||||
|
name="create_glossaryitem"
|
||||||
|
for="loops.browser.node.NodeView
|
||||||
|
zope.publisher.interfaces.browser.IBrowserRequest"
|
||||||
|
factory="loops.knowledge.glossary.browser.CreateGlossaryItem"
|
||||||
|
permission="zope.ManageContent"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<zope:adapter
|
||||||
|
name="edit_glossaryitem"
|
||||||
|
for="loops.browser.node.NodeView
|
||||||
|
zope.publisher.interfaces.browser.IBrowserRequest"
|
||||||
|
factory="loops.knowledge.glossary.browser.EditGlossaryItem"
|
||||||
|
permission="zope.ManageContent"
|
||||||
|
/>
|
||||||
|
|
||||||
</configure>
|
</configure>
|
||||||
|
|
|
@ -35,4 +35,38 @@
|
||||||
<td colspan="5" class="headline"
|
<td colspan="5" class="headline"
|
||||||
i18n:translate="">Assign Child Concepts</td>
|
i18n:translate="">Assign Child Concepts</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tbody id="form.children">
|
||||||
|
<tr tal:repeat="relation view/children">
|
||||||
|
<td colspan="5">
|
||||||
|
<input type="hidden" name="form.children.old:list"
|
||||||
|
tal:attributes="value relation/uidToken"
|
||||||
|
tal:condition="relation/other" />
|
||||||
|
<input type="checkbox" checked name="form.children.selected:list"
|
||||||
|
tal:attributes="value relation/uidToken;" />
|
||||||
|
<span tal:content="relation/title">Something</span>
|
||||||
|
(<span i18n:translate="" tal:content="relation/typeTitle">Something</span>)
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
<tr>
|
||||||
|
<td><span i18n:translate="">Type</span>:</td>
|
||||||
|
<td><b i18n:translate="">Glossary Item</b></td>
|
||||||
|
<td>
|
||||||
|
<label for="child.search.text">
|
||||||
|
<span i18n:translate="">Concept</span>:</label></td>
|
||||||
|
<td>
|
||||||
|
<input type="hidden"
|
||||||
|
id="child.search.predicate"
|
||||||
|
tal:attributes="value view/relatedPredicateUid" />
|
||||||
|
<input dojoType="comboBox" mode="remote" autoComplete="False"
|
||||||
|
name="child.search.text" id="child.search.text"
|
||||||
|
tal:attributes="dataUrl
|
||||||
|
string:listConceptsForComboBox.js?searchString=%{searchString}&searchType=loops:concept:glossaryitem" />
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<input type="button" value="Select"
|
||||||
|
i18n:attributes="value"
|
||||||
|
onClick="addConceptAssignment('child', 'children')" />
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
</metal:block>
|
</metal:block>
|
Loading…
Add table
Reference in a new issue