From 8b575c19b58902ffd679a1b5ade144917e2ae857 Mon Sep 17 00:00:00 2001 From: Brad Shuttleworth Date: Fri, 27 Jan 2006 11:58:44 +0000 Subject: [PATCH] - add "add" icon - improve workflow ui (to fix newly added bugs) - improve tree-edit - --- plugins/ktcore/admin/documentFields.php | 11 +++++++++-- plugins/ktcore/admin/workflows.php | 152 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------------- resources/css/kt-contenttypes.css | 3 +++ resources/css/kt-framing.css | 6 ++++++ resources/css/kt-ie-icons.css | 6 ++++++ templates/ktcore/edit_lookuptrees.smarty | 52 ++++++++++++++++++++++++++++++++++++++++------------ templates/ktcore/workflow/createState.smarty | 132 ++++++++++++++++++++++++++++++++++-------------------------------------------------------------------------------------------------- templates/ktcore/workflow/createTransition.smarty | 39 +++++++++++++++++++++++++++++++++++++++ templates/ktcore/workflow/editWorkflow.smarty | 2 +- templates/ktcore/workflow/manageActions.smarty | 8 ++++---- templates/ktcore/workflow/manageStates.smarty | 29 ++++++++--------------------- templates/ktcore/workflow/manageTransitions.smarty | 22 +++++----------------- thirdparty/icon-theme/16x16/actions/add.gif | Bin 0 -> 611 bytes thirdparty/icon-theme/16x16/actions/add.png | Bin 0 -> 847 bytes 14 files changed, 279 insertions(+), 183 deletions(-) create mode 100644 templates/ktcore/workflow/createTransition.smarty create mode 100644 thirdparty/icon-theme/16x16/actions/add.gif create mode 100644 thirdparty/icon-theme/16x16/actions/add.png diff --git a/plugins/ktcore/admin/documentFields.php b/plugins/ktcore/admin/documentFields.php index b1f5ebc..1753b3e 100755 --- a/plugins/ktcore/admin/documentFields.php +++ b/plugins/ktcore/admin/documentFields.php @@ -626,12 +626,19 @@ class KTDocumentFieldDispatcher extends KTStandardDispatcher { $this->oPage->setTitle(_('Edit Lookup Tree')); //$this->oPage->requireJSResource('thirdparty/js/MochiKit/Base.js'); - + + if ($current_node == 0) { $category_name = 'Root'; } + else { + $oNode = MDTreeNode::get($current_node); + $category_name = $oNode->getName(); + } + $aTemplateData = array( "field" => $oField, "tree" => $fieldTree, "renderedTree" => $renderedTree, "currentNode" => $current_node, + 'category_name' => $category_name, "freechildren" => $free_metadata, "context" => $this, ); @@ -752,7 +759,7 @@ class KTDocumentFieldDispatcher extends KTStandardDispatcher { } else { - $actionStr .= 'add items '; + $actionStr .= 'attach keywords '; $actionStr .= '| delete'; } $actionStr .= ")"; diff --git a/plugins/ktcore/admin/workflows.php b/plugins/ktcore/admin/workflows.php index defcae5..00472af 100755 --- a/plugins/ktcore/admin/workflows.php +++ b/plugins/ktcore/admin/workflows.php @@ -155,11 +155,13 @@ class KTWorkflowDispatcher extends KTAdminDispatcher { $aAlways = array(); + /* foreach ($aInfo['actions'] as $iActionId => $aAction) { if (!array_key_exists($iActionId, $aInfo['controlled_actions'])) { $aAlways[$iActionId] = $aAction; } } + */ $aNamedActions = array(); foreach ($aInfo['actions_by_state'][$oState->getId()] as $sName) { @@ -214,14 +216,14 @@ class KTWorkflowDispatcher extends KTAdminDispatcher { return $val; } - function actionAvailable($oAction, $oState) { + function actionAvailable($sAction, $oState) { $aInfo = $this->aWorkflowInfo; $val = false; foreach ($aInfo['actions_by_state'][$oState->getId()] as $oA) { - if ($oAction->getName() == $oA) { $val = true; } + if ($sAction == $oA) { $val = true; } } return $val; @@ -398,6 +400,23 @@ class KTWorkflowDispatcher extends KTAdminDispatcher { $aInfo = $this->buildWorkflowInfo($oWorkflow); + + $oTemplate->setData(array( + 'context' => $this, + 'oWorkflow' => $oWorkflow, + + // info + 'workflow_info' => $aInfo, + )); + return $oTemplate; + } + + function do_createState() { + $oTemplate =& $this->oValidator->validateTemplate('ktcore/workflow/createState'); + $oWorkflow =& $this->oValidator->validateWorkflow($_REQUEST['fWorkflowId']); + + $aInfo = $this->buildWorkflowInfo($oWorkflow); + $add_fields = array(); $add_fields[] = new KTStringWidget(_('Name'), _('A human-readable name for the state.'), 'fName', null, $this->oPage, true); @@ -409,6 +428,12 @@ class KTWorkflowDispatcher extends KTAdminDispatcher { // info 'workflow_info' => $aInfo, + + 'aActions' => KTDocumentActionUtil::getDocumentActionsByNames(KTWorkflowUtil::getControlledActionsForWorkflow($oWorkflow)), + 'aActionsSelected' => KTWorkflowUtil::getEnabledActionsForState($oState), + 'aGroups' => Group::getList(), + 'aRoles' => Role::getList(), + 'aUsers' => User::getList(), // subform 'add_fields' => $add_fields, @@ -421,7 +446,30 @@ class KTWorkflowDispatcher extends KTAdminDispatcher { $oWorkflow =& $this->oValidator->validateWorkflow($_REQUEST['fWorkflowId']); $aInfo = $this->buildWorkflowInfo($oWorkflow); - + + $oTemplate->setData(array( + 'context' => $this, + 'oWorkflow' => $oWorkflow, + + // info + 'workflow_info' => $aInfo, + + // subform + 'add_fields' => $add_transition_fields, + )); + return $oTemplate; + } + + function do_createTransition() { + $oTemplate =& $this->oValidator->validateTemplate('ktcore/workflow/createTransition'); + $oWorkflow =& $this->oValidator->validateWorkflow($_REQUEST['fWorkflowId']); + + $aInfo = $this->buildWorkflowInfo($oWorkflow); + $aPermissions = $aInfo['permissions']; + $aGroups = $aInfo['groups']; + $aRoles = $aInfo['roles']; + $aConditions = KTSavedSearch::getConditions(); + $add_transition_fields = array(); $add_transition_fields[] = new KTStringWidget(_('Name'), _('A human-readable name for the transition.'), 'fName', null, $this->oPage, true); $aOptions = array(); @@ -437,7 +485,37 @@ class KTWorkflowDispatcher extends KTAdminDispatcher { $vocab[$permission->getId()] = $permission->getHumanName(); } $aOptions['vocab'] = $vocab; - $add_transition_fields[] = new KTLookupWidget(_('Guard Permission.'), _('Which permission must the user have in order to follow this transition?'), 'fPermissionId', $oWorkflow->getStartStateId(), $this->oPage, true, null, null, $aOptions); + $add_transition_fields[] = new KTLookupWidget(_('Guard Permission.'), _('Which permission must the user have in order to follow this transition?'), 'fPermissionId', NULL, $this->oPage, true, null, null, $aOptions); + + $aOptions = array(); + $vocab = array(); + $vocab[0] = 'None'; + foreach($aGroups as $group) { + $vocab[$group->getId()] = $group->getName(); + } + $aOptions['vocab'] = $vocab; + $add_transition_fields[] = new KTLookupWidget(_('Guard Group.'), _('Which group must the user belong to in order to follow this transition?'), 'fGroupId', NULL, $this->oPage, false, null, null, $aOptions); + $aOptions = array(); + $vocab = array(); + $vocab[0] = 'None'; + foreach($aRoles as $role) { + $vocab[$role->getId()] = $role->getName(); + } + $aOptions['vocab'] = $vocab; + $add_transition_fields[] = new KTLookupWidget(_('Guard Role.'), _('Which role must the user have in order to follow this transition?'), 'fRoleId', NULL, $this->oPage, false, null, null, $aOptions); + + if (!empty($aConditions)) { + $aOptions = array(); + $vocab = array(); + $vocab[0] = 'None'; + foreach($aConditions as $condition) { + $vocab[$condition->getId()] = $condition->getName(); + } + $aOptions['vocab'] = $vocab; + $edit_fields[] = new KTLookupWidget(_('Guard Condition.'), _('Which condition (stored search) must be satisfied before the transition can take place?'), 'fConditionId', NULL, $this->oPage, false, null, null, $aOptions); + } + + $oTemplate->setData(array( 'context' => $this, @@ -474,7 +552,7 @@ class KTWorkflowDispatcher extends KTAdminDispatcher { } $this->commitTransaction(); - $this->successRedirectTo('manageTransitions', _('Availability updated.'), sprintf('fWorkflowId=%d', $oWorkflow->getId())); + $this->successRedirectTo('manageTransitions', _('Transition Availability updated.'), sprintf('fWorkflowId=%d', $oWorkflow->getId())); } @@ -511,7 +589,7 @@ class KTWorkflowDispatcher extends KTAdminDispatcher { 'redirect_to' => array('editWorkflow', 'fWorkflowId=' . $oWorkflow->getId()), 'message' => _('Error saving workflow controlled actions'), )); - $this->successRedirectTo('editWorkflow', _('Changes saved'), 'fWorkflowId=' . $oWorkflow->getId()); + $this->successRedirectTo('manageActions', _('Controlled actions changed.'), 'fWorkflowId=' . $oWorkflow->getId()); exit(0); } // }}} @@ -546,10 +624,16 @@ class KTWorkflowDispatcher extends KTAdminDispatcher { )); $this->oValidator->notError($oState, array( - 'redirect_to' => array('editWorkflow', 'fWorkflowId=' . $oWorkflow->getId()), + 'redirect_to' => array('createState', 'fWorkflowId=' . $oWorkflow->getId()), 'message' => _('Could not create workflow state'), )); + $res = KTWorkflowUtil::setEnabledActionsForState($oState, $_REQUEST['fActions']); + $this->oValidator->notErrorFalse($res, array( + 'redirect_to' => array('editState', 'fWorkflowId=' . $oWorkflow->getId(), '&fStateId=' . $oState->getId()), + 'message' => _('Error saving state enabled actions'), + )); + $this->successRedirectTo('editState', _('Workflow state created'), 'fWorkflowId=' . $oWorkflow->getId() . '&fStateId=' . $oState->getId()); exit(0); } @@ -573,15 +657,7 @@ class KTWorkflowDispatcher extends KTAdminDispatcher { } } $aTransitionsSelected = KTWorkflowUtil::getTransitionsFrom($oState, array('ids' => true)); - $this->aBreadcrumbs[] = array( - 'url' => $_SERVER['PHP_SELF'], - 'name' => _('Workflows'), - ); - $this->aBreadcrumbs[] = array( - 'url' => $_SERVER['PHP_SELF'], - 'query' => 'action=editWorkflow&fWorkflowId=' . $oWorkflow->getId(), - 'name' => $oWorkflow->getName(), - ); + $this->oPage->setBreadcrumbDetails(_('State') . ': ' . $oState->getName()); $aInformed = KTWorkflowUtil::getInformedForState($oState); @@ -648,7 +724,7 @@ class KTWorkflowDispatcher extends KTAdminDispatcher { 'redirect_to' => array('editState', 'fWorkflowId=' . $oWorkflow->getId(), '&fStateId=' . $oState->getId()), 'message' => _('Error saving state enabled actions'), )); - $this->successRedirectTo('editState', _('Actions set'), 'fWorkflowId=' . $oWorkflow->getId() . '&fStateId=' . $oState->getId()); + $this->successRedirectTo('manageActions', _('Controlled Actions changed.'), 'fWorkflowId=' . $oWorkflow->getId() . '&fStateId=' . $oState->getId()); exit(0); } // }}} @@ -699,6 +775,8 @@ class KTWorkflowDispatcher extends KTAdminDispatcher { $oWorkflow =& $this->oValidator->validateWorkflow($_REQUEST['fWorkflowId']); $oState =& $this->oValidator->validateWorkflowState($_REQUEST['fTargetStateId']); + $aInfo = $this->buildWorkflowInfo($oWorkflow); + // setup error options for later $aErrorOptions = array( 'redirect_to' => array('editWorkflow', sprintf('fWorkflowId=%d', $oWorkflow->getId())), @@ -707,7 +785,8 @@ class KTWorkflowDispatcher extends KTAdminDispatcher { $iPermissionId = KTUtil::arrayGet($_REQUEST, 'fPermissionId'); $iGroupId = KTUtil::arrayGet($_REQUEST, 'fGroupId'); $iRoleId = KTUtil::arrayGet($_REQUEST, 'fRoleId'); - + $iConditionId = KTUtil::arrayGet($_REQUEST, 'fConditionId', null); + // validate name $sName = $this->oValidator->validateString(KTUtil::arrayGet($_REQUEST, 'fName'), $aErrorOptions); @@ -729,6 +808,9 @@ class KTWorkflowDispatcher extends KTAdminDispatcher { if ($iRoleId) { $this->oValidator->validateRole($_REQUEST['fRoleId']); } + if ($iConditionId) { + $this->oValidator->validateCondition($_REQUEST['fConditionId']); + } $res = KTWorkflowTransition::createFromArray(array( 'workflowid' => $oWorkflow->getId(), @@ -743,7 +825,30 @@ class KTWorkflowDispatcher extends KTAdminDispatcher { 'redirect_to' => array('editWorkflow', 'fWorkflowId=' . $oWorkflow->getId()), 'message' => _('Could not create workflow transition'), )); - $this->successRedirectTo('editTransition', _('Workflow transition created'), sprintf('fWorkflowId=%d&fTransitionId=%d', $oWorkflow->getId(), $res->getId())); + + // now attach it to the appropriate states. + $aStateId = (array) KTUtil::arrayGet($_REQUEST, 'fStatesAvailableIn'); + $aStateId = array_keys($aStateId); + $newTransition = $res; + + foreach ($aStateId as $iStateId) { + if ($iStateId == $res->getTargetStateId()) { continue; } + $oState = $aInfo['states'][$iStateId]; + + $aTransitions = KTWorkflowTransition::getBySourceState($oState); + $aTransitions[] = $res; + $aTransitionIds = array(); + foreach ($aTransitions as $oTransition) { + $aTransitionIds[] = $oTransition->getId(); + } + $res = KTWorkflowUtil::saveTransitionsFrom($oState, $aTransitionIds); + if (PEAR::isError($res)) { + $this->errorRedirectTo('manageTransitions',sprintf(_('Unable to assign new transition to state %s'),$oState->getName()), sprintf('fWorkflowId=%d', $oWorkflow->getId())); + } + } + + + $this->successRedirectTo('editTransition', _('Workflow transition created'), sprintf('fWorkflowId=%d&fTransitionId=%d', $oWorkflow->getId(), $newTransition->getId())); exit(0); } // }}} @@ -807,15 +912,6 @@ class KTWorkflowDispatcher extends KTAdminDispatcher { $this->aBreadcrumbs[] = array( 'url' => $_SERVER['PHP_SELF'], - 'name' => _('Workflows'), - ); - $this->aBreadcrumbs[] = array( - 'url' => $_SERVER['PHP_SELF'], - 'query' => 'action=editWorkflow&fWorkflowId=' . $oWorkflow->getId(), - 'name' => $oWorkflow->getName(), - ); - $this->aBreadcrumbs[] = array( - 'url' => $_SERVER['PHP_SELF'], 'query' => 'action=editTransition&fWorkflowId=' . $oWorkflow->getId() . '&fTransitionId=' . $oTransition->getId(), 'name' => $oTransition->getName(), ); diff --git a/resources/css/kt-contenttypes.css b/resources/css/kt-contenttypes.css index 748545d..1a76e59 100644 --- a/resources/css/kt-contenttypes.css +++ b/resources/css/kt-contenttypes.css @@ -20,7 +20,10 @@ .contenttype.excel { background-image: url(../../resources/mimetypes/excel.png); } .contenttype.openoffice { background-image: url(../../resources/mimetypes/openoffice.png); } .contenttype.pdf { background-image: url(../../resources/mimetypes/pdf.png); } +.contenttype.image { background-image: url(../../resources/mimetypes/image.png); } +.contenttype.compressed { background-image: url(../../resources/mimetypes/compressed.png); } .contenttype.txt, +.contenttype.text, .contenttype.unspecified_type { background-image: url(../../thirdparty/icon-theme/16x16/mimetypes/text-x-generic.png); } .contenttype.folder { background-image: url(../../thirdparty/icon-theme/16x16/mimetypes/x-directory-normal.png); } diff --git a/resources/css/kt-framing.css b/resources/css/kt-framing.css index 3c9fbe5..921cd93 100644 --- a/resources/css/kt-framing.css +++ b/resources/css/kt-framing.css @@ -637,6 +637,11 @@ The text will be hidden for screen view. The generic fahrner-ish approach comes cursor: pointer; } +.ktAction.ktInline { + float: left; + padding-right: 0.5em; +} + .ktHelp { background: transparent url(../../thirdparty/icon-theme/16x16/apps/help-browser.png) top left no-repeat; float: right; @@ -657,6 +662,7 @@ The text will be hidden for screen view. The generic fahrner-ish approach comes .ktAction.ktEdit { background: transparent url(../../thirdparty/icon-theme/16x16/actions/document-properties.png) top left no-repeat; } .ktAction.ktAddUser { background: transparent url(../../thirdparty/icon-theme/16x16/actions/contact-new.png) top left no-repeat; } .ktAction.ktAddGroup { background: transparent url(../../thirdparty/icon-theme/16x16/actions/group-new.png) top left no-repeat; } +.ktAction.ktAdd { background: transparent url(../../thirdparty/icon-theme/16x16/actions/add.png) top left no-repeat; } /* =========== standard listings. */ diff --git a/resources/css/kt-ie-icons.css b/resources/css/kt-ie-icons.css index cbc4a9f..cb6bcfa 100644 --- a/resources/css/kt-ie-icons.css +++ b/resources/css/kt-ie-icons.css @@ -6,12 +6,18 @@ .ktAction.ktEdit { background: transparent url(../../thirdparty/icon-theme/16x16/actions/document-properties.gif) top left no-repeat; } .ktAction.ktAddUser { background: transparent url(../../thirdparty/icon-theme/16x16/actions/contact-new.gif) top left no-repeat; } .ktAction.ktAddGroup { background: transparent url(../../thirdparty/icon-theme/16x16/actions/group-new.gif) top left no-repeat; } +.ktAction.ktAdd { background: transparent url(../../thirdparty/icon-theme/16x16/actions/add.gif) top left no-repeat; } + .contenttype.office { background-image: url(../../resources/mimetypes/office.gif); } .contenttype.word { background-image: url(../../resources/mimetypes/word.gif); } +.contenttype.database { background-image: url(../../resources/mimetypes/database.gif); } .contenttype.excel { background-image: url(../../resources/mimetypes/excel.gif); } .contenttype.openoffice { background-image: url(../../resources/mimetypes/openoffice.gif); } .contenttype.pdf { background-image: url(../../resources/mimetypes/pdf.gif); } +.contenttype.image { background-image: url(../../resources/mimetypes/image.gif); } +.contenttype.compressed { background-image: url(../../resources/mimetypes/compressed.gif); } .contenttype.txt, +.contenttype.text, .contenttype.unspecified_type { background-image: url(../../thirdparty/icon-theme/16x16/mimetypes/text-x-generic.gif); } .contenttype.folder { background-image: url(../../thirdparty/icon-theme/16x16/mimetypes/x-directory-normal.gif); } diff --git a/templates/ktcore/edit_lookuptrees.smarty b/templates/ktcore/edit_lookuptrees.smarty index 5dafc23..3ec3d22 100644 --- a/templates/ktcore/edit_lookuptrees.smarty +++ b/templates/ktcore/edit_lookuptrees.smarty @@ -5,10 +5,28 @@

{i18n}Edit Lookup Tree{/i18n}: {$field->getName()}

+

{i18n}Many "lookup" fields make sense in a hierachy: +countries are part of continents and sub-continents, school classes are part of grades +and programs, Powerbooks are Apple Macs, while Thinkpads are made by Lenovo. This +page will allow you to arrange the lookups in the field in a hierachy. All changes +are immediately stored, so when you are done simply navigate back to the field menu.{/i18n}

+
- {i18n}Add New Subcategory{/i18n} + {i18n arg_category="$category_name"}Add New Subcategory to #category#{/i18n} + +

{i18n}In order to organise the options into a "tree", you + need to add subcategories at each level. The "top" level is called the root, and + holds all the toplevel items. "Root" will not be shown to the final user, but + provides a single "parent" to the toplevel items.{/i18n}

+ +

{i18n}As an example, if you are creating a tree of the + countries in the world, the actual countries would be keywords + (e.g. South Africa, England, Pakistan, India). The highest group of categories + would be continents — e.g. Africa, Europe, Asia, The Americas — followed by + subcategories that contain actual countries — e.g. Western Europe, Sub-saharan Africa, + Austalasia.{/i18n}

@@ -20,24 +38,33 @@
- +
+ {if ($currentNode != 0)} {if (empty($freechildren))} -

{i18n}No free keywords. Use the "unlink" action on a keyword to -make it available.{/i18n}

+

{i18n}Keywords which are directly below the + Root are considered "free" — they are not attached to + a subcategory. Only free keywords can be associated with a subcategory. To + free a keyword, click on the "unlink" command next to it in the preview tree below. + Deleting a subcategory will automatically unlink all keywords below it (including + those in subcategories of the subcategory). + {/i18n}

+ +

{i18n}No free keywords. Use the "unlink" action on a keyword to +make it available.{/i18n}

{else}
- {i18n}Link free keywords.{/i18n} - -

{i18n}Category{/i18n}: {if ($currentNode == 0)} -Root -{else} -{$tree->mapnodes[$currentNode]->getName()} -{/if}

+ {i18n arg_category=$category_name}Attach keywords to #category#{/i18n} + +

{i18n}Keywords which are directly below the + Root are considered "free" — they are not attached to + a subcategory. Only free keywords can be associated with a subcategory. To + free a keyword, click on the "unlink" command next to it in the preview tree below. + {/i18n}

@@ -62,9 +89,10 @@ Root

{i18n}Preview{/i18n}

-
+

{i18n}Use the +/- arrows to open or close the tree. Bold items are metadata keywords. To edit a category (including adding or removing keywords) click on the "edit" link.{/i18n} +

{$renderedTree} diff --git a/templates/ktcore/workflow/createState.smarty b/templates/ktcore/workflow/createState.smarty index 1137e4f..a9ff9c6 100644 --- a/templates/ktcore/workflow/createState.smarty +++ b/templates/ktcore/workflow/createState.smarty @@ -7,133 +7,69 @@ the "sent" transition has been performed by a user.

-{i18n}Edit state properties{/i18n} - +{i18n}Create a new state{/i18n} + +

Please note that additional configuration is +possible on states beyond what is specified here (e.g. which users to notify +about the document, etc). Please edit the state +to access and modify these other properties.

+ + - -{foreach item=oWidget from=$editForm} + +{* Standard Form *} + +{foreach item=oWidget from=$add_fields} {$oWidget->render()} {/foreach} -
- -
-
- -
- - - +{* -
-{i18n}Inform Which Users?{/i18n} +
+

{i18n}Please select which roles or groups should be informed when this state is reached.{/i18n}

{if $aRoles} -

{i18n}Roles{/i18n}

+

{i18n}Roles{/i18n}

{entity_checkboxes entities=$aRoles name="fRoleIds" multiple="true" selected=$aInformed.role assign=aBoxes} {foreach from=$aBoxes item=sBox} -{$sBox}
+{$sBox} {/foreach} {/if} -

{i18n}Groups{/i18n}

+

{i18n}Groups{/i18n}

{entity_checkboxes entities=$aGroups name="fGroupIds" multiple="true" selected=$aInformed.group assign=aBoxes} {foreach from=$aBoxes item=sBox} -{$sBox}
-{/foreach} - -{* -

{i18n}Users{/i18n}

-{entity_checkboxes entities=$aUsers name="fUserIds" multiple="true" selected=$aInformed.user assign=aBoxes} -{foreach from=$aBoxes item=sBox} -{$sBox}
+{$sBox} {/foreach} - - - -*} - -
- +
-{* -

{i18n}Assigned Permissions{/i18n}

-

{i18n}While in this workflow state, additional permissions -may be given. This is done either to expose the document to more users -or to allow a particular role to be fulfilled before a workflow -transition can be accomplished.{/i18n}

*} +
+ +

Workflows can control which actions (edit metadata, +download, etc.) are available on a given document. Please specify which of +the actions controlled by this workflow are available when the document is in +this state.

+{if (!empty($aActions))} -
-{i18n}Transitions{/i18n} - -

{i18n}Transitions are how documents move from one -state to another. Typically, most transitions can only be performed by people -with a specific role (e.g. Manager) or part of a specific group -(e.g. Marketing Department).{/i18n}

- -{if $aTransitionsTo} -

{i18n}Transitions to this state{/i18n}

-{if (!empty($aTransitionsTo))} -
    -{foreach from=$aTransitionsTo item=oTransition} -
  • {$oTransition->getName()|escape}
  • +{entity_checkboxes name="fActions" entities=$aActions idmethod="getName" method="getDisplayName" assign="aCheckboxes" selected="$aActionsSelected"} +{foreach from=$aCheckboxes item=sCheckbox} +{$sCheckbox} {/foreach} -
-{/if} -{else} -

{i18n}No transitions lead to this state.{/i18n}

-{/if} -

{i18n}Transitions from this state{/i18n}

-
- - - - -{if (!empty($aTransitions))} -{entity_checkboxes entities=$aTransitions name="fTransitionIds" multiple="true" selected=$aTransitionsSelected separator="
"} -
- -
{else} -

{i18n}No transitions have been defined for this workflow.{/i18n}

+
{i18n}No actions are controlled by this workflow.{/i18n}

{/if} -
-
- - - - -
-
-Actions allowed - - - - +
-{if (!empty($aActions))} -
    -{entity_checkboxes name="fActions" entities=$aActions idmethod="getName" method="getDisplayName" assign="aCheckboxes" selected="$aActionsSelected"} -{foreach from=$aCheckboxes item=sCheckbox} -
  • {$sCheckbox}
  • -{/foreach} -
- +
-{else} -No actions defined. -{/if} +
- diff --git a/templates/ktcore/workflow/createTransition.smarty b/templates/ktcore/workflow/createTransition.smarty new file mode 100644 index 0000000..065e5e3 --- /dev/null +++ b/templates/ktcore/workflow/createTransition.smarty @@ -0,0 +1,39 @@ +

{i18n}Manage Transitions{/i18n}

+ +

{i18n}Transitions are what drive the workflow of documents. +Each step that needs to be followed in the document's lifecycle could +map to a transition, and can be allowed or denied by a combination +of roles, permissions and groups.{/i18n}

+ +

{i18n}Use the form below to create a new Transition, and +assign or edit existing transitions using the table below.{/i18n}

+ +
+
+{i18n}Create a new transition{/i18n} + + + + +{* Standard Form *} + +{foreach item=oWidget from=$add_fields} + {$oWidget->render()} +{/foreach} + +
+ +

{i18n}Please select which states this transition should be available from. Note +that transitions are never available from their target state, even if you specify it below.{/i18n}

+ +{foreach item=oState from=$workflow_info.states} + +{/foreach} +
+
+ +
+
+
+ + \ No newline at end of file diff --git a/templates/ktcore/workflow/editWorkflow.smarty b/templates/ktcore/workflow/editWorkflow.smarty index 6ec95a5..9678bb6 100644 --- a/templates/ktcore/workflow/editWorkflow.smarty +++ b/templates/ktcore/workflow/editWorkflow.smarty @@ -33,7 +33,7 @@ Workflow menu (on the left) to create new states.

  • {i18n}Notified groups & roles:{/i18n} {$context->getNotificationStringForState($oState)}
  • -
  • {i18n}Actions available: {/i18n} +
  • {i18n}Controlled Actions available: {/i18n} {$context->getActionStringForState($oState)}
  • diff --git a/templates/ktcore/workflow/manageActions.smarty b/templates/ktcore/workflow/manageActions.smarty index 59d4458..ddda708 100644 --- a/templates/ktcore/workflow/manageActions.smarty +++ b/templates/ktcore/workflow/manageActions.smarty @@ -48,8 +48,8 @@ will be available at all states.{/i18n}

      - {foreach from=$aActions item=oAction} - {$oAction->getDisplayName()} + {foreach from=$aActionsSelected item=sAction} + {$workflow_info.actions_by_name.$sAction->getDisplayName()} {/foreach} @@ -57,8 +57,8 @@ will be available at all states.{/i18n}

    {foreach item=oState from=$workflow_info.states} {$oState->getName()} - {foreach item=oAction from=$aActions} - actionAvailable($oAction, $oState))}checked="true"{/if}/> + {foreach item=sAction from=$aActionsSelected} + actionAvailable($sAction, $oState))}checked="true"{/if}/> {/foreach} {/foreach} diff --git a/templates/ktcore/workflow/manageStates.smarty b/templates/ktcore/workflow/manageStates.smarty index b95af0e..8a56fd9 100644 --- a/templates/ktcore/workflow/manageStates.smarty +++ b/templates/ktcore/workflow/manageStates.smarty @@ -6,29 +6,16 @@ are placed in certain states. For example, an invoice which has been mailed might be in the "Pending" state after the "sent" transition has been performed by a user.

    -
    -{i18n}Create a new state{/i18n} +Create a new state +

    A critical part of workflow is the creation of +various different states for documents.

    +{i18n}Create a new state{/i18n} +{i18n}Create a new state{/i18n} -

    Please note that additional configuration is -possible on states beyond what is specified here (e.g. which users to notify -about the document, etc). Please edit the state -to access and modify these other properties.

    - - - - -{* Standard Form *} - -{foreach item=oWidget from=$add_fields} - {$oWidget->render()} -{/foreach} - -
    - -
    -
    + {if (empty($workflow_info.states))}

    This workflow does not define any states.

    @@ -40,7 +27,7 @@ to access and modify these other properties.

  • {i18n}Notified groups & roles:{/i18n} {$context->getNotificationStringForState($oState)}
  • -
  • {i18n}Actions available: {/i18n} +
  • {i18n}Controlled Actions available: {/i18n} {$context->getActionStringForState($oState)}
  • diff --git a/templates/ktcore/workflow/manageTransitions.smarty b/templates/ktcore/workflow/manageTransitions.smarty index d74dc39..c54fba9 100644 --- a/templates/ktcore/workflow/manageTransitions.smarty +++ b/templates/ktcore/workflow/manageTransitions.smarty @@ -5,27 +5,15 @@ Each step that needs to be followed in the document's lifecycle could map to a transition, and can be allowed or denied by a combination of roles, permissions and groups.{/i18n}

    -

    {i18n}Use the form below to create a new Transition, and -assign or edit existing transitions using the table below.{/i18n}

    - -
    -{i18n}Create a new state{/i18n} - - - +{i18n}Create a new transition{/i18n} -{* Standard Form *} +{i18n}Create a new transition{/i18n} +{i18n}Create a new transition{/i18n} -{foreach item=oWidget from=$add_fields} - {$oWidget->render()} -{/foreach} - -
    - -
    -

    {i18n}Transition Availability{/i18n}

    diff --git a/thirdparty/icon-theme/16x16/actions/add.gif b/thirdparty/icon-theme/16x16/actions/add.gif new file mode 100644 index 0000000..8381dcd Binary files /dev/null and b/thirdparty/icon-theme/16x16/actions/add.gif differ diff --git a/thirdparty/icon-theme/16x16/actions/add.png b/thirdparty/icon-theme/16x16/actions/add.png new file mode 100644 index 0000000..323edb0 Binary files /dev/null and b/thirdparty/icon-theme/16x16/actions/add.png differ -- libgit2 0.21.4