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 0000000000..a657c33049 Binary files /dev/null and b/source/web/images/icons/close_portlet_animation.gif differ 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 0000000000..94ea272616 Binary files /dev/null and b/source/web/images/icons/close_portlet_static.gif differ 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 0000000000..ca53f9bdd3 Binary files /dev/null and b/source/web/images/parts/doclist_arrow_down.png differ diff --git a/source/web/images/parts/doclist_arrow_up.png b/source/web/images/parts/doclist_arrow_up.png new file mode 100644 index 0000000000..5be633e0ad Binary files /dev/null and b/source/web/images/parts/doclist_arrow_up.png differ 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 0000000000..1a145f1739 Binary files /dev/null and b/source/web/images/parts/doclist_item_marker.png differ diff --git a/source/web/images/parts/marker_effect_left.png b/source/web/images/parts/marker_effect_left.png new file mode 100644 index 0000000000..aaf4d5ef0b Binary files /dev/null and b/source/web/images/parts/marker_effect_left.png differ 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 0000000000..f311160d84 Binary files /dev/null and b/source/web/images/parts/marker_effect_right.png differ 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 0000000000..009a3631dc Binary files /dev/null and b/source/web/images/parts/mytasks_arrow_down.png differ 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 0000000000..8d31b87620 Binary files /dev/null and b/source/web/images/parts/mytasks_arrow_up.png differ diff --git a/source/web/images/parts/task_btn_normal_left.png b/source/web/images/parts/task_btn_normal_left.png new file mode 100644 index 0000000000..a984d92a74 Binary files /dev/null and b/source/web/images/parts/task_btn_normal_left.png differ diff --git a/source/web/images/parts/task_btn_normal_right.png b/source/web/images/parts/task_btn_normal_right.png new file mode 100644 index 0000000000..b2539560c8 Binary files /dev/null and b/source/web/images/parts/task_btn_normal_right.png differ 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 0000000000..0940ab8341 Binary files /dev/null and b/source/web/images/parts/task_btn_rollover_left.png differ diff --git a/source/web/images/parts/task_btn_rollover_right.png b/source/web/images/parts/task_btn_rollover_right.png new file mode 100644 index 0000000000..a7afc6a7ef Binary files /dev/null and b/source/web/images/parts/task_btn_rollover_right.png differ 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);