]>
git.proxmox.com Git - pve-manager.git/blob - www/manager6/form/VMSelector.js
1 /* filter is a javascript builtin, but extjs calls it also filter */
2 Ext
.define('PVE.form.VMSelector', {
3 extend
: 'Ext.grid.Panel',
4 alias
: 'widget.vmselector',
7 field
: 'Ext.form.field.Field',
14 plugins
: 'gridfilters',
17 model
: 'PVEResources',
21 userCls
: 'proxmox-tags-circle',
33 header
: gettext('Node'),
37 header
: gettext('Status'),
44 header
: gettext('Name'),
52 header
: gettext('Pool'),
59 header
: gettext('Type'),
62 renderer: function(value
) {
63 if (value
=== 'qemu') {
64 return gettext('Virtual Machine');
65 } else if (value
=== 'lxc') {
66 return gettext('LXC Container');
75 { id
: 'qemu', text
: gettext('Virtual Machine') },
76 { id
: 'lxc', text
: gettext('LXC Container') },
79 // Due to EXTJS-18711. we have to do a static list via a store but to avoid
80 // creating an object, we have to have an empty pseudo un function
86 header
: gettext('Tags'),
88 renderer
: tags
=> PVE
.Utils
.renderTags(tags
, PVE
.UIOptions
.tagOverrides
),
92 header
: 'HA ' + gettext('Status'),
101 // should be a list of 'dataIndex' values, if 'undefined' all declared columns will be included
102 columnSelection
: undefined,
105 selType
: 'checkboxmodel',
115 selectionchange: function() {
116 // to trigger validity and error checks
121 getValue: function() {
123 if (me
.savedValue
!== undefined) {
124 return me
.savedValue
;
126 var sm
= me
.getSelectionModel();
127 var selection
= sm
.getSelection();
129 var store
= me
.getStore();
130 selection
.forEach(function(item
) {
131 // only add if not filtered
132 if (store
.findExact('vmid', item
.data
.vmid
) !== -1) {
133 values
.push(item
.data
.vmid
);
139 setValueSelection: function(value
) {
142 let store
= me
.getStore();
144 let selection
= value
.map(item
=> {
145 let found
= store
.findRecord('vmid', item
, 0, false, true, true);
147 if (Ext
.isNumeric(item
)) {
150 console
.warn(`invalid item in vm selection: ${item}`);
156 for (const vmid
of notFound
) {
157 let rec
= store
.add({
161 selection
.push(rec
[0]);
164 let sm
= me
.getSelectionModel();
165 if (selection
.length
) {
166 sm
.select(selection
);
170 // to correctly trigger invalid class
174 setValue: function(value
) {
177 if (!Ext
.isArray(value
)) {
178 value
= value
.split(',').filter(v
=> v
!== '');
181 let store
= me
.getStore();
182 if (!store
.isLoaded()) {
183 me
.savedValue
= value
;
184 store
.on('load', function() {
185 me
.setValueSelection(value
);
186 delete me
.savedValue
;
187 }, { single
: true });
189 me
.setValueSelection(value
);
191 return me
.mixins
.field
.setValue
.call(me
, value
);
194 getErrors: function(value
) {
196 if (!me
.isDisabled() && me
.allowBlank
=== false &&
197 me
.getValue().length
=== 0) {
198 me
.addBodyCls(['x-form-trigger-wrap-default', 'x-form-trigger-wrap-invalid']);
199 return [gettext('No VM selected')];
202 me
.removeBodyCls(['x-form-trigger-wrap-default', 'x-form-trigger-wrap-invalid']);
206 setDisabled: function(disabled
) {
208 let res
= me
.callParent([disabled
]);
213 initComponent: function() {
216 let columns
= me
.columnsDeclaration
.filter((column
) =>
217 me
.columnSelection
? me
.columnSelection
.indexOf(column
.dataIndex
) !== -1 : true,
220 me
.columns
= columns
;
224 me
.getStore().load({ params
: { type
: 'vm' } });
227 me
.getStore().addFilter({
234 // only show the relevant guests by default
236 var statusfilter
= '';
239 statusfilter
= 'stopped';
242 statusfilter
= 'running';
245 if (statusfilter
!== '') {
246 me
.getStore().addFilter([{
247 property
: 'template',
250 id
: 'x-gridfilter-status',
253 value
: [statusfilter
],
259 me
.mon(me
.getStore(), 'load', function() {
260 me
.getSelectionModel().selectAll(false);
267 Ext
.define('PVE.form.VMComboSelector', {
268 extend
: 'Proxmox.form.ComboGrid',
269 alias
: 'widget.vmComboSelector',
272 displayField
: 'vmid',
277 forceSelection
: true,
280 model
: 'PVEResources',
291 plugins
: 'gridfilters',
302 header
: gettext('Name'),
310 header
: gettext('Node'),
314 header
: gettext('Status'),
321 header
: gettext('Pool'),
329 header
: gettext('Type'),
332 renderer: function(value
) {
333 if (value
=== 'qemu') {
334 return gettext('Virtual Machine');
335 } else if (value
=== 'lxc') {
336 return gettext('LXC Container');
345 { id
: 'qemu', text
: gettext('Virtual Machine') },
346 { id
: 'lxc', text
: gettext('LXC Container') },
348 un: function() { /* due to EXTJS-18711 */ },
353 header
: 'HA ' + gettext('Status'),
354 dataIndex
: 'hastate',