-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()
+ }
+ },
});