Show last authors
1 {{velocity}}
2 #set ($xwikiUsersClassReference = $services.model.createDocumentReference($xcontext.database, 'XWiki', 'XWikiUsers'))
3 #set ($xwikiUsersClassName = $services.model.serialize($xwikiUsersClassReference))
4 #set ($xwikiUsersClass = $xwiki.getClass($xwikiUsersClassName))
5 #set ($directoryPreferencesClassReference = $services.model.createDocumentReference($xcontext.database, 'XWiki', 'UserDirectoryPreferencesClass'))
6 #set ($directoryPreferencesClassName = $services.model.serialize($directoryPreferencesClassReference))
7 ##
8 ## Fake user used in some cases to properly display class properties
9 #set ($fakeUser = false)
10 ##
11 ## Set the fixed columns that we want the user directory to always show.
12 #set ($columns = ['_avatar', 'doc.name'])
13 ##
14 ## The columns that the user directory will default to when no user preferences exist or when the user resets to default.
15 #set ($defaultColumns = ['first_name', 'last_name'])
16 #set ($defaultColumnsString = $stringtool.join($defaultColumns, ' '))
17 #set ($isCustomized = false)
18 ##
19 ## Guests and superadmin don't have an user profile and, therefore, no preferences. Offer default.
20 #if ($isGuest || $isSuperAdmin)
21 #if ($isGuest)
22 {{info}}$services.localization.render('xe.userdirectory.canCustomizeInfoGuest', ["path:$doc.getURL('login')"]){{/info}}
23 #end
24 ## Use the default columns for guests or superadmin.
25 #set ($discard = $columns.addAll($defaultColumns))
26 ## Fake a user (in-memory) object inside a fake user profile page in order to be able to nicely display translated property pretty names of the XWikiUsers class.
27 #set ($userPreferences = $doc)
28 #set ($fakeUser = $doc.newObject($xwikiUsersClassName))
29 #else
30 ## User is logged in.
31 #set ($userPreferences = $xwiki.getDocument($xcontext.userReference))
32 #set ($userPreference = $userPreferences.getObject($directoryPreferencesClassName))
33 #if (!$userPreference)
34 ## Fake a user directory preference (in-memory) object just to be able to display the default values nicely.
35 #set ($userPreference = $userPreferences.newObject($directoryPreferencesClassName))
36 #set ($discard = $userPreference.set('columns', $defaultColumnsString))
37 #end
38 ##
39 ## Read the user's preferences and build the list of columns to display.
40 #set ($userColumnsString = $!{userPreference.getProperty('columns').value.trim()})
41 #foreach ($column in $userColumnsString.split('\s+'))
42 ## Skip invalid or duplicate columns. Duplicate columns break the livetable filtering query.
43 #if ($column.trim() != '' && $xwikiUsersClass.get($column) && !$columns.contains($column))
44 #set ($discard = $columns.add($column))
45 #end
46 #end
47 ##
48 ## Check if they are the default preferences.
49 #if ($userColumnsString != $defaultColumnsString)
50 ## Mark it as a customized user directory.
51 #set ($isCustomized = true)
52 #end
53 ##
54 #set ($xredirect = $doc.getURL($xcontext.action, ${request.queryString}))
55 ##
56 ## Ability to customize the view.
57 ##
58 #if ($request.customize == 'true')
59 #if ("$!request.action" != '')
60 #if ($request.action == 'add')
61 #set ($columnToAdd = $request.value.trim())
62 #if (!$columns.contains($columnToAdd))
63 #set ($userColumnsString = "$!userColumnsString $columnToAdd")
64 #set ($userColumnsString = $userColumnsString.trim())
65 #set ($discard = $userPreference.set('columns', $userColumnsString))
66 #set ($discard = $userPreferences.save('Updated user directory preferences.'))
67 #end
68 #elseif ($request.action == 'reset')
69 #set ($discard = $userPreferences.removeObject($userPreference))
70 #set ($discard = $userPreferences.save('Reset user directory preferences.'))
71 #elseif ($request.action == 'save')
72 #set ($discard = $userPreferences.updateObjectFromRequest($directoryPreferencesClassName))
73 #set ($discard = $userPreferences.save('Updated user directory preferences.'))
74 #end
75 ## Redirect using xredirect so that the page can be safely refreshed after an action.
76 $response.sendRedirect($request.xredirect)
77 #stop()
78 #end
79 ##
80 ## Customize form. Note: Using 2 forms to be able to do everything without JavaScript.
81 ##
82 == {{translation key="xe.userdirectory.customizeColumnsTitle"/}} ==
83 {{html clean='false' wiki='true'}}
84 <form class='xform half' action="$doc.getURL($xcontext.action, $request.queryString)" method='post'>
85 <dl>
86 <dt>
87 <label>{{translation key="xe.userdirectory.customizeAvailableColumnsLabel"/}}</label>
88 <span class='xHint'>{{translation key="xe.userdirectory.customizeAvailableColumnsHint"/}}</span>
89 </dt>
90 <dd>
91 <select name='value'>
92 #foreach ($property in $xwikiUsersClass.properties)
93 ## Display translated class property pretty names.
94 <option value="$property.name">$userPreferences.displayPrettyName($property.name)</option>
95 #end
96 </select>
97 </dd>
98 <dt>
99 <input type='hidden' name='xredirect' value="$xredirect" />
100 <input type='hidden' name='action' value='add' />
101 <span class='buttonwrapper'>
102 <input type="submit" class="button" name="submit" value="$services.localization.render('xe.userdirectory.customizeAddColumnButtonLabel')" />
103 </span>
104 </dt>
105 </dl>
106 </form>
107 <form class='xform half' action="$doc.getURL($xcontext.action, $request.queryString)" method='post'>
108 <dl>
109 <dt>
110 <label>{{translation key="xe.userdirectory.customizeSelectedColumnsLabel"/}}</label>
111 <span class='xHint'>{{translation key="xe.userdirectory.customizeSelectedColumnsHint"/}}</span>
112 </dt>
113 <dd>$userPreferences.display('columns', 'edit', $userPreference)</dd>
114 <dt>
115 <input type='hidden' name='xredirect' value="$xredirect" />
116 <input type='hidden' name='action' value='save' />
117 <span class='buttonwrapper'>
118 <input class='button' type='submit' name='submit' value="$services.localization.render('xe.userdirectory.customizeSaveButtonLabel')"/>
119 </span>
120 <span class="buttonwrapper">
121 <a href="$doc.getURL($xcontext.action, "$request.queryString&amp;action=reset&amp;xredirect=$escapetool.url($xredirect)")" class='button secondary'>{{translation key="xe.userdirectory.customizeResetButtonLabel"/}}</a>
122 </span>
123 </dt>
124 </dl>
125 </form>
126 ##
127 == {{translation key="xe.userdirectory.customizePreviewTitle"/}} ==
128 {{/html}}
129 #elseif ($isCustomized)
130 {{warning}}$services.localization.render('xe.userdirectory.isCustomizedWarning', ["$doc.fullName", "customize=true&action=reset&xredirect=$escapetool.url($xredirect)", "$doc.fullName", 'customize=true']){{/warning}}
131 #else
132 {{info}}$services.localization.render('xe.userdirectory.canCustomizeInfo', ["$doc.fullName", 'customize=true']){{/info}}
133 #end
134 #end
135 ##
136 ## Build and display the resulting livetable.
137 ##
138 #set($columnsProperties = {})
139 ##
140 #foreach ($column in $columns)
141 #set ($filterable = true)
142 #set ($sortable = true)
143 #set ($type = 'text')
144 #set ($link = '')
145 #set ($html = false)
146 #set ($displayName = $userPreferences.displayPrettyName($column))
147 #set ($classPropertyType = $xwikiUsersClass.get($column).type)
148 #if ($column == '_avatar')
149 #set ($type = 'none')
150 #set ($html = true)
151 #set ($sortable = false)
152 #set ($link = 'view')
153 #elseif ($column == 'doc.name')
154 #set ($link = 'view')
155 #elseif ($classPropertyType.endsWith('ListClass'))
156 #set($type = 'list')
157 #elseif ($classPropertyType.endsWith('NumberClass'))
158 #set($type = 'number')
159 #elseif ($classPropertyType.endsWith('PasswordClass'))
160 #set($sortable = false)
161 #elseif ($classPropertyType.endsWith('TextAreaClass') || $classPropertyType.endsWith('EmailClass'))
162 #set($html = true)
163 #end
164 #set ($columnValue = { 'type' : $type, 'link' : $link, 'html' : $html, 'sortable' : $sortable, 'displayName' : $displayName })
165 #set ($discard = $columnsProperties.put($column, $columnValue))
166 #end
167 ##
168 ## Allow other applications to provide a different data source for the user directory livetable. For example, some application might define a different membership relation.
169 #set ($userDirectoryLivetableResultsReference = $services.model.createDocumentReference($xcontext.database, 'XWiki', 'UserDirectoryLivetableResultsOverride'))
170 #if (!$xwiki.exists($userDirectoryLivetableResultsReference))
171 ## If no override is present, use the default data source.
172 #set ($userDirectoryLivetableResultsReference = $services.model.createDocumentReference($xcontext.database, 'XWiki', 'UserDirectoryLivetableResults'))
173 #end
174 ## Note that we specify the class name even though we use a custom results page (which hard-codes it) because the class
175 ## name is needed by the live table filters, to have a proper drop down list for Static List fields for instance
176 ## (see XWIKI-9660).
177 #set ($options = {
178 'className': $services.model.serialize($xwikiUsersClassReference, 'local'),
179 'resultPage' : "$services.model.serialize($userDirectoryLivetableResultsReference)",
180 'translationPrefix' : 'xe.userdirectory.',
181 'tagCloud' : true,
182 'rowCount': 10
183 })
184 ## Add a filter for subwikis
185 #if ($xcontext.database != $xcontext.mainWikiName && "$!services.wiki" != '' && "$!services.wiki.user" != '')
186 #set($userScope = $services.wiki.user.getUserScope($services.wiki.currentWikiId))
187 #if ($userScope == 'GLOBAL_ONLY')
188 #set($discard = $options.put('extraParams', 'userScope=global'))
189 #else
190 #set($discard = $options.put('extraParams', 'userScope=local'))
191 #end
192 #if ($userScope == 'LOCAL_AND_GLOBAL')
193 #set($discard = $xwiki.jsx.use('Main.UserDirectory'))
194
195 {{html}}
196 <form class="xform third" action="">
197 <dl>
198 <dt>
199 <label for="userScopeFilter">$services.localization.render('userdirectory.userScopeFilter')</label>
200 <span class="xHint">$services.localization.render('userdirectory.userScopeFilter.hint')</span>
201 </dt>
202 <dd>
203 <select name="userScope" id="userScopeFilter">
204 <option value="local">$services.localization.render('userdirectory.userScopeFilter.local')</option>
205 <option value="global">$services.localization.render('userdirectory.userScopeFilter.global')</option>
206 </select>
207 </dd>
208 </dl>
209 </form>
210 {{/html}}
211
212 #end
213 #end
214 #livetable('userdirectory' $columns $columnsProperties $options)
215 ##
216 ## Clean up any existing fake user from the current in-memory document to avoid side-effects
217 #if ($fakeUser)
218 #set ($discard = $doc.removeObject($fakeUser))
219 #end
220 {{/velocity}}
13.10.3-node1