]> git.proxmox.com Git - pmg-gui.git/blame - js/ObjectGroup.js
objects: add separator between match field selector and description
[pmg-gui.git] / js / ObjectGroup.js
CommitLineData
3eba771a 1Ext.define('PMG.ObjectGroup', {
56b0691b 2 extend: 'Ext.grid.GridPanel',
049a531b 3 alias: 'widget.pmgObjectGroup',
56b0691b
DM
4
5 baseurl: undefined,
049a531b 6
56b0691b
DM
7 otype_list: [],
8
049a531b
DM
9 hideGroupInfo: false,
10 showDirection: false, // only important for SMTP Whitelist
56b0691b 11
cc1c5008 12 ogdata: undefined,
e3c8d4fd 13 objectClass: undefined,
cc1c5008 14
84185bf4
DM
15 emptyText: gettext('Please select an object.'),
16
56b0691b 17 setBaseUrl: function(baseurl) {
28eb60c0 18 let me = this;
56b0691b
DM
19
20 me.baseurl = baseurl;
21
84185bf4 22 if (me.baseurl === undefined) {
69bc007c 23 me.store.proxy.setUrl(undefined);
84185bf4 24 me.store.setData([]);
7d4f02a3 25 me.setButtonState(me.store, [], false);
84185bf4 26 } else {
28eb60c0 27 let url = '/api2/json' + me.baseurl + '/objects';
69bc007c 28 me.store.proxy.setUrl(url);
7d4f02a3 29 me.store.load();
84185bf4 30 }
56b0691b
DM
31 },
32
cc1c5008 33 setObjectInfo: function(ogdata) {
28eb60c0 34 let me = this;
56b0691b 35
e3c8d4fd
DC
36 let mode = ogdata?.invert ? 'not' : '';
37 mode += ogdata?.and ? 'all' : 'any';
38
cc1c5008
DM
39 me.ogdata = ogdata;
40
84185bf4 41 if (me.ogdata === undefined) {
84185bf4 42 me.down('#oginfo').update(me.emptyText);
758ddf06 43 me.down('#separator').setHidden(true);
e3c8d4fd
DC
44 me.down('#modeBox').setHidden(true);
45 me.down('#whatWarning').setHidden(true);
84185bf4 46 } else {
10784417 47 let html = '<b style="font-weight: bold;">' + Ext.String.htmlEncode(me.ogdata.name) + '</b>';
84185bf4
DM
48 html += "<br><br>";
49 html += Ext.String.htmlEncode(Ext.String.trim(me.ogdata.info));
50
51 me.down('#oginfo').update(html);
52 me.down('#ogdata').setHidden(false);
758ddf06 53 me.down('#separator').setHidden(false);
e3c8d4fd
DC
54 let modeSelector = me.down('#modeSelector');
55 modeSelector.suspendEvents();
56 me.down('#modeSelector').setValue(mode);
57 modeSelector.resumeEvents();
58 me.down('#modeBox').setHidden(false);
59 me.down('#whatWarning').setHidden(me.objectClass !== 'what' || mode === 'any');
84185bf4 60 }
56b0691b 61 },
049a531b 62
7d4f02a3 63 setButtonState: function(store, records, success) {
28eb60c0 64 let me = this;
7d4f02a3
DC
65 if (!success || !me.baseurl) {
66 me.down('#addMenuButton').setDisabled(true);
67 return;
68 }
69 me.down('#addMenuButton').setDisabled(false);
70 },
71
c87d46fb 72 initComponent: function() {
28eb60c0 73 let me = this;
56b0691b
DM
74
75 me.store = new Ext.data.Store({
76 model: 'pmg-object-list',
69bc007c 77 proxy: {
c87d46fb 78 type: 'proxmox',
69bc007c 79 },
56b0691b 80 sorters: [
049a531b 81 {
c87d46fb 82 property: 'receivertest',
049a531b 83 },
56b0691b 84 {
c87d46fb
TL
85 property: 'otype',
86 direction: 'ASC',
87 },
88 ],
56b0691b
DM
89 });
90
049a531b
DM
91 me.columns = [{
92 header: gettext('Type'),
93 dataIndex: 'otype',
94 renderer: PMG.Utils.format_otype,
c87d46fb 95 width: 200,
049a531b
DM
96 }];
97
98 if (me.showDirection) {
99 me.columns.push({
100 header: gettext('Direction'),
101 dataIndex: 'receivertest',
102 renderer: function(value) {
103 return value ? PMG.Utils.receiverText : PMG.Utils.senderText;
c87d46fb 104 },
049a531b
DM
105 });
106 }
107
108 me.columns.push({
109 header: gettext('Value'),
110 dataIndex: 'descr',
111 renderer: Ext.String.htmlEncode,
c87d46fb 112 flex: 1,
7a3b5e2d 113 });
049a531b 114
28eb60c0 115 let reload = function() {
56b0691b
DM
116 me.store.load();
117 };
118
119 me.selModel = Ext.create('Ext.selection.RowModel', {});
120
28eb60c0 121 let remove_btn = Ext.createWidget('proxmoxStdRemoveButton', {
56b0691b 122 selModel: me.selModel,
b357057e
DM
123 getUrl: function(rec) {
124 return me.baseurl + '/objects/' + rec.data.id;
56b0691b 125 },
b357057e
DM
126 callback: reload,
127 getRecordName: function(rec) {
128 return PMG.Utils.format_otype(rec.data.otype) +
129 ': ' + rec.data.descr;
130 },
c87d46fb 131 waitMsgTarget: me,
56b0691b
DM
132 });
133
28eb60c0 134 let full_subject = function(subject, receivertest) {
049a531b 135 if (me.showDirection) {
28eb60c0 136 let direction = receivertest
c87d46fb 137 ? PMG.Utils.receiverText : PMG.Utils.senderText;
049a531b
DM
138
139 return subject + ' (' + direction + ')';
140 } else {
141 return subject;
142 }
143 };
144
28eb60c0
TL
145 let run_editor = function() {
146 let rec = me.selModel.getSelection()[0];
56b0691b
DM
147 if (!rec) {
148 return;
149 }
150
28eb60c0 151 let editor = PMG.Utils.object_editors[rec.data.otype];
8ddd9c44 152 if (!editor || editor.uneditable) {
56b0691b
DM
153 return;
154 }
155
28eb60c0 156 let config = Ext.apply({ method: 'PUT' }, editor);
049a531b 157 config.subject = full_subject(editor.subject, rec.data.receivertest);
56b0691b
DM
158 config.url = me.baseurl + '/' + editor.subdir + '/' + rec.data.id;
159
28eb60c0 160 let win = Ext.createWidget(config);
56b0691b
DM
161
162 win.load();
163 win.on('destroy', reload);
164 win.show();
165 };
166
28eb60c0 167 let menu_items = [];
56b0691b
DM
168
169 Ext.Array.each(me.otype_list, function(otype) {
28eb60c0 170 let editor = PMG.Utils.object_editors[otype];
56b0691b 171
28eb60c0 172 let config = Ext.apply({ method: 'POST' }, editor);
049a531b 173 config.subject = full_subject(editor.subject, editor.receivertest);
56b0691b
DM
174
175 menu_items.push({
176 text: config.subject,
ea4f2a79 177 iconCls: config.iconCls || 'fa fa-question-circle',
56b0691b 178 handler: function() {
28eb60c0 179 if (me.baseurl === undefined) {
56b0691b
DM
180 return;
181 }
182 config.url = me.baseurl + '/' + editor.subdir;
28eb60c0 183 let win = Ext.create(config);
56b0691b
DM
184 win.on('destroy', reload);
185 win.show();
c87d46fb 186 },
56b0691b
DM
187 });
188 });
189
190 me.dockedItems = [];
049a531b 191
56b0691b
DM
192 me.dockedItems.push({
193 xtype: 'toolbar',
194 dock: 'top',
195 items: [
196 {
197 text: gettext('Add'),
198 disabled: true,
199 itemId: 'addMenuButton',
793ac2e4 200 menu: {
c87d46fb
TL
201 items: menu_items,
202 },
56b0691b
DM
203 },
204 {
205 xtype: 'proxmoxButton',
206 text: gettext('Edit'),
207 disabled: true,
208 selModel: me.selModel,
8ddd9c44 209 enableFn: function(rec) {
28eb60c0 210 let editor = PMG.Utils.object_editors[rec.data.otype];
c87d46fb 211 return editor && !editor.uneditable;
8ddd9c44 212 },
c87d46fb 213 handler: run_editor,
56b0691b 214 },
c87d46fb 215 remove_btn,
4703989a
DC
216 '->',
217 {
218 xtype: 'pmgFilterField',
219 filteredFields: [
220 {
221 name: 'otype',
222 renderer: (otype) => PMG.Utils.object_editors[otype].subject,
223 },
224 'descr',
225 ],
226 },
c87d46fb 227 ],
56b0691b 228 });
049a531b 229
56b0691b
DM
230 me.dockedItems.push({
231 dock: 'top',
232 border: 1,
758ddf06
DC
233 layout: {
234 type: 'hbox',
235 align: 'stretch',
236 },
c87d46fb 237 hidden: !!me.hideGroupInfo,
56b0691b 238 itemId: 'ogdata',
758ddf06 239 xtype: 'toolbar',
56b0691b 240 items: [
e3c8d4fd
DC
241 {
242 xtype: 'container',
243 itemId: 'modeBox',
244 hidden: true,
245 width: 220,
246 padding: 10,
247 layout: {
248 type: 'vbox',
249 align: 'stretch',
250 },
251 items: [
252 {
253 xtype: 'box',
10784417 254 html: `<b style="font-weight: bold;">${gettext("Match if")}</b>`,
e3c8d4fd
DC
255 },
256 {
257 xtype: 'pmgMatchModeSelector',
258 itemId: 'modeSelector',
259 padding: '10 0 0 0',
260 listeners: {
261 change: function(_field, value) {
262 let invert = value.startsWith('not') ? 1 : 0;
263 let and = value.endsWith('all') ? 1 : 0;
264
265 Proxmox.Utils.API2Request({
266 url: `${me.baseurl}/config`,
267 method: 'PUT',
268 params: {
269 and,
270 invert,
271 },
1f839721
DC
272 success: () => {
273 me.fireEvent('modeUpdate', me, !!and, !!invert);
274 me.down('#whatWarning')
275 .setHidden(me.objectClass !== 'what' || value === 'any');
276 },
e3c8d4fd
DC
277 });
278 },
279 },
280 },
281 ],
282 },
758ddf06
DC
283 {
284 xtype: 'tbseparator',
285 itemId: 'separator',
286 hidden: true,
287 },
56b0691b
DM
288 {
289 xtype: 'component',
e3c8d4fd 290 flex: 1,
56b0691b 291 itemId: 'oginfo',
de3a7ef5 292 style: { 'white-space': 'pre' },
56b0691b 293 padding: 10,
84185bf4 294 html: me.emptyText,
cc1c5008
DM
295 listeners: {
296 dblclick: {
297 fn: function(e, t) {
298 if (me.ogdata === undefined) { return; }
299 me.fireEvent('dblclickOGInfo', me, e, t, me.ogdata);
300 },
301 element: 'el',
c87d46fb
TL
302 scope: this,
303 },
304 },
305 },
306 ],
56b0691b 307 });
049a531b 308
e3c8d4fd
DC
309 me.dockedItems.push({
310 dock: 'top',
311 border: 1,
312 hidden: true,
313 itemId: 'whatWarning',
314 bodyPadding: 5,
315 items: {
316 xtype: 'displayfield',
317 margin: 0,
318 value: gettext("Caution: 'What Objects' match each mail part separately, so be careful with any option besides 'Any matches'."),
319 userCls: 'pmx-hint',
320 },
321 });
322
69bc007c
DM
323 Proxmox.Utils.monStoreErrors(me, me.store, true);
324
56b0691b 325 Ext.apply(me, {
01e0e5e5 326 run_editor: run_editor,
56b0691b
DM
327 listeners: {
328 itemdblclick: run_editor,
c87d46fb
TL
329 activate: reload,
330 },
56b0691b
DM
331 });
332
333 me.callParent();
049a531b 334
7d4f02a3
DC
335 me.mon(me.store, 'load', me.setButtonState, me);
336
049a531b
DM
337 if (me.baseurl) {
338 me.setBaseUrl(me.baseurl); // configure store, load()
339 }
c87d46fb 340 },
56b0691b 341});