Ext.define('pbs-data-store-content', { extend: 'Ext.data.Model', fields: [ 'backup-type', 'backup-id', { name: 'last-backup', type: 'date', dateFormat: 'timestamp' }, 'files', { name: 'backup-count', type: 'int' }, { name: 'backup-group', calculate: function (data) { return data["backup-type"] + '/' + data["backup-id"]; } }, ], }); Ext.define('PBS.DataStoreContent', { extend: 'Ext.grid.GridPanel', alias: 'widget.pbsDataStoreContent', store: { model: 'pbs-data-store-content', sorters: 'backup-group', }, controller: { xclass: 'Ext.app.ViewController', init: function(view) { if (!view.datastore) { throw "no datastore specified"; } view.title = gettext('Data Store Content: ') + view.datastore; Proxmox.Utils.monStoreErrors(view, view.store, true); this.reload(); // initial load }, reload: function() { var view = this.getView(); let url = `/api2/json/admin/datastore/${view.datastore}/groups`; view.store.setProxy({ type: 'proxmox', url: url }); view.store.load(); }, }, initComponent: function() { var me = this; var render_backup_type = function(value, metaData, record) { var btype = record.data["backup-type"]; var cls = ''; if (btype === 'vm') { cls = 'fa-desktop'; } else if (btype === 'ct') { cls = 'fa-cube'; } else if (btype === 'host') { cls = 'fa-building'; } else { return btype + '/' + value; } var fa = ' '; return fa + value; }; Ext.apply(me, { columns: [ { header: gettext('Backup'), sortable: true, renderer: render_backup_type, dataIndex: 'backup-id', flex: 1 }, { xtype: 'datecolumn', header: gettext('Last Backup'), sortable: true, dataIndex: 'last-backup', format: 'Y-m-d H:i:s', flex: 1 }, { xtype: 'numbercolumn', format: '0', header: gettext('Number of Backups'), sortable: true, dataIndex: 'backup-count', flex: 1 }, ], plugins: [{ ptype: 'rowexpander', rowBodyTpl: new Ext.XTemplate( '', '

{.}

', '
' ), }], tbar: [ { text: gettext('Reload'), iconCls: 'fa fa-refresh', handler: 'reload', }, ], }); me.callParent(); }, });