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('&#9660;'); } + }, + 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">&#9660;</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}}