mirror of
https://git.proxmox.com/git/pve-manager
synced 2025-06-02 16:57:17 +00:00

the intial value of the node selector is null, but when the store is loaded, it becomes an empty array this triggers the 'dirtychanged' event and causes the edit windows to enable the OK/Submit Button, even when no change is made this fix sets the default value to an empty array, which fixes the mentioned behaviour Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
102 lines
2.2 KiB
JavaScript
102 lines
2.2 KiB
JavaScript
Ext.define('PVE.form.NodeSelector', {
|
|
extend: 'PVE.form.ComboGrid',
|
|
alias: ['widget.pveNodeSelector'],
|
|
|
|
// invalidate nodes which are offline
|
|
onlineValidator: false,
|
|
|
|
selectCurNode: false,
|
|
|
|
// only allow those nodes (array)
|
|
allowedNodes: undefined,
|
|
// set default value to empty array, else it inits it with
|
|
// null and after the store load it is an empty array,
|
|
// triggering dirtychange
|
|
value: [],
|
|
valueField: 'node',
|
|
displayField: 'node',
|
|
store: {
|
|
fields: [ 'node', 'cpu', 'maxcpu', 'mem', 'maxmem', 'uptime' ],
|
|
proxy: {
|
|
type: 'pve',
|
|
url: '/api2/json/nodes'
|
|
},
|
|
sorters: [
|
|
{
|
|
property : 'node',
|
|
direction: 'ASC'
|
|
},
|
|
{
|
|
property : 'mem',
|
|
direction: 'DESC'
|
|
}
|
|
]
|
|
},
|
|
|
|
listConfig: {
|
|
columns: [
|
|
{
|
|
header: gettext('Node'),
|
|
dataIndex: 'node',
|
|
sortable: true,
|
|
hideable: false,
|
|
flex: 1
|
|
},
|
|
{
|
|
header: gettext('Memory usage'),
|
|
renderer: PVE.Utils.render_mem_usage,
|
|
sortable: true,
|
|
width: 100,
|
|
dataIndex: 'mem'
|
|
},
|
|
{
|
|
header: gettext('CPU usage'),
|
|
renderer: PVE.Utils.render_cpu,
|
|
sortable: true,
|
|
width: 100,
|
|
dataIndex: 'cpu'
|
|
}
|
|
],
|
|
},
|
|
|
|
validator: function(value) {
|
|
/*jslint confusion: true */
|
|
var me = this;
|
|
if (!me.onlineValidator || (me.allowBlank && !value)) {
|
|
return true;
|
|
}
|
|
|
|
var offline = [];
|
|
var notAllowed = [];
|
|
|
|
Ext.Array.each(value.split(/\s*,\s*/), function(node) {
|
|
var rec = me.store.findRecord(me.valueField, node);
|
|
if (!(rec && rec.data) || !Ext.isNumeric(rec.data.mem)) {
|
|
offline.push(node);
|
|
} else if (me.allowedNodes && !Ext.Array.contains(me.allowedNodes, node)) {
|
|
notAllowed.push(node);
|
|
}
|
|
});
|
|
|
|
if (notAllowed.length !== 0) {
|
|
return "Node " + notAllowed.join(', ') + " is not allowed for this action!";
|
|
}
|
|
|
|
if (offline.length !== 0) {
|
|
return "Node " + offline.join(', ') + " seems to be offline!";
|
|
}
|
|
return true;
|
|
},
|
|
|
|
initComponent: function() {
|
|
var me = this;
|
|
|
|
if (me.selectCurNode && PVE.curSelectedNode.data.node) {
|
|
me.preferredValue = PVE.curSelectedNode.data.node;
|
|
}
|
|
|
|
me.callParent();
|
|
me.getStore().load();
|
|
}
|
|
});
|