diff --git a/config/alfresco/templates/webscripts/org/alfresco/collaboration/blogSpace.get.html.ftl b/config/alfresco/templates/webscripts/org/alfresco/collaboration/blogSpace.get.html.ftl index 7c15f6cada..c82541c08a 100644 --- a/config/alfresco/templates/webscripts/org/alfresco/collaboration/blogSpace.get.html.ftl +++ b/config/alfresco/templates/webscripts/org/alfresco/collaboration/blogSpace.get.html.ftl @@ -6,7 +6,7 @@ <#list blogSpace.pending as p>
- ${p.name}, ${p.properties["cm:title"]} + ${p.name}, ${p.properties["cm:title"]!""}
@@ -20,7 +20,7 @@ <#list blogSpace.published as p>
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 @@ + + +
+ Colleagues Online +
+
+
+<#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"> + + avatar +
+
+
+
+
${c.properties["firstName"]!""} ${c.properties["lastName"]!""}
+
${c.properties["jobtitle"]!""}
+
${c.properties["location"]!""}
+
+
+ +
+
+
+
+
+   +
+ + 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 @@ + + +
+ ${projectSpace.title} Summary +
+
+ + + + + +
+<#list projectSpace.subSpaces?keys as key> + <#assign node = projectSpace.subSpaces[key]> + <#assign summary = node.properties["cm:summaryWebscript"]!""> +
+
+ +
+ +
${url.context}${summary}?nodeRef=${node.nodeRef}">
+
+ +
+ +
+
+   +
+ + 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);