Modifications pour le document AdminGroupsSheet

Modifié par Florent Charton le 2025/07/04 23:28

Depuis la version 3.1
modifié par Florent Charton
sur 2025/07/04 23:28
Commentaire de modification : Install extension [org.xwiki.platform:xwiki-platform-administration-ui/16.10.9]
À la version 2.1
modifié par Florent Charton
sur 2024/08/08 18:43
Commentaire de modification : Install extension [org.xwiki.platform:xwiki-platform-administration-ui/15.10.11]

Résumé

Détails

Propriétés de la Page
Contenu
... ... @@ -48,7 +48,7 @@
48 48  
49 49  #macro (editGroupModal)
50 50   <div class="modal" id="editGroupModal" tabindex="-1" role="dialog" aria-labelledby="editGroupModal-label"
51 - data-backdrop="static" data-keyboard="false" data-live-data="#groupstable" data-live-data-action="edit">
51 + data-backdrop="static" data-keyboard="false" data-liveTable="#groupstable" data-liveTableAction="edit">
52 52   <div class="modal-dialog" role="document">
53 53   <div class="modal-content">
54 54   <div class="modal-header">
... ... @@ -67,7 +67,7 @@
67 67  
68 68  #macro (deleteGroupModal)
69 69   <div class="modal" id="deleteGroupModal" tabindex="-1" role="dialog" aria-labelledby="deleteGroupModal-label"
70 - data-live-data="#groupstable" data-live-data-action="delete">
70 + data-liveTable="#groupstable" data-liveTableAction="delete">
71 71   <div class="modal-dialog" role="document">
72 72   <div class="modal-content">
73 73   <div class="modal-header">
... ... @@ -94,6 +94,20 @@
94 94   </div>
95 95   </div>
96 96  #end
97 +
98 +#macro (groupScopeFilter)
99 + <select name="wiki">
100 + <option selected="selected" value="local">
101 + $escapetool.xml($services.localization.render('xe.admin.groups.local'))
102 + </option>
103 + <option value="global">
104 + $escapetool.xml($services.localization.render('xe.admin.groups.global'))
105 + </option>
106 + <option value="both">
107 + $escapetool.xml($services.localization.render('xe.admin.groups.both'))
108 + </option>
109 + </select>
110 +#end
97 97  {{/velocity}}
98 98  
99 99  {{velocity}}
... ... @@ -100,79 +100,37 @@
100 100  {{html clean="false"}}
101 101  #set ($discard = $xwiki.ssx.use('XWiki.AdminGroupsSheet'))
102 102  #set ($discard = $xwiki.jsx.use('XWiki.AdminGroupsSheet'))
103 -## The following are needed when editing a group (e.g., for adding new members).
117 +## The following are needed when editing a group (e.g. for adding new members).
104 104  #userPicker_import()
105 105  #set ($discard = $xwiki.ssx.use('XWiki.XWikiGroupSheet'))
106 106  #set ($discard = $xwiki.jsx.use('XWiki.XWikiGroupSheet'))
107 -#set ($properties = ['name', 'members', '_actions'])
121 +#set ($columnOptions = {
122 + 'name': {'type': 'text', 'html': true, 'sortable': false},
123 + 'members': {'filterable': false, 'sortable': false},
124 + 'scope': {'type': 'list', 'sortable': false},
125 + '_actions': {
126 + 'actions': ['edit', 'delete'],
127 + 'labels': {
128 + 'delete': $services.localization.render('platform.livetable._actions.delete')
129 + },
130 + 'filterable': false
131 + }
132 +})
133 +#set ($columns = ['name', 'members', '_actions'])
134 +#set ($liveTableOptions = {
135 + 'url': $doc.getURL('view', 'xpage=getgroups'),
136 + 'translationPrefix': 'xe.admin.groups.',
137 + 'outputOnlyHtml': true
138 +})
108 108  #if (!$xcontext.isMainWiki())
109 - #set ($discard = $properties.add(2, 'scope'))
140 + #set ($discard = $columns.add(2, 'scope'))
141 + ## We use the top filters option to show only the local groups by default because the JavaScript code from the sheet
142 + ## is executed after the livetable is loaded. The JavaScript code removes the top filters and updates the scope filter
143 + ## afterwards.
144 + #set ($liveTableOptions.topFilters = "#groupScopeFilter")
110 110  #end
111 111  <div class="medium-avatars">
112 - #set ($sourceParameters = {
113 - 'template': 'getgroups.vm',
114 - 'translationPrefix': 'xe.admin.groups.'
115 - })
116 - $services.liveData.render({
117 - 'id': 'groupstable',
118 - 'source': 'liveTable',
119 - 'properties': $stringtool.join($properties, ','),
120 - 'sourceParameters': $escapetool.url($sourceParameters)
121 - }, {
122 - 'query': {
123 - 'filters': [
124 - {
125 - 'property': 'scope',
126 - 'constraints': [{
127 - 'operator': 'contains',
128 - 'value': 'local'
129 - }]
130 - }
131 - ]
132 - },
133 - 'meta': {
134 - 'propertyDescriptors': [
135 - {
136 - 'id': 'name',
137 - 'displayer': 'html',
138 - 'sortable': false,
139 - 'editable': false
140 - },
141 - {
142 - 'id': 'members',
143 - 'sortable': false,
144 - 'filterable': false,
145 - 'editable': false
146 - },
147 - {
148 - 'id': 'scope',
149 - 'sortable': false,
150 - 'editable': false,
151 - 'filter': {
152 - 'id': 'list',
153 - 'options': [
154 - {'value': 'local', 'label': $services.localization.render('xe.admin.groups.local')},
155 - {'value': 'global', 'label': $services.localization.render('xe.admin.groups.global')},
156 - {'value': 'both', 'label': $services.localization.render('xe.admin.groups.both')}
157 - ]
158 - }
159 - },
160 - {
161 - 'id': '_actions',
162 - 'displayer': {
163 - 'id': 'actions',
164 - 'actions': ['edit', 'delete']
165 - }
166 - }
167 - ],
168 - 'actions': [
169 - {
170 - 'id': 'delete',
171 - 'name': $services.localization.render('platform.livetable._actions.delete')
172 - }
173 - ]
174 - }
175 - })
147 + #livetable('groupstable' $columns $columnOptions $liveTableOptions)
176 176  </div>
177 177  <p>
178 178   <button type="button" class="btn btn-primary" data-toggle="modal" data-target="${escapetool.h}createGroupModal">
... ... @@ -179,8 +179,8 @@
179 179   $escapetool.xml($services.localization.render('rightsmanager.creategroup'))
180 180   </button>
181 181  </p>
182 -#createGroupModal()
183 -#editGroupModal()
184 -#deleteGroupModal()
154 +#createGroupModal
155 +#editGroupModal
156 +#deleteGroupModal
185 185  {{/html}}
186 186  {{/velocity}}
XWiki.JavaScriptExtension[0]
Code
... ... @@ -87,7 +87,7 @@
87 87   Promise.resolve($.post(createGroupURL, data)).then(function() {
88 88   // Close the modal and refresh the groups live table.
89 89   createGroupModal.modal('hide');
90 - $('#groupstable').data('liveData').updateEntries();
90 + window.livetable_groupstable.refresh();
91 91   notification.replace(new XWiki.widgets.Notification(
92 92   $jsontool.serialize($services.localization.render('xe.admin.groups.create.done')),
93 93   'done'
... ... @@ -105,10 +105,19 @@
105 105  });
106 106  
107 107  //
108 -// Live Data Modals
108 +// Scope Filtering
109 109  //
110 +require(['jquery'], function($) {
111 + var options = $('#groupstable').prev('.tipfilters').remove().find('select[name="wiki"]').html();
112 + var scopeFilter = $('#groupstable .xwiki-livetable-display-filters select[name="scope"]')
113 + scopeFilter.attr('name', 'wiki').html(options);
114 +});
110 110  
111 -define('xwiki-livedata-modal', ['jquery', 'bootstrap'], function($) {
116 +//
117 +// Live Table Modals
118 +//
119 +
120 +define('xwiki-livetable-modal', ['jquery', 'bootstrap'], function($) {
112 112   $.fn.bindActionToModal = function(action, modal) {
113 113   var actionToModal = action;
114 114   if (typeof action === 'string') {
... ... @@ -116,32 +116,32 @@
116 116   actionToModal[action] = modal;
117 117   }
118 118   return this.each(function() {
119 - const liveDataElement = $(this);
120 - const liveData = liveDataElement.attr('id')
128 + var liveTableElement = $(this);
129 + var liveTable = window['livetable_' + liveTableElement.attr('id')];
121 121   $.each(actionToModal, function(action, modal) {
122 - const clickFilter = '#' + liveData + ' a.action.action_' + action;
123 - $(document).on('click', clickFilter, function (event) {
131 + liveTableElement.on('click', 'a.action' + action, function(event) {
124 124   event.preventDefault();
125 - const actionTrigger = $(this);
126 - const row = actionTrigger.closest('tr');
127 - const rowIndex = parseInt(row.attr('data-livedata-entry-index'));
133 + var actionTrigger = $(this);
134 + var row = actionTrigger.closest('tr');
135 + var rowIndex = parseInt(row.attr('data-index'));
128 128   $(modal).data({
129 - rowData: liveDataElement.data('liveData').data.data.entries[rowIndex],
137 + rowData: liveTable.fetchedRows[rowIndex],
130 130   rowIndex: rowIndex,
131 - liveData: liveData,
132 - liveDataElement: liveDataElement
139 + liveTable: liveTable,
140 + liveTableElement: liveTableElement
133 133   }).modal('show');
134 134   });
135 135   });
136 136   });
137 137   };
138 - $('.modal[data-live-data]').each(function () {
146 +
147 + $('.modal[data-liveTable]').each(function() {
139 139   var modal = $(this);
140 - $(modal.attr('data-live-data')).bindActionToModal(modal.attr('data-live-data-action'), modal);
149 + $(modal.attr('data-liveTable')).bindActionToModal(modal.attr('data-liveTableAction'), modal);
141 141   });
142 142  });
143 143  
144 -require(['jquery', 'xwiki-meta', 'xwiki-livedata-modal'], function ($, xm) {
153 +require(['jquery', 'xwiki-meta', 'xwiki-livetable-modal'], function($, xm) {
145 145   //
146 146   // Group Editing
147 147   //
... ... @@ -148,15 +148,15 @@
148 148   var editGroupModal = $('#editGroupModal');
149 149   editGroupModal.on('show.bs.modal', function() {
150 150   var rowData = editGroupModal.data('rowData');
151 - var groupReference = XWiki.Model.resolve(rowData['doc.fullName'], XWiki.EntityType.DOCUMENT, [rowData['doc.wiki']]);
160 + var groupReference = XWiki.Model.resolve(rowData.doc_fullName, XWiki.EntityType.DOCUMENT, [rowData.doc_wiki]);
152 152   var groupDocument = new XWiki.Document(groupReference);
153 153   var editGroupURL = groupDocument.getURL('edit', 'xpage=plain');
154 - editGroupModal.find('.modal-body').empty().addClass('loading').load(editGroupURL, function () {
163 + editGroupModal.find('.modal-body').empty().addClass('loading').load(editGroupURL, function() {
155 155   $(this).removeClass('loading');
156 156   $(document).trigger('xwiki:dom:updated', {'elements': $(this).toArray()});
157 157   });
158 158   }).on('hide.bs.modal', function() {
159 - editGroupModal.data('liveDataElement').data('liveData').updateEntries();
168 + editGroupModal.data('liveTable').refresh();
160 160   });
161 161  
162 162   //
... ... @@ -165,9 +165,9 @@
165 165   var deleteGroupModal = $('#deleteGroupModal');
166 166   deleteGroupModal.on('show.bs.modal', function() {
167 167   var rowData = deleteGroupModal.data('rowData');
168 - var groupReference = rowData['doc.fullName'];
169 - if (XWiki.currentWiki !== rowData['doc.wiki']) {
170 - groupReference = XWiki.Model.resolve(groupReference, XWiki.EntityType.DOCUMENT, [rowData['doc.wiki']]);
177 + var groupReference = rowData.doc_fullName;
178 + if (XWiki.currentWiki !== rowData.doc_wiki) {
179 + groupReference = XWiki.Model.resolve(groupReference, XWiki.EntityType.DOCUMENT, [rowData.doc_wiki]);
171 171   groupReference = XWiki.Model.serialize(groupReference);
172 172   }
173 173   deleteGroupModal.find('.groupName').text(groupReference);
... ... @@ -181,7 +181,7 @@
181 181   docname: deleteGroupModal.find('.groupName').text(),
182 182   form_token: xm.form_token
183 183   }).then(() => {
184 - deleteGroupModal.data('liveDataElement').data('liveData').updateEntries();
193 + deleteGroupModal.data('liveTable').deleteRow(deleteGroupModal.data('rowIndex'));
185 185   notification.replace(new XWiki.widgets.Notification(
186 186   $jsontool.serialize($services.localization.render('xe.admin.groups.delete.done')),
187 187   'done'
XWiki.StyleSheetExtension[0]
Code
... ... @@ -1,3 +1,9 @@
1 +/**
2 + * Groups Live Table
3 + */
4 +#groupstable td[data-title] {
5 + vertical-align: middle;
6 +}
1 1  
2 2  /**
3 3   * Create Group Modal