diff --git a/source/java/org/alfresco/web/app/AlfrescoNavigationHandler.java b/source/java/org/alfresco/web/app/AlfrescoNavigationHandler.java index 978bf86817..9a0fabb997 100644 --- a/source/java/org/alfresco/web/app/AlfrescoNavigationHandler.java +++ b/source/java/org/alfresco/web/app/AlfrescoNavigationHandler.java @@ -26,6 +26,7 @@ import javax.faces.context.FacesContext; import org.alfresco.config.Config; import org.alfresco.config.ConfigService; +import org.alfresco.web.app.servlet.ExternalAccessServlet; import org.alfresco.web.bean.NavigationBean; import org.alfresco.web.bean.dialog.DialogManager; import org.alfresco.web.bean.repository.Node; @@ -623,14 +624,28 @@ public class AlfrescoNavigationHandler extends NavigationHandler } else { - // we are trying to close a dialog when one hasn't been opened! - // log a warning and return a null outcome to stay on the same page - if (logger.isWarnEnabled()) + // the details pages can be loaded via the external access servlet, + // if this is the case the details page would not have been loaded as + // a dialog, in this scenario just use the global "browse" outcome. + String referer = (String)context.getExternalContext(). + getRequestHeaderMap().get("referer"); + if ((referer != null) && + ((referer.indexOf(ExternalAccessServlet.OUTCOME_DOCDETAILS) != -1) || + (referer.indexOf(ExternalAccessServlet.OUTCOME_SPACEDETAILS) != -1))) { - logger.warn("Attempting to close a " + closingItem + " with an empty view stack, returning null outcome"); + navigate(context, fromAction, "browse"); + } + else + { + // we are trying to close a dialog when one hasn't been opened! + // log a warning and return a null outcome to stay on the same page + if (logger.isWarnEnabled()) + { + logger.warn("Attempting to close a " + closingItem + " with an empty view stack, returning null outcome"); + } + + navigate(context, fromAction, null); } - - navigate(context, fromAction, null); } } diff --git a/source/java/org/alfresco/web/app/servlet/ExternalAccessServlet.java b/source/java/org/alfresco/web/app/servlet/ExternalAccessServlet.java index e32021a615..5bdc7383d9 100644 --- a/source/java/org/alfresco/web/app/servlet/ExternalAccessServlet.java +++ b/source/java/org/alfresco/web/app/servlet/ExternalAccessServlet.java @@ -62,11 +62,11 @@ public class ExternalAccessServlet extends BaseServlet private static Log logger = LogFactory.getLog(ExternalAccessServlet.class); - private final static String OUTCOME_DOCDETAILS = "showDocDetails"; - private final static String OUTCOME_SPACEDETAILS = "showSpaceDetails"; - private final static String OUTCOME_BROWSE = "browse"; - private final static String OUTCOME_MYALFRESCO = "myalfresco"; - private final static String OUTCOME_LOGOUT = "logout"; + public final static String OUTCOME_DOCDETAILS = "showDocDetails"; + public final static String OUTCOME_SPACEDETAILS = "showSpaceDetails"; + public final static String OUTCOME_BROWSE = "browse"; + public final static String OUTCOME_MYALFRESCO = "myalfresco"; + public final static String OUTCOME_LOGOUT = "logout"; private static final String ARG_TEMPLATE = "template"; private static final String ARG_PAGE = "page"; diff --git a/source/java/org/alfresco/web/bean/AdvancedSearchBean.java b/source/java/org/alfresco/web/bean/AdvancedSearchBean.java index 05f2451530..d883f16ac4 100644 --- a/source/java/org/alfresco/web/bean/AdvancedSearchBean.java +++ b/source/java/org/alfresco/web/bean/AdvancedSearchBean.java @@ -57,6 +57,7 @@ import org.alfresco.service.namespace.NamespaceService; import org.alfresco.service.namespace.QName; import org.alfresco.service.namespace.RegexQNamePattern; import org.alfresco.util.CachingDateFormat; +import org.alfresco.util.ISO9075; import org.alfresco.web.app.Application; import org.alfresco.web.bean.SearchContext.RangeProperties; import org.alfresco.web.bean.repository.MapNode; @@ -1375,7 +1376,8 @@ public class AdvancedSearchBean { FacesContext fc = FacesContext.getCurrentInstance(); User user = Application.getCurrentUser(fc); - String xpath = NamespaceService.APP_MODEL_PREFIX + ":" + QName.createValidLocalName(user.getUserName()); + String userName = ISO9075.encode(user.getUserName()); + String xpath = NamespaceService.APP_MODEL_PREFIX + ":" + QName.createValidLocalName(userName); List results = null; try diff --git a/source/java/org/alfresco/web/bean/users/UsersBean.java b/source/java/org/alfresco/web/bean/users/UsersBean.java index a03197a32d..5e6ee539d3 100644 --- a/source/java/org/alfresco/web/bean/users/UsersBean.java +++ b/source/java/org/alfresco/web/bean/users/UsersBean.java @@ -35,6 +35,7 @@ import org.alfresco.service.cmr.search.SearchParameters; import org.alfresco.service.cmr.search.SearchService; import org.alfresco.service.cmr.security.AuthenticationService; import org.alfresco.service.cmr.security.PersonService; +import org.alfresco.util.ISO9075; import org.alfresco.web.app.Application; import org.alfresco.web.app.context.IContextListener; import org.alfresco.web.app.context.UIContextService; @@ -413,10 +414,11 @@ public class UsersBean implements IContextListener tx.begin(); // define the query to find people by their first or last name + String search = ISO9075.encode(this.searchCriteria); String query = "( TYPE:\"{http://www.alfresco.org/model/content/1.0}person\") AND " + - "((@\\{http\\://www.alfresco.org/model/content/1.0\\}firstName:" + this.searchCriteria + - "*) OR (@\\{http\\://www.alfresco.org/model/content/1.0\\}lastName:" + this.searchCriteria + - "*) OR (@\\{http\\://www.alfresco.org/model/content/1.0\\}userName:" + this.searchCriteria + + "((@\\{http\\://www.alfresco.org/model/content/1.0\\}firstName:" + search + + "*) OR (@\\{http\\://www.alfresco.org/model/content/1.0\\}lastName:" + search + + "*) OR (@\\{http\\://www.alfresco.org/model/content/1.0\\}userName:" + search + "*)))"; if (logger.isDebugEnabled()) diff --git a/source/java/org/alfresco/web/ui/common/renderer/ImagePickerRadioRenderer.java b/source/java/org/alfresco/web/ui/common/renderer/ImagePickerRadioRenderer.java index dc7a8b1ebe..e3212a7212 100644 --- a/source/java/org/alfresco/web/ui/common/renderer/ImagePickerRadioRenderer.java +++ b/source/java/org/alfresco/web/ui/common/renderer/ImagePickerRadioRenderer.java @@ -50,6 +50,7 @@ public class ImagePickerRadioRenderer extends BaseRenderer private int columns; private int position; private boolean open; + private boolean imageSelected = false; // ------------------------------------------------------------------------------ // Renderer implemenation @@ -89,6 +90,7 @@ public class ImagePickerRadioRenderer extends BaseRenderer this.columns = 1; this.position = 0; this.open = false; + this.imageSelected = false; ResponseWriter out = context.getResponseWriter(); @@ -210,6 +212,14 @@ public class ImagePickerRadioRenderer extends BaseRenderer ResponseWriter out = context.getResponseWriter(); out.write(""); + + // if we didn't select any image, default to the first one + if (this.imageSelected == false) + { + out.write("\n\n"); + } } /** @@ -275,6 +285,7 @@ public class ImagePickerRadioRenderer extends BaseRenderer if (itemValue != null && itemValue.equals(currentValue)) { out.write(" checked='true'"); + this.imageSelected = true; } if (tooltip != null) diff --git a/source/java/org/alfresco/web/ui/repo/component/property/BaseAssociationEditor.java b/source/java/org/alfresco/web/ui/repo/component/property/BaseAssociationEditor.java index 1bf6901a1f..b79bceb239 100644 --- a/source/java/org/alfresco/web/ui/repo/component/property/BaseAssociationEditor.java +++ b/source/java/org/alfresco/web/ui/repo/component/property/BaseAssociationEditor.java @@ -32,6 +32,7 @@ import javax.faces.event.AbortProcessingException; import javax.faces.event.ActionEvent; import javax.faces.event.FacesEvent; +import org.alfresco.model.ContentModel; import org.alfresco.service.cmr.dictionary.AssociationDefinition; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; @@ -698,9 +699,17 @@ public abstract class BaseAssociationEditor extends UIInput } out.write("'>"); - out.write(Repository.getDisplayPath(nodeService.getPath(targetRef))); - out.write("/"); - out.write(Repository.getNameForNode(nodeService, targetRef)); + if (ContentModel.TYPE_PERSON.equals(nodeService.getType(targetRef))) + { + out.write((String)nodeService.getProperty(targetRef, ContentModel.PROP_USERNAME)); + } + else + { + out.write(Repository.getDisplayPath(nodeService.getPath(targetRef))); + out.write("/"); + out.write(Repository.getNameForNode(nodeService, targetRef)); + } + out.write(""); - out.write(Repository.getDisplayPath(nodeService.getPath(item))); - out.write("/"); - out.write(Repository.getNameForNode(nodeService, item)); + // if the node represents a person, show the username instead of the name + if (ContentModel.TYPE_PERSON.equals(nodeService.getType(item))) + { + out.write((String)nodeService.getProperty(item, ContentModel.PROP_USERNAME)); + } + else + { + out.write(Repository.getDisplayPath(nodeService.getPath(item))); + out.write("/"); + out.write(Repository.getNameForNode(nodeService, item)); + } out.write(""); } } @@ -852,17 +869,31 @@ public abstract class BaseAssociationEditor extends UIInput if (assocDef != null) { // find and show all the available options for the current association + String type = assocDef.getTargetClass().getName().toString(); StringBuilder query = new StringBuilder("+TYPE:\""); - query.append(assocDef.getTargetClass().getName().toString()); + query.append(type); query.append("\""); if (contains != null && contains.length() > 0) { String safeContains = Utils.remove(contains.trim(), "\""); - String nameAttr = Repository.escapeQName(QName.createQName(NamespaceService.CONTENT_MODEL_1_0_URI, "name")); - query.append(" AND +@"); - query.append(nameAttr); + + // if the association's target is the person type search on the + // username instead of the name property + if (type.equals(ContentModel.TYPE_PERSON.toString())) + { + String userName = Repository.escapeQName(QName.createQName( + NamespaceService.CONTENT_MODEL_1_0_URI, "userName")); + query.append(userName); + } + else + { + String nameAttr = Repository.escapeQName(QName.createQName( + NamespaceService.CONTENT_MODEL_1_0_URI, "name")); + query.append(nameAttr); + } + query.append(":*" + safeContains + "*"); } diff --git a/source/java/org/alfresco/web/ui/repo/component/property/UIAssociationEditor.java b/source/java/org/alfresco/web/ui/repo/component/property/UIAssociationEditor.java index 3f9a10a2bc..dbd65eaf0d 100644 --- a/source/java/org/alfresco/web/ui/repo/component/property/UIAssociationEditor.java +++ b/source/java/org/alfresco/web/ui/repo/component/property/UIAssociationEditor.java @@ -26,6 +26,7 @@ import java.util.Map; import javax.faces.context.FacesContext; import javax.faces.context.ResponseWriter; +import org.alfresco.model.ContentModel; import org.alfresco.service.cmr.repository.AssociationRef; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; @@ -152,9 +153,18 @@ public class UIAssociationEditor extends BaseAssociationEditor { out.write(""); AssociationRef assoc = (AssociationRef)iter.next(); - out.write(Repository.getDisplayPath(nodeService.getPath(assoc.getTargetRef()))); - out.write("/"); - out.write(Repository.getNameForNode(nodeService, assoc.getTargetRef())); + NodeRef targetNode = assoc.getTargetRef(); + // if the node represents a person, show the username instead of the name + if (ContentModel.TYPE_PERSON.equals(nodeService.getType(targetNode))) + { + out.write((String)nodeService.getProperty(targetNode, ContentModel.PROP_USERNAME)); + } + else + { + out.write(Repository.getDisplayPath(nodeService.getPath(targetNode))); + out.write("/"); + out.write(Repository.getNameForNode(nodeService, targetNode)); + } out.write(""); } diff --git a/source/java/org/alfresco/web/ui/repo/component/property/UIChildAssociationEditor.java b/source/java/org/alfresco/web/ui/repo/component/property/UIChildAssociationEditor.java index 3c0d510a41..9d693ffc36 100644 --- a/source/java/org/alfresco/web/ui/repo/component/property/UIChildAssociationEditor.java +++ b/source/java/org/alfresco/web/ui/repo/component/property/UIChildAssociationEditor.java @@ -26,6 +26,7 @@ import java.util.Map; import javax.faces.context.FacesContext; import javax.faces.context.ResponseWriter; +import org.alfresco.model.ContentModel; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; @@ -152,9 +153,19 @@ public class UIChildAssociationEditor extends BaseAssociationEditor { out.write(""); ChildAssociationRef assoc = (ChildAssociationRef)iter.next(); - out.write(Repository.getDisplayPath(nodeService.getPath(assoc.getChildRef()))); - out.write("/"); - out.write(Repository.getNameForNode(nodeService, assoc.getChildRef())); + NodeRef targetNode = assoc.getChildRef(); + // if the node represents a person, show the username instead of the name + if (ContentModel.TYPE_PERSON.equals(nodeService.getType(targetNode))) + { + out.write((String)nodeService.getProperty(targetNode, ContentModel.PROP_USERNAME)); + } + else + { + out.write(Repository.getDisplayPath(nodeService.getPath(targetNode))); + out.write("/"); + out.write(Repository.getNameForNode(nodeService, targetNode)); + } + out.write(""); }