ui: add Bandwidth selector widget

Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
This commit is contained in:
Thomas Lamprecht 2019-11-27 11:24:46 +01:00
parent 77f410bc03
commit 68932ebcdf
2 changed files with 129 additions and 0 deletions

View File

@ -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 \

View File

@ -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);
},
});