mirror of
https://git.proxmox.com/git/pmg-gui
synced 2025-08-13 11:40:24 +00:00

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>
263 lines
5.2 KiB
JavaScript
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,
|
|
},
|
|
],
|
|
});
|