[pve-devel] [RFC manager 1/4] Add new selector for pool-wide bulk actions

Philip Abernethy p.abernethy at proxmox.com
Wed Aug 30 17:22:58 CEST 2017


The new selector is functionally identical to the VMSelector,
except that it filters the resource list with a pool name, instead
of a node name.
---
 www/manager6/form/MemberVMSelector.js | 207 ++++++++++++++++++++++++++++++++++
 1 file changed, 207 insertions(+)
 create mode 100644 www/manager6/form/MemberVMSelector.js

diff --git a/www/manager6/form/MemberVMSelector.js b/www/manager6/form/MemberVMSelector.js
new file mode 100644
index 00000000..e1944d5d
--- /dev/null
+++ b/www/manager6/form/MemberVMSelector.js
@@ -0,0 +1,207 @@
+
+/*jslint confusion: true*/
+/* filter is a javascript builtin, but extjs calls it also filter */
+Ext.define('PVE.form.MemberVMSelector', {
+    extend: 'Ext.grid.Panel',
+    alias: 'widget.membervmselector',
+
+    mixins: {
+	field: 'Ext.form.field.Field'
+    },
+
+    allowBlank: true,
+    selectAll: false,
+    isFormField: true,
+
+    plugins: 'gridfilters',
+
+    store: {
+	model: 'PVEResources',
+	autoLoad: true,
+	sorters: 'vmid',
+	filters: [{
+	    property: 'type',
+	    value: /lxc|qemu/
+	}]
+    },
+    columns: [
+	{
+	    header: 'ID',
+	    dataIndex: 'vmid',
+	    width: 80,
+	    filter: {
+		type: 'number'
+	    }
+	},
+	{
+	    header: gettext('Node'),
+	    dataIndex: 'node'
+	},
+	{
+	    header: gettext('Status'),
+	    dataIndex: 'status',
+	    filter: {
+		type: 'list'
+	    }
+	},
+	{
+	    header: gettext('Name'),
+	    dataIndex: 'name',
+	    flex: 1,
+	    filter: {
+		type: 'string'
+	    }
+	},
+	{
+	    header: gettext('Type'),
+	    dataIndex: 'type',
+	    width: 120,
+	    renderer: function(value) {
+		if (value === 'qemu') {
+		    return gettext('Virtual Machine');
+		} else if (value === 'lxc') {
+		    return gettext('LXC Container');
+		}
+
+		return '';
+	    },
+	    filter: {
+		type: 'list',
+		store: {
+		    data: [
+			{id: 'qemu', text: gettext('Virtual Machine')},
+			{id: 'lxc', text: gettext('LXC Container')}
+		    ],
+		    // due to EXTJS-18711
+		    // we have to do a static list via a store
+		    // but to avoid creating an object,
+		    // we have to have a pseudo un function
+		    un: function(){}
+		}
+	    }
+	},
+	{
+	    header: 'HA ' + gettext('Status'),
+	    dataIndex: 'hastate',
+	    flex: 1,
+	    filter: {
+		type: 'list'
+	    }
+	}
+    ],
+
+    selModel: {
+	selType: 'checkboxmodel',
+	checkOnly: true
+    },
+
+    checkChangeEvents: [
+	'selectionchange',
+	'change'
+    ],
+
+    listeners: {
+	selectionchange: function() {
+	    // to trigger validity and error checks
+	    this.checkChange();
+	}
+    },
+
+    getValue: function() {
+	var me = this;
+	var sm = me.getSelectionModel();
+	var selection = sm.getSelection();
+	var values = [];
+	var store = me.getStore();
+	selection.forEach(function(item) {
+	    // only add if not filtered
+	    if (store.findExact('vmid', item.data.vmid) !== -1) {
+		values.push(item.data.vmid);
+	    }
+	});
+	return values;
+    },
+
+    setValue: function(value) {
+	console.log(value);
+	var me = this;
+	var sm = me.getSelectionModel();
+	if (!Ext.isArray(value)) {
+	    value = value.split(',');
+	}
+	var selection = [];
+	var store = me.getStore();
+
+	value.forEach(function(item) {
+	    var rec = store.findRecord('vmid',item, 0, false, true, true);
+	    console.log(store);
+
+	    if (rec) {
+		console.log(rec);
+		selection.push(rec);
+	    }
+	});
+
+	sm.select(selection);
+
+	return me.mixins.field.setValue.call(me, value);
+    },
+
+    getErrors: function(value) {
+	var me = this;
+	if (me.allowBlank ===  false &&
+	    me.getSelectionModel().getCount() === 0) {
+	    me.addBodyCls(['x-form-trigger-wrap-default','x-form-trigger-wrap-invalid']);
+	    return [gettext('No VM selected')];
+	}
+
+	me.removeBodyCls(['x-form-trigger-wrap-default','x-form-trigger-wrap-invalid']);
+	return [];
+    },
+
+    initComponent: function() {
+	var me = this;
+
+	me.callParent();
+
+	if (me.poolname) {
+	    me.store.filters.add({
+		property: 'pool',
+		value: me.poolname
+	    });
+	}
+
+	// only show the relevant guests by default
+	if (me.action) {
+	    var statusfilter = '';
+	    switch (me.action) {
+		case 'startall':
+		    statusfilter = 'stopped';
+		    break;
+		case 'stopall':
+		    statusfilter = 'running';
+		    break;
+	    }
+	    if (statusfilter !== '') {
+		me.store.filters.add({
+		    property: 'template',
+		    value: 0
+		},{
+		    id: 'x-gridfilter-status',
+		    operator: 'in',
+		    property: 'status',
+		    value: [statusfilter]
+		});
+	    }
+	}
+
+	var store = me.getStore();
+	var sm = me.getSelectionModel();
+
+	if (me.selectAll) {
+	    me.mon(store,'load', function(){
+		me.getSelectionModel().selectAll(false);
+	    });
+	}
+    }
+});
-- 
2.11.0




More information about the pve-devel mailing list