Code source wiki de AdminUsersSheet

Version 2.1 par Florent Charton le 2024/08/08 18:43

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