[pve-devel] applied: [PATCH manager 1/2] ui: add Bandwidth selector widget
Thomas Lamprecht
t.lamprecht at proxmox.com
Wed Nov 27 11:32:09 CET 2019
Signed-off-by: Thomas Lamprecht <t.lamprecht at proxmox.com>
---
I talked a bit with Dominik, while he prefered to use a hidden field for the
"real" value and a dummy field for the user editing side with the transformed
value it was not really easier than this, even if it might be the less
"hackier" or a bit nicer interface.
www/manager6/Makefile | 1 +
www/manager6/form/BandwidthSelector.js | 128 +++++++++++++++++++++++++
2 files changed, 129 insertions(+)
create mode 100644 www/manager6/form/BandwidthSelector.js
diff --git a/www/manager6/Makefile b/www/manager6/Makefile
index b7ffc44b..a027e66b 100644
--- a/www/manager6/Makefile
+++ b/www/manager6/Makefile
@@ -21,6 +21,7 @@ JSSRC= \
data/model/RRDModels.js \
form/VLanField.js \
form/Boolean.js \
+ form/BandwidthSelector.js \
form/CompressionSelector.js \
form/PoolSelector.js \
form/PrivilegesSelector.js \
diff --git a/www/manager6/form/BandwidthSelector.js b/www/manager6/form/BandwidthSelector.js
new file mode 100644
index 00000000..fa27e560
--- /dev/null
+++ b/www/manager6/form/BandwidthSelector.js
@@ -0,0 +1,128 @@
+Ext.define('PVE.form.BandwidthField', {
+ extend: 'Ext.form.FieldContainer',
+ alias: 'widget.pveBandwidthField',
+
+ mixins: ['Proxmox.Mixin.CBind' ],
+
+ viewModel: {
+ data: {
+ unit: 'MiB',
+ },
+ formulas: {
+ unitlabel: (get) => get('unit') + '/s',
+ }
+ },
+
+ emptyText: '',
+
+ layout: 'hbox',
+ defaults: {
+ hideLabel: true
+ },
+
+ units: {
+ 'KiB': 1024,
+ 'MiB': 1024*1024,
+ 'GiB': 1024*1024*1024,
+ 'KB': 1000,
+ 'MB': 1000*1000,
+ 'GB': 1000*1000*1000,
+ },
+
+ // display unit (TODO: make (optionally) selectable)
+ unit: 'MiB',
+
+ // use this if the backend saves values in another unit tha bytes, e.g.,
+ // for KiB set it to 'KiB'
+ backendUnit: undefined,
+
+ items: [
+ {
+ xtype: 'numberfield',
+ cbind: {
+ name: '{name}',
+ emptyText: '{emptyText}',
+ },
+ minValue: 0,
+ step: 1,
+ submitLocaleSeparator: false,
+ fieldStyle: 'text-align: right',
+ flex: 1,
+ enableKeyEvents: true,
+ setValue: function(v) {
+ if (!this._transformed) {
+ let fieldct = this.up('pveBandwidthField');
+ let vm = fieldct.getViewModel();
+ let unit = vm.get('unit');
+
+ v /= fieldct.units[unit];
+ v *= fieldct.backendFactor;
+
+ this._transformed = true;
+ }
+
+ if (v == 0) v = undefined;
+
+ return Ext.form.field.Text.prototype.setValue.call(this, v);
+ },
+ getSubmitValue: function() {
+ let v = this.processRawValue(this.getRawValue());
+ v = v.replace(this.decimalSeparator, '.')
+
+ if (v === undefined) return v;
+ // FIXME: make it configurable, as this only works if 0 === default
+ if (v == 0 || v == 0.0) return '';
+
+ let fieldct = this.up('pveBandwidthField');
+ let vm = fieldct.getViewModel();
+ let unit = vm.get('unit');
+
+ v = parseFloat(v) * fieldct.units[unit];
+ v /= fieldct.backendFactor;
+
+ return ''+ Math.floor(v);
+ },
+ listeners: {
+ // our setValue gets only called if we have a value, avoid
+ // transformation of the first user-entered value
+ keydown: function () { this._transformed = true; },
+ },
+ },
+ {
+ xtype: 'displayfield',
+ name: 'unit',
+ submitValue: false,
+ padding: '0 0 0 10',
+ bind: {
+ value: '{unitlabel}',
+ },
+ listeners: {
+ change: (f, v) => f.originalValue = v,
+ },
+ width: 40,
+ },
+ ],
+
+ initComponent: function() {
+ let me = this;
+
+ me.unit = me.unit || 'MiB';
+ if (!(me.unit in me.units)) {
+ throw "unknown unit: " + me.unit;
+ }
+
+ me.backendFactor = 1;
+ if (me.backendUnit !== undefined) {
+ if (!(me.unit in me.units)) {
+ throw "unknown backend unit: " + me.backendUnit;
+ }
+ me.backendFactor = me.units[me.backendUnit];
+ }
+
+
+ me.callParent(arguments);
+
+ me.getViewModel().set('unit', me.unit);
+ },
+});
+
--
2.20.1
More information about the pve-devel
mailing list