refining create and edit actions/dialogs for concepts
git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@2210 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
parent
309f5f1e21
commit
84dbd5a354
7 changed files with 93 additions and 52 deletions
|
@ -22,6 +22,7 @@ Base classes (sort of views) for action portlet items.
|
||||||
$Id$
|
$Id$
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
from urllib import urlencode
|
||||||
from zope import component
|
from zope import component
|
||||||
from zope.app.pagetemplate import ViewPageTemplateFile
|
from zope.app.pagetemplate import ViewPageTemplateFile
|
||||||
from zope.cachedescriptors.property import Lazy
|
from zope.cachedescriptors.property import Lazy
|
||||||
|
@ -58,9 +59,42 @@ class Action(object):
|
||||||
return self.view.url
|
return self.view.url
|
||||||
|
|
||||||
|
|
||||||
class TargetAction(object):
|
class TargetAction(Action):
|
||||||
|
|
||||||
@Lazy
|
@Lazy
|
||||||
def url(self):
|
def url(self):
|
||||||
return self.view.virtualTargetUrl
|
return self.view.virtualTargetUrl
|
||||||
|
|
||||||
|
|
||||||
|
class DialogAction(Action):
|
||||||
|
|
||||||
|
jsOnClick = "objectDialog('%s', '%s/%s?%s'); return false;"
|
||||||
|
|
||||||
|
page = None
|
||||||
|
viewName = 'create_object.html'
|
||||||
|
dialogName = 'create'
|
||||||
|
qualifier = typeToken = innerForm = None
|
||||||
|
fixedType = False
|
||||||
|
|
||||||
|
@Lazy
|
||||||
|
def url(self):
|
||||||
|
return self.viewName
|
||||||
|
|
||||||
|
@Lazy
|
||||||
|
def onClick(self):
|
||||||
|
urlParams = dict(dialog=self.dialogName)
|
||||||
|
if self.qualifier:
|
||||||
|
urlParams['qualifier'] = self.qualifier
|
||||||
|
if self.typeToken:
|
||||||
|
urlParams['form.type'] = self.typeToken
|
||||||
|
if self.innerForm:
|
||||||
|
urlParams['inner_form'] = self.innerForm
|
||||||
|
if self.fixedType:
|
||||||
|
urlParams['fixed_type'] = 'yes'
|
||||||
|
return self.jsOnClick % (self.dialogName, self.page.virtualTargetUrl,
|
||||||
|
self.viewName, urlencode(urlParams))
|
||||||
|
|
||||||
|
@Lazy
|
||||||
|
def innerHtmlId(self):
|
||||||
|
return 'dialog.' + self.dialogName
|
||||||
|
|
||||||
|
|
|
@ -63,8 +63,9 @@ class ConceptEditForm(EditForm):
|
||||||
typeInterface = self.typeInterface
|
typeInterface = self.typeInterface
|
||||||
if typeInterface is None:
|
if typeInterface is None:
|
||||||
fields = FormFields(IConcept)
|
fields = FormFields(IConcept)
|
||||||
elif 'title' in typeInterface: # new "complete" type interface
|
elif 'title' in typeInterface: # new type interface based on ConceptSchema
|
||||||
fields = FormFields(typeInterface)
|
f1 = FormFields(IConcept).omit('title', 'description')
|
||||||
|
fields = FormFields(typeInterface, f1)
|
||||||
else:
|
else:
|
||||||
fields = FormFields(IConcept, typeInterface)
|
fields = FormFields(IConcept, typeInterface)
|
||||||
return fields
|
return fields
|
||||||
|
|
|
@ -206,10 +206,23 @@ class CreateObjectForm(ObjectForm):
|
||||||
@property
|
@property
|
||||||
def macro(self): return self.template.macros['create']
|
def macro(self): return self.template.macros['create']
|
||||||
|
|
||||||
title = _(u'Create Resource, Type = ')
|
defaultTitle = u'Create Resource, Type = '
|
||||||
form_action = 'create_resource'
|
form_action = 'create_resource'
|
||||||
dialog_name = 'create'
|
dialog_name = 'create'
|
||||||
|
|
||||||
|
@Lazy
|
||||||
|
def title(self):
|
||||||
|
if self.request.form.get('fixed_type'):
|
||||||
|
return _(u'Create %s' % self.typeConcept.title)
|
||||||
|
else:
|
||||||
|
return _(self.defaultTitle)
|
||||||
|
|
||||||
|
@Lazy
|
||||||
|
def typeConcept(self):
|
||||||
|
typeToken = self.request.get('form.type')
|
||||||
|
if typeToken:
|
||||||
|
return self.loopsRoot.loopsTraverse(typeToken)
|
||||||
|
|
||||||
@Lazy
|
@Lazy
|
||||||
def adapted(self):
|
def adapted(self):
|
||||||
return self.typeInterface(Resource())
|
return self.typeInterface(Resource())
|
||||||
|
@ -220,10 +233,9 @@ class CreateObjectForm(ObjectForm):
|
||||||
|
|
||||||
@Lazy
|
@Lazy
|
||||||
def typeInterface(self):
|
def typeInterface(self):
|
||||||
typeToken = self.request.get('form.type')
|
tc = self.typeConcept
|
||||||
if typeToken:
|
if tc:
|
||||||
t = self.loopsRoot.loopsTraverse(typeToken)
|
return removeSecurityProxy(ITypeConcept(tc).typeInterface)
|
||||||
return removeSecurityProxy(ITypeConcept(t).typeInterface)
|
|
||||||
else:
|
else:
|
||||||
return ITextDocument
|
return ITextDocument
|
||||||
|
|
||||||
|
@ -240,7 +252,7 @@ class CreateObjectForm(ObjectForm):
|
||||||
|
|
||||||
class CreateConceptForm(CreateObjectForm):
|
class CreateConceptForm(CreateObjectForm):
|
||||||
|
|
||||||
title = _(u'Create Concept, Type = ')
|
defaultTitle = u'Create Concept, Type = '
|
||||||
form_action = 'create_concept'
|
form_action = 'create_concept'
|
||||||
|
|
||||||
@Lazy
|
@Lazy
|
||||||
|
@ -260,12 +272,8 @@ class CreateConceptForm(CreateObjectForm):
|
||||||
|
|
||||||
@Lazy
|
@Lazy
|
||||||
def typeInterface(self):
|
def typeInterface(self):
|
||||||
typeToken = self.request.get('form.type')
|
if self.typeConcept:
|
||||||
if typeToken:
|
return removeSecurityProxy(ITypeConcept(self.typeConcept).typeInterface)
|
||||||
t = self.loopsRoot.loopsTraverse(typeToken)
|
|
||||||
return removeSecurityProxy(ITypeConcept(t).typeInterface)
|
|
||||||
else:
|
|
||||||
return None
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def assignments(self):
|
def assignments(self):
|
||||||
|
|
|
@ -38,7 +38,10 @@
|
||||||
<metal:block define-macro="create" i18n:domain="loops">
|
<metal:block define-macro="create" i18n:domain="loops">
|
||||||
<form method="post" enctype="multipart/form-data"
|
<form method="post" enctype="multipart/form-data"
|
||||||
tal:define="qualifier request/qualifier | string:resource;
|
tal:define="qualifier request/qualifier | string:resource;
|
||||||
innerForm request/inner_form | string:inner_form.html">
|
innerForm request/inner_form | string:inner_form.html;
|
||||||
|
typeToken python: request.get('form.type')
|
||||||
|
or '.loops/concepts/textdocument';
|
||||||
|
fixedType request/fixed_type | nothing">
|
||||||
<input type="hidden" name="form.action" value="create"
|
<input type="hidden" name="form.action" value="create"
|
||||||
tal:attributes="value view/form_action" />
|
tal:attributes="value view/form_action" />
|
||||||
<table cellpadding="3" class="form">
|
<table cellpadding="3" class="form">
|
||||||
|
@ -46,23 +49,25 @@
|
||||||
<span tal:replace="view/title"
|
<span tal:replace="view/title"
|
||||||
i18n:translate="">Create Information Object</span>
|
i18n:translate="">Create Information Object</span>
|
||||||
<select name="form.type" id="form.type"
|
<select name="form.type" id="form.type"
|
||||||
|
tal:condition="not:fixedType"
|
||||||
tal:attributes="onChange
|
tal:attributes="onChange
|
||||||
string:return replaceFieldsNode(
|
string:return replaceFieldsNode(
|
||||||
'form.fields', 'form.type',
|
'form.fields', 'form.type',
|
||||||
'${view/url}/$innerForm')">
|
'${view/url}/$innerForm')">
|
||||||
<option value=".loops/concepts/note"
|
<option value=".loops/concepts/note"
|
||||||
i18n:translate=""
|
i18n:translate=""
|
||||||
xtal:repeat="type view/resourceTypes"
|
|
||||||
tal:repeat="type python:
|
tal:repeat="type python:
|
||||||
view.getTypesVocabulary((qualifier,))"
|
view.getTypesVocabulary((qualifier,))"
|
||||||
tal:content="type/title"
|
tal:content="type/title"
|
||||||
tal:attributes="value type/token;
|
tal:attributes="value type/token;
|
||||||
selected python:
|
selected python:
|
||||||
type.token == (request.get('form.type')
|
type.token == typeToken">
|
||||||
or '.loops/concepts/textdocument')">
|
|
||||||
Note
|
Note
|
||||||
</option>
|
</option>
|
||||||
</select>
|
</select>
|
||||||
|
<input type="hidden" name="form.type"
|
||||||
|
tal:condition="fixedType"
|
||||||
|
tal:attributes="value typeToken" />
|
||||||
</th></tr></tbody>
|
</th></tr></tbody>
|
||||||
|
|
||||||
<tbody><tr><td colspan="5">
|
<tbody><tr><td colspan="5">
|
||||||
|
|
|
@ -51,7 +51,7 @@ from loops.interfaces import IViewConfiguratorSchema
|
||||||
from loops.resource import MediaAsset
|
from loops.resource import MediaAsset
|
||||||
from loops import util
|
from loops import util
|
||||||
from loops.util import _
|
from loops.util import _
|
||||||
from loops.browser.action import Action, TargetAction
|
from loops.browser.action import Action, DialogAction, TargetAction
|
||||||
from loops.browser.common import BaseView
|
from loops.browser.common import BaseView
|
||||||
from loops.browser.concept import ConceptView
|
from loops.browser.concept import ConceptView
|
||||||
from loops.versioning.util import getVersion
|
from loops.versioning.util import getVersion
|
||||||
|
@ -351,16 +351,15 @@ class NodeView(BaseView):
|
||||||
|
|
||||||
def getPortletActions(self):
|
def getPortletActions(self):
|
||||||
actions = []
|
actions = []
|
||||||
actions.append(Action(self, title='Edit Concept Map',
|
cmeUrl = self.conceptMapEditorUrl
|
||||||
targetWindow='loops_cme',
|
if cmeUrl:
|
||||||
description='Open concept map editor in new window',
|
actions.append(Action(self, title='Edit Concept Map',
|
||||||
url=self.conceptMapEditorUrl))
|
targetWindow='loops_cme',
|
||||||
actions.append(Action(self, title='Create Resource...',
|
description='Open concept map editor in new window',
|
||||||
|
url=cmeUrl))
|
||||||
|
actions.append(DialogAction(self, title='Create Resource...',
|
||||||
description='Create a new resource object.',
|
description='Create a new resource object.',
|
||||||
url='create_object.html',
|
page=self))
|
||||||
onClick="objectDialog('create', '%s/create_object.html'); "
|
|
||||||
"return false;" % self.virtualTargetUrl,
|
|
||||||
innerHtmlId='dialog.create'))
|
|
||||||
return actions
|
return actions
|
||||||
|
|
||||||
actions = dict(portlet=getPortletActions)
|
actions = dict(portlet=getPortletActions)
|
||||||
|
|
|
@ -41,7 +41,7 @@ from zope.traversing.api import getName, getParent
|
||||||
|
|
||||||
from cybertools.typology.interfaces import IType
|
from cybertools.typology.interfaces import IType
|
||||||
from cybertools.xedit.browser import ExternalEditorView, fromUnicode
|
from cybertools.xedit.browser import ExternalEditorView, fromUnicode
|
||||||
from loops.browser.action import Action, TargetAction
|
from loops.browser.action import Action, DialogAction, TargetAction
|
||||||
from loops.browser.common import EditForm, BaseView
|
from loops.browser.common import EditForm, BaseView
|
||||||
from loops.browser.concept import ConceptRelationView, ConceptConfigureView
|
from loops.browser.concept import ConceptRelationView, ConceptConfigureView
|
||||||
from loops.browser.node import NodeView, node_macros
|
from loops.browser.node import NodeView, node_macros
|
||||||
|
@ -186,12 +186,10 @@ class ResourceView(BaseView):
|
||||||
|
|
||||||
def getPortletActions(self, page=None):
|
def getPortletActions(self, page=None):
|
||||||
actions = []
|
actions = []
|
||||||
actions.append(Action(self, title='Edit Resource...',
|
actions.append(DialogAction(self, title='Edit Resource...',
|
||||||
description='Modify resource object.',
|
description='Modify resource object.',
|
||||||
url='edit_object.html',
|
viewName='edit_object.html', dialogName='edit',
|
||||||
onClick="objectDialog('edit', '%s/edit_object.html'); "
|
page=page))
|
||||||
"return false;" % page.virtualTargetUrl,
|
|
||||||
innerHtmlId='dialog.edit'))
|
|
||||||
return actions
|
return actions
|
||||||
|
|
||||||
def getObjectActions(self, page=None):
|
def getObjectActions(self, page=None):
|
||||||
|
|
|
@ -26,7 +26,7 @@ $Id$
|
||||||
from zope.cachedescriptors.property import Lazy
|
from zope.cachedescriptors.property import Lazy
|
||||||
from zope.app.pagetemplate import ViewPageTemplateFile
|
from zope.app.pagetemplate import ViewPageTemplateFile
|
||||||
|
|
||||||
from loops.browser.action import Action
|
from loops.browser.action import Action, DialogAction
|
||||||
from loops.browser.concept import ConceptView
|
from loops.browser.concept import ConceptView
|
||||||
from loops.common import adapted
|
from loops.common import adapted
|
||||||
from loops import util
|
from loops import util
|
||||||
|
@ -44,16 +44,15 @@ class GlossaryView(ConceptView):
|
||||||
def getActions(self, category='object', page=None):
|
def getActions(self, category='object', page=None):
|
||||||
actions = []
|
actions = []
|
||||||
if category == 'portlet':
|
if category == 'portlet':
|
||||||
actions.append(Action(self, title='Create Glossary Item...',
|
actions.append(DialogAction(self, title='Create Glossary Item...',
|
||||||
description='Create a new glossary item.',
|
description='Create a new glossary item.',
|
||||||
url='create_concept.html',
|
viewName='create_concept.html',
|
||||||
onClick="objectDialog('createGlossaryItem', "
|
dialogName='createGlossaryItem',
|
||||||
" '%s/create_concept.html?qualifier=concept"
|
#qualifier='concept',
|
||||||
"&form.type=.loops/concepts/topic"
|
typeToken='.loops/concepts/glossaryitem',
|
||||||
"&inner_form=inner_concept_form.html"
|
fixedType=True,
|
||||||
"&dialog=createGlossaryItem'); "
|
innerForm='inner_concept_form.html',
|
||||||
"return false;" % page.virtualTargetUrl,
|
page=page))
|
||||||
innerHtmlId='dialog.createGlossaryItem'))
|
|
||||||
return actions
|
return actions
|
||||||
|
|
||||||
|
|
||||||
|
@ -66,13 +65,10 @@ class GlossaryItemView(ConceptView):
|
||||||
def getActions(self, category='object', page=None):
|
def getActions(self, category='object', page=None):
|
||||||
actions = []
|
actions = []
|
||||||
if category == 'portlet':
|
if category == 'portlet':
|
||||||
actions.append(Action(self, title='Edit Glossary Item...',
|
actions.append(DialogAction(self, title='Edit Glossary Item...',
|
||||||
description='Modify glossary item.',
|
description='Modify glossary item.',
|
||||||
url='edit_concept.html',
|
viewName='edit_concept.html',
|
||||||
onClick="objectDialog('editGlossaryItem', "
|
dialogName='editGlossaryItem',
|
||||||
" '%s/edit_concept.html"
|
page=page))
|
||||||
"?dialog=editGlossaryItem'); "
|
|
||||||
"return false;" % page.virtualTargetUrl,
|
|
||||||
innerHtmlId='dialog.editGlossaryItem'))
|
|
||||||
return actions
|
return actions
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue