]> git.proxmox.com Git - pmg-gui.git/blame - js/ObjectGroup.js
fix #4137: display receiver in attachment/virus quarantine
[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
DM
12 ogdata: undefined,
13
84185bf4
DM
14 emptyText: gettext('Please select an object.'),
15
56b0691b 16 setBaseUrl: function(baseurl) {
28eb60c0 17 let me = this;
56b0691b
DM
18
19 me.baseurl = baseurl;
20
84185bf4 21 if (me.baseurl === undefined) {
69bc007c 22 me.store.proxy.setUrl(undefined);
84185bf4 23 me.store.setData([]);
7d4f02a3 24 me.setButtonState(me.store, [], false);
84185bf4 25 } else {
28eb60c0 26 let url = '/api2/json' + me.baseurl + '/objects';
69bc007c 27 me.store.proxy.setUrl(url);
7d4f02a3 28 me.store.load();
84185bf4 29 }
56b0691b
DM
30 },
31
cc1c5008 32 setObjectInfo: function(ogdata) {
28eb60c0 33 let me = this;
56b0691b 34
cc1c5008
DM
35 me.ogdata = ogdata;
36
84185bf4 37 if (me.ogdata === undefined) {
84185bf4 38 me.down('#oginfo').update(me.emptyText);
84185bf4 39 } else {
28eb60c0 40 let html = '<b>' + Ext.String.htmlEncode(me.ogdata.name) + '</b>';
84185bf4
DM
41 html += "<br><br>";
42 html += Ext.String.htmlEncode(Ext.String.trim(me.ogdata.info));
43
44 me.down('#oginfo').update(html);
45 me.down('#ogdata').setHidden(false);
46 }
56b0691b 47 },
049a531b 48
7d4f02a3 49 setButtonState: function(store, records, success) {
28eb60c0 50 let me = this;
7d4f02a3
DC
51 if (!success || !me.baseurl) {
52 me.down('#addMenuButton').setDisabled(true);
53 return;
54 }
55 me.down('#addMenuButton').setDisabled(false);
56 },
57
c87d46fb 58 initComponent: function() {
28eb60c0 59 let me = this;
56b0691b
DM
60
61 me.store = new Ext.data.Store({
62 model: 'pmg-object-list',
69bc007c 63 proxy: {
c87d46fb 64 type: 'proxmox',
69bc007c 65 },
56b0691b 66 sorters: [
049a531b 67 {
c87d46fb 68 property: 'receivertest',
049a531b 69 },
56b0691b 70 {
c87d46fb
TL
71 property: 'otype',
72 direction: 'ASC',
73 },
74 ],
56b0691b
DM
75 });
76
049a531b
DM
77 me.columns = [{
78 header: gettext('Type'),
79 dataIndex: 'otype',
80 renderer: PMG.Utils.format_otype,
c87d46fb 81 width: 200,
049a531b
DM
82 }];
83
84 if (me.showDirection) {
85 me.columns.push({
86 header: gettext('Direction'),
87 dataIndex: 'receivertest',
88 renderer: function(value) {
89 return value ? PMG.Utils.receiverText : PMG.Utils.senderText;
c87d46fb 90 },
049a531b
DM
91 });
92 }
93
94 me.columns.push({
95 header: gettext('Value'),
96 dataIndex: 'descr',
97 renderer: Ext.String.htmlEncode,
c87d46fb 98 flex: 1,
7a3b5e2d 99 });
049a531b 100
28eb60c0 101 let reload = function() {
56b0691b
DM
102 me.store.load();
103 };
104
105 me.selModel = Ext.create('Ext.selection.RowModel', {});
106
28eb60c0 107 let remove_btn = Ext.createWidget('proxmoxStdRemoveButton', {
56b0691b 108 selModel: me.selModel,
b357057e
DM
109 getUrl: function(rec) {
110 return me.baseurl + '/objects/' + rec.data.id;
56b0691b 111 },
b357057e
DM
112 callback: reload,
113 getRecordName: function(rec) {
114 return PMG.Utils.format_otype(rec.data.otype) +
115 ': ' + rec.data.descr;
116 },
c87d46fb 117 waitMsgTarget: me,
56b0691b
DM
118 });
119
28eb60c0 120 let full_subject = function(subject, receivertest) {
049a531b 121 if (me.showDirection) {
28eb60c0 122 let direction = receivertest
c87d46fb 123 ? PMG.Utils.receiverText : PMG.Utils.senderText;
049a531b
DM
124
125 return subject + ' (' + direction + ')';
126 } else {
127 return subject;
128 }
129 };
130
28eb60c0
TL
131 let run_editor = function() {
132 let rec = me.selModel.getSelection()[0];
56b0691b
DM
133 if (!rec) {
134 return;
135 }
136
28eb60c0 137 let editor = PMG.Utils.object_editors[rec.data.otype];
8ddd9c44 138 if (!editor || editor.uneditable) {
56b0691b
DM
139 return;
140 }
141
28eb60c0 142 let config = Ext.apply({ method: 'PUT' }, editor);
049a531b 143 config.subject = full_subject(editor.subject, rec.data.receivertest);
56b0691b
DM
144 config.url = me.baseurl + '/' + editor.subdir + '/' + rec.data.id;
145
28eb60c0 146 let win = Ext.createWidget(config);
56b0691b
DM
147
148 win.load();
149 win.on('destroy', reload);
150 win.show();
151 };
152
28eb60c0 153 let menu_items = [];
56b0691b
DM
154
155 Ext.Array.each(me.otype_list, function(otype) {
28eb60c0 156 let editor = PMG.Utils.object_editors[otype];
56b0691b 157
28eb60c0 158 let config = Ext.apply({ method: 'POST' }, editor);
049a531b 159 config.subject = full_subject(editor.subject, editor.receivertest);
56b0691b
DM
160
161 menu_items.push({
162 text: config.subject,
ea4f2a79 163 iconCls: config.iconCls || 'fa fa-question-circle',
56b0691b 164 handler: function() {
28eb60c0 165 if (me.baseurl === undefined) {
56b0691b
DM
166 return;
167 }
168 config.url = me.baseurl + '/' + editor.subdir;
28eb60c0 169 let win = Ext.create(config);
56b0691b
DM
170 win.on('destroy', reload);
171 win.show();
c87d46fb 172 },
56b0691b
DM
173 });
174 });
175
176 me.dockedItems = [];
049a531b 177
56b0691b
DM
178 me.dockedItems.push({
179 xtype: 'toolbar',
180 dock: 'top',
181 items: [
182 {
183 text: gettext('Add'),
184 disabled: true,
185 itemId: 'addMenuButton',
793ac2e4 186 menu: {
c87d46fb
TL
187 items: menu_items,
188 },
56b0691b
DM
189 },
190 {
191 xtype: 'proxmoxButton',
192 text: gettext('Edit'),
193 disabled: true,
194 selModel: me.selModel,
8ddd9c44 195 enableFn: function(rec) {
28eb60c0 196 let editor = PMG.Utils.object_editors[rec.data.otype];
c87d46fb 197 return editor && !editor.uneditable;
8ddd9c44 198 },
c87d46fb 199 handler: run_editor,
56b0691b 200 },
c87d46fb
TL
201 remove_btn,
202 ],
56b0691b 203 });
049a531b 204
56b0691b
DM
205 me.dockedItems.push({
206 dock: 'top',
207 border: 1,
208 layout: 'anchor',
c87d46fb 209 hidden: !!me.hideGroupInfo,
56b0691b
DM
210 itemId: 'ogdata',
211 items: [
212 {
213 xtype: 'component',
214 anchor: '100%',
215 itemId: 'oginfo',
de3a7ef5 216 style: { 'white-space': 'pre' },
56b0691b 217 padding: 10,
84185bf4 218 html: me.emptyText,
cc1c5008
DM
219 listeners: {
220 dblclick: {
221 fn: function(e, t) {
222 if (me.ogdata === undefined) { return; }
223 me.fireEvent('dblclickOGInfo', me, e, t, me.ogdata);
224 },
225 element: 'el',
c87d46fb
TL
226 scope: this,
227 },
228 },
229 },
230 ],
56b0691b 231 });
049a531b 232
69bc007c
DM
233 Proxmox.Utils.monStoreErrors(me, me.store, true);
234
56b0691b 235 Ext.apply(me, {
01e0e5e5 236 run_editor: run_editor,
56b0691b
DM
237 listeners: {
238 itemdblclick: run_editor,
c87d46fb
TL
239 activate: reload,
240 },
56b0691b
DM
241 });
242
243 me.callParent();
049a531b 244
7d4f02a3
DC
245 me.mon(me.store, 'load', me.setButtonState, me);
246
049a531b
DM
247 if (me.baseurl) {
248 me.setBaseUrl(me.baseurl); // configure store, load()
249 }
c87d46fb 250 },
56b0691b 251});