]> git.proxmox.com Git - pve-manager.git/blame - www/manager6/form/NodeSelector.js
ui: eslint: enforce "no-extra-parens" rule
[pve-manager.git] / www / manager6 / form / NodeSelector.js
CommitLineData
0af13848 1Ext.define('PVE.form.NodeSelector', {
0fc95a12 2 extend: 'Proxmox.form.ComboGrid',
d46faa2c 3 alias: ['widget.pveNodeSelector'],
0af13848
DM
4
5 // invalidate nodes which are offline
6 onlineValidator: false,
7
8 selectCurNode: false,
9
97ec0d07
TL
10 // do not allow those nodes (array)
11 disallowedNodes: undefined,
12
0af13848
DM
13 // only allow those nodes (array)
14 allowedNodes: undefined,
fbf6e7b4
DC
15 // set default value to empty array, else it inits it with
16 // null and after the store load it is an empty array,
17 // triggering dirtychange
18 value: [],
9ccd656a
EK
19 valueField: 'node',
20 displayField: 'node',
21 store: {
8058410f 22 fields: ['node', 'cpu', 'maxcpu', 'mem', 'maxmem', 'uptime'],
0af13848 23 proxy: {
56a353b9 24 type: 'proxmox',
f6710aac 25 url: '/api2/json/nodes',
0af13848
DM
26 },
27 sorters: [
28 {
8058410f 29 property: 'node',
f6710aac 30 direction: 'ASC',
0af13848
DM
31 },
32 {
8058410f 33 property: 'mem',
f6710aac
TL
34 direction: 'DESC',
35 },
36 ],
9ccd656a 37 },
0af13848 38
9ccd656a
EK
39 listConfig: {
40 columns: [
41 {
42 header: gettext('Node'),
43 dataIndex: 'node',
44 sortable: true,
45 hideable: false,
f6710aac 46 flex: 1,
0af13848 47 },
9ccd656a 48 {
728f1b97
DC
49 header: gettext('Memory usage') + " %",
50 renderer: PVE.Utils.render_mem_usage_percent,
9ccd656a
EK
51 sortable: true,
52 width: 100,
f6710aac 53 dataIndex: 'mem',
9ccd656a
EK
54 },
55 {
56 header: gettext('CPU usage'),
57 renderer: PVE.Utils.render_cpu,
58 sortable: true,
59 width: 100,
f6710aac
TL
60 dataIndex: 'cpu',
61 },
62 ],
9ccd656a 63 },
0af13848 64
9ccd656a 65 validator: function(value) {
9ccd656a 66 var me = this;
53e3ea84 67 if (!me.onlineValidator || me.allowBlank && !value) {
9ccd656a
EK
68 return true;
69 }
0af13848 70
9ccd656a
EK
71 var offline = [];
72 var notAllowed = [];
0af13848 73
9ccd656a 74 Ext.Array.each(value.split(/\s*,\s*/), function(node) {
8267aa63 75 var rec = me.store.findRecord(me.valueField, node, 0, false, true, true);
c0d4a151 76 if (!(rec && rec.data) || rec.data.status !== 'online') {
9ccd656a
EK
77 offline.push(node);
78 } else if (me.allowedNodes && !Ext.Array.contains(me.allowedNodes, node)) {
79 notAllowed.push(node);
0af13848
DM
80 }
81 });
82
7c115076 83 if (value && notAllowed.length !== 0) {
9ccd656a
EK
84 return "Node " + notAllowed.join(', ') + " is not allowed for this action!";
85 }
86
7c115076 87 if (value && offline.length !== 0) {
9ccd656a
EK
88 return "Node " + offline.join(', ') + " seems to be offline!";
89 }
90 return true;
91 },
92
93 initComponent: function() {
94 var me = this;
95
134b4017 96 if (me.selectCurNode && PVE.curSelectedNode && PVE.curSelectedNode.data.node) {
0af13848
DM
97 me.preferredValue = PVE.curSelectedNode.data.node;
98 }
99
100 me.callParent();
9ccd656a 101 me.getStore().load();
97ec0d07
TL
102
103 // filter out disallowed nodes
104 me.getStore().addFilter(new Ext.util.Filter({
105 filterFn: function(item) {
ce57c4a6
DC
106 if (Ext.isArray(me.disallowedNodes)) {
107 return !Ext.Array.contains(me.disallowedNodes, item.data.node);
108 } else {
109 return true;
110 }
f6710aac 111 },
97ec0d07
TL
112 }));
113
8058410f 114 me.mon(me.getStore(), 'load', function() {
e4ad4e06
DC
115 me.isValid();
116 });
f6710aac 117 },
0af13848 118});