From 9a48f004fd29d45955f86f5729ce39de6bb1a87a Mon Sep 17 00:00:00 2001 From: Kevin Roast Date: Thu, 29 Nov 2007 15:33:09 +0000 Subject: [PATCH] User Profile additions (for collaboration UI) - various new fields in User Profile screen including use of ajax file picker for Avatar image selection git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@7480 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- config/alfresco/messages/webclient.properties | 6 ++ .../web/bean/users/EditUserDetailsDialog.java | 66 +++++++++++++++++-- .../web/bean/users/UsersBeanProperties.java | 28 ++++++++ .../ui/repo/component/BaseAjaxItemPicker.java | 10 ++- source/web/css/main.css | 12 ++++ source/web/jsp/users/edit-user-details.jsp | 27 +++++++- source/web/jsp/users/user-console.jsp | 50 +++++++++++--- 7 files changed, 182 insertions(+), 17 deletions(-) diff --git a/config/alfresco/messages/webclient.properties b/config/alfresco/messages/webclient.properties index 316d05c3ed..376901d561 100644 --- a/config/alfresco/messages/webclient.properties +++ b/config/alfresco/messages/webclient.properties @@ -1286,6 +1286,11 @@ home_space_location=Home Space Location home_space_name=Home Space Name presence_provider=Presence Provider presence_username=Presence Username +user_organization=Organization +user_jobtitle=Job Title +user_location=Location +user_description=Biography +user_avatar=Photo # Trashcan messages title_deleted_items=Deleted Items @@ -1435,6 +1440,7 @@ interface_language=Interface Language content_language_filter=Content Language Filter content_all_languages=All Languages user_management=Management +select_avatar_prompt=Click here to select an Avatar image # Delete Space Dialog messages select_delete_operation=What do you want to delete? diff --git a/source/java/org/alfresco/web/bean/users/EditUserDetailsDialog.java b/source/java/org/alfresco/web/bean/users/EditUserDetailsDialog.java index 72abfc4793..8294d7e915 100644 --- a/source/java/org/alfresco/web/bean/users/EditUserDetailsDialog.java +++ b/source/java/org/alfresco/web/bean/users/EditUserDetailsDialog.java @@ -26,11 +26,14 @@ package org.alfresco.web.bean.users; import java.io.Serializable; import java.text.MessageFormat; +import java.util.List; import java.util.Map; import javax.faces.context.FacesContext; import org.alfresco.model.ContentModel; +import org.alfresco.service.cmr.repository.AssociationRef; +import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.namespace.QName; import org.alfresco.web.app.Application; import org.alfresco.web.bean.dialog.BaseDialogBean; @@ -46,6 +49,7 @@ public class EditUserDetailsDialog extends BaseDialogBean { private Node person; protected UsersBeanProperties properties; + private NodeRef photoRef; /** * @param properties the properties to set @@ -68,14 +72,42 @@ public class EditUserDetailsDialog extends BaseDialogBean try { Map props = this.nodeService.getProperties(getPerson().getNodeRef()); - props.put(ContentModel.PROP_FIRSTNAME, getFirstName()); - props.put(ContentModel.PROP_LASTNAME, getLastName()); - props.put(ContentModel.PROP_EMAIL, getEmail()); + //props.put(ContentModel.PROP_FIRSTNAME, getFirstName()); + //props.put(ContentModel.PROP_LASTNAME, getLastName()); + //props.put(ContentModel.PROP_EMAIL, getEmail()); + for (String key : getPerson().getProperties().keySet()) + { + props.put(QName.createQName(key), (Serializable)getPerson().getProperties().get(key)); + } - // persist changes - this.nodeService.setProperties(getPerson().getNodeRef(), props); + // crop person description to 1024 chars as HTML TextArea has no limiter + String personDesc = (String)props.get(ContentModel.PROP_PERSONDESC); + if (personDesc != null && personDesc.length() > 1024) + { + personDesc = personDesc.substring(0, 1024); + props.put(ContentModel.PROP_PERSONDESC, personDesc); + } - // if the above call was successful, then reset Person Node in the session + // persist all property changes + NodeRef personRef = getPerson().getNodeRef(); + this.nodeService.setProperties(personRef, props); + + // setup user avatar association + if (this.photoRef != null) + { + List refs = this.nodeService.getTargetAssocs(personRef, ContentModel.ASSOC_AVATAR); + // remove old association if it exists + if (refs.size() == 1) + { + NodeRef existingRef = refs.get(0).getTargetRef(); + this.nodeService.removeAssociation( + personRef, existingRef, ContentModel.ASSOC_AVATAR); + } + // setup new association + this.nodeService.createAssociation(personRef, this.photoRef, ContentModel.ASSOC_AVATAR); + } + + // if the above calls were successful, then reset Person Node in the session Application.getCurrentUser(context).reset(); } catch (Throwable err) @@ -121,4 +153,26 @@ public class EditUserDetailsDialog extends BaseDialogBean person.getProperties().put(ContentModel.PROP_LASTNAME.toString(), lastName); } + public Map getPersonProperties() + { + return person.getProperties(); + } + + public NodeRef getPersonPhotoRef() + { + if (this.photoRef == null) + { + List refs = this.nodeService.getTargetAssocs(person.getNodeRef(), ContentModel.ASSOC_AVATAR); + if (refs.size() == 1) + { + this.photoRef = refs.get(0).getTargetRef(); + } + } + return this.photoRef; + } + + public void setPersonPhotoRef(NodeRef ref) + { + this.photoRef = ref; + } } diff --git a/source/java/org/alfresco/web/bean/users/UsersBeanProperties.java b/source/java/org/alfresco/web/bean/users/UsersBeanProperties.java index fabfec5ec6..10e3b3e775 100644 --- a/source/java/org/alfresco/web/bean/users/UsersBeanProperties.java +++ b/source/java/org/alfresco/web/bean/users/UsersBeanProperties.java @@ -24,13 +24,19 @@ */ package org.alfresco.web.bean.users; +import java.util.List; + 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; import org.alfresco.service.cmr.search.SearchService; import org.alfresco.service.cmr.security.AuthenticationService; import org.alfresco.service.cmr.security.PersonService; import org.alfresco.service.cmr.usage.ContentUsageService; +import org.alfresco.web.app.servlet.DownloadContentServlet; import org.alfresco.web.bean.repository.Node; +import org.alfresco.web.ui.common.Utils; import org.alfresco.web.ui.common.component.data.UIRichList; public class UsersBeanProperties @@ -257,4 +263,26 @@ public class UsersBeanProperties { return this.contentUsageService.getEnabled(); } + + public String getPersonDescription() + { + String desc = (String)this.person.getProperties().get(ContentModel.PROP_PERSONDESC); + return desc != null ? Utils.stripUnsafeHTMLTags(desc).replace("\r\n", "

") : null; + } + + public String getAvatarUrl() + { + String avatarUrl = null; + + List refs = this.nodeService.getTargetAssocs(this.person.getNodeRef(), ContentModel.ASSOC_AVATAR); + // remove old association if it exists + if (refs.size() == 1) + { + NodeRef photoRef = refs.get(0).getTargetRef(); + String name = (String)this.nodeService.getProperty(photoRef, ContentModel.PROP_NAME); + avatarUrl = DownloadContentServlet.generateBrowserURL(photoRef, name); + } + + return avatarUrl; + } } diff --git a/source/java/org/alfresco/web/ui/repo/component/BaseAjaxItemPicker.java b/source/java/org/alfresco/web/ui/repo/component/BaseAjaxItemPicker.java index 6180b9244e..ba30228690 100644 --- a/source/java/org/alfresco/web/ui/repo/component/BaseAjaxItemPicker.java +++ b/source/java/org/alfresco/web/ui/repo/component/BaseAjaxItemPicker.java @@ -355,7 +355,15 @@ public abstract class BaseAjaxItemPicker extends UIInput ValueBinding vb = getValueBinding("initialSelection"); if (vb != null) { - this.initialSelectionId = (String)vb.getValue(getFacesContext()); + Object objSelection = vb.getValue(getFacesContext()); + if (objSelection instanceof NodeRef) + { + this.initialSelectionId = ((NodeRef)objSelection).toString(); + } + else + { + this.initialSelectionId = (String)objSelection; + } } return this.initialSelectionId; diff --git a/source/web/css/main.css b/source/web/css/main.css index afc87a6457..cbdbd13d58 100644 --- a/source/web/css/main.css +++ b/source/web/css/main.css @@ -489,6 +489,18 @@ a.topToolbarLinkHighlight, a.topToolbarLinkHighlight:link, a.topToolbarLinkHighl vertical-align: top; } +.userPropertyLabel +{ + vertical-align: top; + white-space: nowrap; +} + +.userPropertyValue +{ + vertical-align: top; + padding-right: 16px; +} + .summaryPopupPanel { background-image: url(../images/parts/popup_bg.gif); diff --git a/source/web/jsp/users/edit-user-details.jsp b/source/web/jsp/users/edit-user-details.jsp index ae6e431e87..bbf38c8992 100644 --- a/source/web/jsp/users/edit-user-details.jsp +++ b/source/web/jsp/users/edit-user-details.jsp @@ -60,7 +60,7 @@ function updateButtonState() - + @@ -72,6 +72,31 @@ function updateButtonState() + + + + + + + + + + + + + + + + + + + + + diff --git a/source/web/jsp/users/user-console.jsp b/source/web/jsp/users/user-console.jsp index b4fa950253..7ade804801 100644 --- a/source/web/jsp/users/user-console.jsp +++ b/source/web/jsp/users/user-console.jsp @@ -41,20 +41,52 @@ facetsId="dialog:dialog-body:mydetails-panel-facets" border="white" bgcolor="white" titleBorder="lbgrey" expandedTitleBorder="dotted" titleBgcolor="white"> - - - + + + + + + + + + + + + + +

+ +
+ + - - - - - + + + + + + + + + + + + + +
+ + +
+ + +
+
+ <%-- context for current user is setup on entry to user console --%>