]>
git.proxmox.com Git - proxmox-backup.git/blob - www/tape/window/TapeRestore.js
1 Ext
.define('PBS.TapeManagement.TapeRestoreWindow', {
2 extend
: 'Proxmox.window.Edit',
3 alias
: 'widget.pbsTapeRestoreWindow',
4 mixins
: ['Proxmox.Mixin.CBind'],
7 title
: gettext('Restore Media Set'),
8 submitText
: gettext('Restore'),
9 url
: '/api2/extjs/tape/restore',
14 cbindData: function(config
) {
18 if (me
.list
!== undefined) {
20 me
.listText
= me
.list
.join('<br>');
21 me
.title
= gettext('Restore Snapshot');
30 referenceHolder
: true,
36 onGetValues: function(values
) {
39 if (values
.store
.toString() !== "") {
40 datastores
.push(values
.store
);
44 if (values
.mapping
.toString() !== "") {
45 datastores
.push(values
.mapping
);
47 delete values
.mapping
;
49 if (me
.up('window').list
!== undefined) {
50 values
.snapshots
= me
.up('window').list
;
53 values
.store
= datastores
.join(',');
60 xtype
: 'displayfield',
61 fieldLabel
: gettext('Media Set'),
67 xtype
: 'displayfield',
68 fieldLabel
: gettext('Media Set UUID'),
76 xtype
: 'displayfield',
77 fieldLabel
: gettext('Snapshot(s)'),
80 hidden
: '{!isSingle}',
85 xtype
: 'pbsDriveSelector',
86 fieldLabel
: gettext('Drive'),
93 xtype
: 'pbsUserSelector',
95 fieldLabel
: gettext('Notify User'),
96 emptyText
: gettext('Current User'),
100 renderer
: Ext
.String
.htmlEncode
,
103 xtype
: 'pbsUserSelector',
105 fieldLabel
: gettext('Owner'),
106 emptyText
: gettext('Current User'),
110 renderer
: Ext
.String
.htmlEncode
,
113 xtype
: 'pbsDataStoreSelector',
114 fieldLabel
: gettext('Target Datastore'),
115 reference
: 'defaultDatastore',
118 change: function(field
, value
) {
120 let grid
= me
.up('window').lookup('mappingGrid');
121 grid
.setNeedStores(!value
);
129 fieldLabel
: gettext('Datastore Mapping'),
132 reference
: 'mappingLabel',
133 xtype
: 'displayfield',
136 xtype
: 'pbsDataStoreMappingField',
137 reference
: 'mappingGrid',
139 defaultBindProperty
: 'value',
146 setDataStores: function(datastores
) {
149 let label
= me
.lookup('mappingLabel');
150 let grid
= me
.lookup('mappingGrid');
151 let defaultField
= me
.lookup('defaultDatastore');
153 if (!datastores
|| datastores
.length
<= 1) {
154 label
.setVisible(false);
155 grid
.setVisible(false);
156 defaultField
.setFieldLabel(gettext('Target Datastore'));
157 defaultField
.setAllowBlank(false);
158 defaultField
.setEmptyText("");
162 label
.setVisible(true);
163 defaultField
.setFieldLabel(gettext('Default Datastore'));
164 defaultField
.setAllowBlank(true);
165 defaultField
.setEmptyText(Proxmox
.Utils
.NoneText
);
167 grid
.setDataStores(datastores
);
168 grid
.setVisible(true);
171 initComponent: function() {
176 me
.setDataStores(me
.datastores
);
178 // use timeout so that the window is rendered already
179 // for correct masking
180 setTimeout(function() {
181 Proxmox
.Utils
.API2Request({
183 url
: `/tape/media/content?media-set=${me.uuid}`,
184 success: function(response
, opt
) {
186 for (const content
of response
.result
.data
) {
187 datastores
[content
.store
] = true;
189 me
.setDataStores(Object
.keys(datastores
));
191 failure: function() {
192 // ignore failing api call, maybe catalog is missing
201 Ext
.define('PBS.TapeManagement.DataStoreMappingGrid', {
202 extend
: 'Ext.grid.Panel',
203 alias
: 'widget.pbsDataStoreMappingField',
204 mixins
: ['Ext.form.field.Field'],
208 getValue: function() {
211 me
.getStore().each((rec
) => {
212 let source
= rec
.data
.source
;
213 let target
= rec
.data
.target
;
214 if (target
&& target
!== "") {
215 datastores
.push(`${source}=${target}`);
219 return datastores
.join(',');
222 // this determines if we need at least one valid mapping
225 setNeedStores: function(needStores
) {
227 me
.needStores
= needStores
;
232 setValue: function(value
) {
234 me
.setDataStores(value
);
238 getErrors: function(value
) {
244 me
.getStore().each((rec
) => {
245 if (rec
.data
.target
) {
251 let el
= me
.getActionEl();
253 me
.addCls(['x-form-trigger-wrap-default', 'x-form-trigger-wrap-invalid']);
254 let errorMsg
= gettext("Need at least one mapping");
256 el
.dom
.setAttribute('data-errorqtip', errorMsg
);
261 me
.removeCls(['x-form-trigger-wrap-default', 'x-form-trigger-wrap-invalid']);
263 el
.dom
.setAttribute('data-errorqtip', "");
268 setDataStores: function(datastores
) {
270 let store
= me
.getStore();
273 for (const datastore
of datastores
) {
291 text
: gettext('Source Datastore'),
296 text
: gettext('Target Datastore'),
297 xtype
: 'widgetcolumn',
301 xtype
: 'pbsDataStoreSelector',
303 emptyText
: Proxmox
.Utils
.NoneText
,
305 change: function(selector
, value
) {
307 let rec
= me
.getWidgetRecord();
311 rec
.set('target', value
);
312 me
.up('grid').checkChange();
320 Ext
.define('PBS.TapeManagement.SnapshotGrid', {
321 extend
: 'Ext.grid.Panel',
322 alias
: 'widget.pbsTapeSnapshotGrid',
323 mixins
: ['Ext.form.field.Field'],
325 getValue: function() {
329 me
.getSelection().forEach((rec
) => {
330 let id
= rec
.get('id');
331 let store
= rec
.data
.store
;
332 let snap
= rec
.data
.snapshot
;
333 // only add if not filtered
334 if (me
.store
.findExact('id', id
) !== -1) {
335 snapshots
.push(`${store}:${snap}`);
342 setValue: function(value
) {
348 getErrors: function(value
) {
350 if (me
.getSelection() < 1) {
351 me
.addCls(['x-form-trigger-wrap-default', 'x-form-trigger-wrap-invalid']);
352 let errorMsg
= gettext("Need at least one snapshot");
353 me
.getActionEl().dom
.setAttribute('data-errorqtip', errorMsg
);
357 me
.removeCls(['x-form-trigger-wrap-default', 'x-form-trigger-wrap-invalid']);
358 me
.getActionEl().dom
.setAttribute('data-errorqtip', "");
364 plugins
: 'gridfilters',
367 emptyText
: gettext('No Snapshots'),
371 selModel
: 'checkboxmodel',
373 sorters
: ['store', 'snapshot'],
379 selectionchange: function() {
380 // to trigger validity and error checks
392 text
: gettext('Source Datastore'),
400 text
: gettext('Snapshot'),
401 dataIndex
: 'snapshot',
409 initComponent: function() {
412 if (me
.prefilter
!== undefined) {
413 me
.store
.filters
.add(
415 id
: 'x-gridfilter-store',
418 value
: [me
.prefilter
.store
],
421 id
: 'x-gridfilter-snapshot',
422 property
: 'snapshot',
423 value
: me
.prefilter
.snapshot
,