]> git.proxmox.com Git - pve-manager.git/blame - www/manager6/form/VMSelector.js
add vmselector form field
[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 }
88 }
89 ],
90
91 selModel: {
92 selType: 'checkboxmodel',
93 checkOnly: true
94 },
95
96 checkChangeEvents: [
97 'selectionchange',
98 'change'
99 ],
100
101 listeners: {
102 selectionchange: function() {
103 // to trigger validity and error checks
104 this.checkChange();
105 }
106 },
107
108 getValue: function() {
109 var me = this;
110 var sm = me.getSelectionModel();
111 var selection = sm.getSelection();
112 var values = [];
113 var store = me.getStore();
114 selection.forEach(function(item) {
115 // only add if not filtered
116 if (store.findExact('vmid', item.data.vmid) !== -1) {
117 values.push(item.data.vmid);
118 }
119 });
120 return values;
121 },
122
123 setValue: function(value) {
124 console.log(value);
125 var me = this;
126 var sm = me.getSelectionModel();
127 if (!Ext.isArray(value)) {
128 value = value.split(',');
129 }
130 var selection = [];
131 var store = me.getStore();
132
133 value.forEach(function(item) {
134 var rec = store.findRecord('vmid',item, 0, false, true, true);
135 console.log(store);
136
137 if (rec) {
138 console.log(rec);
139 selection.push(rec);
140 }
141 });
142
143 sm.select(selection);
144
145 return me.mixins.field.setValue.call(me, value);
146 },
147
148 getErrors: function(value) {
149 var me = this;
150 if (me.allowBlank === false &&
151 me.getSelectionModel().getCount() === 0) {
152 me.addBodyCls(['x-form-trigger-wrap-default','x-form-trigger-wrap-invalid']);
153 return [gettext('No VM selected')];
154 }
155
156 me.removeBodyCls(['x-form-trigger-wrap-default','x-form-trigger-wrap-invalid']);
157 return [];
158 },
159
160 initComponent: function() {
161 var me = this;
162
163 me.callParent();
164
165 if (me.nodename) {
166 me.store.filters.add({
167 property: 'node',
168 value: me.nodename
169 });
170 }
171
172 var store = me.getStore();
173 var sm = me.getSelectionModel();
174
175 if (me.selectAll) {
176 me.mon(store,'load', function(){
177 me.getSelectionModel().selectAll(false);
178 });
179 }
180 }
181});