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):
|
||||
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
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
|
||||
<resource name="loops.css" file="loops.css" />
|
||||
<resource name="loops.js" file="loops.js" />
|
||||
<resource name="loops1.js" file="loops1.js" />
|
||||
|
||||
|
||||
<!-- new style pages -->
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
@ -155,11 +155,20 @@
|
|||
name="concept.search.text" id="concept.search.text"
|
||||
tal:attributes="dataUrl
|
||||
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>
|
||||
<input type="button" value="Select"
|
||||
i18n:attributes="value"
|
||||
onClick="addConceptAssignment()" />
|
||||
onClick="addConceptAssignment('concept', 'assignments')" />
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
|
|
|
@ -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<els.length; i++) { //getElementsByName does not work here in IE
|
||||
el = els[i];
|
||||
if (el.name == 'concept.search.text_selected') {
|
||||
if (el.name == prefix + '.search.text_selected') {
|
||||
cToken = el.value;
|
||||
} else if (el.name == 'concept.search.text') {
|
||||
} else if (el.name == prefix + '.search.text') {
|
||||
title = el.value;
|
||||
}
|
||||
}
|
||||
|
@ -136,11 +136,11 @@ function addConceptAssignment() {
|
|||
alert('Please select a concept!');
|
||||
return false;
|
||||
}
|
||||
pToken = dojo.byId('concept.search.predicate').value;
|
||||
pToken = dojo.byId(prefix + '.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>';
|
||||
td.innerHTML = '<input type="checkbox" name="form.' + suffix + '.selected:list" value="' + token + '" checked><span>' + title + '</span>';
|
||||
var tr = document.createElement('tr');
|
||||
tr.appendChild(td);
|
||||
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',
|
||||
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):
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -38,4 +38,20 @@
|
|||
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>
|
||||
|
|
|
@ -35,4 +35,38 @@
|
|||
<td colspan="5" class="headline"
|
||||
i18n:translate="">Assign Child Concepts</td>
|
||||
</tr>
|
||||
</metal:block>
|
||||
<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>
|
||||
|
|
Loading…
Add table
Reference in a new issue