Web Script: org/alfresco/components/dashlets/activity-list.get
Generated from /share/service/script/org/alfresco/components/dashlets/activity-list.get on Jun 14, 2026 2:45:07 PM

Script Properties
Id:org/alfresco/components/dashlets/activity-list.get
Short Name:Activity List
Description:Used by Site Activities and My Activities dashlets
Authentication:user
Transaction:required
Method:GET
URL Template:/components/dashlets/activities/list
Format Style:any
Default Format:html
Negotiated Formats:[undefined]
Implementation:class org.alfresco.web.scripts.DeclarativeWebScript
Extensions:[undefined]

Store: classpath:alfresco/site-webscripts

File: org/alfresco/components/dashlets/activity-list.get.atomfeed.ftl
<#assign mode = args.mode!"">
<#if mode = "user">
   <#assign title=msg("atom.title.user", user.fullName?xml)>
<#else>
   <#assign title=msg("atom.title.site", args["site"]?xml)>
</#if>
<#assign genericTitle=msg("title.generic")>
<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
   <generator version="1.0">Alfresco (1.0)</generator>
   <link rel="self" href="${absurl(url.full)?xml}" />
   <id>${absurl(url.full)?xml}</id>
   <title>${title?xml}</title>
<#if activities?exists && activities?size &gt; 0>
   <updated>${activities[0].date.isoDate}</updated>
   <#list activities as activity>
      <#assign userLink="<a href=\"${absurl(activity.userProfile)}\">${activity.fullName?html}</a>">
      <#assign itemLink="<a href=\"${absurl(activity.itemPage)}\">${activity.title?html}</a>">
      <#assign siteLink="<a href=\"${absurl(activity.sitePage)}\">${activity.siteId?html}</a>">
   <entry xmlns='http://www.w3.org/2005/Atom'>      
      <#assign detail = msg(activity.type, activity.title?xml, activity.fullName?xml, activity.custom0, activity.custom1)>
      <#if mode="user" && !activity.suppressSite><#assign detail=msg("in.site", detail, activity.siteId?xml)></#if>
      <title><![CDATA[${detail?xml}]]></title>
      <link rel="alternate" type="text/html" href="${absurl(activity.itemPage)}" />
      <id>${activity.id}</id>
      <updated>${activity.date.isoDate}</updated>
      <#assign detailHTML = msg(activity.type, itemLink, userLink, activity.custom0, activity.custom1)>
      <#if mode = "user" && !activity.suppressSite><#assign detailHTML = msg("in.site", detailHTML, siteLink)></#if>
      <summary type="html">
         <![CDATA[${msg(detailHTML)}]]>
      </summary>
      <author>
         <name>${activity.fullName?xml}</name>
         <uri>${absurl(activity.userProfile)?xml}</uri>
      </author>
   </entry>
   </#list>
</#if>
</feed>
File: org/alfresco/components/dashlets/activity-list.get.desc.xml
<webscript>
   <shortname>Activity List</shortname>
   <description>Used by Site Activities and My Activities dashlets</description>
   <url>/components/dashlets/activities/list</url>
   <authentication>user</authentication>
</webscript>
File: org/alfresco/components/dashlets/activity-list.get.html.ftl
<#if activities?exists && activities?size &gt; 0>
   <#assign mode = args.mode!"">
   <#assign lastDate = "3000-01-01"?date("yyyy-MM-dd") lastHour = -1>
   <#list activities as activity>
      <#assign userLink="<a href=\"${activity.userProfile}\" class=\"theme-color-1\">${activity.fullName?html}</a>">
      <#assign itemLink="<a href=\"${activity.itemPage}\">${activity.title?html}</a>">
      <#assign siteLink="<a href=\"${activity.sitePage}\" class=\"theme-color-1\">${activity.siteId}</a>">
      <#if dateCompare(lastDate?date, activity.date.fullDate?date) == 1>
         <#assign lastDate = activity.date.fullDate lastHour = activity.date.hour>
<div class="new-day <#if activity_index = 0>first</#if>"><div class="ruler"></div><span>${lastHour?string("00")}:00, ${lastDate?date?string.medium}</span></div>
      <#elseif lastHour != activity.date.hour>
         <#assign lastHour = activity.date.hour>
<div class="new-hour"><div class="ruler"></div><span>${lastHour?string("00")}:00</span></div>
      </#if>
      <#assign detail = msg(activity.type, itemLink, userLink, activity.custom0, activity.custom1)>
      <#if mode = "user" && !activity.suppressSite><#assign detail = msg("in.site", detail, siteLink)></#if>
<div class="activity <#if !activity_has_next>last</#if>">
   <div class="time">${activity.date.fullDate?time?string("HH:mm")}</div>
   <div class="detail">${detail}</div>
</div>
   </#list>
<#else>
<div class="detail-list-item first-item last-item">
   <span>${msg("label.no-activities")}</span>
</div>
</#if>
File: org/alfresco/components/dashlets/activity-list.get.js
var activityFeed = getActivities();
var activities = [], activity, item, summary, fullName, date;
var filter = args["filter"], oldestDate = getOldestDate(filter);

if (activityFeed != null)
{
   for (var i = 0, ii = activityFeed.length; i < ii; i++)
   {
      activity = activityFeed[i];
      if (activity.activitySummaryFormat == "json")
      {
         summary = eval("(" + activity.activitySummary + ")");
         fullName = trim(summary.firstName + " " + summary.lastName);
         date = fromISO8601(activity.postDate);
         
         // Outside oldest date?
         if (date < oldestDate)
         {
            break;
         }
         
         item =
         {
            id: activity.id,
            type: activity.activityType,
            siteId: activity.siteNetwork,
            date:
            {
               isoDate: activity.postDate,
               fullDate: date,
               hour: date.getHours()
            },
            title: summary.title || "title.generic",
            fullName: fullName,
            itemPage: itemPageUrl(activity, summary),
            sitePage: sitePageUrl(activity, summary),
            userProfile: userProfileUrl(activity.postUserId),
            custom0: summary.custom0 || "",
            custom1: summary.custom1 || "",
            suppressSite: false
         };
         // Run through specialize function for special cases
         activities.push(specialize(item, activity, summary));
      }
   }
}

model.activities = activities;


/**
 * Optionally specify each activity item by type
 */
function specialize(item, activity, summary)
{
   switch (activity.activityType)
   {
      case "org.alfresco.site.user-joined":
      case "org.alfresco.site.user-left":
      case "org.alfresco.site.user-role-changed":
         item.title = activity.siteNetwork;
         item.custom0 = summary.role;
         item.fullName = trim(summary.memberFirstName + " " + summary.memberLastName);
         item.suppressSite = true;
         item.userProfile = userProfileUrl(summary.memberUserName);
         break;
   }
   
   return item;
}


/**
 * Call remote Repo script to get relevant activities
 */
function getActivities()
{
   // Call the correct repo script depending on the mode
   var mode = args["mode"], site = args["site"], connector, result =
   {
      status: 0
   };

   if (format.name == "html")
   {
      connector = remote.connect("alfresco");
   }
   else
   {
      // Use alfresco-feed connector as a basic HTTP auth challenge will be issued
      connector = remote.connect("alfresco-feed");
   }

   if (mode == "site")
   {
      result = connector.get("/api/activities/feed/site/" + site + "?format=json");
   }
   else if (mode == "user")
   {
      result = connector.get("/api/activities/feed/user?format=json");
   }

   if (result.status == 200)
   {
      // Create javascript objects from the server response
      return eval("(" + result + ")");
   }
   
   status.setCode(result.status, result.response);
   return null;
}

/**
 * URL to user profile page
 */
function userProfileUrl(userId)
{
   return url.context + "/page/user/" + encodeURI(userId) + "/profile";
}

/**
 * URL to item page (could be site dashboard page)
 */
function itemPageUrl(activity, summary)
{
   return url.context + "/page/site/" + encodeURI(activity.siteNetwork) + (summary.page !== undefined ? "/" + summary.page : "/dashboard");
}

/**
 * URL to site dashboard page
 */
function sitePageUrl(activity, summary)
{
   return url.context + "/page/site/" + encodeURI(activity.siteNetwork) + "/dashboard";
}

/**
 * Work out the oldest date we should be processing
 */
function getOldestDate(filter)
{
   var date = new Date();
   date.setHours(0, 0, 0, 0)
   
   switch (filter)
   {
      case "today":
         break;
         
      default:
         date.setDate(date.getDate() - filter);
         break;
   }
   return date;
}

/**
 * Trim leading and trailing spaces
 */
function trim(str)
{
   try
   {
      return str.replace(/^\s+|\s+$/g, "");
   }
   catch(e)
   {
      return str;
   }
}

/**
 * Convert from ISO8601 date to JavaScript date
 */

function fromISO8601(formattedString)
{
   var isoRegExp = /^(?:(\d{4})(?:-(\d{2})(?:-(\d{2}))?)?)?(?:T(\d{2}):(\d{2})(?::(\d{2})(.\d+)?)?((?:[+-](\d{2}):(\d{2}))|Z)?)?$/;

	var match = isoRegExp.exec(formattedString);
	var result = null;

	if (match)
	{
		match.shift();
		if (match[1]){match[1]--;} // Javascript Date months are 0-based
		if (match[6]){match[6] *= 1000;} // Javascript Date expects fractional seconds as milliseconds

		result = new Date(match[0]||1970, match[1]||0, match[2]||1, match[3]||0, match[4]||0, match[5]||0, match[6]||0);

		var offset = 0;
		var zoneSign = match[7] && match[7].charAt(0);
		if (zoneSign != 'Z')
		{
			offset = ((match[8] || 0) * 60) + (Number(match[9]) || 0);
			if (zoneSign != '-')
			{
			   offset *= -1;
			}
		}
		if (zoneSign)
		{
			offset -= result.getTimezoneOffset();
		}
		if (offset)
		{
			result.setTime(result.getTime() + offset * 60000);
		}
	}

	return result; // Date or null
}
File: org/alfresco/components/dashlets/activity-list.get.properties
title.generic=New Activity
label.no-activities=No Recent Activities

## ATOM feed messages
atom.title.site=Alfresco Activities Site Feed for {0}
atom.title.user=Alfresco Activities User Feed for {0}

## Optional Site link
in.site={0} in site {1}

## 0 = Item title / page link, 1 = User profile link, 2 = custom0, 3 = custom1
org.alfresco.blog.post-created={0} blog post created by {1}
org.alfresco.blog.post-updated={0} blog post updated by {1}
org.alfresco.blog.post-deleted={0} blog post deleted by {1}
org.alfresco.comments.comment-created={1} commented on {0}
org.alfresco.comments.comment-updated={1} updated comment on {0}
org.alfresco.comments.comment-deleted={1} deleted a comment from {0}
org.alfresco.discussions.post-created={0} discussion started by {1}
org.alfresco.discussions.post-updated={0} discussion updated by {1}
org.alfresco.discussions.post-deleted={0} discussion deleted by {1}
org.alfresco.discussions.reply-created={1} replied to the discussion {0}
org.alfresco.discussions.reply-updated={1} updated a reply to {0}
org.alfresco.calendar.event-created={0} calendar event created by {1}
org.alfresco.calendar.event-updated={0} calendar event updated by {1}
org.alfresco.calendar.event-deleted={0} calendar event deleted by {1}
org.alfresco.documentlibrary.file-added={0} document added by {1}
org.alfresco.documentlibrary.files-added={0} documents added by {1}
org.alfresco.documentlibrary.file-deleted={0} was deleted by {1}
org.alfresco.documentlibrary.files-deleted={0} documents deleted by {1}
org.alfresco.documentlibrary.file-updated={0} document updated by {1}
org.alfresco.documentlibrary.files-updated={0} documents updated by {1}
org.alfresco.wiki.page-created={0} wiki page created by {1}
org.alfresco.wiki.page-edited={0} wiki page updated by {1}
org.alfresco.wiki.page-renamed={2} wiki page renamed to {0} by {1}
org.alfresco.wiki.page-deleted={0} wiki page deleted by {1}
org.alfresco.site.user-joined={1} joined site {0} with role {2}
org.alfresco.site.user-left={1} left site {0}
org.alfresco.site.user-role-changed={1} role changed to {2}
org.alfresco.links.link-created={0} link created by {1}
org.alfresco.links.link-updated={0} link updated by {1}
org.alfresco.links.link-deleted={0} link deleted by {1}

Store: classpath:alfresco/webscripts

[No implementation files]