Index: wiki/src/main/resources/Main/Activity.xml
===================================================================
--- wiki/src/main/resources/Main/Activity.xml (revision 33060)
+++ wiki/src/main/resources/Main/Activity.xml (working copy)
@@ -106,15 +106,34 @@
// Start XWiki augmentation.
XWiki.Activity = Class.create({
initialize : function() {
- this.initHandlers();
+ this.initToggleHandlers();
+ this.initMoreItemsHandlers();
},
- initHandlers: function() {
+ initToggleHandlers: function() {
$$('.activityHeader').each(function(activityHeader){
- if(activityHeader.up().hasClassName('collapsed')){
- activityHeader.observe('click', this.toggle.bind(this, activityHeader.up()));
- }
+ this.initToggleHandler(activityHeader);
}.bind(this));
},
+ updateToggleHandlers: function(activityList) {
+ activityList.select('[class=activityHeader]').each(function(activityHeader){
+ this.initToggleHandler(activityHeader);
+ }.bind(this));
+ },
+ initToggleHandler: function(activityHeader) {
+ if(activityHeader.up().hasClassName('collapsed')){
+ activityHeader.observe('click', this.toggle.bind(this, activityHeader.up()));
+ }
+ },
+ initMoreItemsHandlers: function() {
+ if($('add-more-entries') != undefined){
+ $('add-more-entries').observe('click', this.addEntries.bindAsEventListener(this));
+ }
+ },
+ updateIterationDate: function() {
+ $('add-more-entries-container').previous('.activityList').select('[class=activityListTitle]').each(function(iterationDateTitle){
+ iterationDate = iterationDateTitle.innerHTML;
+ });
+ },
toggle: function() {
var collapsable = arguments[0];
if (collapsable.hasClassName('collapsed')) {
@@ -124,6 +143,58 @@
collapsable.addClassName('collapsed');
collapsable.down('.toolExpand').update('▼');
}
+ },
+ addEntries: function(event) {
+ event.stop();
+ this.updateIterationDate();
+ var activityDoc = new XWiki.Document('Activity', 'Main', XWiki.currentWiki);
+ var params = '&xpage=plain&entries=' + entriesToAdd
+ + '&subentries=' + subentries
+ + '&offset=' + offset
+ + '&date=' + iterationDate
+ + '&minor=' + minor
+ + '&rss=' + rss;
+ if(wikis != ''){ params += '&wikis=' + wikis; }
+ if(spaces != ''){ params += '&spaces=' + spaces; }
+ if(authors != ''){ params += '&authors=' + authors; }
+ if(tags != ''){ params += '&tags=' + tags; }
+ // Display loading spinner
+ $('add-more-entries-container').addClassName('loading');
+ // Get the new entries
+ new Ajax.Request(activityDoc.getURL(), {
+ method : 'get',
+ parameters : params,
+ onSuccess : this.onSuccess.bindAsEventListener(this),
+ on1223 : this.on1223.bindAsEventListener(this)
+ });
+ },
+ // IE converts 204 status code into 1223
+ on1223 : function(response) {
+ response.request.options.onSuccess(response);
+ },
+ onSuccess : function(response) {
+ var offsetAsInt = parseInt(offset);
+ var entriesToAddAsInt = parseInt(entriesToAdd);
+ // Insert new entries into the DOM
+ var newActivityList = new Element('ul', { 'class': 'activityList'}).update(response.responseText);
+ $('add-more-entries-container').insert({
+ before: newActivityList
+ });
+ // Remove loading spinner
+ $('add-more-entries-container').removeClassName('loading');
+ // If no more entries, remove 'more' element
+ offset = offsetAsInt + entriesToAddAsInt;
+ // Init toogle handlers for these new entries
+ this.updateToggleHandlers(newActivityList);
+ var entriesLeft = $('add-more-entries').down('.entriesLeft');
+ var newEntriesLeft = parseInt(entriesLeft.innerHTML) - entriesToAddAsInt;
+ if(newEntriesLeft <= 0){
+ // Remove 'more' from dom if there are no more entries to add
+ $('add-more-entries').update('');
+ }else{
+ // Update counter for the numbert of entries left to be displayed
+ entriesLeft.update(newEntriesLeft);
+ }
}
});
// End XWiki augmentation.
@@ -135,7 +206,7 @@
});
-Expand and Collapse
+Expand, Collapse and Show More Items
@@ -420,6 +491,24 @@
/** </end> Action Types **/
+/** <start> Show More **/
+.moreentries .tag-more {
+ color: $theme.linkColor;
+ cursor: pointer;
+ display: block;
+ font-size: 0.8em;
+ line-height: 0.5em;
+ margin: 0;
+ text-align: right;
+}
+.tag-more .arrow{
+ font-size: 0.7em;
+ margin-left: 3px;
+ position: relative;
+ top: -1px;
+}
+/** </end> Show More **/
+
/** CSS 3**/
.activityPage, .activityApplication, .activityUser {
background-color: #FDFDFD;
@@ -650,7 +739,7 @@
##
## Filter clause
##--------------------------------------------------------------
-#set($filterClause = '1=1')
+#set($filterClause = "act.space<>'Scheduler'")
##
## Get values from request/macro param
##--------------------------------------------------------------
@@ -673,24 +762,28 @@
$aWikis.add($context.database)
#end
#end
+#asString($aWikis $wikisAsString)
## Spaces
#setVariableFromRequest($aSpaces "spaces" [])
#if($aSpaces.size() == 0)
#set($aSpacesString = $context.macro.params.get('spaces'))
#asList($aSpaces $aSpacesString)
#end
+#asString($aSpaces $spacesAsString)
## Authors
#setVariableFromRequest($aAuthors "authors" [])
#if($aAuthors.size() == 0)
#set($aAuthorsString = $context.macro.params.get('authors'))
#asList($aAuthors $aAuthorsString)
#end
+#asString($aAuthors $authorsAsString)
## Tags
#setVariableFromRequest($aTags "tags" [])
#if($aTags.size() == 0)
#set($aTagsString = $context.macro.params.get('tags'))
#asList($aTags $aTagsString)
#end
+#asString($aTags $tagsAsString)
## Minor versions
#setVariableFromRequest($aMinor "minor" false)
#if(!$aMinor && $context.macro.params.get('minor'))
@@ -701,6 +794,11 @@
#if(!$aRSS && $context.macro.params.get('rss'))
#set($aRSS = $context.macro.params.get('rss'))
#end
+## Offset
+#setVariableFromRequest($aOffset 'offset' 0)
+## Current entry date
+## used in Ajax requests in order to not display the same date header more than once
+#setVariableFromRequest($aCurrentEntryDate 'date' '')
##
## Filter by
## ------------------------------------------------------------
@@ -754,6 +852,20 @@
#end
#end
#**
+ * Get the items from $list and put them in a $stringResult
+ * @list The list (java.util.List) of elements
+ * @stringResult The result
+ *#
+#macro(asString $list $stringResult)
+ #set($stringResult = '')
+ #foreach($item in $list)
+ #if($velocityCount > 1)
+ #set($stringResult = $stringResult + ',')
+ #end
+ #set($stringResult = $stringResult + "$!item")
+ #end
+#end
+#**
* Build query filter clause
* @colName The name of the collumn in the database table
* @colValues The values to match with
@@ -888,7 +1000,8 @@
#isDocumentVersionValid($event)
#if($isDocumentVersionValid)
#set($pageDocRevision = $xwiki.getDocument($xwiki.getDocument($event.page), $event.version))
- #set($commentContent = $!pageDocRevision.getObject('XWiki.XWikiComments', $util.parseInt($event.param2)).getProperty('comment').value)
+ #set($comment = $!pageDocRevision.getObject('XWiki.XWikiComments', $util.parseInt($event.param2)))
+ #set($commentContent = $pageDocRevision.getRenderedContent($comment.getProperty('comment').getValue(), $pageDocRevision.getSyntax().toIdString()))
#end
#end
#**
@@ -900,8 +1013,9 @@
#isDocumentVersionValid($event)
#if($isDocumentVersionValid)
#set($pageDocRevision = $xwiki.getDocument($xwiki.getDocument($event.page), $event.version))
- #set($annotationSelection = $pageDocRevision.getObject('AnnotationCode.AnnotationClass', $util.parseInt($event.param2)).getProperty('selection').value)
- #set($annotationText = $pageDocRevision.getObject('AnnotationCode.AnnotationClass', $util.parseInt($event.param2)).getProperty('annotation').value)
+ #set($annotation = $pageDocRevision.getObject('AnnotationCode.AnnotationClass', $util.parseInt($event.param2)))
+ #set($annotationSelection = $pageDocRevision.getRenderedContent($comment.getProperty('selection').getValue(), $pageDocRevision.getSyntax().toIdString()))
+ #set($annotationText = $pageDocRevision.getRenderedContent($comment.getProperty('annotation').getValue(), $pageDocRevision.getSyntax().toIdString()))
#end
#end
#**
@@ -917,7 +1031,7 @@
#foreach($event in $events)
#set($hasRelatedEvents = false)
#set($isUpdateOrAddAttachmentRelatedEvent = false)
- #set($isAnnotationUpdateRelatedEvent = false) ## TO DO - remove this variable after fixing XWIKI-5632
+ #set($isAnnotationUpdateRelatedEvent = false)## TO DO - remove this variable after fixing XWIKI-5632
#set($isConsecutiveUpdateEvent = false)
#set($isRelatedAttachmentEvent = false)
#set($isCreateOrDeleteRelatedEvent = false)
@@ -1183,26 +1297,29 @@
##
## Date header + Start list
## -------------------------------------------------------------------
- #if($isToday && $displayToday)
+ #if($isToday && $displayToday && "$!msg.get('timeAgo.today')" != "$!aCurrentEntryDate")
#set($closeList = true) ## a new list will be opened
- <h2>$msg.get('timeAgo.today')</h2><ul class='activityList'> ## display 'Today' message
+ <h2 class="activityListTitle">$msg.get('timeAgo.today')</h2><ul class='activityList'> ## display 'Today' message
#set($displayToday = false)
- #elseif($isYesterday && $displayYesterday) ## display 'Yesterday' message
+ #set($aCurrentEntryDate = $msg.get('timeAgo.today'))
+ #elseif($isYesterday && $displayYesterday && "$!msg.get('timeAgo.yesterday')" != "$!aCurrentEntryDate") ## display 'Yesterday' message
#if($closeList) ## there are events today
</ul>
#else
#set($closeList = true) ## a new list will be opened
#end
- <h2>$msg.get('timeAgo.yesterday')</h2><ul class='activityList'>
+ <h2 class="activityListTitle">$msg.get('timeAgo.yesterday')</h2><ul class='activityList'>
#set($displayYesterday = false)
- #elseif(!$isToday && !$isYesterday && $iterationDate != $displayDate) ## display date message
+ #set($aCurrentEntryDate = $msg.get('timeAgo.yesterday'))
+ #elseif(!$isToday && !$isYesterday && $iterationDate != $displayDate && "$!iterationDate" != "$!aCurrentEntryDate") ## display date message
#set($displayDate = $iterationDate)
#if($closeList) ## there are events today or/and yesterday
</ul>
#else
#set($closeList = true) ## a new list will be opened
#end
- <h2>$!iterationDate</h2><ul class='activityList'>
+ <h2 class="activityListTitle">$!iterationDate</h2><ul class='activityList'>
+ #set($aCurrentEntryDate = $iterationDate)
#end
##
## Open event list + Display first event
@@ -1234,41 +1351,79 @@
#macro(displayActivity)
#set($iterationDate = '')
#set($displayDate = '')
- #set($iterationDocuments = $util.arrayList)
#set($displayToday = true)
#set($displayYesterday = true)
#set($closeList = false)
- ##
- ## Get distinct pages with activity
- ## -------------------------------------------------------------------
- #set ($pages = $xwiki.activitystream.searchUniquePages("$!filterClause", $aEntries, 0))
- #if ($pages.size() > 0)
- #foreach($page in $pages)
- ##
- ## Extract page name and event date
- ## -------------------------------------------------------------------
- #set($pageName = $page.get(0))
- #set($pageDate = $page.get(1))
- #if($xwiki.hasAccessLevel("view", $context.user, "${context.database}:${pageName}") && !$iterationDocuments.contains($pageName))
+ #if($aEntries > 0)
+ ##
+ ## Get distinct pages with activity
+ ## -------------------------------------------------------------------
+ #set ($pages = $xwiki.activitystream.searchUniquePages("$!filterClause", $aEntries, $aOffset))
+ #if ($pages.size() > 0)
+ #foreach($page in $pages)
##
- ## Get event list for the current page
+ ## Extract page name and event date
## -------------------------------------------------------------------
- #set($whereClause = " and month(date)=" + ${xwiki.formatDate($pageDate, 'M')} + " and year(date)=" + ${xwiki.formatDate($pageDate, 'yyyy')} + " and day(date)=" + ${xwiki.formatDate($pageDate, 'd')} + " and $!filterClause")
- #set($events= $xwiki.activitystream.searchEvents("act.page='$pageName' and act.space<>'Scheduler' $!whereClause", false, 0, 0))
- #if($events.size() > 0)
+ #set($pageName = $page.get(0))
+ #set($pageDate = $page.get(1))
+ #if($xwiki.hasAccessLevel("view", $context.user, "${context.database}:${pageName}"))
##
- ## Initialize page event vars
+ ## Get event list for the current page
## -------------------------------------------------------------------
- #removeDuplicatedEvents()
- #isPageEntryExpandable()
- #getUniqueEventUsers()
- #displayEvents()
+ #set($whereClause = " month(date)=" + ${xwiki.formatDate($pageDate, 'M')} + " and year(date)=" + ${xwiki.formatDate($pageDate, 'yyyy')} + " and day(date)=" + ${xwiki.formatDate($pageDate, 'd')} + " and $!filterClause")
+ #set($events= $xwiki.activitystream.searchEvents("act.page='$pageName' and $!whereClause", false, 0, 0))
+ #if($events.size() > 0)
+ ##
+ ## Initialize page event vars
+ ## -------------------------------------------------------------------
+ #removeDuplicatedEvents()
+ #isPageEntryExpandable()
+ #getUniqueEventUsers()
+ #displayEvents()
+ #end
#end
#end
+ #if($closeList)## close the last event list
+ </ul>
+ #end
+ ##
+ ## More entries
+ ## -------------------------------------------------------------------
+ #if("$!request.xpage" != 'plain')
+ #set($allPages = $xwiki.activitystream.searchUniquePages("$!filterClause", 0, 0))
+ #set($totalEntries = 0)
+ #foreach($page in $allPages)
+ #set($pageName = $page.get(0))
+ #if($xwiki.hasAccessLevel("view", $context.user, "${context.database}:${pageName}"))
+ #set($totalEntries = $totalEntries + 1)
+ #end
+ #end
+ #if($aEntries < $totalEntries)
+ #setVariableFromRequest($entriesToAdd "more" $aEntries)
+ #set($entriesToDisplay = $aEntries + $entriesToAdd) ## increase the number of entries to display on the next step with $aEntries initial value
+ #set($entriesLeft = $totalEntries - $aEntries) ## entries left to display
+ <div class="xclass collapsed moreentries" id="add-more-entries-container">
+ <span class="tag-tool tag-more xclass-title" id="add-more-entries"><a href="$xwiki.getURL($doc.fullName, 'view', "entries=$!{entriesToDisplay}&more=$!{entriesToAdd}")" title="$msg.get('xe.activity.showmore.title')">$msg.get('xe.activity.showmore')</a> <span class="itemCount">(<span class="entriesLeft">$entriesLeft</span>)</span><span class="arrow">▼</span></span>
+ </div>
+ ## Initialize request parameters
+ <script type="text/javascript">
+ //<![CDATA[
+ var entriesToAdd = '$!{entriesToAdd}';
+ var offset = '$!{aEntries}';
+ var totalEntries = '$!{totalEntries}';
+ var iterationDate = '$!{aCurrentEntryDate}';
+ var subentries = '$!{aSubEntries}';
+ var wikis = '$!{wikisAsString}';
+ var spaces = '$!{spacesAsString}';
+ var authors = '$!{authorsAsString}';
+ var tags = '$!{tagsAsString}';
+ var minor = '$!{aMinor}';
+ var rss = '$!{aRSS}';
+ //]]>
+ </script>
+ #end
+ #end
#end
- #if($closeList) ## close the last event list
- </ul>
- #end
#else
<span class="noitems">$msg.get('xe.activity.noentries')</span>
#end
@@ -1282,7 +1437,7 @@
{{/velocity}}
{{velocity}}
-{{html}}
+{{html clean="false"}}
#displayActivity()
{{/html}}
{{/velocity}}