Ext.define('pbs-datastore-statistics', { extend: 'Ext.data.Model', fields: [ 'store', 'total', 'used', 'avail', 'estimated-full-date', 'error', { name: 'history', convert: function(values) { if (!values) { return []; } let last = null; return values.map(v => { if (v !== undefined && v !== null) { last = v; } return last; }); }, }, { name: 'usage', calculate: function(data) { let used = data.used || 0; let total = data.total || 0; if (total > 0) { return used/total; } else { return -1; } }, }, ], proxy: { type: 'proxmox', url: "/api2/json/status/datastore-usage", }, idProperty: 'store', }); Ext.define('PBS.DatastoreStatistics', { extend: 'Ext.grid.Panel', alias: 'widget.pbsDatastoresStatistics', title: gettext('Datastore Usage'), disableSelection: true, emptyText: gettext('No Data'), controller: { xclass: 'Ext.app.ViewController', init: function(view) { Proxmox.Utils.monStoreErrors(view, view.getStore().rstore); }, }, columns: [ { text: gettext('Name'), dataIndex: 'store', sortable: true, renderer: (value, metaData, record, rowIndex, colIndex, store) => { let err = record.get('error'); if (err) { metaData.tdAttr = `data-qtip="${Ext.htmlEncode(err)}"`; metaData.tdCls = 'proxmox-invalid-row'; return `${value || ''} `; } return value; }, }, { text: gettext('Size'), dataIndex: 'total', sortable: true, width: 90, renderer: v => v === undefined || v < 0 ? '-' : Proxmox.Utils.format_size(v), }, { text: gettext('Used'), dataIndex: 'used', sortable: true, width: 90, renderer: v => v === undefined || v < 0 ? '-' : Proxmox.Utils.format_size(v), }, { text: gettext('Available'), dataIndex: 'avail', sortable: true, width: 90, renderer: v => v === undefined || v < 0 ? '-' : Proxmox.Utils.format_size(v), }, { text: gettext('Usage %'), dataIndex: 'usage', sortable: true, xtype: 'widgetcolumn', widget: { xtype: 'progressbarwidget', bind: '{record.usage}', textTpl: [ '', '{value:number("0.00")*100}%', '', Proxmox.Utils.unknownText, '', ], }, }, { text: gettext('Estimated Full'), dataIndex: 'estimated-full-date', sortable: true, renderer: PBS.Utils.render_estimate, flex: 1, minWidth: 130, maxWidth: 200, }, { text: gettext("History (last Month)"), width: 100, xtype: 'widgetcolumn', dataIndex: 'history', flex: 1, widget: { xtype: 'sparklineline', bind: '{record.history}', spotRadius: 0, fillColor: '#ddd', lineColor: '#555', lineWidth: 0, chartRangeMin: 0, chartRangeMax: 1, tipTpl: '{y:number("0.00")*100}%', }, }, ], store: { type: 'diff', autoDestroy: true, autoDestroyRstore: true, sorters: 'store', rstore: { type: 'update', storeid: 'pbs-datastore-statistics', model: 'pbs-datastore-statistics', autoStart: true, interval: 30000, }, }, });