
diff --git a/config/alfresco/templates/webscripts/org/alfresco/collaboration/blogSummary.get.desc.xml b/config/alfresco/templates/webscripts/org/alfresco/collaboration/blogSummary.get.desc.xml
new file mode 100644
index 0000000000..a7e8d792ee
--- /dev/null
+++ b/config/alfresco/templates/webscripts/org/alfresco/collaboration/blogSummary.get.desc.xml
@@ -0,0 +1,8 @@
+
+ Blog Summary
+ Collaboration Blog Summary
+ /collaboration/blogSummary?nodeRef={noderef}
+
+ user
+ required
+
diff --git a/config/alfresco/templates/webscripts/org/alfresco/collaboration/blogSummary.get.html.ftl b/config/alfresco/templates/webscripts/org/alfresco/collaboration/blogSummary.get.html.ftl
new file mode 100644
index 0000000000..910fb2f711
--- /dev/null
+++ b/config/alfresco/templates/webscripts/org/alfresco/collaboration/blogSummary.get.html.ftl
@@ -0,0 +1,2 @@
+${blogSummary.numUpdates} articles need updating
+${blogSummary.numPending} articles pending
\ No newline at end of file
diff --git a/config/alfresco/templates/webscripts/org/alfresco/collaboration/blogSummary.get.js b/config/alfresco/templates/webscripts/org/alfresco/collaboration/blogSummary.get.js
new file mode 100644
index 0000000000..310cbc2630
--- /dev/null
+++ b/config/alfresco/templates/webscripts/org/alfresco/collaboration/blogSummary.get.js
@@ -0,0 +1,48 @@
+/*
+ * blogSummary
+ *
+ * Inputs:
+ * nodeRef = blog space nodeRef
+ *
+ * Outputs:
+ * blogSummary - object containing
+ * numUpdates - number of articles updated since being published
+ * numPending - number of unpublished articles
+ */
+model.blogSummary = main(args["nodeRef"]);
+
+function main(nodeRef)
+{
+ var numUpdates = 0,
+ numPending = 0;
+
+ if (nodeRef != null)
+ {
+ var space = search.findNode(nodeRef);
+
+ if (space != null)
+ {
+ for each(node in space.children)
+ {
+ if ((node.hasAspect("blg:blogPost")) && (node.properties["blg:published"] == true))
+ {
+ if (node.properties["cm:modified"] > node.properties["blg:lastUpdate"])
+ {
+ ++numUpdates;
+ }
+ }
+ else
+ {
+ ++numPending;
+ }
+ }
+ }
+ }
+
+ var blogSummary =
+ {
+ "numUpdates": numUpdates,
+ "numPending": numPending
+ };
+ return blogSummary;
+}
diff --git a/config/alfresco/templates/webscripts/org/alfresco/collaboration/colleaguePresence.get.desc.xml b/config/alfresco/templates/webscripts/org/alfresco/collaboration/colleaguePresence.get.desc.xml
new file mode 100644
index 0000000000..685d01ae97
--- /dev/null
+++ b/config/alfresco/templates/webscripts/org/alfresco/collaboration/colleaguePresence.get.desc.xml
@@ -0,0 +1,8 @@
+
+ Colleague Presence Custom View
+ Collaboration Colleague Presence view
+ /collaboration/colleaguePresence?nodeRef={noderef}
+
+ user
+ required
+
diff --git a/config/alfresco/templates/webscripts/org/alfresco/collaboration/colleaguePresence.get.html.ftl b/config/alfresco/templates/webscripts/org/alfresco/collaboration/colleaguePresence.get.html.ftl
new file mode 100644
index 0000000000..d731a0c201
--- /dev/null
+++ b/config/alfresco/templates/webscripts/org/alfresco/collaboration/colleaguePresence.get.html.ftl
@@ -0,0 +1,138 @@
+
+
+
+
+
+<#list colleaguePresence.colleagues?keys as key>
+ <#assign c = colleaguePresence.colleagues[key]>
+
+
+ <#if (c.assocs["cm:avatar"]?exists)>
+ <#assign avatarURL = c.assocs["cm:avatar"][0].url>
+ <#else>
+ <#assign avatarURL = "images/icons/default_avatar.png">
+ #if>
+

+
+
+
+
+
${c.properties["firstName"]!""} ${c.properties["lastName"]!""}
+
${c.properties["jobtitle"]!""}
+
${c.properties["location"]!""}
+
+
+#list>
+
+
+
+
+
+
+
diff --git a/config/alfresco/templates/webscripts/org/alfresco/collaboration/colleaguePresence.get.js b/config/alfresco/templates/webscripts/org/alfresco/collaboration/colleaguePresence.get.js
new file mode 100644
index 0000000000..563590d66c
--- /dev/null
+++ b/config/alfresco/templates/webscripts/org/alfresco/collaboration/colleaguePresence.get.js
@@ -0,0 +1,72 @@
+/*
+ * colleaguePresence
+ *
+ * Inputs:
+ * mandatory: nodeRef = parent space nodeRef
+ *
+ * Outputs: colleaguePresence - object containing presence data model
+ */
+model.colleaguePresence = main(args["nodeRef"]);
+
+function main(nodeRef)
+{
+ var space = search.findNode(nodeRef);
+ var colleagues = {};
+
+ if (space != null)
+ {
+ colleagues = parsePermissions(space);
+ }
+
+ if (person.assocs["cm:avatar"] != null)
+ {
+ model.img = person.assocs["cm:avatar"][0].url;
+ }
+
+ var colleaguePresence =
+ {
+ "colleagues": colleagues
+ };
+ return colleaguePresence;
+}
+
+function parsePermissions(space)
+{
+ var tokens, user, group;
+ var userHash = {};
+
+ try
+ {
+ for each(perm in space.permissions)
+ {
+ tokens = perm.split(";");
+ if (tokens[0] == "ALLOWED")
+ {
+ if (("AllCollaboratorContributorCoordinatorEditor").indexOf(tokens[2]) != -1)
+ {
+ user = people.getPerson(tokens[1]);
+ if (user != null)
+ {
+ userHash[user.name] = user;
+ }
+ else
+ {
+ group = people.getGroup(tokens[1]);
+ if (group != null)
+ {
+ for each(user in people.getMembers(group))
+ {
+ userHash[user.name] = user;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ catch (e)
+ {
+ }
+
+ return userHash;
+}
diff --git a/config/alfresco/templates/webscripts/org/alfresco/collaboration/projectSpace.get.desc.xml b/config/alfresco/templates/webscripts/org/alfresco/collaboration/projectSpace.get.desc.xml
new file mode 100644
index 0000000000..2414bdd56f
--- /dev/null
+++ b/config/alfresco/templates/webscripts/org/alfresco/collaboration/projectSpace.get.desc.xml
@@ -0,0 +1,8 @@
+
+ Project Space Custom View
+ Collaboration Project Space Space view
+ /collaboration/projectSpace?nodeRef={noderef}
+
+ user
+ required
+
diff --git a/config/alfresco/templates/webscripts/org/alfresco/collaboration/projectSpace.get.html.ftl b/config/alfresco/templates/webscripts/org/alfresco/collaboration/projectSpace.get.html.ftl
new file mode 100644
index 0000000000..175893a36e
--- /dev/null
+++ b/config/alfresco/templates/webscripts/org/alfresco/collaboration/projectSpace.get.html.ftl
@@ -0,0 +1,105 @@
+
+
+
+
+
+
+
+
+<#list projectSpace.subSpaces?keys as key>
+ <#assign node = projectSpace.subSpaces[key]>
+ <#assign summary = node.properties["cm:summaryWebscript"]!"">
+
+
+ 
+
+
+ ${url.context}${summary}?nodeRef=${node.nodeRef}#if>">
+
+#list>
+ |
+
+
+
+
+
+
+
diff --git a/config/alfresco/templates/webscripts/org/alfresco/collaboration/projectSpace.get.js b/config/alfresco/templates/webscripts/org/alfresco/collaboration/projectSpace.get.js
new file mode 100644
index 0000000000..5409fe6511
--- /dev/null
+++ b/config/alfresco/templates/webscripts/org/alfresco/collaboration/projectSpace.get.js
@@ -0,0 +1,36 @@
+/*
+ * projectSpace
+ *
+ * Inputs:
+ * mandatory: nodeRef = parent space nodeRef
+ *
+ * Outputs: projectSpace - object containing pproject space details
+ */
+model.projectSpace = main(args["nodeRef"]);
+
+function main(nodeRef)
+{
+ var title = "";
+ var subSpaces = {};
+ var space = search.findNode(nodeRef);
+
+ if (space != null)
+ {
+ title = space.name;
+ // Discover the nodeRef of each project subspace
+ for each(node in space.children)
+ {
+ if (node.hasAspect("{http://www.alfresco.org/model/content/1.0}projectsummary"))
+ {
+ subSpaces[node.nodeRef] = node;
+ }
+ }
+ }
+
+ var projectSpace =
+ {
+ "title": title,
+ "subSpaces": subSpaces
+ };
+ return projectSpace;
+}
diff --git a/config/alfresco/web-client-config.xml b/config/alfresco/web-client-config.xml
index 0b8a1c12c0..9aa2b4d4ee 100644
--- a/config/alfresco/web-client-config.xml
+++ b/config/alfresco/web-client-config.xml
@@ -410,6 +410,13 @@
+
+
+
+
+
+
+
diff --git a/source/web/images/icons/default_avatar.png b/source/web/images/icons/default_avatar.png
new file mode 100644
index 0000000000..f81df11ca0
Binary files /dev/null and b/source/web/images/icons/default_avatar.png differ
diff --git a/source/web/images/icons/project-icon-blog-16.gif b/source/web/images/icons/project-icon-blog-16.gif
new file mode 100644
index 0000000000..307859d0e7
Binary files /dev/null and b/source/web/images/icons/project-icon-blog-16.gif differ
diff --git a/source/web/images/icons/project-icon-blog-64.png b/source/web/images/icons/project-icon-blog-64.png
new file mode 100644
index 0000000000..9ebaebfd21
Binary files /dev/null and b/source/web/images/icons/project-icon-blog-64.png differ
diff --git a/source/web/images/icons/project-icon-blog.gif b/source/web/images/icons/project-icon-blog.gif
new file mode 100644
index 0000000000..160eb2f641
Binary files /dev/null and b/source/web/images/icons/project-icon-blog.gif differ
diff --git a/source/web/images/icons/project-icon-calendar-16.gif b/source/web/images/icons/project-icon-calendar-16.gif
new file mode 100644
index 0000000000..cd1eb6d219
Binary files /dev/null and b/source/web/images/icons/project-icon-calendar-16.gif differ
diff --git a/source/web/images/icons/project-icon-calendar-64.png b/source/web/images/icons/project-icon-calendar-64.png
new file mode 100644
index 0000000000..e6cdae0731
Binary files /dev/null and b/source/web/images/icons/project-icon-calendar-64.png differ
diff --git a/source/web/images/icons/project-icon-calendar.gif b/source/web/images/icons/project-icon-calendar.gif
new file mode 100644
index 0000000000..d696f8fd1b
Binary files /dev/null and b/source/web/images/icons/project-icon-calendar.gif differ
diff --git a/source/web/images/icons/project-icon-doclibrary-16.gif b/source/web/images/icons/project-icon-doclibrary-16.gif
new file mode 100644
index 0000000000..6b607d2373
Binary files /dev/null and b/source/web/images/icons/project-icon-doclibrary-16.gif differ
diff --git a/source/web/images/icons/project-icon-doclibrary-64.png b/source/web/images/icons/project-icon-doclibrary-64.png
new file mode 100644
index 0000000000..b6095c4ed5
Binary files /dev/null and b/source/web/images/icons/project-icon-doclibrary-64.png differ
diff --git a/source/web/images/icons/project-icon-doclibrary.gif b/source/web/images/icons/project-icon-doclibrary.gif
new file mode 100644
index 0000000000..39e168d5d7
Binary files /dev/null and b/source/web/images/icons/project-icon-doclibrary.gif differ
diff --git a/source/web/images/icons/project-icon-emailarchive-16.gif b/source/web/images/icons/project-icon-emailarchive-16.gif
new file mode 100644
index 0000000000..bcd1b346f9
Binary files /dev/null and b/source/web/images/icons/project-icon-emailarchive-16.gif differ
diff --git a/source/web/images/icons/project-icon-emailarchive-64.png b/source/web/images/icons/project-icon-emailarchive-64.png
new file mode 100644
index 0000000000..3d46397b8e
Binary files /dev/null and b/source/web/images/icons/project-icon-emailarchive-64.png differ
diff --git a/source/web/images/icons/project-icon-emailarchive.gif b/source/web/images/icons/project-icon-emailarchive.gif
new file mode 100644
index 0000000000..4def233538
Binary files /dev/null and b/source/web/images/icons/project-icon-emailarchive.gif differ
diff --git a/source/web/images/icons/project-icon-forums-16.gif b/source/web/images/icons/project-icon-forums-16.gif
new file mode 100644
index 0000000000..72433ac7c7
Binary files /dev/null and b/source/web/images/icons/project-icon-forums-16.gif differ
diff --git a/source/web/images/icons/project-icon-forums-64.png b/source/web/images/icons/project-icon-forums-64.png
new file mode 100644
index 0000000000..fd0e12c367
Binary files /dev/null and b/source/web/images/icons/project-icon-forums-64.png differ
diff --git a/source/web/images/icons/project-icon-forums.gif b/source/web/images/icons/project-icon-forums.gif
new file mode 100644
index 0000000000..246fbca12d
Binary files /dev/null and b/source/web/images/icons/project-icon-forums.gif differ
diff --git a/source/web/images/icons/project-icon-gallery-16.gif b/source/web/images/icons/project-icon-gallery-16.gif
new file mode 100644
index 0000000000..19acad713c
Binary files /dev/null and b/source/web/images/icons/project-icon-gallery-16.gif differ
diff --git a/source/web/images/icons/project-icon-gallery-64.png b/source/web/images/icons/project-icon-gallery-64.png
new file mode 100644
index 0000000000..a1b25f469e
Binary files /dev/null and b/source/web/images/icons/project-icon-gallery-64.png differ
diff --git a/source/web/images/icons/project-icon-gallery.gif b/source/web/images/icons/project-icon-gallery.gif
new file mode 100644
index 0000000000..5ffd57d32d
Binary files /dev/null and b/source/web/images/icons/project-icon-gallery.gif differ
diff --git a/source/web/images/icons/project-icon-wiki-16.gif b/source/web/images/icons/project-icon-wiki-16.gif
new file mode 100644
index 0000000000..89520f5097
Binary files /dev/null and b/source/web/images/icons/project-icon-wiki-16.gif differ
diff --git a/source/web/images/icons/project-icon-wiki-64.png b/source/web/images/icons/project-icon-wiki-64.png
new file mode 100644
index 0000000000..342e71380e
Binary files /dev/null and b/source/web/images/icons/project-icon-wiki-64.png differ
diff --git a/source/web/images/icons/project-icon-wiki.gif b/source/web/images/icons/project-icon-wiki.gif
new file mode 100644
index 0000000000..bba4866601
Binary files /dev/null and b/source/web/images/icons/project-icon-wiki.gif differ
diff --git a/source/web/jsp/projects/project.jsp b/source/web/jsp/projects/project.jsp
index f820ce119e..dcd67a3722 100644
--- a/source/web/jsp/projects/project.jsp
+++ b/source/web/jsp/projects/project.jsp
@@ -109,10 +109,21 @@
|
-
- <%-- TODO: Project View webscripts --%>
-
-
+
+
+
+ <%-- Project Summary webscript --%>
+
+
+ |
+
+ <%-- Colleague Presence Status webscript --%>
+
+
+ |
+
+
+
|
|
diff --git a/source/web/scripts/ajax/project_presence.js b/source/web/scripts/ajax/project_presence.js
new file mode 100644
index 0000000000..86ee04cf3e
--- /dev/null
+++ b/source/web/scripts/ajax/project_presence.js
@@ -0,0 +1,126 @@
+/*
+* Prerequisites: mootools.v1.11.js
+*/
+var ProjectPresence =
+{
+ OFFLINE_OPACITY: 0.2,
+
+ init: function()
+ {
+ window.contextPath = ProjectPresence.getContextPath();
+
+ var statuses = $$("#projectColleagues .colleaguePresence");
+ var rows = $$("#projectColleagues .colleagueRow");
+
+ $('colleaguesNotOnline').setStyle("opacity", ProjectPresence.OFFLINE_OPACITY);
+
+ statuses.each(function(status, i)
+ {
+ var userDetails = status.attributes["rel"].value.split("|");
+ var proxyURL = window.contextPath + "/ajax/invoke/PresenceProxyBean.proxyRequest";
+ var statusURL = ProjectPresence.getStatusURL(userDetails);
+
+ if (statusURL != "")
+ {
+ // ajax call to load online status
+ var myAjax = new Ajax(proxyURL, {
+ method: 'get',
+ headers: {'If-Modified-Since': 'Sat, 1 Jan 2000 00:00:00 GMT'},
+ onComplete: function(textResponse, xmlResponse)
+ {
+ var statusType = ProjectPresence.getStatusType(userDetails[0], textResponse);
+ status.addClass(userDetails[0] + "-" + statusType);
+ if (statusType == "unknown")
+ {
+ status.title = "User's status is unknown, possibly due to client privacy settings";
+ }
+ else
+ {
+ status.title = "User's status is " + statusType;
+ }
+ if (statusType == "online")
+ {
+ $('colleaguesOnline').adopt(rows[i]);
+ }
+ else
+ {
+ $('colleaguesNotOnline').adopt(rows[i]);
+ }
+ }
+ }).request("url=" + escape(statusURL));
+ }
+ else
+ {
+ status.addClass("none");
+ status.title = "User's presence provider has not been configured by Alfresco admin";
+ $('colleaguesNotOnline').adopt(rows[i]);
+ }
+ });
+ },
+
+ /* Calculates and returns the context path for the current page */
+ getContextPath: function()
+ {
+ var path = window.location.pathname;
+ var idx = path.indexOf("/", 1);
+ var contextPath = "";
+ if (idx != -1)
+ {
+ contextPath = path.substring(0, idx);
+ }
+ else
+ {
+ contextPath = "";
+ }
+
+ return contextPath;
+ },
+
+ getStatusURL: function(userDetails)
+ {
+ var provider = userDetails[0];
+ var username = userDetails[1];
+ var statusURL = "";
+
+ switch(provider)
+ {
+ case "skype":
+ statusURL = "http://mystatus.skype.com/" + username + ".txt";
+ break;
+ case "yahoo":
+ statusURL = "http://opi.yahoo.com/online?u=" + username + "&m=t&t=1";
+ break;
+ }
+
+ return statusURL;
+ },
+
+ getStatusType: function(provider, response)
+ {
+ var statusType = "unknown";
+
+ switch(provider)
+ {
+ case "skype":
+ switch (response)
+ {
+ case "Online":
+ statusType = "online";
+ break;
+ case "Offline":
+ statusType = "offline";
+ break;
+ default:
+ statusType = "unknown";
+ }
+ break;
+ case "yahoo":
+ statusType = (response == "01") ? "online" : "offline";
+ break;
+ }
+
+ return statusType;
+ }
+}
+
+window.addEvent('domready', ProjectPresence.init);
diff --git a/source/web/scripts/ajax/project_space.js b/source/web/scripts/ajax/project_space.js
new file mode 100644
index 0000000000..44346a37f4
--- /dev/null
+++ b/source/web/scripts/ajax/project_space.js
@@ -0,0 +1,27 @@
+/*
+* Prerequisites: mootools.v1.11.js
+*/
+var ProjectSpace =
+{
+ init: function()
+ {
+ var summaries = $$("#projectSummary .projectSpaceSummary");
+
+ summaries.each(function(summary, i)
+ {
+ var summaryURL = summary.attributes["rel"].value;
+
+ if (summaryURL != "")
+ {
+ // ajax call to load space summary
+ var myAjax = new Ajax(summaryURL, {
+ method: "get",
+ headers: {"If-Modified-Since": "Sat, 1 Jan 2000 00:00:00 GMT"},
+ update: summary
+ }).request();
+ }
+ });
+ }
+}
+
+window.addEvent('domready', ProjectSpace.init);