convert disk list to disk tree and conditionally include partitions

Assigning the store directly to the treepanel doesn't work, more manual
handling is needed. This is mostly based on what we do for PBS's datastore
content view. The store monitoring also needs to be changed slightly.

The buttons are restricted to work on disks only, based on the parent
attribute, that only partitions have.

Signed-off-by: Fabian Ebner <f.ebner@proxmox.com>
This commit is contained in:
Fabian Ebner 2021-02-08 15:23:27 +01:00 committed by Thomas Lamprecht
parent fef397f558
commit d9e5b6711e

View File

@ -36,20 +36,35 @@ Ext.define('pmx-disk-list', {
});
Ext.define('Proxmox.DiskList', {
extend: 'Ext.grid.GridPanel',
extend: 'Ext.tree.Panel',
alias: 'widget.pmxDiskList',
rootVisible: false,
emptyText: gettext('No Disks found'),
stateful: true,
stateId: 'grid-node-disks',
stateId: 'tree-node-disks',
controller: {
xclass: 'Ext.app.ViewController',
reload: function() {
let me = this;
me.getView().getStore().load();
let view = me.getView();
let extraParams = {};
if (view.includePartitions) {
extraParams['include-partitions'] = 1;
}
let url = `${view.baseurl}/list`;
me.store.setProxy({
type: 'proxmox',
extraParams: extraParams,
url: url,
});
me.store.load();
},
openSmartWindow: function() {
@ -94,27 +109,63 @@ Ext.define('Proxmox.DiskList', {
},
init: function(view) {
Proxmox.Utils.monStoreErrors(view, view.getStore(), true);
let nodename = view.nodename || 'localhost';
view.baseurl = `/api2/json/nodes/${nodename}/disks`;
view.exturl = `/api2/extjs/nodes/${nodename}/disks`;
view.getStore().getProxy().setUrl(`${view.baseurl}/list`);
view.getStore().load();
},
},
store: {
model: 'pmx-disk-list',
proxy: {
type: 'proxmox',
this.store = Ext.create('Ext.data.Store', {
model: 'pmx-disk-list',
});
this.store.on('load', this.onLoad, this);
Proxmox.Utils.monStoreErrors(view, this.store);
this.reload();
},
onLoad: function(store, records, success, operation) {
let me = this;
let view = this.getView();
if (!success) {
Proxmox.Utils.setErrorMask(
view,
Proxmox.Utils.getResponseErrorMessage(operation.getError()),
);
return;
}
let disks = {};
for (const item of records) {
let data = item.data;
data.leaf = true;
data.expanded = true;
data.children = [];
data.iconCls = 'fa fa-fw fa-hdd-o x-fa-tree';
if (!data.parent) {
disks[data.devpath] = data;
}
}
for (const item of records) {
let data = item.data;
if (data.parent) {
disks[data.parent].leaf = false;
disks[data.parent].children.push(data);
}
}
let children = [];
for (const [_, device] of Object.entries(disks)) {
children.push(device);
}
view.setRootNode({
expanded: true,
children: children,
});
Proxmox.Utils.setErrorMask(view, false);
},
sorters: [
{
property: 'dev',
direction: 'ASC',
},
],
},
tbar: [
@ -125,15 +176,25 @@ Ext.define('Proxmox.DiskList', {
{
xtype: 'proxmoxButton',
text: gettext('Show S.M.A.R.T. values'),
parentXType: 'treepanel',
disabled: true,
enableFn: function(rec) {
if (!rec || rec.data.parent) {
return false;
} else {
return true;
}
},
handler: 'openSmartWindow',
},
{
xtype: 'proxmoxButton',
text: gettext('Initialize Disk with GPT'),
parentXType: 'treepanel',
disabled: true,
enableFn: function(rec) {
if (!rec || (rec.data.used && rec.data.used !== 'unused')) {
if (!rec || rec.data.parent ||
(rec.data.used && rec.data.used !== 'unused')) {
return false;
} else {
return true;
@ -145,6 +206,7 @@ Ext.define('Proxmox.DiskList', {
columns: [
{
xtype: 'treecolumn',
header: gettext('Device'),
width: 150,
sortable: true,