Ext.define('PVE.form.FWMacroSelector', {
- extend: 'PVE.form.ComboGrid',
+ extend: 'Proxmox.form.ComboGrid',
alias: 'widget.pveFWMacroSelector',
-
+ allowBlank: true,
+ autoSelect: false,
+ valueField: 'macro',
+ displayField: 'macro',
+ listConfig: {
+ columns: [
+ {
+ header: gettext('Macro'),
+ dataIndex: 'macro',
+ hideable: false,
+ width: 100
+ },
+ {
+ header: gettext('Description'),
+ renderer: Ext.String.htmlEncode,
+ flex: 1,
+ dataIndex: 'descr'
+ }
+ ]
+ },
initComponent: function() {
var me = this;
fields: [ 'macro', 'descr' ],
idProperty: 'macro',
proxy: {
- type: 'pve',
+ type: 'proxmox',
url: "/api2/json/cluster/firewall/macros"
},
sorters: {
});
Ext.apply(me, {
- store: store,
- allowBlank: true,
- autoSelect: false,
- valueField: 'macro',
- displayField: 'macro',
- listConfig: {
- columns: [
- {
- header: gettext('Macro'),
- dataIndex: 'macro',
- hideable: false,
- width: 100
- },
- {
- header: gettext('Description'),
- flex: 1,
- dataIndex: 'descr'
- }
- ]
- }
+ store: store
});
me.callParent();
});
Ext.define('PVE.FirewallRulePanel', {
- extend: 'PVE.panel.InputPanel',
+ extend: 'Proxmox.panel.InputPanel',
allow_iface: false,
// hack: editable ComboGrid returns nothing when empty, so we need to set ''
// Also, disabled text fields return nothing, so we need to set ''
- Ext.Array.each(['source', 'dest', 'proto', 'sport', 'dport'], function(key) {
+ Ext.Array.each(['source', 'dest', 'macro', 'proto', 'sport', 'dport', 'log'], function(key) {
if (values[key] === undefined) {
values[key] = '';
}
});
delete values.modified_marker;
-
+
return values;
},
me.column1 = [
{
// hack: we use this field to mark the form 'dirty' when the
- // record has errors- so that the user can safe the unmodified
+ // record has errors- so that the user can safe the unmodified
// form again.
xtype: 'hiddenfield',
name: 'modified_marker',
- value: '',
+ value: ''
},
{
- xtype: 'pveKVComboBox',
+ xtype: 'proxmoxKVComboBox',
name: 'type',
value: 'in',
comboItems: [['in', 'in'], ['out', 'out']],
allowBlank: false
},
{
- xtype: 'pveKVComboBox',
+ xtype: 'proxmoxKVComboBox',
name: 'action',
value: 'ACCEPT',
comboItems: [['ACCEPT', 'ACCEPT'], ['DROP', 'DROP'], ['REJECT', 'REJECT']],
if (me.allow_iface) {
me.column1.push({
- xtype: 'pvetextfield',
+ xtype: 'proxmoxtextfield',
name: 'iface',
- deleteEmpty: !me.create,
+ deleteEmpty: !me.isCreate,
value: '',
fieldLabel: gettext('Interface')
});
me.column1.push({
xtype: 'displayfield',
fieldLabel: '',
- height: 22, // hack: set same height as text fields
value: ''
});
}
}
);
-
+
me.column2 = [
{
- xtype: 'pvecheckbox',
+ xtype: 'proxmoxcheckbox',
name: 'enable',
checked: false,
- height: 22, // hack: set same height as text fields
uncheckedValue: 0,
fieldLabel: gettext('Enable')
},
{
xtype: 'pveFWMacroSelector',
name: 'macro',
- value: '',
fieldLabel: gettext('Macro'),
+ editable: true,
allowBlank: true,
listeners: {
change: function(f, value) {
- if (value === '') {
+ if (value === null) {
me.down('field[name=proto]').setDisabled(false);
me.down('field[name=sport]').setDisabled(false);
me.down('field[name=dport]').setDisabled(false);
me.down('field[name=sport]').setDisabled(true);
me.down('field[name=sport]').setValue('');
me.down('field[name=dport]').setDisabled(true);
- me.down('field[name=dport]').setValue('');
+ me.down('field[name=dport]').setValue('');
}
}
}
{
xtype: 'textfield',
name: 'dport',
- height: 22, // hack: set same height as text fields
value: '',
fieldLabel: gettext('Dest. port')
}
];
-
+
+ me.advancedColumn1 = [
+ {
+ xtype: 'pveFirewallLogLevels'
+ }
+ ];
+
me.columnB = [
{
xtype: 'textfield',
});
Ext.define('PVE.FirewallRuleEdit', {
- extend: 'PVE.window.Edit',
+ extend: 'Proxmox.window.Edit',
base_url: undefined,
list_refs_url: undefined,
allow_iface: false,
initComponent : function() {
- /*jslint confusion: true */
+
var me = this;
if (!me.base_url) {
throw "no list_refs_url specified";
}
- me.create = (me.rule_pos === undefined);
+ me.isCreate = (me.rule_pos === undefined);
- if (me.create) {
+ if (me.isCreate) {
me.url = '/api2/extjs' + me.base_url;
me.method = 'POST';
} else {
}
var ipanel = Ext.create('PVE.FirewallRulePanel', {
- create: me.create,
+ isCreate: me.isCreate,
list_refs_url: me.list_refs_url,
allow_iface: me.allow_iface,
rule_pos: me.rule_pos
me.callParent();
- if (!me.create) {
+ if (!me.isCreate) {
me.load({
success: function(response, options) {
var values = response.result.data;
field.setValue(1);
Ext.Function.defer(function() {
var form = ipanel.up('form').getForm();
- form.markInvalid(values.errors)
+ form.markInvalid(values.errors);
}, 100);
}
}
});
+ } else if (me.rec) {
+ ipanel.setValues(me.rec.data);
}
}
});
Ext.define('PVE.FirewallGroupRuleEdit', {
- extend: 'PVE.window.Edit',
+ extend: 'Proxmox.window.Edit',
base_url: undefined,
allow_iface: false,
initComponent : function() {
- /*jslint confusion: true */
+
var me = this;
- me.create = (me.rule_pos === undefined);
+ me.isCreate = (me.rule_pos === undefined);
- if (me.create) {
+ if (me.isCreate) {
me.url = '/api2/extjs' + me.base_url;
me.method = 'POST';
} else {
if (me.allow_iface) {
column1.push({
- xtype: 'pvetextfield',
+ xtype: 'proxmoxtextfield',
name: 'iface',
- deleteEmpty: !me.create,
+ deleteEmpty: !me.isCreate,
value: '',
fieldLabel: gettext('Interface')
});
}
- 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: 'enable',
checked: false,
- height: 22, // hack: set same height as text fields
uncheckedValue: 0,
fieldLabel: gettext('Enable')
}
me.callParent();
- if (!me.create) {
+ if (!me.isCreate) {
me.load({
success: function(response, options) {
var values = response.result.data;
extend: 'Ext.grid.Panel',
alias: 'widget.pveFirewallRules',
+ onlineHelp: 'chapter_pve_firewall',
+
+ stateful: true,
+ stateId: 'grid-firewall-rules',
+
base_url: undefined,
list_refs_url: undefined,
me.store.removeAll();
} else {
me.addBtn.setDisabled(false);
+ me.removeBtn.baseurl = url + '/';
if (me.groupBtn) {
me.groupBtn.setDisabled(false);
}
me.store.setProxy({
- type: 'pve',
+ type: 'proxmox',
url: '/api2/json' + url
});
moveRule: function(from, to) {
var me = this;
- if (!me.base_url) {
+ if (!me.base_url) {
return;
}
- PVE.Utils.API2Request({
+ Proxmox.Utils.API2Request({
url: me.base_url + "/" + from,
method: 'PUT',
params: { moveto: to },
updateRule: function(rule) {
var me = this;
- if (!me.base_url) {
+ if (!me.base_url) {
return;
}
delete rule.pos;
delete rule.errors;
- PVE.Utils.API2Request({
+ Proxmox.Utils.API2Request({
url: me.base_url + '/' + pos.toString(),
method: 'PUT',
params: rule,
});
},
- deleteRule: function(rule) {
- var me = this;
-
- if (!me.base_url) {
- return;
- }
-
- PVE.Utils.API2Request({
- url: me.base_url + '/' + rule.pos.toString() +
- '?digest=' + encodeURIComponent(rule.digest),
- method: 'DELETE',
- waitMsgTarget: me,
- failure: function(response, options) {
- Ext.Msg.alert(gettext('Error'), response.htmlStatus);
- },
- callback: function() {
- me.store.load();
- }
- });
- },
initComponent: function() {
- /*jslint confusion: true */
var me = this;
if (!me.list_refs_url) {
win.on('destroy', reload);
};
- me.editBtn = Ext.create('PVE.button.Button',{
+ me.editBtn = Ext.create('Proxmox.button.Button',{
text: gettext('Edit'),
disabled: true,
selModel: sm,
}
});
+ var run_copy_editor = function() {
+ var rec = sm.getSelection()[0];
+
+ if (!rec) {
+ return;
+ }
+ var type = rec.data.type;
+
+
+ if (!(type === 'in' || type === 'out')) {
+ return;
+ }
+
+ var win = Ext.create('PVE.FirewallRuleEdit', {
+ allow_iface: me.allow_iface,
+ base_url: me.base_url,
+ list_refs_url: me.list_refs_url,
+ rec: rec
+ });
+
+ win.show();
+ win.on('destroy', reload);
+ };
+
+ me.copyBtn = Ext.create('Proxmox.button.Button',{
+ text: gettext('Copy'),
+ selModel: sm,
+ enableFn: function(rec) {
+ return (rec.data.type === 'in' || rec.data.type === 'out');
+ },
+ disabled: true,
+ handler: run_copy_editor
+ });
+
if (me.allow_groups) {
me.groupBtn = Ext.create('Ext.Button', {
- text: gettext('Insert') + ': ' +
+ text: gettext('Insert') + ': ' +
gettext('Security Group'),
disabled: true,
handler: function() {
});
}
- me.removeBtn = Ext.create('PVE.button.Button',{
- text: gettext('Remove'),
+ me.removeBtn = Ext.create('Proxmox.button.StdRemoveButton',{
selModel: sm,
- disabled: true,
- handler: function() {
- var rec = sm.getSelection()[0];
- if (!rec) {
- return;
- }
- me.deleteRule(rec.data);
+ baseurl: me.base_url + '/',
+ confirmMsg: false,
+ getRecordName: function(rec) {
+ var rule = rec.data;
+ return rule.pos.toString() +
+ '?digest=' + encodeURIComponent(rule.digest);
+ },
+ callback: function() {
+ me.store.load();
}
});
var tbar = me.tbar_prefix ? [ me.tbar_prefix ] : [];
- tbar.push(me.addBtn);
+ tbar.push(me.addBtn, me.copyBtn);
if (me.groupBtn) {
tbar.push(me.groupBtn);
}
var render_errors = function(name, value, metaData, record) {
var errors = record.data.errors;
if (errors && errors[name]) {
- metaData.tdCls = 'x-form-invalid-field';
+ metaData.tdCls = 'proxmox-invalid-row';
var html = '<p>' + Ext.htmlEncode(errors[name]) + '</p>';
- metaData.tdAttr = 'data-qwidth=600 data-qtitle="ERROR" data-qtip="' +
+ metaData.tdAttr = 'data-qwidth=600 data-qtitle="ERROR" data-qtip="' +
html.replace(/\"/g,'"') + '"';
}
return value;
// similar to xtype: 'rownumberer',
dataIndex: 'pos',
resizable: false,
- width: 23,
+ width: 42,
sortable: false,
align: 'right',
hideable: false,
},
width: 100
},
+ {
+ header: gettext('Log level'),
+ dataIndex: 'log',
+ renderer: function(value, metaData, record) {
+ return render_errors('log', value, metaData, record);
+ },
+ width: 100
+ },
{
header: gettext('Comment'),
dataIndex: 'comment',