]> git.proxmox.com Git - pve-manager.git/blob - www/manager6/form/NodeSelector.js
ui: ScheduleSimulator: split date and time into two columns
[pve-manager.git] / www / manager6 / form / NodeSelector.js
1 Ext.define('PVE.form.NodeSelector', {
2 extend: 'Proxmox.form.ComboGrid',
3 alias: ['widget.pveNodeSelector'],
4
5 // invalidate nodes which are offline
6 onlineValidator: false,
7
8 selectCurNode: false,
9
10 // do not allow those nodes (array)
11 disallowedNodes: undefined,
12
13 // only allow those nodes (array)
14 allowedNodes: undefined,
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: [],
19 valueField: 'node',
20 displayField: 'node',
21 store: {
22 fields: ['node', 'cpu', 'maxcpu', 'mem', 'maxmem', 'uptime'],
23 proxy: {
24 type: 'proxmox',
25 url: '/api2/json/nodes',
26 },
27 sorters: [
28 {
29 property: 'node',
30 direction: 'ASC',
31 },
32 {
33 property: 'mem',
34 direction: 'DESC',
35 },
36 ],
37 },
38
39 listConfig: {
40 columns: [
41 {
42 header: gettext('Node'),
43 dataIndex: 'node',
44 sortable: true,
45 hideable: false,
46 flex: 1,
47 },
48 {
49 header: gettext('Memory usage') + " %",
50 renderer: PVE.Utils.render_mem_usage_percent,
51 sortable: true,
52 width: 100,
53 dataIndex: 'mem',
54 },
55 {
56 header: gettext('CPU usage'),
57 renderer: Proxmox.Utils.render_cpu,
58 sortable: true,
59 width: 100,
60 dataIndex: 'cpu',
61 },
62 ],
63 },
64
65 validator: function(value) {
66 let me = this;
67 if (!me.onlineValidator || (me.allowBlank && !value)) {
68 return true;
69 }
70
71 let offline = [], notAllowed = [];
72 Ext.Array.each(value.split(/\s*,\s*/), function(node) {
73 let rec = me.store.findRecord(me.valueField, node, 0, false, true, true);
74 if (!(rec && rec.data) || rec.data.status !== 'online') {
75 offline.push(node);
76 } else if (me.allowedNodes && !Ext.Array.contains(me.allowedNodes, node)) {
77 notAllowed.push(node);
78 }
79 });
80
81 if (value && notAllowed.length !== 0) {
82 return "Node " + notAllowed.join(', ') + " is not allowed for this action!";
83 }
84 if (value && offline.length !== 0) {
85 return "Node " + offline.join(', ') + " seems to be offline!";
86 }
87 return true;
88 },
89
90 initComponent: function() {
91 var me = this;
92
93 if (me.selectCurNode && PVE.curSelectedNode && PVE.curSelectedNode.data.node) {
94 me.preferredValue = PVE.curSelectedNode.data.node;
95 }
96
97 me.callParent();
98 me.getStore().load();
99
100 me.getStore().addFilter(new Ext.util.Filter({ // filter out disallowed nodes
101 filterFn: (item) => !(me.disallowedNodes && me.disallowedNodes.includes(item.data.node)),
102 }));
103
104 me.mon(me.getStore(), 'load', () => me.isValid());
105 },
106 });