Änderungen von Dokument RecentlyUpdated

Zuletzt geändert von xwikiadmin am 2025/05/21 09:56

Von Version 6.1
bearbeitet von xwikiadmin
am 2025/05/21 09:56
Änderungskommentar: Install extension [com.xwiki.pro:xwiki-pro-macros-ui/1.26.19]
Auf Version 1.1
bearbeitet von xwikiadmin
am 2023/04/25 11:20
Änderungskommentar: Install extension [com.xwiki.pro:xwiki-pro-macros/1.7.1]

Zusammenfassung

Details

Seiteneigenschaften
Inhalt
... ... @@ -6,20 +6,17 @@
6 6  = Parameters =
7 7  
8 8  |=Parameter|=Description|=Required|=Default
9 -|**types**|Select one or multiple content types. The macro will display only the content of the type you specify here.|No|//all types//
10 -|**spaces**|Select one or multiple spaces. The macro will display only the documents present in the selected spaces.|No|{{{@self}}}
11 -|**author**|Comma-separated list of authors.|No|
12 -|**labels**|Comma-separated list of tags.|No|
13 -|**excludedLabels**|Comma-separated list of tags.|No|
9 +|**types**|Comma-separated list of types ({{{ page }}}, {{{ blogpost }}}, {{{ comment }}} or {{{ attachment }}}), possibly prefixed with "-".|No|//all types//
10 +|**spaces**|Comma-separated list of spaces, possibly prefixed with "+" or "-", or special value like {{{ @self }}}, {{{ @global }}} or {{{ @all }}}.|No|{{{ @self }}}
11 +|**author**|Comma-separated list of authors.|No|
12 +|**labels**|Comma-separated list of tags, possibly prefixed with "+" or "-".|No|
14 14  |**max**|Maximum number of results.|No| {{{ 15 }}}
15 15  |**theme**|Appearance of the macro ({{{ concise }}}, {{{ social }}}, {{{ sidebar }}}).|No| {{{ concise }}}
16 16  |**width**|Width of the macro in percentage.|No| {{{ 100% }}}
17 17  |**hideHeading**|Whether to hide the text "Recently Updated" as title|No| {{{ false }}}
18 18  |**showProfilePic**|Whether to show the profile picture of users|No| {{{ false }}}
19 -|**currentWiki**|If this parameter is selected then the spaces & excluded spaces parameters are ignored and the macro will display the documents from the current wiki.|No| {{{ false}}}
20 -|**excludedSpaces**|Select one or multiple spaces. The macro will not display the documents present in the selected spaces.|No|
21 -|**global**|If this parameter is selected then spaces, excluded spaces and the current wiki parameters are ignored and the macro will display the documents from the current wiki and subwikis. |No| {{{ false}}}
22 22  
19 +
23 23  = Example Usage =
24 24  
25 25  {{code}}
XWiki.JavaScriptExtension[0]
Code
... ... @@ -4,71 +4,67 @@
4 4  #[[
5 5  
6 6  require(['jquery'], $ => {
7 - const MACRO_SERVICE_URL = new XWiki.Document(
8 - XWiki.Model.resolve('Confluence.Macros.RecentlyUpdatedService', XWiki.EntityType.DOCUMENT)
9 - ).getURL('get');
7 + $(() => {
8 + const MACRO_SERVICE_URL = new XWiki.Document(
9 + XWiki.Model.resolve('Confluence.Macros.RecentlyUpdatedService', XWiki.EntityType.DOCUMENT)
10 + ).getURL('get');
10 10  
11 - /*
12 - * Query new results and append them to the page
13 - */
14 - function showMore(event) {
15 - const macro = event.target.closest('.recently-updated-macro');
16 - if (!macro) {
17 - console.log("Failed to show more");
18 - return;
12 + const $macros = $('.recently-updated-macro');
13 +
14 + /*
15 + * Query new results and append them to the page
16 + */
17 + const fetchMoreResultsHTML = function ($macro) {
18 + const urlParams = [
19 + 'xpage=plain',
20 + 'outputSyntax=plain',
21 + 'macroOptions=' + encodeURIComponent($macro.data('options')),
22 + ].join('&');
23 + const url = MACRO_SERVICE_URL + '?' + urlParams;
24 + fetch(url)
25 + .then(function (response) {
26 + if (!response.ok) {
27 + throw new Error('An error occured fetching new results.');
28 + }
29 + return response.text();
30 + })
31 + .then(function (html) {
32 + // Append html results directly to the page
33 + $macro.find('ul.results').append(html);
34 + handleMetadata($macro);
35 + });
19 19   }
20 20  
21 - const urlParams = [
22 - 'xpage=plain',
23 - 'outputSyntax=plain',
24 - 'fromAjax=true',
25 - 'macroOptions=' + encodeURIComponent(macro.dataset.options),
26 - ].join('&');
27 - const url = MACRO_SERVICE_URL + '?' + urlParams;
28 - fetch(url)
29 - .then(function (response) {
30 - if (!response.ok) {
31 - throw new Error('An error occured fetching new results.');
32 - }
33 - return response.text();
34 - })
35 - .then(function (html) {
36 - // Append html results directly to the page
37 - $(macro.querySelector('ul.results')).append(html);
38 - handleMetadata(macro);
39 - });
40 - }
41 -
42 - /*
43 - * Store fetched metadata for next result fetch
44 - * Update fetch button according to whether there are more results to fetch
45 - */
46 - function handleMetadata(macro) {
47 - const dataElement = macro.querySelector('.recently-updated-options');
48 - if (dataElement) {
49 - macro.dataset.options = dataElement.dataset.options;
50 - const btn = macro.querySelector('button.show-more');
51 - if (btn) {
52 - if (dataElement.dataset.hasNext !== "true") {
53 - $(btn).replaceWith('<div class="no-more-results">' + l10n['noMoreResults'] + '</div>');
54 - } else {
55 - btn.addEventListener('click', showMore);
38 + /*
39 + * Store fetched metadata for next result fetch
40 + * Update fetch button according to whether there are more results to fetch
41 + */
42 + const handleMetadata = function ($macro) {
43 + const $dataElement = $macro.find('.recently-updated-options');
44 + if ($dataElement.length === 0) {
45 + console.warn('No options were found when fetching new results')
46 + } else {
47 + $macro.data('options', $dataElement.attr('data-options'))
48 + const hasNext = JSON.parse($dataElement.attr('data-has-next'));
49 + if (!hasNext) {
50 + $macro.find('button.show-more')
51 + .replaceWith('<div class="no-more-results">' + l10n['noMoreResults'] + '</div>')
56 56   }
53 + $dataElement.remove();
57 57   }
58 - dataElement.remove();
59 - }
60 - }
55 + };
61 61  
62 - function init() {
63 - for (const macro of document.querySelectorAll('.recently-updated-macro')) {
64 - handleMetadata(macro);
65 - }
66 - }
57 + // Init
58 + $macros.each(function (i, macro) {
59 + handleMetadata($(macro));
60 + });
67 67  
68 - $(() => {
69 - $(document).on('xwiki:dom:updated', init);
70 - init();
71 - });
62 + // Fetch new results
63 + $macros.find('button.show-more').click(function (event) {
64 + const $macro = $(event.target).closest('.recently-updated-macro');
65 + fetchMoreResultsHTML($macro);
66 + })
67 + })
72 72  });
73 73  
74 74  ]]#
XWiki.StyleSheetExtension[0]
Code
... ... @@ -30,7 +30,7 @@
30 30   grid-area: metadata;
31 31   .text-muted-smaller();
32 32  
33 - .result-last-author-avatar img {
33 + .result-last-author-avatar img.avatar {
34 34   display: inline-block;
35 35   width: 1em;
36 36   height: 1em;
... ... @@ -58,7 +58,7 @@
58 58   column-gap: 0.6rem;
59 59  
60 60   &.collapsed {
61 - .result-last-author-avatar img {
61 + .result-last-author-avatar img.avatar {
62 62   display: none;
63 63   }
64 64  
XWiki.WikiMacroClass[0]
Makro-Code
... ... @@ -8,6 +8,49 @@
8 8  ## Parameter formatting macros
9 9  ## -----------------------------------------------------------------
10 10  
11 +## Format serialized comma-separated list coming from macro parameters
12 +## so that it can be used inside a solr filter query parameter
13 +## * Escape spaces inside values by wrapping them inside quotes,
14 +## making sure "+" and "-" filter modifiers stay outside the quotes
15 +## * Remove commas so that values are separated only by spaces
16 +#macro (formatSerializedList $serializedList $return)
17 + ## Wrap each value around quotes and replace commas by spaces
18 + ## (adds extra quotes / spaces at the beginning and end of the string)
19 + #set ($searchRegex = '(?:^|$|,)\s*([-+]?)')
20 + #set ($replacement = '" $1"')
21 + #set ($formatted = $!stringtool.replaceAll($serializedList, $searchRegex, $replacement))
22 + ## Remove extra quotes / spaces at the beginning and end of the string
23 + #set ($formatted = $!stringtool.substring($formatted, 2, -2))
24 + ## Return
25 + #set ($return = $NULL)
26 + #setVariable("$return" $formatted)
27 +#end
28 +
29 +## Format serialized comma-separated author list coming from macro parameters
30 +## Author format is different between comments and document metadata
31 +## ("xwiki:" wiki prefix is missing from comments author metadata),
32 +## so add both versions in the formatted serialized list
33 +#macro (formatSerializedAuthorList $serializedAuthorList $return)
34 + #set ($authorsList = [])
35 + #set ($splittedAuthorList = $!stringtool.split($serializedAuthorList, ','))
36 + #foreach ($author in $splittedAuthorList)
37 + #set ($author = $!stringtool.strip($author))
38 + #set ($modifier = '')
39 + #if ($author.startsWith('-'))
40 + #set ($modifier = '-')
41 + #set ($author = $author.substring(1))
42 + #end
43 + #set ($resolvedAuthor = $services.model.resolveDocument($author))
44 + #set ($discard = $authorsList.add("${modifier}${author}"))
45 + #set ($discard = $authorsList.add("${modifier}${services.model.serialize($resolvedAuthor, 'default')}"))
46 + #end
47 + #set ($authors = $!stringtool.join($authorsList, ','))
48 + #formatSerializedList($authors, $authors)
49 + ## Return
50 + #set ($return = $NULL)
51 + #setVariable("$return" $authors)
52 +#end
53 +
11 11  ## Format serialized comma-separated types list coming from macro parameters
12 12  ## Return a list containing all the types of results that need to be displayed
13 13  #macro (parseTypes $serializedTypeList $return)
... ... @@ -43,60 +43,6 @@
43 43   #setVariable("$return" $types)
44 44  #end
45 45  
46 -## Creates the final space parameter. ConfluenceSpaces comes from migreations and is a mix of prefixed(+/-) spaces and excludedSpaces comes
47 -## from XWiki and are the spaces that should be excluded when doing the solr query.
48 -#macro (constructSpaceParameter $confluenceSpaces, $excludedSpaces)
49 - #set ($exclude = "")
50 - #foreach ($excludedSpace in $excludedSpaces.split(","))
51 - #if (!$excludedSpace.trim().isBlank())
52 - #if ($foreach.first)
53 - #set ($exclude = "-$excludedSpace")
54 - #else
55 - #set ($exclude = "$exclude,-$excludedSpace")
56 - #end
57 - #end
58 - #end
59 - #if (!$confluenceSpaces.trim().isEmpty() && !$exclude.trim().isEmpty())
60 - #set ($finalSpace = "${confluenceSpaces},${exclude}")
61 - #elseif(!$confluenceSpaces.trim().isEmpty())
62 - #set ($finalSpace = $confluenceSpaces)
63 - #else
64 - #set ($finalSpace = $exclude)
65 - #end
66 -#end
67 -
68 -## Determine if the search should be done in the currentWiki, globally or only on specific spaces.
69 -#macro (determinateSpaceScope $confluenceSpacesString)
70 - ## If the global parameter is marked then we set the search to everywhere, if the currentWiki is marked then we select the current wiki
71 - ## otherwise we just the actual space selected.
72 - #if ($xcontext.macro.params.global == "true")
73 - #set ($confluenceSpacesString = '@all')
74 - #elseif ($xcontext.macro.params.currentWiki == "true")
75 - #set ($confluenceSpacesString = '@global')
76 - #end
77 -#end
78 -
79 -## Handles the construction of the tags parameter.
80 -#macro (constructTagsParameter $confluenceTags, $excludedTags)
81 - #set ($exclude = "")
82 - #foreach ($excludedSpace in $excludedTags.split(","))
83 - #if (!$excludedSpace.trim().isBlank())
84 - #if ($foreach.first)
85 - #set ($exclude = "-$excludedSpace")
86 - #else
87 - #set ($exclude = "$exclude,-$excludedSpace")
88 - #end
89 - #end
90 - #end
91 - #if (!$confluenceTags.trim().isEmpty() && !$exclude.trim().isEmpty())
92 - #set ($finalTags = "${confluenceTags},${exclude}")
93 - #elseif (!$confluenceTags.trim().isEmpty())
94 - #set ($finalTags = $confluenceTags)
95 - #else
96 - #set ($finalTags = $exclude)
97 - #end
98 -#end
99 -
100 100  ## Init options from macro parameters
101 101  #macro (initOptionsFromParameters $return)
102 102   ## Gather every parameter in an option object that will be returned
... ... @@ -108,19 +108,19 @@
108 108   #end
109 109  
110 110   ## Authors
111 - #set ($options.authors = "$!stringtool.strip($!stringtool.join($!wikimacro.parameters.author, ','))")
100 + #set ($confluenceAuthorsString = "$!stringtool.strip($!wikimacro.parameters.author)")
101 + #formatSerializedAuthorList($confluenceAuthorsString, $authors)
102 + #set ($options.authors = $authors)
103 +
112 112   ## Wiki & Spaces
113 - #set ($excludedSpaces = "$!xcontext.macro.params.excludedSpaces")
114 - #set ($confluenceSpacesString = "$!stringtool.strip($!xcontext.macro.params.spaces)")
105 + #set ($confluenceSpacesString = "$!stringtool.strip($!wikimacro.parameters.spaces)")
115 115   #set ($options.spaces = $NULL)
116 116   #set ($options.wiki = $doc.wiki)
117 - #determinateSpaceScope($confluenceSpacesString)
118 118   #if (
119 119   $confluenceSpacesString.equals('')
120 120   || $confluenceSpacesString.equals('@self')
121 121   )
122 122   ## Search in current space
123 - ## Newly migrated content don't have @self, see https://jira.xwiki.org/projects/CONFLUENCE/issues/CONFLUENCE-236
124 124   #set ($options.spaces = $doc.space)
125 125   #elseif (
126 126   $confluenceSpacesString.equals('@global')
... ... @@ -140,16 +140,17 @@
140 140   #set ($options.wiki = $NULL)
141 141   #else
142 142   ## Search in specified spaces
143 - #constructSpaceParameter($confluenceSpacesString, $excludedSpaces)
144 - #set ($options.spaces = $finalSpace)
132 + #formatSerializedList($confluenceSpacesString, $spaces)
133 + #set ($options.spaces = $spaces)
145 145   #end
146 146  
147 147   ## Tags
148 - #constructTagsParameter("$!stringtool.strip($!xcontext.macro.params.labels)", "$!stringtool.strip($!xcontext.macro.params.excludedLabels)")
149 - #set ($options.tags = $finalTags)
137 + #set ($confluenceLabelString = "$!stringtool.strip($!wikimacro.parameters.labels)")
138 + #formatSerializedList($confluenceLabelString, $tags)
139 + #set ($options.tags = $tags)
150 150  
151 151   ## Types
152 - #set ($confluenceTypesString = "$!stringtool.strip($!xcontext.macro.params.types)")
142 + #set ($confluenceTypesString = "$!stringtool.strip($!wikimacro.parameters.types)")
153 153   #parseTypes($confluenceTypesString, $types)
154 154   #set ($options.types = $types)
155 155  
... ... @@ -209,14 +209,18 @@
209 209  #end
210 210  {{/velocity}}
211 211  
202 +{{include reference="Licenses.Code.VelocityMacros"/}}
203 +
212 212  {{velocity}}
213 213  ## We need to check if there is a valid license because the macro is registered even if the user doesn't have view right
214 214  ## on the macro definition page. See XWIKI-14828: Rendering macros defined in wiki pages are available to users that
215 215  ## don't have view right on those pages.
216 -#if ($services.promacrolicensing.hasLicensureForEntity($xcontext.macro.doc.documentReference))
208 +#if ($services.licensing.licensor.hasLicensureForEntity($xcontext.macro.doc.documentReference))
217 217   #executeMacro
218 218  #else
219 - {{missingLicenseMessage extensionName="proMacros.extension.name"/}}
211 + {{error}}
212 + #getMissingLicenseMessage('proMacros.extension.name')
213 + {{/error}}
220 220  #end
221 221  {{/velocity}}
222 222  
Default categories
... ... @@ -1,1 +1,0 @@
1 -Content
Standardkategorie
... ... @@ -1,0 +1,1 @@
1 +confluence
Makrobeschreibung
... ... @@ -1,0 +1,1 @@
1 +Add the Recently Updated macro to a page to show a list of pages, blogs, files, and comments that have been created or edited recently. This is great for project landing, information pages, or team space home pages. It's very flexible, you can limit the list to specific people, spaces, types of content, and more.
XWiki.WikiMacroParameterClass[0]
Parameter-Beschreibung
... ... @@ -1,0 +1,1 @@
1 +Filter the results by author. The macro will display only the pages etc which were last modified by the author(s) you specify here. You can specify multiple users.
Parameter-Typ
... ... @@ -1,1 +1,1 @@
1 -com.xwiki.macros.internal.userlist.UserReferenceList
1 +java.lang.String
XWiki.WikiMacroParameterClass[1]
Parameter-Beschreibung
... ... @@ -1,0 +1,1 @@
1 +This parameter allows you to filter content by space. The macro will display only the pages etc which belong to the space(s) you specify here. You can specify one or more space keys, separated by a comma or a space. To exclude content in a specific space, put a minus sign (-) immediately in front of that space key. For example: If you specify a space key of -BADSPACE you will get only content which is not in the BADSPACE. To indicate that the results must come from a specific space, put a plus sign (+) immediately in front of that space key. For example: If you specify a space key of +GOODSPACE you will get only content in GOODSPACE. (Note that this is not particularly useful, because each content item belongs to one space only. If you put a plus sign next to one space key and list other space keys too, the other space keys will be ignored.) Special values: "@self" - the current space, "@global" - all spaces in wiki, "@all" or "*" - all spaces in every wiki
Parameter-Typ
... ... @@ -1,1 +1,1 @@
1 -com.xwiki.pickers.SuggestSpacesReference
1 +java.lang.String
XWiki.WikiMacroParameterClass[2]
Parameter-Beschreibung
... ... @@ -1,0 +1,1 @@
1 +Filter the results by label. The macro will display only the pages etc which are tagged with the label(s) you specify here. You can specify one or more label values, separated by a comma or a space. To exclude content which matches a given label, put a minus sign (-) immediately in front of that label value. For example: If you specify a label value of -badpage you will get only content which is not labeled with 'badpage'. To indicate that the results** **must match a given label value, put a plus sign (+) immediately in front of that label value. For example: If you specify a label value of +superpage,+goodpage you will get only content which has at least two labels, being 'superpage' and 'goodpage'. The labels parameter only applies to the page and blog content types.
Parameter-Typ
... ... @@ -1,1 +1,1 @@
1 -com.xwiki.pickers.TagsReference
1 +java.lang.String
XWiki.WikiMacroParameterClass[3]
Parameter-Beschreibung
... ... @@ -1,0 +1,1 @@
1 +Specify the width of the macro display, as a percentage of the window width.
XWiki.WikiMacroParameterClass[4]
Parameter-Beschreibung
... ... @@ -1,0 +1,1 @@
1 +This parameter allows you to filter content by content type. The macro will display only the content of the type you specify here. You can specify one or more types, separated by a comma or a space. To exclude content of a given content type, put a minus sign (-) immediately in front of that content type. For example: If you specify a content type of -blogpost you will get pages and all other content except for blog posts. Available values: "page" - documents, "blogpost" or "news" - blogpost documents, "comment" - comments on documents, "attachment" - attachments
Parameter-Typ
... ... @@ -1,1 +1,1 @@
1 -com.xwiki.pickers.recentlyupdated.RecentlyUpdateType
1 +java.lang.String
XWiki.WikiMacroParameterClass[5]
Parameter-Beschreibung
... ... @@ -1,0 +1,1 @@
1 +Specify the maximum number of results to be displayed. If this parameter is omitted, then a maximum of 15 results are displayed.
XWiki.WikiMacroParameterClass[6]
Parameter-Beschreibung
... ... @@ -1,0 +1,1 @@
1 +Choose the appearance of this macro: "concise" - the default list, showing the names of pages which were updated or commented on, the users who made the page modifications and time when the modifications occurred. "social" - lists recent modifications in reverse chronological order, but groups them by user into short time segments. A 'sub' list appears within each user's time segment, showing the names of pages which they updated or commented on and time when these modifications occurred. "sidebar" - lists recent updates in reverse chronological order, showing the names of pages which were updated or commented on and time when the page modifications occurred. This theme does not show authorship.
Parameter-Typ
... ... @@ -1,1 +1,1 @@
1 -com.xwiki.macros.internal.recentlyupdated.RecentlyUpdatedThemeEnum
1 +java.lang.String
XWiki.WikiMacroParameterClass[7]
Parameter-Beschreibung
... ... @@ -1,0 +1,1 @@
1 +Specify "showProfilePic=true" to display the profile pictures of the users who updated the content.
XWiki.WikiMacroParameterClass[8]
Parameter-Beschreibung
... ... @@ -1,0 +1,1 @@
1 +Determines whether the macro hides or displays the text 'Recently Updated' as a title above the list of content. Only available in wikimarkup and storage format. Accepted values: "true" - Title is hidden, "false" - Title is shown.
XWiki.WikiMacroParameterClass[9]
Parameter-Name
... ... @@ -1,1 +1,0 @@
1 -excludedLabels
Parameter-Typ
... ... @@ -1,1 +1,0 @@
1 -com.xwiki.pickers.TagsReference
XWiki.WikiMacroParameterClass[10]
Parameter-Vorgabe
... ... @@ -1,1 +1,0 @@
1 -false
Parameter-Name
... ... @@ -1,1 +1,0 @@
1 -global
Parameter-Typ
... ... @@ -1,1 +1,0 @@
1 -java.lang.Boolean
Parameter verpflichtend
... ... @@ -1,1 +1,0 @@
1 -Nein
XWiki.WikiMacroParameterClass[11]
Parameter-Vorgabe
... ... @@ -1,1 +1,0 @@
1 -false
Parameter-Name
... ... @@ -1,1 +1,0 @@
1 -currentWiki
Parameter-Typ
... ... @@ -1,1 +1,0 @@
1 -java.lang.Boolean
Parameter verpflichtend
... ... @@ -1,1 +1,0 @@
1 -Nein
XWiki.WikiMacroParameterClass[12]
Parameter-Name
... ... @@ -1,1 +1,0 @@
1 -excludedSpaces
Parameter-Typ
... ... @@ -1,1 +1,0 @@
1 -com.xwiki.pickers.SuggestSpacesReference