mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-07 17:49:17 +00:00
First cut of pending submission UI
git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@5735 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -966,6 +966,13 @@ sandbox_no_modified_items=No modified items
|
|||||||
sandbox_no_web_forms=No Web Forms available
|
sandbox_no_web_forms=No Web Forms available
|
||||||
sandbox_my_sandbox=My Sandbox
|
sandbox_my_sandbox=My Sandbox
|
||||||
sandbox_user=User
|
sandbox_user=User
|
||||||
|
pending_submissions=Pending Submissions
|
||||||
|
no_pending_submissions=No pending submissions
|
||||||
|
pending_preview=Preview Contents
|
||||||
|
pending_details=View Details
|
||||||
|
pending_diff=Preview Submission And Current Deployed Site
|
||||||
|
pending_promote=Submit Now
|
||||||
|
pending_abort=Abort Submission
|
||||||
|
|
||||||
# Website actions and dialog messages
|
# Website actions and dialog messages
|
||||||
title_import_content=Web Project Bulk Import
|
title_import_content=Web Project Bulk Import
|
||||||
|
@@ -1106,6 +1106,70 @@ public class AVMBrowseBean implements IContextListener
|
|||||||
fc.getApplication().getNavigationHandler().handleNavigation(fc, null, "wizard:createWebContent");
|
fc.getApplication().getNavigationHandler().handleNavigation(fc, null, "wizard:createWebContent");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Event handler that transitions a 'submitpending' task to effectively
|
||||||
|
* bypass the lauch date and immediately submit the items.
|
||||||
|
*
|
||||||
|
* @param event The event
|
||||||
|
*/
|
||||||
|
public void promotePendingSubmission(ActionEvent event)
|
||||||
|
{
|
||||||
|
UIActionLink link = (UIActionLink)event.getComponent();
|
||||||
|
Map<String, String> params = link.getParameterMap();
|
||||||
|
String taskId = params.get("taskId");
|
||||||
|
|
||||||
|
UserTransaction tx = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
FacesContext context = FacesContext.getCurrentInstance();
|
||||||
|
tx = Repository.getUserTransaction(context, false);
|
||||||
|
tx.begin();
|
||||||
|
|
||||||
|
// transition the task
|
||||||
|
this.workflowService.endTask(taskId, "launch");
|
||||||
|
|
||||||
|
// commit the transaction
|
||||||
|
tx.commit();
|
||||||
|
}
|
||||||
|
catch (Throwable err)
|
||||||
|
{
|
||||||
|
Utils.addErrorMessage(MessageFormat.format(Application.getMessage(
|
||||||
|
FacesContext.getCurrentInstance(), Repository.ERROR_GENERIC), err.getMessage()), err);
|
||||||
|
try { if (tx != null) {tx.rollback();} } catch (Exception tex) {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Event handler that cancels a pending submission.
|
||||||
|
*
|
||||||
|
* @param event The event
|
||||||
|
*/
|
||||||
|
public void cancelPendingSubmission(ActionEvent event)
|
||||||
|
{
|
||||||
|
UIActionLink link = (UIActionLink)event.getComponent();
|
||||||
|
Map<String, String> params = link.getParameterMap();
|
||||||
|
String workflowId = params.get("workflowInstanceId");
|
||||||
|
|
||||||
|
UserTransaction tx = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
FacesContext context = FacesContext.getCurrentInstance();
|
||||||
|
tx = Repository.getUserTransaction(context, false);
|
||||||
|
tx.begin();
|
||||||
|
|
||||||
|
// cancel the workflow
|
||||||
|
this.workflowService.cancelWorkflow(workflowId);
|
||||||
|
|
||||||
|
// commit the transaction
|
||||||
|
tx.commit();
|
||||||
|
}
|
||||||
|
catch (Throwable err)
|
||||||
|
{
|
||||||
|
Utils.addErrorMessage(MessageFormat.format(Application.getMessage(
|
||||||
|
FacesContext.getCurrentInstance(), Repository.ERROR_GENERIC), err.getMessage()), err);
|
||||||
|
try { if (tx != null) {tx.rollback();} } catch (Exception tex) {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------
|
||||||
// Private helpers
|
// Private helpers
|
||||||
|
@@ -83,6 +83,7 @@ public class AVMWorkflowUtil extends WorkflowUtil
|
|||||||
public static final QName PROP_FROM_PATH = QName.createQName(WCM_WORKFLOW_MODEL_1_0_URI, "fromPath");
|
public static final QName PROP_FROM_PATH = QName.createQName(WCM_WORKFLOW_MODEL_1_0_URI, "fromPath");
|
||||||
public static final QName PROP_LABEL = QName.createQName(WCM_WORKFLOW_MODEL_1_0_URI, "label");
|
public static final QName PROP_LABEL = QName.createQName(WCM_WORKFLOW_MODEL_1_0_URI, "label");
|
||||||
public static final QName PROP_LAUNCH_DATE = QName.createQName(WCM_WORKFLOW_MODEL_1_0_URI, "launchDate");
|
public static final QName PROP_LAUNCH_DATE = QName.createQName(WCM_WORKFLOW_MODEL_1_0_URI, "launchDate");
|
||||||
|
public static final QName ASSOC_WEBPROJECT = QName.createQName(WCM_WORKFLOW_MODEL_1_0_URI, "webproject");
|
||||||
|
|
||||||
// cached configured lists
|
// cached configured lists
|
||||||
private static List<WorkflowDefinition> configuredWorkflowDefs = null;
|
private static List<WorkflowDefinition> configuredWorkflowDefs = null;
|
||||||
|
@@ -326,9 +326,12 @@ public class SubmitDialog extends BaseDialogBean
|
|||||||
// add submission parameters
|
// add submission parameters
|
||||||
params.put(WorkflowModel.PROP_WORKFLOW_DESCRIPTION, getComment());
|
params.put(WorkflowModel.PROP_WORKFLOW_DESCRIPTION, getComment());
|
||||||
params.put(AVMWorkflowUtil.PROP_LABEL, getLabel());
|
params.put(AVMWorkflowUtil.PROP_LABEL, getLabel());
|
||||||
params.put(AVMWorkflowUtil.PROP_FROM_PATH, AVMUtil.buildStoreRootPath(this.avmBrowseBean.getSandbox()));
|
params.put(AVMWorkflowUtil.PROP_FROM_PATH,
|
||||||
|
AVMUtil.buildStoreRootPath(this.avmBrowseBean.getSandbox()));
|
||||||
params.put(AVMWorkflowUtil.PROP_LAUNCH_DATE, this.launchDate);
|
params.put(AVMWorkflowUtil.PROP_LAUNCH_DATE, this.launchDate);
|
||||||
|
params.put(AVMWorkflowUtil.ASSOC_WEBPROJECT,
|
||||||
|
this.avmBrowseBean.getWebsite().getNodeRef());
|
||||||
|
|
||||||
// update start task with submit parameters
|
// update start task with submit parameters
|
||||||
this.workflowService.updateTask(startTask.id, params, null, null);
|
this.workflowService.updateTask(startTask.id, params, null, null);
|
||||||
|
|
||||||
|
@@ -0,0 +1,456 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2005-2007 Alfresco Software Limited.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
|
||||||
|
* As a special exception to the terms and conditions of version 2.0 of
|
||||||
|
* the GPL, you may redistribute this Program in connection with Free/Libre
|
||||||
|
* and Open Source Software ("FLOSS") applications as described in Alfresco's
|
||||||
|
* FLOSS exception. You should have recieved a copy of the text describing
|
||||||
|
* the FLOSS exception, and it is also available here:
|
||||||
|
* http://www.alfresco.com/legal/licensing"
|
||||||
|
*/
|
||||||
|
package org.alfresco.web.ui.wcm.component;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.ResourceBundle;
|
||||||
|
|
||||||
|
import javax.faces.component.UIComponent;
|
||||||
|
import javax.faces.component.UIParameter;
|
||||||
|
import javax.faces.context.FacesContext;
|
||||||
|
import javax.faces.context.ResponseWriter;
|
||||||
|
import javax.faces.el.ValueBinding;
|
||||||
|
import javax.transaction.UserTransaction;
|
||||||
|
|
||||||
|
import org.alfresco.model.ContentModel;
|
||||||
|
import org.alfresco.repo.avm.AVMNodeConverter;
|
||||||
|
import org.alfresco.repo.workflow.WorkflowModel;
|
||||||
|
import org.alfresco.service.cmr.repository.NodeRef;
|
||||||
|
import org.alfresco.service.cmr.workflow.WorkflowTask;
|
||||||
|
import org.alfresco.service.cmr.workflow.WorkflowTaskQuery;
|
||||||
|
import org.alfresco.service.cmr.workflow.WorkflowTaskState;
|
||||||
|
import org.alfresco.service.namespace.NamespaceService;
|
||||||
|
import org.alfresco.service.namespace.QName;
|
||||||
|
import org.alfresco.util.Pair;
|
||||||
|
import org.alfresco.web.app.Application;
|
||||||
|
import org.alfresco.web.app.servlet.FacesHelper;
|
||||||
|
import org.alfresco.web.bean.repository.Repository;
|
||||||
|
import org.alfresco.web.bean.wcm.AVMBrowseBean;
|
||||||
|
import org.alfresco.web.bean.wcm.AVMUtil;
|
||||||
|
import org.alfresco.web.bean.wcm.AVMWorkflowUtil;
|
||||||
|
import org.alfresco.web.ui.common.ComponentConstants;
|
||||||
|
import org.alfresco.web.ui.common.ConstantMethodBinding;
|
||||||
|
import org.alfresco.web.ui.common.Utils;
|
||||||
|
import org.alfresco.web.ui.common.component.SelfRenderingComponent;
|
||||||
|
import org.alfresco.web.ui.common.component.UIActionLink;
|
||||||
|
import org.alfresco.web.ui.repo.component.UIActions;
|
||||||
|
import org.apache.commons.logging.Log;
|
||||||
|
import org.apache.commons.logging.LogFactory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Component to display the list of pending submissions for a web project.
|
||||||
|
*
|
||||||
|
* @author Gavin Cornwell
|
||||||
|
*/
|
||||||
|
public class UIPendingSubmissions extends SelfRenderingComponent
|
||||||
|
{
|
||||||
|
private static final String ACT_DETAILS = "pending_details";
|
||||||
|
private static final String ACT_PREVIEW = "pending_preview";
|
||||||
|
private static final String ACT_DIFF = "pending_diff";
|
||||||
|
private static final String ACT_PROMOTE = "pending_promote";
|
||||||
|
private static final String ACT_ABORT = "pending_abort";
|
||||||
|
|
||||||
|
private static final String REQUEST_TASKID = "_taskid";
|
||||||
|
private static final String REQUEST_PREVIEW_REF = "_prevhref";
|
||||||
|
private static final String REQUEST_WORKFLOWID = "_workflowid";
|
||||||
|
|
||||||
|
private static Log logger = LogFactory.getLog(UIPendingSubmissions.class);
|
||||||
|
|
||||||
|
private static final String MSG_LABEL = "name";
|
||||||
|
private static final String MSG_DESCRIPTION = "description";
|
||||||
|
private static final String MSG_DATE = "date";
|
||||||
|
private static final String MSG_USERNAME = "username";
|
||||||
|
private static final String MSG_LAUNCH_DATE = "launch_date";
|
||||||
|
private static final String MSG_ACTIONS = "actions";
|
||||||
|
private static final String MSG_NO_PENDING = "no_pending_submissions";
|
||||||
|
|
||||||
|
/** sandbox to show pending submissions for */
|
||||||
|
private String value;
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------------
|
||||||
|
// Component implementation
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see javax.faces.component.UIComponent#getFamily()
|
||||||
|
*/
|
||||||
|
public String getFamily()
|
||||||
|
{
|
||||||
|
return "org.alfresco.faces.PendingSubmissions";
|
||||||
|
}
|
||||||
|
|
||||||
|
public void restoreState(FacesContext context, Object state)
|
||||||
|
{
|
||||||
|
Object values[] = (Object[])state;
|
||||||
|
// standard component attributes are restored by the super class
|
||||||
|
super.restoreState(context, values[0]);
|
||||||
|
this.value = (String)values[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object saveState(FacesContext context)
|
||||||
|
{
|
||||||
|
Object values[] = new Object[2];
|
||||||
|
// standard component attributes are saved by the super class
|
||||||
|
values[0] = super.saveState(context);
|
||||||
|
values[1] = this.value;
|
||||||
|
return values;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see javax.faces.component.UIComponentBase#getRendersChildren()
|
||||||
|
*/
|
||||||
|
public boolean getRendersChildren()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see javax.faces.component.UIComponentBase#encodeChildren(javax.faces.context.FacesContext)
|
||||||
|
*/
|
||||||
|
public void encodeChildren(FacesContext context) throws IOException
|
||||||
|
{
|
||||||
|
// the child components are rendered explicitly during the encodeBegin()
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see javax.faces.component.UIComponentBase#encodeBegin(javax.faces.context.FacesContext)
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public void encodeBegin(FacesContext context) throws IOException
|
||||||
|
{
|
||||||
|
if (isRendered() == false)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ResponseWriter out = context.getResponseWriter();
|
||||||
|
|
||||||
|
ResourceBundle bundle = Application.getBundle(context);
|
||||||
|
UserTransaction tx = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
tx = Repository.getUserTransaction(FacesContext.getCurrentInstance(), true);
|
||||||
|
tx.begin();
|
||||||
|
|
||||||
|
String sandbox = getValue();
|
||||||
|
if (sandbox == null)
|
||||||
|
{
|
||||||
|
throw new IllegalArgumentException("Sandbox must be specified.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// get the noderef representing the web project
|
||||||
|
// TODO: pass this in via a property from the JSP page
|
||||||
|
AVMBrowseBean avmBrowseBean = (AVMBrowseBean)FacesHelper.getManagedBean(
|
||||||
|
context, "AVMBrowseBean");
|
||||||
|
NodeRef webProject = avmBrowseBean.getWebsite().getNodeRef();
|
||||||
|
|
||||||
|
// get the list of pending tasks for this project
|
||||||
|
WorkflowTaskQuery query = new WorkflowTaskQuery();
|
||||||
|
query.setTaskName(QName.createQName(NamespaceService.WCMWF_MODEL_1_0_URI,
|
||||||
|
"submitpendingTask"));
|
||||||
|
query.setTaskState(WorkflowTaskState.IN_PROGRESS);
|
||||||
|
Map<QName, Object> processProps = new HashMap<QName, Object>();
|
||||||
|
processProps.put(AVMWorkflowUtil.ASSOC_WEBPROJECT, webProject);
|
||||||
|
query.setProcessCustomProps(processProps);
|
||||||
|
query.setOrderBy(new WorkflowTaskQuery.OrderBy[] {
|
||||||
|
WorkflowTaskQuery.OrderBy.TaskDue_Desc,
|
||||||
|
WorkflowTaskQuery.OrderBy.TaskActor_Asc });
|
||||||
|
List<WorkflowTask> pendingTasks = Repository.getServiceRegistry(context).
|
||||||
|
getWorkflowService().queryTasks(query);
|
||||||
|
|
||||||
|
if (pendingTasks.size() == 0)
|
||||||
|
{
|
||||||
|
out.write(bundle.getString(MSG_NO_PENDING));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// TODO: apply tag style - removed hardcoded
|
||||||
|
out.write("<table class='pendingSubmissionsList' cellspacing=2 cellpadding=1 border=0 width=100%>");
|
||||||
|
// header row
|
||||||
|
out.write("<tr align=left><th>");
|
||||||
|
out.write(bundle.getString(MSG_LABEL));
|
||||||
|
out.write("</th><th>");
|
||||||
|
out.write(bundle.getString(MSG_DESCRIPTION));
|
||||||
|
out.write("</th><th>");
|
||||||
|
out.write(bundle.getString(MSG_DATE));
|
||||||
|
out.write("</th><th>");
|
||||||
|
out.write(bundle.getString(MSG_USERNAME));
|
||||||
|
out.write("</th><th>");
|
||||||
|
out.write(bundle.getString(MSG_LAUNCH_DATE));
|
||||||
|
out.write("</th><th>");
|
||||||
|
out.write(bundle.getString(MSG_ACTIONS));
|
||||||
|
out.write("</th></tr>");
|
||||||
|
|
||||||
|
// output the pending submissions and their actions
|
||||||
|
for (WorkflowTask task : pendingTasks)
|
||||||
|
{
|
||||||
|
String desc = (String)task.properties.get(WorkflowModel.PROP_DESCRIPTION);
|
||||||
|
String label = (String)task.properties.get(AVMWorkflowUtil.PROP_LABEL);
|
||||||
|
String started = Utils.getDateTimeFormat(context).format(task.path.instance.startDate);
|
||||||
|
String username = (String)Repository.getServiceRegistry(context).getNodeService().
|
||||||
|
getProperty(task.path.instance.initiator, ContentModel.PROP_USERNAME);
|
||||||
|
Date launchDate = (Date)task.properties.get(AVMWorkflowUtil.PROP_LAUNCH_DATE);
|
||||||
|
String launch = Utils.getDateTimeFormat(context).format(launchDate);
|
||||||
|
|
||||||
|
out.write("<tr><td>");
|
||||||
|
out.write(desc == null ? " " : desc);
|
||||||
|
out.write("</td><td>");
|
||||||
|
out.write(label);
|
||||||
|
out.write("</td><td>");
|
||||||
|
out.write(started);
|
||||||
|
out.write("</td><td>");
|
||||||
|
out.write(username);
|
||||||
|
out.write("</td><td>");
|
||||||
|
out.write(launch);
|
||||||
|
out.write("</td><td><nobr>");
|
||||||
|
|
||||||
|
// details action
|
||||||
|
// TODO
|
||||||
|
|
||||||
|
// preview action
|
||||||
|
NodeRef pkg = task.path.instance.workflowPackage;
|
||||||
|
Pair<Integer, String> pkgPath = AVMNodeConverter.ToAVMVersionPath(pkg);
|
||||||
|
String workflowStore = AVMUtil.getStoreName(pkgPath.getSecond());
|
||||||
|
String workflowPreviewUrl = AVMUtil.buildStoreUrl(workflowStore);
|
||||||
|
Map requestMap = context.getExternalContext().getRequestMap();
|
||||||
|
requestMap.put(REQUEST_PREVIEW_REF, workflowPreviewUrl);
|
||||||
|
|
||||||
|
UIActionLink preview = findAction(ACT_PREVIEW, sandbox);
|
||||||
|
if (preview == null)
|
||||||
|
{
|
||||||
|
preview = createAction(context, sandbox, ACT_PREVIEW,
|
||||||
|
"/images/icons/preview_website.gif", null, null,
|
||||||
|
"#{" + REQUEST_PREVIEW_REF + "}", null);
|
||||||
|
}
|
||||||
|
|
||||||
|
Utils.encodeRecursive(context, preview);
|
||||||
|
requestMap.remove(REQUEST_PREVIEW_REF);
|
||||||
|
out.write(" ");
|
||||||
|
|
||||||
|
// visual diff action (only if there is a live deployed snapshot)
|
||||||
|
// TODO
|
||||||
|
|
||||||
|
// promote action
|
||||||
|
UIActionLink promote = findAction(ACT_PROMOTE, sandbox);
|
||||||
|
if (promote == null)
|
||||||
|
{
|
||||||
|
Map<String, String> params = new HashMap<String, String>(1);
|
||||||
|
params.put("taskId", "#{" + REQUEST_TASKID + "}");
|
||||||
|
promote = createAction(context, sandbox, ACT_PROMOTE,
|
||||||
|
"/images/icons/promote_submission.gif",
|
||||||
|
"#{AVMBrowseBean.promotePendingSubmission}",
|
||||||
|
null, null, params);
|
||||||
|
}
|
||||||
|
|
||||||
|
requestMap.put(REQUEST_TASKID, task.id);
|
||||||
|
Utils.encodeRecursive(context, promote);
|
||||||
|
requestMap.remove(REQUEST_TASKID);
|
||||||
|
out.write(" ");
|
||||||
|
|
||||||
|
// abort action
|
||||||
|
UIActionLink abort = findAction(ACT_ABORT, sandbox);
|
||||||
|
if (abort == null)
|
||||||
|
{
|
||||||
|
Map<String, String> params = new HashMap<String, String>(1);
|
||||||
|
params.put("workflowInstanceId", "#{" + REQUEST_WORKFLOWID + "}");
|
||||||
|
abort = createAction(context, sandbox, ACT_ABORT,
|
||||||
|
"/images/icons/abort_submission.gif",
|
||||||
|
"#{AVMBrowseBean.cancelPendingSubmission}",
|
||||||
|
null, null, params);
|
||||||
|
}
|
||||||
|
|
||||||
|
requestMap.put(REQUEST_WORKFLOWID, task.path.instance.id);
|
||||||
|
Utils.encodeRecursive(context, abort);
|
||||||
|
requestMap.remove(REQUEST_WORKFLOWID);
|
||||||
|
out.write(" ");
|
||||||
|
|
||||||
|
out.write("</nobr></td></tr>");
|
||||||
|
}
|
||||||
|
|
||||||
|
out.write("</table>");
|
||||||
|
}
|
||||||
|
|
||||||
|
tx.commit();
|
||||||
|
}
|
||||||
|
catch (Throwable err)
|
||||||
|
{
|
||||||
|
try { if (tx != null) {tx.rollback();} } catch (Exception tex) {}
|
||||||
|
throw new RuntimeException(err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Locate a child UIActionLink component by name.
|
||||||
|
*
|
||||||
|
* @param name Of the action component to find
|
||||||
|
* @param sandbox Sandbox the action component is tied to
|
||||||
|
*
|
||||||
|
* @return UIActionLink component if found, else null if not created yet
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
private UIActionLink findAction(String name, String sandbox)
|
||||||
|
{
|
||||||
|
UIActionLink action = null;
|
||||||
|
String actionId = name + '_' + sandbox;
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("Finding action Id: " + actionId);
|
||||||
|
for (UIComponent component : (List<UIComponent>)getChildren())
|
||||||
|
{
|
||||||
|
if (actionId.equals(component.getId()))
|
||||||
|
{
|
||||||
|
action = (UIActionLink)component;
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("...found action Id: " + actionId);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return action;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a UIActionLink child component.
|
||||||
|
*
|
||||||
|
* @param fc FacesContext
|
||||||
|
* @param sandbox Root sandbox name
|
||||||
|
* @param name Action name - will be used for I18N message lookup
|
||||||
|
* @param icon Icon to display for the actio n
|
||||||
|
* @param actionListener Actionlistener for the action
|
||||||
|
* @param outcome Navigation outcome for the action
|
||||||
|
* @param url HREF URL for the action
|
||||||
|
* @param params Parameters name/values for the action listener args
|
||||||
|
*
|
||||||
|
* @return UIActionLink child component
|
||||||
|
*/
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
private UIActionLink createAction(FacesContext fc, String sandbox, String name, String icon,
|
||||||
|
String actionListener, String outcome, String url, Map<String, String> params)
|
||||||
|
{
|
||||||
|
javax.faces.application.Application facesApp = fc.getApplication();
|
||||||
|
UIActionLink control = (UIActionLink)facesApp.createComponent(UIActions.COMPONENT_ACTIONLINK);
|
||||||
|
|
||||||
|
String id = name + '_' + sandbox;
|
||||||
|
|
||||||
|
if (logger.isDebugEnabled())
|
||||||
|
logger.debug("...creating action Id: " + id);
|
||||||
|
|
||||||
|
control.setRendererType(UIActions.RENDERER_ACTIONLINK);
|
||||||
|
control.setId(id);
|
||||||
|
control.setValue(Application.getMessage(fc, name));
|
||||||
|
control.setShowLink(icon != null ? false : true);
|
||||||
|
control.setImage(icon);
|
||||||
|
|
||||||
|
if (actionListener != null)
|
||||||
|
{
|
||||||
|
control.setActionListener(facesApp.createMethodBinding(
|
||||||
|
actionListener, UIActions.ACTION_CLASS_ARGS));
|
||||||
|
|
||||||
|
// add sandbox as the default action listener parameter
|
||||||
|
if (params == null)
|
||||||
|
{
|
||||||
|
UIParameter param = (UIParameter)facesApp.createComponent(ComponentConstants.JAVAX_FACES_PARAMETER);
|
||||||
|
param.setId(id + "_1");
|
||||||
|
param.setName("sandbox");
|
||||||
|
param.setValue(sandbox);
|
||||||
|
control.getChildren().add(param);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// if a specific set of parameters are supplied, then add them instead
|
||||||
|
int idIndex = 1;
|
||||||
|
for (String key : params.keySet())
|
||||||
|
{
|
||||||
|
UIParameter param = (UIParameter)facesApp.createComponent(ComponentConstants.JAVAX_FACES_PARAMETER);
|
||||||
|
param.setId(id + '_' + Integer.toString(idIndex++));
|
||||||
|
param.setName(key);
|
||||||
|
String value = params.get(key);
|
||||||
|
if (value.startsWith("#{") == true)
|
||||||
|
{
|
||||||
|
ValueBinding vb = facesApp.createValueBinding(value);
|
||||||
|
param.setValueBinding("value", vb);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
param.setValue(params.get(key));
|
||||||
|
}
|
||||||
|
control.getChildren().add(param);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (outcome != null)
|
||||||
|
{
|
||||||
|
control.setAction(new ConstantMethodBinding(outcome));
|
||||||
|
}
|
||||||
|
if (url != null)
|
||||||
|
{
|
||||||
|
if (url.startsWith("#{"))
|
||||||
|
{
|
||||||
|
ValueBinding vb = facesApp.createValueBinding(url);
|
||||||
|
control.setValueBinding("href", vb);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
control.setHref(url);
|
||||||
|
}
|
||||||
|
|
||||||
|
control.setTarget("new");
|
||||||
|
}
|
||||||
|
|
||||||
|
this.getChildren().add(control);
|
||||||
|
|
||||||
|
return control;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------------
|
||||||
|
// Strongly typed component property accessors
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the Sandbox to show the snapshots for
|
||||||
|
*
|
||||||
|
* @return The Sandbox name
|
||||||
|
*/
|
||||||
|
public String getValue()
|
||||||
|
{
|
||||||
|
ValueBinding vb = getValueBinding("value");
|
||||||
|
if (vb != null)
|
||||||
|
{
|
||||||
|
this.value = (String)vb.getValue(getFacesContext());
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the Sandbox to show the snapshots for
|
||||||
|
*
|
||||||
|
* @param value The Sandbox name
|
||||||
|
*/
|
||||||
|
public void setValue(String value)
|
||||||
|
{
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,86 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2005-2007 Alfresco Software Limited.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2
|
||||||
|
* of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
|
|
||||||
|
* As a special exception to the terms and conditions of version 2.0 of
|
||||||
|
* the GPL, you may redistribute this Program in connection with Free/Libre
|
||||||
|
* and Open Source Software ("FLOSS") applications as described in Alfresco's
|
||||||
|
* FLOSS exception. You should have recieved a copy of the text describing
|
||||||
|
* the FLOSS exception, and it is also available here:
|
||||||
|
* http://www.alfresco.com/legal/licensing"
|
||||||
|
*/
|
||||||
|
package org.alfresco.web.ui.wcm.tag;
|
||||||
|
|
||||||
|
import javax.faces.component.UIComponent;
|
||||||
|
|
||||||
|
import org.alfresco.web.ui.common.tag.BaseComponentTag;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tag to allow the UIPendingSubmissions component to be placed
|
||||||
|
* on a JSP page.
|
||||||
|
*
|
||||||
|
* @author Gavin Cornwell
|
||||||
|
*/
|
||||||
|
public class PendingSubmissionsTag extends BaseComponentTag
|
||||||
|
{
|
||||||
|
/** the value (sandbox to display pending submissions for) */
|
||||||
|
private String value;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see javax.faces.webapp.UIComponentTag#getComponentType()
|
||||||
|
*/
|
||||||
|
public String getComponentType()
|
||||||
|
{
|
||||||
|
return "org.alfresco.faces.PendingSubmissions";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see javax.faces.webapp.UIComponentTag#getRendererType()
|
||||||
|
*/
|
||||||
|
public String getRendererType()
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see javax.faces.webapp.UIComponentTag#setProperties(javax.faces.component.UIComponent)
|
||||||
|
*/
|
||||||
|
protected void setProperties(UIComponent component)
|
||||||
|
{
|
||||||
|
super.setProperties(component);
|
||||||
|
|
||||||
|
setStringProperty(component, "value", this.value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see org.alfresco.web.ui.common.tag.HtmlComponentTag#release()
|
||||||
|
*/
|
||||||
|
public void release()
|
||||||
|
{
|
||||||
|
super.release();
|
||||||
|
this.value = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the value (sandbox to display pending submissions for)
|
||||||
|
*
|
||||||
|
* @param value the value
|
||||||
|
*/
|
||||||
|
public void setValue(String value)
|
||||||
|
{
|
||||||
|
this.value = value;
|
||||||
|
}
|
||||||
|
}
|
@@ -34,6 +34,11 @@
|
|||||||
<component-class>org.alfresco.web.ui.wcm.component.UIDeployWebsite</component-class>
|
<component-class>org.alfresco.web.ui.wcm.component.UIDeployWebsite</component-class>
|
||||||
</component>
|
</component>
|
||||||
|
|
||||||
|
<component>
|
||||||
|
<component-type>org.alfresco.faces.PendingSubmissions</component-type>
|
||||||
|
<component-class>org.alfresco.web.ui.wcm.component.UIPendingSubmissions</component-class>
|
||||||
|
</component>
|
||||||
|
|
||||||
<!-- ==================== CONVERTERS ==================== -->
|
<!-- ==================== CONVERTERS ==================== -->
|
||||||
|
|
||||||
|
|
||||||
|
@@ -90,6 +90,41 @@
|
|||||||
<rtexprvalue>true</rtexprvalue>
|
<rtexprvalue>true</rtexprvalue>
|
||||||
</attribute>
|
</attribute>
|
||||||
</tag>
|
</tag>
|
||||||
|
|
||||||
|
<tag>
|
||||||
|
<name>pendingSubmissions</name>
|
||||||
|
<tag-class>org.alfresco.web.ui.wcm.tag.PendingSubmissionsTag</tag-class>
|
||||||
|
<body-content>JSP</body-content>
|
||||||
|
<display-name>Pending Submissions List</display-name>
|
||||||
|
<description>Displays the list of pending submissions for a sandbox</description>
|
||||||
|
|
||||||
|
<attribute>
|
||||||
|
<name>id</name>
|
||||||
|
<required>false</required>
|
||||||
|
<rtexprvalue>true</rtexprvalue>
|
||||||
|
<description>The component identifier for this component</description>
|
||||||
|
</attribute>
|
||||||
|
|
||||||
|
<attribute>
|
||||||
|
<name>value</name>
|
||||||
|
<required>true</required>
|
||||||
|
<rtexprvalue>true</rtexprvalue>
|
||||||
|
<description>The sandbox to show the list of pending submissions for</description>
|
||||||
|
</attribute>
|
||||||
|
|
||||||
|
<attribute>
|
||||||
|
<name>binding</name>
|
||||||
|
<required>false</required>
|
||||||
|
<rtexprvalue>true</rtexprvalue>
|
||||||
|
<description>The value binding expression linking this component to a property in a backing bean</description>
|
||||||
|
</attribute>
|
||||||
|
|
||||||
|
<attribute>
|
||||||
|
<name>rendered</name>
|
||||||
|
<required>false</required>
|
||||||
|
<rtexprvalue>true</rtexprvalue>
|
||||||
|
</attribute>
|
||||||
|
</tag>
|
||||||
|
|
||||||
<tag>
|
<tag>
|
||||||
<name>formProcessor</name>
|
<name>formProcessor</name>
|
||||||
|
@@ -568,6 +568,14 @@ a.topToolbarLinkHighlight, a.topToolbarLinkHighlight:link, a.topToolbarLinkHighl
|
|||||||
border-color: #DDDDDD;
|
border-color: #DDDDDD;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.pendingSubmissionsList
|
||||||
|
{
|
||||||
|
background-color: #f5f5f5;
|
||||||
|
border-width: 1px;
|
||||||
|
border-style: solid;
|
||||||
|
border-color: #DDDDDD;
|
||||||
|
}
|
||||||
|
|
||||||
#pluginBox
|
#pluginBox
|
||||||
{
|
{
|
||||||
border: 1px solid #babfc5;
|
border: 1px solid #babfc5;
|
||||||
|
BIN
source/web/images/icons/abort_submission.gif
Normal file
BIN
source/web/images/icons/abort_submission.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 362 B |
BIN
source/web/images/icons/promote_submission.gif
Normal file
BIN
source/web/images/icons/promote_submission.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 582 B |
@@ -194,6 +194,18 @@
|
|||||||
</a:panel>
|
</a:panel>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td></td>
|
||||||
|
<td colspan=2>
|
||||||
|
<a:panel id="pending-submission-panel" rendered="#{AVMBrowseBean.isManagerRole}" label="#{msg.pending_submissions}"
|
||||||
|
progressive="true" expanded="false" styleClass="mainSubTitle">
|
||||||
|
<div style='padding-left:16px;padding-top:8px;padding-bottom:4px'>
|
||||||
|
<%-- Pending submission list --%>
|
||||||
|
<w:pendingSubmissions id="pending-submissions" value="#{AVMBrowseBean.stagingStore}" />
|
||||||
|
</div>
|
||||||
|
</a:panel>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
<% PanelGenerator.generatePanelEnd(out, request.getContextPath(), "lbgrey"); %>
|
<% PanelGenerator.generatePanelEnd(out, request.getContextPath(), "lbgrey"); %>
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user