n 08/30/2017 05:22 PM, Philip Abernethy wrote:
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.

Yes its really quite identical, as a diff on both files shows.

Instead of deduplicate all the code the existing one could be modified
to allow both use cases, which could be looking something like:

----8<----
diff --git a/www/manager6/form/VMSelector.js b/www/manager6/form/VMSelector.js
index 59d2b587..7e285fba 100644
--- a/www/manager6/form/VMSelector.js
+++ b/www/manager6/form/VMSelector.js
@@ -54,6 +54,7 @@ Ext.define('PVE.form.VMSelector', {
        {
            header: gettext('Pool'),
            dataIndex: 'pool',
+           hidden: !!me.poolname
            filter: {
                type: 'list'
            }
@@ -175,6 +176,11 @@ Ext.define('PVE.form.VMSelector', {
                property: 'node',
                value: me.nodename
            });
+       } else if(me.poolname) {
+           me.store.filters.add({
+               property: 'pool',
+               value: me.poolname
+           });
        }

        // only show the relevant guests by default

---->8----


---
  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);
+           });
+       }
+    }
+});



_______________________________________________
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to