mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-07-31 17:39:05 +00:00
- Another workflow checkpoint
git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@3596 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -868,6 +868,7 @@ title_my_alfresco=My Alfresco
|
||||
dashboard_info=My Alfresco Dashboard
|
||||
dashboard_description=Configure this view and build your personal Alfresco dashboard
|
||||
configure=Configure
|
||||
error_dashboard=An error occurred in one of the dashlets.
|
||||
|
||||
# My Alfresco Layout Manager wizard messages
|
||||
configure_dashboard_title=Configure Dashboard Wizard
|
||||
@@ -945,6 +946,9 @@ manage_workitem_desc=This dialog allows the work item to be managed
|
||||
workitem_properties=Work Item Properties
|
||||
id=Id
|
||||
status=Status
|
||||
completed=Completed
|
||||
source=Source
|
||||
priority=Priority
|
||||
my_workitems_todo_title=My Work Items To Do
|
||||
my_workitems_todo_desc=List of your workflow items still to complete
|
||||
my_workitems_completed_title=My Completed Work Items
|
||||
@@ -953,7 +957,7 @@ due_date=Due Date
|
||||
completed_on=Completed on
|
||||
outcome=Outcome
|
||||
reassign=Reassign
|
||||
|
||||
cancel_workflow=Cancel Workflow
|
||||
|
||||
# Admin Console messages
|
||||
title_admin_console=Administration Console
|
||||
|
@@ -15,10 +15,21 @@
|
||||
</property-sheet>
|
||||
</config>
|
||||
|
||||
<config evaluator="node-type" condition="wf:reviewTask">
|
||||
<property-sheet>
|
||||
<separator name="sep1" display-label-id="general" component-generator="HeaderSeparatorGenerator" />
|
||||
<show-property name="bpm:taskId" ignore-if-missing="false" />
|
||||
<show-property name="bpm:startDate" ignore-if-missing="false" />
|
||||
<show-property name="bpm:status" ignore-if-missing="false" />
|
||||
<show-property name="bpm:dueDate" ignore-if-missing="false" />
|
||||
<show-property name="bpm:priority" ignore-if-missing="false" />
|
||||
</property-sheet>
|
||||
</config>
|
||||
|
||||
<config evaluator="node-type" condition="wf:submitReviewTask">
|
||||
<property-sheet>
|
||||
<separator name="sep1" display-label-id="general" component-generator="HeaderSeparatorGenerator" />
|
||||
<!-- <show-property name="bpm:priority" ignore-if-missing="false" /> -->
|
||||
<show-property name="wf:reviewPriority" ignore-if-missing="false" />
|
||||
<show-property name="wf:reviewDueDate" ignore-if-missing="false" />
|
||||
<separator name="sep2" display-label-id="users_and_roles" component-generator="HeaderSeparatorGenerator" />
|
||||
<show-association name="wf:reviewer" ignore-if-missing="false" />
|
||||
@@ -43,10 +54,25 @@
|
||||
|
||||
<action id="reassign-workflow">
|
||||
<label-id>reassign</label-id>
|
||||
<image>/images/icons/create_forum.gif</image>
|
||||
<image>/images/icons/recover.gif</image>
|
||||
<action>null</action>
|
||||
</action>
|
||||
|
||||
<action id="cancel-workflow">
|
||||
<label-id>cancel_workflow</label-id>
|
||||
<image>/images/icons/reject.gif</image>
|
||||
<action>null</action>
|
||||
</action>
|
||||
|
||||
<action id="remove-package-item">
|
||||
<label-id>remove</label-id>
|
||||
<image>/images/icons/delete.gif</image>
|
||||
<action-listener>#{DialogManager.bean.removePackageItem}</action-listener>
|
||||
<params>
|
||||
<param name="id">#{actionContext.id}</param>
|
||||
</params>
|
||||
</action>
|
||||
|
||||
<action-group id="document_browse_menu">
|
||||
<action idref="start-workflow" />
|
||||
</action-group>
|
||||
@@ -55,9 +81,32 @@
|
||||
<action idref="start-workflow" />
|
||||
</action-group>
|
||||
|
||||
<action-group id="workitem_actions">
|
||||
<action-group id="manage_workitem_actions">
|
||||
<action idref="reassign-workflow" />
|
||||
</action-group>
|
||||
|
||||
<action-group id="completed_workitem_actions">
|
||||
<action idref="cancel-workflow" />
|
||||
</action-group>
|
||||
|
||||
<action-group id="workflow_item_read_actions">
|
||||
<action idref="details_doc" />
|
||||
</action-group>
|
||||
|
||||
<action-group id="workflow_item_collection_actions">
|
||||
<action idref="details_doc" />
|
||||
<action idref="remove-package-item" />
|
||||
</action-group>
|
||||
|
||||
<action-group id="workflow_item_edit_actions">
|
||||
<!-- edit, checkout, checkin -->
|
||||
<action idref="details_doc" />
|
||||
<action idref="remove-package-item" />
|
||||
</action-group>
|
||||
|
||||
<action-group id="workflow_package_collection_actions">
|
||||
<action idref="add-package-item" />
|
||||
</action-group>
|
||||
</actions>
|
||||
</config>
|
||||
|
||||
@@ -103,7 +152,7 @@
|
||||
<dialog name="manageWorkItem" page="/jsp/workflow/manage-workitem-dialog.jsp"
|
||||
managed-bean="ManageWorkItemDialog" icon="/images/icons/create_space_large.gif"
|
||||
title-id="manage_workitem_title" description-id="manage_workitem_desc"
|
||||
actions-config-id="workitem_actions" />
|
||||
actions-config-id="manage_workitem_actions" />
|
||||
</dialogs>
|
||||
</config>
|
||||
|
||||
|
@@ -97,7 +97,7 @@ public abstract class BaseDialogBean implements IDialogBean
|
||||
|
||||
// rollback the transaction
|
||||
try { if (tx != null) {tx.rollback();} } catch (Exception ex) {}
|
||||
Utils.addErrorMessage(formatErrorMessage(e));
|
||||
Utils.addErrorMessage(formatErrorMessage(e), e);
|
||||
outcome = getErrorOutcome(e);
|
||||
}
|
||||
}
|
||||
|
@@ -8,6 +8,7 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.faces.context.FacesContext;
|
||||
import javax.faces.event.ActionEvent;
|
||||
import javax.transaction.UserTransaction;
|
||||
|
||||
import org.alfresco.model.ContentModel;
|
||||
@@ -25,10 +26,13 @@ import org.alfresco.web.app.Application;
|
||||
import org.alfresco.web.bean.dialog.BaseDialogBean;
|
||||
import org.alfresco.web.bean.repository.MapNode;
|
||||
import org.alfresco.web.bean.repository.Node;
|
||||
import org.alfresco.web.bean.repository.NodePropertyResolver;
|
||||
import org.alfresco.web.bean.repository.Repository;
|
||||
import org.alfresco.web.bean.repository.TransientNode;
|
||||
import org.alfresco.web.config.DialogsConfigElement.DialogButtonConfig;
|
||||
import org.alfresco.web.ui.common.Utils;
|
||||
import org.alfresco.web.ui.common.component.UIActionLink;
|
||||
import org.alfresco.web.ui.common.component.data.UIRichList;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
@@ -44,6 +48,8 @@ public class ManageWorkItemDialog extends BaseDialogBean
|
||||
protected WorkflowTask workItem;
|
||||
protected WorkflowTransition[] transitions;
|
||||
protected List<Node> resources;
|
||||
protected WorkItemCompleteResolver completeResolver = new WorkItemCompleteResolver();
|
||||
protected UIRichList packageItemsRichList;
|
||||
|
||||
protected static final String ID_PREFIX = "transition_";
|
||||
protected static final String CLIENT_ID_PREFIX = "dialog:" + ID_PREFIX;
|
||||
@@ -179,22 +185,124 @@ public class ManageWorkItemDialog extends BaseDialogBean
|
||||
}
|
||||
catch (Throwable e)
|
||||
{
|
||||
// reset the flag so we can re-attempt the operation
|
||||
isFinished = false;
|
||||
|
||||
// rollback the transaction
|
||||
try { if (tx != null) {tx.rollback();} } catch (Exception ex) {}
|
||||
Utils.addErrorMessage(formatErrorMessage(e));
|
||||
Utils.addErrorMessage(formatErrorMessage(e), e);
|
||||
outcome = this.getErrorOutcome(e);
|
||||
}
|
||||
}
|
||||
|
||||
return outcome;
|
||||
}
|
||||
|
||||
/**
|
||||
* Removes an item from the workflow package
|
||||
*
|
||||
* @param event The event containing a reference to the item to remove
|
||||
*/
|
||||
public void removePackageItem(ActionEvent event)
|
||||
{
|
||||
logger.info("remove package item: " + event);
|
||||
}
|
||||
|
||||
/**
|
||||
* Toggles the complete flag for a workflow package item
|
||||
*
|
||||
* @param event The event containing a reference to the item to toggle the status for
|
||||
*/
|
||||
public void togglePackageItemComplete(ActionEvent event)
|
||||
{
|
||||
UserTransaction tx = null;
|
||||
try
|
||||
{
|
||||
FacesContext context = FacesContext.getCurrentInstance();
|
||||
tx = Repository.getUserTransaction(context);
|
||||
tx.begin();
|
||||
|
||||
UIActionLink link = (UIActionLink)event.getComponent();
|
||||
Map<String, String> params = link.getParameterMap();
|
||||
|
||||
// create the node ref for the item we are toggling
|
||||
NodeRef nodeRef = new NodeRef(Repository.getStoreRef(),
|
||||
(String)params.get("id"));
|
||||
|
||||
// get the existing list of completed items
|
||||
List<NodeRef> completedItems = (List<NodeRef>)this.workItem.properties.get(
|
||||
WorkflowModel.PROP_COMPLETED_ITEMS);
|
||||
|
||||
if (completedItems == null)
|
||||
{
|
||||
// if it doesn't exist yet create the list and add the noderef
|
||||
completedItems = new ArrayList<NodeRef>(1);
|
||||
completedItems.add(nodeRef);
|
||||
this.workItem.properties.put(WorkflowModel.PROP_COMPLETED_ITEMS,
|
||||
(Serializable)completedItems);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (completedItems.contains(nodeRef))
|
||||
{
|
||||
// the item is already in the list remove it
|
||||
completedItems.remove(nodeRef);
|
||||
|
||||
// NOTE: There is a bug somwehere which causes the list to be
|
||||
// returned as a byte array instead of a list if an empty
|
||||
// list is persisted, therefore if the list is now empty
|
||||
// set the completed items back to null
|
||||
if (completedItems.size() == 0)
|
||||
{
|
||||
this.workItem.properties.put(WorkflowModel.PROP_COMPLETED_ITEMS, null);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// the noderef is not in the list yet so just add it
|
||||
completedItems.add(nodeRef);
|
||||
}
|
||||
}
|
||||
|
||||
// update the task with the updated parameters
|
||||
this.workflowService.updateTask(this.workItem.id, this.workItem.properties,
|
||||
null, null);
|
||||
|
||||
// commit the transaction
|
||||
tx.commit();
|
||||
|
||||
// reset the rich list if the change was successful
|
||||
this.packageItemsRichList.setValue(null);
|
||||
}
|
||||
catch (Throwable err)
|
||||
{
|
||||
Utils.addErrorMessage(MessageFormat.format(Application.getMessage(
|
||||
FacesContext.getCurrentInstance(), Repository.ERROR_GENERIC), err.getMessage()), err);
|
||||
this.resources = Collections.<Node>emptyList();
|
||||
try { if (tx != null) {tx.rollback();} } catch (Exception tex) {}
|
||||
}
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------
|
||||
// Bean Getters and Setters
|
||||
|
||||
/**
|
||||
* Sets the rich list being used for the workflow package items
|
||||
*
|
||||
* @param richList The rich list instance
|
||||
*/
|
||||
public void setPackageItemsRichList(UIRichList richList)
|
||||
{
|
||||
this.packageItemsRichList = richList;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the rich list being used for the workflow package items
|
||||
*
|
||||
* @return The rich list instance
|
||||
*/
|
||||
public UIRichList getPackageItemsRichList()
|
||||
{
|
||||
return this.packageItemsRichList;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the Node representing the work item
|
||||
*
|
||||
@@ -213,7 +321,17 @@ public class ManageWorkItemDialog extends BaseDialogBean
|
||||
*/
|
||||
public List<Node> getResources()
|
||||
{
|
||||
NodeRef workflowPackage = (NodeRef)this.workItem.properties.get(WorkflowModel.ASSOC_PACKAGE);
|
||||
NodeRef workflowPackage = null;
|
||||
Serializable obj = this.workItem.properties.get(WorkflowModel.ASSOC_PACKAGE);
|
||||
// TODO: remove this workaroud where JBPM may return a String and not the NodeRef
|
||||
if (obj instanceof NodeRef)
|
||||
{
|
||||
workflowPackage = (NodeRef)obj;
|
||||
}
|
||||
else if (obj instanceof String)
|
||||
{
|
||||
workflowPackage = new NodeRef((String)obj);
|
||||
}
|
||||
|
||||
this.resources = new ArrayList<Node>(4);
|
||||
|
||||
@@ -257,6 +375,13 @@ public class ManageWorkItemDialog extends BaseDialogBean
|
||||
MapNode node = new MapNode(nodeRef, this.nodeService, true);
|
||||
this.browseBean.setupCommonBindingProperties(node);
|
||||
|
||||
// add property resolvers to show path information
|
||||
node.addPropertyResolver("path", this.browseBean.resolverPath);
|
||||
node.addPropertyResolver("displayPath", this.browseBean.resolverDisplayPath);
|
||||
|
||||
// add a property resolver to indicate whether the item has been completed or not
|
||||
node.addPropertyResolver("completed", this.completeResolver);
|
||||
|
||||
this.resources.add(node);
|
||||
}
|
||||
}
|
||||
@@ -297,4 +422,33 @@ public class ManageWorkItemDialog extends BaseDialogBean
|
||||
{
|
||||
this.workflowService = workflowService;
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------
|
||||
// Helper methods
|
||||
|
||||
|
||||
// ------------------------------------------------------------------------------
|
||||
// Inner classes
|
||||
|
||||
/**
|
||||
* Property resolver to determine if the given node has been flagged as complete
|
||||
*/
|
||||
protected class WorkItemCompleteResolver implements NodePropertyResolver
|
||||
{
|
||||
public Object get(Node node)
|
||||
{
|
||||
String result = Application.getMessage(FacesContext.getCurrentInstance(), "no");
|
||||
|
||||
List<NodeRef> completedItems = (List<NodeRef>)workItem.properties.get(
|
||||
WorkflowModel.PROP_COMPLETED_ITEMS);
|
||||
|
||||
if (completedItems != null && completedItems.size() > 0 &&
|
||||
completedItems.contains(node.getNodeRef()))
|
||||
{
|
||||
result = Application.getMessage(FacesContext.getCurrentInstance(), "yes");
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -87,12 +87,8 @@ public class StartWorkflowWizard extends BaseWizardBean
|
||||
QName type = this.nodeService.getType(itemToWorkflow);
|
||||
|
||||
NodeRef workflowPackage = null;
|
||||
if (this.dictionaryService.isSubClass(type, ContentModel.TYPE_FOLDER) ||
|
||||
this.dictionaryService.isSubClass(type, ContentModel.TYPE_FOLDERLINK))
|
||||
{
|
||||
throw new UnsupportedOperationException("Workflow on a folder is not supported yet!");
|
||||
}
|
||||
else
|
||||
if (this.dictionaryService.isSubClass(type, ContentModel.TYPE_CONTENT) ||
|
||||
this.dictionaryService.isSubClass(type, ContentModel.TYPE_FILELINK))
|
||||
{
|
||||
// create a workflow package and add the given item to workflow as a child
|
||||
workflowPackage = this.workflowService.createPackage(null);
|
||||
@@ -106,6 +102,13 @@ public class StartWorkflowWizard extends BaseWizardBean
|
||||
params.put(WorkflowModel.ASSOC_PACKAGE, workflowPackage);
|
||||
}
|
||||
|
||||
// setup the context for the workflow (this is the space the workflow was launched from)
|
||||
Node workflowContext = this.navigator.getCurrentNode();
|
||||
if (workflowContext != null)
|
||||
{
|
||||
params.put(WorkflowModel.PROP_CONTEXT, (Serializable)workflowContext.getNodeRef());
|
||||
}
|
||||
|
||||
// start the workflow to get access to the start task
|
||||
WorkflowPath path = this.workflowService.startWorkflow(this.selectedWorkflow, params);
|
||||
if (path != null)
|
||||
|
@@ -7,14 +7,18 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.faces.context.FacesContext;
|
||||
import javax.transaction.UserTransaction;
|
||||
|
||||
import org.alfresco.model.ContentModel;
|
||||
import org.alfresco.repo.workflow.WorkflowModel;
|
||||
import org.alfresco.service.cmr.repository.AssociationRef;
|
||||
import org.alfresco.service.cmr.repository.NodeRef;
|
||||
import org.alfresco.service.cmr.repository.NodeService;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowService;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowTask;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowTaskDefinition;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowTaskState;
|
||||
import org.alfresco.service.cmr.workflow.WorkflowTransition;
|
||||
import org.alfresco.service.namespace.QName;
|
||||
import org.alfresco.util.ISO9075;
|
||||
import org.alfresco.web.app.Application;
|
||||
@@ -22,6 +26,7 @@ import org.alfresco.web.bean.repository.Node;
|
||||
import org.alfresco.web.bean.repository.Repository;
|
||||
import org.alfresco.web.bean.repository.TransientMapNode;
|
||||
import org.alfresco.web.bean.repository.User;
|
||||
import org.alfresco.web.ui.common.Utils;
|
||||
import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
@@ -32,6 +37,7 @@ import org.apache.commons.logging.LogFactory;
|
||||
*/
|
||||
public class WorkflowBean
|
||||
{
|
||||
protected NodeService nodeService;
|
||||
protected WorkflowService workflowService;
|
||||
protected List<Node> workItems;
|
||||
protected List<Node> completedWorkItems;
|
||||
@@ -50,19 +56,35 @@ public class WorkflowBean
|
||||
public List<Node> getWorkItemsToDo()
|
||||
{
|
||||
// get the current username
|
||||
FacesContext fc = FacesContext.getCurrentInstance();
|
||||
User user = Application.getCurrentUser(fc);
|
||||
FacesContext context = FacesContext.getCurrentInstance();
|
||||
User user = Application.getCurrentUser(context);
|
||||
String userName = ISO9075.encode(user.getUserName());
|
||||
|
||||
// get the current in progress tasks for the current user
|
||||
List<WorkflowTask> tasks = this.workflowService.getAssignedTasks(
|
||||
userName, WorkflowTaskState.IN_PROGRESS);
|
||||
|
||||
// create a list of transient nodes to represent
|
||||
this.workItems = new ArrayList<Node>(tasks.size());
|
||||
for (WorkflowTask task : tasks)
|
||||
UserTransaction tx = null;
|
||||
try
|
||||
{
|
||||
this.workItems.add(createWorkItem(task));
|
||||
tx = Repository.getUserTransaction(context, true);
|
||||
tx.begin();
|
||||
|
||||
// get the current in progress tasks for the current user
|
||||
List<WorkflowTask> tasks = this.workflowService.getAssignedTasks(
|
||||
userName, WorkflowTaskState.IN_PROGRESS);
|
||||
|
||||
// create a list of transient nodes to represent
|
||||
this.workItems = new ArrayList<Node>(tasks.size());
|
||||
for (WorkflowTask task : tasks)
|
||||
{
|
||||
this.workItems.add(createWorkItem(task));
|
||||
}
|
||||
|
||||
// commit the changes
|
||||
tx.commit();
|
||||
}
|
||||
catch (Throwable e)
|
||||
{
|
||||
// rollback the transaction
|
||||
try { if (tx != null) {tx.rollback();} } catch (Exception ex) {}
|
||||
Utils.addErrorMessage("Failed to get to do work items: " + e.toString(), e);
|
||||
}
|
||||
|
||||
return this.workItems;
|
||||
@@ -77,19 +99,35 @@ public class WorkflowBean
|
||||
public List<Node> getWorkItemsCompleted()
|
||||
{
|
||||
// get the current username
|
||||
FacesContext fc = FacesContext.getCurrentInstance();
|
||||
User user = Application.getCurrentUser(fc);
|
||||
FacesContext context = FacesContext.getCurrentInstance();
|
||||
User user = Application.getCurrentUser(context);
|
||||
String userName = ISO9075.encode(user.getUserName());
|
||||
|
||||
// get the current in progress tasks for the current user
|
||||
List<WorkflowTask> tasks = this.workflowService.getAssignedTasks(
|
||||
userName, WorkflowTaskState.COMPLETED);
|
||||
|
||||
// create a list of transient nodes to represent
|
||||
this.completedWorkItems = new ArrayList<Node>(tasks.size());
|
||||
for (WorkflowTask task : tasks)
|
||||
UserTransaction tx = null;
|
||||
try
|
||||
{
|
||||
this.completedWorkItems.add(createWorkItem(task));
|
||||
tx = Repository.getUserTransaction(context, true);
|
||||
tx.begin();
|
||||
|
||||
// get the current in progress tasks for the current user
|
||||
List<WorkflowTask> tasks = this.workflowService.getAssignedTasks(
|
||||
userName, WorkflowTaskState.COMPLETED);
|
||||
|
||||
// create a list of transient nodes to represent
|
||||
this.completedWorkItems = new ArrayList<Node>(tasks.size());
|
||||
for (WorkflowTask task : tasks)
|
||||
{
|
||||
this.completedWorkItems.add(createWorkItem(task));
|
||||
}
|
||||
|
||||
// commit the changes
|
||||
tx.commit();
|
||||
}
|
||||
catch (Throwable e)
|
||||
{
|
||||
// rollback the transaction
|
||||
try { if (tx != null) {tx.rollback();} } catch (Exception ex) {}
|
||||
Utils.addErrorMessage("Failed to get completed work items: " + e.toString(), e);
|
||||
}
|
||||
|
||||
return this.completedWorkItems;
|
||||
@@ -105,6 +143,16 @@ public class WorkflowBean
|
||||
this.workflowService = workflowService;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the node service to use
|
||||
*
|
||||
* @param nodeService NodeService instance
|
||||
*/
|
||||
public void setNodeService(NodeService nodeService)
|
||||
{
|
||||
this.nodeService = nodeService;
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------
|
||||
// Helper methods
|
||||
|
||||
@@ -169,6 +217,50 @@ public class WorkflowBean
|
||||
node.getProperties().put("type", taskDef.metadata.getTitle());
|
||||
node.getProperties().put("id", task.id);
|
||||
|
||||
// add the name of the source space (if there is one)
|
||||
// TODO: remove this workaroud where JBPM may return a String and not the NodeRef
|
||||
Serializable obj = task.properties.get(WorkflowModel.PROP_CONTEXT);
|
||||
NodeRef context = null;
|
||||
if (obj instanceof NodeRef)
|
||||
{
|
||||
context = (NodeRef)obj;
|
||||
}
|
||||
else if (obj instanceof String)
|
||||
{
|
||||
context = new NodeRef((String)obj);
|
||||
}
|
||||
|
||||
if (context != null)
|
||||
{
|
||||
String name = Repository.getNameForNode(this.nodeService, context);
|
||||
node.getProperties().put("sourceSpaceName", name);
|
||||
node.getProperties().put("sourceSpaceId", context.getId());
|
||||
}
|
||||
|
||||
// add the outcome label for any completed task
|
||||
if (task.state.equals(WorkflowTaskState.COMPLETED))
|
||||
{
|
||||
String outcome = null;
|
||||
String transition = (String)task.properties.get(WorkflowModel.PROP_OUTCOME);
|
||||
if (transition != null)
|
||||
{
|
||||
WorkflowTransition[] transitions = task.path.node.transitions;
|
||||
for (WorkflowTransition trans : transitions)
|
||||
{
|
||||
if (trans.id.equals(transition))
|
||||
{
|
||||
outcome = trans.title;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (outcome != null)
|
||||
{
|
||||
node.getProperties().put("outcome", outcome);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return node;
|
||||
}
|
||||
}
|
||||
|
@@ -1785,6 +1785,10 @@
|
||||
<managed-bean-name>WorkflowBean</managed-bean-name>
|
||||
<managed-bean-class>org.alfresco.web.bean.workflow.WorkflowBean</managed-bean-class>
|
||||
<managed-bean-scope>session</managed-bean-scope>
|
||||
<managed-property>
|
||||
<property-name>nodeService</property-name>
|
||||
<value>#{NodeService}</value>
|
||||
</managed-property>
|
||||
<managed-property>
|
||||
<property-name>workflowService</property-name>
|
||||
<value>#{WorkflowService}</value>
|
||||
|
@@ -100,6 +100,7 @@
|
||||
<f:subview id="dash-body">
|
||||
<jsp:include page="<%=Application.getDashboardManager().getLayoutPage()%>" />
|
||||
</f:subview>
|
||||
<a:errors message="#{msg.error_dashboard}" styleClass="errorMessage" />
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
@@ -32,19 +32,21 @@
|
||||
border="white" bgcolor="white" titleBorder="blue" titleBgcolor="#D3E6FE" styleClass="mainSubTitle">
|
||||
|
||||
<a:richList id="resources-list" viewMode="details" value="#{DialogManager.bean.resources}" var="r"
|
||||
binding="#{DialogManager.bean.packageItemsRichList}"
|
||||
styleClass="recordSet" headerStyleClass="recordSetHeader" rowStyleClass="recordSetRow"
|
||||
altRowStyleClass="recordSetRowAlt" width="100%" pageSize="10"
|
||||
initialSortColumn="name" initialSortDescending="true">
|
||||
|
||||
<%-- Primary column for details view mode --%>
|
||||
<a:column primary="true" width="200" style="padding:2px;text-align:left">
|
||||
|
||||
<%-- Name column --%>
|
||||
<a:column primary="true" width="200" style="padding:2px; text-align:left">
|
||||
<f:facet name="header">
|
||||
<a:sortLink label="#{msg.name}" value="name" mode="case-insensitive" styleClass="header"/>
|
||||
</f:facet>
|
||||
<f:facet name="small-icon">
|
||||
<h:graphicImage url="/images/icons/post.gif" />
|
||||
<a:actionLink value="#{r.name}" href="#{r.url}" target="new" image="#{r.fileType16}"
|
||||
showLink="false" styleClass="inlineAction" />
|
||||
</f:facet>
|
||||
<h:outputText value="#{r.name}" />
|
||||
<a:actionLink value="#{r.name}" href="#{r.url}" target="new" />
|
||||
</a:column>
|
||||
|
||||
<%-- Description column --%>
|
||||
@@ -60,19 +62,51 @@
|
||||
<f:facet name="header">
|
||||
<a:sortLink label="#{msg.path}" value="path" styleClass="header"/>
|
||||
</f:facet>
|
||||
<h:outputText value="#{r.path}" />
|
||||
<r:nodePath value="#{r.path}" />
|
||||
</a:column>
|
||||
|
||||
<%-- Created Date column --%>
|
||||
<a:column style="text-align:left">
|
||||
<f:facet name="header">
|
||||
<a:sortLink label="#{msg.created}" value="created" styleClass="header"/>
|
||||
</f:facet>
|
||||
<h:outputText value="#{r.created}">
|
||||
<a:convertXMLDate type="both" pattern="#{msg.date_time_pattern}" />
|
||||
</h:outputText>
|
||||
</a:column>
|
||||
|
||||
<%-- Modified Date column --%>
|
||||
<a:column style="text-align:left">
|
||||
<f:facet name="header">
|
||||
<a:sortLink label="#{msg.modified}" value="modified" styleClass="header"/>
|
||||
</f:facet>
|
||||
<h:outputText value="#{r.modified}">
|
||||
<a:convertXMLDate type="both" pattern="#{msg.date_time_pattern}" />
|
||||
</h:outputText>
|
||||
</a:column>
|
||||
|
||||
<%-- Actions column --%>
|
||||
<a:column actions="true" style="text-align:left">
|
||||
<f:facet name="header">
|
||||
<h:outputText value="#{msg.actions}"/>
|
||||
</f:facet>
|
||||
|
||||
<%-- actions are configured in web-client-config-actions.xml --%>
|
||||
<r:actions id="actions-col-actions" value="workflow_actions" context="#{r}" showLink="false" styleClass="inlineAction" />
|
||||
<r:actions id="actions-col-actions" value="workflow_item_collection_actions"
|
||||
context="#{r}" showLink="false" styleClass="inlineAction" />
|
||||
</a:column>
|
||||
|
||||
<a:dataPager styleClass="pager" />
|
||||
<%-- Completed column --%>
|
||||
<%--
|
||||
<a:column style="text-align:left">
|
||||
<f:facet name="header">
|
||||
<h:outputText value="#{msg.completed}" />
|
||||
</f:facet>
|
||||
<a:actionLink value="#{r.completed}" actionListener="#{DialogManager.bean.togglePackageItemComplete}">
|
||||
<f:param name="id" value="#{r.id}" />
|
||||
</a:actionLink>
|
||||
</a:column>
|
||||
--%>
|
||||
</a:richList>
|
||||
</a:panel>
|
||||
|
||||
<%-- Put the package actions here --%>
|
||||
|
||||
</a:panel>
|
||||
|
@@ -37,8 +37,10 @@
|
||||
</f:verbatim>
|
||||
</h:panelGroup>
|
||||
|
||||
<h:panelGroup rendered="#{not empty WizardManager.bean.taskMetadataNode}">
|
||||
<a:panel id="props-panel" label="#{msg.properties}" rendered="#{not empty WizardManager.bean.taskMetadataNode}"
|
||||
border="white" bgcolor="white" titleBorder="blue" titleBgcolor="#D3E6FE" styleClass="mainSubTitle">
|
||||
|
||||
<r:propertySheetGrid id="task-props" value="#{WizardManager.bean.taskMetadataNode}"
|
||||
var="taskProps" columns="1" externalConfig="true" />
|
||||
</h:panelGroup>
|
||||
</a:panel>
|
||||
|
@@ -35,6 +35,14 @@
|
||||
<h:outputText value="#{r.type}" />
|
||||
</a:column>
|
||||
|
||||
<%-- Source column --%>
|
||||
<a:column style="text-align:left">
|
||||
<f:facet name="header">
|
||||
<a:sortLink label="#{msg.source}" value="sourceSpaceName" styleClass="header"/>
|
||||
</f:facet>
|
||||
<h:outputText value="#{r.sourceSpaceName}" />
|
||||
</a:column>
|
||||
|
||||
<%-- Completed date column --%>
|
||||
<a:column style="text-align:left">
|
||||
<f:facet name="header">
|
||||
@@ -48,31 +56,19 @@
|
||||
<%-- Outcome column --%>
|
||||
<a:column style="text-align:left">
|
||||
<f:facet name="header">
|
||||
<a:sortLink label="#{msg.outcome}" value="bpm:status" styleClass="header"/>
|
||||
<a:sortLink label="#{msg.outcome}" value="outcome" styleClass="header"/>
|
||||
</f:facet>
|
||||
<h:outputText value="#{r['bpm:status']}" />
|
||||
<h:outputText value="#{r.outcome}" />
|
||||
</a:column>
|
||||
|
||||
<%-- Actions column --%>
|
||||
<%--
|
||||
<a:column actions="true" style="text-align:left">
|
||||
<f:facet name="header">
|
||||
<h:outputText value="#{msg.actions}"/>
|
||||
</f:facet>
|
||||
<a:booleanEvaluator value="#{r.local}">
|
||||
<a:actionLink value="#{msg.delete}" image="/images/icons/delete.gif" showLink="false"
|
||||
styleClass="inlineAction"
|
||||
actionListener="#{RulesBean.setupRuleAction}" action="deleteRule">
|
||||
<f:param name="id" value="#{r.id}" />
|
||||
</a:actionLink>
|
||||
<a:actionLink value="#{msg.change_details}" image="/images/icons/change_rule.gif"
|
||||
showLink="false" styleClass="inlineAction"
|
||||
actionListener="#{RulesBean.setupRuleAction}" action="wizard:editRule">
|
||||
<f:param name="id" value="#{r.id}" />
|
||||
</a:actionLink>
|
||||
</a:booleanEvaluator>
|
||||
<r:actions value="completed_workitem_actions" context="#{r}" showLink="false"
|
||||
styleClass="inlineAction" />
|
||||
</a:column>
|
||||
--%>
|
||||
|
||||
<a:dataPager styleClass="pager" />
|
||||
</a:richList>
|
||||
|
@@ -43,6 +43,14 @@
|
||||
<h:outputText value="#{r.type}" />
|
||||
</a:column>
|
||||
|
||||
<%-- Source column --%>
|
||||
<a:column style="text-align:left">
|
||||
<f:facet name="header">
|
||||
<a:sortLink label="#{msg.source}" value="sourceSpaceName" styleClass="header"/>
|
||||
</f:facet>
|
||||
<h:outputText value="#{r.sourceSpaceName}" />
|
||||
</a:column>
|
||||
|
||||
<%-- Due date column --%>
|
||||
<a:column style="text-align:left">
|
||||
<f:facet name="header">
|
||||
@@ -61,26 +69,22 @@
|
||||
<h:outputText value="#{r['bpm:status']}" />
|
||||
</a:column>
|
||||
|
||||
<%-- Priority column --%>
|
||||
<a:column style="text-align:left">
|
||||
<f:facet name="header">
|
||||
<a:sortLink label="#{msg.priority}" value="bpm:priority" styleClass="header"/>
|
||||
</f:facet>
|
||||
<h:outputText value="#{r['bpm:priority']}" />
|
||||
</a:column>
|
||||
|
||||
<%-- Actions column --%>
|
||||
<%--
|
||||
<a:column actions="true" style="text-align:left">
|
||||
<f:facet name="header">
|
||||
<h:outputText value="#{msg.actions}"/>
|
||||
</f:facet>
|
||||
<a:booleanEvaluator value="#{r.local}">
|
||||
<a:actionLink value="#{msg.delete}" image="/images/icons/delete.gif" showLink="false"
|
||||
styleClass="inlineAction"
|
||||
actionListener="#{RulesBean.setupRuleAction}" action="deleteRule">
|
||||
<f:param name="id" value="#{r.id}" />
|
||||
</a:actionLink>
|
||||
<a:actionLink value="#{msg.change_details}" image="/images/icons/change_rule.gif"
|
||||
showLink="false" styleClass="inlineAction"
|
||||
actionListener="#{RulesBean.setupRuleAction}" action="wizard:editRule">
|
||||
<f:param name="id" value="#{r.id}" />
|
||||
</a:actionLink>
|
||||
</a:booleanEvaluator>
|
||||
<r:actions value="manage_workitem_actions" context="#{r}" showLink="false"
|
||||
styleClass="inlineAction" />
|
||||
</a:column>
|
||||
--%>
|
||||
|
||||
<a:dataPager styleClass="pager" />
|
||||
</a:richList>
|
||||
|
Reference in New Issue
Block a user