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 @@
#if>
-
|
+
+
+ |
<#assign navurl='/navigate/showDocDetails/' + node.nodeRef.storeRef.protocol + '/' + node.nodeRef.storeRef.identifier + '/' + node.nodeRef.id>
-<#if node.isLocked >
+<#if node.isLocked>
(Locked) |
<#elseif hasAspect(node, "cm:workingcopy") == 1>
onclick='event.cancelBubble=true;MyDocs.checkinItem("${node.name}", "${node.nodeRef}");'#if>>Check In |
<#else>
onclick='event.cancelBubble=true;MyDocs.checkoutItem("${node.name}", "${node.nodeRef}");'#if>>Check Out |
#if>
-<#if node.isLocked >
+<#if node.isLocked>
Edit Details |
<#else>
Edit Details |
#if>
-<#if node.isLocked >
+<#if node.isLocked>
Update |
<#else>
Update |
#if>
- View Content |
+ Download |
+<#if node.isLocked>
+ Delete |
+<#else>
onclick='event.cancelBubble=true;MyDocs.deleteItem("${node.name}", "${node.nodeRef}");'#if>>Delete |
+#if>
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}");'#if>>Check In |
-<#else>
+ <#else>
onclick='event.cancelBubble=true;MySpaces.checkoutItem("${node.name}", "${node.nodeRef}");'#if>>Check Out |
-#if>
-<#if node.isLocked >
+ #if>
+ <#if node.isLocked>
Edit Details |
-<#else>
+ <#else>
Edit Details |
-#if>
+ #if>
-<#if node.isLocked >
+ <#if node.isLocked>
Update |
-<#else>
+ <#else>
Update |
-#if>
+ #if>
View Content |
+ <#if node.isLocked>
+ Delete |
+ <#else>
onclick='event.cancelBubble=true;MySpaces.deleteItem("${node.name}", "${node.nodeRef}");'#if>>Delete |
+ #if>
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 @@
+
@@ -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: | ${t.properties["bpm:status"]} |
Priority: | ${t.properties["bpm:priority"]} |
Start Date: | ${t.startDate?date} |
- Type: | ${t.type?html} |
Complete: | ${t.properties["bpm:percentComplete"]}% |
|
|
-
+ |
-
|
- |
-
- Manage Task
-
-
-
+ | |
+
+
|
+
+
+ |
+
+
+ |
+ |
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 @@
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);