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