Modifications pour le document AdminGroupsSheet

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

Depuis 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]
À 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]

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-liveTable="#groupstable" data-liveTableAction="edit">
51 + data-backdrop="static" data-keyboard="false" data-live-data="#groupstable" data-live-data-action="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-liveTable="#groupstable" data-liveTableAction="delete">
70 + data-live-data="#groupstable" data-live-data-action="delete">
71 71   <div class="modal-dialog" role="document">
72 72   <div class="modal-content">
73 73   <div class="modal-header">
... ... @@ -94,20 +94,6 @@
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
111 111  {{/velocity}}
112 112  
113 113  {{velocity}}
... ... @@ -114,37 +114,79 @@
114 114  {{html clean="false"}}
115 115  #set ($discard = $xwiki.ssx.use('XWiki.AdminGroupsSheet'))
116 116  #set ($discard = $xwiki.jsx.use('XWiki.AdminGroupsSheet'))
117 -## The following are needed when editing a group (e.g. for adding new members).
103 +## The following are needed when editing a group (e.g., for adding new members).
118 118  #userPicker_import()
119 119  #set ($discard = $xwiki.ssx.use('XWiki.XWikiGroupSheet'))
120 120  #set ($discard = $xwiki.jsx.use('XWiki.XWikiGroupSheet'))
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 -})
107 +#set ($properties = ['name', 'members', '_actions'])
139 139  #if (!$xcontext.isMainWiki())
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")
109 + #set ($discard = $properties.add(2, 'scope'))
145 145  #end
146 146  <div class="medium-avatars">
147 - #livetable('groupstable' $columns $columnOptions $liveTableOptions)
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 + })
148 148  </div>
149 149  <p>
150 150   <button type="button" class="btn btn-primary" data-toggle="modal" data-target="${escapetool.h}createGroupModal">
... ... @@ -151,8 +151,8 @@
151 151   $escapetool.xml($services.localization.render('rightsmanager.creategroup'))
152 152   </button>
153 153  </p>
154 -#createGroupModal
155 -#editGroupModal
156 -#deleteGroupModal
182 +#createGroupModal()
183 +#editGroupModal()
184 +#deleteGroupModal()
157 157  {{/html}}
158 158  {{/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 - window.livetable_groupstable.refresh();
90 + $('#groupstable').data('liveData').updateEntries();
91 91   notification.replace(new XWiki.widgets.Notification(
92 92   $jsontool.serialize($services.localization.render('xe.admin.groups.create.done')),
93 93   'done'
... ... @@ -105,19 +105,10 @@
105 105  });
106 106  
107 107  //
108 -// Scope Filtering
108 +// Live Data Modals
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 -});
115 115  
116 -//
117 -// Live Table Modals
118 -//
119 -
120 -define('xwiki-livetable-modal', ['jquery', 'bootstrap'], function($) {
111 +define('xwiki-livedata-modal', ['jquery', 'bootstrap'], function($) {
121 121   $.fn.bindActionToModal = function(action, modal) {
122 122   var actionToModal = action;
123 123   if (typeof action === 'string') {
... ... @@ -125,32 +125,32 @@
125 125   actionToModal[action] = modal;
126 126   }
127 127   return this.each(function() {
128 - var liveTableElement = $(this);
129 - var liveTable = window['livetable_' + liveTableElement.attr('id')];
119 + const liveDataElement = $(this);
120 + const liveData = liveDataElement.attr('id')
130 130   $.each(actionToModal, function(action, modal) {
131 - liveTableElement.on('click', 'a.action' + action, function(event) {
122 + const clickFilter = '#' + liveData + ' a.action.action_' + action;
123 + $(document).on('click', clickFilter, function (event) {
132 132   event.preventDefault();
133 - var actionTrigger = $(this);
134 - var row = actionTrigger.closest('tr');
135 - var rowIndex = parseInt(row.attr('data-index'));
125 + const actionTrigger = $(this);
126 + const row = actionTrigger.closest('tr');
127 + const rowIndex = parseInt(row.attr('data-livedata-entry-index'));
136 136   $(modal).data({
137 - rowData: liveTable.fetchedRows[rowIndex],
129 + rowData: liveDataElement.data('liveData').data.data.entries[rowIndex],
138 138   rowIndex: rowIndex,
139 - liveTable: liveTable,
140 - liveTableElement: liveTableElement
131 + liveData: liveData,
132 + liveDataElement: liveDataElement
141 141   }).modal('show');
142 142   });
143 143   });
144 144   });
145 145   };
146 -
147 - $('.modal[data-liveTable]').each(function() {
138 + $('.modal[data-live-data]').each(function () {
148 148   var modal = $(this);
149 - $(modal.attr('data-liveTable')).bindActionToModal(modal.attr('data-liveTableAction'), modal);
140 + $(modal.attr('data-live-data')).bindActionToModal(modal.attr('data-live-data-action'), modal);
150 150   });
151 151  });
152 152  
153 -require(['jquery', 'xwiki-meta', 'xwiki-livetable-modal'], function($, xm) {
144 +require(['jquery', 'xwiki-meta', 'xwiki-livedata-modal'], function ($, xm) {
154 154   //
155 155   // Group Editing
156 156   //
... ... @@ -157,15 +157,15 @@
157 157   var editGroupModal = $('#editGroupModal');
158 158   editGroupModal.on('show.bs.modal', function() {
159 159   var rowData = editGroupModal.data('rowData');
160 - var groupReference = XWiki.Model.resolve(rowData.doc_fullName, XWiki.EntityType.DOCUMENT, [rowData.doc_wiki]);
151 + var groupReference = XWiki.Model.resolve(rowData['doc.fullName'], XWiki.EntityType.DOCUMENT, [rowData['doc.wiki']]);
161 161   var groupDocument = new XWiki.Document(groupReference);
162 162   var editGroupURL = groupDocument.getURL('edit', 'xpage=plain');
163 - editGroupModal.find('.modal-body').empty().addClass('loading').load(editGroupURL, function() {
154 + editGroupModal.find('.modal-body').empty().addClass('loading').load(editGroupURL, function () {
164 164   $(this).removeClass('loading');
165 165   $(document).trigger('xwiki:dom:updated', {'elements': $(this).toArray()});
166 166   });
167 167   }).on('hide.bs.modal', function() {
168 - editGroupModal.data('liveTable').refresh();
159 + editGroupModal.data('liveDataElement').data('liveData').updateEntries();
169 169   });
170 170  
171 171   //
... ... @@ -174,9 +174,9 @@
174 174   var deleteGroupModal = $('#deleteGroupModal');
175 175   deleteGroupModal.on('show.bs.modal', function() {
176 176   var rowData = deleteGroupModal.data('rowData');
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]);
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']]);
180 180   groupReference = XWiki.Model.serialize(groupReference);
181 181   }
182 182   deleteGroupModal.find('.groupName').text(groupReference);
... ... @@ -190,7 +190,7 @@
190 190   docname: deleteGroupModal.find('.groupName').text(),
191 191   form_token: xm.form_token
192 192   }).then(() => {
193 - deleteGroupModal.data('liveTable').deleteRow(deleteGroupModal.data('rowIndex'));
184 + deleteGroupModal.data('liveDataElement').data('liveData').updateEntries();
194 194   notification.replace(new XWiki.widgets.Notification(
195 195   $jsontool.serialize($services.localization.render('xe.admin.groups.delete.done')),
196 196   'done'
XWiki.StyleSheetExtension[0]
Code
... ... @@ -1,9 +7,3 @@
1 -/**
2 - * Groups Live Table
3 - */
4 -#groupstable td[data-title] {
5 - vertical-align: middle;
6 -}
7 7  
8 8  /**
9 9   * Create Group Modal