]> git.proxmox.com Git - pmg-gui.git/blobdiff - js/ObjectGroup.js
ClusterAdministration.js - sort nodes by cid
[pmg-gui.git] / js / ObjectGroup.js
index b67e000467d180ba8f290b30b4f6aeaafb49ba2d..1e76ef3d3f8bbc8113448fb644edd106f905edba 100644 (file)
@@ -1,58 +1,76 @@
+/*global Proxmox*/
 Ext.define('PMG.ObjectGroup', {
     extend: 'Ext.grid.GridPanel',
+    alias: 'widget.pmgObjectGroup',
 
     baseurl: undefined,
-    
+
     otype_list: [],
 
-    columns: [
-       {
-           header: gettext('Type'),
-           dataIndex: 'otype',
-           renderer: PMG.Utils.format_otype,
-           width: 200
-       },
-       {
-           header: gettext('Value'),
-           dataIndex: 'descr',
-           renderer: Ext.String.htmlEncode,
-           flex: 1
-       }
-    ],
+    hideGroupInfo: false,
+    showDirection: false, // only important for SMTP Whitelist
+
+    ogdata: undefined,
+
+    emptyText: gettext('Please select an object.'),
 
     setBaseUrl: function(baseurl) {
        var me = this;
 
        me.baseurl = baseurl;
 
-       me.store.setProxy({
-           type: 'proxmox',
-           url: '/api2/json' + me.baseurl + '/objects'
-       });
-
-       me.store.load(function() {
-           me.down('#addMenuButton').setDisabled(false);
-
-       });
+       if (me.baseurl === undefined) {
+           me.store.proxy.setUrl(undefined);
+           me.store.setData([]);
+           me.setButtonState(me.store, [], false);
+       } else {
+           var url = '/api2/json' + me.baseurl + '/objects';
+           me.store.proxy.setUrl(url);
+           me.store.load();
+       }
     },
 
-    setObjectInfo: function(name, info) {
+    setObjectInfo: function(ogdata) {
        var me = this;
 
-       var html = '<b>' + Ext.String.htmlEncode(name) + '</b>';
-       html += "<br><br>";
-       html += Ext.String.htmlEncode(Ext.String.trim(info));
+       me.ogdata = ogdata;
+
+       if (me.ogdata === undefined) {
+
+           me.down('#oginfo').update(me.emptyText);
+
+       } else {
 
-       me.down('#oginfo').update(html);
-       me.down('#ogdata').setHidden(false);
+           var html = '<b>' + Ext.String.htmlEncode(me.ogdata.name) + '</b>';
+           html += "<br><br>";
+           html += Ext.String.htmlEncode(Ext.String.trim(me.ogdata.info));
+
+           me.down('#oginfo').update(html);
+           me.down('#ogdata').setHidden(false);
+       }
     },
-    
+
+    setButtonState: function(store, records, success) {
+       var me = this;
+       if (!success || !me.baseurl) {
+           me.down('#addMenuButton').setDisabled(true);
+           return;
+       }
+       me.down('#addMenuButton').setDisabled(false);
+    },
+
     initComponent : function() {
        var me = this;
 
        me.store = new Ext.data.Store({
            model: 'pmg-object-list',
+           proxy: {
+               type: 'proxmox'
+           },
            sorters: [
+               {
+                   property : 'receivertest'
+               },
                {
                    property : 'otype',
                    direction: 'ASC'
@@ -60,37 +78,60 @@ Ext.define('PMG.ObjectGroup', {
            ]
        });
 
+       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
+       });
+
        var reload = function() {
             me.store.load();
         };
 
        me.selModel = Ext.create('Ext.selection.RowModel', {});
 
-       var remove_btn = Ext.createWidget('proxmoxButton', {
-           text: gettext('Remove'),
-           disabled: true,
+       var 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}'),
-                   "'" +  PMG.Utils.format_otype(rec.data.otype) +
-                       ': ' + rec.data.descr + "'");
+           getUrl: function(rec) {
+               return me.baseurl + '/objects/' + rec.data.id;
            },
-           handler: function(btn, event, rec) {
-               Proxmox.Utils.API2Request({
-                   url: me.baseurl + '/objects/'+ 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 full_subject = function(subject, receivertest) {
+           if (me.showDirection) {
+               var direction = receivertest ?
+                   PMG.Utils.receiverText : PMG.Utils.senderText;
+
+               return subject + ' (' + direction + ')';
+           } else {
+               return subject;
+           }
+       };
+
        var run_editor = function() {
            var rec = me.selModel.getSelection()[0];
            if (!rec) {
@@ -98,15 +139,15 @@ Ext.define('PMG.ObjectGroup', {
            }
 
            var editor = PMG.Utils.object_editors[rec.data.otype];
-           if (!editor) {
+           if (!editor || editor.uneditable) {
                return;
            }
 
            var config = Ext.apply({ method: 'PUT' }, editor);
-
+           config.subject = full_subject(editor.subject, rec.data.receivertest);
            config.url = me.baseurl + '/' + editor.subdir + '/' + rec.data.id;
 
-           var win = Ext.createWidget('proxmoxWindowEdit', config);
+           var win = Ext.createWidget(config);
 
            win.load();
            win.on('destroy', reload);
@@ -120,15 +161,17 @@ Ext.define('PMG.ObjectGroup', {
            var editor = PMG.Utils.object_editors[otype];
 
            var 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;
-                   var win = Ext.createWidget('proxmoxWindowEdit', config);
+                   var win = Ext.create(config);
                    win.on('destroy', reload);
                    win.show();
                }
@@ -136,7 +179,7 @@ Ext.define('PMG.ObjectGroup', {
        });
 
        me.dockedItems = [];
-       
+
        me.dockedItems.push({
            xtype: 'toolbar',
            dock: 'top',
@@ -145,26 +188,30 @@ Ext.define('PMG.ObjectGroup', {
                    text: gettext('Add'),
                    disabled: true,
                    itemId: 'addMenuButton',
-                   menu: new Ext.menu.Menu({
+                   menu: {
                        items: menu_items
-                   })
+                   }
                },
                {
                    xtype: 'proxmoxButton',
                    text: gettext('Edit'),
                    disabled: true,
                    selModel: me.selModel,
+                   enableFn: function(rec) {
+                       var editor = PMG.Utils.object_editors[rec.data.otype];
+                       return (editor && !editor.uneditable);
+                   },
                    handler: run_editor
                },
-               remove_btn
+               remove_btn
            ]
        });
-       
+
        me.dockedItems.push({
            dock: 'top',
            border: 1,
            layout: 'anchor',
-           //hidden: true,
+           hidden: me.hideGroupInfo ? true : false,
            itemId: 'ogdata',
            items: [
                {
@@ -173,11 +220,22 @@ Ext.define('PMG.ObjectGroup', {
                    itemId: 'oginfo',
                    style: { 'white-space': 'pre' },
                    padding: 10,
-                   html: gettext('Please select an object.')
+                   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, {
            listeners: {
@@ -187,5 +245,11 @@ Ext.define('PMG.ObjectGroup', {
        });
 
        me.callParent();
+
+       me.mon(me.store, 'load', me.setButtonState, me);
+
+       if (me.baseurl) {
+           me.setBaseUrl(me.baseurl); // configure store, load()
+       }
     }
 });