]> git.proxmox.com Git - pmg-gui.git/blobdiff - js/ObjectGroup.js
quarantines: color code deliver and delete buttons
[pmg-gui.git] / js / ObjectGroup.js
index d940a4cb0f182bac4c0a58de1bc0eb77b4dea946..2223ffa3e26a0e3b6e5bd69a03889449679d0298 100644 (file)
-Ext.define('pmg-object-group', {
-    extend: 'Ext.data.Model',
-    fields: [ 'id', 'name', 'info' ],
-    idProperty: 'cidr'
-});
+Ext.define('PMG.ObjectGroup', {
+    extend: 'Ext.grid.GridPanel',
+    alias: 'widget.pmgObjectGroup',
 
-Ext.define('pmg-object-list', {
-    extend: 'Ext.data.Model',
-    fields: [
-       'id', 'descr',
-       { name: 'otype', type: 'integer' },
-       { name: 'receivertest', type: 'boolean' }
-    ],
-    idProperty: 'id'
-});
+    baseurl: undefined,
 
+    otype_list: [],
 
-Ext.define('PMG.ObjectGroup', {
-    extend: 'Ext.grid.GridPanel',
-    alias: ['widget.pmgObjectGroup'],
+    hideGroupInfo: false,
+    showDirection: false, // only important for SMTP Whitelist
+
+    ogdata: undefined,
+
+    emptyText: gettext('Please select an object.'),
+
+    setBaseUrl: function(baseurl) {
+       let me = this;
+
+       me.baseurl = baseurl;
+
+       if (me.baseurl === undefined) {
+           me.store.proxy.setUrl(undefined);
+           me.store.setData([]);
+           me.setButtonState(me.store, [], false);
+       } else {
+           let url = '/api2/json' + me.baseurl + '/objects';
+           me.store.proxy.setUrl(url);
+           me.store.load();
+       }
+    },
+
+    setObjectInfo: function(ogdata) {
+       let me = this;
+
+       me.ogdata = ogdata;
+
+       if (me.ogdata === undefined) {
+           me.down('#oginfo').update(me.emptyText);
+       } else {
+           let html = '<b>' + Ext.String.htmlEncode(me.ogdata.name) + '</b>';
+           html += "<br><br>";
+           html += Ext.String.htmlEncode(Ext.String.trim(me.ogdata.info));
 
-    ogclass: 'who',
+           me.down('#oginfo').update(html);
+           me.down('#ogdata').setHidden(false);
+       }
+    },
 
-    subject: gettext('Object Group'),
-    
-    initComponent : function() {
-       var me = this;
+    setButtonState: function(store, records, success) {
+       let me = this;
+       if (!success || !me.baseurl) {
+           me.down('#addMenuButton').setDisabled(true);
+           return;
+       }
+       me.down('#addMenuButton').setDisabled(false);
+    },
 
-       var baseurl = "/config/ruledb/" + me.ogclass;
-       
-       var store = new Ext.data.Store({
-           model: 'pmg-object-group',
+    initComponent: function() {
+       let me = this;
+
+       me.store = new Ext.data.Store({
+           model: 'pmg-object-list',
            proxy: {
                type: 'proxmox',
-               url: "/api2/json" + baseurl,
            },
-           sorters: {
-               property: 'name',
-               order: 'DESC'
-           }
+           sorters: [
+               {
+                   property: 'receivertest',
+               },
+               {
+                   property: 'otype',
+                   direction: 'ASC',
+               },
+           ],
        });
 
-        var reload = function() {
-           var rec = me.selModel.getSelection()[0];
-            store.load(function() {
-               if (rec) {
-                   // try to selectprevious selection
-                   var nrec = store.findRecord('id', rec.data.id);
-                   me.selModel.select(nrec);
-               }
+       me.columns = [{
+           header: gettext('Type'),
+           dataIndex: 'otype',
+           renderer: PMG.Utils.format_otype,
+           width: 200,
+       }];
+
+       if (me.showDirection) {
+           me.columns.push({
+               header: gettext('Direction'),
+               dataIndex: 'receivertest',
+               renderer: function(value) {
+                   return value ? PMG.Utils.receiverText : PMG.Utils.senderText;
+               },
            });
+       }
+
+       me.columns.push({
+           header: gettext('Value'),
+           dataIndex: 'descr',
+           renderer: Ext.String.htmlEncode,
+           flex: 1,
+       });
+
+       let reload = function() {
+            me.store.load();
         };
 
        me.selModel = Ext.create('Ext.selection.RowModel', {});
 
-       var remove_btn = Ext.createWidget('proxmoxButton', {
-           text: gettext('Remove'),
-           disabled: true,
+       let remove_btn = Ext.createWidget('proxmoxStdRemoveButton', {
            selModel: me.selModel,
-           confirmMsg: function (rec) {
-               return Ext.String.format(
-                   gettext('Are you sure you want to remove entry {0}'),
-                   "'" + rec.data.name + "'");
+           getUrl: function(rec) {
+               return me.baseurl + '/objects/' + rec.data.id;
            },
-           handler: function(btn, event, rec) {
-               Proxmox.Utils.API2Request({
-                   url: baseurl + '/' + rec.data.id,
-                   method: 'DELETE',
-                   waitMsgTarget: me,
-                   callback: function() {
-                       reload();
-                   },
-                   failure: function (response, opts) {
-                       Ext.Msg.alert(gettext('Error'), response.htmlStatus);
-                   }
-               });
-           }
+           callback: reload,
+           getRecordName: function(rec) {
+               return PMG.Utils.format_otype(rec.data.otype) +
+                   ': ' + rec.data.descr;
+           },
+           waitMsgTarget: me,
        });
 
-       var inputItems = [
-           {
-               xtype: 'textfield',
-               name: 'name',
-               fieldLabel: gettext('Name')
-           },
-           {
-               xtype: 'textfield',
-               name: 'info',
-               fieldLabel: gettext("Description")
+       let full_subject = function(subject, receivertest) {
+           if (me.showDirection) {
+               let direction = receivertest
+                   ? PMG.Utils.receiverText : PMG.Utils.senderText;
+
+               return subject + ' (' + direction + ')';
+           } else {
+               return subject;
            }
-       ];
+       };
 
-       var run_editor = function() {
-           var rec = me.selModel.getSelection()[0];
+       let run_editor = function() {
+           let rec = me.selModel.getSelection()[0];
            if (!rec) {
                return;
            }
 
-           var config = {
-               url: "/api2/extjs" + baseurl +'/' + rec.data.id + '/config',
-               method: 'PUT',
-               subject: me.subject,
-               items: inputItems
-           };
+           let editor = PMG.Utils.object_editors[rec.data.otype];
+           if (!editor || editor.uneditable) {
+               return;
+           }
 
-           var win = Ext.createWidget('proxmoxWindowEdit', config);
+           let config = Ext.apply({ method: 'PUT' }, editor);
+           config.subject = full_subject(editor.subject, rec.data.receivertest);
+           config.url = me.baseurl + '/' + editor.subdir + '/' + rec.data.id;
+
+           let win = Ext.createWidget(config);
 
            win.load();
            win.on('destroy', reload);
            win.show();
        };
 
-       var tbar = [
-            {
-               xtype: 'proxmoxButton',
-               text: gettext('Edit'),
-               disabled: true,
-               selModel: me.selModel,
-               handler: run_editor
-            },
-            {
-               text: gettext('Create'),
-               handler: function() {
-                   var config = {
-                       method: 'POST',
-                       url: "/api2/extjs" + baseurl,
-                       create: true,
-                       subject: me.subject,
-                       items: inputItems
-                   };
+       let menu_items = [];
+
+       Ext.Array.each(me.otype_list, function(otype) {
+           let editor = PMG.Utils.object_editors[otype];
 
-                   var win = Ext.createWidget('proxmoxWindowEdit', config);
+           let config = Ext.apply({ method: 'POST' }, editor);
+           config.subject = full_subject(editor.subject, editor.receivertest);
 
+           menu_items.push({
+               text: config.subject,
+               iconCls: config.iconCls || 'fa fa-question-circle',
+               handler: function() {
+                   if (me.baseurl === undefined) {
+                       return;
+                   }
+                   config.url = me.baseurl + '/' + editor.subdir;
+                   let win = Ext.create(config);
                    win.on('destroy', reload);
                    win.show();
-               }
-            },
-           remove_btn
-        ];
+               },
+           });
+       });
 
-       Proxmox.Utils.monStoreErrors(me, store);
+       me.dockedItems = [];
 
-       Ext.apply(me, {
-           store: store,
-           tbar: tbar,
-           columns: [
+       me.dockedItems.push({
+           xtype: 'toolbar',
+           dock: 'top',
+           items: [
+               {
+                   text: gettext('Add'),
+                   disabled: true,
+                   itemId: 'addMenuButton',
+                   menu: {
+                       items: menu_items,
+                   },
+               },
                {
-                   header: gettext('Name'),
-                   sortable: true,
-                   flex: 1,
-                   dataIndex: 'name',
-                   renderer: Ext.String.htmlEncode
-               }
+                   xtype: 'proxmoxButton',
+                   text: gettext('Edit'),
+                   disabled: true,
+                   selModel: me.selModel,
+                   enableFn: function(rec) {
+                       let editor = PMG.Utils.object_editors[rec.data.otype];
+                       return editor && !editor.uneditable;
+                   },
+                   handler: run_editor,
+               },
+               remove_btn,
            ],
+       });
+
+       me.dockedItems.push({
+           dock: 'top',
+           border: 1,
+           layout: 'anchor',
+           hidden: !!me.hideGroupInfo,
+           itemId: 'ogdata',
+           items: [
+               {
+                   xtype: 'component',
+                   anchor: '100%',
+                   itemId: 'oginfo',
+                   style: { 'white-space': 'pre' },
+                   padding: 10,
+                   html: me.emptyText,
+                   listeners: {
+                       dblclick: {
+                           fn: function(e, t) {
+                               if (me.ogdata === undefined) { return; }
+                               me.fireEvent('dblclickOGInfo', me, e, t, me.ogdata);
+                           },
+                           element: 'el',
+                           scope: this,
+                       },
+                   },
+               },
+           ],
+       });
+
+       Proxmox.Utils.monStoreErrors(me, me.store, true);
+
+       Ext.apply(me, {
+           run_editor: run_editor,
            listeners: {
                itemdblclick: run_editor,
-               activate: reload
-           }
+               activate: reload,
+           },
        });
 
        me.callParent();
 
-       reload(); // initial load
-    }
+       me.mon(me.store, 'load', me.setButtonState, me);
+
+       if (me.baseurl) {
+           me.setBaseUrl(me.baseurl); // configure store, load()
+       }
+    },
 });