0 Votes

Wiki source code of AdminUsersSheet

Last modified by Ryan C on 2025/06/02 08:46

Show last authors
1 {{velocity output="false"}}
2 #macro (displayUsersLiveData)
3 #set ($properties = ['name', 'first_name', 'last_name', '_actions'])
4 #set ($sourceParameters = {
5 'template': 'getusers.vm',
6 'translationPrefix': 'xe.admin.users.'
7 })
8 #if (!$xcontext.isMainWiki())
9 #set ($discard = $properties.add(3, 'scope'))
10 #end
11 <div class="medium-avatars">
12 $services.liveData.render({
13 'id': 'userstable',
14 'source': 'liveTable',
15 'properties': $stringtool.join($properties, ','),
16 'sourceParameters': $escapetool.url($sourceParameters)
17 }, {
18 'query': {
19 'filters': [
20 {
21 'property': 'scope',
22 'constraints': [{
23 'operator': 'contains',
24 'value': 'local'
25 }]
26 }
27 ]
28 },
29 'meta': {
30 'propertyDescriptors': [
31 {
32 'id': 'name',
33 'displayer': 'html',
34 'sortable': false,
35 'editable': false
36 },
37 {
38 'id': 'first_name',
39 'sortable': false,
40 'editable': false
41 },
42 {
43 'id': 'last_name',
44 'sortable': false,
45 'editable': false
46 },
47 {
48 'id': 'scope',
49 'sortable': false,
50 'editable': false,
51 'filter': {
52 'id': 'list',
53 'options': [
54 {'value': 'local', 'label': $services.localization.render('rightsmanager.local')},
55 {'value': 'global', 'label': $services.localization.render('rightsmanager.global')},
56 {'value': 'both', 'label': $services.localization.render('rightsmanager.both')}
57 ]
58 }
59 },
60 {
61 'id': '_actions',
62 'displayer': {
63 'id': 'actions',
64 'actions': ['edit', 'disable', 'enable', 'delete']
65 }
66 }
67 ],
68 'actions': [
69 {
70 'id': 'disable',
71 'icon': 'lock',
72 'allowProperty': 'doc.hasdisable',
73 'urlProperty': 'doc.disable_url',
74 'extraIconClasses': 'text-warning'
75 },
76 {
77 'id': 'enable',
78 'icon': 'unlock',
79 'allowProperty': 'doc.hasenable',
80 'urlProperty': 'doc.enable_url',
81 'extraIconClasses': 'text-success'
82 }
83 ]
84 }
85 })
86 </div>
87 <p>
88 <button type="button" class="btn btn-primary" data-toggle="modal" data-target="${escapetool.h}createUserModal"
89 ## Disable the button until the JavaScript code that handles the user creation is ready.
90 disabled="disabled">
91 $escapetool.xml($services.localization.render('rightsmanager.addnewuser'))
92 </button>
93 </p>
94 #end
95
96 #macro (createUserModal)
97 <div class="modal" id="createUserModal" tabindex="-1" role="dialog" aria-labelledby="createUserModal-label"
98 data-backdrop="static" data-keyboard="false">
99 <div class="modal-dialog" role="document">
100 <div class="modal-content">
101 <div class="modal-header">
102 <button type="button" class="close" data-dismiss="modal" aria-label="Close">
103 <span aria-hidden="true">&times;</span>
104 </button>
105 <div class="modal-title" id="createUserModal-label">
106 $escapetool.xml($services.localization.render('rightsmanager.addnewuser'))
107 </div>
108 </div>
109 <div class="modal-body"></div>
110 <div class="modal-footer">
111 <button type="button" class="btn btn-default" data-dismiss="modal">
112 $escapetool.xml($services.localization.render('cancel'))
113 </button>
114 <button type="button" class="btn btn-primary" disabled="disabled">
115 $escapetool.xml($services.localization.render('create'))
116 </button>
117 </div>
118 </div>
119 </div>
120 </div>
121 #end
122
123 #macro (editUserModal)
124 <div class="modal" id="editUserModal" tabindex="-1" role="dialog" aria-labelledby="editUserModal-label"
125 data-backdrop="static" data-keyboard="false" data-live-data="#userstable" data-live-data-action="edit">
126 <div class="modal-dialog modal-lg" role="document">
127 <div class="modal-content">
128 <div class="modal-header">
129 <button type="button" class="close" data-dismiss="modal" aria-label="Close">
130 <span aria-hidden="true">&times;</span>
131 </button>
132 <div class="modal-title" id="editUserModal-label">
133 $escapetool.xml($services.localization.render('xe.admin.users.editUser'))
134 </div>
135 </div>
136 <div class="modal-body"></div>
137 <div class="modal-footer">
138 <button type="button" class="btn btn-default" data-dismiss="modal">
139 $escapetool.xml($services.localization.render('cancel'))
140 </button>
141 <button type="button" class="btn btn-primary" disabled="disabled">
142 $escapetool.xml($services.localization.render('save'))
143 </button>
144 </div>
145 </div>
146 </div>
147 </div>
148 #end
149
150 #macro (deleteUserModal)
151 ## Load the resources needed by the user picker in order to be able to select the new author when deleting users that
152 ## have script or programming rights.
153 #userPicker_import
154 <div class="modal" id="deleteUserModal" tabindex="-1" role="dialog" aria-labelledby="deleteUserModal-label"
155 data-live-data="#userstable" data-live-data-action="delete">
156 <div class="modal-dialog" role="document">
157 <div class="modal-content">
158 <div class="modal-header">
159 <button type="button" class="close" data-dismiss="modal" aria-label="Close">
160 <span aria-hidden="true">&times;</span>
161 </button>
162 <div class="modal-title" id="deleteUserModal-label">
163 $escapetool.xml($services.localization.render('xe.admin.users.deleteUser'))
164 </div>
165 </div>
166 <div class="modal-body loading"></div>
167 <div class="modal-footer">
168 <button type="button" class="btn btn-default" data-dismiss="modal">
169 $escapetool.xml($services.localization.render('cancel'))
170 </button>
171 <button type="button" class="btn btn-danger" data-dismiss="modal">
172 $escapetool.xml($services.localization.render('delete'))
173 </button>
174 </div>
175 </div>
176 </div>
177 </div>
178 #end
179
180 #macro (deleteUserModalContent $userReference)
181 {{html clean="false"}}
182 #set ($userReference = $services.model.resolveDocument($userReference, 'user', $doc.documentReference))
183 <p>$services.localization.render('administration.section.users.deleteUser.confirmationMessage', [
184 "#displayUser($userReference {'useInlineHTML': true})",
185 "<a href='$xwiki.getURL($userReference, 'view', 'category=groups')'>",
186 '</a>'
187 ])</p>
188 ## Check if the user we're about to delete has programming or script rights because in this case deleting the user may
189 ## break the pages where this user was the last (content) author.
190 ##
191 ## Note that we check programming and script rights at the wiki level only, in the wiki where the user is defined.
192 ## This doesn't cover all the cases because script right can be set at page level so it's possible that the user has
193 ## script right only on some pages (and not at the wiki level). Counting the pages that were last modified by this
194 ## user and for which they have script right is costly (we need to check script right separately for each page that
195 ## was last modified by the user, we can't do it in the database query).
196 #set ($wikiPrefsRef = $services.model.createDocumentReference($userReference.wikiReference.name, 'XWiki',
197 'XWikiPreferences'))
198 #if ($services.security.authorization.hasAccess('programming', $userReference, $wikiPrefsRef))
199 #maybeShowDeleteUserWarning($userReference 'programming')
200 #elseif ($services.security.authorization.hasAccess('script', $userReference, $wikiPrefsRef))
201 #maybeShowDeleteUserWarning($userReference 'script')
202 #end
203 {{/html}}
204 #end
205
206 #macro (maybeShowDeleteUserWarning $userReference $right)
207 #countPagesLastModifiedBy($userReference)
208 #if ($pageCount > 0)
209 {{/html}}
210
211 {{error cssClass="xform"}}
212 {{html}}
213 #set ($pageIndexReference = $services.model.createDocumentReference(
214 $userReference.wikiReference.name, 'Main', 'AllDocs'))
215 #set ($pageIndexURL = $xwiki.getURL($pageIndexReference, 'view', "doc.author=${escapetool.url($services.model.serialize($userReference, 'local'))}"))
216 #set ($translationKey = "administration.section.users.deleteUser.${right}RightsWarning")
217 $services.localization.render($translationKey, ["<a href='$pageIndexURL'>", $pageCount, '</a>'])
218 <dl>
219 <dt>
220 <label for="newAuthor">$escapetool.xml($services.localization.render(
221 'administration.section.users.deleteUser.newAuthor'))</label>
222 #set ($translationKey = 'administration.section.users.deleteUser.newAuthor.hint')
223 #set ($rightTranslation = $services.localization.render(
224 "administration.section.users.deleteUser.newAuthor.$right"))
225 <span class="xHint">$escapetool.xml($services.localization.render($translationKey,
226 [$rightTranslation]))</span>
227 </dt>
228 <dd>
229 #set ($userPickerParams = {
230 'id': 'newAuthor',
231 'name': 'newAuthor',
232 'data-required-right': $right
233 })
234 #userPicker(false $userPickerParams)
235 #set ($translationKey = 'administration.section.users.deleteUser.newAuthor.error')
236 <span class="xErrorMsg hidden">$escapetool.xml($services.localization.render($translationKey,
237 [$rightTranslation]))</span>
238 </dd>
239 </dl>
240 {{/html}}
241 {{/error}}
242
243 {{html clean="false"}}
244 #end
245 #end
246
247 #macro (countPagesLastModifiedBy $userReference)
248 #if ($userReference.wikiReference.name == $xcontext.mainWikiName)
249 ## Global user: search everywhere.
250 #set ($wikis = $services.wiki.allIds)
251 #else
252 ## Local user: search only in the wiki where the user is defined.
253 #set ($wikis = [$userReference.wikiReference.name])
254 #end
255 #set ($pageCount = 0)
256 #set ($statement = 'where doc.author = :user or doc.contentAuthor = :user')
257 #foreach ($wiki in $wikis)
258 #if ($userReference.wikiReference.name == $wiki)
259 #set ($userReferenceString = $services.model.serialize($userReference, 'local'))
260 #else
261 #set ($userReferenceString = $services.model.serialize($userReference, 'default'))
262 #end
263 #set ($pageCount = $pageCount + $services.query.xwql($statement).setWiki($wiki).addFilter('unique'
264 ).bindValue('user', $userReferenceString).count())
265 #end
266 #end
267
268 #macro (validateNewAuthor $newAuthorReference $requiredRight)
269 #set ($newAuthorReference = $services.model.resolveDocument($newAuthorReference, 'user', $doc.documentReference))
270 #set ($wikiPrefsRef = $services.model.createDocumentReference($newAuthorReference.wikiReference.name, 'XWiki',
271 'XWikiPreferences'))
272 #jsonResponse({
273 'valid': $services.security.authorization.hasAccess($requiredRight, $newAuthorReference, $wikiPrefsRef)
274 })
275 #end
276
277 #macro (doView)
278 ## We include new settings from the Wiki Manager (only if it is not the main wiki).
279 #set ($wikiManagerUserRef = $services.model.createDocumentReference('', 'WikiManager', 'WikiUsers'))
280 #if (!$xcontext.isMainWiki() && $xwiki.exists($wikiManagerUserRef))
281 {{include reference="WikiManager.WikiUsers" /}}
282 #end
283 ## The Users management is enabled:
284 ## - on the main wiki
285 ## - on a subwiki where local users are enabled
286 ## - on a subwiki if there is no service "$services.wiki.user"
287 #if ($xcontext.isMainWiki() || "$!services.wiki.user" == '' || "$!services.wiki.user.userScope" != 'GLOBAL_ONLY')
288 ##
289 ## Inject needed JS and CSS files
290 ##
291 #set ($discard = $xwiki.ssx.use("XWiki.XWikiUserSheet"))
292 #set ($discard = $xwiki.ssx.use("XWiki.AdminUsersSheet"))
293 #set ($discard = $xwiki.jsx.use("XWiki.AdminUsersSheet"))
294
295 {{html clean="false"}}
296 #displayUsersLiveData()
297 #createUserModal()
298 #editUserModal()
299 #deleteUserModal()
300 {{/html}}
301 #end
302 #end
303 {{/velocity}}
304
305 {{velocity}}
306 #if ($request.data == 'deleteUserModalContent' && "$!request.userReference" != '')
307 #deleteUserModalContent($request.userReference)
308 #elseif ($request.data == 'validateNewAuthor' && "$!request.newAuthor" != '' && "$!request.requiredRight" != '')
309 #validateNewAuthor($request.newAuthor $request.requiredRight)
310 #else
311 #doView
312 #end
313 {{/velocity}}

XWiki AI Chat