From ae4d6a0fd21b258c910ce5fbf44a4659c427ca37 Mon Sep 17 00:00:00 2001 From: Kevin Roast Date: Tue, 5 Dec 2006 17:19:23 +0000 Subject: [PATCH] . 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 --- config/alfresco/messages/webclient.properties | 8 + config/alfresco/web-client-config-dialogs.xml | 4 + .../alfresco/web/bean/wcm/AVMBrowseBean.java | 24 + .../web/bean/wcm/CreateWebsiteWizard.java | 2 +- .../web/bean/wcm/EditWebsiteWizard.java | 4 +- .../alfresco/web/bean/wcm/SubmitDialog.java | 519 ++++++++++++++++++ .../web/ui/wcm/component/UIUserSandboxes.java | 6 +- source/web/WEB-INF/faces-config-beans.xml | 29 + source/web/images/icons/error.gif | Bin 0 -> 1043 bytes source/web/images/icons/error_large.gif | Bin 0 -> 1637 bytes source/web/images/icons/info_icon_large.gif | Bin 0 -> 1475 bytes source/web/images/icons/warning.gif | Bin 0 -> 1019 bytes source/web/images/icons/warning_large.gif | Bin 0 -> 1511 bytes source/web/jsp/wcm/browse-sandbox.jsp | 1 - source/web/jsp/wcm/submit-dialog.jsp | 163 ++++++ 15 files changed, 753 insertions(+), 7 deletions(-) create mode 100644 source/java/org/alfresco/web/bean/wcm/SubmitDialog.java create mode 100644 source/web/images/icons/error.gif create mode 100644 source/web/images/icons/error_large.gif create mode 100644 source/web/images/icons/info_icon_large.gif create mode 100644 source/web/images/icons/warning.gif create mode 100644 source/web/images/icons/warning_large.gif create mode 100644 source/web/jsp/wcm/submit-dialog.jsp diff --git a/config/alfresco/messages/webclient.properties b/config/alfresco/messages/webclient.properties index e1a6e570b9..200aa08023 100644 --- a/config/alfresco/messages/webclient.properties +++ b/config/alfresco/messages/webclient.properties @@ -953,6 +953,14 @@ websitedetails_description=View the details of the web project. delete_sandbox=Delete Sandbox 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? +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_title=New User Wizard diff --git a/config/alfresco/web-client-config-dialogs.xml b/config/alfresco/web-client-config-dialogs.xml index ca7717e5b1..69d2802cc0 100644 --- a/config/alfresco/web-client-config-dialogs.xml +++ b/config/alfresco/web-client-config-dialogs.xml @@ -177,6 +177,10 @@ + + diff --git a/source/java/org/alfresco/web/bean/wcm/AVMBrowseBean.java b/source/java/org/alfresco/web/bean/wcm/AVMBrowseBean.java index ca1f3d9a72..d955a5cc2f 100644 --- a/source/java/org/alfresco/web/bean/wcm/AVMBrowseBean.java +++ b/source/java/org/alfresco/web/bean/wcm/AVMBrowseBean.java @@ -116,6 +116,7 @@ public class AVMBrowseBean implements IContextListener private String sandboxTitle = null; private String currentPath = null; private AVMNode currentPathNode = null; + private boolean submitAll = false; /* component references */ 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 getSelectedSandboxItems() + { + return this.userSandboxes.getSelectedNodes(this.username); + } + + public boolean getSubmitAll() + { + return this.submitAll; + } + // ------------------------------------------------------------------------------ // Action event handlers @@ -740,6 +756,14 @@ public class AVMBrowseBean implements IContextListener // update UI state ready for return to the previous screen this.location = null; setCurrentPath(null); + + this.submitAll = false; + } + + public void setupSubmitAllAction(ActionEvent event) + { + setupSandboxAction(event); + this.submitAll = true; } /** diff --git a/source/java/org/alfresco/web/bean/wcm/CreateWebsiteWizard.java b/source/java/org/alfresco/web/bean/wcm/CreateWebsiteWizard.java index 0accf66438..a98fdb36cd 100644 --- a/source/java/org/alfresco/web/bean/wcm/CreateWebsiteWizard.java +++ b/source/java/org/alfresco/web/bean/wcm/CreateWebsiteWizard.java @@ -313,7 +313,7 @@ public class CreateWebsiteWizard extends BaseWizardBean * @param params Serializable workflow params * @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 { diff --git a/source/java/org/alfresco/web/bean/wcm/EditWebsiteWizard.java b/source/java/org/alfresco/web/bean/wcm/EditWebsiteWizard.java index 808ac81cb5..32c29b5fca 100644 --- a/source/java/org/alfresco/web/bean/wcm/EditWebsiteWizard.java +++ b/source/java/org/alfresco/web/bean/wcm/EditWebsiteWizard.java @@ -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 * * @return Serializable workflow params */ - private Serializable deserializeWorkflowParams(NodeRef workflowRef) + public static Serializable deserializeWorkflowParams(NodeRef workflowRef) { try { diff --git a/source/java/org/alfresco/web/bean/wcm/SubmitDialog.java b/source/java/org/alfresco/web/bean/wcm/SubmitDialog.java new file mode 100644 index 0000000000..308fc55a43 --- /dev/null +++ b/source/java/org/alfresco/web/bean/wcm/SubmitDialog.java @@ -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 submitItems; + private List warningItems; + private HashSet workflows; + private Map formWorkflowMap; + private List 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 parameters) + { + super.init(parameters); + + this.comment = null; + this.label = null; + this.submitItems = null; + this.warningItems = null; + this.workflowItems = null; + this.workflows = new HashSet(4); + + // walk all the web forms attached the website, and lookup the workflow defaults for each + NodeRef websiteRef = this.avmBrowseBean.getWebsite().getNodeRef(); + List webFormRefs = this.nodeService.getChildAssocs( + websiteRef, WCMAppModel.ASSOC_WEBFORM, RegexQNamePattern.MATCH_ALL); + this.formWorkflowMap = new HashMap(webFormRefs.size(), 1.0f); + for (ChildAssociationRef ref : webFormRefs) + { + NodeRef webFormRef = ref.getChildRef(); + String form = (String)this.nodeService.getProperty(webFormRef, WCMAppModel.PROP_FORMNAME); + List 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 params = (Map)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 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 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 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 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 params = (Map)EditWebsiteWizard.deserializeWorkflowParams( + wfDefaultsRef); + this.workflows.add(new FormWorkflowWrapper(wfName, params)); + } + + // build a UI item for each available workflow + List items = new ArrayList(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 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 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 selected; + if (this.avmBrowseBean.getSubmitAll()) + { + String userStore = this.avmBrowseBean.getSandbox() + ":/"; + String stagingStore = this.avmBrowseBean.getStagingStore() + ":/"; + List diffs = avmSyncService.compare(-1, userStore, -1, stagingStore); + selected = new ArrayList(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(selected.size()); + this.warningItems = new ArrayList(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.emptyList(); + this.warningItems = Collections.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 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 diffs = new ArrayList(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 Params; + + FormWorkflowWrapper(String name, Map 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); + } + } +} diff --git a/source/java/org/alfresco/web/ui/wcm/component/UIUserSandboxes.java b/source/java/org/alfresco/web/ui/wcm/component/UIUserSandboxes.java index 16fa398920..04447848e3 100644 --- a/source/java/org/alfresco/web/ui/wcm/component/UIUserSandboxes.java +++ b/source/java/org/alfresco/web/ui/wcm/component/UIUserSandboxes.java @@ -337,7 +337,7 @@ public class UIUserSandboxes extends SelfRenderingComponent Utils.encodeRecursive(context, aquireAction( context, mainStore, username, ACT_SANDBOX_SUBMITALL, "/images/icons/submit_all.gif", - "#{AVMBrowseBean.submitAll}", null)); + "#{AVMBrowseBean.setupSubmitAllAction}", "dialog:submitSandboxItems")); out.write(" "); Utils.encodeRecursive(context, aquireAction( @@ -663,7 +663,7 @@ public class UIUserSandboxes extends SelfRenderingComponent out.write(": "); Utils.encodeRecursive(fc, aquireAction( fc, userStorePrefix, username, ACT_SANDBOX_SUBMITSELECTED, "/images/icons/submit_all.gif", - "#{AVMBrowseBean.submitSelected}", null)); + "#{AVMBrowseBean.setupSandboxAction}", "dialog:submitSandboxItems")); out.write(" "); Utils.encodeRecursive(fc, aquireAction( fc, userStorePrefix, username, ACT_SANDBOX_REVERTSELECTED, "/images/icons/revert_all.gif", @@ -1048,7 +1048,7 @@ public class UIUserSandboxes extends SelfRenderingComponent { List nodes = null; - if (username != null) + if (username != null && this.checkedItems != null) { List paths = this.userNodes.get(username); if (paths != null) diff --git a/source/web/WEB-INF/faces-config-beans.xml b/source/web/WEB-INF/faces-config-beans.xml index a42d32fa47..1495fd5f69 100644 --- a/source/web/WEB-INF/faces-config-beans.xml +++ b/source/web/WEB-INF/faces-config-beans.xml @@ -2726,6 +2726,35 @@ + + + The bean that backs up the Submit dialog + + SubmitDialog + org.alfresco.web.bean.wcm.SubmitDialog + session + + avmService + #{AVMService} + + + avmSyncService + #{AVMSyncService} + + + avmBrowseBean + #{AVMBrowseBean} + + + workflowService + #{WorkflowService} + + + nodeService + #{NodeService} + + + diff --git a/source/web/images/icons/error.gif b/source/web/images/icons/error.gif new file mode 100644 index 0000000000000000000000000000000000000000..eb841a8a889da52e8bc989d4b3ec258ad128d956 GIT binary patch literal 1043 zcmeHGTQ8dd0R38JtZ~^GI+wL$(Jh^fB5Z5a*i19jCGL{4x-G@LATgp!)m&4A712nD z#Ud^b?qS%2xJ0()i!TwyF0y1xMdtE}EdGGaw#5<X)+fyqfs zO<{T(Gc%Z-#liv>7qPT-aITk^v9f}-HLS1GtE(VMY;0g_3%k2GJjBrvj*oG20-DC@ zDbCK$C-^(XfBM%A@Mso;ASwvKMexNZ2=jfy)WXhgud0%LjXSLo4((jJUif=cIhwhw zwzf1a*w%VjyWY=Rsr>OVcwx>u`upd%!o7N(mux8HjnXSZ@1mE2gvcAK2|eG5lAfS>}x_tG?I??c=&`f^quN^5Bb^(o~{*Saa}A zk#t8~_EqCm&bZ?CbfojwCl8|gR!OpRvC>4-H2+HPzw_MDjBUfd@pC^dVaduR^oW&E zz+@~~yS(Tht#yhS3T#Do>E%1up6YjwpCFpWUnHO;&NkE|^$&05O~4X?7*QnO35 z`%+i4vO^S2l)|(~iZsg@+kTD0ZnN%;Gtd6oKlhzyp834r=kxyeyxdTZpMMe^L&yA$ z`E~$6g~6!tc=dt>Y63w`B&tnK)#m1E3k$WSrN-J?jh2m#nncpr+G@#U4VkQ^P;_>7 zIx1DOWQoq+UTbeZL8EC(=Q51GVed&xeE{ zEEe#1Gi)}5hR*YNuyLc2!-23cgu~GW1wnYY5e+wOLbzPu^I`L55C}jhgop?vJRBk; z^K-nKN+qESx_Njg2$4wFs&;H5pHxf(sX* zxfw2AgiDv;@@2Sk#dz)m1zKC7tqt1Sp`!!t+?hwA zvlH&#g?snl{(b1`f(H-a;X`=z2p&I%?rxCFp{ECWdqJUq{(gA!1O^5`sf58nBPt9H zfl38WpTe_epjN~1Fg$+_BO~)DkB-8N7x3~WXf*KZ6^xC2MMJF?UcUyN4&J_ni3xc3 z4kjnz!w2~I5%hYPo`z4K;PYp6$^TpS|2M`zcq|4phgtb;@a<1vOaWssqwz=ytNd5t z-6*rc{M&^jr}vSr+#nOTBXN^uU(>BB@wllg)zsFe%ILqR<=eTpwsxc{rC%5fx~;O{ z4?j(j?ylo>pZ2PS~}iHK8-{>gyVL z!Dyl2X4QtyqYhpB^zF$F8q0dm_>R~!9Z{}f$MFs=?t%tP@Zjl?2D|f}0qMi1 zoSp0{YCZNpG!ZrZ#d}W1@;}y@axCk;QcuYFGS~JTn-xHTfsC%j`uD5%K zd2~)S4Xroa8|CLt1@*`ndDB9oy*>Sf)cwkh9`luLD(@kgLCobdE2%hB$L#I`f`wTJ zcF^tO>B6$**L{@yqYned1`Zz*)Nz)qb7ON|&g7E^-I{B@OL3o`a(m|FN{A5C((4%g zB=f7RQs=s~o>14bQ=gRn{)NBu82M5DMEjHqL$Qtd0RxX&Er=*}u4Tts*I;x0Bsx;s zBqfcps&0Xm%yVSGsftZ5Wxf}@ezS&kNBL=ylMmo=^df4Z?7MPL96xt_-@*ysw7dTl z+eL>b6>K0(KY!wwk0;C48YCZxj&BsvmDFCl&v>kj8Aj@mGc6}N8pPGaWmzi8rrbD@ zu$aQXG3ywZ88=IyNmN2^_L$0+NZZ{k;rMEkSjCiZCIfqLp;^Ak(zIqdCsWgMoUk;t zj@3_1n$^6a2;BN#x4%=2?_Lqy$R_h>EGg+ngpR{*ddn1qkef+!wj8S0oK3(K9f$XI k=aWKkq#!wQxdPK`<`C`~#7j-*53|fXDAEmOL_B8wzw699Bme*a literal 0 HcmV?d00001 diff --git a/source/web/images/icons/info_icon_large.gif b/source/web/images/icons/info_icon_large.gif new file mode 100644 index 0000000000000000000000000000000000000000..e59c3ca3b21fcdf41415f9d41954c5bada46e4e7 GIT binary patch literal 1475 zcmV;!1w8skNk%w1VITk?0QUd@00030|NkBfeN|AQQBI&^U#WPJ zdYs6ApUHKa#TS#18JNDYMcdXoCa!~2Wy=OY@G>goeFNB3vZwf zZ=VowpCEarFoUc>jI&Udxp1k*b*;&NvdoXX(x1iI&*JR!`TY9){SS1c7JI22eyb;i zur7+UF^sh{j<+(3vq6-(N|?M$n!Zn*zhI!heY4HF*yg|4<-^?Q&*ksh?DXL8_TTLC z>Gb*S_WJDg`7DmOEswY}khnLLyG5hOOs2|8pu|j}#ZRcqO`^qFtIT7v(PFUAWU|q1 zx72L5(`vBJZnxBKvd?t7)^fDadA!$rzSw@h*?hd#eY(_w!P5#N3I) z+Kk5CkH_7R$lj62-jm7SmdoIm%ix;L;hfImo6X^!&f=iZ9^bJy4~x!-0HjC>%HFVzu)Y^;O)ZT?a1Ws$K&qK z=kd+v@X+V+*zEMz>+{|2_1x|B-|zP0@%QHP_v`if@b~&irO8vO%vGz*R;$cet<77m z&Rnj}U$D<%vCw6+(Pp#JXSC93wbE<0({H%cak6HDi^klI$K8&{-IL1SlF8nb z%HNmF;F!$dna$yw&f%WV;-S&wqS51|(&VMnAT+Ry4~u%-|N8O?84#g#NzG7Gb&T_xj@T_VoJv^ZEPv{Qd0q`SAGq`u+X? z|Nj6000000A^8LW008{}EC2ui03ZM$000R80Q(6Xh~tQh5eO41ROsRej)4#%-WWk+ z2|j%F=-Jz}&Qdu@i?9uP#)im<8xbKYX^})9zI^%cNr9({T_sB5x*@U#jnA<&DU_rX zCoEQ)wfIv8IhN}5thD_M5w?jv;bN3Ejym;{5xr@N}fTKi(sQp=1Cs-TA zDMzSd*G>~BPMX@WQ}jc{WDUkgCf$1=#w z@y33!P&h&%*l3eYB8hCH4K^9@)xd~%6a!2fY0&bDih>M6$Tfu&at$GaV89mx%G_a0 z9J|~y3oNdv=m#{>NE1jP(nJGI2Yfw%OfgWZfkrH0u%aR}&Gg~SAAdO02Ok{p<-i=i z?4m|3W{}Z}7b?n;3?6wXqf8!nB;x^J5WLaGEohkWN-JP=L7@yr6hlWHoYp}{F~kJ( z#xA&|F-t6df`Lj9Rt=?u3T619@=Gwm#No>uy|kfA8nws*OBj@*lEn!^T{Y1VW3H; z*4s}EK%jC;DWjNxuD#nT!9ppdh+@SH0M{Es6F06S}ZR|Eh6 literal 0 HcmV?d00001 diff --git a/source/web/images/icons/warning.gif b/source/web/images/icons/warning.gif new file mode 100644 index 0000000000000000000000000000000000000000..e6ebb3123038e0a81b4996a61c7435763c4118fb GIT binary patch literal 1019 zcmeH`>o3)D0LFiEFY4eBQKGpd-Im;$+(N5RQ!e2oBA3)z8>L3McUCT=8C#_-wsJX# z)(ck5?VK^0>-o9n%W*v^^6j>^C;A_H*Yo0e`#gI-drta#+dJ?$42Sv7YzhDo?j{ZU zNP`*ea-?EcDmg(V?o{Hzikzv$lQel@Fp&26V>kpOmoO4e-k+l%LLucrdYSe`kd|QD ze-&d%bRdDWT_J7Jn7Bm;lSz9VCU29DL`>bq)ICgRf#iYYW3~{o639xiP>IEtbh;AD zwU7(xY%P^F;`2MKc4AF}uf0TQ%+}ekb;sFyTejYgt+!`|4y@3T6*{pZ7gpqo{!P^UpB<91Ab7ScRomSbB}68Z6gg zxt`9{;L}^IG-0Kg%HH5h8&9HV#gFz>HP_A6_~B;ewUZmxxKL(F4i>4Z*&B^cw|eFs2vVb|A|>BKB|DX+ zmc7cE#qQ}v{wYi_?~%Ge>8!(+3~`27`-c6Iz)T-S#cDfpk)!0JU}&h5RBaOZpgo;& F`U8S!c;Ns5 literal 0 HcmV?d00001 diff --git a/source/web/images/icons/warning_large.gif b/source/web/images/icons/warning_large.gif new file mode 100644 index 0000000000000000000000000000000000000000..2deba2119691b5c224d0cb8f7979d456b6c7bd9e GIT binary patch literal 1511 zcmds$|34FW9LKk1-}2>VmD@41g%D~wJw)kd!$!I@cbidr53sF;c@Rf_h;Pehv)Cl$K(0phlQ^37c((T%q(Vp z0H80Ypz3c>jU%dIAQh{-jEQPpQSCBR=V5O4LFyIemer`<2i31a4ZhIDMRx+s?Lp8T zhVF4uV+iPk(7P2q_#S$BIWH5XNhUMno3^1M@d3q9Fp9j-LFy)!`3K+ctV@epi4&#+DQ4N!|Fj)uh8)51Z zd}so5CwzJa(^{DBhMC@($>;D{51$8M_T|$nnCHb5efc7Ng&nGP&{zHI;*RP(QJt5* z+8e3ay;W>;Yk*$08a4PqS1`I02wFa91?cW~(7ge=BcSI8=!ry)0?=&&T{ODC0bXo@ z7b5g<6ZFN-JlhHVyFtGf1`=Rk|BN;s1`o_=6JRh23@PyP2)s<2(WL@92}laVSzyco zqXJ&%f+-(HF2TrU7`+Ok*WgVtyeTmoieRi1-j>7L3K+i)<5e)Bg2{S#cNgB>gZB?$ z>M=}d;6n?1XoHVW;A1D4{{Zt-_|yf{I+*E)Sp>5~#>PnF{U7zJNWJ=}_TM7fi=*0= zqDm=8ogJ*s;aAE+)QWJmVq;;PQ(+uav4f@9xl|GBb~KEl*ttv*>!A>PD#YFj$%>>v zLehGoLgKUM+xa&BYvg|m))xyb2GfA?nm3&P1cn5d1TtNaG?cS|f1aKuR4H5JJex?e zMWxotJxadLAV?zRSr?>p#%oDJyoA z&{M7wxq2DHPehF(cMS0BaXm$UWy-B+sdPhNwhNEK%um;(=mc!YtyYKE6>vdkC`g?&WyFxM+*%LBZ~uzw(5Mal8x>d7H@k!INRtJep*1Z;k}BlG#={5 z$BiatNkfU@bREtn(^S$T^QR{x>r?eqnrF?IOU?V8uf542EMoeSSbmEo9a(1#oDQZ; z#}1Dz(IgQqzb@`mZJ$A!dI;Z7(WSlkPEb9uou8~-ml|i)a?kQZS z^f_^9LHeIT3!IMUQbq2bF%>3O~7))Mi_r)hgfRJgcJ`X{Kdr74s_jpzoGF=V($b9vj6bG&!c_2Y8fv zRSk76znwxQk`wp04qyr5v><7sV4VtQS-I^N*YOZ(nWaMlyEFdxyJfz)e4$QAbaW3+ zz_}GB<`L}Uy7x^;8q!)hWY-Q`e%a3*RFPMluA=GO;PRZFMJ~B)u0vv#veTn%w}e2n zR}9D3iC9Xh{nD)5P|{wh>cHdJ7)=}1V9e(WP~6n8>bL zp(9Jop;;f-hIERoC+`A`wgd#NEj?gla9aZNlN`nnTYCteX^`AKn79_8+yw BoLT?? literal 0 HcmV?d00001 diff --git a/source/web/jsp/wcm/browse-sandbox.jsp b/source/web/jsp/wcm/browse-sandbox.jsp index 3391dbecc0..15c9a9d9e4 100644 --- a/source/web/jsp/wcm/browse-sandbox.jsp +++ b/source/web/jsp/wcm/browse-sandbox.jsp @@ -217,7 +217,6 @@ - <%-- Description column --%> diff --git a/source/web/jsp/wcm/submit-dialog.jsp b/source/web/jsp/wcm/submit-dialog.jsp new file mode 100644 index 0000000000..0a0152d974 --- /dev/null +++ b/source/web/jsp/wcm/submit-dialog.jsp @@ -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" %> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <% PanelGenerator.generatePanelStart(out, request.getContextPath(), "yellowInner", "#ffffcc"); %> + + + + + <% PanelGenerator.generatePanelEnd(out, request.getContextPath(), "yellowInner"); %> + + + + <%-- Primary column for details view mode --%> + + + + + + + + + + + <%-- Description columns --%> + + + + + + + + <%-- Description columns --%> + + + + + + + + <%-- Modified Date column --%> + + + + + + + + + + + + + + + <% PanelGenerator.generatePanelStart(out, request.getContextPath(), "yellowInner", "#ffffcc"); %> + + + + + <% PanelGenerator.generatePanelEnd(out, request.getContextPath(), "yellowInner"); %> + + + + <%-- Primary column for details view mode --%> + + + + + + + + + + + <%-- Description columns --%> + + + + + + + + <%-- Description columns --%> + + + + + + + + <%-- Modified Date column --%> + + + + + + + + + + + + + +