From f279d99d80341c15312561dc906f72206e6e6029 Mon Sep 17 00:00:00 2001 From: Derek Hulley Date: Tue, 11 Sep 2007 03:39:41 +0000 Subject: [PATCH] Merged V2.1 to HEAD 6609: Portlet UI (doclist, myspaces, mytasks) updates following design review 6610: AR-1270 6611: debugging WCM-778. 6612: Improved API documentation. 6613: Added store lookup cache to EHCache config for default and extended cluster sample 6614: AWC-1531 and AWC-1146. Link objects that have targets which the user does not have access to are now filtered from the view. 6615: AR-1664: Bootstraping from full export fails if file names differs only with a space: my file, my file 6616: Fixed AR-1519: Possible duplicate entries when moving nodes between stores 6617: Removed deprecated aspects; Added emailed aspect to messages; Added OOo command line options 6618: Fix for AWC-1350 6619: Fix for AWC-1509 6620: AWC-1179: Searching for users in Invite User Wizard is slow with large number of users 6621: Changed shutdown logic to avoid classloader cleanup race. 6622: Fix for AWC-1533 (can't save office docs to Company Home) 6623: Fix for AR-1705 6624: Better fix for AWC-1256 (links generated by tinyMCE editor) 6625: Fixed AR-1713: Transformers that do nothing don't break full text indexing 6626: Fixed AWC-1438: Added explcit TXT to PDF converter that wraps the PDFBox TextToPDF class 6627: Portlet templates now handle missing description property on web form 6628: Fix WCM-788 6635: Make workflow available for users who cannot see company home Resolved conflicted state of 'root\projects\repository\source\java\org\alfresco\repo\workflow\jbpm\JBPMEngine.java' git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@6748 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../client/doclist_preview_panel.ftl | 20 +- .../client/myspaces_preview_panel.ftl | 24 +- .../alfresco/portlets/doclist.get.html.ftl | 107 +++++-- .../portlets/doclistpanel.get.html.ftl | 4 +- .../alfresco/portlets/mytasks.get.html.ftl | 263 ++++++++++++++---- .../portlets/mytaskspanel.get.html.ftl | 52 ++-- .../alfresco/portlets/mywebforms.get.html.ftl | 2 +- config/alfresco/web-client-config.xml | 6 +- .../org/alfresco/web/bean/BrowseBean.java | 77 +++-- .../alfresco/web/bean/wcm/SubmitDialog.java | 13 +- .../web/bean/wizard/InviteUsersWizard.java | 16 +- .../bean/workflow/StartWorkflowWizard.java | 10 +- .../web/forms/xforms/Schema2XFormsTest.java | 20 ++ .../unit-tests/automated/number-test.xsd | 9 + .../unit-tests/repeat-tests/repeat-multi.xsd | 2 +- source/web/WEB-INF/faces-config-beans.xml | 4 + .../images/icons/close_portlet_animation.gif | Bin 0 -> 1001 bytes .../web/images/icons/close_portlet_static.gif | Bin 0 -> 653 bytes .../web/images/parts/doclist_arrow_down.png | Bin 0 -> 3378 bytes source/web/images/parts/doclist_arrow_up.png | Bin 0 -> 3374 bytes .../web/images/parts/doclist_item_marker.png | Bin 0 -> 3021 bytes .../web/images/parts/marker_effect_left.png | Bin 0 -> 3249 bytes .../web/images/parts/marker_effect_right.png | Bin 0 -> 2079 bytes .../web/images/parts/mytasks_arrow_down.png | Bin 0 -> 3021 bytes source/web/images/parts/mytasks_arrow_up.png | Bin 0 -> 2996 bytes .../web/images/parts/task_btn_normal_left.png | Bin 0 -> 3024 bytes .../images/parts/task_btn_normal_right.png | Bin 0 -> 427 bytes .../images/parts/task_btn_rollover_left.png | Bin 0 -> 3036 bytes .../images/parts/task_btn_rollover_right.png | Bin 0 -> 446 bytes .../create-content-wizard/create-html.jsp | 9 +- source/web/jsp/dialog/edit-html-inline.jsp | 10 +- source/web/scripts/ajax/common.js | 2 +- source/web/scripts/ajax/doclist.js | 80 +++++- source/web/scripts/ajax/mytasks.js | 137 +++++++-- source/web/scripts/ajax/mywebfiles.js | 2 +- source/web/scripts/ajax/mywebforms.js | 2 +- 36 files changed, 677 insertions(+), 194 deletions(-) create mode 100644 source/web/images/icons/close_portlet_animation.gif create mode 100644 source/web/images/icons/close_portlet_static.gif create mode 100644 source/web/images/parts/doclist_arrow_down.png create mode 100644 source/web/images/parts/doclist_arrow_up.png create mode 100644 source/web/images/parts/doclist_item_marker.png create mode 100644 source/web/images/parts/marker_effect_left.png create mode 100644 source/web/images/parts/marker_effect_right.png create mode 100644 source/web/images/parts/mytasks_arrow_down.png create mode 100644 source/web/images/parts/mytasks_arrow_up.png create mode 100644 source/web/images/parts/task_btn_normal_left.png create mode 100644 source/web/images/parts/task_btn_normal_right.png create mode 100644 source/web/images/parts/task_btn_rollover_left.png create mode 100644 source/web/images/parts/task_btn_rollover_right.png diff --git a/config/alfresco/templates/client/doclist_preview_panel.ftl b/config/alfresco/templates/client/doclist_preview_panel.ftl index 5ef812137d..d20baf463f 100644 --- a/config/alfresco/templates/client/doclist_preview_panel.ftl +++ b/config/alfresco/templates/client/doclist_preview_panel.ftl @@ -13,34 +13,44 @@ - + + + + + +
+ <#assign navurl='/navigate/showDocDetails/' + node.nodeRef.storeRef.protocol + '/' + node.nodeRef.storeRef.identifier + '/' + node.nodeRef.id> -<#if node.isLocked > +<#if node.isLocked> <#elseif hasAspect(node, "cm:workingcopy") == 1> <#else> -<#if node.isLocked > +<#if node.isLocked> <#else> -<#if node.isLocked > +<#if node.isLocked> <#else> - + +<#if node.isLocked> + +<#else> +
(Locked)onclick='event.cancelBubble=true;MyDocs.checkinItem("${node.name}", "${node.nodeRef}");'>Check Inonclick='event.cancelBubble=true;MyDocs.checkoutItem("${node.name}", "${node.nodeRef}");'>Check Out Edit DetailsEdit Details
UpdateUpdate View ContentDownload
Deleteonclick='event.cancelBubble=true;MyDocs.deleteItem("${node.name}", "${node.nodeRef}");'>Delete More Actions...
diff --git a/config/alfresco/templates/client/myspaces_preview_panel.ftl b/config/alfresco/templates/client/myspaces_preview_panel.ftl index 2088e520f4..090943b349 100644 --- a/config/alfresco/templates/client/myspaces_preview_panel.ftl +++ b/config/alfresco/templates/client/myspaces_preview_panel.ftl @@ -33,29 +33,33 @@ <#assign navurl='/navigate/showDocDetails/' + node.nodeRef.storeRef.protocol + '/' + node.nodeRef.storeRef.identifier + '/' + node.nodeRef.id> <#if node.isDocument> -<#if node.isLocked> + <#if node.isLocked> (Locked) -<#elseif hasAspect(node, "cm:workingcopy") == 1> + <#elseif hasAspect(node, "cm:workingcopy") == 1> onclick='event.cancelBubble=true;MySpaces.checkinItem("${node.name}", "${node.nodeRef}");'>Check In -<#else> + <#else> onclick='event.cancelBubble=true;MySpaces.checkoutItem("${node.name}", "${node.nodeRef}");'>Check Out - -<#if node.isLocked > + + <#if node.isLocked> Edit Details -<#else> + <#else> Edit Details - + -<#if node.isLocked > + <#if node.isLocked> Update -<#else> + <#else> Update - + View Content + <#if node.isLocked> + Delete + <#else> onclick='event.cancelBubble=true;MySpaces.deleteItem("${node.name}", "${node.nodeRef}");'>Delete + More Actions... <#else> diff --git a/config/alfresco/templates/webscripts/org/alfresco/portlets/doclist.get.html.ftl b/config/alfresco/templates/webscripts/org/alfresco/portlets/doclist.get.html.ftl index b22d94bcd8..a56f6b3a0a 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/portlets/doclist.get.html.ftl +++ b/config/alfresco/templates/webscripts/org/alfresco/portlets/doclist.get.html.ftl @@ -42,17 +42,17 @@ - @@ -61,6 +67,10 @@
- + @@ -75,6 +75,10 @@ MyDocs.Query="${query?replace("\"","\\\"")}"; +
+
+
+
@@ -87,21 +91,29 @@
+ - - - - - - + + + + +
All ItemsWord DocumentsHTML DocumentsPDF DocumentsRecently Modified + All ItemsWord DocumentsHTML DocumentsPDF DocumentsRecently Modified Refresh - +
\ No newline at end of file diff --git a/config/alfresco/templates/webscripts/org/alfresco/portlets/doclistpanel.get.html.ftl b/config/alfresco/templates/webscripts/org/alfresco/portlets/doclistpanel.get.html.ftl index 1cf8cf530a..ad36b534b2 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/portlets/doclistpanel.get.html.ftl +++ b/config/alfresco/templates/webscripts/org/alfresco/portlets/doclistpanel.get.html.ftl @@ -21,8 +21,8 @@
-
- ${d.name?html} +
+ ${d.name?html} diff --git a/config/alfresco/templates/webscripts/org/alfresco/portlets/mytasks.get.html.ftl b/config/alfresco/templates/webscripts/org/alfresco/portlets/mytasks.get.html.ftl index 6e348b525c..7eec8f5267 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/portlets/mytasks.get.html.ftl +++ b/config/alfresco/templates/webscripts/org/alfresco/portlets/mytasks.get.html.ftl @@ -26,13 +26,19 @@
- - - - - - +
Tasks to doDue TodayNext 7 daysNo due dateOverdue - Refresh + +
+ +
+
+ Refresh
@@ -52,7 +58,7 @@
<#-- the count value is retrieved and set dynamically from the AJAX webscript output above --> - Showing 0 <#if filter=4>overdue task(s)<#if filter=1> due today<#if filter=2> due next week<#if filter=3> with no due date set + Showing 0 <#if filter=4>overdue task(s)<#if filter=1> due today<#if filter=2> due next week<#if filter=3> with no due date set
 
+
+
+
+
@@ -110,34 +120,74 @@ overflow: hidden; } -a.taskfilterLink:link, a.taskfilterLink:visited +#taskFilterBar { + float: left; + width: 100%; +} +#taskFilterBar ul { + margin: 0px; + padding: 4px 10px 0px 4px; + list-style: none; +} +#taskFilterBar li { + display: inline; + margin: 0px; + padding: 0px; + height: 27px; +} +#taskFilterBar a { + background: none; + float:left; + margin: 0px; + padding: 0px 0px 0px 4px; + text-decoration: none; + outline: none; +} +#taskFilterBar a span { + background: none; + font-family: Trebuchet MS, Arial, Helvetica, sans-serif; + font-size: 13px; + font-weight: bold; + color: #5A5741; + display: block; + float: none; + padding: 5px 15px 4px 6px; +} + +#taskFilterBar a:hover { + background: url("${url.context}/images/parts/marker_effect_left.png") no-repeat left top; +} + +#taskFilterBar a:hover span { + background: url("${url.context}/images/parts/marker_effect_right.png") no-repeat right top; + color: #ffffff !important; +} + +#taskFilterBar .taskCurrent a { + background: url("${url.context}/images/parts/marker_effect_left.png") no-repeat left top; +} +#taskFilterBar .taskCurrent a span { + background: url("${url.context}/images/parts/marker_effect_right.png") no-repeat right top; + color: #ffffff !important; +} + +.refreshViewLink, .refreshViewLink +{ + text-decoration: none !important; +} +.refreshViewLink span { color: #5A5741; font-family: Trebuchet MS, Arial, Helvetica, sans-serif; font-size: 13px; font-weight: bold; - text-decoration: none; - padding-left: 4px; - padding-right: 4px; -} - -a.taskfilterLink:hover -{ - color: #FFFFFF !important; - background-color: #FDB64F; -} - -a.taskfilterLinkSelected:link, a.taskfilterLinkSelected:visited -{ - color: #FFFFFF !important; - background-color: #FDB64F; } .taskRow { padding-top: 4px; + border-top: 1px solid transparent; border-bottom: 1px solid #EBE398; - border-top: 1px solid #FEF8BC; } #taskFooter @@ -170,8 +220,8 @@ a.taskfilterLinkSelected:link, a.taskfilterLinkSelected:visited font-family: Trebuchet MS, Arial, Helvetica, sans-serif; font-size: 14px; color: #5A5741; - margin: 0 0 0 24; - padding: 0px 8px 6px 8px; + margin: 0px 0px 0px 24px; + padding: 0px 8px 8px; } .taskItemOverdue @@ -199,23 +249,38 @@ a.taskfilterLinkSelected:link, a.taskfilterLinkSelected:visited font-family: Trebuchet MS, Arial, Helvetica, sans-serif; font-size: 12px; margin: 0px; + padding: 0px; display: none; overflow: hidden; } +.taskDetailTopSpacer { + padding: 4px 0px 0px; +} + +.taskDetailSeparator +{ + border-right: 1px solid #c1af05; +} + .taskItemSelected { - background-color: #FFE500 !important; + background: #FFE500 url("${url.context}/images/parts/mytasks_arrow_down.png") no-repeat right top; border-bottom: 1px solid #82770B !important; border-top: 1px solid #82770B !important; } +.taskItemSelectedOpen +{ + background-image: url("${url.context}/images/parts/mytasks_arrow_up.png") !important; +} + .taskResources { border: 1px solid #FFE500; - background-color: #FEF8BC; + background-color: #fff; margin: 4px 0px 0px 0px; - width: 360px; + width: 300px; height: 80px; display: block; overflow: hidden; @@ -227,7 +292,7 @@ a.taskfilterLinkSelected:link, a.taskfilterLinkSelected:visited .taskResourceOdd { - background-color: #F8FCFD; + background-color: #FEF8BC; } .taskResourceHeader @@ -251,33 +316,90 @@ a.resourceLink:link, a.resourceLink:visited font-family: Trebuchet MS, Arial, Helvetica, sans-serif; } -.taskActions td +.taskAction { - padding: 4px; + margin: 0px; + padding: 0px; } -a.taskAction:link, a.taskAction:visited -{ - color: #5A5741; - font-size: 13px; - font-weight: bold; - font-family: Trebuchet MS, Arial, Helvetica, sans-serif; - border: 1px solid #F6F1BA; - padding-left: 4px; - padding-right: 4px; +.taskAction ul { + margin: 0px; + padding: 0px; + list-style: none; + text-align: center; +} +.taskAction ul li { + display: inline; + margin: 0px; + padding: 0px; + list-style: none; } -a.taskAction:hover -{ - font-size: 13px; - font-weight: bold; - font-family: Trebuchet MS, Arial, Helvetica, sans-serif; - border: 1px solid #F6F1BA; - padding-left: 4px; - padding-right: 4px; - color: #FFFFFF; - background-color: #FDB64F; +.taskAction a { + background: url("${url.context}/images/parts/task_btn_normal_right.png") no-repeat 100% 0; + float: left; + margin: 4px; + padding: 0px; text-decoration: none; + cursor: pointer; +} +.taskAction a span { + background: url("${url.context}/images/parts/task_btn_normal_left.png") no-repeat; + font-family: Trebuchet MS, Arial, Helvetica, sans-serif; + font-size: 11px; + font-weight: bold; + color: #5A5741; + padding: 4px 1.5em; + float: left; +} + +.taskAction a:hover { + background: url("${url.context}/images/parts/task_btn_rollover_right.png") no-repeat 100% 0; + text-decoration: none; +} + +.taskAction a:hover span { + background: url("${url.context}/images/parts/task_btn_rollover_left.png") no-repeat; +} + +.taskManage ul { + margin: 0px; + padding: 4px 0px 0px; + list-style: none; +} +.taskManage li { + display: inline; + margin: 0px; + padding: 0px; + height: 27px; +} + +.taskManage a { + background: url("${url.context}/images/parts/task_btn_normal_left.png") no-repeat left top; + float:left; + margin: 0px; + padding: 0px 0px 0px 8px; + text-decoration: none; + cursor: pointer; +} +.taskManage a span { + background: url("${url.context}/images/parts/task_btn_normal_right.png") no-repeat right top; + font-family: Trebuchet MS, Arial, Helvetica, sans-serif; + font-size: 11px; + font-weight: bold; + color: #5A5741; + display: block; + float: none; + padding: 4px 15px 4px 6px; +} + +.taskManage a:hover { + background: url("${url.context}/images/parts/task_btn_rollover_left.png") no-repeat left top; + text-decoration: none; +} + +.taskManage a:hover span { + background: url("${url.context}/images/parts/task_btn_rollover_right.png") no-repeat right top; } .taskMetadata @@ -321,4 +443,41 @@ a.taskAction:hover height: 6px; width: 4px; } + +#taskMessagePanel +{ + position: absolute; + border: 1px solid #65696C; + background-color: #eeeeee; + width: 250px; + height: 72px; + padding: 8px; + margin-left: 440px; + display: none; + z-index: 1; + -moz-border-radius: 7px; +} + +.taskMessagePanelClose +{ + margin: -4px -4px 2px 2px; + float:right; +} + +#taskMessagePanelCloseImage +{ + cursor: pointer; + display: block; + height: 23px; + width: 23px; +} + +.taskMessagePanelLabel +{ + color: #45494C; + font-family: Trebuchet MS, Arial, Helvetica, sans-serif; + font-size: 12px; + font-weight: bold; +} + \ No newline at end of file diff --git a/config/alfresco/templates/webscripts/org/alfresco/portlets/mytaskspanel.get.html.ftl b/config/alfresco/templates/webscripts/org/alfresco/portlets/mytaskspanel.get.html.ftl index 2ba63ca09c..4d7c01ec54 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/portlets/mytaskspanel.get.html.ftl +++ b/config/alfresco/templates/webscripts/org/alfresco/portlets/mytaskspanel.get.html.ftl @@ -43,37 +43,55 @@
+
- - - - + + + + + +
+ -
Status:
Priority:
Start Date:
Type:
Complete:
  +
${t.name?html}:
- - - <#list t.transitions as wt> - - - - -
${wt.label?html} 
  -
Manage Task
- Manage Task Details -
-
+
  + + + + +
+
+ +
+
  + + + + +
+
+ +
+
+
 
diff --git a/config/alfresco/templates/webscripts/org/alfresco/portlets/mywebforms.get.html.ftl b/config/alfresco/templates/webscripts/org/alfresco/portlets/mywebforms.get.html.ftl index d30b011660..7b6bf0d67e 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/portlets/mywebforms.get.html.ftl +++ b/config/alfresco/templates/webscripts/org/alfresco/portlets/mywebforms.get.html.ftl @@ -48,7 +48,7 @@
${form.properties.title} - <#if form.properties.description?length!=0> + <#if (form.properties.description?exists) && (form.properties.description?length!=0)> (${form.properties.description})
diff --git a/config/alfresco/web-client-config.xml b/config/alfresco/web-client-config.xml index afa7a48ffa..f4f5dbd24a 100644 --- a/config/alfresco/web-client-config.xml +++ b/config/alfresco/web-client-config.xml @@ -224,8 +224,8 @@ - + - - diff --git a/source/java/org/alfresco/web/bean/BrowseBean.java b/source/java/org/alfresco/web/bean/BrowseBean.java index fe41d63dd8..6ad4ce94e2 100644 --- a/source/java/org/alfresco/web/bean/BrowseBean.java +++ b/source/java/org/alfresco/web/bean/BrowseBean.java @@ -60,6 +60,7 @@ import org.alfresco.service.cmr.search.ResultSet; 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.cmr.security.PermissionService; import org.alfresco.service.namespace.QName; import org.alfresco.web.app.Application; import org.alfresco.web.app.context.IContextListener; @@ -787,24 +788,34 @@ public class BrowseBean implements IContextListener { // create our File Link Node representation node = new MapNode(nodeRef, this.nodeService, fileInfo.getProperties()); - node.addPropertyResolver("url", this.resolverLinkUrl); - node.addPropertyResolver("webdavUrl", this.resolverLinkWebdavUrl); - node.addPropertyResolver("cifsPath", this.resolverLinkCifsPath); - node.addPropertyResolver("fileType16", this.resolverFileType16); - node.addPropertyResolver("fileType32", this.resolverFileType32); - node.addPropertyResolver("size", this.resolverSize); - node.addPropertyResolver("lang", this.resolverLang); - - this.contentNodes.add(node); + // only display the user has the permissions to navigate to the target of the link + NodeRef destRef = (NodeRef)node.getProperties().get(ContentModel.PROP_LINK_DESTINATION); + if (new Node(destRef).hasPermission(PermissionService.READ) == true) + { + node.addPropertyResolver("url", this.resolverLinkUrl); + node.addPropertyResolver("webdavUrl", this.resolverLinkWebdavUrl); + node.addPropertyResolver("cifsPath", this.resolverLinkCifsPath); + node.addPropertyResolver("fileType16", this.resolverFileType16); + node.addPropertyResolver("fileType32", this.resolverFileType32); + node.addPropertyResolver("size", this.resolverSize); + node.addPropertyResolver("lang", this.resolverLang); + + this.contentNodes.add(node); + } } else if (ApplicationModel.TYPE_FOLDERLINK.equals(type)) { // create our Folder Link Node representation node = new MapNode(nodeRef, this.nodeService, fileInfo.getProperties()); - node.addPropertyResolver("icon", this.resolverSpaceIcon); - node.addPropertyResolver("smallIcon", this.resolverSmallIcon); - - this.containerNodes.add(node); + // only display the user has the permissions to navigate to the target of the link + NodeRef destRef = (NodeRef)node.getProperties().get(ContentModel.PROP_LINK_DESTINATION); + if (new Node(destRef).hasPermission(PermissionService.READ) == true) + { + node.addPropertyResolver("icon", this.resolverSpaceIcon); + node.addPropertyResolver("smallIcon", this.resolverSmallIcon); + + this.containerNodes.add(node); + } } // inform any listeners that a Node wrapper has been created @@ -954,28 +965,38 @@ public class BrowseBean implements IContextListener { // create our File Link Node representation node = new MapNode(nodeRef, this.nodeService, false); - node.addPropertyResolver("url", this.resolverLinkUrl); - node.addPropertyResolver("webdavUrl", this.resolverLinkWebdavUrl); - node.addPropertyResolver("cifsPath", this.resolverLinkCifsPath); - node.addPropertyResolver("fileType16", this.resolverFileType16); - node.addPropertyResolver("fileType32", this.resolverFileType32); - node.addPropertyResolver("size", this.resolverSize); - node.addPropertyResolver("lang", this.resolverLang); - node.addPropertyResolver("path", this.resolverPath); - node.addPropertyResolver("displayPath", this.resolverDisplayPath); + // only display the user has the permissions to navigate to the target of the link + NodeRef destRef = (NodeRef)node.getProperties().get(ContentModel.PROP_LINK_DESTINATION); + if (new Node(destRef).hasPermission(PermissionService.READ) == true) + { + node.addPropertyResolver("url", this.resolverLinkUrl); + node.addPropertyResolver("webdavUrl", this.resolverLinkWebdavUrl); + node.addPropertyResolver("cifsPath", this.resolverLinkCifsPath); + node.addPropertyResolver("fileType16", this.resolverFileType16); + node.addPropertyResolver("fileType32", this.resolverFileType32); + node.addPropertyResolver("size", this.resolverSize); + node.addPropertyResolver("lang", this.resolverLang); + node.addPropertyResolver("path", this.resolverPath); + node.addPropertyResolver("displayPath", this.resolverDisplayPath); - this.contentNodes.add(node); + this.contentNodes.add(node); + } } else if (ApplicationModel.TYPE_FOLDERLINK.equals(type)) { // create our Folder Link Node representation node = new MapNode(nodeRef, this.nodeService, false); - node.addPropertyResolver("icon", this.resolverSpaceIcon); - node.addPropertyResolver("smallIcon", this.resolverSmallIcon); - node.addPropertyResolver("path", this.resolverPath); - node.addPropertyResolver("displayPath", this.resolverDisplayPath); + // only display the user has the permissions to navigate to the target of the link + NodeRef destRef = (NodeRef)node.getProperties().get(ContentModel.PROP_LINK_DESTINATION); + if (new Node(destRef).hasPermission(PermissionService.READ) == true) + { + node.addPropertyResolver("icon", this.resolverSpaceIcon); + node.addPropertyResolver("smallIcon", this.resolverSmallIcon); + node.addPropertyResolver("path", this.resolverPath); + node.addPropertyResolver("displayPath", this.resolverDisplayPath); - this.containerNodes.add(node); + this.containerNodes.add(node); + } } // inform any listeners that a Node wrapper has been created diff --git a/source/java/org/alfresco/web/bean/wcm/SubmitDialog.java b/source/java/org/alfresco/web/bean/wcm/SubmitDialog.java index b78d9d5c19..6cae008eb1 100644 --- a/source/java/org/alfresco/web/bean/wcm/SubmitDialog.java +++ b/source/java/org/alfresco/web/bean/wcm/SubmitDialog.java @@ -416,7 +416,7 @@ public class SubmitDialog extends BaseDialogBean diffs.add(diff); // recursively remove locks from this item - recursivelyRemoveLocks(storeId, -1, srcPath); + recursivelyRemoveLocks(storeId, -1, this.avmService.lookup(-1, srcPath, true), srcPath); // If nothing has required notifying the virtualization server // so far, check to see if destPath forces a notification @@ -635,9 +635,8 @@ public class SubmitDialog extends BaseDialogBean * Recursively remove locks from a path. Walking child folders looking for files * to remove locks from. */ - private void recursivelyRemoveLocks(String webProject, int version, String path) + private void recursivelyRemoveLocks(String webProject, int version, AVMNodeDescriptor desc, String path) { - AVMNodeDescriptor desc = this.avmService.lookup(version, path, true); if (desc.isFile() || desc.isDeletedFile()) { this.avmLockingService.removeLock(webProject, path.substring(path.indexOf(":") + 1)); @@ -655,10 +654,12 @@ public class SubmitDialog extends BaseDialogBean desc = history.get(1); } - Map list = avmService.getDirectoryListing(desc, true); - for (AVMNodeDescriptor child : list.values()) + Map list = avmService.getDirectoryListingDirect(desc, true); + for (Map.Entry child : list.entrySet()) { - recursivelyRemoveLocks(webProject, version, child.getPath()); + String name = child.getKey(); + AVMNodeDescriptor childDesc = child.getValue(); + recursivelyRemoveLocks(webProject, version, childDesc, path + "/" + name); } } } diff --git a/source/java/org/alfresco/web/bean/wizard/InviteUsersWizard.java b/source/java/org/alfresco/web/bean/wizard/InviteUsersWizard.java index 1cab6dedea..6ec7c7a838 100644 --- a/source/java/org/alfresco/web/bean/wizard/InviteUsersWizard.java +++ b/source/java/org/alfresco/web/bean/wizard/InviteUsersWizard.java @@ -42,6 +42,8 @@ import javax.transaction.UserTransaction; import org.alfresco.model.ContentModel; import org.alfresco.service.cmr.repository.NodeRef; +import org.alfresco.service.cmr.search.ResultSet; +import org.alfresco.service.cmr.search.SearchService; import org.alfresco.service.cmr.security.AuthorityService; import org.alfresco.service.cmr.security.AuthorityType; import org.alfresco.service.cmr.security.PermissionService; @@ -301,16 +303,12 @@ public abstract class InviteUsersWizard extends BaseWizardBean { // build xpath to match available User/Person objects NodeRef peopleRef = personService.getPeopleContainer(); - // NOTE: see SearcherComponentTest - String xpath = "*[like(@" + NamespaceService.CONTENT_MODEL_PREFIX + ":" + "firstName, '%" + contains + "%', false)" + - " or " + "like(@" + NamespaceService.CONTENT_MODEL_PREFIX + ":" + "lastName, '%" + contains + "%', false)]"; - List nodes = searchService.selectNodes( - peopleRef, - xpath, - null, - this.namespaceService, - false); + // Use lucene search to retrieve user details + String lucene = "@" + NamespaceService.CONTENT_MODEL_PREFIX + "\\:firstName:*" + contains + "* " + + "@" + NamespaceService.CONTENT_MODEL_PREFIX + "\\:lastName:*" + contains + "* "; + ResultSet resultSet = searchService.query(peopleRef.getStoreRef(), SearchService.LANGUAGE_LUCENE, lucene); + List nodes = resultSet.getNodeRefs(); items = new SelectItem[nodes.size()]; for (int index=0; index + + + + + + + + + diff --git a/source/test-resources/xforms/unit-tests/repeat-tests/repeat-multi.xsd b/source/test-resources/xforms/unit-tests/repeat-tests/repeat-multi.xsd index 1ec792c0be..99c7df9a55 100644 --- a/source/test-resources/xforms/unit-tests/repeat-tests/repeat-multi.xsd +++ b/source/test-resources/xforms/unit-tests/repeat-tests/repeat-multi.xsd @@ -4,7 +4,7 @@ - + diff --git a/source/web/WEB-INF/faces-config-beans.xml b/source/web/WEB-INF/faces-config-beans.xml index 92001977b1..ca93c5a5b9 100644 --- a/source/web/WEB-INF/faces-config-beans.xml +++ b/source/web/WEB-INF/faces-config-beans.xml @@ -2174,6 +2174,10 @@ workflowService #{WorkflowService} + + + unprotectedNodeService + #{nodeService} diff --git a/source/web/images/icons/close_portlet_animation.gif b/source/web/images/icons/close_portlet_animation.gif new file mode 100644 index 0000000000000000000000000000000000000000..a657c33049f8f4ed5530fafe3dd2839ffb248548 GIT binary patch literal 1001 zcmc(c*-sNu6vl69YpJDLp`gejn^*;LLj^TP(6}W=L7h8~YSagxeImxdz;q~s#wwU- z`~zH23p2H)QlN-CpdunIn~FkP+R}ZA1-w;*@E3S)?tS{5d%p912M+BoC_KF!EC=H_ z&@{IU7zfoFozLet4Gs4X7#mqlFc_S)*#m)KI2`r|0*nGd~vKEFQ{3i&E~tSOj=z{kZak6;hmpR9rMpQR_F=Qdq@5PJ$>txCAIfElEGCkbJm;>tCcvVasIQiRB4Waw@pVkqLI1icrhS1IY_x*J3>Ij=zk7NZks z$c!XV$*uaGKrIDppc2m{ls7?Ly|SQ)N{*K)=JoNxA5niKL7YrQ=_OPv@)IjbQkXxF z6P SbF$V5Pa?H>^wp~sVCOH>Ta&E- literal 0 HcmV?d00001 diff --git a/source/web/images/icons/close_portlet_static.gif b/source/web/images/icons/close_portlet_static.gif new file mode 100644 index 0000000000000000000000000000000000000000..94ea272616d391a40855c71290ec34c6f14c4f2e GIT binary patch literal 653 zcmdVX+fPz)0KoAdaye%>2w5iC+OV8HS3+WW93REPt#11 z<#`@+xPI5`R6hT12BYahjwIPqiKM7vk!>^@MV4LP*j)Vh=}TxO5{>)(i%Y@J<#IU^ zizl~IHIAe5^at0h%j5n2<5zk&^L6dpPI@=7vH2c%77C1a!C$FXw^G~TXe^V-X0o~E z(CW(S8q1c5z|!12u|Nb$r839!Z>Q~l{sI4qE?y)6KnG6k_3k|ZNKUUaJQ+8do|-Ms ztX2_%ic#dibAv<%Ctkp-V(SeN>^ga+_wt2yxKC!0$l=*DS`6=>=rp&&bGR4Nz=Lv= z8iE0>RDcVl*bqcahv5mVrKd%EU7^CxLy<`gheOgs!gU-Zjr(EL+d8j(tu_wA)3{QY zRgO9OhAlSP(e8(0{mgAJj^bvO`%XsRCcz}vUbc_=rj+oKN@F8X+Zf)X?qidR0l+>U zxu;->SBOXHV~mF2O<++@_51G!QOOa_UEnbb-6QhO?#Tz103tg+`6%(`m;zk<3#Pyk Avj6}9 literal 0 HcmV?d00001 diff --git a/source/web/images/parts/doclist_arrow_down.png b/source/web/images/parts/doclist_arrow_down.png new file mode 100644 index 0000000000000000000000000000000000000000..ca53f9bdd32564a0d67c0796466653b4506139ea GIT binary patch literal 3378 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 Eg7-OIiU0rr literal 0 HcmV?d00001 diff --git a/source/web/images/parts/doclist_item_marker.png b/source/web/images/parts/doclist_item_marker.png new file mode 100644 index 0000000000000000000000000000000000000000..1a145f1739088165ef3482b3903c408ffc89ef7d GIT binary patch literal 3021 zcmV;;3o`VHP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0002^Nkl4lkxZVxMxJ6IS7 z2K+(7zZn=9exc!?Q2YalM#kT&#tNaE_d$iTqB!0@d|e^^A$aEKs` zNW$jFq3pTg5JC7NiE*fVY`8=awn$KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0005pNkl?d8LiJbe(;k2EQ#Nq+{VIZ z*6UL%CO2afz_pkgfdV07mzOx;Em(!>96*aK5frShp{l?l4vQzieNz>2ibRj8LRrFQ z1FZ)EB{m~7n@K)`VulG|hLvmZ9uP24^7&5yR3NND6xtSI1d%?BGF^NW1T2Cj0ot(L zBy|KF5E2j)(ZFoGfnHVF{CWt$_$2)eU=cwMRF(Sr5dfjt9mF_jxME>}n?NXcXpDpM zib!So1c*EH-gg(*lNDG(mQrI70z^w8%z8Tt_-)h#hOjpYT^|j_O)tPevV{5epVOnv zPTvvgYuwSco$W5fK2h#H{UCnzgRG#x%07hkp)?)lE428_*Dy6ejxR9`G}|NXdjw>< z_(XHnBt*NQLn24F-lIh=B76O_gYt>EIKM#MZ&0Kg3^|nTJmTHmS4h^RxojbN2tIwI z$8|*0{59h{XF_<)_y&{}*1Z`(%nn_L<@4`SU!5VE^{=q5ccr`4>hYT(*_RL@jz+}U joFF<>1hCcD0r+PCs%+)Y;q0_900000NkvXXu0mjf{j~$+ literal 0 HcmV?d00001 diff --git a/source/web/images/parts/marker_effect_right.png b/source/web/images/parts/marker_effect_right.png new file mode 100644 index 0000000000000000000000000000000000000000..f311160d84955f7ed5bd89d8bc2848434cace4c2 GIT binary patch literal 2079 zcmV+)2;ldLP)# z0q(oO&fMu&o$jv3=?8az{VY_U`qYQ$;@2p(R{FpB{Wyns z_ufA`|Cn$8fB)+)KlkrM2-UUED6URj;!sat#x@txZHw`nF~%}k*(#Pd$8yZi_wErjiKy#8Cw|eL-v9pOqwjv${Bcgr>U}#^nPYzHR9jUY zqS_>5Ic+YRZ#i||9}3BXuT#rJ?-DM>(oB| zwokB|AlyFsO6;Kb1^G&&hU$FI^7zJ!65JFO3FqsTOm9FXG^<<0XJ1r0(jAbl5TDBi~&oKT5;kGy3k! zUP#_I#kOL(_&Ajz-DX4b@5{Y=y7kAJ^@sfrKc&gnNwpb3c2-DhDqw*IEy$Vq3>-zD z7y8*eYXuDgdy~DVN#{0+(PYd{E2;s(NXupNsZP-KhSchuHy&(Uv0NHUXDwN?uG{zL z_n#gSq}QiD@6gjJ3cJ1BMkA8bdCI&Bn5D5vBy7^P_VETNV>$$o5DbDg!o0chTR~9k zwJi8uLKDx{o5_e8;O2y`CsOi*HlE~B{XtZ*TpCNVwDB%|r`Clw&)-j&>tvDMdpUs;=%!bV)JtpY*#Fo!;%28v7>tX|7|_#!?&;-l5k_1v8~D}& ztX}3HJ8caEMh0|b0hg#fG+S^s+8+4X70a7pS)jqC9VW=?Y+MJyTZHF@7mfoPXWlsE z+}Q<>VnH`%&;@2lC?12+Xv3ZMNtxivE2ABrfz=n(7FPZ{JHkSTXK29=<2f#LN!E~x z<)T<-uA?FW((tZ1eU)a0#8G|YB2WgD*vT%SY?5r>B=Lhel zWLmNX8SBHc2|U>aa2`mdMg(ar#LI&qj5%+vKW%163CWKZi%`B&9r&?)mJqV_cwHlz~)TR~9}=ln#qxF}&cWEY&6@&h#D+SUo!Mu5(9 z2iw0^2B)~{fAvOqT+>R=iOJO<5swS&BtKK~8KYX*I=7j#&XVTMK zK1ZDh2hOmwu6d3+RV?4ine>#N&<7uXN)I0Xy^^k*Z#C(Bo&L0%?g)uN6|_#m08}s; zvx#a*aI7Ra2*OGs5aR0LdKrVx^cbm5M#n`Z7_<|P1)O!=9aSus!cx?&CfnOg*6aO$ z>Dq2}=c0M=@M1S_+SJU4qKsuO+>6E35%7YCd~EK;8Ykc3yPSBRC*cE&qVIA_8GnBG zE~lhQOX|GOcts5>fWci(J2~(WQFl4lqSXA>rT2bm#uB=Jey=wx)~7yN;otpynnwQ#FaUQbG0i;eSaJXW002ov JPDHLkV1iL9|2Y5v literal 0 HcmV?d00001 diff --git a/source/web/images/parts/mytasks_arrow_down.png b/source/web/images/parts/mytasks_arrow_down.png new file mode 100644 index 0000000000000000000000000000000000000000..009a3631dc32c84441b0615c87121ae60eb19478 GIT binary patch literal 3021 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 P00000NkvXXu0mjfEv%E< literal 0 HcmV?d00001 diff --git a/source/web/images/parts/mytasks_arrow_up.png b/source/web/images/parts/mytasks_arrow_up.png new file mode 100644 index 0000000000000000000000000000000000000000..8d31b87620245e7fca54c6eb95d79f0009b8555b GIT binary patch literal 2996 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 Vb&>3W;@toM002ovPDHLkV1l@ssT2SJ literal 0 HcmV?d00001 diff --git a/source/web/images/parts/task_btn_rollover_left.png b/source/web/images/parts/task_btn_rollover_left.png new file mode 100644 index 0000000000000000000000000000000000000000..0940ab8341379abf84e58270e212cc4ec4bb3b61 GIT binary patch literal 3036 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 literal 0 HcmV?d00001 diff --git a/source/web/jsp/content/create-content-wizard/create-html.jsp b/source/web/jsp/content/create-content-wizard/create-html.jsp index 533c4b08a3..e3b10f4e6a 100644 --- a/source/web/jsp/content/create-content-wizard/create-html.jsp +++ b/source/web/jsp/content/create-content-wizard/create-html.jsp @@ -35,9 +35,9 @@ tinyMCE.init({ theme : "advanced", mode : "exact", + relative_urls: false, elements : "editor", save_callback : "saveContent", - urlconverter_callback: "convertUrl", plugins : "table", theme_advanced_toolbar_location : "top", theme_advanced_toolbar_align : "left", @@ -53,13 +53,6 @@ document.getElementById("wizard:wizard-body:editor-output").value = content; } - function convertUrl(href, element, onsave) - { - // just return the passed href, this is enough to stop TinyMCE - // from converting the URL to it's relative form - return href; - } - var isIE = (document.all); diff --git a/source/web/jsp/dialog/edit-html-inline.jsp b/source/web/jsp/dialog/edit-html-inline.jsp index 7a9769d655..c46d29d671 100644 --- a/source/web/jsp/dialog/edit-html-inline.jsp +++ b/source/web/jsp/dialog/edit-html-inline.jsp @@ -41,9 +41,9 @@ tinyMCE.init({ theme : "advanced", mode : "exact", + relative_urls: false, elements : "editor", save_callback : "saveContent", - urlconverter_callback: "convertUrl", plugins : "table", theme_advanced_toolbar_location : "top", theme_advanced_toolbar_align : "left", @@ -58,14 +58,6 @@ { document.forms['edit-file']['edit-file:editorOutput'].value = content; } - - function convertUrl(href, element, onsave) - { - // just return the passed href, this is enough to stop TinyMCE - // from converting the URL to it's relative form - return href; - } - diff --git a/source/web/scripts/ajax/common.js b/source/web/scripts/ajax/common.js index 637369f723..da7c89d471 100644 --- a/source/web/scripts/ajax/common.js +++ b/source/web/scripts/ajax/common.js @@ -517,7 +517,7 @@ function openWindowCallback(url, callback) // Register our "well known" callback function window.alfrescoCallback = openWindowOnCallback; // Use a named window so that only one dialog is active at a time - window.open(url, 'alfrescoDialog', 'width=1024,height=768'); + window.open(url, 'alfrescoDialog', 'width=1024,height=768,scrollbars=yes'); } function openWindowOnCallback(fromTimeout) diff --git a/source/web/scripts/ajax/doclist.js b/source/web/scripts/ajax/doclist.js index 008f474cec..3e80dd0814 100644 --- a/source/web/scripts/ajax/doclist.js +++ b/source/web/scripts/ajax/doclist.js @@ -2,7 +2,7 @@ var MyDocs = { IMG_SMALL: 16, IMG_LARGE: 64, ANIM_LENGTH: 300, - DETAIL_MARGIN: 56, + DETAIL_MARGIN: 8, TITLE_FONT_SIZE: 18, RESOURCE_PANEL_HEIGHT: 150, OVERLAY_OPACITY: 0.8, @@ -20,6 +20,11 @@ var MyDocs = { // show AJAX loading overlay $('docPanelOverlayAjax').setStyle('visibility', 'visible'); $('docPanel').setStyle('visibility', 'hidden'); + + var messagePanel = $('docMessagePanel'); + messagePanel.setStyle('opacity', 0); + messagePanel.setStyle('display', 'block'); + // fire off the ajax request to populate the doc list - the 'doclistpanel' webscript // is responsible for rendering just the contents of the main panel div YAHOO.util.Connect.asyncRequest( @@ -252,6 +257,8 @@ var MyDocs = { if (!doc.isOpen) { + doc.addClass("docItemSelectedOpen"); + if (!resource.isLoaded) { // fire off the ajax request to get the resources for this task @@ -333,6 +340,8 @@ var MyDocs = { // reset selected class? otherDoc.removeClass('docItemSelected'); + otherDoc.removeClass("docItemSelectedOpen"); + // move the title back to the left? var ml = otherItem.getStyle('margin-left').toInt(); if (ml != otherItem.defMarginLeft) @@ -388,6 +397,8 @@ var MyDocs = { // close this document panel // flag this document as closed doc.isOpen = false; + + doc.removeClass("docItemSelectedOpen"); // reset resource panel back to it's default height animResource[i] = { @@ -523,6 +534,7 @@ var MyDocs = { if (response.responseText.indexOf("OK:") == 0) { MyDocs.refreshList(); + MyDocs.displayMessage("A working copy for the checked out item 'Working Copy of " + name + "' has been created."); } else { @@ -557,6 +569,7 @@ var MyDocs = { if (response.responseText.indexOf("OK:") == 0) { MyDocs.refreshList(); + MyDocs.displayMessage("Item 'Working Copy of " + name + "' has been checked in."); } else { @@ -764,6 +777,71 @@ var MyDocs = { { // Refresh the inner panel MyDocs.refreshList(true); + }, + + /** + * Display a message bubble of helpful info to the user. Calling this function in quick + * succession will cause previous message to be lost as the new ones are displayed. + * + * @param message Message text to display + */ + displayMessage: function(message) + { + var panel = $("docMessagePanel"); + if ($defined(panel.timeout)) + { + clearTimeout(panel.timeout); + panel.timeout = null; + } + + panel.setStyle("opacity", 0); + panel.setStyle("margin-top", -60); + + panel.getChildren()[1].setHTML(message); + + // reset the close box animation by refreshing the image source + $("docMessagePanelCloseImage").src = getContextPath() + "/images/icons/close_portlet_animation.gif"; + + panel.fxMessage = new Fx.Styles(panel, + { + duration: 1000, + transition: Fx.Transitions.sineInOut + }); + panel.fxMessage.start({'margin-top': -40, 'opacity': [0, 0.75]}); + + + panel.timeout = window.setTimeout(this.fadeOutMessage, 9000); + }, + + /** + * Timer callback function to fade out the message panel + */ + fadeOutMessage: function() + { + var panel = $("docMessagePanel"); + panel.timeout = null; + + var fxMessage = new Fx.Styles(panel, + { + duration: 1000, + transition: Fx.Transitions.sineInOut + }); + fxMessage.start({'margin-top': -60, 'opacity': [0]}); + }, + + /** + * Close the message panel immediately when the user clicks the close icon + */ + closeMessage: function() + { + var panel = $("docMessagePanel"); + if ($defined(panel.timeout)) + { + clearTimeout(panel.timeout); + panel.timeout = null; + } + panel.fxMessage.stop(); + panel.setStyle("opacity", 0); } }; diff --git a/source/web/scripts/ajax/mytasks.js b/source/web/scripts/ajax/mytasks.js index 57a6301a6a..202c3dc509 100644 --- a/source/web/scripts/ajax/mytasks.js +++ b/source/web/scripts/ajax/mytasks.js @@ -1,6 +1,6 @@ var MyTasks = { ANIM_LENGTH: 300, - DETAIL_PANEL_HEIGHT: 132, + DETAIL_PANEL_HEIGHT: 137, Filter: null, ServiceContext: null, @@ -8,6 +8,10 @@ var MyTasks = { { if ($('taskPanel')) { + var messagePanel = $("taskMessagePanel"); + messagePanel.setStyle('opacity', 0); + messagePanel.setStyle('display', 'block'); + // fire off the ajax request to populate the task panel - the 'mytaskspanel' webscript // is responsible for rendering just the contents of the main panel div YAHOO.util.Connect.asyncRequest( @@ -45,6 +49,12 @@ var MyTasks = { // hide the ajax wait panel and show the main task panel $('taskPanelOverlay').setStyle('visibility', 'hidden'); $('taskPanel').setStyle('visibility', 'visible'); + + if (MyTasks.postInit) + { + MyTasks.postInit(); + MyTasks.postInit = null; + } }, parseTaskPanels: function() @@ -170,6 +180,8 @@ var MyTasks = { // open up this task // flag this task as open task.isOpen = true; + task.addClass("taskItemSelected"); + task.addClass("taskItemSelectedOpen"); if (task.loadingResources == false) { @@ -212,6 +224,7 @@ var MyTasks = { // unhighlight the item title otherTask.removeClass('taskItemSelected'); + otherTask.removeClass("taskItemSelectedOpen"); // does this task detail panel need resetting back to it's default height? var otherHeight = otherDetail.getStyle('height').toInt(); @@ -237,6 +250,7 @@ var MyTasks = { // close this task // flag this task as closed task.isOpen = false; + task.removeClass("taskItemSelectedOpen"); // fade in info button animInfo[i] = {'opacity': [infoOpacity, 1]}; @@ -292,21 +306,39 @@ var MyTasks = { ); }, - displayMessage: function(message) - { - var footer = $('taskFooter'); - if (footer.oldMessage == undefined) - { - footer.oldMessage = footer.innerHTML; - } - footer.innerHTML = message + ' ' + footer.oldMessage; - }, - /** * Refresh the main data list contents within the taskPanel container */ - refreshList: function() + refreshList: function(reopenActive) { + // do we want to remember which panel was open? + if (reopenActive) + { + // do we have an open panel? + var openPanel = $E('#taskPanel .taskItemSelected'); + var openPanelId = null; + if (openPanel != null) + { + openPanelId = openPanel.id; + // Re-open the panel if the id still exists + MyTasks.postInit = function() + { + if ($(openPanelId)) + { + $(openPanelId).fireEvent("click"); + + // scroll the open panel into view + var fxScroll = new Fx.Scroll($('taskPanel'), + { + duration: MyTasks.ANIM_LENGTH, + transition: Fx.Transitions.linear + }); + fxScroll.toElement($(openPanelId)); + } + } + } + } + // empty the main panel div and restart by reloading the panel contents var taskPanel = $('taskPanel'); taskPanel.setStyle('visibility', 'hidden'); @@ -322,15 +354,15 @@ var MyTasks = { */ filter: function(filter) { - $$('.taskfilterLink').each(function(filterLink, i) + $$('#taskFilterBar li').each(function(filterLink, i) { if (i == filter) { - filterLink.addClass("taskfilterLinkSelected"); + filterLink.addClass("taskCurrent"); } else { - filterLink.removeClass("taskfilterLinkSelected"); + filterLink.removeClass("taskCurrent"); } }); MyTasks.Filter = filter; @@ -361,8 +393,81 @@ var MyTasks = { var x = a.dueDate; var y = b.dueDate; return ((x < y) ? -1 : ((x > y) ? 1 : 0)); - } + }, + /** + * Called when the Manage Task dialog returns + */ + manageTaskCallback: function() + { + // The manage task dialog window has closed + MyTasks.refreshList(true); + }, + + /** + * Display a message bubble of helpful info to the user. Calling this function in quick + * succession will cause previous message to be lost as the new ones are displayed. + * + * @param message Message text to display + */ + displayMessage: function(message) + { + var panel = $("taskMessagePanel"); + if ($defined(panel.timeout)) + { + clearTimeout(panel.timeout); + panel.timeout = null; + } + + panel.setStyle("opacity", 0); + panel.setStyle("margin-top", -90); + + panel.getChildren()[1].setHTML(message); + + // reset the close box animation by refreshing the image source + $("taskMessagePanelCloseImage").src = getContextPath() + "/images/icons/close_portlet_animation.gif"; + + panel.fxMessage = new Fx.Styles(panel, + { + duration: 1000, + transition: Fx.Transitions.sineInOut + }); + panel.fxMessage.start({'margin-top': -70, 'opacity': [0, 0.75]}); + + + panel.timeout = window.setTimeout(this.fadeOutMessage, 9000); + }, + + /** + * Timer callback function to fade out the message panel + */ + fadeOutMessage: function() + { + var panel = $("taskMessagePanel"); + panel.timeout = null; + + var fxMessage = new Fx.Styles(panel, + { + duration: 1000, + transition: Fx.Transitions.sineInOut + }); + fxMessage.start({'margin-top': -90, 'opacity': [0]}); + }, + + /** + * Close the message panel immediately when the user clicks the close icon + */ + closeMessage: function() + { + var panel = $("taskMessagePanel"); + if ($defined(panel.timeout)) + { + clearTimeout(panel.timeout); + panel.timeout = null; + } + panel.fxMessage.stop(); + panel.setStyle("opacity", 0); + } }; window.addEvent('load', MyTasks.start); \ No newline at end of file diff --git a/source/web/scripts/ajax/mywebfiles.js b/source/web/scripts/ajax/mywebfiles.js index 7795fd0909..9d0ff7298f 100644 --- a/source/web/scripts/ajax/mywebfiles.js +++ b/source/web/scripts/ajax/mywebfiles.js @@ -34,7 +34,7 @@ var MyWebFiles = { var file = files[i]; // animated elements defaults - file.maxHeight = file.getStyle('height').toInt(); + file.maxHeight = Math.max(file.getStyle('height').toInt(), 1); file.defHeight = 1; file.setStyle('height', file.defHeight); file.setStyle('display', 'block'); diff --git a/source/web/scripts/ajax/mywebforms.js b/source/web/scripts/ajax/mywebforms.js index d5a0dca723..02261b4e42 100644 --- a/source/web/scripts/ajax/mywebforms.js +++ b/source/web/scripts/ajax/mywebforms.js @@ -21,7 +21,7 @@ var MyWebForms = { var frm = frms[i]; // animated elements defaults - frm.maxHeight = frm.getStyle('height').toInt(); + frm.maxHeight = Math.max(frm.getStyle('height').toInt(), 1); frm.defHeight = 1; frm.setStyle('height', frm.defHeight); frm.setStyle('opacity', 0);