work in progress: state change dialog
This commit is contained in:
parent
bc24407d34
commit
9d3f6a2fb3
3 changed files with 109 additions and 7 deletions
|
@ -1,5 +1,5 @@
|
||||||
#
|
#
|
||||||
# Copyright (c) 2012 Helmut Merz helmutm@cy55.de
|
# Copyright (c) 2013 Helmut Merz helmutm@cy55.de
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# This program is free software; you can redistribute it and/or modify
|
||||||
# it under the terms of the GNU General Public License as published by
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
@ -26,9 +26,13 @@ from zope.cachedescriptors.property import Lazy
|
||||||
from zope.i18n import translate
|
from zope.i18n import translate
|
||||||
|
|
||||||
from cybertools.browser.action import Action, actions
|
from cybertools.browser.action import Action, actions
|
||||||
|
from cybertools.composer.schema.field import Field
|
||||||
|
from cybertools.composer.schema.interfaces import ISchemaFactory
|
||||||
|
from cybertools.composer.schema.schema import Schema
|
||||||
from cybertools.stateful.interfaces import IStateful, IStatesDefinition
|
from cybertools.stateful.interfaces import IStateful, IStatesDefinition
|
||||||
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.browser.form import ObjectForm, EditObject
|
||||||
from loops.expert.query import And, Or, State, Type, getObjects
|
from loops.expert.query import And, Or, State, Type, getObjects
|
||||||
from loops.expert.browser.search import search_template
|
from loops.expert.browser.search import search_template
|
||||||
from loops.security.common import checkPermission
|
from loops.security.common import checkPermission
|
||||||
|
@ -88,11 +92,60 @@ for std in statefulActions:
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class ChangeStateBase(object):
|
||||||
|
|
||||||
|
@Lazy
|
||||||
|
def stateful(self):
|
||||||
|
return component.getAdapter(self.view.context, IStateful,
|
||||||
|
name=self.definition)
|
||||||
|
|
||||||
|
@Lazy
|
||||||
|
def definition(self):
|
||||||
|
return self.request.form.get('stdef') or u''
|
||||||
|
|
||||||
|
@Lazy
|
||||||
|
def action(self):
|
||||||
|
return self.request.form.get('action') or u''
|
||||||
|
|
||||||
|
@Lazy
|
||||||
|
def stateObject(self):
|
||||||
|
return self.stateful.getStateObject()
|
||||||
|
|
||||||
|
|
||||||
|
class ChangeStateForm(ObjectForm, ChangeStateBase):
|
||||||
|
|
||||||
|
form_action = 'change_state_action'
|
||||||
|
data = {}
|
||||||
|
|
||||||
|
@Lazy
|
||||||
|
def macro(self):
|
||||||
|
return template.macros['change_state']
|
||||||
|
|
||||||
|
@Lazy
|
||||||
|
def schema(self):
|
||||||
|
# TODO: create schema directly, use field information specified
|
||||||
|
# in transition
|
||||||
|
commentsField = Field('comments', u'Comments', 'textarea',
|
||||||
|
description=u'Enter comments.')
|
||||||
|
fields = [commentsField]
|
||||||
|
return Schema(name='change_state', request=self.request,
|
||||||
|
manager=self, *fields)
|
||||||
|
#schemaFactory = ISchemaFactory(self.adapted)
|
||||||
|
#return schemaFactory(self.typeInterface, manager=self,
|
||||||
|
# request=self.request)
|
||||||
|
|
||||||
|
|
||||||
|
class ChangeState(EditObject, ChangeStateBase):
|
||||||
|
|
||||||
|
def update(self):
|
||||||
|
print '***', self.request.form
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
#class StateQuery(ConceptView):
|
#class StateQuery(ConceptView):
|
||||||
class StateQuery(BaseView):
|
class StateQuery(BaseView):
|
||||||
|
|
||||||
template = template
|
template = template
|
||||||
|
|
||||||
form_action = 'execute_search_action'
|
form_action = 'execute_search_action'
|
||||||
|
|
||||||
@Lazy
|
@Lazy
|
||||||
|
|
|
@ -77,7 +77,7 @@
|
||||||
set_schema="cybertools.stateful.interfaces.IStateful" />
|
set_schema="cybertools.stateful.interfaces.IStateful" />
|
||||||
</zope:class>
|
</zope:class>
|
||||||
|
|
||||||
<!-- views -->
|
<!-- views and form controllers -->
|
||||||
|
|
||||||
<browser:page
|
<browser:page
|
||||||
for="loops.interfaces.IConcept"
|
for="loops.interfaces.IConcept"
|
||||||
|
@ -91,6 +91,19 @@
|
||||||
class="loops.organize.stateful.browser.FilterAllStates"
|
class="loops.organize.stateful.browser.FilterAllStates"
|
||||||
permission="zope.View" />
|
permission="zope.View" />
|
||||||
|
|
||||||
|
<browser:page
|
||||||
|
name="change_state.html"
|
||||||
|
for="loops.interfaces.INode"
|
||||||
|
class="loops.organize.stateful.browser.ChangeStateForm"
|
||||||
|
permission="zope.ManageContent" />
|
||||||
|
|
||||||
|
<zope:adapter
|
||||||
|
name="change_state"
|
||||||
|
for="loops.browser.node.NodeView
|
||||||
|
zope.publisher.interfaces.browser.IBrowserRequest"
|
||||||
|
factory="loops.organize.stateful.browser.ChangeState"
|
||||||
|
permission="zope.ManageContent" />
|
||||||
|
|
||||||
<!-- event handlers -->
|
<!-- event handlers -->
|
||||||
|
|
||||||
<zope:subscriber handler="loops.organize.stateful.base.handleTransition" />
|
<zope:subscriber handler="loops.organize.stateful.base.handleTransition" />
|
||||||
|
|
|
@ -68,8 +68,6 @@
|
||||||
</metal:query>
|
</metal:query>
|
||||||
|
|
||||||
|
|
||||||
<!-- portlets -->
|
|
||||||
|
|
||||||
<metal:actions define-macro="portlet_states">
|
<metal:actions define-macro="portlet_states">
|
||||||
<div tal:repeat="stf macro/stfs">
|
<div tal:repeat="stf macro/stfs">
|
||||||
<div tal:condition="python:len(macro.stfs) > 1">
|
<div tal:condition="python:len(macro.stfs) > 1">
|
||||||
|
@ -87,7 +85,11 @@
|
||||||
<ul>
|
<ul>
|
||||||
<li tal:repeat="action stf/getAvailableTransitionsForUser">
|
<li tal:repeat="action stf/getAvailableTransitionsForUser">
|
||||||
<a i18n:translate=""
|
<a i18n:translate=""
|
||||||
tal:attributes="href string:change_state.html"
|
tal:define="baseUrl view/virtualTargetUrl;
|
||||||
|
url string:$baseUrl/change_state.html?action=${action/name}&stdef=${stf/statesDefinition}"
|
||||||
|
tal:attributes="href url;
|
||||||
|
onClick string:objectDialog('change_state', '$url');;
|
||||||
|
return false;"
|
||||||
tal:content="action/title" />
|
tal:content="action/title" />
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
@ -96,4 +98,38 @@
|
||||||
</metal:actions>
|
</metal:actions>
|
||||||
|
|
||||||
|
|
||||||
|
<metal:dialog define-macro="change_state">
|
||||||
|
<form name="stateful_changeState" method="post">
|
||||||
|
<div dojoType="dijit.layout.BorderContainer"
|
||||||
|
style="width: 70em; height: 600px">
|
||||||
|
<div dojoType="dijit.layout.ContentPane" region="center">
|
||||||
|
<h1 i18n:translate=""
|
||||||
|
tal:content="view/title" />
|
||||||
|
<input type="hidden" name="form.action" value="change_state">
|
||||||
|
<input type="hidden" name="stdef"
|
||||||
|
tal:attributes="value request/form/stdef|nothing">
|
||||||
|
<input type="hidden" name="action"
|
||||||
|
tal:attributes="value request/form/action|nothing">
|
||||||
|
<table cellpadding="3" class="form">
|
||||||
|
<tbody><tr><td colspan="5" style="padding-right: 15px">
|
||||||
|
<div id="form.fields">
|
||||||
|
<metal:fields use-macro="view/fieldRenderers/fields" />
|
||||||
|
</div>
|
||||||
|
</td></tr></tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<div dojoType="dijit.layout.ContentPane" region="bottom">
|
||||||
|
<metal:buttons define-slot="buttons">
|
||||||
|
<input value="Save" type="submit"
|
||||||
|
onClick="submit();; return false"
|
||||||
|
i18n:attributes="value">
|
||||||
|
<input type="button" value="Cancel" onClick="dialog.hide();"
|
||||||
|
i18n:attributes="value">
|
||||||
|
</metal:buttons>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</metal:dialog>
|
||||||
|
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
|
Loading…
Add table
Reference in a new issue