<#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 > 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> |
<#if activities?exists && activities?size > 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> |
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
}
|