]>
Commit | Line | Data |
---|---|---|
3eba771a | 1 | Ext.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 | }); |