From 8b10b42a07a34275f733b660554b6091dfdbc8fb Mon Sep 17 00:00:00 2001 From: Kevin Roast Date: Mon, 8 Jan 2007 19:13:45 +0000 Subject: [PATCH] . Version History list for a file (available in the File Details screen) - View previous file version content - Sorted by most recent version first - Revert to a previous version action . Some more changes to Create Web Project wizard from Usability Review git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@4756 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../org/alfresco/web/bean/wcm/AVMNode.java | 7 +- .../web/bean/wcm/FileDetailsBean.java | 127 ++++++++++++++++++ .../web/ui/wcm/component/UIUserSandboxes.java | 25 ++-- source/web/WEB-INF/faces-config-beans.xml | 4 + source/web/jsp/dialog/document-details.jsp | 2 +- source/web/jsp/wcm/browse-website.jsp | 9 +- source/web/jsp/wcm/file-details.jsp | 44 ++++++ 7 files changed, 202 insertions(+), 16 deletions(-) diff --git a/source/java/org/alfresco/web/bean/wcm/AVMNode.java b/source/java/org/alfresco/web/bean/wcm/AVMNode.java index c7e1831afb..90aa3d2d6a 100644 --- a/source/java/org/alfresco/web/bean/wcm/AVMNode.java +++ b/source/java/org/alfresco/web/bean/wcm/AVMNode.java @@ -127,7 +127,12 @@ public class AVMNode extends Node implements Map { return this.avmRef.getPath(); } - + + public final AVMNodeDescriptor getDescriptor() + { + return avmRef; + } + public int getVersion() { return this.version; diff --git a/source/java/org/alfresco/web/bean/wcm/FileDetailsBean.java b/source/java/org/alfresco/web/bean/wcm/FileDetailsBean.java index f8ae75c3ab..3655a74229 100644 --- a/source/java/org/alfresco/web/bean/wcm/FileDetailsBean.java +++ b/source/java/org/alfresco/web/bean/wcm/FileDetailsBean.java @@ -16,11 +16,31 @@ */ package org.alfresco.web.bean.wcm; +import java.io.Serializable; +import java.text.MessageFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import javax.faces.context.FacesContext; +import javax.faces.event.ActionEvent; +import javax.transaction.UserTransaction; + +import org.alfresco.repo.avm.AVMNodeConverter; +import org.alfresco.repo.avm.actions.AVMRevertToVersionAction; +import org.alfresco.service.cmr.action.Action; +import org.alfresco.service.cmr.action.ActionService; +import org.alfresco.service.cmr.avm.AVMNodeDescriptor; +import org.alfresco.util.Pair; +import org.alfresco.web.app.Application; import org.alfresco.web.app.servlet.DownloadContentServlet; import org.alfresco.web.bean.repository.Node; +import org.alfresco.web.bean.repository.Repository; import org.alfresco.web.ui.common.Utils; +import org.alfresco.web.ui.common.component.UIActionLink; +import org.alfresco.web.ui.common.component.data.UIRichList; /** * Backing bean for File Details page. @@ -29,6 +49,36 @@ import org.alfresco.web.ui.common.Utils; */ public class FileDetailsBean extends AVMDetailsBean { + /** Action service bean reference */ + private ActionService actionService; + + + // ------------------------------------------------------------------------------ + // Construction + + /** + * Default constructor + */ + public FileDetailsBean() + { + super(); + + // initial state of some panels that don't use the default + panels.put("version-history-panel", false); + } + + + // ------------------------------------------------------------------------------ + // Bean getters and setters + + /** + * @param actionService The actionService to set. + */ + public void setActionService(ActionService actionService) + { + this.actionService = actionService; + } + /** * @see org.alfresco.web.bean.wcm.AVMDetailsBean#getAvmNode() */ @@ -92,4 +142,81 @@ public class FileDetailsBean extends AVMDetailsBean { return (List)this.avmBrowseBean.getFiles(); } + + /** + * @return version history list for a node + */ + public List> getVersionHistory() + { + AVMNode avmNode = getAvmNode(); + List history = this.avmService.getHistory(avmNode.getDescriptor(), -1); + List> wrappers = new ArrayList>(history.size()); + for (AVMNodeDescriptor record : history) + { + Map wrapper = new HashMap(4, 1.0f); + wrapper.put("version", record.getVersionID()); + wrapper.put("strVersion", Integer.toString(record.getVersionID())); + wrapper.put("modifiedDate", new Date(record.getModDate())); + List> paths = this.avmService.getPaths(record); + if (paths.size() != 0) + { + // display the first path as any will show the same content + Pair path = paths.get(0); + wrapper.put("url", DownloadContentServlet.generateBrowserURL( + AVMNodeConverter.ToNodeRef(path.getFirst(), path.getSecond()), avmNode.getName())); + } + wrappers.add(wrapper); + } + return wrappers; + } + + /** + * Revert a node back to a previous version + */ + public void revertNode(ActionEvent event) + { + UIActionLink link = (UIActionLink)event.getComponent(); + Map params = link.getParameterMap(); + int version = Integer.parseInt(params.get("version")); + + UserTransaction tx = null; + try + { + FacesContext context = FacesContext.getCurrentInstance(); + tx = Repository.getUserTransaction(context, false); + tx.begin(); + + Map args = new HashMap(1, 1.0f); + List history = this.avmService.getHistory(getAvmNode().getDescriptor(), -1); + // the history list should contain the version ID we are looking for + for (AVMNodeDescriptor record : history) + { + if (record.getVersionID() == version) + { + // the action expects the HEAD revision as the noderef and + // the to-revert param as the previous version to revert to + Action action = this.actionService.createAction(AVMRevertToVersionAction.NAME, args); + args.put(AVMRevertToVersionAction.TOREVERT, record); + this.actionService.executeAction(action, getAvmNode().getNodeRef()); + + // clear the version history list after a revert ready for refresh + UIRichList versionList = (UIRichList)link.findComponent("version-history-list"); + versionList.setValue(null); + + // reset the action node reference as the version ID has changed + avmBrowseBean.setAvmActionNode(new AVMNode(avmService.lookup(-1, getAvmNode().getPath()))); + break; + } + } + + tx.commit(); + } + catch (Throwable err) + { + err.printStackTrace(System.err); + Utils.addErrorMessage(MessageFormat.format(Application.getMessage( + FacesContext.getCurrentInstance(), Repository.ERROR_GENERIC), err.getMessage()), err); + try { if (tx != null) {tx.rollback();} } catch (Exception tex) {} + } + } } 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 5361c2fa67..499a1cbfba 100644 --- a/source/java/org/alfresco/web/ui/wcm/component/UIUserSandboxes.java +++ b/source/java/org/alfresco/web/ui/wcm/component/UIUserSandboxes.java @@ -324,9 +324,11 @@ public class UIUserSandboxes extends SelfRenderingComponent out.write(""); // modified items panel @@ -674,11 +677,11 @@ public class UIUserSandboxes extends SelfRenderingComponent // output multi-select actions for this user out.write(" diff --git a/source/web/jsp/wcm/file-details.jsp b/source/web/jsp/wcm/file-details.jsp index 7df7fe7109..f8463711a4 100644 --- a/source/web/jsp/wcm/file-details.jsp +++ b/source/web/jsp/wcm/file-details.jsp @@ -169,6 +169,50 @@
"); // show the icon for the sandbox as a clickable browse link image // this is currently identical to the sandbox_browse action as below - Utils.encodeRecursive(context, aquireAction( + UIActionLink browseAction = aquireAction( context, mainStore, username, ACT_SANDBOX_ICON, WebResources.IMAGE_USERSANDBOX_32, - "#{AVMBrowseBean.setupSandboxAction}", "browseSandbox")); + "#{AVMBrowseBean.setupSandboxAction}", "browseSandbox"); + browseAction.setShowLink(false); + Utils.encodeRecursive(context, browseAction); out.write(""); out.write(""); out.write(bundle.getString(MSG_USERNAME)); @@ -337,6 +339,11 @@ public class UIUserSandboxes extends SelfRenderingComponent out.write(")"); // direct actions for a sandbox + Utils.encodeRecursive(context, aquireAction( + context, mainStore, username, ACT_SANDBOX_BROWSE, "/images/icons/space_small.gif", + "#{AVMBrowseBean.setupSandboxAction}", "browseSandbox")); + out.write("  "); + String websiteUrl = AVMConstants.buildWebappUrl(mainStore, getWebapp()); Map requestMap = context.getExternalContext().getRequestMap(); requestMap.put(REQUEST_PREVIEW_REF, websiteUrl); @@ -349,24 +356,20 @@ public class UIUserSandboxes extends SelfRenderingComponent Utils.encodeRecursive(context, aquireAction( context, mainStore, username, ACT_SANDBOX_SUBMITALL, "/images/icons/submit_all.gif", "#{AVMBrowseBean.setupAllItemsAction}", "dialog:submitSandboxItems")); - out.write(" "); + out.write("  "); Utils.encodeRecursive(context, aquireAction( context, mainStore, username, ACT_SANDBOX_REVERTALL, "/images/icons/revert_all.gif", "#{AVMBrowseBean.setupAllItemsAction}", "dialog:revertAllItems")); - out.write(" "); + out.write("  "); if (isManager) { Utils.encodeRecursive(context, aquireAction( context, mainStore, username, ACT_REMOVE_SANDBOX, "/images/icons/delete_sandbox.gif", "#{AVMBrowseBean.setupSandboxAction}", "dialog:deleteSandbox")); - out.write(" "); } - Utils.encodeRecursive(context, aquireAction( - context, mainStore, username, ACT_SANDBOX_BROWSE, "/images/icons/space_small.gif", - "#{AVMBrowseBean.setupSandboxAction}", "browseSandbox")); out.write("
"); out.write(bundle.getString(MSG_SELECTED)); - out.write(": "); + out.write(":  "); Utils.encodeRecursive(fc, aquireAction( fc, userStore, username, ACT_SANDBOX_SUBMITSELECTED, "/images/icons/submit_all.gif", "#{AVMBrowseBean.setupSandboxAction}", "dialog:submitSandboxItems")); - out.write(" "); + out.write("  "); Utils.encodeRecursive(fc, aquireAction( fc, userStore, username, ACT_SANDBOX_REVERTSELECTED, "/images/icons/revert_all.gif", "#{AVMBrowseBean.setupSandboxAction}", "dialog:revertSelectedItems")); @@ -925,7 +928,7 @@ public class UIUserSandboxes extends SelfRenderingComponent control.setRendererType(UIActions.RENDERER_ACTIONLINK); control.setId(id); control.setValue(Application.getMessage(fc, name)); - control.setShowLink(icon != null ? false : true); + //control.setShowLink(icon != null ? false : true); control.setImage(icon); if (actionListener != null) diff --git a/source/web/WEB-INF/faces-config-beans.xml b/source/web/WEB-INF/faces-config-beans.xml index 718e7e6f14..82e4c6762a 100644 --- a/source/web/WEB-INF/faces-config-beans.xml +++ b/source/web/WEB-INF/faces-config-beans.xml @@ -2601,6 +2601,10 @@ avmBrowseBean #{AVMBrowseBean} + + actionService + #{ActionService} + diff --git a/source/web/jsp/dialog/document-details.jsp b/source/web/jsp/dialog/document-details.jsp index 89e61a4ad3..cde34250c8 100644 --- a/source/web/jsp/dialog/document-details.jsp +++ b/source/web/jsp/dialog/document-details.jsp @@ -354,7 +354,7 @@ - + diff --git a/source/web/jsp/wcm/browse-website.jsp b/source/web/jsp/wcm/browse-website.jsp index 1d8fbf5cdf..f0fc2cafb9 100644 --- a/source/web/jsp/wcm/browse-website.jsp +++ b/source/web/jsp/wcm/browse-website.jsp @@ -117,9 +117,12 @@ - - - + +    + + <%-- Disabled action for GA + + --%>
+
+ + + + + + <%-- Primary column --%> + + + + + + + + <%-- Modified Date column --%> + + + + + + + + + + <%-- actions --%> + + + + + + + + + + + + + +