]> git.proxmox.com Git - pve-manager.git/blobdiff - www/manager6/panel/IPSet.js
ui: backup job: avoid calling max-workers VM workers
[pve-manager.git] / www / manager6 / panel / IPSet.js
index 842ec2c72b4101b50f9ec52706c838de23330b11..814b52ae44d18e80776da687aa9e9734c17147c5 100644 (file)
@@ -1,7 +1,16 @@
+Ext.define('pve-fw-ipsets', {
+    extend: 'Ext.data.Model',
+    fields: ['name', 'comment', 'digest'],
+    idProperty: 'name',
+});
+
 Ext.define('PVE.IPSetList', {
     extend: 'Ext.grid.Panel',
     alias: 'widget.pveIPSetList',
 
+    stateful: true,
+    stateId: 'grid-firewall-ipsetlist',
+
     ipset_panel: undefined,
 
     base_url: undefined,
@@ -11,37 +20,38 @@ Ext.define('PVE.IPSetList', {
     editBtn: undefined,
 
     initComponent: function() {
-       /*jslint confusion: true */
         var me = this;
 
-       if (me.ipset_panel == undefined) {
+       if (typeof me.ipset_panel === 'undefined') {
            throw "no rule panel specified";
        }
 
-       if (me.base_url == undefined) {
+       if (typeof me.ipset_panel === 'undefined') {
            throw "no base_url specified";
        }
 
        var store = new Ext.data.Store({
-           fields: [ 'name', 'comment', 'digest' ],
+           model: 'pve-fw-ipsets',
            proxy: {
-               type: 'pve',
-               url: "/api2/json" + me.base_url
+               type: 'proxmox',
+               url: "/api2/json" + me.base_url,
            },
-           idProperty: 'name',
            sorters: {
                property: 'name',
-               order: 'DESC'
-           }
+               direction: 'ASC',
+           },
        });
 
+       var caps = Ext.state.Manager.get('GuiCap');
+       let canEdit = !!caps.vms['VM.Config.Network'] || !!caps.dc['Sys.Modify'] || !!caps.nodes['Sys.Modify'];
+
        var sm = Ext.create('Ext.selection.RowModel', {});
 
        var reload = function() {
            var oldrec = sm.getSelection()[0];
            store.load(function(records, operation, success) {
                if (oldrec) {
-                   var rec = store.findRecord('name', oldrec.data.name);
+                   var rec = store.findRecord('name', oldrec.data.name, 0, false, true, true);
                    if (rec) {
                        sm.select(rec);
                    }
@@ -51,10 +61,10 @@ Ext.define('PVE.IPSetList', {
 
        var run_editor = function() {
            var rec = sm.getSelection()[0];
-           if (!rec) {
+           if (!rec || !canEdit) {
                return;
            }
-           var win = Ext.create('PVE.window.Edit', {
+           var win = Ext.create('Proxmox.window.Edit', {
                subject: "IPSet '" + rec.data.name + "'",
                url: me.base_url,
                method: 'POST',
@@ -63,39 +73,40 @@ Ext.define('PVE.IPSetList', {
                    {
                        xtype: 'hiddenfield',
                        name: 'rename',
-                       value: rec.data.name
+                       value: rec.data.name,
                    },
                    {
                        xtype: 'textfield',
                        name: 'name',
                        value: rec.data.name,
                        fieldLabel: gettext('Name'),
-                       allowBlank: false
+                       allowBlank: false,
                    },
                    {
                        xtype: 'textfield',
                        name: 'comment',
                        value: rec.data.comment,
-                       fieldLabel: gettext('Comment')
-                   }
-               ]
+                       fieldLabel: gettext('Comment'),
+                   },
+               ],
            });
            win.show();
            win.on('destroy', reload);
        };
 
-       me.editBtn = new PVE.button.Button({
+       me.editBtn = new Proxmox.button.Button({
            text: gettext('Edit'),
            disabled: true,
+           enableFn: rec => canEdit,
            selModel: sm,
-           handler: run_editor
+           handler: run_editor,
        });
 
-       me.addBtn = new PVE.button.Button({
+       me.addBtn = new Proxmox.button.Button({
            text: gettext('Create'),
            handler: function() {
                sm.deselectAll();
-               var win = Ext.create('PVE.window.Edit', {
+               var win = Ext.create('Proxmox.window.Edit', {
                    subject: 'IPSet',
                    url: me.base_url,
                    method: 'POST',
@@ -105,93 +116,91 @@ Ext.define('PVE.IPSetList', {
                            name: 'name',
                            value: '',
                            fieldLabel: gettext('Name'),
-                           allowBlank: false
+                           allowBlank: false,
                        },
                        {
                            xtype: 'textfield',
                            name: 'comment',
                            value: '',
-                           fieldLabel: gettext('Comment')
-                       }
-                   ]
+                           fieldLabel: gettext('Comment'),
+                       },
+                   ],
                });
                win.show();
                win.on('destroy', reload);
-
-           }
+           },
        });
 
-       me.removeBtn = new PVE.button.Button({
-           text: gettext('Remove'),
+       me.removeBtn = Ext.create('Proxmox.button.StdRemoveButton', {
+           enableFn: rec => canEdit,
            selModel: sm,
-           disabled: true,
-           handler: function() {
-               var rec = sm.getSelection()[0];
-               if (!rec || !me.base_url) {
-                   return;
-               }
-               PVE.Utils.API2Request({
-                   url: me.base_url + '/' + rec.data.name,
-                   method: 'DELETE',
-                   waitMsgTarget: me,
-                   failure: function(response, options) {
-                       Ext.Msg.alert(gettext('Error'), response.htmlStatus);
-                   },
-                   callback: reload
-               });
-           }
+           baseurl: me.base_url + '/',
+           callback: reload,
        });
 
        Ext.apply(me, {
            store: store,
-           tbar: [ '<b>IPSet:</b>', me.addBtn, me.removeBtn, me.editBtn ],
+           tbar: ['<b>IPSet:</b>', me.addBtn, me.removeBtn, me.editBtn],
            selModel: sm,
            columns: [
-               { header: 'IPSet', dataIndex: 'name', width: 100 },
-               { header: gettext('Comment'), dataIndex: 'comment', renderer: Ext.String.htmlEncode, flex: 1 }
+               {
+                   header: 'IPSet',
+                   dataIndex: 'name',
+                   minWidth: 150,
+                   flex: 1,
+               },
+               {
+                   header: gettext('Comment'),
+                   dataIndex: 'comment',
+                   renderer: Ext.String.htmlEncode,
+                   flex: 4,
+               },
            ],
            listeners: {
                itemdblclick: run_editor,
-               select: function(sm, rec) {
+               select: function(_, rec) {
                    var url = me.base_url + '/' + rec.data.name;
                    me.ipset_panel.setBaseUrl(url);
                },
                deselect: function() {
                    me.ipset_panel.setBaseUrl(undefined);
                },
-               show: reload
-           }
+               show: reload,
+           },
        });
 
+       if (!canEdit) {
+           me.addBtn.setDisabled(true);
+       }
+
        me.callParent();
 
        store.load();
-    }
+    },
 });
 
 Ext.define('PVE.IPSetCidrEdit', {
-    extend: 'PVE.window.Edit',
+    extend: 'Proxmox.window.Edit',
 
     cidr: undefined,
 
-    initComponent : function() {
-       /*jslint confusion: true */
+    initComponent: function() {
        var me = this;
 
-       me.create = (me.cidr === undefined);
+       me.isCreate = me.cidr === undefined;
 
 
-       if (me.create) {
-            me.url = '/api2/extjs' + me.base_url;
-            me.method = 'POST';
-        } else {
-            me.url = '/api2/extjs' + me.base_url + '/' + me.cidr;
-            me.method = 'PUT';
-        }
+       if (me.isCreate) {
+           me.url = '/api2/extjs' + me.base_url;
+           me.method = 'POST';
+       } else {
+           me.url = '/api2/extjs' + me.base_url + '/' + me.cidr;
+           me.method = 'PUT';
+       }
 
        var column1 = [];
 
-       if (me.create) {
+       if (me.isCreate) {
            if (!me.list_refs_url) {
                throw "no alias_base_url specified";
            }
@@ -203,62 +212,65 @@ Ext.define('PVE.IPSetCidrEdit', {
                autoSelect: false,
                editable: true,
                base_url: me.list_refs_url,
-               value: '',
-               fieldLabel: gettext('IP/CIDR')
+               allowBlank: false,
+               fieldLabel: gettext('IP/CIDR'),
            });
        } else {
            column1.push({
                xtype: 'displayfield',
                name: 'cidr',
                value: '',
-               fieldLabel: gettext('IP/CIDR')
+               fieldLabel: gettext('IP/CIDR'),
            });
        }
 
-       var ipanel = Ext.create('PVE.panel.InputPanel', {
-           create: me.create,
+       var ipanel = Ext.create('Proxmox.panel.InputPanel', {
+           isCreate: me.isCreate,
            column1: column1,
            column2: [
                {
-                   xtype: 'pvecheckbox',
+                   xtype: 'proxmoxcheckbox',
                    name: 'nomatch',
                    checked: false,
                    uncheckedValue: 0,
-                   fieldLabel: 'nomatch'
-               }
+                   fieldLabel: 'nomatch',
+               },
            ],
            columnB: [
                {
                    xtype: 'textfield',
                    name: 'comment',
                    value: '',
-                   fieldLabel: gettext('Comment')
-               }
-           ]
+                   fieldLabel: gettext('Comment'),
+               },
+           ],
        });
 
        Ext.apply(me, {
            subject: gettext('IP/CIDR'),
-           items: [ ipanel ]
+           items: [ipanel],
        });
 
        me.callParent();
 
-       if (!me.create) {
+       if (!me.isCreate) {
            me.load({
-               success:  function(response, options) {
+               success: function(response, options) {
                    var values = response.result.data;
                    ipanel.setValues(values);
-               }
+               },
            });
        }
-    }
+    },
 });
 
 Ext.define('PVE.IPSetGrid', {
     extend: 'Ext.grid.Panel',
     alias: 'widget.pveIPSetGrid',
 
+    stateful: true,
+    stateId: 'grid-firewall-ipsets',
+
     base_url: undefined,
     list_refs_url: undefined,
 
@@ -275,10 +287,13 @@ Ext.define('PVE.IPSetGrid', {
            me.addBtn.setDisabled(true);
            me.store.removeAll();
        } else {
-           me.addBtn.setDisabled(false);
+           if (me.canEdit) {
+               me.addBtn.setDisabled(false);
+           }
+           me.removeBtn.baseurl = url + '/';
            me.store.setProxy({
-               type: 'pve',
-               url: '/api2/json' + url
+               type: 'proxmox',
+               url: '/api2/json' + url,
            });
 
            me.store.load();
@@ -286,7 +301,6 @@ Ext.define('PVE.IPSetGrid', {
     },
 
     initComponent: function() {
-       /*jslint confusion: true */
         var me = this;
 
        if (!me.list_refs_url) {
@@ -294,7 +308,7 @@ Ext.define('PVE.IPSetGrid', {
        }
 
        var store = new Ext.data.Store({
-           model: 'pve-ipset'
+           model: 'pve-ipset',
        });
 
        var reload = function() {
@@ -303,62 +317,53 @@ Ext.define('PVE.IPSetGrid', {
 
        var sm = Ext.create('Ext.selection.RowModel', {});
 
+       me.caps = Ext.state.Manager.get('GuiCap');
+       me.canEdit = !!me.caps.vms['VM.Config.Network'] || !!me.caps.dc['Sys.Modify'] || !!me.caps.nodes['Sys.Modify'];
+
        var run_editor = function() {
            var rec = sm.getSelection()[0];
-           if (!rec) {
+           if (!rec || !me.canEdit) {
                return;
            }
            var win = Ext.create('PVE.IPSetCidrEdit', {
                base_url: me.base_url,
-               cidr: rec.data.cidr
+               cidr: rec.data.cidr,
            });
            win.show();
            win.on('destroy', reload);
        };
 
-       me.editBtn = new PVE.button.Button({
+       me.editBtn = new Proxmox.button.Button({
            text: gettext('Edit'),
            disabled: true,
+           enableFn: rec => me.canEdit,
            selModel: sm,
-           handler: run_editor
+           handler: run_editor,
        });
 
-       me.addBtn = new PVE.button.Button({
+       me.addBtn = new Proxmox.button.Button({
            text: gettext('Add'),
            disabled: true,
+           enableFn: rec => me.canEdit,
            handler: function() {
                if (!me.base_url) {
                    return;
                }
                var win = Ext.create('PVE.IPSetCidrEdit', {
                    base_url: me.base_url,
-                   list_refs_url: me.list_refs_url
+                   list_refs_url: me.list_refs_url,
                });
                win.show();
                win.on('destroy', reload);
-           }
+           },
        });
 
-       me.removeBtn = new PVE.button.Button({
-           text: gettext('Remove'),
-           selModel: sm,
+       me.removeBtn = Ext.create('Proxmox.button.StdRemoveButton', {
            disabled: true,
-           handler: function() {
-               var rec = sm.getSelection()[0];
-               if (!rec || !me.base_url) {
-                   return;
-               }
-
-               PVE.Utils.API2Request({
-                   url: me.base_url + '/' + rec.data.cidr,
-                   method: 'DELETE',
-                   waitMsgTarget: me,
-                   failure: function(response, options) {
-                       Ext.Msg.alert(gettext('Error'), response.htmlStatus);
-                   },
-                   callback: reload
-               });
-           }
+           enableFn: rec => me.canEdit,
+           selModel: sm,
+           baseurl: me.base_url + '/',
+           callback: reload,
        });
 
        var render_errors = function(value, metaData, record) {
@@ -366,47 +371,51 @@ Ext.define('PVE.IPSetGrid', {
            if (errors) {
                var msg = errors.cidr || errors.nomatch;
                if (msg) {
-                   metaData.tdCls = 'x-form-invalid-field';
-                   var html = '<p>' +  Ext.htmlEncode(msg) + '</p>';
-                   metaData.tdAttr = 'data-qwidth=600 data-qtitle="ERROR" data-qtip="' + 
-                       html.replace(/\"/g,'&quot;') + '"';
+                   metaData.tdCls = 'proxmox-invalid-row';
+                   var html = '<p>' + Ext.htmlEncode(msg) + '</p>';
+                   metaData.tdAttr = 'data-qwidth=600 data-qtitle="ERROR" data-qtip="' +
+                       html.replace(/"/g, '&quot;') + '"';
                }
            }
            return value;
        };
 
        Ext.apply(me, {
-           tbar: [ '<b>IP/CIDR:</b>', me.addBtn, me.removeBtn, me.editBtn ],
+           tbar: ['<b>IP/CIDR:</b>', me.addBtn, me.removeBtn, me.editBtn],
            store: store,
            selModel: sm,
            listeners: {
-               itemdblclick: run_editor
+               itemdblclick: run_editor,
            },
            columns: [
                {
-                   xtype: 'rownumberer'
+                   xtype: 'rownumberer',
+                   // cannot use width on instantiation as rownumberer hard-wires that in the
+                   // constructor to avoid being overridden by applyDefaults
+                   minWidth: 40,
                },
                {
                    header: gettext('IP/CIDR'),
                    dataIndex: 'cidr',
-                   width: 150,
+                   minWidth: 150,
+                   flex: 1,
                    renderer: function(value, metaData, record) {
                        value = render_errors(value, metaData, record);
                        if (record.data.nomatch) {
                            return '<b>! </b>' + value;
                        }
                        return value;
-                   }
+                   },
                },
                {
                    header: gettext('Comment'),
                    dataIndex: 'comment',
-                   flex: 1,
+                   flex: 3,
                    renderer: function(value) {
                        return Ext.util.Format.htmlEncode(value);
-                   }
-               }
-           ]
+                   },
+               },
+           ],
        });
 
        me.callParent();
@@ -414,16 +423,14 @@ Ext.define('PVE.IPSetGrid', {
        if (me.base_url) {
            me.setBaseUrl(me.base_url); // load
        }
-    }
+    },
 }, function() {
-
     Ext.define('pve-ipset', {
        extend: 'Ext.data.Model',
-       fields: [ { name: 'nomatch', type: 'boolean' },
-                 'cidr', 'comment', 'errors' ],
-       idProperty: 'cidr'
+       fields: [{ name: 'nomatch', type: 'boolean' },
+                 'cidr', 'comment', 'errors'],
+       idProperty: 'cidr',
     });
-
 });
 
 Ext.define('PVE.IPSet', {
@@ -432,6 +439,8 @@ Ext.define('PVE.IPSet', {
 
     title: 'IPSet',
 
+    onlineHelp: 'pve_firewall_ip_sets',
+
     list_refs_url: undefined,
 
     initComponent: function() {
@@ -444,29 +453,28 @@ Ext.define('PVE.IPSet', {
        var ipset_panel = Ext.createWidget('pveIPSetGrid', {
            region: 'center',
            list_refs_url: me.list_refs_url,
-           flex: 0.5,
-           border: false
+           border: false,
        });
 
        var ipset_list = Ext.createWidget('pveIPSetList', {
            region: 'west',
            ipset_panel: ipset_panel,
            base_url: me.base_url,
-           flex: 0.5,
+           width: '50%',
            border: false,
-           split: true
+           split: true,
        });
 
        Ext.apply(me, {
-            layout: 'border',
-            items: [ ipset_list, ipset_panel ],
+           layout: 'border',
+           items: [ipset_list, ipset_panel],
            listeners: {
                show: function() {
                    ipset_list.fireEvent('show', ipset_list);
-               }
-           }
+               },
+           },
        });
 
        me.callParent();
-    }
+    },
 });