]> git.proxmox.com Git - pve-manager.git/blame - www/manager6/form/VMSelector.js
ui: tfa selector code/spelling nit fix
[pve-manager.git] / www / manager6 / form / VMSelector.js
CommitLineData
42aff488
DC
1/*jslint confusion: true*/
2/* filter is a javascript builtin, but extjs calls it also filter */
3Ext.define('PVE.form.VMSelector', {
4 extend: 'Ext.grid.Panel',
5 alias: 'widget.vmselector',
6
7 mixins: {
8 field: 'Ext.form.field.Field'
9 },
10
11 allowBlank: true,
12 selectAll: false,
13 isFormField: true,
14
15 plugins: 'gridfilters',
16
17 store: {
18 model: 'PVEResources',
19 autoLoad: true,
20 sorters: 'vmid',
21 filters: [{
22 property: 'type',
23 value: /lxc|qemu/
24 }]
25 },
26 columns: [
27 {
28 header: 'ID',
29 dataIndex: 'vmid',
30 width: 80,
31 filter: {
32 type: 'number'
33 }
34 },
35 {
36 header: gettext('Node'),
37 dataIndex: 'node'
38 },
39 {
40 header: gettext('Status'),
41 dataIndex: 'status',
42 filter: {
43 type: 'list'
44 }
45 },
46 {
47 header: gettext('Name'),
48 dataIndex: 'name',
49 flex: 1,
50 filter: {
51 type: 'string'
52 }
53 },
54 {
55 header: gettext('Pool'),
56 dataIndex: 'pool',
57 filter: {
58 type: 'list'
59 }
60 },
61 {
62 header: gettext('Type'),
63 dataIndex: 'type',
64 width: 120,
65 renderer: function(value) {
66 if (value === 'qemu') {
67 return gettext('Virtual Machine');
68 } else if (value === 'lxc') {
69 return gettext('LXC Container');
70 }
71
72 return '';
73 },
74 filter: {
75 type: 'list',
76 store: {
77 data: [
78 {id: 'qemu', text: gettext('Virtual Machine')},
79 {id: 'lxc', text: gettext('LXC Container')}
80 ],
81 // due to EXTJS-18711
82 // we have to do a static list via a store
83 // but to avoid creating an object,
84 // we have to have a pseudo un function
85 un: function(){}
86 }
87 }
c9329af1
TL
88 },
89 {
90 header: 'HA ' + gettext('Status'),
91 dataIndex: 'hastate',
92 flex: 1,
93 filter: {
94 type: 'list'
95 }
42aff488
DC
96 }
97 ],
98
99 selModel: {
100 selType: 'checkboxmodel',
afc84579 101 mode: 'SIMPLE'
42aff488
DC
102 },
103
104 checkChangeEvents: [
105 'selectionchange',
106 'change'
107 ],
108
109 listeners: {
110 selectionchange: function() {
111 // to trigger validity and error checks
112 this.checkChange();
113 }
114 },
115
116 getValue: function() {
117 var me = this;
118 var sm = me.getSelectionModel();
119 var selection = sm.getSelection();
120 var values = [];
121 var store = me.getStore();
122 selection.forEach(function(item) {
123 // only add if not filtered
124 if (store.findExact('vmid', item.data.vmid) !== -1) {
125 values.push(item.data.vmid);
126 }
127 });
128 return values;
129 },
130
131 setValue: function(value) {
132 console.log(value);
133 var me = this;
134 var sm = me.getSelectionModel();
135 if (!Ext.isArray(value)) {
136 value = value.split(',');
137 }
138 var selection = [];
139 var store = me.getStore();
140
141 value.forEach(function(item) {
142 var rec = store.findRecord('vmid',item, 0, false, true, true);
143 console.log(store);
144
145 if (rec) {
146 console.log(rec);
147 selection.push(rec);
148 }
149 });
150
151 sm.select(selection);
152
153 return me.mixins.field.setValue.call(me, value);
154 },
155
156 getErrors: function(value) {
157 var me = this;
158 if (me.allowBlank === false &&
159 me.getSelectionModel().getCount() === 0) {
160 me.addBodyCls(['x-form-trigger-wrap-default','x-form-trigger-wrap-invalid']);
161 return [gettext('No VM selected')];
162 }
163
164 me.removeBodyCls(['x-form-trigger-wrap-default','x-form-trigger-wrap-invalid']);
165 return [];
166 },
167
168 initComponent: function() {
169 var me = this;
170
171 me.callParent();
172
173 if (me.nodename) {
174 me.store.filters.add({
175 property: 'node',
5c6b8a65 176 exactMatch: true,
42aff488
DC
177 value: me.nodename
178 });
179 }
180
eb882c6f
DC
181 // only show the relevant guests by default
182 if (me.action) {
919ae0f7 183 var statusfilter = '';
eb882c6f
DC
184 switch (me.action) {
185 case 'startall':
919ae0f7 186 statusfilter = 'stopped';
eb882c6f
DC
187 break;
188 case 'stopall':
919ae0f7 189 statusfilter = 'running';
eb882c6f
DC
190 break;
191 }
919ae0f7
DC
192 if (statusfilter !== '') {
193 me.store.filters.add({
194 property: 'template',
195 value: 0
196 },{
197 id: 'x-gridfilter-status',
198 operator: 'in',
199 property: 'status',
200 value: [statusfilter]
201 });
202 }
eb882c6f
DC
203 }
204
42aff488
DC
205 var store = me.getStore();
206 var sm = me.getSelectionModel();
207
208 if (me.selectAll) {
209 me.mon(store,'load', function(){
210 me.getSelectionModel().selectAll(false);
211 });
212 }
213 }
214});
a86b4daf
TL
215
216
217Ext.define('PVE.form.VMComboSelector', {
0fc95a12 218 extend: 'Proxmox.form.ComboGrid',
a86b4daf
TL
219 alias: 'widget.vmComboSelector',
220
221 valueField: 'vmid',
222 displayField: 'vmid',
223
224 autoSelect: false,
225 editable: true,
226 anyMatch: true,
227 forceSelection: true,
228
229 store: {
230 model: 'PVEResources',
231 autoLoad: true,
232 sorters: 'vmid',
233 filters: [{
234 property: 'type',
235 value: /lxc|qemu/
236 }]
237 },
238
239 listConfig: {
240 width: 600,
241 plugins: 'gridfilters',
242 columns: [
243 {
244 header: 'ID',
245 dataIndex: 'vmid',
246 width: 80,
247 filter: {
248 type: 'number'
249 }
250 },
251 {
252 header: gettext('Name'),
253 dataIndex: 'name',
254 flex: 1,
255 filter: {
256 type: 'string'
257 }
258 },
259 {
260 header: gettext('Node'),
261 dataIndex: 'node'
262 },
263 {
264 header: gettext('Status'),
265 dataIndex: 'status',
266 filter: {
267 type: 'list'
268 }
269 },
270 {
271 header: gettext('Pool'),
272 dataIndex: 'pool',
273 hidden: true,
274 filter: {
275 type: 'list'
276 }
277 },
278 {
279 header: gettext('Type'),
280 dataIndex: 'type',
281 width: 120,
282 renderer: function(value) {
283 if (value === 'qemu') {
284 return gettext('Virtual Machine');
285 } else if (value === 'lxc') {
286 return gettext('LXC Container');
287 }
288
289 return '';
290 },
291 filter: {
292 type: 'list',
293 store: {
294 data: [
295 {id: 'qemu', text: gettext('Virtual Machine')},
296 {id: 'lxc', text: gettext('LXC Container')}
297 ],
298 un: function(){} // due to EXTJS-18711
299 }
300 }
301 },
302 {
303 header: 'HA ' + gettext('Status'),
304 dataIndex: 'hastate',
305 hidden: true,
306 flex: 1,
307 filter: {
308 type: 'list'
309 }
310 }
311 ]
312 }
313});