pmg-gui/js/RuleConfiguration.js
Leo Nunner df2a647a72 mail filter: properly html-encode rule names
Rule names were not HTML-encoded in the rule overview. While some
encoding did happen, it was only on the first load for the info panel
on the right hand side, which was overriden as soon as the edit
window was opened/closed again.

The variable binding now gets HTML-encoded automatically, and the
renderer for rule names has been set to Ext.htmlEncode.

Signed-off-by: Leo Nunner <l.nunner@proxmox.com>
 [ T: rework commit message a bit (mostly subject) ]
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
2023-05-17 12:01:35 +02:00

263 lines
5.2 KiB
JavaScript

Ext.define('pmg-rule-list', {
extend: 'Ext.data.Model',
fields: [
'id', 'name',
{ name: 'active', type: 'boolean' },
{ name: 'direction', type: 'integer' },
{ name: 'priority', type: 'integer' },
],
idProperty: 'id',
});
Ext.define('PMG.RulesConfiguration', {
extend: 'Ext.container.Container',
xtype: 'pmgRuleConfiguration',
layout: 'border',
border: false,
defaults: {
border: false,
},
controller: {
xclass: 'Ext.app.ViewController',
selectedRuleChange: function(grid, selected, eOpts) {
let me = this;
let infoPanel = me.lookupReference('infopanel');
let baseurl = '';
if (selected.length > 0) {
baseurl = `/config/ruledb/rules/${selected[0].data.id}`;
}
infoPanel.getController().setBaseUrl(baseurl);
},
editIconClick: function(gridView, rowindex, colindex, column, e, record) {
let me = this;
me.showEditWindow(gridView, record);
},
showEditWindow: function(gridView, record) {
let me = this;
let win = Ext.create('PMG.RuleEditor', {
url: `/api2/extjs/config/ruledb/rules/${record.data.id}/config`,
listeners: {
destroy: function() {
gridView.getStore().load();
},
},
});
win.load();
win.show();
},
toggleIconClick: function(gridView, rowindex, colindex, column, e, record) {
let me = this;
Proxmox.Utils.API2Request({
url: `/config/ruledb/rules/${record.data.id}/config`,
params: {
active: record.data.active ? 0 : 1,
},
method: 'PUT',
callback: function() {
gridView.getStore().load();
},
failure: function(response, opts) {
Ext.Msg.alert(gettext('Error'), response.htmlStatus);
},
});
},
reload: function() {
let me = this;
me.lookupReference('rulegrid').getStore().load();
},
addRule: function() {
let me = this;
let win = Ext.create('PMG.RuleEditor', {
url: '/api2/extjs/config/ruledb/rules/',
method: 'POST',
isCreate: true,
listeners: {
destroy: function() {
me.lookupReference('rulegrid').getStore().load();
},
},
});
win.load();
win.show();
},
onFactoryDefaults: function() {
let me = this;
Ext.Msg.confirm(
gettext('Confirm'),
gettext('Reset rule database to factory defaults?'),
function(button) {
if (button !== 'yes') {
return;
}
Proxmox.Utils.API2Request({
url: '/config/ruledb',
method: 'POST',
waitMsgTarget: me.getView(),
callback: function() {
me.reload();
},
failure: function(response, opts) {
Ext.Msg.alert(gettext('Error'), response.htmlStatus);
},
});
},
);
},
init: function(view) {
let grid = this.lookupReference('rulegrid');
Proxmox.Utils.monStoreErrors(grid, grid.getStore(), true);
},
control: {
'grid[reference=rulegrid]': {
itemdblclick: 'showEditWindow',
selectionchange: 'selectedRuleChange',
},
'button[reference=addButton]': {
click: 'addRule',
},
},
},
viewModel: {
data: {
selectedRule: undefined,
baseUrl: '/config/ruledb/rules',
},
},
items: [
{
xtype: 'grid',
layout: 'fit',
title: 'Rules',
reference: 'rulegrid',
region: 'center',
bind: {
selection: '{selectedRule}',
},
dockedItems: {
xtype: 'toolbar',
reference: 'mytb',
items: [
{
xtype: 'button',
text: gettext('Add'),
iconCls: 'fa fa-plus-circle',
reference: 'addButton',
},
{
xtype: 'proxmoxStdRemoveButton',
text: gettext('Remove'),
iconCls: 'fa fa-minus-circle',
reference: 'removeButton',
callback: 'reload',
getRecordName: function(rec) { return rec.data.name; },
bind: {
baseurl: '{baseUrl}',
},
},
'->',
{
text: gettext('Factory Defaults'),
handler: 'onFactoryDefaults',
},
],
},
viewConfig: {
getRowClass: function(record, rowIndex) {
return record.get('active') ? 'enabled' : 'disabled';
},
},
store: {
autoLoad: true,
model: 'pmg-rule-list',
reference: 'rulesStore',
proxy: {
type: 'proxmox',
url: '/api2/json/config/ruledb/rules',
},
sorters: [
{
property: 'priority',
direction: 'DESC',
},
{
property: 'name',
},
],
},
sortableColumns: false,
columns: [
{
text: 'Active',
dataIndex: 'active',
hidden: true,
},
{
text: 'Name',
dataIndex: 'name',
flex: 1,
renderer: Ext.htmlEncode,
},
{
text: 'Priority',
dataIndex: 'priority',
},
{
text: 'Direction',
dataIndex: 'direction',
renderer: PMG.Utils.format_rule_direction,
},
{
text: '',
xtype: 'actioncolumn',
align: 'center',
width: 70,
items: [
{
iconCls: 'fa fa-fw fa-pencil',
tooltip: 'Edit',
handler: 'editIconClick',
},
{
getClass: function(val, meta, rec) {
return 'fa fa-fw fa-' + (rec.get('active') ? 'toggle-on' : 'toggle-off');
},
getTip: function(val, meta, rec) {
return rec.get('active') ? 'Deactivate' : 'Activate';
},
handler: 'toggleIconClick',
},
],
},
],
},
{
region: 'east',
reference: 'infopanel',
xtype: 'pmgRuleInfo',
split: true,
width: 440,
},
],
});