178 lines
3.5 KiB
JavaScript
178 lines
3.5 KiB
JavaScript
Ext.define('PBS.TapeManagement.BackupOverview', {
|
|
extend: 'Ext.tree.Panel',
|
|
alias: 'widget.pbsBackupOverview',
|
|
|
|
controller: {
|
|
xclass: 'Ext.app.ViewController',
|
|
|
|
backup: function() {
|
|
let me = this;
|
|
Ext.create('PBS.TapeManagement.TapeBackupWindow', {
|
|
listeners: {
|
|
destroy: function() {
|
|
me.reload();
|
|
},
|
|
},
|
|
}).show();
|
|
},
|
|
|
|
restore: function(button, record) {
|
|
let me = this;
|
|
let view = me.getView();
|
|
let selection = view.getSelection();
|
|
if (!selection || selection.length < 1) {
|
|
return;
|
|
}
|
|
|
|
let mediaset = selection[0].data.text;
|
|
let uuid = selection[0].data.uuid;
|
|
Ext.create('PBS.TapeManagement.TapeRestoreWindow', {
|
|
mediaset,
|
|
uuid,
|
|
listeners: {
|
|
destroy: function() {
|
|
me.reload();
|
|
},
|
|
},
|
|
}).show();
|
|
},
|
|
|
|
loadContent: async function() {
|
|
let content_response = await PBS.Async.api2({
|
|
url: '/api2/extjs/tape/media/content',
|
|
});
|
|
let data = {};
|
|
|
|
for (const entry of content_response.result.data) {
|
|
let pool = entry.pool;
|
|
let [type, group_id, id] = PBS.Utils.parse_snapshot_id(entry.snapshot);
|
|
let group = `${type}/${group_id}`;
|
|
let media_set = entry['media-set-name'];
|
|
let uuid = entry['media-set-uuid'];
|
|
let ctime = entry['media-set-ctime'];
|
|
if (data[pool] === undefined) {
|
|
data[pool] = {};
|
|
}
|
|
|
|
if (data[pool][group] === undefined) {
|
|
data[pool][group] = {};
|
|
}
|
|
|
|
if (data[pool][group][id] === undefined) {
|
|
data[pool][group][id] = [];
|
|
}
|
|
data[pool][group][id].push({
|
|
text: media_set,
|
|
uuid,
|
|
ctime,
|
|
leaf: true,
|
|
});
|
|
}
|
|
|
|
let list = [];
|
|
|
|
for (const [pool, groups] of Object.entries(data)) {
|
|
let pool_entry = {
|
|
text: pool,
|
|
leaf: false,
|
|
children: [],
|
|
};
|
|
for (const [group, ids] of Object.entries(groups)) {
|
|
let group_entry = {
|
|
text: group,
|
|
iconCls: "fa " + PBS.Utils.get_type_icon_cls(group),
|
|
leaf: false,
|
|
children: [],
|
|
};
|
|
for (const [id, media_sets] of Object.entries(ids)) {
|
|
let id_entry = {
|
|
text: `${group}/${id}`,
|
|
leaf: false,
|
|
children: media_sets,
|
|
};
|
|
group_entry.children.push(id_entry);
|
|
}
|
|
pool_entry.children.push(group_entry);
|
|
}
|
|
list.push(pool_entry);
|
|
}
|
|
|
|
return list;
|
|
},
|
|
|
|
reload: async function() {
|
|
let me = this;
|
|
let view = me.getView();
|
|
|
|
Proxmox.Utils.setErrorMask(view, true);
|
|
|
|
try {
|
|
let list = await me.loadContent();
|
|
|
|
view.setRootNode({
|
|
expanded: true,
|
|
children: list,
|
|
});
|
|
|
|
Proxmox.Utils.setErrorMask(view, false);
|
|
} catch (error) {
|
|
Proxmox.Utils.setErrorMask(view, error.toString());
|
|
}
|
|
},
|
|
},
|
|
|
|
listeners: {
|
|
activate: 'reload',
|
|
},
|
|
|
|
store: {
|
|
data: [],
|
|
sorters: function(a, b) {
|
|
if (a.data.leaf && b.data.leaf) {
|
|
return a.data.ctime - b.data.ctime;
|
|
} else {
|
|
return a.data.text.localeCompare(b.data.text);
|
|
}
|
|
},
|
|
},
|
|
|
|
rootVisible: false,
|
|
|
|
tbar: [
|
|
{
|
|
text: gettext('Reload'),
|
|
handler: 'reload',
|
|
},
|
|
'-',
|
|
{
|
|
text: gettext('New Backup'),
|
|
handler: 'backup',
|
|
},
|
|
{
|
|
xtype: 'proxmoxButton',
|
|
disabled: true,
|
|
text: gettext('Restore Media Set'),
|
|
handler: 'restore',
|
|
parentXType: 'treepanel',
|
|
enableFn: (rec) => !!rec.data.uuid,
|
|
},
|
|
],
|
|
|
|
columns: [
|
|
{
|
|
xtype: 'treecolumn',
|
|
text: gettext('Pool/Group/Snapshot/Media Set'),
|
|
dataIndex: 'text',
|
|
sortable: false,
|
|
flex: 3,
|
|
},
|
|
{
|
|
text: gettext('Media Set UUID'),
|
|
dataIndex: 'uuid',
|
|
sortable: false,
|
|
flex: 1,
|
|
},
|
|
],
|
|
});
|
|
|