JSSRC= \
Utils.js \
form/FilterField.js \
+ form/MatchModeSelector.js \
FilterProxy.js \
LoginView.js \
RoleSelector.js \
showDirection: false, // only important for SMTP Whitelist
ogdata: undefined,
+ objectClass: undefined,
emptyText: gettext('Please select an object.'),
setObjectInfo: function(ogdata) {
let me = this;
+ let mode = ogdata?.invert ? 'not' : '';
+ mode += ogdata?.and ? 'all' : 'any';
+
me.ogdata = ogdata;
if (me.ogdata === undefined) {
me.down('#oginfo').update(me.emptyText);
+ me.down('#modeBox').setHidden(true);
+ me.down('#whatWarning').setHidden(true);
} else {
let html = '<b>' + Ext.String.htmlEncode(me.ogdata.name) + '</b>';
html += "<br><br>";
me.down('#oginfo').update(html);
me.down('#ogdata').setHidden(false);
+ let modeSelector = me.down('#modeSelector');
+ modeSelector.suspendEvents();
+ me.down('#modeSelector').setValue(mode);
+ modeSelector.resumeEvents();
+ me.down('#modeBox').setHidden(false);
+ me.down('#whatWarning').setHidden(me.objectClass !== 'what' || mode === 'any');
}
},
me.dockedItems.push({
dock: 'top',
border: 1,
- layout: 'anchor',
+ layout: 'hbox',
hidden: !!me.hideGroupInfo,
itemId: 'ogdata',
items: [
+ {
+ xtype: 'container',
+ itemId: 'modeBox',
+ hidden: true,
+ width: 220,
+ padding: 10,
+ layout: {
+ type: 'vbox',
+ align: 'stretch',
+ },
+ items: [
+ {
+ xtype: 'box',
+ html: `<b>${gettext("Match if")}</b>`,
+ },
+ {
+ xtype: 'pmgMatchModeSelector',
+ itemId: 'modeSelector',
+ padding: '10 0 0 0',
+ listeners: {
+ change: function(_field, value) {
+ let invert = value.startsWith('not') ? 1 : 0;
+ let and = value.endsWith('all') ? 1 : 0;
+
+ Proxmox.Utils.API2Request({
+ url: `${me.baseurl}/config`,
+ method: 'PUT',
+ params: {
+ and,
+ invert,
+ },
+ success: () => me.fireEvent('modeUpdate', me),
+ });
+ },
+ },
+ },
+ ],
+ },
{
xtype: 'component',
- anchor: '100%',
+ flex: 1,
itemId: 'oginfo',
style: { 'white-space': 'pre' },
padding: 10,
],
});
+ me.dockedItems.push({
+ dock: 'top',
+ border: 1,
+ hidden: true,
+ itemId: 'whatWarning',
+ bodyPadding: 5,
+ items: {
+ xtype: 'displayfield',
+ margin: 0,
+ value: gettext("Caution: 'What Objects' match each mail part separately, so be careful with any option besides 'Any matches'."),
+ userCls: 'pmx-hint',
+ },
+ });
+
Proxmox.Utils.monStoreErrors(me, me.store, true);
Ext.apply(me, {
var right = Ext.create('PMG.ObjectGroup', {
otype_list: me.otype_list,
+ objectClass: me.ogclass,
border: false,
region: 'center',
listeners: {
left.run_editor();
}
},
+ modeUpdate: () => left.reload(),
},
});
name: oc,
oclass: oc,
type: true,
+ invert: ruledata[`${oc}-invert`],
+ and: ruledata[`${oc}-and`],
leaf: false,
expanded: true,
expandable: false,
return true;
},
+ updateMode: function(field, value) {
+ let me = this;
+ let vm = me.getViewModel();
+ let oclass = field.getWidgetRecord().data.oclass;
+
+ let params = {};
+ params[`${oclass}-invert`] = value.startsWith('not') ? 1 : 0;
+ params[`${oclass}-and`] = value.endsWith('all') ? 1 : 0;
+
+ Proxmox.Utils.API2Request({
+ url: `${vm.get('baseurl')}/config`,
+ method: 'PUT',
+ params,
+ success: () => me.reload(),
+ });
+ },
+
control: {
'treepanel[reference=usedobjects]': {
drop: 'addDrop',
'tabpanel[reference=availobjects] > grid': {
drop: 'removeDrop',
},
+ 'pmgMatchModeSelector': {
+ change: 'updateMode',
+ },
},
},
},
flex: 1,
},
+ {
+ header: gettext('Match if'),
+ xtype: 'widgetcolumn',
+ width: 200,
+ widget: {
+ xtype: 'pmgMatchModeSelector',
+ },
+ onWidgetAttach: function(col, widget, rec) {
+ if (rec.data.type && rec.data.oclass !== 'action') {
+ let mode = rec.data.invert ? 'not' : '';
+ mode += rec.data.and ? 'all' : 'any';
+ widget.suspendEvents();
+ widget.setValue(mode);
+ widget.resumeEvents();
+ widget.setHidden(false);
+ } else {
+ widget.setHidden(true);
+ }
+ },
+ },
{
text: '',
xtype: 'actioncolumn',
--- /dev/null
+Ext.define('PMG.MatchModeSelector', {
+ extend: 'Proxmox.form.KVComboBox',
+ alias: 'widget.pmgMatchModeSelector',
+
+ comboItems: [
+ ['all', gettext('All match')],
+ ['any', gettext('Any matches')],
+ ['notall', gettext('At least one does not match')],
+ ['notany', gettext('None matches')],
+ ],
+});