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