Wiki source code of NotificationFilterPreferenceLivetableResults
Show last authors
author | version | line-number | content |
---|---|---|---|
1 | {{velocity wiki="false"}} | ||
2 | #if ($xcontext.action == 'get') | ||
3 | ## | ||
4 | ## Offset = item # at which to start displaying data | ||
5 | ## | ||
6 | #set ($offset = $numbertool.toNumber($request.get('offset'))) | ||
7 | ## offset starts from 0 in velocity and 1 in javascript | ||
8 | #set ($offset = $offset - 1) | ||
9 | #if ($offset < 0) | ||
10 | #set ($offset = 0) | ||
11 | #end | ||
12 | ## | ||
13 | ## Limit = # of items to display | ||
14 | ## | ||
15 | #set ($limit = $numbertool.toNumber($request.get('limit'))) | ||
16 | #set ($limitOffset = $offset + $limit) | ||
17 | ## | ||
18 | ## Build the list of NotificationFilterPreference related to the given user. | ||
19 | ## | ||
20 | #set ($isAccessGranted = false) | ||
21 | #if ("$!request.user" != "") | ||
22 | #set ($requestedUserDocRef = $services.model.resolveDocument($request.user)) | ||
23 | #set ($isAccessGranted = ($services.security.authorization.hasAccess('admin', $requestedUserDocRef) || $xcontext.userReference.equals($requestedUserDocRef))) | ||
24 | #set ($document = $xwiki.getDocument($requestedUserDocRef)) | ||
25 | #set ($target = $request.user) | ||
26 | #set ($userTarget = true) | ||
27 | ## when request user is not given we are sending the list of NotificationFilterPreference of the current wiki. | ||
28 | #else | ||
29 | #set ($target = $services.wiki.getCurrentWikiReference()) | ||
30 | #set ($document = $xwiki.getDocument('XWiki.Notifications.Code.NotificationAdministration')) | ||
31 | #set ($userTarget = false) | ||
32 | #set ($isAccessGranted = true) | ||
33 | #end | ||
34 | #set ($elements = []) | ||
35 | #set ($index = 0) | ||
36 | |||
37 | ## For backward compatibility reason, we display both system filters and custom filters. | ||
38 | #set ($displayCustom = true) | ||
39 | #set ($displaySystem = true) | ||
40 | ## This is the translation prefix used for filter types in the deprecated macro. | ||
41 | #set ($filterTypeTranslationPrefix = "notifications.filters.type.") | ||
42 | |||
43 | #if ("$!request.type" == "custom") | ||
44 | #set ($displaySystem = false) | ||
45 | ## Those translations should now be used. | ||
46 | #set ($filterTypeTranslationPrefix = "notifications.filters.type.custom.") | ||
47 | #elseif ("$!request.type" == "system") | ||
48 | #set ($displayCustom = false) | ||
49 | #end | ||
50 | |||
51 | #if ($displaySystem && $isAccessGranted) | ||
52 | ## First: get the list of available toggeable filters for the user | ||
53 | ## We display them first because we don't want them to be hidden by thousands of page filters the autowatch option | ||
54 | ## might have created. It would be not good to have to go to the last page of the livetable to find out these commonly | ||
55 | ## used filters. | ||
56 | #if ($userTarget) | ||
57 | #set ($filters = $services.notification.filters.getToggleableNotificationFilters($target)) | ||
58 | #else | ||
59 | #set ($filters = $services.notification.filters.getWikiToggleableNotificationFilters($target)) | ||
60 | #end | ||
61 | #foreach ($filter in $filters) | ||
62 | #set ($index = $index + 1) | ||
63 | ## Optimization to render only displayed rows (between $offset and $limitOffset) | ||
64 | #if ($index > $offset and $index <= $limitOffset) | ||
65 | #set ($checked = $filter.isEnabledByDefault()) | ||
66 | #set ($objectNumber = '') | ||
67 | #set ($obj = $document.getObject('XWiki.Notifications.Code.ToggleableFilterPreferenceClass', 'filterName', $filter.name)) | ||
68 | #if ($obj) | ||
69 | #set ($checked = $obj.getValue('isEnabled') != 0) | ||
70 | #set ($objectNumber = $!obj.reference.objectNumber) | ||
71 | #end | ||
72 | #if ($checked) | ||
73 | #set ($checked = 'checked = "checked"') | ||
74 | #else | ||
75 | #set ($checked = '') | ||
76 | #end | ||
77 | #set ($checkbox = "<input type='checkbox' class='toggleableFilterPreferenceCheckbox' data-objectNumber='${objectNumber}' data-filtername='${filter.name}' $checked />") | ||
78 | #set ($name = $services.localization.render("notifications.filters.name.$filter.name")) | ||
79 | #set ($element = { | ||
80 | 'filterPreferenceId' : $name, | ||
81 | 'name' : $name, | ||
82 | 'filterType' : $services.localization.render("notifications.filters.description.$filter.name"), | ||
83 | 'eventTypes' : "#displayNotificationsEventTypeList($filter.eventTypes)", | ||
84 | 'notificationFormats' : "#displayNotificationFormatsList($filter.formats)", | ||
85 | 'isEnabled' : $checkbox, | ||
86 | 'doc_viewable' : true, | ||
87 | 'doc_hasdelete' : false | ||
88 | }) | ||
89 | #set ($discard = $elements.add($element)) | ||
90 | #end | ||
91 | #end | ||
92 | #set ($elements = $collectiontool.sort($elements, ['name'])) | ||
93 | #end | ||
94 | |||
95 | #if ($displayCustom && $isAccessGranted) | ||
96 | ## Also get the list of available filters for the user | ||
97 | #set ($filters = $collectiontool.arrayList) | ||
98 | #if ($userTarget) | ||
99 | #set ($discard = $filters.addAll($services.notification.filters.getFilters($target))) | ||
100 | #else | ||
101 | #set ($discard = $filters.addAll($services.notification.filters.getWikiFilters($target))) | ||
102 | #end | ||
103 | #set ($filters = $collectiontool.sort($filters, ['name'])) | ||
104 | #set ($displayHiddenDocument = "$xwiki.getUserPreference('displayHiddenDocuments')" == '1') | ||
105 | #foreach ($filter in $filters) | ||
106 | #set ($filtersPreferences = $collectiontool.arrayList) | ||
107 | #if ($userTarget) | ||
108 | #set ($discard = $filtersPreferences.addAll($services.notification.filters.getFilterPreferences($filter, $target))) | ||
109 | #else | ||
110 | #set ($discard = $filtersPreferences.addAll($services.notification.filters.getWikiFilterPreferences($filter, $target))) | ||
111 | #end | ||
112 | #set ($filtersPreferences = $collectiontool.sort($filtersPreferences, ['id'])) | ||
113 | #foreach ($preference in $filtersPreferences) | ||
114 | #set ($page = $preference.pageOnly) | ||
115 | #set ($space = $preference.page) | ||
116 | #if (!$displayHiddenDocument && ($stringtool.isNotBlank($page) && $xwiki.getDocument($page).isHidden() | ||
117 | || $stringtool.isNotBlank($space) && $xwiki.getDocument($services.model.resolveSpace($space, 'default')).isHidden())) | ||
118 | ## Don't display a preference for an hidden page or space. | ||
119 | ## Why? If a user has the autowatch option enabled and create a new hidden document (for example, when she creates an application with AWM, hidden code pages are created as well), | ||
120 | ## we don't want to pollute the livetable with these hidden pages that the user don't know about. Moreover, the notifications will filter events concerning hidden pages, | ||
121 | ## so even if the filter exists, it has no effect to the user. | ||
122 | ## Here we handle only the case where pages.size() == 1 or spaces.size() == 1. | ||
123 | ## In the case there are several elements in the lists, they might have different "hidden" properties, and we don't handle it | ||
124 | ## Note: in the current implementation of watched entities, it's never the case. | ||
125 | ## TODO: handle these cases too in case custom filters need this. | ||
126 | #else | ||
127 | #set ($index = $index + 1) | ||
128 | ## Optimization to render only displayed rows (between $offset and $limitOffset) | ||
129 | #if ($index > $offset and $index <= $limitOffset) | ||
130 | #set ($display = $services.rendering.render($services.notification.filters.displayFilterPreference($filter, $preference), 'html/5.0')) | ||
131 | #set ($isEnabled = '') | ||
132 | #set ($isDisabled = '') | ||
133 | ## The watchlist bridge does not handle disabling a specific filter | ||
134 | #if ($preference.id.startsWith('watchlist_')) | ||
135 | #set ($isDisabled = 'disabled = "disabled"') | ||
136 | #end | ||
137 | #if ($preference.isEnabled()) | ||
138 | #set ($isEnabled = 'checked = "checked"') | ||
139 | #end | ||
140 | #set ($isEnabled = "<input type='checkbox' class='notificationFilterPreferenceCheckbox' data-preferenceId='${preference.id}' $isEnabled $isDisabled />") | ||
141 | |||
142 | #set ($element = { | ||
143 | 'filterPreferenceId' : $preference.id, | ||
144 | 'name' : $display, | ||
145 | 'filterType' : $services.localization.render("$filterTypeTranslationPrefix$!preference.getFilterType().name().toLowerCase()"), | ||
146 | 'eventTypes' : "#displayNotificationsEventTypeList($preference.eventTypes)", | ||
147 | 'notificationFormats' : "#displayNotificationFormatsList($preference.notificationFormats)", | ||
148 | 'isEnabled' : $isEnabled, | ||
149 | 'doc_viewable' : true | ||
150 | }) | ||
151 | #set ($discard = $elements.add($element)) | ||
152 | #end | ||
153 | #end | ||
154 | #end | ||
155 | #end | ||
156 | #end | ||
157 | #if ($isAccessGranted) | ||
158 | ## | ||
159 | ## JSON. | ||
160 | ## | ||
161 | #set ($discard = $response.setContentType('application/json')) | ||
162 | #set ($offset = $numbertool.toNumber($request.offset)) | ||
163 | #if (!$offset) | ||
164 | #set ($offset = 1) | ||
165 | #end | ||
166 | $jsontool.serialize({ | ||
167 | 'totalrows' : $index, | ||
168 | 'reqNo' : $request.reqNo, | ||
169 | 'returnedrows': $elements.size(), | ||
170 | 'offset' : $offset, | ||
171 | 'rows' : $elements | ||
172 | }) | ||
173 | #else | ||
174 | #set ($discard = $response.sendError(401)) | ||
175 | #end | ||
176 | #end ## (context action) | ||
177 | ## | ||
178 | ## MACROS | ||
179 | ## | ||
180 | #macro (displayNotificationsEventTypeList $list) | ||
181 | <ul class="list-unstyled"> | ||
182 | #if ($list.isEmpty()) | ||
183 | <li>$escapetool.xml($services.localization.render('notifications.filters.preferences.allEvents'))</li> | ||
184 | #else | ||
185 | #set ($types = {}) | ||
186 | #foreach ($descriptor in $services.eventstream.getRecordableEventDescriptors($xcontext.isMainWiki())) | ||
187 | #set ($discard = $types.put($descriptor.eventType, "$!services.localization.render($descriptor.description)")) | ||
188 | #end | ||
189 | #foreach ($eventType in $list) | ||
190 | <li>$escapetool.xml($types.get($eventType))</li> | ||
191 | #end | ||
192 | #end | ||
193 | </ul> | ||
194 | #end | ||
195 | #macro (displayNotificationFormatsList $formatList) | ||
196 | #set ($sortedFormatList = $collectiontool.sort($formatList)) | ||
197 | <ul class="list-unstyled"> | ||
198 | #foreach ($notificationFormat in $sortedFormatList) | ||
199 | <li>$services.localization.render("notifications.format.$!notificationFormat.name().toLowerCase()")</li> | ||
200 | #end | ||
201 | </ul> | ||
202 | #end | ||
203 | {{/velocity}} |