Ext.define('PVE.pool.AddVM', { extend: 'Proxmox.window.Edit', width: 600, height: 400, isAdd: true, isCreate: true, initComponent: function() { var me = this; if (!me.pool) { throw "no pool specified"; } me.url = "/pools/" + me.pool; me.method = 'PUT'; var vmsField = Ext.create('Ext.form.field.Text', { name: 'vms', hidden: true, allowBlank: false, }); var vmStore = Ext.create('Ext.data.Store', { model: 'PVEResources', sorters: [ { property: 'vmid', order: 'ASC', }, ], filters: [ function(item) { return (item.data.type === 'lxc' || item.data.type === 'qemu') && item.data.pool === ''; }, ], }); var vmGrid = Ext.create('widget.grid', { store: vmStore, border: true, height: 300, scrollable: true, selModel: { selType: 'checkboxmodel', mode: 'SIMPLE', listeners: { selectionchange: function(model, selected, opts) { var selectedVms = []; selected.forEach(function(vm) { selectedVms.push(vm.data.vmid); }); vmsField.setValue(selectedVms); }, }, }, columns: [ { header: 'ID', dataIndex: 'vmid', width: 60, }, { header: gettext('Node'), dataIndex: 'node', }, { header: gettext('Status'), dataIndex: 'uptime', renderer: function(value) { if (value) { return Proxmox.Utils.runningText; } else { return Proxmox.Utils.stoppedText; } }, }, { header: gettext('Name'), dataIndex: 'name', flex: 1, }, { header: gettext('Type'), dataIndex: 'type', }, ], }); Ext.apply(me, { subject: gettext('Virtual Machine'), items: [vmsField, vmGrid], }); me.callParent(); vmStore.load(); }, }); Ext.define('PVE.pool.AddStorage', { extend: 'Proxmox.window.Edit', initComponent: function() { var me = this; if (!me.pool) { throw "no pool specified"; } me.isCreate = true; me.isAdd = true; me.url = "/pools/" + me.pool; me.method = 'PUT'; Ext.apply(me, { subject: gettext('Storage'), width: 350, items: [ { xtype: 'pveStorageSelector', name: 'storage', nodename: 'localhost', autoSelect: false, value: '', fieldLabel: gettext("Storage"), }, ], }); me.callParent(); }, }); Ext.define('PVE.grid.PoolMembers', { extend: 'Ext.grid.GridPanel', alias: ['widget.pvePoolMembers'], // fixme: dynamic status update ? stateful: true, stateId: 'grid-pool-members', initComponent: function() { var me = this; if (!me.pool) { throw "no pool specified"; } var store = Ext.create('Ext.data.Store', { model: 'PVEResources', sorters: [ { property: 'type', direction: 'ASC', }, ], proxy: { type: 'proxmox', root: 'data.members', url: "/api2/json/pools/" + me.pool, }, }); var coldef = PVE.data.ResourceStore.defaultColumns(); var reload = function() { store.load(); }; var sm = Ext.create('Ext.selection.RowModel', {}); var remove_btn = new Proxmox.button.Button({ text: gettext('Remove'), disabled: true, selModel: sm, confirmMsg: function(rec) { return Ext.String.format(gettext('Are you sure you want to remove entry {0}'), "'" + rec.data.id + "'"); }, handler: function(btn, event, rec) { var params = { 'delete': 1 }; if (rec.data.type === 'storage') { params.storage = rec.data.storage; } else if (rec.data.type === 'qemu' || rec.data.type === 'lxc' || rec.data.type === 'openvz') { params.vms = rec.data.vmid; } else { throw "unknown resource type"; } Proxmox.Utils.API2Request({ url: '/pools/' + me.pool, method: 'PUT', params: params, waitMsgTarget: me, callback: function() { reload(); }, failure: function(response, opts) { Ext.Msg.alert(gettext('Error'), response.htmlStatus); }, }); }, }); Ext.apply(me, { store: store, selModel: sm, tbar: [ { text: gettext('Add'), menu: new Ext.menu.Menu({ items: [ { text: gettext('Virtual Machine'), iconCls: 'pve-itype-icon-qemu', handler: function() { var win = Ext.create('PVE.pool.AddVM', { pool: me.pool }); win.on('destroy', reload); win.show(); }, }, { text: gettext('Storage'), iconCls: 'pve-itype-icon-storage', handler: function() { var win = Ext.create('PVE.pool.AddStorage', { pool: me.pool }); win.on('destroy', reload); win.show(); }, }, ], }), }, remove_btn, ], viewConfig: { stripeRows: true, }, columns: coldef, listeners: { itemcontextmenu: PVE.Utils.createCmdMenu, itemdblclick: function(v, record) { var ws = me.up('pveStdWorkspace'); ws.selectById(record.data.id); }, activate: reload, }, }); me.callParent(); }, });