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:
helmutm 2007-12-03 16:06:15 +00:00
parent 309f5f1e21
commit 84dbd5a354
7 changed files with 93 additions and 52 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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