Morning merge.

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/BRANCHES/WCM-DEV2/root@2851 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Britt Park
2006-05-11 17:01:57 +00:00
parent 41976834d5
commit 1250a0352c
17 changed files with 904 additions and 134 deletions

View File

@@ -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,17 @@ 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.
user_filter_who=Who
user_filter_all=All
user_filter_user=User
date_filter_when=When
date_filter_all=All
date_filter_today=Today
date_filter_week=Last 7 days
date_filter_month=Last 30 days
# Admin Console messages
title_admin_console=Administration Console

View File

@@ -10,7 +10,7 @@
<!-- a list of permissions to evaluate action against before checking other preconditions -->
<permissions>
<!-- each permission can be an Allow or Deny check -->
<permission allow="true">Write</permission>
<permission allow="te">Write</permission>
<permission allow="false">AddChildren</permission>
</permissions>
<!-- the evaluator is a class implementing the org.alfresco.web.action.ActionEvaluator contract,
@@ -318,7 +318,8 @@
</permissions>
<label-id>create_content</label-id>
<image>/images/icons/new_content.gif</image>
<action>wizard:createContent</action>
<action>createContent</action>
<action-listener>#{CreateContentWizard.startWizard}</action-listener>
</action>
<!-- Create space -->
@@ -378,7 +379,6 @@
</permissions>
<label-id>manage_deleted_items</label-id>
<image>/images/icons/trashcan.gif</image>
<action-listener>#{TrashcanBean.setupTrashcan}</action-listener>
<action>dialog:manageDeletedItems</action>
</action>
@@ -432,6 +432,10 @@
<label-id>other_action</label-id>
<image>/images/icons/action.gif</image>
<action>wizard:runAction</action>
<action-listener>#{WizardManager.setupParameters}</action-listener>
<params>
<param name="id">#{actionContext.id}</param>
</params>
</action>
<!-- Import into Space -->
@@ -581,6 +585,7 @@
<action idref="manage_space_users" />
<action idref="manage_space_rules" />
<action idref="preview_space" />
<action idref="run_action" />
</action-group>
<!-- Actions Menu for File Link Details screen -->

View File

@@ -263,6 +263,7 @@
<action idref="discuss_node" />
<action idref="create_forum_node" />
<action idref="preview_space" />
<action idref="run_action" />
</action-group>
<!-- Actions Menu for Forums Details page -->

View File

@@ -45,18 +45,31 @@
<config evaluator="node-type" condition="dictionaryModel">
<property-sheet>
<show-property name="name" />
<show-property name="mimetype" display-label-id="content_type"
component-generator="MimeTypeSelectorGenerator" />
<show-property name="title" />
<show-property name="description" />
<show-property name="size" display-label-id="size"
converter="org.alfresco.faces.ByteSizeConverter"
show-in-edit-mode="false" />
<show-property name="modelActive"/>
</property-sheet>
</config>
<config evaluator="node-type" condition="app:filelink">
<property-sheet>
<show-property name="name" />
<show-property name="title" />
<show-property name="description" />
<show-property name="destination" converter="org.alfresco.faces.DisplayPathConverter"/>
</property-sheet>
</config>
<config evaluator="node-type" condition="app:folderlink">
<property-sheet>
<show-property name="name" />
<show-property name="description" />
<show-property name="destination" converter="org.alfresco.faces.DisplayPathConverter"/>
</property-sheet>
</config>
@@ -133,4 +146,11 @@
</property-sheet>
</config>
<config evaluator="aspect-name" condition="sys:archived">
<property-sheet>
<show-property name="sys:archivedBy" />
<show-property name="sys:archivedDate" />
</property-sheet>
</config>
</alfresco-config>

View File

@@ -20,6 +20,7 @@ import java.util.Enumeration;
import java.util.Locale;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import java.util.Vector;
import org.alfresco.error.AlfrescoRuntimeException;
import org.apache.log4j.Logger;
@@ -28,6 +29,7 @@ import org.apache.log4j.Priority;
/**
* Wrapper around Alfresco Resource Bundle objects. Used to catch and handle missing
* resource exception to help identify missing I18N strings in client apps.
* Also used to look for the requested string in a custom resource bundle.
*
* @author Kevin Roast
*/
@@ -36,43 +38,91 @@ public final class ResourceBundleWrapper extends ResourceBundle
private static Logger logger = Logger.getLogger(ResourceBundleWrapper.class);
private ResourceBundle delegate;
private ResourceBundle delegateCustom;
/**
* Constructor
*
* @param bundle The ResourceBundle to route calls too
* @param customBundle A custom version of bundle to look in if the string is
* not found in bundle
*/
private ResourceBundleWrapper(ResourceBundle bundle)
private ResourceBundleWrapper(ResourceBundle bundle, ResourceBundle customBundle)
{
this.delegate = bundle;
this.delegateCustom = customBundle;
}
/**
* @see java.util.ResourceBundle#getKeys()
*/
public Enumeration<String> getKeys()
{
if (this.delegateCustom == null)
{
return this.delegate.getKeys();
}
else
{
// get existing keys
Enumeration<String> keys = this.delegate.getKeys();
Enumeration<String> customKeys = this.delegateCustom.getKeys();
// combine keys into one list
Vector<String> allKeys = new Vector<String>(100, 2);
while (keys.hasMoreElements())
{
allKeys.add(keys.nextElement());
}
while (customKeys.hasMoreElements())
{
allKeys.add(customKeys.nextElement());
}
return allKeys.elements();
}
}
/**
* @see java.util.ResourceBundle#handleGetObject(java.lang.String)
*/
protected Object handleGetObject(String key)
{
Object result = null;
try
{
return this.delegate.getObject(key);
result = this.delegate.getObject(key);
}
catch (MissingResourceException err)
{
// if the string wasn't found in the normal bundle
// try the custom bundle if there is one
try
{
if (this.delegateCustom != null)
{
result = this.delegateCustom.getObject(key);
}
}
catch (MissingResourceException mre)
{
// don't do anything here, dealt with below
}
// if the key was not found return a default string
if (result == null)
{
if (logger.isEnabledFor(Priority.WARN))
logger.warn("Failed to find I18N message string key: " + key);
return "$$" + key + "$$";
result = "$$" + key + "$$";
}
}
return result;
}
/**
* Factory method to get a named wrapped resource bundle for a particular locale.
*
@@ -89,7 +139,48 @@ public final class ResourceBundleWrapper extends ResourceBundle
throw new AlfrescoRuntimeException("Unable to load Alfresco messages bundle: " + name);
}
// also look up the custom version of the bundle in the extension package
String customName = determineCustomBundleName(name);
ResourceBundle customBundle = null;
try
{
customBundle = ResourceBundle.getBundle(customName, locale);
if (logger.isDebugEnabled())
logger.debug("Located and loaded custom bundle: " + customName);
}
catch (MissingResourceException mre)
{
// ignore the error, just leave custom bundle as null
}
// apply our wrapper to catch MissingResourceException
return new ResourceBundleWrapper(bundle);
return new ResourceBundleWrapper(bundle, customBundle);
}
/**
* Determines the name for the custom bundle to lookup based on the given
* bundle name
*
* @param bundleName The standard bundle
* @return The name of the custom bundle (in the alfresco.extension package)
*/
protected static String determineCustomBundleName(String bundleName)
{
String extensionPackage = "alfresco.extension.";
String customBundleName = null;
int idx = bundleName.lastIndexOf(".");
if (idx == -1)
{
customBundleName = extensionPackage + bundleName;
}
else
{
customBundleName = extensionPackage +
bundleName.substring(idx+1, bundleName.length());
}
return customBundleName;
}
}

View File

@@ -71,18 +71,23 @@ public final class ExecuteScriptCommand implements Command
"Unable to execute ExecuteScriptCommand - mandatory parameter not supplied: " + PROP_USERPERSON);
}
// get the optional document context ref
// get the optional document and space context ref
NodeService nodeService = serviceRegistry.getNodeService();
NodeRef docRef = (NodeRef)properties.get(PROP_DOCUMENT);
NodeRef spaceRef = null;
if (docRef != null)
{
spaceRef = nodeService.getPrimaryParent(docRef).getParentRef();
}
// build the model needed to execute the script
NodeService nodeService = serviceRegistry.getNodeService();
Map<String, Object> model = RhinoScriptService.buildDefaultModel(
serviceRegistry,
personRef,
new NodeRef(Repository.getStoreRef(), Application.getCompanyRootId()),
(NodeRef)nodeService.getProperty(personRef, ContentModel.PROP_HOMEFOLDER),
docRef,
nodeService.getPrimaryParent(docRef).getParentRef(),
spaceRef,
DefaultModelHelper.imageResolver);
// execute the script and return the result

View File

@@ -17,8 +17,10 @@
package org.alfresco.web.bean;
import java.text.MessageFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Map;
@@ -42,6 +44,7 @@ import org.alfresco.service.cmr.search.ResultSetRow;
import org.alfresco.service.cmr.search.SearchParameters;
import org.alfresco.service.cmr.search.SearchService;
import org.alfresco.service.namespace.QName;
import org.alfresco.util.CachingDateFormat;
import org.alfresco.web.app.Application;
import org.alfresco.web.app.context.IContextListener;
import org.alfresco.web.bean.repository.MapNode;
@@ -49,8 +52,11 @@ 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.UIModeList;
import org.alfresco.web.ui.common.component.data.UIRichList;
/**
@@ -58,6 +64,15 @@ import org.alfresco.web.ui.common.component.data.UIRichList;
*/
public class TrashcanBean implements IContextListener
{
private static final String FILTER_DATE_ALL = "all";
private static final String FILTER_DATE_TODAY = "today";
private static final String FILTER_DATE_WEEK = "week";
private static final String FILTER_DATE_MONTH = "month";
private static final String FILTER_USER_ALL = "all";
private static final String FILTER_USER_USER = "user";
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";
@@ -70,10 +85,15 @@ public class TrashcanBean implements IContextListener
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 USER_ATTR = Repository.escapeQName(ContentModel.PROP_ARCHIVED_BY);
private final static String DATE_ATTR = Repository.escapeQName(ContentModel.PROP_ARCHIVED_DATE);
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 +116,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<Node> listedItems = Collections.<Node>emptyList();
@@ -105,6 +127,18 @@ 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;
/** Date filter selection */
private String dateFilter = FILTER_DATE_ALL;
/** User filter selection */
private String userFilter = FILTER_USER_ALL;
/** User filter search box text */
private String userSearchText = null;
// ------------------------------------------------------------------------------
// Bean property getters and setters
@@ -173,6 +207,115 @@ 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 Returns the dateFilter.
*/
public String getDateFilter()
{
return this.dateFilter;
}
/**
* @param dateFilter The dateFilter to set.
*/
public void setDateFilter(String dateFilter)
{
this.dateFilter = dateFilter;
}
/**
* @return Returns the userFilter.
*/
public String getUserFilter()
{
return this.userFilter;
}
/**
* @param userFilter The userFilter to set.
*/
public void setUserFilter(String userFilter)
{
this.userFilter = userFilter;
}
/**
* @return Returns the userSearchText.
*/
public String getUserSearchText()
{
return this.userSearchText;
}
/**
* @param userSearchText The userSearchText to set.
*/
public void setUserSearchText(String userSearchText)
{
this.userSearchText = userSearchText;
}
/**
* @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.
*/
@@ -224,7 +367,7 @@ public class TrashcanBean implements IContextListener
// get the root node to the deleted items store
if (getArchiveRootRef() != null && this.showItems == true)
{
String query = getSearchQuery();
String query = buildSearchQuery();
SearchParameters sp = new SearchParameters();
sp.setLanguage(SearchService.LANGUAGE_LUCENE);
sp.setQuery(query);
@@ -244,27 +387,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 +432,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 +456,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 +482,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 +546,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 +580,9 @@ public class TrashcanBean implements IContextListener
contextUpdated();
}
/**
* Delete single item OK button handler
*/
public String deleteItemOK()
{
Node item = getItem();
@@ -421,6 +607,9 @@ public class TrashcanBean implements IContextListener
return OUTCOME_DIALOGCLOSE;
}
/**
* Recover single item OK button handler
*/
public String recoverItemOK()
{
String outcome = null;
@@ -434,7 +623,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:
@@ -491,14 +689,6 @@ public class TrashcanBean implements IContextListener
return outcome;
}
/**
* Action handler to reset all filters and search
*/
public void resetAll(ActionEvent event)
{
// TODO: reset all filter and search
}
/**
* Action handler to initially setup the trashcan screen
*/
@@ -507,6 +697,28 @@ public class TrashcanBean implements IContextListener
contextUpdated();
}
/**
* Action handler called when the Date filter is changed by the user
*/
public void dateFilterChanged(ActionEvent event)
{
UIModeList filterComponent = (UIModeList)event.getComponent();
setDateFilter(filterComponent.getValue().toString());
contextUpdated();
this.showItems = true;
}
/**
* Action handler called when the User filter is changed by the user
*/
public void userFilterChanged(ActionEvent event)
{
UIModeList filterComponent = (UIModeList)event.getComponent();
setUserFilter(filterComponent.getValue().toString());
contextUpdated();
this.showItems = true;
}
// ------------------------------------------------------------------------------
// Private helpers
@@ -526,7 +738,7 @@ public class TrashcanBean implements IContextListener
/**
* @return the search query to use when displaying the list of deleted items
*/
private String getSearchQuery()
private String buildSearchQuery()
{
String query;
if (this.searchText == null || this.searchText.length() == 0)
@@ -540,16 +752,84 @@ 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_QUOTED, archiveRootRef, ContentModel.ASPECT_ARCHIVED, safeText, safeText);
query = String.format(SEARCH_NAME, archiveRootRef, ContentModel.ASPECT_ARCHIVED, safeText);
}
}
else
{
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);
}
}
}
// append user search clause
String username = null;
if (isAdminUser() == false)
{
// prefix the current username
username = Application.getCurrentUser(FacesContext.getCurrentInstance()).getUserName();
}
else if (FILTER_USER_USER.equals(getUserFilter()))
{
// append the entered user if admin has requested a search
username = getUserSearchText();
}
if (username != null && username.length() != 0)
{
query = String.format(SEARCH_USERPREFIX, username) + query;
}
// append date search clause
if (FILTER_DATE_ALL.equals(getDateFilter()) == false)
{
Date toDate = new Date();
Date fromDate = null;
if (FILTER_DATE_TODAY.equals(getDateFilter()))
{
fromDate = new Date(toDate.getYear(), toDate.getMonth(), toDate.getDate(), 0, 0, 0);
}
else if (FILTER_DATE_WEEK.equals(getDateFilter()))
{
fromDate = new Date(toDate.getTime() - (1000L*60L*60L*24L*7L));
}
else if (FILTER_DATE_MONTH.equals(getDateFilter()))
{
fromDate = new Date(toDate.getTime() - (1000L*60L*60L*24L*30L));
}
if (fromDate != null)
{
SimpleDateFormat df = CachingDateFormat.getDateFormat();
String strFromDate = QueryParser.escape(df.format(fromDate));
String strToDate = QueryParser.escape(df.format(toDate));
StringBuilder buf = new StringBuilder(128);
buf.append("@").append(DATE_ATTR)
.append(":").append("[").append(strFromDate)
.append(" TO ").append(strToDate).append("] AND ");
query = buf.toString() + query;
}
}
return query;
}
private boolean isAdminUser()
{
return Application.getCurrentUser(FacesContext.getCurrentInstance()).isAdmin();
}
// ------------------------------------------------------------------------------
// IContextListener implementation

View File

@@ -1,13 +1,21 @@
package org.alfresco.web.bean.actions;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.ResourceBundle;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import org.alfresco.service.cmr.action.Action;
import org.alfresco.service.cmr.action.ActionDefinition;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.web.app.Application;
import org.alfresco.web.bean.repository.Repository;
import org.alfresco.web.data.IDataContainer;
import org.alfresco.web.data.QuickSort;
/**
* Bean implementation for the "Run Action" wizard.
@@ -37,12 +45,38 @@ public class RunActionWizard extends BaseActionWizard
action.setParameterValues(repoActionParams);
// execute the action on the current document node
this.actionService.executeAction(action, this.browseBean.getDocument().getNodeRef());
NodeRef nodeRef = new NodeRef(Repository.getStoreRef(), this.parameters.get("id"));
this.actionService.executeAction(action, nodeRef);
}
return outcome;
}
@Override
public List<SelectItem> getActions()
{
if (this.actions == null)
{
NodeRef nodeRef = new NodeRef(Repository.getStoreRef(), this.parameters.get("id"));
List<ActionDefinition> ruleActions = this.actionService.getActionDefinitions(nodeRef);
this.actions = new ArrayList<SelectItem>();
for (ActionDefinition ruleActionDef : ruleActions)
{
this.actions.add(new SelectItem(ruleActionDef.getName(), ruleActionDef.getTitle()));
}
// make sure the list is sorted by the label
QuickSort sorter = new QuickSort(this.actions, "label", true, IDataContainer.SORT_CASEINSENSITIVE);
sorter.sort();
// add the select an action item at the start of the list
this.actions.add(0, new SelectItem("null",
Application.getMessage(FacesContext.getCurrentInstance(), "select_an_action")));
}
return this.actions;
}
@Override
protected String doPostCommitProcessing(FacesContext context, String outcome)
{

View File

@@ -1,13 +1,19 @@
package org.alfresco.web.bean.content;
import java.io.File;
import java.io.Serializable;
import java.text.MessageFormat;
import java.util.HashMap;
import java.util.Map;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import org.alfresco.model.ContentModel;
import org.alfresco.repo.content.MimetypeMap;
import org.alfresco.repo.content.filestore.FileContentReader;
import org.alfresco.service.cmr.repository.ContentReader;
import org.alfresco.service.namespace.QName;
import org.alfresco.web.app.Application;
import org.alfresco.web.bean.FileUploadBean;
import org.alfresco.web.bean.repository.Node;
@@ -29,6 +35,25 @@ public class AddContentDialog extends BaseContentWizard
protected String finishImpl(FacesContext context, String outcome)
throws Exception
{
// Try and extract metadata from the file
ContentReader cr = new FileContentReader(this.file);
cr.setMimetype(this.mimeType);
// create properties for content type
Map<QName, Serializable> contentProps = new HashMap<QName, Serializable>(5, 1.0f);
if (Repository.extractMetadata(FacesContext.getCurrentInstance(), cr, contentProps))
{
this.author = (String)(contentProps.get(ContentModel.PROP_AUTHOR));
this.title = (String)(contentProps.get(ContentModel.PROP_TITLE));
this.description = (String)(contentProps.get(ContentModel.PROP_DESCRIPTION));
}
// default the title to the file name if not set
if (this.title == null)
{
this.title = this.fileName;
}
saveContent(this.file, null);
// return default outcome

View File

@@ -358,13 +358,10 @@ public abstract class BaseContentWizard extends BaseWizardBean
Repository.resolveToQName(this.objectType));
NodeRef fileNodeRef = fileInfo.getNodeRef();
// set the author aspect (if we have one)
if (this.author != null && this.author.length() > 0)
{
// set the author aspect
Map<QName, Serializable> authorProps = new HashMap<QName, Serializable>(1, 1.0f);
authorProps.put(ContentModel.PROP_AUTHOR, this.author);
this.nodeService.addAspect(fileNodeRef, ContentModel.ASPECT_AUTHOR, authorProps);
}
if (logger.isDebugEnabled())
logger.debug("Created file node for file: " + this.fileName);

View File

@@ -92,11 +92,13 @@ 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!");
}
if (val != null)
{
boolean isBreadcrumb = false;
Boolean breadcrumb = (Boolean)component.getAttributes().get("breadcrumb");
if (breadcrumb != null)
@@ -158,6 +160,7 @@ public class NodePathLinkRenderer extends BaseRenderer
throw new RuntimeException(err);
}
}
}
/**
* Return the path with each element as a single clickable link e.g. breadcrumb style

View File

@@ -923,6 +923,10 @@
<from-outcome>deleteListedItems</from-outcome>
<to-view-id>/jsp/trashcan/delete-listed.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>itemDetails</from-outcome>
<to-view-id>/jsp/trashcan/item-details.jsp</to-view-id>
</navigation-case>
</navigation-rule>
</faces-config>

View File

@@ -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;

View File

@@ -106,7 +106,7 @@
<table cellpadding="2" cellspacing="2" border="0">
<tr><td class="paddingRow"></td></tr>
<tr>
<td class="mainSubText">1. <h:outputText value="#{msg.locate_document}"/></td>
<td class="mainSubText">1. <h:outputText value="#{msg.locate_doc_upload}"/></td>
</tr>
<tr><td class="paddingRow"></td></tr>
<r:uploadForm>

View File

@@ -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" %>
<r:page titleId="title_deleted_item_details">
<f:view>
<%-- load a bundle of properties with I18N strings --%>
<f:loadBundle basename="alfresco.messages.webclient" var="msg"/>
<h:form acceptCharset="UTF-8" id="deleteditem-details">
<%-- Main outer table --%>
<table cellspacing="0" cellpadding="2">
<%-- Title bar --%>
<tr>
<td colspan="2">
<%@ include file="../parts/titlebar.jsp" %>
</td>
</tr>
<%-- Main area --%>
<tr valign="top">
<%-- Shelf --%>
<td>
<%@ include file="../parts/shelf.jsp" %>
</td>
<%-- Work Area --%>
<td width="100%">
<table cellspacing="0" cellpadding="0" width="100%">
<%-- Breadcrumb --%>
<%@ include file="../parts/breadcrumb.jsp" %>
<%-- Status and Actions --%>
<tr>
<td style="background-image: url(<%=request.getContextPath()%>/images/parts/statuspanel_4.gif)" width="4"></td>
<td bgcolor="#EEEEEE">
<%-- Status and Actions inner contents table --%>
<%-- Generally this consists of an icon, textual summary and actions for the current object --%>
<table cellspacing="4" cellpadding="0" width="100%">
<tr>
<td width="32">
<img src="<%=request.getContextPath()%>/images/icons/details_large.gif" width=32 height=32>
</td>
<td>
<div class="mainTitle">
<h:outputText value="#{msg.details_of}" /> '<h:outputText value="#{TrashcanBean.item.name}" />'
</div>
<div class="mainSubText">
<h:outputText value="#{msg.original_location}" />: <r:nodePath value="#{TrashcanBean.item.properties.locationPath}" breadcrumb="true" actionListener="#{BrowseBean.clickSpacePath}" />
</div>
<div class="mainSubText"><h:outputText value="#{msg.deleteditem_details_description}" /></div>
</td>
</tr>
</table>
</td>
<td style="background-image: url(<%=request.getContextPath()%>/images/parts/statuspanel_6.gif)" width="4"></td>
</tr>
<%-- separator row with gradient shadow --%>
<tr>
<td><img src="<%=request.getContextPath()%>/images/parts/statuspanel_7.gif" width="4" height="9"></td>
<td style="background-image: url(<%=request.getContextPath()%>/images/parts/statuspanel_8.gif)"></td>
<td><img src="<%=request.getContextPath()%>/images/parts/statuspanel_9.gif" width="4" height="9"></td>
</tr>
<%-- Details --%>
<tr valign=top>
<td style="background-image: url(<%=request.getContextPath()%>/images/parts/whitepanel_4.gif)" width="4"></td>
<td>
<table cellspacing="0" cellpadding="3" border="0" width="100%">
<tr>
<td width="100%" valign="top">
<a:panel label="#{msg.view_links}" id="link-panel" progressive="true"
border="white" bgcolor="white" titleBorder="blue" titleBgcolor="#D3E6FE">
<table width="100%" cellspacing="2" cellpadding="2" border="0" align="center">
<tr>
<td>
<a:actionLink value="#{msg.view_in_browser}" href="#{TrashcanBean.itemBrowserUrl}" target="new" id="link1" rendered="#{TrashcanBean.item.properties.isFolder == false}" />
</td>
<td>
<a:actionLink value="#{msg.download_content}" href="#{TrashcanBean.itemDownloadUrl}" target="new" id="link2" rendered="#{TrashcanBean.item.properties.isFolder == false}" />
</td>
<td>
<a href='<a:outputText value="#{TrashcanBean.itemNodeRefUrl}" id="out1" />' onclick="return false;"><a:outputText value="#{msg.noderef_link}" id="out4" /></a>
</td>
</tr>
</table>
</a:panel>
<div style="padding:4px"></div>
<a:panel label="#{msg.properties}" id="properties-panel" progressive="true"
border="white" bgcolor="white" titleBorder="blue" titleBgcolor="#D3E6FE">
<table cellspacing="0" cellpadding="0" border="0" width="100%">
<tr>
<td width=80 align=center>
<%-- icon image for the object --%>
<table cellspacing=0 cellpadding=0 border=0>
<tr>
<td>
<div style="border: thin solid #CCCCCC; padding:4px">
<a:actionLink id="logo-content" value="#{TrashcanBean.item.name}" href="#{TrashcanBean.itemDownloadUrl}" target="new" rendered="#{TrashcanBean.item.properties.isFolder == false}"
image="#{TrashcanBean.item.properties.icon}" showLink="false" />
<a:actionLink id="logo-folder" value="#{TrashcanBean.item.name}" rendered="#{TrashcanBean.item.properties.isFolder == true}"
image="#{TrashcanBean.item.properties.icon}" showLink="false" />
</div>
</td>
<td><img src="<%=request.getContextPath()%>/images/parts/rightSideShadow42.gif" width=6 height=42></td>
</tr>
<tr>
<td colspan=2><img src="<%=request.getContextPath()%>/images/parts/bottomShadow42.gif" width=48 height=5></td>
</tr>
</table>
</td>
<td>
<%-- properties for the item --%>
<r:propertySheetGrid id="item-props" value="#{TrashcanBean.item}" var="itemProps"
columns="1" mode="view" labelStyleClass="propertiesLabel" externalConfig="true" />
<h:messages globalOnly="true" id="props-msgs" styleClass="errorMessage" layout="table" />
<h:message for="item-props" styleClass="statusMessage" />
</td>
</tr>
</table>
</a:panel>
</td>
<td valign="top">
<% PanelGenerator.generatePanelStart(out, request.getContextPath(), "blue", "#D3E6FE"); %>
<table cellpadding="1" cellspacing="1" border="0" width="100%">
<tr>
<td align="center">
<h:commandButton value="#{msg.close}" action="dialog:close" styleClass="wizardButton" />
</td>
</tr>
</table>
<% PanelGenerator.generatePanelEnd(out, request.getContextPath(), "blue"); %>
<div style="padding:4px"></div>
<%-- Item Actions --%>
<a:panel label="#{msg.actions}" id="actions-panel" border="white" bgcolor="white" titleBorder="blue" titleBgcolor="#D3E6FE" style="text-align:center;white-space:nowrap" progressive="true">
<a:actionLink value="#{msg.recover}" image="/images/icons/recover.gif" action="dialog:recoverItem" padding="3">
<f:param name="id" value="#{TrashcanBean.item.id}" />
</a:actionLink>
<a:actionLink value="#{msg.delete}" image="/images/icons/delete.gif" action="dialog:deleteItem" padding="3">
<f:param name="id" value="#{TrashcanBean.item.id}" />
</a:actionLink>
</a:panel>
</td>
</tr>
</table>
</td>
<td style="background-image: url(<%=request.getContextPath()%>/images/parts/whitepanel_6.gif)" width="4"></td>
</tr>
<%-- separator row with bottom panel graphics --%>
<tr>
<td><img src="<%=request.getContextPath()%>/images/parts/whitepanel_7.gif" width="4" height="4"></td>
<td width="100%" align="center" style="background-image: url(<%=request.getContextPath()%>/images/parts/whitepanel_8.gif)"></td>
<td><img src="<%=request.getContextPath()%>/images/parts/whitepanel_9.gif" width="4" height="4"></td>
</tr>
</table>
</td>
</tr>
</table>
</h:form>
</f:view>
</r:page>

View File

@@ -98,14 +98,41 @@
<% PanelGenerator.generatePanelStart(out, request.getContextPath(), "white", "white"); %>
<table cellpadding="2" cellspacing="2" border="0">
<tr>
<td class="mainSubTitle">
<td colspan=2 class="mainSubTitle">
<h:outputFormat value="#{msg.recover_item_confirm}">
<f:param value="#{TrashcanBean.item.name}"/>
</h:outputFormat>
</td>
</tr>
<tr><td colspan=2 class="paddingRow"></td></tr>
<tr>
<td colspan=2>
<% PanelGenerator.generatePanelStart(out, request.getContextPath(), "yellowInner", "#ffffcc"); %>
<table cellpadding="0" cellspacing="0" border="0" width="100%">
<tr>
<td valign=top style="padding-top:2px" width=20><h:graphicImage url="/images/icons/info_icon.gif" width="16" height="16"/></td>
<td class="mainSubText">
<h:outputText value="#{msg.alternative_destination}" />
</td>
</tr>
</table>
<% PanelGenerator.generatePanelEnd(out, request.getContextPath(), "yellowInner"); %>
</td>
</tr>
<tr><td colspan=2 class="paddingRow"></td></tr>
<tr>
<td>
<h:outputText value="#{msg.destination}" />:&nbsp;
</td>
<td width=100%>
<r:spaceSelector id="space-selector" label="#{msg.select_destination_prompt}"
value="#{TrashcanBean.destination}" styleClass="selector" />
</td>
</tr>
<tr><td colspan=2 class="paddingRow"></td></tr>
<tr>
<td colspan=2>
<%-- Error Messages --%>
<%-- messages tag to show messages not handled by other specific message tags --%>
<h:messages globalOnly="true" styleClass="errorMessage" layout="table" />

View File

@@ -40,13 +40,29 @@
{
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;
}
}
function userSearch(e)
{
var keycode;
if (window.event) keycode = window.event.keyCode;
else if (e) keycode = e.which;
if (keycode == 13)
{
document.forms['trashcan']['trashcan:modelist'].value='trashcan:user-filter:user';
document.forms['trashcan'].submit();
return false;
}
return true;
}
</script>
<f:view>
@@ -123,7 +139,7 @@
<td width="100%" valign="top">
<%-- Deleted Items List --%>
<a:panel id="trashcan-panel" border="white" bgcolor="white" titleBorder="blue" titleBgcolor="#D3E6FE" styleClass="mainSubTitle" label="#{msg.deleted_items}">
<a:panel id="trashcan-panel" border="white" bgcolor="white" titleBorder="blue" titleBgcolor="#D3E6FE" styleClass="mainSubTitle" label="#{TrashcanBean.panelMessage}">
<% PanelGenerator.generatePanelStart(out, request.getContextPath(), "yellowInner", "#ffffcc"); %>
<table cellpadding="0" cellspacing="0" border="0" width="100%">
@@ -139,28 +155,63 @@
<%-- Search controls --%>
<div style="padding: 4px;"></div>
<h:inputText id="search-text" value="#{TrashcanBean.searchText}" size="35" maxlength="1024" onkeyup="updateButtonState();" onchange="updateButtonState();" />&nbsp;
<h:commandButton id="search-btn" value="#{msg.search_deleted_items}" actionListener="#{TrashcanBean.search}" disabled="true" />&nbsp;
<h:commandButton id="search-btn1" value="#{msg.search_deleted_items_name}" actionListener="#{TrashcanBean.searchName}" disabled="true" />&nbsp;
<h:commandButton id="search-btn2" value="#{msg.search_deleted_items_text}" actionListener="#{TrashcanBean.searchContent}" disabled="true" />&nbsp;
<h:commandButton id="clear-btn" value="#{msg.show_all}" actionListener="#{TrashcanBean.clearSearch}" />
<div style="padding: 4px;"></div>
<%-- Filter controls --%>
<table cellspacing=2 cellpadding=0 width=100%>
<tr>
<td>...TODO: Date filter here...</td>
<td align=right><h:commandButton id="reset-btn" value="#{msg.resetall}" actionListener="#{TrashcanBean.resetAll}" /></td>
</tr>
<td class="filterBorders" width=100%>
<table cellspacing=2 cellpadding=0 width=100%>
<tr>
<td>...TODO: Username filter here - admin only...</td>
<td></td>
<td><img src="<%=request.getContextPath()%>/images/icons/filter.gif" width=16 height=16></td>
<td style="padding-left:8px;width:120px"><nobr><h:outputText value="#{msg.date_filter_when}" />:</nobr></td>
<td width=100%>
<a:modeList itemSpacing="2" iconColumnWidth="0" horizontal="true" selectedLinkStyle="font-weight:bold"
value="#{TrashcanBean.dateFilter}" actionListener="#{TrashcanBean.dateFilterChanged}">
<a:listItem value="all" label="#{msg.date_filter_all}" />
<a:listItem value="today" label="#{msg.date_filter_today}" />
<a:listItem value="week" label="#{msg.date_filter_week}" />
<a:listItem value="month" label="#{msg.date_filter_month}" />
</a:modeList>
</td>
</tr>
</table>
</td>
</tr>
<%-- Only the admin user needs the username filter --%>
<a:panel id="userfilter-panel" rendered="#{NavigationBean.currentUser.admin == true}">
<tr>
<td class="filterBorders" width=100%>
<table cellspacing=2 cellpadding=0 width=100%>
<tr>
<td><img src="<%=request.getContextPath()%>/images/icons/filter.gif" width=16 height=16></td>
<td style="padding-left:8px;width:120px"><nobr><h:outputText value="#{msg.user_filter_who}" />:</nobr></td>
<td width=100%>
<table cellspacing=0 cellpadding=0 border=0><tr><td>
<a:modeList id="user-filter" itemSpacing="2" iconColumnWidth="0" horizontal="true" selectedLinkStyle="font-weight:bold"
value="#{TrashcanBean.userFilter}" actionListener="#{TrashcanBean.userFilterChanged}">
<a:listItem value="all" label="#{msg.user_filter_all}" />
<a:listItem value="user" label="#{msg.user_filter_user}" />
</a:modeList>
</td><td>
<h:inputText id="user-search" value="#{TrashcanBean.userSearchText}" size="12" maxlength="100" style="font-size:10px" onkeyup="return userSearch(event);" />
</td></tr></table>
</td>
</tr>
</table>
</td>
</tr>
</a:panel>
</table>
<%-- TODO: only show user filter for admin user --%>
<div style="padding: 4px;"></div>
<%-- Recover Listed Items button --%>
<h:commandButton value="#{msg.recover_listed_items}" action="dialog:recoverListedItems" />&nbsp;
<h:commandButton value="#{msg.delete_listed_items}" action="dialog:deleteListedItems" />
<%-- Recover Listed Items actions --%>
<a:actionLink value="#{msg.recover_listed_items}" image="/images/icons/recover_all.gif" action="dialog:recoverListedItems" />&nbsp;
<a:actionLink value="#{msg.delete_listed_items}" image="/images/icons/delete_all.gif" action="dialog:deleteListedItems"/>
<div style="padding: 4px;"></div>
<a:richList id="trashcan-list" binding="#{TrashcanBean.itemsRichList}" viewMode="details" pageSize="10"
@@ -168,14 +219,18 @@
value="#{TrashcanBean.items}" var="r" initialSortColumn="deletedDate" initialSortDescending="true">
<%-- Primary column showing item name --%>
<a:column primary="true" width="200" style="padding:2px;text-align:left">
<a:column primary="true" width="150" style="padding:2px;text-align:left">
<f:facet name="header">
<a:sortLink label="#{msg.name}" value="name" mode="case-insensitive" styleClass="header"/>
</f:facet>
<f:facet name="small-icon">
<a:actionLink value="#{r.name}" href="#{r.url}" target="new" image="#{r.typeIcon}" showLink="false" styleClass="inlineAction" />
<a:actionLink value="#{r.name}" action="dialog:itemDetails" actionListener="#{TrashcanBean.setupItemAction}" image="#{r.typeIcon}" showLink="false" styleClass="inlineAction">
<f:param name="id" value="#{r.id}" />
</a:actionLink>
</f:facet>
<a:actionLink value="#{r.name}" href="#{r.url}" target="new" />
<a:actionLink value="#{r.name}" action="dialog:itemDetails" actionListener="#{TrashcanBean.setupItemAction}">
<f:param name="id" value="#{r.id}" />
</a:actionLink>
</a:column>
<%-- Original Location Path column --%>
@@ -183,11 +238,11 @@
<f:facet name="header">
<a:sortLink label="#{msg.original_location}" value="displayPath" styleClass="header"/>
</f:facet>
<r:nodePath value="#{r.locationPath}" actionListener="#{BrowseBean.clickSpacePath}" />
<r:nodePath value="#{r.locationPath}" actionListener="#{BrowseBean.clickSpacePath}" showLeaf="#{r.isFolder == false}" />
</a:column>
<%-- Deleted Date column --%>
<a:column style="text-align:left">
<a:column style="text-align:left;white-space:nowrap">
<f:facet name="header">
<a:sortLink label="#{msg.deleted_date}" value="deletedDate" styleClass="header"/>
</f:facet>