]> git.proxmox.com Git - pve-manager.git/blob - www/manager6/ha/GroupEdit.js
update shipped appliance info index
[pve-manager.git] / www / manager6 / ha / GroupEdit.js
1 Ext.define('PVE.ha.GroupInputPanel', {
2 extend: 'Proxmox.panel.InputPanel',
3 onlineHelp: 'ha_manager_groups',
4
5 groupId: undefined,
6
7 onGetValues: function(values) {
8 var me = this;
9
10 if (me.isCreate) {
11 values.type = 'group';
12 }
13
14 return values;
15 },
16
17 initComponent: function() {
18 var me = this;
19
20 let update_nodefield, update_node_selection;
21
22 let sm = Ext.create('Ext.selection.CheckboxModel', {
23 mode: 'SIMPLE',
24 listeners: {
25 selectionchange: function(model, selected) {
26 update_nodefield(selected);
27 },
28 },
29 });
30
31 let store = Ext.create('Ext.data.Store', {
32 fields: ['node', 'mem', 'cpu', 'priority'],
33 data: PVE.data.ResourceStore.getNodes(), // use already cached data to avoid an API call
34 proxy: {
35 type: 'memory',
36 reader: { type: 'json' },
37 },
38 sorters: [
39 {
40 property: 'node',
41 direction: 'ASC',
42 },
43 ],
44 });
45
46 var nodegrid = Ext.createWidget('grid', {
47 store: store,
48 border: true,
49 height: 300,
50 selModel: sm,
51 columns: [
52 {
53 header: gettext('Node'),
54 flex: 1,
55 dataIndex: 'node',
56 },
57 {
58 header: gettext('Memory usage') + " %",
59 renderer: PVE.Utils.render_mem_usage_percent,
60 sortable: true,
61 width: 150,
62 dataIndex: 'mem',
63 },
64 {
65 header: gettext('CPU usage'),
66 renderer: Proxmox.Utils.render_cpu,
67 sortable: true,
68 width: 150,
69 dataIndex: 'cpu',
70 },
71 {
72 header: 'Priority',
73 xtype: 'widgetcolumn',
74 dataIndex: 'priority',
75 sortable: true,
76 stopSelection: true,
77 widget: {
78 xtype: 'proxmoxintegerfield',
79 minValue: 0,
80 maxValue: 1000,
81 isFormField: false,
82 listeners: {
83 change: function(numberfield, value, old_value) {
84 let record = numberfield.getWidgetRecord();
85 record.set('priority', value);
86 update_nodefield(sm.getSelection());
87 record.commit();
88 },
89 },
90 },
91 },
92 ],
93 });
94
95 let nodefield = Ext.create('Ext.form.field.Hidden', {
96 name: 'nodes',
97 value: '',
98 listeners: {
99 change: function(field, value) {
100 update_node_selection(value);
101 },
102 },
103 isValid: function() {
104 let value = this.getValue();
105 return value && value.length !== 0;
106 },
107 });
108
109 update_node_selection = function(string) {
110 sm.deselectAll(true);
111
112 string.split(',').forEach(function(e, idx, array) {
113 let [node, priority] = e.split(':');
114 store.each(function(record) {
115 if (record.get('node') === node) {
116 sm.select(record, true);
117 record.set('priority', priority);
118 record.commit();
119 }
120 });
121 });
122 nodegrid.reconfigure(store);
123 };
124
125 update_nodefield = function(selected) {
126 let nodes = selected
127 .map(({ data }) => data.node + (data.priority ? `:${data.priority}` : ''))
128 .join(',');
129
130 // nodefield change listener calls us again, which results in a
131 // endless recursion, suspend the event temporary to avoid this
132 nodefield.suspendEvent('change');
133 nodefield.setValue(nodes);
134 nodefield.resumeEvent('change');
135 };
136
137 me.column1 = [
138 {
139 xtype: me.isCreate ? 'textfield' : 'displayfield',
140 name: 'group',
141 value: me.groupId || '',
142 fieldLabel: 'ID',
143 vtype: 'StorageId',
144 allowBlank: false,
145 },
146 nodefield,
147 ];
148
149 me.column2 = [
150 {
151 xtype: 'proxmoxcheckbox',
152 name: 'restricted',
153 uncheckedValue: 0,
154 fieldLabel: 'restricted',
155 },
156 {
157 xtype: 'proxmoxcheckbox',
158 name: 'nofailback',
159 uncheckedValue: 0,
160 fieldLabel: 'nofailback',
161 },
162 ];
163
164 me.columnB = [
165 {
166 xtype: 'textfield',
167 name: 'comment',
168 fieldLabel: gettext('Comment'),
169 },
170 nodegrid,
171 ];
172
173 me.callParent();
174 },
175 });
176
177 Ext.define('PVE.ha.GroupEdit', {
178 extend: 'Proxmox.window.Edit',
179
180 groupId: undefined,
181
182 initComponent: function() {
183 var me = this;
184
185 me.isCreate = !me.groupId;
186
187 if (me.isCreate) {
188 me.url = '/api2/extjs/cluster/ha/groups';
189 me.method = 'POST';
190 } else {
191 me.url = '/api2/extjs/cluster/ha/groups/' + me.groupId;
192 me.method = 'PUT';
193 }
194
195 var ipanel = Ext.create('PVE.ha.GroupInputPanel', {
196 isCreate: me.isCreate,
197 groupId: me.groupId,
198 });
199
200 Ext.apply(me, {
201 subject: gettext('HA Group'),
202 items: [ipanel],
203 });
204
205 me.callParent();
206
207 if (!me.isCreate) {
208 me.load({
209 success: function(response, options) {
210 var values = response.result.data;
211
212 ipanel.setValues(values);
213 },
214 });
215 }
216 },
217 });