panel: add StatusView from PVE

with 2 minor fixups:
* one lint error
* binding of the 'updateValues' function in the event
  (we want to avoid breaking this when used in a context where
  a controller exists, in that case using a string will only look in
  the controller and not in the component itself anymore, so use
  the function directly)

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
This commit is contained in:
Dominik Csapak 2021-04-19 13:00:44 +02:00 committed by Thomas Lamprecht
parent d365540e14
commit b87d473347
2 changed files with 126 additions and 0 deletions

View File

@ -53,6 +53,7 @@ JSSRC= \
panel/ACMEAccount.js \ panel/ACMEAccount.js \
panel/ACMEPlugin.js \ panel/ACMEPlugin.js \
panel/ACMEDomains.js \ panel/ACMEDomains.js \
panel/StatusView.js \
window/Edit.js \ window/Edit.js \
window/PasswordEdit.js \ window/PasswordEdit.js \
window/SafeDestroy.js \ window/SafeDestroy.js \

125
src/panel/StatusView.js Normal file
View File

@ -0,0 +1,125 @@
Ext.define('Proxmox.panel.StatusView', {
extend: 'Ext.panel.Panel',
alias: 'widget.pmxStatusView',
layout: {
type: 'column',
},
title: gettext('Status'),
getRecordValue: function(key, store) {
if (!key) {
throw "no key given";
}
var me = this;
if (store === undefined) {
store = me.getStore();
}
var rec = store.getById(key);
if (rec) {
return rec.data.value;
}
return '';
},
fieldRenderer: function(val, max) {
if (max === undefined) {
return val;
}
if (!Ext.isNumeric(max) || max === 1) {
return Proxmox.Utils.render_usage(val);
}
return Proxmox.Utils.render_size_usage(val, max);
},
fieldCalculator: function(used, max) {
if (!Ext.isNumeric(max) && Ext.isNumeric(used)) {
return used;
} else if (!Ext.isNumeric(used)) {
/* we come here if the field is from a node
* where the records are not mem and maxmem
* but mem.used and mem.total
*/
if (used.used !== undefined &&
used.total !== undefined) {
return used.used/used.total;
}
}
return used/max;
},
updateField: function(field) {
var me = this;
var renderer = me.fieldRenderer;
if (Ext.isFunction(field.renderer)) {
renderer = field.renderer;
}
if (field.multiField === true) {
field.updateValue(renderer.call(field, me.getStore().getRecord()));
} else if (field.textField !== undefined) {
field.updateValue(renderer.call(field, me.getRecordValue(field.textField)));
} else if (field.valueField !== undefined) {
var used = me.getRecordValue(field.valueField);
/* string and int */
var max = field.maxField !== undefined ? me.getRecordValue(field.maxField) : 1;
var calculate = me.fieldCalculator;
if (Ext.isFunction(field.calculate)) {
calculate = field.calculate;
}
field.updateValue(renderer.call(field, used, max), calculate(used, max));
}
},
getStore: function() {
var me = this;
if (!me.rstore) {
throw "there is no rstore";
}
return me.rstore;
},
updateTitle: function() {
var me = this;
me.setTitle(me.getRecordValue('name'));
},
updateValues: function(store, records, success) {
if (!success) {
return; // do not update if store load was not successful
}
var me = this;
var itemsToUpdate = me.query('pmxInfoWidget');
itemsToUpdate.forEach(me.updateField, me);
me.updateTitle(store);
},
initComponent: function() {
var me = this;
if (!me.rstore) {
throw "no rstore given";
}
if (!me.title) {
throw "no title given";
}
Proxmox.Utils.monStoreErrors(me, me.rstore);
me.callParent();
me.mon(me.rstore, 'load', me.updateValues, me);
},
});