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:
helmutm 2007-12-07 16:22:35 +00:00
parent 880fe69837
commit 490b6216f5
11 changed files with 310 additions and 17 deletions

View file

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

View file

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

View file

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

View file

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

View file

@ -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
View 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);
}

View file

@ -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):

View file

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

View file

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

View file

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

View file

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