From 0b58f9ff7f554bf6dab91b0ebcb221604e96f1ae Mon Sep 17 00:00:00 2001 From: Kevin Roast Date: Wed, 10 May 2006 17:12:37 +0000 Subject: [PATCH] . Soft Delete UI checkpoint - List of deleted items for an individual user - Object details page for a deleted item - Reworking of some of the Deleted Items UI - Filter by user/date HTML complete (no implementation yet) - Recover a single item to a specific location - I18N messages added for sys:archive aspect and properties git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@2817 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- config/alfresco/messages/webclient.properties | 10 +- .../alfresco/web-client-config-properties.xml | 9 +- .../org/alfresco/web/bean/TrashcanBean.java | 208 +++++++++++++++--- .../repo/renderer/NodePathLinkRenderer.java | 109 ++++----- .../web/WEB-INF/faces-config-navigation.xml | 4 + source/web/css/main.css | 9 + source/web/jsp/trashcan/item-details.jsp | 201 +++++++++++++++++ source/web/jsp/trashcan/recover-item.jsp | 29 ++- source/web/jsp/trashcan/trash-list.jsp | 51 +++-- 9 files changed, 533 insertions(+), 97 deletions(-) create mode 100644 source/web/jsp/trashcan/item-details.jsp diff --git a/config/alfresco/messages/webclient.properties b/config/alfresco/messages/webclient.properties index 9658ee73fd..fd0034e5f0 100644 --- a/config/alfresco/messages/webclient.properties +++ b/config/alfresco/messages/webclient.properties @@ -778,13 +778,15 @@ manage_deleted_items=Manage Deleted Items manage_deleted_items_description=Remove or recover previously deleted items recover_all_items=Recover All Items delete_all_items=Delete All Items -deleted_items_info=Use the Search to find specific named deleted items and use the Filters to reduce the list. +deleted_items_info=Use the Search to find deleted items by name or content and use the filters to reduce the list. original_location=Original Location deleted_date=Date Deleted deleted_user=Deleted by User recover=Recover clear_search_results=Clear Search Results -search_deleted_items=Search Deleted Items +search_deleted_items_name=Search by Name +search_deleted_items_text=Search by Content +deleted_items_for=for ''{0}'' delete_item=Delete Item delete_item_info=Permanently delete an item from the deleted file store delete_item_confirm=Are you sure you want to permanently delete \"{0}\" from the deleted file store? The item cannot be recovered once this action has been performed. @@ -809,6 +811,10 @@ recovered_item_permission=Failed to recover the item \"{0}\" as you do not have recovered_item_integrity=Failed to recover the item \"{0}\" as there is now an item in the original parent folder with the same name, please select a new folder destination. recovered_item_failure=Failed to recover the item \"{0}\" due to error: {1} delete_item_success=The item \"{0}\" has been permanently deleted. +title_deleted_item_details=Deleted Item Details +deleteditem_details_description=Details of the deleted item +alternative_destination=You may select a destination where you wish the recovered items to be placed. If you do not select a destination, the original location of the item is used. Recovery of an item may fail if the destination does not exist or you do not have permission to add items there. +deleted_when=When # Admin Console messages title_admin_console=Administration Console diff --git a/config/alfresco/web-client-config-properties.xml b/config/alfresco/web-client-config-properties.xml index 03da2577eb..bf40985d47 100644 --- a/config/alfresco/web-client-config-properties.xml +++ b/config/alfresco/web-client-config-properties.xml @@ -132,5 +132,12 @@ - + + + + + + + + diff --git a/source/java/org/alfresco/web/bean/TrashcanBean.java b/source/java/org/alfresco/web/bean/TrashcanBean.java index cd212494f4..4bab81b766 100644 --- a/source/java/org/alfresco/web/bean/TrashcanBean.java +++ b/source/java/org/alfresco/web/bean/TrashcanBean.java @@ -49,7 +49,9 @@ import org.alfresco.web.bean.repository.Node; import org.alfresco.web.bean.repository.NodePropertyResolver; import org.alfresco.web.bean.repository.QNameNodeMap; import org.alfresco.web.bean.repository.Repository; +import org.alfresco.web.bean.wizard.NewSpaceWizard; import org.alfresco.web.ui.common.Utils; +import org.alfresco.web.ui.common.Utils.URLMode; import org.alfresco.web.ui.common.component.UIActionLink; import org.alfresco.web.ui.common.component.data.UIRichList; @@ -58,6 +60,8 @@ import org.alfresco.web.ui.common.component.data.UIRichList; */ public class TrashcanBean implements IContextListener { + private static final String MSG_DELETED_ITEMS_FOR = "deleted_items_for"; + private static final String MSG_DELETED_ITEMS = "deleted_items"; private static final String MSG_RECOVERED_ITEM_INTEGRITY = "recovered_item_integrity"; private static final String MSG_RECOVERED_ITEM_PERMISSION = "recovered_item_permission"; private static final String MSG_RECOVERED_ITEM_PARENT = "recovered_item_parent"; @@ -69,11 +73,15 @@ public class TrashcanBean implements IContextListener private static final String RICHLIST_ID = "trashcan-list"; private static final String RICHLIST_MSG_ID = "trashcan" + ':' + RICHLIST_ID; - private final static String NAME_ATTR = Repository.escapeQName(ContentModel.PROP_NAME); + private final static String NAME_ATTR = Repository.escapeQName(ContentModel.PROP_NAME); + private final static String USER_ATTR = Repository.escapeQName(ContentModel.PROP_ARCHIVED_BY); private final static String SEARCH_ALL = "PARENT:\"%s\" AND ASPECT:\"%s\""; - private final static String SEARCH_NAME = "PARENT:\"%s\" AND ASPECT:\"%s\" AND (@" + NAME_ATTR + ":*%s* TEXT:%s)"; - private final static String SEARCH_NAME_QUOTED = "PARENT:\"%s\" AND ASPECT:\"%s\" AND (@" + NAME_ATTR + ":\"%s\" TEXT:\"%s\")"; + private final static String SEARCH_NAME = "PARENT:\"%s\" AND ASPECT:\"%s\" AND @" + NAME_ATTR + ":*%s*"; + private final static String SEARCH_TEXT = "PARENT:\"%s\" AND ASPECT:\"%s\" AND TEXT:%s"; + private final static String SEARCH_NAME_QUOTED = "PARENT:\"%s\" AND ASPECT:\"%s\" AND @" + NAME_ATTR + ":\"%s\""; + private final static String SEARCH_TEXT_QUOTED = "PARENT:\"%s\" AND ASPECT:\"%s\" AND TEXT:\"%s\""; + private final static String SEARCH_USERPREFIX = "@" + USER_ATTR + ":%s AND "; /** NodeService bean reference */ protected NodeService nodeService; @@ -96,6 +104,8 @@ public class TrashcanBean implements IContextListener /** We show an empty list until a Search or Show All is executed */ private boolean showItems = false; + private boolean fullTextSearch = false; + /** Currently listed items */ private List listedItems = Collections.emptyList(); @@ -105,6 +115,9 @@ public class TrashcanBean implements IContextListener /** Root node to the spaces store archive store*/ private NodeRef archiveRootRef = null; + /** Alternative destination for recovered items */ + private NodeRef destination = null; + // ------------------------------------------------------------------------------ // Bean property getters and setters @@ -173,6 +186,67 @@ public class TrashcanBean implements IContextListener this.searchText = searchText; } + /** + * @return Returns the alternative destination to use if recovery fails. + */ + public NodeRef getDestination() + { + return this.destination; + } + + /** + * @param destination The alternative destination to use if recovery fails. + */ + public void setDestination(NodeRef destination) + { + this.destination = destination; + } + + /** + * @return Message to display in the title of the panel area + */ + public String getPanelMessage() + { + FacesContext fc = FacesContext.getCurrentInstance(); + String msg = Application.getMessage(fc, MSG_DELETED_ITEMS); + if (isAdminUser() == false) + { + msg = msg + ' ' + MessageFormat.format( + Application.getMessage(fc, MSG_DELETED_ITEMS_FOR), Application.getCurrentUser(fc).getUserName()); + } + return msg; + } + + /** + * Returns the URL to the content for the current document item + * + * @return Content url to the current document item + */ + public String getItemBrowserUrl() + { + return Utils.generateURL(FacesContext.getCurrentInstance(), getItem(), URLMode.HTTP_INLINE); + } + + /** + * Returns the download URL to the content for the current document item + * + * @return Download url to the current document item + */ + public String getItemDownloadUrl() + { + return Utils.generateURL(FacesContext.getCurrentInstance(), getItem(), URLMode.HTTP_DOWNLOAD); + } + + /** + * Return the Alfresco NodeRef URL for the current item node + * + * @return the Alfresco NodeRef URL + */ + public String getItemNodeRefUrl() + { + return getItem().getNodeRef().toString(); + } + /** * @return Returns the listed items. */ @@ -244,27 +318,24 @@ public class TrashcanBean implements IContextListener { QName type = this.nodeService.getType(nodeRef); + MapNode node = new MapNode(nodeRef, this.nodeService, false); + + node.addPropertyResolver("locationPath", resolverLocationPath); + node.addPropertyResolver("displayPath", resolverDisplayPath); + node.addPropertyResolver("deletedDate", resolverDeletedDate); + node.addPropertyResolver("deletedBy", resolverDeletedBy); + node.addPropertyResolver("isFolder", resolverIsFolder); + if (this.dictionaryService.isSubClass(type, ContentModel.TYPE_FOLDER) == true && this.dictionaryService.isSubClass(type, ContentModel.TYPE_SYSTEM_FOLDER) == false) { - MapNode node = new MapNode(nodeRef, this.nodeService, false); - node.addPropertyResolver("locationPath", resolverLocationPath); - node.addPropertyResolver("displayPath", resolverDisplayPath); - node.addPropertyResolver("deletedDate", resolverDeletedDate); - node.addPropertyResolver("deletedBy", resolverDeletedBy); node.addPropertyResolver("typeIcon", this.resolverSmallIcon); - itemNodes.add(node); } else { - MapNode node = new MapNode(nodeRef, this.nodeService, false); - node.addPropertyResolver("locationPath", resolverLocationPath); - node.addPropertyResolver("displayPath", resolverDisplayPath); - node.addPropertyResolver("deletedDate", resolverDeletedDate); - node.addPropertyResolver("deletedBy", resolverDeletedBy); node.addPropertyResolver("typeIcon", this.resolverFileType16); - itemNodes.add(node); } + itemNodes.add(node); } } } @@ -292,15 +363,12 @@ public class TrashcanBean implements IContextListener private NodePropertyResolver resolverLocationPath = new NodePropertyResolver() { public Object get(Node node) { - //ChildAssociationRef childRef = (ChildAssociationRef)node.getProperties().get(ContentModel.PROP_ARCHIVED_ORIGINAL_PARENT_ASSOC); - //return nodeService.getPath(childRef.getChildRef()); return (Path)node.getProperties().get(ContentModel.PROP_ARCHIVED_ORIGINAL_PATH); } }; private NodePropertyResolver resolverDisplayPath = new NodePropertyResolver() { public Object get(Node node) { - //ChildAssociationRef childRef = (ChildAssociationRef)node.getProperties().get(ContentModel.PROP_ARCHIVED_ORIGINAL_PARENT_ASSOC); return Repository.getDisplayPath((Path)node.getProperties().get(ContentModel.PROP_ARCHIVED_ORIGINAL_PATH)); } }; @@ -319,6 +387,20 @@ public class TrashcanBean implements IContextListener } }; + private NodePropertyResolver resolverFileType32 = new NodePropertyResolver() { + public Object get(Node node) { + return Utils.getFileTypeImage(node.getName(), false); + } + }; + + private NodePropertyResolver resolverLargeIcon = new NodePropertyResolver() { + public Object get(Node node) { + QNameNodeMap props = (QNameNodeMap)node.getProperties(); + String icon = (String)props.getRaw("app:icon"); + return "/images/icons/" + (icon != null ? icon : NewSpaceWizard.SPACE_ICON_DEFAULT) + ".gif"; + } + }; + private NodePropertyResolver resolverDeletedDate = new NodePropertyResolver() { public Object get(Node node) { return node.getProperties().get(ContentModel.PROP_ARCHIVED_DATE); @@ -331,23 +413,42 @@ public class TrashcanBean implements IContextListener } }; + private NodePropertyResolver resolverIsFolder = new NodePropertyResolver() { + public Object get(Node node) { + return dictionaryService.isSubClass(node.getType(), ContentModel.TYPE_FOLDER); + } + }; + // ------------------------------------------------------------------------------ // Action handlers // TODO: // need the following Action Handlers: - // deleteItemOK, recoverItemOK, deleteAllItemsOK, recoverAllItemsOK, recoverListedItemsOK, deleteListedItemsOK + // deleteAllItemsOK, recoverAllItemsOK, recoverListedItemsOK, deleteListedItemsOK /** * Search the deleted item store by name */ - public void search(ActionEvent event) + public void searchName(ActionEvent event) { // simply clear the current list and refresh the screen // the search query text will be found and processed by the getItems() method contextUpdated(); this.showItems = true; + this.fullTextSearch = false; + } + + /** + * Search the deleted item store by text + */ + public void searchContent(ActionEvent event) + { + // simply clear the current list and refresh the screen + // the search query text will be found and processed by the getItems() method + contextUpdated(); + this.showItems = true; + this.fullTextSearch = true; } /** @@ -376,11 +477,24 @@ public class TrashcanBean implements IContextListener NodeRef ref = new NodeRef(getArchiveRootRef().getStoreRef(), id); Node node = new Node(ref); - // resolve icon in-case one has not been set - //node.addPropertyResolver("icon", this.resolverSpaceIcon); + node.addPropertyResolver("locationPath", resolverLocationPath); + node.addPropertyResolver("deletedDate", resolverDeletedDate); + node.addPropertyResolver("deletedBy", resolverDeletedBy); + node.addPropertyResolver("isFolder", resolverIsFolder); + + if (this.dictionaryService.isSubClass(node.getType(), ContentModel.TYPE_FOLDER) == true && + this.dictionaryService.isSubClass(node.getType(), ContentModel.TYPE_SYSTEM_FOLDER) == false) + { + node.addPropertyResolver("icon", this.resolverLargeIcon); + } + else + { + node.addPropertyResolver("icon", this.resolverFileType32); + } // prepare a node for the action context setItem(node); + setDestination(null); } catch (InvalidNodeRefException refErr) { @@ -397,6 +511,9 @@ public class TrashcanBean implements IContextListener contextUpdated(); } + /** + * Delete single item OK button handler + */ public String deleteItemOK() { Node item = getItem(); @@ -421,6 +538,9 @@ public class TrashcanBean implements IContextListener return OUTCOME_DIALOGCLOSE; } + /** + * Recover single item OK button handler + */ public String recoverItemOK() { String outcome = null; @@ -434,7 +554,16 @@ public class TrashcanBean implements IContextListener String msg; FacesMessage errorfacesMsg = null; - RestoreNodeReport report = this.nodeArchiveService.restoreArchivedNode(item.getNodeRef()); + // restore the node - the user may have requested a restore to a different parent + RestoreNodeReport report; + if (this.destination == null) + { + report = this.nodeArchiveService.restoreArchivedNode(item.getNodeRef()); + } + else + { + report = this.nodeArchiveService.restoreArchivedNode(item.getNodeRef(), this.destination, null, null); + } switch (report.getStatus()) { case SUCCESS: @@ -496,7 +625,7 @@ public class TrashcanBean implements IContextListener */ public void resetAll(ActionEvent event) { - // TODO: reset all filter and search + // TODO: reset all filters } /** @@ -540,16 +669,43 @@ public class TrashcanBean implements IContextListener String safeText = QueryParser.escape(this.searchText); if (safeText.indexOf(' ') == -1) { - query = String.format(SEARCH_NAME, archiveRootRef, ContentModel.ASPECT_ARCHIVED, safeText, safeText); + if (this.fullTextSearch) + { + query = String.format(SEARCH_TEXT, archiveRootRef, ContentModel.ASPECT_ARCHIVED, safeText); + } + else + { + query = String.format(SEARCH_NAME, archiveRootRef, ContentModel.ASPECT_ARCHIVED, safeText); + } } else { - query = String.format(SEARCH_NAME_QUOTED, archiveRootRef, ContentModel.ASPECT_ARCHIVED, safeText, safeText); + if (this.fullTextSearch) + { + query = String.format(SEARCH_TEXT_QUOTED, archiveRootRef, ContentModel.ASPECT_ARCHIVED, safeText); + } + else + { + query = String.format(SEARCH_NAME_QUOTED, archiveRootRef, ContentModel.ASPECT_ARCHIVED, safeText); + } } } + + if (isAdminUser() == false) + { + // prefix username clause + String username = Application.getCurrentUser(FacesContext.getCurrentInstance()).getUserName(); + query = String.format(SEARCH_USERPREFIX, username) + query; + } + return query; } + private boolean isAdminUser() + { + return Application.getCurrentUser(FacesContext.getCurrentInstance()).isAdmin(); + } + // ------------------------------------------------------------------------------ // IContextListener implementation diff --git a/source/java/org/alfresco/web/ui/repo/renderer/NodePathLinkRenderer.java b/source/java/org/alfresco/web/ui/repo/renderer/NodePathLinkRenderer.java index 75c5d131a6..dd84b3ef49 100644 --- a/source/java/org/alfresco/web/ui/repo/renderer/NodePathLinkRenderer.java +++ b/source/java/org/alfresco/web/ui/repo/renderer/NodePathLinkRenderer.java @@ -92,70 +92,73 @@ public class NodePathLinkRenderer extends BaseRenderer { path = (Path)val; } - else + else if (val != null) { throw new IllegalArgumentException("UINodePath component 'value' property must resolve to a NodeRef or Path!"); } - boolean isBreadcrumb = false; - Boolean breadcrumb = (Boolean)component.getAttributes().get("breadcrumb"); - if (breadcrumb != null) + if (val != null) { - isBreadcrumb = breadcrumb.booleanValue(); - } - - boolean isDisabled = false; - Boolean disabled = (Boolean)component.getAttributes().get("disabled"); - if (disabled != null) - { - isDisabled = disabled.booleanValue(); - } - - boolean showLeaf = false; - Boolean showLeafBool = (Boolean)component.getAttributes().get("showLeaf"); - if (showLeafBool != null) - { - showLeaf = showLeafBool.booleanValue(); - } - - // use Spring JSF integration to get the node service bean - NodeService service = getNodeService(context); - UserTransaction tx = null; - try - { - tx = Repository.getUserTransaction(FacesContext.getCurrentInstance(), true); - tx.begin(); - - if (path == null) + boolean isBreadcrumb = false; + Boolean breadcrumb = (Boolean)component.getAttributes().get("breadcrumb"); + if (breadcrumb != null) { - path = service.getPath(nodeRef); + isBreadcrumb = breadcrumb.booleanValue(); } - if (isBreadcrumb == false || isDisabled == true) + boolean isDisabled = false; + Boolean disabled = (Boolean)component.getAttributes().get("disabled"); + if (disabled != null) { - out.write(buildPathAsSingular(context, component, path, showLeaf, isDisabled)); - } - else - { - out.write(buildPathAsBreadcrumb(context, component, path, showLeaf)); + isDisabled = disabled.booleanValue(); } - tx.commit(); - } - catch (InvalidNodeRefException refErr) - { - // this error simple means we cannot output the path - try { if (tx != null) {tx.rollback();} } catch (Exception tex) {} - } - catch (AccessDeniedException accessErr) - { - // this error simple means we cannot output the path - try { if (tx != null) {tx.rollback();} } catch (Exception tex) {} - } - catch (Throwable err) - { - try { if (tx != null) {tx.rollback();} } catch (Exception tex) {} - throw new RuntimeException(err); + boolean showLeaf = false; + Boolean showLeafBool = (Boolean)component.getAttributes().get("showLeaf"); + if (showLeafBool != null) + { + showLeaf = showLeafBool.booleanValue(); + } + + // use Spring JSF integration to get the node service bean + NodeService service = getNodeService(context); + UserTransaction tx = null; + try + { + tx = Repository.getUserTransaction(FacesContext.getCurrentInstance(), true); + tx.begin(); + + if (path == null) + { + path = service.getPath(nodeRef); + } + + if (isBreadcrumb == false || isDisabled == true) + { + out.write(buildPathAsSingular(context, component, path, showLeaf, isDisabled)); + } + else + { + out.write(buildPathAsBreadcrumb(context, component, path, showLeaf)); + } + + tx.commit(); + } + catch (InvalidNodeRefException refErr) + { + // this error simple means we cannot output the path + try { if (tx != null) {tx.rollback();} } catch (Exception tex) {} + } + catch (AccessDeniedException accessErr) + { + // this error simple means we cannot output the path + try { if (tx != null) {tx.rollback();} } catch (Exception tex) {} + } + catch (Throwable err) + { + try { if (tx != null) {tx.rollback();} } catch (Exception tex) {} + throw new RuntimeException(err); + } } } diff --git a/source/web/WEB-INF/faces-config-navigation.xml b/source/web/WEB-INF/faces-config-navigation.xml index 88813750a5..d004f78ee2 100644 --- a/source/web/WEB-INF/faces-config-navigation.xml +++ b/source/web/WEB-INF/faces-config-navigation.xml @@ -923,6 +923,10 @@ deleteListedItems /jsp/trashcan/delete-listed.jsp + + itemDetails + /jsp/trashcan/item-details.jsp + diff --git a/source/web/css/main.css b/source/web/css/main.css index dec15aad95..b66583be3c 100644 --- a/source/web/css/main.css +++ b/source/web/css/main.css @@ -393,6 +393,15 @@ a.topToolbarLinkHighlight, a.topToolbarLinkHighlight:link, a.topToolbarLinkHighl padding-top: 3px; } +.filterBorders +{ + padding: 2px; + background-color: #cddbe8; + border-width: 1px; + border-style: solid; + border-color: #003366; +} + .wizardSectionHeading { padding: 2px; diff --git a/source/web/jsp/trashcan/item-details.jsp b/source/web/jsp/trashcan/item-details.jsp new file mode 100644 index 0000000000..4ac3d3140d --- /dev/null +++ b/source/web/jsp/trashcan/item-details.jsp @@ -0,0 +1,201 @@ +<%-- + 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="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="/WEB-INF/alfresco.tld" prefix="a" %> +<%@ taglib uri="/WEB-INF/repo.tld" prefix="r" %> + +<%@ page buffer="64kb" contentType="text/html;charset=UTF-8" %> +<%@ page isELIgnored="false" %> +<%@ page import="org.alfresco.web.ui.common.PanelGenerator" %> + + + + + + <%-- load a bundle of properties with I18N strings --%> + + + + + <%-- Main outer table --%> + + + <%-- Title bar --%> + + + + + <%-- Main area --%> + + <%-- Shelf --%> + + + <%-- Work Area --%> + + +
+ <%@ include file="../parts/titlebar.jsp" %> +
+ <%@ include file="../parts/shelf.jsp" %> + + + <%-- Breadcrumb --%> + <%@ include file="../parts/breadcrumb.jsp" %> + + <%-- Status and Actions --%> + + + + + + + <%-- separator row with gradient shadow --%> + + + + + + + <%-- Details --%> + + + + + + + <%-- separator row with bottom panel graphics --%> + + + + + + +
+ + <%-- Status and Actions inner contents table --%> + <%-- Generally this consists of an icon, textual summary and actions for the current object --%> + + + + + +
+ + +
+ '' +
+
+ : +
+
+
+
+ + + + + + +
+ + + + + + + +
+ + + + + +
+
+ +
+ + + + + + + +
+ <%-- icon image for the object --%> + + + + + + + + +
+
+ + +
+
+
+ <%-- properties for the item --%> + + + +
+
+ +
+ + <% PanelGenerator.generatePanelStart(out, request.getContextPath(), "blue", "#D3E6FE"); %> + + + + +
+ +
+ <% PanelGenerator.generatePanelEnd(out, request.getContextPath(), "blue"); %> + +
+ + <%-- Item Actions --%> + + + + + + + + +
+
+
+ +
+ +
+ +
\ No newline at end of file diff --git a/source/web/jsp/trashcan/recover-item.jsp b/source/web/jsp/trashcan/recover-item.jsp index d6e65e8899..bc8fea3246 100644 --- a/source/web/jsp/trashcan/recover-item.jsp +++ b/source/web/jsp/trashcan/recover-item.jsp @@ -98,14 +98,41 @@ <% PanelGenerator.generatePanelStart(out, request.getContextPath(), "white", "white"); %> - + + + + + + + + + + +
+
+ <% PanelGenerator.generatePanelStart(out, request.getContextPath(), "yellowInner", "#ffffcc"); %> + + + + + +
+ +
+ <% PanelGenerator.generatePanelEnd(out, request.getContextPath(), "yellowInner"); %> +
+ :  + + +
<%-- Error Messages --%> <%-- messages tag to show messages not handled by other specific message tags --%> diff --git a/source/web/jsp/trashcan/trash-list.jsp b/source/web/jsp/trashcan/trash-list.jsp index eab545002e..bcab255091 100644 --- a/source/web/jsp/trashcan/trash-list.jsp +++ b/source/web/jsp/trashcan/trash-list.jsp @@ -40,11 +40,13 @@ { if (document.getElementById("trashcan:search-text").value.length == 0) { - document.getElementById("trashcan:search-btn").disabled = true; + document.getElementById("trashcan:search-btn1").disabled = true; + document.getElementById("trashcan:search-btn2").disabled = true; } else { - document.getElementById("trashcan:search-btn").disabled = false; + document.getElementById("trashcan:search-btn1").disabled = false; + document.getElementById("trashcan:search-btn2").disabled = false; } } @@ -123,7 +125,7 @@ <%-- Deleted Items List --%> - + <% PanelGenerator.generatePanelStart(out, request.getContextPath(), "yellowInner", "#ffffcc"); %> @@ -139,18 +141,35 @@ <%-- Search controls --%>
  -   +   +  
<%-- Filter controls --%>
- + - +
...TODO: Date filter here... + + + + + + +
:All  Today  This  Week  This Month
+
...TODO: Username filter here - admin only... + + + + + + +
:All  User 
+
@@ -158,9 +177,9 @@ <%-- TODO: only show user filter for admin user --%>
- <%-- Recover Listed Items button --%> -   - + <%-- Recover Listed Items actions --%> +   +
<%-- Primary column showing item name --%> - + - + + + - + + + <%-- Original Location Path column --%> @@ -183,11 +206,11 @@ - + <%-- Deleted Date column --%> - +