]>
git.proxmox.com Git - pve-manager.git/blob - www/manager6/panel/MultiDiskEdit.js
1 Ext
.define('PVE.panel.MultiDiskPanel', {
2 extend
: 'Ext.panel.Panel',
4 setNodename: function(nodename
) {
5 this.items
.each((panel
) => panel
.setNodename(nodename
));
14 xclass
: 'Ext.app.ViewController',
20 me
.lookup('addButton').setDisabled(true);
22 let count
= me
.lookup('grid').getStore().getCount() + 1; // +1 is from ide2
23 me
.lookup('addButton').setDisabled(count
>= me
.maxCount
);
26 getNextFreeDisk: function(vmconfig
) {
27 throw "implement in subclass";
30 addPanel: function(itemId
, vmconfig
, nextFreeDisk
) {
31 throw "implement in subclass";
35 diskSorter
: undefined,
39 let grid
= me
.lookup('grid');
40 let store
= grid
.getStore();
43 let vmconfig
= me
.getVMConfig(true);
44 let nextFreeDisk
= me
.getNextFreeDisk(vmconfig
);
49 // add store entry + panel
50 let itemId
= 'disk-card-' + ++Ext
.idSeed
;
52 name
: nextFreeDisk
.confid
,
56 let panel
= me
.addPanel(itemId
, vmconfig
, nextFreeDisk
);
57 panel
.updateVMConfig(vmconfig
);
59 // we need to setup a validitychange handler, so that we can show
60 // that a disk has invalid fields
61 let fields
= panel
.query('field');
62 fields
.forEach((el
) => el
.on('validitychange', () => {
63 let valid
= fields
.every((field
) => field
.isValid());
64 rec
.set('valid', valid
);
68 store
.sort(me
.diskSorter
);
70 // select if the panel added is the only one
71 if (store
.getCount() === 1) {
72 grid
.getSelectionModel().select(0, false);
76 getBaseVMConfig: function() {
77 throw "implement in subclass";
80 getVMConfig: function(all
) {
83 let vmconfig
= me
.getBaseVMConfig();
85 me
.lookup('grid').getStore().each((rec
) => {
86 if (all
|| rec
.get('valid')) {
87 vmconfig
[rec
.get('name')] = rec
.get('itemId');
94 checkValidity: function() {
96 let valid
= me
.lookup('grid').getStore().findExact('valid', false) === -1;
97 me
.lookup('validationfield').setValue(valid
);
100 updateVMConfig: function() {
102 let view
= me
.getView();
103 let grid
= me
.lookup('grid');
104 let store
= grid
.getStore();
106 let vmconfig
= me
.getVMConfig();
110 store
.each((rec
) => {
111 let itemId
= rec
.get('itemId');
112 let name
= rec
.get('name');
113 let panel
= view
.getComponent(itemId
);
115 throw "unexpected missing panel";
118 // copy config for each panel and remote its own id
119 let panel_vmconfig
= Ext
.apply({}, vmconfig
);
120 if (panel_vmconfig
[name
] === itemId
) {
121 delete panel_vmconfig
[name
];
124 if (!rec
.get('valid')) {
128 panel
.updateVMConfig(panel_vmconfig
);
131 me
.lookup('validationfield').setValue(valid
);
136 onChange: function(panel
, newVal
) {
138 let store
= me
.lookup('grid').getStore();
140 let el
= store
.findRecord('itemId', panel
.itemId
, 0, false, true, true);
141 if (el
.get('name') === newVal
) {
142 // do not update if there was no change
146 el
.set('name', newVal
);
149 store
.sort(me
.diskSorter
);
151 // so that it happens after the layouting
152 setTimeout(function() {
157 onRemove: function(tableview
, rowIndex
, colIndex
, item
, event
, record
) {
159 let grid
= me
.lookup('grid');
160 let store
= grid
.getStore();
161 let removed_idx
= store
.indexOf(record
);
163 let selection
= grid
.getSelection()[0];
164 let selected_idx
= store
.indexOf(selection
);
166 if (selected_idx
=== removed_idx
) {
167 let newidx
= store
.getCount() > removed_idx
+ 1 ? removed_idx
+ 1: removed_idx
- 1;
168 grid
.getSelectionModel().select(newidx
, false);
171 store
.remove(record
);
172 me
.getView().remove(record
.get('itemId'));
173 me
.lookup('addButton').setDisabled(false);
178 onSelectionChange: function(grid
, selection
) {
180 if (!selection
|| selection
.length
< 1) {
184 me
.getView().setActiveItem(selection
[0].data
.itemId
);
189 diskidchange
: 'onChange',
191 'grid[reference=grid]': {
192 selectionchange
: 'onSelectionChange',
196 init: function(view
) {
199 me
.lookup('grid').getSelectionModel().select(0, false);
219 emptyText
: gettext('No Disks'),
222 fields
: ['name', 'itemId', 'valid'],
228 renderer: function(val
, md
, rec
) {
230 if (!rec
.get('valid')) {
231 warn
= ' <i class="fa warning fa-warning"></i>';
238 xtype
: 'actioncolumn',
244 iconCls
: 'x-fa fa-trash critical',
247 isActionDisabled
: 'deleteDisabled',
255 reference
: 'addButton',
256 text
: gettext('Add'),
257 iconCls
: 'fa fa-plus-circle',
261 // dummy field to control wizard validation
264 reference
: 'validationfield',
267 validator
: (val
) => !!val
,