From: Dominik Csapak <d.csapak@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [pve-devel] [PATCH widget-toolkit 4/4] panel: add StatusView from PVE
Date: Mon, 19 Apr 2021 13:00:44 +0200 [thread overview]
Message-ID: <20210419110048.20791-5-d.csapak@proxmox.com> (raw)
In-Reply-To: <20210419110048.20791-1-d.csapak@proxmox.com>
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>
---
src/Makefile | 1 +
src/panel/StatusView.js | 125 ++++++++++++++++++++++++++++++++++++++++
2 files changed, 126 insertions(+)
create mode 100644 src/panel/StatusView.js
diff --git a/src/Makefile b/src/Makefile
index f97c74a..9e3ad4e 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -53,6 +53,7 @@ JSSRC= \
panel/ACMEAccount.js \
panel/ACMEPlugin.js \
panel/ACMEDomains.js \
+ panel/StatusView.js \
window/Edit.js \
window/PasswordEdit.js \
window/SafeDestroy.js \
diff --git a/src/panel/StatusView.js b/src/panel/StatusView.js
new file mode 100644
index 0000000..059508a
--- /dev/null
+++ b/src/panel/StatusView.js
@@ -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);
+ },
+
+});
--
2.20.1
next prev parent reply other threads:[~2021-04-19 11:00 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-04-19 11:00 [pve-devel] [PATCH widget-toolkit/pve-manager] move some code to widget-toolkit Dominik Csapak
2021-04-19 11:00 ` [pve-devel] [PATCH widget-toolkit 1/4] Utils: add several render functions from PVE Dominik Csapak
2021-04-19 11:00 ` [pve-devel] [PATCH widget-toolkit 2/4] bring over some icons " Dominik Csapak
2021-04-19 11:00 ` [pve-devel] [PATCH widget-toolkit 3/4] Utils: refactor updateColumns from pve-manager Dominik Csapak
2021-04-19 11:00 ` Dominik Csapak [this message]
2021-04-22 18:38 ` [pve-devel] applied: [PATCH widget-toolkit 4/4] panel: add StatusView from PVE Thomas Lamprecht
2021-04-19 11:00 ` [pve-devel] [PATCH manager 1/4] ui: Utils: use render functions from widget-toolkit Dominik Csapak
2021-04-19 11:00 ` [pve-devel] [PATCH manager 2/4] ui: use some icons " Dominik Csapak
2021-04-19 11:00 ` [pve-devel] [PATCH manager 3/4] ui: Utils: use updateColumns " Dominik Csapak
2021-04-19 11:00 ` [pve-devel] [PATCH manager 4/4] ui: panel/StatusView: use from widget-toolkit instead Dominik Csapak
2021-04-22 18:41 ` [pve-devel] applied: [PATCH widget-toolkit/pve-manager] move some code to widget-toolkit Thomas Lamprecht
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210419110048.20791-5-d.csapak@proxmox.com \
--to=d.csapak@proxmox.com \
--cc=pve-devel@lists.proxmox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox