mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-07 17:49:17 +00:00
. Checkpoint of the Submit dialog for user sandbox assets
- first pass of JSP layout - multiple items or all items available for selection - calculation of available workflows, from those assigned to form assets and assigned to the website - creation of AVM workflow package - starting of workflow containing AVM package (appears in users task todo dashlet!) git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@4524 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -953,6 +953,14 @@ websitedetails_description=View the details of the web project.
|
|||||||
delete_sandbox=Delete Sandbox
|
delete_sandbox=Delete Sandbox
|
||||||
delete_sandbox_info=To remove this sandbox and the user from the Web Project, click OK.
|
delete_sandbox_info=To remove this sandbox and the user from the Web Project, click OK.
|
||||||
delete_sandbox_confirm=Are you sure you want to remove the user sandbox \"{0}\" from the Web Project?
|
delete_sandbox_confirm=Are you sure you want to remove the user sandbox \"{0}\" from the Web Project?
|
||||||
|
submit_submission_info=Submission Info
|
||||||
|
submit_comment=Comment
|
||||||
|
submit_snapshotlabel=Snapshot Label
|
||||||
|
submit_workflow_selection=Use the following workflow to submit all modified items
|
||||||
|
submit_not_submit_warning=The following items will not be submitted
|
||||||
|
submit_submit_info=The following items will be submitted
|
||||||
|
submit_items_title=Submit Items
|
||||||
|
submit_items_desc=This page helps you to submit modified items for publishing on the website.
|
||||||
|
|
||||||
# New User Wizard messages
|
# New User Wizard messages
|
||||||
new_user_title=New User Wizard
|
new_user_title=New User Wizard
|
||||||
|
@@ -177,6 +177,10 @@
|
|||||||
<dialog name="editFormTemplateWorkflow" page="/jsp/wcm/create-website-wizard/form-workflow.jsp" managed-bean="EditFormWorkflowDialog"
|
<dialog name="editFormTemplateWorkflow" page="/jsp/wcm/create-website-wizard/form-workflow.jsp" managed-bean="EditFormWorkflowDialog"
|
||||||
icon="/images/icons/manage_workflow_task_large.gif" title-id="form_template_workflow"
|
icon="/images/icons/manage_workflow_task_large.gif" title-id="form_template_workflow"
|
||||||
description-id="form_template_workflow_desc" />
|
description-id="form_template_workflow_desc" />
|
||||||
|
|
||||||
|
<dialog name="submitSandboxItems" page="/jsp/wcm/submit-dialog.jsp" managed-bean="SubmitDialog"
|
||||||
|
icon="/images/icons/submit_large.gif" title-id="submit_items_title"
|
||||||
|
description-id="submit_items_desc" />
|
||||||
</dialogs>
|
</dialogs>
|
||||||
</config>
|
</config>
|
||||||
|
|
||||||
|
@@ -116,6 +116,7 @@ public class AVMBrowseBean implements IContextListener
|
|||||||
private String sandboxTitle = null;
|
private String sandboxTitle = null;
|
||||||
private String currentPath = null;
|
private String currentPath = null;
|
||||||
private AVMNode currentPathNode = null;
|
private AVMNode currentPathNode = null;
|
||||||
|
private boolean submitAll = false;
|
||||||
|
|
||||||
/* component references */
|
/* component references */
|
||||||
private UIRichList foldersRichList;
|
private UIRichList foldersRichList;
|
||||||
@@ -686,6 +687,21 @@ public class AVMBrowseBean implements IContextListener
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the list of selected items for the current user sandbox view
|
||||||
|
*
|
||||||
|
* @return List of AVMNodeDescriptor objects representing selected items
|
||||||
|
*/
|
||||||
|
public List<AVMNodeDescriptor> getSelectedSandboxItems()
|
||||||
|
{
|
||||||
|
return this.userSandboxes.getSelectedNodes(this.username);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean getSubmitAll()
|
||||||
|
{
|
||||||
|
return this.submitAll;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------
|
||||||
// Action event handlers
|
// Action event handlers
|
||||||
@@ -740,6 +756,14 @@ public class AVMBrowseBean implements IContextListener
|
|||||||
// update UI state ready for return to the previous screen
|
// update UI state ready for return to the previous screen
|
||||||
this.location = null;
|
this.location = null;
|
||||||
setCurrentPath(null);
|
setCurrentPath(null);
|
||||||
|
|
||||||
|
this.submitAll = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setupSubmitAllAction(ActionEvent event)
|
||||||
|
{
|
||||||
|
setupSandboxAction(event);
|
||||||
|
this.submitAll = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -313,7 +313,7 @@ public class CreateWebsiteWizard extends BaseWizardBean
|
|||||||
* @param params Serializable workflow params
|
* @param params Serializable workflow params
|
||||||
* @param workflowRef The noderef to write the property too
|
* @param workflowRef The noderef to write the property too
|
||||||
*/
|
*/
|
||||||
private void serializeWorkflowParams(Serializable params, NodeRef workflowRef)
|
public static void serializeWorkflowParams(Serializable params, NodeRef workflowRef)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
@@ -215,13 +215,13 @@ public class EditWebsiteWizard extends CreateWebsiteWizard
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Deserialize the workflow params from a content stream
|
* Deserialize the default workflow params from a content stream
|
||||||
*
|
*
|
||||||
* @param workflowRef The noderef to write the property too
|
* @param workflowRef The noderef to write the property too
|
||||||
*
|
*
|
||||||
* @return Serializable workflow params
|
* @return Serializable workflow params
|
||||||
*/
|
*/
|
||||||
private Serializable deserializeWorkflowParams(NodeRef workflowRef)
|
public static Serializable deserializeWorkflowParams(NodeRef workflowRef)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
519
source/java/org/alfresco/web/bean/wcm/SubmitDialog.java
Normal file
519
source/java/org/alfresco/web/bean/wcm/SubmitDialog.java
Normal file
@@ -0,0 +1,519 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2005 Alfresco, Inc.
|
||||||
|
*
|
||||||
|
* Licensed under the Mozilla Public License version 1.1
|
||||||
|
* with a permitted attribution clause. You may obtain a
|
||||||
|
* copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.alfresco.org/legal/license.txt
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing,
|
||||||
|
* software distributed under the License is distributed on an
|
||||||
|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
|
||||||
|
* either express or implied. See the License for the specific
|
||||||
|
* language governing permissions and limitations under the
|
||||||
|
* License.
|
||||||
|
*/
|
||||||
|
package org.alfresco.web.bean.wcm;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import javax.faces.context.FacesContext;
|
||||||
|
|
||||||
|
import org.alfresco.error.AlfrescoRuntimeException;
|
||||||
|
import org.alfresco.model.ContentModel;
|
||||||
|
import org.alfresco.model.WCMAppModel;
|
||||||
|
import org.alfresco.repo.avm.AVMNodeConverter;
|
||||||
|
import org.alfresco.repo.workflow.WorkflowModel;
|
||||||
|
import org.alfresco.service.cmr.avm.AVMNodeDescriptor;
|
||||||
|
import org.alfresco.service.cmr.avm.AVMService;
|
||||||
|
import org.alfresco.service.cmr.avmsync.AVMDifference;
|
||||||
|
import org.alfresco.service.cmr.avmsync.AVMSyncService;
|
||||||
|
import org.alfresco.service.cmr.repository.ChildAssociationRef;
|
||||||
|
import org.alfresco.service.cmr.repository.NodeRef;
|
||||||
|
import org.alfresco.service.cmr.workflow.WorkflowDefinition;
|
||||||
|
import org.alfresco.service.cmr.workflow.WorkflowPath;
|
||||||
|
import org.alfresco.service.cmr.workflow.WorkflowService;
|
||||||
|
import org.alfresco.service.cmr.workflow.WorkflowTask;
|
||||||
|
import org.alfresco.service.cmr.workflow.WorkflowTaskState;
|
||||||
|
import org.alfresco.service.namespace.QName;
|
||||||
|
import org.alfresco.service.namespace.RegexQNamePattern;
|
||||||
|
import org.alfresco.util.GUID;
|
||||||
|
import org.alfresco.util.ISO8601DateFormat;
|
||||||
|
import org.alfresco.web.app.servlet.DownloadContentServlet;
|
||||||
|
import org.alfresco.web.bean.dialog.BaseDialogBean;
|
||||||
|
import org.alfresco.web.ui.common.Utils;
|
||||||
|
import org.alfresco.web.ui.common.component.UIListItem;
|
||||||
|
import org.alfresco.web.ui.wcm.WebResources;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Kevin Roast
|
||||||
|
*/
|
||||||
|
public class SubmitDialog extends BaseDialogBean
|
||||||
|
{
|
||||||
|
private String comment;
|
||||||
|
private String label;
|
||||||
|
private String[] workflowSelectedValue;
|
||||||
|
|
||||||
|
private List<ItemWrapper> submitItems;
|
||||||
|
private List<ItemWrapper> warningItems;
|
||||||
|
private HashSet<FormWorkflowWrapper> workflows;
|
||||||
|
private Map<String, FormWorkflowWrapper> formWorkflowMap;
|
||||||
|
private List<UIListItem> workflowItems;
|
||||||
|
|
||||||
|
protected AVMService avmService;
|
||||||
|
protected AVMBrowseBean avmBrowseBean;
|
||||||
|
protected WorkflowService workflowService;
|
||||||
|
protected AVMSyncService avmSyncService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param avmService The AVM Service to set.
|
||||||
|
*/
|
||||||
|
public void setAvmService(AVMService avmService)
|
||||||
|
{
|
||||||
|
this.avmService = avmService;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param avmSyncService The AVMSyncService to set.
|
||||||
|
*/
|
||||||
|
public void setAvmSyncService(AVMSyncService avmSyncService)
|
||||||
|
{
|
||||||
|
this.avmSyncService = avmSyncService;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param avmBrowseBean The AVM BrowseBean to set
|
||||||
|
*/
|
||||||
|
public void setAvmBrowseBean(AVMBrowseBean avmBrowseBean)
|
||||||
|
{
|
||||||
|
this.avmBrowseBean = avmBrowseBean;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param workflowService The WorkflowService to set.
|
||||||
|
*/
|
||||||
|
public void setWorkflowService(WorkflowService workflowService)
|
||||||
|
{
|
||||||
|
this.workflowService = workflowService;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see org.alfresco.web.bean.dialog.BaseDialogBean#init(java.util.Map)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void init(Map<String, String> parameters)
|
||||||
|
{
|
||||||
|
super.init(parameters);
|
||||||
|
|
||||||
|
this.comment = null;
|
||||||
|
this.label = null;
|
||||||
|
this.submitItems = null;
|
||||||
|
this.warningItems = null;
|
||||||
|
this.workflowItems = null;
|
||||||
|
this.workflows = new HashSet<FormWorkflowWrapper>(4);
|
||||||
|
|
||||||
|
// walk all the web forms attached the website, and lookup the workflow defaults for each
|
||||||
|
NodeRef websiteRef = this.avmBrowseBean.getWebsite().getNodeRef();
|
||||||
|
List<ChildAssociationRef> webFormRefs = this.nodeService.getChildAssocs(
|
||||||
|
websiteRef, WCMAppModel.ASSOC_WEBFORM, RegexQNamePattern.MATCH_ALL);
|
||||||
|
this.formWorkflowMap = new HashMap<String, FormWorkflowWrapper>(webFormRefs.size(), 1.0f);
|
||||||
|
for (ChildAssociationRef ref : webFormRefs)
|
||||||
|
{
|
||||||
|
NodeRef webFormRef = ref.getChildRef();
|
||||||
|
String form = (String)this.nodeService.getProperty(webFormRef, WCMAppModel.PROP_FORMNAME);
|
||||||
|
List<ChildAssociationRef> wfRefs = this.nodeService.getChildAssocs(
|
||||||
|
webFormRef, WCMAppModel.TYPE_WORKFLOWDEFAULTS, RegexQNamePattern.MATCH_ALL);
|
||||||
|
if (wfRefs.size() == 1)
|
||||||
|
{
|
||||||
|
NodeRef wfDefaultsRef = wfRefs.get(0).getChildRef();
|
||||||
|
String wfName = (String)this.nodeService.getProperty(wfDefaultsRef, WCMAppModel.PROP_WORKFLOW_NAME);
|
||||||
|
Map<QName, Serializable> params = (Map<QName, Serializable>)EditWebsiteWizard.deserializeWorkflowParams(
|
||||||
|
wfDefaultsRef);
|
||||||
|
this.formWorkflowMap.put(form, new FormWorkflowWrapper(wfName, params));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see org.alfresco.web.bean.dialog.BaseDialogBean#finishImpl(javax.faces.context.FacesContext, java.lang.String)
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected String finishImpl(FacesContext context, String outcome) throws Exception
|
||||||
|
{
|
||||||
|
// get the defaults from the workflow configuration attached to the selected workflow
|
||||||
|
Map<QName, Serializable> params = null;
|
||||||
|
String workflowName = this.workflowSelectedValue[0];
|
||||||
|
for (FormWorkflowWrapper wrapper : this.workflows)
|
||||||
|
{
|
||||||
|
if (wrapper.Name.equals(workflowName))
|
||||||
|
{
|
||||||
|
params = wrapper.Params;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (params != null)
|
||||||
|
{
|
||||||
|
// create container for our avm workflow package
|
||||||
|
NodeRef workflowPackage = createWorkflowPackage();
|
||||||
|
params.put(WorkflowModel.ASSOC_PACKAGE, workflowPackage);
|
||||||
|
|
||||||
|
// start the workflow to get access to the start task
|
||||||
|
WorkflowDefinition wfDef = workflowService.getDefinitionByName("jbpm$" + workflowName);
|
||||||
|
WorkflowPath path = this.workflowService.startWorkflow(wfDef.id, params);
|
||||||
|
if (path != null)
|
||||||
|
{
|
||||||
|
// extract the start task
|
||||||
|
List<WorkflowTask> tasks = this.workflowService.getTasksForWorkflowPath(path.id);
|
||||||
|
if (tasks.size() == 1)
|
||||||
|
{
|
||||||
|
WorkflowTask startTask = tasks.get(0);
|
||||||
|
|
||||||
|
if (startTask.state == WorkflowTaskState.IN_PROGRESS)
|
||||||
|
{
|
||||||
|
// end the start task to trigger the first 'proper' task in the workflow
|
||||||
|
this.workflowService.endTask(startTask.id, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// TODO: jump to dialog and allow user to finish wf properties config!
|
||||||
|
throw new AlfrescoRuntimeException("Workflow has not been configured correctly, cannot submit items.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return outcome;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see org.alfresco.web.bean.dialog.BaseDialogBean#getFinishButtonDisabled()
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public boolean getFinishButtonDisabled()
|
||||||
|
{
|
||||||
|
return (getWorkflowSelectedValue() == null || getSubmitItemsSize() == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the workflow comment.
|
||||||
|
*/
|
||||||
|
public String getComment()
|
||||||
|
{
|
||||||
|
return this.comment;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param comment The workflow comment to set.
|
||||||
|
*/
|
||||||
|
public void setComment(String comment)
|
||||||
|
{
|
||||||
|
this.comment = comment;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the snapshot label.
|
||||||
|
*/
|
||||||
|
public String getLabel()
|
||||||
|
{
|
||||||
|
return this.label;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param label The snapshot label to set.
|
||||||
|
*/
|
||||||
|
public void setLabel(String label)
|
||||||
|
{
|
||||||
|
this.label = label;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Returns the workflow Selected Value.
|
||||||
|
*/
|
||||||
|
public String[] getWorkflowSelectedValue()
|
||||||
|
{
|
||||||
|
// TODO: select default!
|
||||||
|
return this.workflowSelectedValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param workflowSelectedValue The workflow Selected Value to set.
|
||||||
|
*/
|
||||||
|
public void setWorkflowSelectedValue(String[] workflowSelectedValue)
|
||||||
|
{
|
||||||
|
this.workflowSelectedValue = workflowSelectedValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return List of UIListItem object representing the available workflows for the website
|
||||||
|
*/
|
||||||
|
public List<UIListItem> getWorkflowList()
|
||||||
|
{
|
||||||
|
if (this.workflowItems == null)
|
||||||
|
{
|
||||||
|
// ensure all workflows have been collected from any form generated assets
|
||||||
|
calculateSubmitItems();
|
||||||
|
|
||||||
|
// add the list of workflows for the website itself to the set
|
||||||
|
NodeRef websiteRef = this.avmBrowseBean.getWebsite().getNodeRef();
|
||||||
|
List<ChildAssociationRef> webWorkflowRefs = this.nodeService.getChildAssocs(
|
||||||
|
websiteRef, WCMAppModel.ASSOC_WEBWORKFLOWDEFAULTS, RegexQNamePattern.MATCH_ALL);
|
||||||
|
for (ChildAssociationRef ref : webWorkflowRefs)
|
||||||
|
{
|
||||||
|
NodeRef wfDefaultsRef = ref.getChildRef();
|
||||||
|
String wfName = (String)this.nodeService.getProperty(wfDefaultsRef, WCMAppModel.PROP_WORKFLOW_NAME);
|
||||||
|
Map<QName, Serializable> params = (Map<QName, Serializable>)EditWebsiteWizard.deserializeWorkflowParams(
|
||||||
|
wfDefaultsRef);
|
||||||
|
this.workflows.add(new FormWorkflowWrapper(wfName, params));
|
||||||
|
}
|
||||||
|
|
||||||
|
// build a UI item for each available workflow
|
||||||
|
List<UIListItem> items = new ArrayList<UIListItem>(this.workflows.size());
|
||||||
|
for (FormWorkflowWrapper wrapper : this.workflows)
|
||||||
|
{
|
||||||
|
WorkflowDefinition workflowDef = this.workflowService.getDefinitionByName("jbpm$" + wrapper.Name);
|
||||||
|
UIListItem item = new UIListItem();
|
||||||
|
item.setValue(workflowDef.getName());
|
||||||
|
item.setLabel(workflowDef.getTitle());
|
||||||
|
item.setDescription(workflowDef.getDescription());
|
||||||
|
item.setImage(WebResources.IMAGE_WORKFLOW_32);
|
||||||
|
items.add(item);
|
||||||
|
// add first as default TODO: what is correct here?
|
||||||
|
if (workflowSelectedValue == null)
|
||||||
|
{
|
||||||
|
workflowSelectedValue = new String[]{workflowDef.getName()};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.workflowItems = items;
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.workflowItems;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ItemWrapper> getSubmitItems()
|
||||||
|
{
|
||||||
|
if (this.submitItems == null)
|
||||||
|
{
|
||||||
|
// this method builds all submit and warning item data structures
|
||||||
|
calculateSubmitItems();
|
||||||
|
}
|
||||||
|
return this.submitItems;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getSubmitItemsSize()
|
||||||
|
{
|
||||||
|
return getSubmitItems().size();
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ItemWrapper> getWarningItems()
|
||||||
|
{
|
||||||
|
if (this.warningItems == null)
|
||||||
|
{
|
||||||
|
// this method builds all submit and warning item data structures
|
||||||
|
calculateSubmitItems();
|
||||||
|
}
|
||||||
|
return this.warningItems;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getWarningItemsSize()
|
||||||
|
{
|
||||||
|
return this.getWarningItems().size();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void calculateSubmitItems()
|
||||||
|
{
|
||||||
|
// TODO: start txn here?
|
||||||
|
List<AVMNodeDescriptor> selected;
|
||||||
|
if (this.avmBrowseBean.getSubmitAll())
|
||||||
|
{
|
||||||
|
String userStore = this.avmBrowseBean.getSandbox() + ":/";
|
||||||
|
String stagingStore = this.avmBrowseBean.getStagingStore() + ":/";
|
||||||
|
List<AVMDifference> diffs = avmSyncService.compare(-1, userStore, -1, stagingStore);
|
||||||
|
selected = new ArrayList<AVMNodeDescriptor>(diffs.size());
|
||||||
|
for (AVMDifference diff : diffs)
|
||||||
|
{
|
||||||
|
AVMNodeDescriptor node = this.avmService.lookup(-1, diff.getSourcePath());
|
||||||
|
selected.add(node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
selected = this.avmBrowseBean.getSelectedSandboxItems();
|
||||||
|
}
|
||||||
|
if (selected != null)
|
||||||
|
{
|
||||||
|
this.submitItems = new ArrayList<ItemWrapper>(selected.size());
|
||||||
|
this.warningItems = new ArrayList<ItemWrapper>(selected.size() >> 1);
|
||||||
|
for (AVMNodeDescriptor node : selected)
|
||||||
|
{
|
||||||
|
if (hasAssociatedWorkflow(AVMNodeConverter.ToNodeRef(-1, node.getPath())) == false)
|
||||||
|
{
|
||||||
|
// TODO: lookup if this item was created via a FORM - then need to lookup the workflow defaults
|
||||||
|
// for that form (and associated artifacts!) and then save that in list of workflows
|
||||||
|
NodeRef ref = AVMNodeConverter.ToNodeRef(-1, node.getPath());
|
||||||
|
if (this.nodeService.hasAspect(ref, WCMAppModel.ASPECT_FORM_INSTANCE_DATA))
|
||||||
|
{
|
||||||
|
// found an XML form instance data file
|
||||||
|
String formName = (String)this.nodeService.getProperty(ref, WCMAppModel.PROP_PARENT_FORM_NAME);
|
||||||
|
FormWorkflowWrapper wrapper = this.formWorkflowMap.get(formName);
|
||||||
|
if (wrapper.Params != null)
|
||||||
|
{
|
||||||
|
// found a workflow with params attached to the form
|
||||||
|
this.workflows.add(wrapper);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.submitItems.add(new ItemWrapper(node));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.warningItems.add(new ItemWrapper(node));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.submitItems = Collections.<ItemWrapper>emptyList();
|
||||||
|
this.warningItems = Collections.<ItemWrapper>emptyList();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean hasAssociatedWorkflow(NodeRef ref)
|
||||||
|
{
|
||||||
|
// TODO: does not appear to work for AVM - need a specific impl instead
|
||||||
|
return (this.workflowService.getWorkflowsForContent(ref, true).size() != 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Construct a workflow package as a layered directory over the users sandbox. The items for
|
||||||
|
* submission are pushed into the layer and the package constructed around it.
|
||||||
|
*
|
||||||
|
* @return Reference to the package
|
||||||
|
*/
|
||||||
|
private NodeRef createWorkflowPackage()
|
||||||
|
{
|
||||||
|
// TODO: add to common util class for all AVM workflows
|
||||||
|
String packagesRoot = "workflow-system:/packages";
|
||||||
|
AVMNodeDescriptor packagesDesc = avmService.lookup(-1, packagesRoot);
|
||||||
|
if (packagesDesc == null)
|
||||||
|
{
|
||||||
|
avmService.createAVMStore("workflow-system");
|
||||||
|
avmService.createDirectory("workflow-system:/", "packages");
|
||||||
|
}
|
||||||
|
|
||||||
|
List<ItemWrapper> items = getSubmitItems();
|
||||||
|
|
||||||
|
// create package paths (layered to user sandbox area as target)
|
||||||
|
String sandboxPath = AVMConstants.buildAVMStoreRootPath(avmBrowseBean.getSandbox());
|
||||||
|
String packageName = GUID.generate();
|
||||||
|
String packagesPath = packagesRoot + "/" + packageName;
|
||||||
|
avmService.createLayeredDirectory(sandboxPath, packagesRoot, packageName);
|
||||||
|
|
||||||
|
// construct diffs for selected items
|
||||||
|
List<AVMDifference> diffs = new ArrayList<AVMDifference>(this.submitItems.size());
|
||||||
|
for (ItemWrapper wrapper : this.submitItems)
|
||||||
|
{
|
||||||
|
String srcPath = sandboxPath + wrapper.getPath();
|
||||||
|
String destPath = packagesPath + wrapper.getPath();
|
||||||
|
AVMDifference diff = new AVMDifference(-1, srcPath, -1, destPath, AVMDifference.NEWER);
|
||||||
|
diffs.add(diff);
|
||||||
|
}
|
||||||
|
|
||||||
|
// write changes to layer so files are marked as modified
|
||||||
|
avmSyncService.update(diffs, true, true, false, false, null, null);
|
||||||
|
|
||||||
|
// convert package to workflow package
|
||||||
|
AVMNodeDescriptor packageDesc = avmService.lookup(-1, packagesPath);
|
||||||
|
NodeRef packageNodeRef = workflowService.createPackage(AVMNodeConverter.ToNodeRef(-1, packageDesc.getPath()));
|
||||||
|
nodeService.setProperty(packageNodeRef, WorkflowModel.PROP_IS_SYSTEM_PACKAGE, true);
|
||||||
|
|
||||||
|
return packageNodeRef;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simple structure class to wrap form workflow name and default parameter values
|
||||||
|
*/
|
||||||
|
private static class FormWorkflowWrapper
|
||||||
|
{
|
||||||
|
public String Name;
|
||||||
|
public Map<QName, Serializable> Params;
|
||||||
|
|
||||||
|
FormWorkflowWrapper(String name, Map<QName, Serializable> params)
|
||||||
|
{
|
||||||
|
this.Name = name;
|
||||||
|
this.Params = params;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int hashCode()
|
||||||
|
{
|
||||||
|
return this.Name.hashCode();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean equals(Object obj)
|
||||||
|
{
|
||||||
|
if (obj instanceof FormWorkflowWrapper)
|
||||||
|
{
|
||||||
|
return this.Name.equals( ((FormWorkflowWrapper)obj).Name );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wrapper class to provide UI RichList component getters for an AVM node descriptor
|
||||||
|
*/
|
||||||
|
public class ItemWrapper
|
||||||
|
{
|
||||||
|
private static final String rootPath = '/' + AVMConstants.DIR_WEBAPPS;
|
||||||
|
private AVMNodeDescriptor descriptor;
|
||||||
|
|
||||||
|
public ItemWrapper(AVMNodeDescriptor descriptor)
|
||||||
|
{
|
||||||
|
this.descriptor = descriptor;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName()
|
||||||
|
{
|
||||||
|
return descriptor.getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getModifiedDate()
|
||||||
|
{
|
||||||
|
return ISO8601DateFormat.format(new Date(descriptor.getModDate()));
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDescription()
|
||||||
|
{
|
||||||
|
return (String)nodeService.getProperty(
|
||||||
|
AVMNodeConverter.ToNodeRef(-1, descriptor.getPath()), ContentModel.PROP_DESCRIPTION);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPath()
|
||||||
|
{
|
||||||
|
return descriptor.getPath().substring(descriptor.getPath().indexOf(rootPath) + rootPath.length());
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUrl()
|
||||||
|
{
|
||||||
|
return DownloadContentServlet.generateBrowserURL(
|
||||||
|
AVMNodeConverter.ToNodeRef(-1, descriptor.getPath()), descriptor.getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getIcon()
|
||||||
|
{
|
||||||
|
return Utils.getFileTypeImage(descriptor.getName(), true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -337,7 +337,7 @@ public class UIUserSandboxes extends SelfRenderingComponent
|
|||||||
|
|
||||||
Utils.encodeRecursive(context, aquireAction(
|
Utils.encodeRecursive(context, aquireAction(
|
||||||
context, mainStore, username, ACT_SANDBOX_SUBMITALL, "/images/icons/submit_all.gif",
|
context, mainStore, username, ACT_SANDBOX_SUBMITALL, "/images/icons/submit_all.gif",
|
||||||
"#{AVMBrowseBean.submitAll}", null));
|
"#{AVMBrowseBean.setupSubmitAllAction}", "dialog:submitSandboxItems"));
|
||||||
out.write(" ");
|
out.write(" ");
|
||||||
|
|
||||||
Utils.encodeRecursive(context, aquireAction(
|
Utils.encodeRecursive(context, aquireAction(
|
||||||
@@ -663,7 +663,7 @@ public class UIUserSandboxes extends SelfRenderingComponent
|
|||||||
out.write(": ");
|
out.write(": ");
|
||||||
Utils.encodeRecursive(fc, aquireAction(
|
Utils.encodeRecursive(fc, aquireAction(
|
||||||
fc, userStorePrefix, username, ACT_SANDBOX_SUBMITSELECTED, "/images/icons/submit_all.gif",
|
fc, userStorePrefix, username, ACT_SANDBOX_SUBMITSELECTED, "/images/icons/submit_all.gif",
|
||||||
"#{AVMBrowseBean.submitSelected}", null));
|
"#{AVMBrowseBean.setupSandboxAction}", "dialog:submitSandboxItems"));
|
||||||
out.write(" ");
|
out.write(" ");
|
||||||
Utils.encodeRecursive(fc, aquireAction(
|
Utils.encodeRecursive(fc, aquireAction(
|
||||||
fc, userStorePrefix, username, ACT_SANDBOX_REVERTSELECTED, "/images/icons/revert_all.gif",
|
fc, userStorePrefix, username, ACT_SANDBOX_REVERTSELECTED, "/images/icons/revert_all.gif",
|
||||||
@@ -1048,7 +1048,7 @@ public class UIUserSandboxes extends SelfRenderingComponent
|
|||||||
{
|
{
|
||||||
List<AVMNodeDescriptor> nodes = null;
|
List<AVMNodeDescriptor> nodes = null;
|
||||||
|
|
||||||
if (username != null)
|
if (username != null && this.checkedItems != null)
|
||||||
{
|
{
|
||||||
List<AVMNodeDescriptor> paths = this.userNodes.get(username);
|
List<AVMNodeDescriptor> paths = this.userNodes.get(username);
|
||||||
if (paths != null)
|
if (paths != null)
|
||||||
|
@@ -2726,6 +2726,35 @@
|
|||||||
</managed-property>
|
</managed-property>
|
||||||
</managed-bean>
|
</managed-bean>
|
||||||
|
|
||||||
|
<managed-bean>
|
||||||
|
<description>
|
||||||
|
The bean that backs up the Submit dialog
|
||||||
|
</description>
|
||||||
|
<managed-bean-name>SubmitDialog</managed-bean-name>
|
||||||
|
<managed-bean-class>org.alfresco.web.bean.wcm.SubmitDialog</managed-bean-class>
|
||||||
|
<managed-bean-scope>session</managed-bean-scope>
|
||||||
|
<managed-property>
|
||||||
|
<property-name>avmService</property-name>
|
||||||
|
<value>#{AVMService}</value>
|
||||||
|
</managed-property>
|
||||||
|
<managed-property>
|
||||||
|
<property-name>avmSyncService</property-name>
|
||||||
|
<value>#{AVMSyncService}</value>
|
||||||
|
</managed-property>
|
||||||
|
<managed-property>
|
||||||
|
<property-name>avmBrowseBean</property-name>
|
||||||
|
<value>#{AVMBrowseBean}</value>
|
||||||
|
</managed-property>
|
||||||
|
<managed-property>
|
||||||
|
<property-name>workflowService</property-name>
|
||||||
|
<value>#{WorkflowService}</value>
|
||||||
|
</managed-property>
|
||||||
|
<managed-property>
|
||||||
|
<property-name>nodeService</property-name>
|
||||||
|
<value>#{NodeService}</value>
|
||||||
|
</managed-property>
|
||||||
|
</managed-bean>
|
||||||
|
|
||||||
<!-- ==================== COMPONENT GENERATOR BEANS ==================== -->
|
<!-- ==================== COMPONENT GENERATOR BEANS ==================== -->
|
||||||
<managed-bean>
|
<managed-bean>
|
||||||
<description>
|
<description>
|
||||||
|
BIN
source/web/images/icons/error.gif
Normal file
BIN
source/web/images/icons/error.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.0 KiB |
BIN
source/web/images/icons/error_large.gif
Normal file
BIN
source/web/images/icons/error_large.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.6 KiB |
BIN
source/web/images/icons/info_icon_large.gif
Normal file
BIN
source/web/images/icons/info_icon_large.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.4 KiB |
BIN
source/web/images/icons/warning.gif
Normal file
BIN
source/web/images/icons/warning.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 1019 B |
BIN
source/web/images/icons/warning_large.gif
Normal file
BIN
source/web/images/icons/warning_large.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.5 KiB |
@@ -217,7 +217,6 @@
|
|||||||
<a:actionLink id="col10-act1" value="#{r.name}" href="#{r.url}" target="new" image="#{r.fileType16}" showLink="false" styleClass="inlineAction" />
|
<a:actionLink id="col10-act1" value="#{r.name}" href="#{r.url}" target="new" image="#{r.fileType16}" showLink="false" styleClass="inlineAction" />
|
||||||
</f:facet>
|
</f:facet>
|
||||||
<a:actionLink id="col10-act2" value="#{r.name}" href="#{r.url}" target="new" />
|
<a:actionLink id="col10-act2" value="#{r.name}" href="#{r.url}" target="new" />
|
||||||
<r:lockIcon id="col10-lock" value="#{r.nodeRef}" align="absmiddle" />
|
|
||||||
</a:column>
|
</a:column>
|
||||||
|
|
||||||
<%-- Description column --%>
|
<%-- Description column --%>
|
||||||
|
163
source/web/jsp/wcm/submit-dialog.jsp
Normal file
163
source/web/jsp/wcm/submit-dialog.jsp
Normal file
@@ -0,0 +1,163 @@
|
|||||||
|
<%--
|
||||||
|
Copyright (C) 2005 Alfresco, Inc.
|
||||||
|
|
||||||
|
Licensed under the Mozilla Public License version 1.1
|
||||||
|
with a permitted attribution clause. You may obtain a
|
||||||
|
copy of the License at
|
||||||
|
|
||||||
|
http://www.alfresco.org/legal/license.txt
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
|
||||||
|
either express or implied. See the License for the specific
|
||||||
|
language governing permissions and limitations under the
|
||||||
|
License.
|
||||||
|
--%>
|
||||||
|
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
|
||||||
|
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
|
||||||
|
<%@ taglib uri="/WEB-INF/alfresco.tld" prefix="a" %>
|
||||||
|
<%@ taglib uri="/WEB-INF/repo.tld" prefix="r" %>
|
||||||
|
|
||||||
|
<%@ page import="org.alfresco.web.ui.common.PanelGenerator" %>
|
||||||
|
<%@ page buffer="32kb" contentType="text/html;charset=UTF-8" %>
|
||||||
|
<%@ page isELIgnored="false" %>
|
||||||
|
|
||||||
|
<h:panelGrid columns="1" cellpadding="2" style="padding-top:4px;padding-bottom:4px;"
|
||||||
|
width="100%" rowClasses="wizardSectionHeading">
|
||||||
|
<h:outputText value=" #{msg.submit_submission_info}" escape="false" />
|
||||||
|
</h:panelGrid>
|
||||||
|
|
||||||
|
<h:panelGrid columns="2" cellpadding="2" cellpadding="2" width="100%" style="margin-left:8px">
|
||||||
|
<h:outputText value="#{msg.submit_comment}"/>
|
||||||
|
<h:inputText id="comment" value="#{DialogManager.bean.comment}" maxlength="1024" size="35" />
|
||||||
|
<h:outputText value="#{msg.submit_snapshotlabel}"/>
|
||||||
|
<h:inputText id="label" value="#{DialogManager.bean.label}" maxlength="1024" size="35" />
|
||||||
|
</h:panelGrid>
|
||||||
|
|
||||||
|
<h:panelGrid columns="1" cellpadding="2" style="padding-top:16px;padding-bottom:4px;"
|
||||||
|
width="100%" rowClasses="wizardSectionHeading">
|
||||||
|
<h:outputText value=" #{msg.workflow}" escape="false" />
|
||||||
|
</h:panelGrid>
|
||||||
|
|
||||||
|
<h:panelGrid columns="1" cellpadding="2" cellpadding="2" width="100%" style="margin-left:8px">
|
||||||
|
<h:outputText value="#{msg.submit_workflow_selection}"/>
|
||||||
|
<a:selectList id="workflow-list" multiSelect="false" styleClass="selectListTable" itemStyleClass="selectListItem"
|
||||||
|
value="#{DialogManager.bean.workflowSelectedValue}">
|
||||||
|
<a:listItems value="#{DialogManager.bean.workflowList}" />
|
||||||
|
</a:selectList>
|
||||||
|
</h:panelGrid>
|
||||||
|
|
||||||
|
<h:panelGrid columns="1" cellpadding="2" style="padding-top:16px;padding-bottom:4px;"
|
||||||
|
width="100%" rowClasses="wizardSectionHeading">
|
||||||
|
<h:outputText value=" #{msg.modified_items}" escape="false" />
|
||||||
|
</h:panelGrid>
|
||||||
|
|
||||||
|
<h:panelGrid columns="1" cellpadding="2" cellpadding="2" width="100%" style="margin-left:8px">
|
||||||
|
<h:panelGroup rendered="#{DialogManager.bean.warningItemsSize != 0}">
|
||||||
|
<f:verbatim><% PanelGenerator.generatePanelStart(out, request.getContextPath(), "yellowInner", "#ffffcc"); %></f:verbatim>
|
||||||
|
<h:panelGrid columns="2" cellpadding="0" cellpadding="0">
|
||||||
|
<h:graphicImage url="/images/icons/warning.gif" style="padding-top:2px;padding-right:4px" width="16" height="16"/>
|
||||||
|
<h:outputText styleClass="mainSubText" value="#{msg.submit_not_submit_warning}" />
|
||||||
|
</h:panelGrid>
|
||||||
|
<f:verbatim><% PanelGenerator.generatePanelEnd(out, request.getContextPath(), "yellowInner"); %></f:verbatim>
|
||||||
|
|
||||||
|
<a:richList id="warning-list" viewMode="details" value="#{DialogManager.bean.warningItems}"
|
||||||
|
var="r" styleClass="recordSet" headerStyleClass="recordSetHeader" rowStyleClass="recordSetRow"
|
||||||
|
altRowStyleClass="recordSetRowAlt" width="100%" pageSize="10" initialSortColumn="name">
|
||||||
|
|
||||||
|
<%-- Primary column for details view mode --%>
|
||||||
|
<a:column id="col1" primary="true" width="100" 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">
|
||||||
|
<a:actionLink id="col1-icon" value="#{r.name}" href="#{r.url}" target="new" image="#{r.icon}" showLink="false" styleClass="inlineAction" />
|
||||||
|
</f:facet>
|
||||||
|
<a:actionLink id="col1-name" value="#{r.name}" href="#{r.url}" target="new" />
|
||||||
|
</a:column>
|
||||||
|
|
||||||
|
<%-- Description columns --%>
|
||||||
|
<a:column id="col2" width="200" style="text-align:left">
|
||||||
|
<f:facet name="header">
|
||||||
|
<a:sortLink label="#{msg.description}" value="description" styleClass="header"/>
|
||||||
|
</f:facet>
|
||||||
|
<h:outputText id="col2-desc" value="#{r.description}" />
|
||||||
|
</a:column>
|
||||||
|
|
||||||
|
<%-- Description columns --%>
|
||||||
|
<a:column id="col3" style="text-align:left">
|
||||||
|
<f:facet name="header">
|
||||||
|
<a:sortLink label="#{msg.path}" value="path" styleClass="header"/>
|
||||||
|
</f:facet>
|
||||||
|
<h:outputText id="col3-path" value="#{r.path}" />
|
||||||
|
</a:column>
|
||||||
|
|
||||||
|
<%-- Modified Date column --%>
|
||||||
|
<a:column id="col4" style="text-align:left; white-space:nowrap">
|
||||||
|
<f:facet name="header">
|
||||||
|
<a:sortLink label="#{msg.modified_date}" value="modifiedDate" styleClass="header"/>
|
||||||
|
</f:facet>
|
||||||
|
<h:outputText id="col4-date" value="#{r.modifiedDate}">
|
||||||
|
<a:convertXMLDate type="both" pattern="#{msg.date_time_pattern}" />
|
||||||
|
</h:outputText>
|
||||||
|
</a:column>
|
||||||
|
|
||||||
|
<a:dataPager styleClass="pager" />
|
||||||
|
</a:richList>
|
||||||
|
</h:panelGroup>
|
||||||
|
|
||||||
|
<h:panelGroup rendered="#{DialogManager.bean.submitItemsSize != 0}">
|
||||||
|
<f:verbatim><% PanelGenerator.generatePanelStart(out, request.getContextPath(), "yellowInner", "#ffffcc"); %></f:verbatim>
|
||||||
|
<h:panelGrid columns="2" cellpadding="0" cellpadding="0">
|
||||||
|
<h:graphicImage url="/images/icons/info_icon.gif" style="padding-top:2px;padding-right:4px" width="16" height="16"/>
|
||||||
|
<h:outputText styleClass="mainSubText" value="#{msg.submit_submit_info}" />
|
||||||
|
</h:panelGrid>
|
||||||
|
<f:verbatim><% PanelGenerator.generatePanelEnd(out, request.getContextPath(), "yellowInner"); %></f:verbatim>
|
||||||
|
|
||||||
|
<a:richList id="submit-list" viewMode="details" value="#{DialogManager.bean.submitItems}"
|
||||||
|
var="r" styleClass="recordSet" headerStyleClass="recordSetHeader" rowStyleClass="recordSetRow"
|
||||||
|
altRowStyleClass="recordSetRowAlt" width="100%" pageSize="10" initialSortColumn="name">
|
||||||
|
|
||||||
|
<%-- Primary column for details view mode --%>
|
||||||
|
<a:column id="col10" primary="true" width="100" 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">
|
||||||
|
<a:actionLink id="col10-icon" value="#{r.name}" href="#{r.url}" target="new" image="#{r.icon}" showLink="false" styleClass="inlineAction" />
|
||||||
|
</f:facet>
|
||||||
|
<a:actionLink id="col10-name" value="#{r.name}" href="#{r.url}" target="new" />
|
||||||
|
</a:column>
|
||||||
|
|
||||||
|
<%-- Description columns --%>
|
||||||
|
<a:column id="col11" width="200" style="text-align:left">
|
||||||
|
<f:facet name="header">
|
||||||
|
<a:sortLink label="#{msg.description}" value="description" styleClass="header"/>
|
||||||
|
</f:facet>
|
||||||
|
<h:outputText id="col11-desc" value="#{r.description}" />
|
||||||
|
</a:column>
|
||||||
|
|
||||||
|
<%-- Description columns --%>
|
||||||
|
<a:column id="col12" style="text-align:left">
|
||||||
|
<f:facet name="header">
|
||||||
|
<a:sortLink label="#{msg.path}" value="path" styleClass="header"/>
|
||||||
|
</f:facet>
|
||||||
|
<h:outputText id="col12-path" value="#{r.path}" />
|
||||||
|
</a:column>
|
||||||
|
|
||||||
|
<%-- Modified Date column --%>
|
||||||
|
<a:column id="col13" style="text-align:left; white-space:nowrap">
|
||||||
|
<f:facet name="header">
|
||||||
|
<a:sortLink label="#{msg.modified_date}" value="modifiedDate" styleClass="header"/>
|
||||||
|
</f:facet>
|
||||||
|
<h:outputText id="col13-date" value="#{r.modifiedDate}">
|
||||||
|
<a:convertXMLDate type="both" pattern="#{msg.date_time_pattern}" />
|
||||||
|
</h:outputText>
|
||||||
|
</a:column>
|
||||||
|
|
||||||
|
<a:dataPager styleClass="pager" />
|
||||||
|
</a:richList>
|
||||||
|
</h:panelGroup>
|
||||||
|
|
||||||
|
</h:panelGrid>
|
Reference in New Issue
Block a user