Fossil SCM

On the /setup_ucap_list page, show the number of users having each capability, with a link to a list of users. This only works for administrators.

drh 2018-10-04 14:56 trunk
Commit 594421796a9ab8f2ab59250e3f09b704b76e2d9a6efc2f038bcc4a872de1f250
2 files changed +67 -35 +12 -7
+67 -35
--- src/capabilities.c
+++ src/capabilities.c
@@ -228,96 +228,128 @@
228228
** The following structure holds descriptions of the various capabilities.
229229
*/
230230
static struct Caps {
231231
char cCap; /* The capability letter */
232232
unsigned short eClass; /* The "class" for this capability */
233
+ unsigned nUser; /* Number of users with this capability */
233234
char *zAbbrev; /* Abbreviated mnemonic name */
234235
char *zOneLiner; /* One-line summary */
235236
} aCap[] = {
236
- { 'a', CAPCLASS_SUPER,
237
+ { 'a', CAPCLASS_SUPER, 0,
237238
"Admin", "Create and delete users" },
238
- { 'b', CAPCLASS_WIKI|CAPCLASS_TKT,
239
+ { 'b', CAPCLASS_WIKI|CAPCLASS_TKT, 0,
239240
"Attach", "Add attchments to wiki or tickets" },
240
- { 'c', CAPCLASS_TKT,
241
+ { 'c', CAPCLASS_TKT, 0,
241242
"Append-Tkt", "Append to existing tickets" },
242
- { 'd', CAPCLASS_WIKI|CAPCLASS_TKT,
243
+ { 'd', CAPCLASS_WIKI|CAPCLASS_TKT, 0,
243244
"Delete", "Delete wiki or tickets" },
244
- { 'e', CAPCLASS_DATA,
245
+ { 'e', CAPCLASS_DATA, 0,
245246
"View-PII", "View sensitive info such as email addresses" },
246
- { 'f', CAPCLASS_WIKI,
247
+ { 'f', CAPCLASS_WIKI, 0,
247248
"New-Wiki", "Create new wiki pages" },
248
- { 'g', CAPCLASS_DATA,
249
+ { 'g', CAPCLASS_DATA, 0,
249250
"Clone", "Clone the repository" },
250
- { 'h', CAPCLASS_OTHER,
251
+ { 'h', CAPCLASS_OTHER, 0,
251252
"Hyperlinks", "Show hyperlinks to detailed repository history" },
252
- { 'i', CAPCLASS_CODE,
253
+ { 'i', CAPCLASS_CODE, 0,
253254
"Check-In", "Check-in code changes" },
254
- { 'j', CAPCLASS_WIKI,
255
+ { 'j', CAPCLASS_WIKI, 0,
255256
"Read-Wiki", "View wiki pages" },
256
- { 'k', CAPCLASS_WIKI,
257
+ { 'k', CAPCLASS_WIKI, 0,
257258
"Write-Wiki", "Edit wiki pages" },
258
- { 'l', CAPCLASS_WIKI|CAPCLASS_SUPER,
259
+ { 'l', CAPCLASS_WIKI|CAPCLASS_SUPER, 0,
259260
"Mod-Wiki", "Moderator for wiki pages" },
260
- { 'm', CAPCLASS_WIKI,
261
+ { 'm', CAPCLASS_WIKI, 0,
261262
"Append-Wiki", "Append to wiki pages" },
262
- { 'n', CAPCLASS_TKT,
263
+ { 'n', CAPCLASS_TKT, 0,
263264
"New-Tkt", "Create new tickets" },
264
- { 'o', CAPCLASS_CODE,
265
+ { 'o', CAPCLASS_CODE, 0,
265266
"Check-Out", "Check out code" },
266
- { 'p', CAPCLASS_OTHER,
267
+ { 'p', CAPCLASS_OTHER, 0,
267268
"Password", "Change your own password" },
268
- { 'q', CAPCLASS_TKT|CAPCLASS_SUPER,
269
+ { 'q', CAPCLASS_TKT|CAPCLASS_SUPER, 0,
269270
"Mod-Tkt", "Moderate tickets" },
270
- { 'r', CAPCLASS_TKT,
271
+ { 'r', CAPCLASS_TKT, 0,
271272
"Read-Tkt", "View tickets" },
272
- { 's', CAPCLASS_SUPER,
273
+ { 's', CAPCLASS_SUPER, 0,
273274
"Superuser", "Setup and configure the respository" },
274
- { 't', CAPCLASS_TKT,
275
+ { 't', CAPCLASS_TKT, 0,
275276
"Reports", "Create new ticket report formats" },
276
- { 'u', CAPCLASS_OTHER,
277
+ { 'u', CAPCLASS_OTHER, 0,
277278
"Reader", "Inherit all the capabilities of the \"reader\" user" },
278
- { 'v', CAPCLASS_OTHER,
279
+ { 'v', CAPCLASS_OTHER, 0,
279280
"Developer", "Inherit all capabilities of the \"developer\" user" },
280
- { 'w', CAPCLASS_TKT,
281
+ { 'w', CAPCLASS_TKT, 0,
281282
"Write-Tkt", "Edit tickets" },
282
- { 'x', CAPCLASS_DATA,
283
+ { 'x', CAPCLASS_DATA, 0,
283284
"Private", "Push and/or pull private branches" },
284
- { 'y', CAPCLASS_SUPER,
285
+ { 'y', CAPCLASS_SUPER, 0,
285286
"Write-UV", "Push unversioned content" },
286
- { 'z', CAPCLASS_CODE,
287
+ { 'z', CAPCLASS_CODE, 0,
287288
"Zip-Download", "Download a ZIP archive, tarball, or SQL archive" },
288
- { '2', CAPCLASS_FORUM,
289
+ { '2', CAPCLASS_FORUM, 0,
289290
"Forum-Read", "Read forum posts by others" },
290
- { '3', CAPCLASS_FORUM,
291
+ { '3', CAPCLASS_FORUM, 0,
291292
"Forum-Write", "Create new forum messages" },
292
- { '4', CAPCLASS_FORUM,
293
+ { '4', CAPCLASS_FORUM, 0,
293294
"Forum-Trusted", "Create forum messages that bypass moderation" },
294
- { '5', CAPCLASS_FORUM|CAPCLASS_SUPER,
295
+ { '5', CAPCLASS_FORUM|CAPCLASS_SUPER, 0,
295296
"Forum-Mod", "Moderator for forum messages" },
296
- { '6', CAPCLASS_FORUM|CAPCLASS_SUPER,
297
+ { '6', CAPCLASS_FORUM|CAPCLASS_SUPER, 0,
297298
"Forum-Admin", "Set or remove capability '4' from other users" },
298
- { '7', CAPCLASS_ALERT,
299
+ { '7', CAPCLASS_ALERT, 0,
299300
"Alerts", "Sign up for email alerts" },
300
- { 'A', CAPCLASS_ALERT|CAPCLASS_SUPER,
301
+ { 'A', CAPCLASS_ALERT|CAPCLASS_SUPER, 0,
301302
"Announce", "Send announcements to all subscribers" },
302
- { 'D', CAPCLASS_OTHER,
303
+ { 'D', CAPCLASS_OTHER, 0,
303304
"Debug", "Enable debugging features" },
304305
};
306
+
307
+/*
308
+** Populate the aCap[].nUser values based on the current content
309
+** of the USER table.
310
+*/
311
+void capabilities_count(void){
312
+ int i;
313
+ static int done = 0;
314
+ Stmt q;
315
+ if( done ) return;
316
+ db_prepare(&q, "SELECT fullcap(cap) FROM user");
317
+ while( db_step(&q)==SQLITE_ROW ){
318
+ const char *zCap = db_column_text(&q, 0);
319
+ if( zCap==0 || zCap[0]==0 ) continue;
320
+ for(i=0; i<sizeof(aCap)/sizeof(aCap[0]); i++){
321
+ if( strchr(zCap, aCap[i].cCap) ) aCap[i].nUser++;
322
+ }
323
+ }
324
+ db_finalize(&q);
325
+ done = 1;
326
+}
305327
306328
307329
/*
308330
** Generate HTML that lists all of the capability letters together with
309331
** a brief summary of what each letter means.
310332
*/
311333
void capabilities_table(unsigned mClass){
312334
int i;
335
+ if( g.perm.Admin ) capabilities_count();
313336
@ <table>
337
+ @ <tbody>
314338
for(i=0; i<sizeof(aCap)/sizeof(aCap[0]); i++){
339
+ int n;
315340
if( (aCap[i].eClass & mClass)==0 ) continue;
316341
@ <tr><th valign="top">%c(aCap[i].cCap)</th>
317
- @ <td><i>%h(aCap[i].zAbbrev):</i> %h(aCap[i].zOneLiner)</td></tr>
342
+ @ <td>%h(aCap[i].zAbbrev)</td><td>%h(aCap[i].zOneLiner)</td>\
343
+ n = aCap[i].nUser;
344
+ if( n && g.perm.Admin ){
345
+ @ <td><a href="%R/setup_ulist?with=%c(aCap[i].cCap)">\
346
+ @ %d(n) user%s(n>1?"s":"")</a></td>\
347
+ }
348
+ @ </tr>
318349
}
350
+ @ </tbody>
319351
@ </table>
320352
}
321353
322354
/*
323355
** Generate a "capability summary table" that shows the major capabilities
324356
--- src/capabilities.c
+++ src/capabilities.c
@@ -228,96 +228,128 @@
228 ** The following structure holds descriptions of the various capabilities.
229 */
230 static struct Caps {
231 char cCap; /* The capability letter */
232 unsigned short eClass; /* The "class" for this capability */
 
233 char *zAbbrev; /* Abbreviated mnemonic name */
234 char *zOneLiner; /* One-line summary */
235 } aCap[] = {
236 { 'a', CAPCLASS_SUPER,
237 "Admin", "Create and delete users" },
238 { 'b', CAPCLASS_WIKI|CAPCLASS_TKT,
239 "Attach", "Add attchments to wiki or tickets" },
240 { 'c', CAPCLASS_TKT,
241 "Append-Tkt", "Append to existing tickets" },
242 { 'd', CAPCLASS_WIKI|CAPCLASS_TKT,
243 "Delete", "Delete wiki or tickets" },
244 { 'e', CAPCLASS_DATA,
245 "View-PII", "View sensitive info such as email addresses" },
246 { 'f', CAPCLASS_WIKI,
247 "New-Wiki", "Create new wiki pages" },
248 { 'g', CAPCLASS_DATA,
249 "Clone", "Clone the repository" },
250 { 'h', CAPCLASS_OTHER,
251 "Hyperlinks", "Show hyperlinks to detailed repository history" },
252 { 'i', CAPCLASS_CODE,
253 "Check-In", "Check-in code changes" },
254 { 'j', CAPCLASS_WIKI,
255 "Read-Wiki", "View wiki pages" },
256 { 'k', CAPCLASS_WIKI,
257 "Write-Wiki", "Edit wiki pages" },
258 { 'l', CAPCLASS_WIKI|CAPCLASS_SUPER,
259 "Mod-Wiki", "Moderator for wiki pages" },
260 { 'm', CAPCLASS_WIKI,
261 "Append-Wiki", "Append to wiki pages" },
262 { 'n', CAPCLASS_TKT,
263 "New-Tkt", "Create new tickets" },
264 { 'o', CAPCLASS_CODE,
265 "Check-Out", "Check out code" },
266 { 'p', CAPCLASS_OTHER,
267 "Password", "Change your own password" },
268 { 'q', CAPCLASS_TKT|CAPCLASS_SUPER,
269 "Mod-Tkt", "Moderate tickets" },
270 { 'r', CAPCLASS_TKT,
271 "Read-Tkt", "View tickets" },
272 { 's', CAPCLASS_SUPER,
273 "Superuser", "Setup and configure the respository" },
274 { 't', CAPCLASS_TKT,
275 "Reports", "Create new ticket report formats" },
276 { 'u', CAPCLASS_OTHER,
277 "Reader", "Inherit all the capabilities of the \"reader\" user" },
278 { 'v', CAPCLASS_OTHER,
279 "Developer", "Inherit all capabilities of the \"developer\" user" },
280 { 'w', CAPCLASS_TKT,
281 "Write-Tkt", "Edit tickets" },
282 { 'x', CAPCLASS_DATA,
283 "Private", "Push and/or pull private branches" },
284 { 'y', CAPCLASS_SUPER,
285 "Write-UV", "Push unversioned content" },
286 { 'z', CAPCLASS_CODE,
287 "Zip-Download", "Download a ZIP archive, tarball, or SQL archive" },
288 { '2', CAPCLASS_FORUM,
289 "Forum-Read", "Read forum posts by others" },
290 { '3', CAPCLASS_FORUM,
291 "Forum-Write", "Create new forum messages" },
292 { '4', CAPCLASS_FORUM,
293 "Forum-Trusted", "Create forum messages that bypass moderation" },
294 { '5', CAPCLASS_FORUM|CAPCLASS_SUPER,
295 "Forum-Mod", "Moderator for forum messages" },
296 { '6', CAPCLASS_FORUM|CAPCLASS_SUPER,
297 "Forum-Admin", "Set or remove capability '4' from other users" },
298 { '7', CAPCLASS_ALERT,
299 "Alerts", "Sign up for email alerts" },
300 { 'A', CAPCLASS_ALERT|CAPCLASS_SUPER,
301 "Announce", "Send announcements to all subscribers" },
302 { 'D', CAPCLASS_OTHER,
303 "Debug", "Enable debugging features" },
304 };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
305
306
307 /*
308 ** Generate HTML that lists all of the capability letters together with
309 ** a brief summary of what each letter means.
310 */
311 void capabilities_table(unsigned mClass){
312 int i;
 
313 @ <table>
 
314 for(i=0; i<sizeof(aCap)/sizeof(aCap[0]); i++){
 
315 if( (aCap[i].eClass & mClass)==0 ) continue;
316 @ <tr><th valign="top">%c(aCap[i].cCap)</th>
317 @ <td><i>%h(aCap[i].zAbbrev):</i> %h(aCap[i].zOneLiner)</td></tr>
 
 
 
 
 
 
318 }
 
319 @ </table>
320 }
321
322 /*
323 ** Generate a "capability summary table" that shows the major capabilities
324
--- src/capabilities.c
+++ src/capabilities.c
@@ -228,96 +228,128 @@
228 ** The following structure holds descriptions of the various capabilities.
229 */
230 static struct Caps {
231 char cCap; /* The capability letter */
232 unsigned short eClass; /* The "class" for this capability */
233 unsigned nUser; /* Number of users with this capability */
234 char *zAbbrev; /* Abbreviated mnemonic name */
235 char *zOneLiner; /* One-line summary */
236 } aCap[] = {
237 { 'a', CAPCLASS_SUPER, 0,
238 "Admin", "Create and delete users" },
239 { 'b', CAPCLASS_WIKI|CAPCLASS_TKT, 0,
240 "Attach", "Add attchments to wiki or tickets" },
241 { 'c', CAPCLASS_TKT, 0,
242 "Append-Tkt", "Append to existing tickets" },
243 { 'd', CAPCLASS_WIKI|CAPCLASS_TKT, 0,
244 "Delete", "Delete wiki or tickets" },
245 { 'e', CAPCLASS_DATA, 0,
246 "View-PII", "View sensitive info such as email addresses" },
247 { 'f', CAPCLASS_WIKI, 0,
248 "New-Wiki", "Create new wiki pages" },
249 { 'g', CAPCLASS_DATA, 0,
250 "Clone", "Clone the repository" },
251 { 'h', CAPCLASS_OTHER, 0,
252 "Hyperlinks", "Show hyperlinks to detailed repository history" },
253 { 'i', CAPCLASS_CODE, 0,
254 "Check-In", "Check-in code changes" },
255 { 'j', CAPCLASS_WIKI, 0,
256 "Read-Wiki", "View wiki pages" },
257 { 'k', CAPCLASS_WIKI, 0,
258 "Write-Wiki", "Edit wiki pages" },
259 { 'l', CAPCLASS_WIKI|CAPCLASS_SUPER, 0,
260 "Mod-Wiki", "Moderator for wiki pages" },
261 { 'm', CAPCLASS_WIKI, 0,
262 "Append-Wiki", "Append to wiki pages" },
263 { 'n', CAPCLASS_TKT, 0,
264 "New-Tkt", "Create new tickets" },
265 { 'o', CAPCLASS_CODE, 0,
266 "Check-Out", "Check out code" },
267 { 'p', CAPCLASS_OTHER, 0,
268 "Password", "Change your own password" },
269 { 'q', CAPCLASS_TKT|CAPCLASS_SUPER, 0,
270 "Mod-Tkt", "Moderate tickets" },
271 { 'r', CAPCLASS_TKT, 0,
272 "Read-Tkt", "View tickets" },
273 { 's', CAPCLASS_SUPER, 0,
274 "Superuser", "Setup and configure the respository" },
275 { 't', CAPCLASS_TKT, 0,
276 "Reports", "Create new ticket report formats" },
277 { 'u', CAPCLASS_OTHER, 0,
278 "Reader", "Inherit all the capabilities of the \"reader\" user" },
279 { 'v', CAPCLASS_OTHER, 0,
280 "Developer", "Inherit all capabilities of the \"developer\" user" },
281 { 'w', CAPCLASS_TKT, 0,
282 "Write-Tkt", "Edit tickets" },
283 { 'x', CAPCLASS_DATA, 0,
284 "Private", "Push and/or pull private branches" },
285 { 'y', CAPCLASS_SUPER, 0,
286 "Write-UV", "Push unversioned content" },
287 { 'z', CAPCLASS_CODE, 0,
288 "Zip-Download", "Download a ZIP archive, tarball, or SQL archive" },
289 { '2', CAPCLASS_FORUM, 0,
290 "Forum-Read", "Read forum posts by others" },
291 { '3', CAPCLASS_FORUM, 0,
292 "Forum-Write", "Create new forum messages" },
293 { '4', CAPCLASS_FORUM, 0,
294 "Forum-Trusted", "Create forum messages that bypass moderation" },
295 { '5', CAPCLASS_FORUM|CAPCLASS_SUPER, 0,
296 "Forum-Mod", "Moderator for forum messages" },
297 { '6', CAPCLASS_FORUM|CAPCLASS_SUPER, 0,
298 "Forum-Admin", "Set or remove capability '4' from other users" },
299 { '7', CAPCLASS_ALERT, 0,
300 "Alerts", "Sign up for email alerts" },
301 { 'A', CAPCLASS_ALERT|CAPCLASS_SUPER, 0,
302 "Announce", "Send announcements to all subscribers" },
303 { 'D', CAPCLASS_OTHER, 0,
304 "Debug", "Enable debugging features" },
305 };
306
307 /*
308 ** Populate the aCap[].nUser values based on the current content
309 ** of the USER table.
310 */
311 void capabilities_count(void){
312 int i;
313 static int done = 0;
314 Stmt q;
315 if( done ) return;
316 db_prepare(&q, "SELECT fullcap(cap) FROM user");
317 while( db_step(&q)==SQLITE_ROW ){
318 const char *zCap = db_column_text(&q, 0);
319 if( zCap==0 || zCap[0]==0 ) continue;
320 for(i=0; i<sizeof(aCap)/sizeof(aCap[0]); i++){
321 if( strchr(zCap, aCap[i].cCap) ) aCap[i].nUser++;
322 }
323 }
324 db_finalize(&q);
325 done = 1;
326 }
327
328
329 /*
330 ** Generate HTML that lists all of the capability letters together with
331 ** a brief summary of what each letter means.
332 */
333 void capabilities_table(unsigned mClass){
334 int i;
335 if( g.perm.Admin ) capabilities_count();
336 @ <table>
337 @ <tbody>
338 for(i=0; i<sizeof(aCap)/sizeof(aCap[0]); i++){
339 int n;
340 if( (aCap[i].eClass & mClass)==0 ) continue;
341 @ <tr><th valign="top">%c(aCap[i].cCap)</th>
342 @ <td>%h(aCap[i].zAbbrev)</td><td>%h(aCap[i].zOneLiner)</td>\
343 n = aCap[i].nUser;
344 if( n && g.perm.Admin ){
345 @ <td><a href="%R/setup_ulist?with=%c(aCap[i].cCap)">\
346 @ %d(n) user%s(n>1?"s":"")</a></td>\
347 }
348 @ </tr>
349 }
350 @ </tbody>
351 @ </table>
352 }
353
354 /*
355 ** Generate a "capability summary table" that shows the major capabilities
356
+12 -7
--- src/setupuser.c
+++ src/setupuser.c
@@ -42,15 +42,15 @@
4242
if( !g.perm.Admin ){
4343
login_needed(0);
4444
return;
4545
}
4646
47
+ style_submenu_element("Add", "setup_uedit");
48
+ style_submenu_element("Log", "access_log");
49
+ style_submenu_element("Help", "setup_ulist_notes");
50
+ style_header("User List");
4751
if( zWith==0 || zWith[0]==0 ){
48
- style_submenu_element("Add", "setup_uedit");
49
- style_submenu_element("Log", "access_log");
50
- style_submenu_element("Help", "setup_ulist_notes");
51
- style_header("User List");
5252
@ <table border=1 cellpadding=2 cellspacing=0 class='userTable'>
5353
@ <thead><tr>
5454
@ <th>Category
5555
@ <th>Capabilities (<a href='%R/setup_ucap_list'>key</a>)
5656
@ <th>Info <th>Last Change</tr></thead>
@@ -87,15 +87,20 @@
8787
@ <td>
8888
}
8989
@ </tr>
9090
}
9191
db_finalize(&s);
92
+ @ </tbody></table>
93
+ @ <div class='section'>Users</div>
9294
}else{
93
- style_header("Users With Capabilities \"%h\"", zWith);
95
+ style_submenu_element("All Users", "setup_ulist");
96
+ if( zWith[1]==0 ){
97
+ @ <div class='section'>Users with capability "%h(zWith)"</div>
98
+ }else{
99
+ @ <div class='section'>Users with any capability in "%h(zWith)"</div>
100
+ }
94101
}
95
- @ </tbody></table>
96
- @ <div class='section'>Users</div>
97102
@ <table border=1 cellpadding=2 cellspacing=0 class='userTable sortable' \
98103
@ data-column-types='ktxTTK' data-init-sort='2'>
99104
@ <thead><tr>
100105
@ <th>Login Name<th>Caps<th>Info<th>Date<th>Expire<th>Last Login</tr></thead>
101106
@ <tbody>
102107
--- src/setupuser.c
+++ src/setupuser.c
@@ -42,15 +42,15 @@
42 if( !g.perm.Admin ){
43 login_needed(0);
44 return;
45 }
46
 
 
 
 
47 if( zWith==0 || zWith[0]==0 ){
48 style_submenu_element("Add", "setup_uedit");
49 style_submenu_element("Log", "access_log");
50 style_submenu_element("Help", "setup_ulist_notes");
51 style_header("User List");
52 @ <table border=1 cellpadding=2 cellspacing=0 class='userTable'>
53 @ <thead><tr>
54 @ <th>Category
55 @ <th>Capabilities (<a href='%R/setup_ucap_list'>key</a>)
56 @ <th>Info <th>Last Change</tr></thead>
@@ -87,15 +87,20 @@
87 @ <td>
88 }
89 @ </tr>
90 }
91 db_finalize(&s);
 
 
92 }else{
93 style_header("Users With Capabilities \"%h\"", zWith);
 
 
 
 
 
94 }
95 @ </tbody></table>
96 @ <div class='section'>Users</div>
97 @ <table border=1 cellpadding=2 cellspacing=0 class='userTable sortable' \
98 @ data-column-types='ktxTTK' data-init-sort='2'>
99 @ <thead><tr>
100 @ <th>Login Name<th>Caps<th>Info<th>Date<th>Expire<th>Last Login</tr></thead>
101 @ <tbody>
102
--- src/setupuser.c
+++ src/setupuser.c
@@ -42,15 +42,15 @@
42 if( !g.perm.Admin ){
43 login_needed(0);
44 return;
45 }
46
47 style_submenu_element("Add", "setup_uedit");
48 style_submenu_element("Log", "access_log");
49 style_submenu_element("Help", "setup_ulist_notes");
50 style_header("User List");
51 if( zWith==0 || zWith[0]==0 ){
 
 
 
 
52 @ <table border=1 cellpadding=2 cellspacing=0 class='userTable'>
53 @ <thead><tr>
54 @ <th>Category
55 @ <th>Capabilities (<a href='%R/setup_ucap_list'>key</a>)
56 @ <th>Info <th>Last Change</tr></thead>
@@ -87,15 +87,20 @@
87 @ <td>
88 }
89 @ </tr>
90 }
91 db_finalize(&s);
92 @ </tbody></table>
93 @ <div class='section'>Users</div>
94 }else{
95 style_submenu_element("All Users", "setup_ulist");
96 if( zWith[1]==0 ){
97 @ <div class='section'>Users with capability "%h(zWith)"</div>
98 }else{
99 @ <div class='section'>Users with any capability in "%h(zWith)"</div>
100 }
101 }
 
 
102 @ <table border=1 cellpadding=2 cellspacing=0 class='userTable sortable' \
103 @ data-column-types='ktxTTK' data-init-sort='2'>
104 @ <thead><tr>
105 @ <th>Login Name<th>Caps<th>Info<th>Date<th>Expire<th>Last Login</tr></thead>
106 @ <tbody>
107

Keyboard Shortcuts

Open search /
Next entry (timeline) j
Previous entry (timeline) k
Open focused entry Enter
Show this help ?
Toggle theme Top nav button