Ext.define('pmg-address-list', { extend: 'Ext.data.Model', fields: ['address'], idProperty: 'address', }); // base class - do not use directly Ext.define('PMG.UserBlackWhiteList', { extend: 'Ext.grid.GridPanel', border: false, listname: undefined, // 'blacklist' or 'whitelist', selModel: 'checkboxmodel', emptyText: gettext('No data in database'), controller: { xclass: 'Ext.app.ViewController', onAddAddress: function() { let view = this.getView(); let params = view.getStore().getProxy().getExtraParams() || {}; let url = '/quarantine/' + view.listname; let items = [{ xtype: 'proxmoxtextfield', name: 'address', minLength: 3, regex: /^[^,;\s]*$/, // no whitespace no , and no ; fieldLabel: gettext("Address"), }]; Ext.Object.each(params, function(key, value) { items.push({ xtype: 'hidden', name: key, value: value, }); }); let config = { method: 'POST', url: url, onlineHelp: 'pmg_userblackwhitelist', isCreate: true, isAdd: true, items: items, }; if (view.listname === 'blacklist') { config.subject = gettext("Blacklist"); } else if (view.listname === 'whitelist') { config.subject = gettext("Whitelist"); } else { throw "unknown list - internal error"; } let win = Ext.createWidget('proxmoxWindowEdit', config); win.on('destroy', function() { view.store.load(); }); win.show(); }, onRemoveAddress: function() { let view = this.getView(); let records = view.selModel.getSelection(); if (records.length < 1) { return; } let url = '/quarantine/' + view.listname + '/'; let params = { address: records.map((rec) => rec.getId()).join(','), }; Ext.applyIf(params, view.getStore().getProxy().getExtraParams()); Proxmox.Utils.API2Request({ url: url + '?' + Ext.Object.toQueryString(params), method: 'DELETE', waitMsgTarget: view, callback: function(options, success, response) { view.store.load(); }, failure: function(response, opts) { Ext.Msg.alert(gettext('Error'), response.htmlStatus); }, }); }, changeEmail: function(combobox, value) { let view = this.getView(); if (value && combobox.isValid()) { view.getStore().getProxy().setExtraParams({ pmail: value, }); view.getStore().load(); } }, init: function(view) { let emailcb = this.lookupReference('email'); if (PMG.view === 'quarantineview') { emailcb.setVisible(false); view.getStore().load(); } else { emailcb.getStore().getProxy().setExtraParams({ list: view.listname === 'blacklist' ? 'BL' : 'WL', }); } Proxmox.Utils.monStoreErrors(view.getView(), view.getStore(), true); }, control: { 'combobox': { change: { fn: 'changeEmail', buffer: 500, }, }, }, }, tbar: [ { xtype: 'combobox', displayField: 'mail', vtype: 'email', allowBlank: false, valueField: 'mail', store: { proxy: { type: 'proxmox', url: '/api2/json/quarantine/quarusers', }, fields: [ { name: 'mail', renderer: Ext.htmlEncode, }, ], }, queryParam: false, queryCaching: false, editable: true, reference: 'email', name: 'email', listConfig: { emptyText: '
' + gettext('No data in database') + '
', }, fieldLabel: 'E-Mail', }, { text: gettext('Add'), handler: 'onAddAddress', }, { xtype: 'proxmoxButton', text: gettext('Remove'), disabled: true, handler: 'onRemoveAddress', confirmMsg: function() { let view = this.up('gridpanel'); let selection = view.selModel.getSelection(); let text, param; if (selection.length > 1) { text = gettext('Are you sure you want to remove {0} entries'); param = selection.length.toString(); } else if (selection.length > 0) { let rec = selection[0]; let name = rec.getId(); text = gettext('Are you sure you want to remove entry {0}'); param = "'" + Ext.String.htmlEncode(name) + "'"; } if (text && param) { return Ext.String.format(text, param); } return false; }, }, ], columns: [ { header: gettext('Address'), dataIndex: 'address', renderer: Ext.String.htmlEncode, flex: 1, }, ], }); Ext.define('PMG.UserBlacklist', { extend: 'PMG.UserBlackWhiteList', xtype: 'pmgUserBlacklist', title: gettext('Blacklist'), listname: 'blacklist', store: { model: 'pmg-address-list', autoDestroy: true, proxy: { type: 'proxmox', url: "/api2/json/quarantine/blacklist", }, sorters: { property: 'address', }, }, dockedItems: [ { dock: 'top', bodyStyle: { padding: '10px', 'border-left': '0px', 'border-right': '0px', }, html: gettext('With this feature, you can manually mark E-mails from certain domains or addresses as spam.') + `

*.com (all mails from .com domains)
*@example.com (all mails from domain example.com)
john@example.com (all mails from john@example.com)`, }, ], }); Ext.define('PMG.UserWhitelist', { extend: 'PMG.UserBlackWhiteList', xtype: 'pmgUserWhitelist', title: gettext('Whitelist'), listname: 'whitelist', store: { model: 'pmg-address-list', autoDestroy: true, proxy: { type: 'proxmox', url: "/api2/json/quarantine/whitelist", }, sorters: { property: 'address', }, }, dockedItems: [ { dock: 'top', bodyStyle: { padding: '10px', 'border-left': '0px', 'border-right': '0px', }, html: gettext('With this feature, you can manually bypass spam checking for certain domains or E-mail addresses.') + `

*.com (all mails from .com domains)
*@example.com (all mails from domain example.com)
john@example.com (all mails from john@example.com)`, }, ], });