Wiki source code of Users
| author | version | line-number | content |
|---|---|---|---|
![]() |
1.1 | 1 | {{velocity}} |
![]() |
4.1 | 2 | ################################################################################ |
![]() |
16.1 | 3 | ## Users — built from the `status` field of XWiki.XWikiUsers. |
![]() |
4.1 | 4 | ## |
| 5 | ## Nothing is hand-maintained here: the groups are the values declared by | ||
| 6 | ## XWiki.XWikiUsers.status, in the class's own order, and every user carrying a | ||
| 7 | ## status appears in exactly one of them. Add a status to the class and it shows | ||
![]() |
9.1 | 8 | ## up here; change someone's status and they move. Disabled accounts (active = 0) |
| 9 | ## are left out. | ||
![]() |
4.1 | 10 | ## |
![]() |
16.1 | 11 | ## ?status=<value> narrows the page to that one group. The value is checked |
| 12 | ## against the list the class itself declares, so no status value is written | ||
| 13 | ## down here: change the class and grouping, filter and bar all follow. | ||
| 14 | ## | ||
![]() |
4.1 | 15 | ## Headings use the translation keys XWiki.XWikiUsers_status_<value>, so the page |
| 16 | ## is bilingual without a single string of its own. | ||
![]() |
16.1 | 17 | ## |
| 18 | ## Layout follows the house pattern of Talks.PerYear.Showcase: mainheader, | ||
| 19 | ## mainselectbar index, then one mainselectseparator / mainselectbottom per group. | ||
![]() |
4.1 | 20 | ################################################################################ |
| 21 | ## | ||
![]() |
6.1 | 22 | ## the groups, in class order, and the people, from the users themselves |
| 23 | #set( $statusList = $xwiki.getDocument('XWiki.XWikiUsers').getxWikiClass().get('status').getListValues() ) | ||
![]() |
11.1 | 24 | ## an optional ?status=<value> filter. The value is validated against the list the |
| 25 | ## class itself declares, so no status value is written down here: change the class | ||
| 26 | ## and both the grouping and the filter follow. | ||
| 27 | #set( $wanted = "$!request.getParameter('status')" ) | ||
| 28 | #set( $known = ( $wanted == '' || $statusList.contains($wanted) ) ) | ||
![]() |
6.1 | 29 | #set( $people = {} ) |
| 30 | #foreach( $s in $statusList ) | ||
| 31 | #set( $discard = $people.put($s, []) ) | ||
| 32 | #end | ||
| 33 | ## distinct: a user page with a translation (XWiki.AntonioNatali.it) returns one row per locale | ||
| 34 | #set( $rows = $services.query.xwql("select distinct doc.fullName from Document doc, doc.object(XWiki.XWikiUsers) as u where u.status <> ''").execute() ) | ||
![]() |
5.1 | 35 | #set( $seen = [] ) |
![]() |
4.1 | 36 | #foreach( $ref in $rows ) |
| 37 | #set( $uDoc = $xwiki.getDocument($ref) ) | ||
![]() |
6.1 | 38 | #set( $uObj = $uDoc.getObject('XWiki.XWikiUsers') ) |
![]() |
4.1 | 39 | #set( $st = "$!uObj.getValue('status')" ) |
![]() |
9.1 | 40 | ## `active` is unset on most user objects, so only an explicit 0 counts as disabled |
| 41 | #set( $isActive = ("$!uObj.getValue('active')" != '0') ) | ||
| 42 | #if( $people.containsKey($st) && $isActive && !$seen.contains($ref) ) | ||
![]() |
5.1 | 43 | #set( $discard = $seen.add($ref) ) |
![]() |
6.1 | 44 | ## sort key: surname, then given name, then the reference |
![]() |
4.1 | 45 | #set( $last = "$!uObj.getValue('last_name')" ) |
![]() |
6.1 | 46 | #set( $first = "$!uObj.getValue('first_name')" ) |
![]() |
4.1 | 47 | #set( $discard = $people.get($st).add("${last}|${first}|${ref}") ) |
| 48 | #end | ||
![]() |
1.1 | 49 | #end |
![]() |
4.1 | 50 | ## |
![]() |
16.1 | 51 | ## the groups actually on this page, in class order, and the head count |
| 52 | #set( $shown = [] ) | ||
| 53 | #set( $total = 0 ) | ||
| 54 | #foreach( $s in $statusList ) | ||
| 55 | #if( ( $wanted == '' || $s == $wanted ) && !$people.get($s).isEmpty() ) | ||
| 56 | #set( $discard = $shown.add($s) ) | ||
| 57 | #set( $total = $total + $people.get($s).size() ) | ||
| 58 | #end | ||
| 59 | #end | ||
| 60 | ## | ||
![]() |
5.1 | 61 | ## one person: given name + bold surname, linked to their XWiki user page |
![]() |
4.1 | 62 | #macro( apicePerson $entry ) |
| 63 | #set( $bits = $entry.split('\|') ) | ||
![]() |
6.1 | 64 | [[${bits[1]} **${bits[0]}**>>${bits[2]}]]## |
![]() |
1.1 | 65 | #end |
![]() |
4.1 | 66 | ## |
![]() |
16.1 | 67 | ## how many, spelled for one or many |
| 68 | #macro( apiceCount $n ) | ||
| 69 | $n #if( $n == 1 )$services.localization.render('user').toLowerCase()#else$services.localization.render('users').toLowerCase()#end## | ||
![]() |
1.1 | 70 | #end |
![]() |
4.1 | 71 | ## |
![]() |
16.1 | 72 | {{html clean="false" wiki="true"}} |
| 73 | #template('apice_macros.vm') | ||
| 74 | ## | ||
![]() |
11.1 | 75 | #if( !$known ) |
| 76 | #### the class does not declare this value — say so, and show what it does declare | ||
![]() |
16.1 | 77 | <div class="mainheader"> |
| 78 | {{stringEngIta eng="Unknown status" ita="Stato sconosciuto"/}} | ||
| 79 | <span class="textsecondary"> / </span> | ||
| 80 | $escapetool.xml($wanted) | ||
| 81 | </div> | ||
| 82 | <div class="mainselectbar"> | ||
![]() |
18.1 | 83 | #foreach( $s in $statusList )#if( !$foreach.first ) • #end[[$services.localization.render("XWiki.XWikiUsers_status_${s}").toLowerCase()>>path:$doc.getURL('view', "status=${s}")]]#end |
![]() |
16.1 | 84 | </div> |
![]() |
11.1 | 85 | #else |
![]() |
16.1 | 86 | #### page subtitle: how many people, and over what |
| 87 | <div class="mainheader"> | ||
| 88 | #apiceCount($total) | ||
| 89 | #if( $wanted != '' ) | ||
| 90 | <span class="textsecondary"> / </span> | ||
| 91 | $services.localization.render("XWiki.XWikiUsers_status_${wanted}") | ||
![]() |
1.1 | 92 | #end |
![]() |
16.1 | 93 | </div> |
| 94 | #if( $shown.isEmpty() ) | ||
| 95 | <div class="mainselectbar"> | ||
| 96 | {{stringEngIta eng="Nobody has this status" ita="Nessuno ha questo stato"/}} | ||
| 97 | </div> | ||
| 98 | #end | ||
| 99 | #### the index bar, only when the page carries more than one group | ||
| 100 | #if( $shown.size() > 1 ) | ||
| 101 | <div class="mainselectbar" id="index"> | ||
![]() |
18.1 | 102 | #foreach( $s in $shown )#if( !$foreach.first ) • #end[[$services.localization.render("XWiki.XWikiUsers_status_${s}").toLowerCase()>>||anchor="$s"]]#end |
![]() |
16.1 | 103 | </div> |
| 104 | #end | ||
| 105 | #### one block per group: separator, the people, footer | ||
| 106 | #foreach( $s in $shown ) | ||
| 107 | <div class="mainselectseparator"> | ||
| 108 | <a class="mainselectseparatorlink" id="$s" href=$doc.getURL('view', "status=${s}")> | ||
| 109 | $services.localization.render("XWiki.XWikiUsers_status_${s}") | ||
| 110 | </a> | ||
| 111 | </div> | ||
| 112 | <div style="font-style: normal"> | ||
| 113 | #set( $group = $collectiontool.sort($people.get($s)) ) | ||
| 114 | #foreach( $entry in $group )#if( !$foreach.first ) • #end#apicePerson($entry)#end | ||
| 115 | </div> | ||
| 116 | <div #if( $foreach.last )id="bottom"#end class="mainselectbottom"> | ||
| 117 | #apiceCount($people.get($s).size()) | ||
| 118 | <span class="textsecondary"> / </span> | ||
| 119 | $services.localization.render("XWiki.XWikiUsers_status_${s}") | ||
| 120 |  •  | ||
![]() |
17.1 | 121 | #### the shared macro also offers the index; with one group there is no index bar |
| 122 | #if( $shown.size() > 1 )#anchorlinks()#else[[$services.localization.render('top').toLowerCase()>>||anchor="top"]] • [[$services.localization.render('bottom').toLowerCase()>>||anchor="bottom"]]#end | ||
![]() |
16.1 | 123 | </div> |
| 124 | #end | ||
![]() |
4.1 | 125 | #### anyone whose status is not among those declared by the class — should be empty |
![]() |
16.1 | 126 | #if( $wanted == '' ) |
![]() |
4.1 | 127 | #set( $strays = [] ) |
| 128 | #foreach( $ref in $rows ) | ||
![]() |
6.1 | 129 | #set( $uObj = $xwiki.getDocument($ref).getObject('XWiki.XWikiUsers') ) |
![]() |
4.1 | 130 | #set( $st = "$!uObj.getValue('status')" ) |
![]() |
6.1 | 131 | #if( !$people.containsKey($st) )#set( $discard = $strays.add("${ref} (${st})") )#end |
![]() |
1.1 | 132 | #end |
![]() |
4.1 | 133 | #if( !$strays.isEmpty() ) |
![]() |
16.1 | 134 | <div class="mainselectseparator"> |
| 135 | {{stringEngIta eng="Unrecognised status" ita="Stato non riconosciuto"/}} | ||
| 136 | </div> | ||
| 137 | <div style="font-style: normal"> | ||
| 138 | #foreach( $stray in $strays )$stray#if( !$foreach.last ) • #end#end | ||
| 139 | </div> | ||
![]() |
1.1 | 140 | #end |
![]() |
11.1 | 141 | #end |
![]() |
16.1 | 142 | #end |
| 143 | {{/html}} | ||
![]() |
1.1 | 144 | {{/velocity}} |
![]() |
9.1 | 145 |
