Ext.define('pbs-datastore-statistics', { extend: 'Ext.data.Model', fields: [ 'store', 'total', 'used', 'avail', 'estimated-full-date', { name: 'history', convert: function(values) { 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'), emptyText: gettext('No Data'), controller: { xclass: 'Ext.app.ViewController', render_estimate: function(value) { if (!value) { return gettext('Not enough data'); } let now = new Date(); let estimate = new Date(value*1000); let timespan = (estimate - now)/1000; if (Number(estimate) <= Number(now) || isNaN(timespan)) { return gettext('Never'); } let duration = Proxmox.Utils.format_duration_human(timespan); return Ext.String.format(gettext("in {0}"), duration); }, init: function(view) { Proxmox.Utils.monStoreErrors(view, view.getStore().rstore); }, }, columns: [ { text: gettext('Name'), dataIndex: 'store', sortable: true, }, { text: gettext('Size'), dataIndex: 'total', sortable: true, width: 90, renderer: Proxmox.Utils.format_size, }, { text: gettext('Used'), dataIndex: 'used', sortable: true, width: 90, renderer: Proxmox.Utils.format_size, }, { 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: '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, }, }, });