add RRDChart class
This commit is contained in:
parent
1748088d28
commit
0c786d2b08
1
Makefile
1
Makefile
@ -33,6 +33,7 @@ JSSRC= \
|
|||||||
grid/PendingObjectGrid.js \
|
grid/PendingObjectGrid.js \
|
||||||
panel/InputPanel.js \
|
panel/InputPanel.js \
|
||||||
panel/LogView.js \
|
panel/LogView.js \
|
||||||
|
panel/RRDChart.js \
|
||||||
window/Edit.js \
|
window/Edit.js \
|
||||||
window/PasswordEdit.js \
|
window/PasswordEdit.js \
|
||||||
window/TaskViewer.js \
|
window/TaskViewer.js \
|
||||||
|
173
panel/RRDChart.js
Normal file
173
panel/RRDChart.js
Normal file
@ -0,0 +1,173 @@
|
|||||||
|
Ext.define('Proxmox.widget.RRDChart', {
|
||||||
|
extend: 'Ext.chart.CartesianChart',
|
||||||
|
alias: 'widget.proxmoxRRDChart',
|
||||||
|
|
||||||
|
unit: undefined, // bytes, bytespersecond, percent
|
||||||
|
|
||||||
|
controller: {
|
||||||
|
xclass: 'Ext.app.ViewController',
|
||||||
|
|
||||||
|
convertToUnits: function(value) {
|
||||||
|
var units = ['', 'k','M','G','T', 'P'];
|
||||||
|
var si = 0;
|
||||||
|
while(value >= 1000 && si < (units.length -1)){
|
||||||
|
value = value / 1000;
|
||||||
|
si++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// javascript floating point weirdness
|
||||||
|
value = Ext.Number.correctFloat(value);
|
||||||
|
|
||||||
|
// limit to 2 decimal points
|
||||||
|
value = Ext.util.Format.number(value, "0.##");
|
||||||
|
|
||||||
|
return value.toString() + " " + units[si];
|
||||||
|
},
|
||||||
|
|
||||||
|
leftAxisRenderer: function(axis, label, layoutContext) {
|
||||||
|
var me = this;
|
||||||
|
|
||||||
|
return me.convertToUnits(label);
|
||||||
|
},
|
||||||
|
|
||||||
|
onSeriesTooltipRender: function(tooltip, record, item) {
|
||||||
|
var me = this.getView();
|
||||||
|
|
||||||
|
var suffix = '';
|
||||||
|
|
||||||
|
if (me.unit === 'percent') {
|
||||||
|
suffix = '%';
|
||||||
|
} else if (me.unit === 'bytes') {
|
||||||
|
suffix = 'B';
|
||||||
|
} else if (me.unit === 'bytespersecond') {
|
||||||
|
suffix = 'B/s';
|
||||||
|
}
|
||||||
|
|
||||||
|
var prefix = item.field;
|
||||||
|
if (me.fieldTitles && me.fieldTitles[me.fields.indexOf(item.field)]) {
|
||||||
|
prefix = me.fieldTitles[me.fields.indexOf(item.field)];
|
||||||
|
}
|
||||||
|
tooltip.setHtml(prefix + ': ' + this.convertToUnits(record.get(item.field)) + suffix +
|
||||||
|
'<br>' + new Date(record.get('time')));
|
||||||
|
},
|
||||||
|
|
||||||
|
onAfterAnimation: function(chart, eopts) {
|
||||||
|
// if the undobuton is disabled,
|
||||||
|
// disable our tool
|
||||||
|
|
||||||
|
var ourUndoZoomButton = chart.tools[0];
|
||||||
|
var undoButton = chart.interactions[0].getUndoButton();
|
||||||
|
ourUndoZoomButton.setDisabled(undoButton.isDisabled());
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
width: 770,
|
||||||
|
height: 300,
|
||||||
|
animation: false,
|
||||||
|
interactions: [{
|
||||||
|
type: 'crosszoom'
|
||||||
|
}],
|
||||||
|
axes: [{
|
||||||
|
type: 'numeric',
|
||||||
|
position: 'left',
|
||||||
|
grid: true,
|
||||||
|
renderer: 'leftAxisRenderer',
|
||||||
|
//renderer: function(axis, label) { return label; },
|
||||||
|
minimum: 0
|
||||||
|
}, {
|
||||||
|
type: 'time',
|
||||||
|
position: 'bottom',
|
||||||
|
grid: true,
|
||||||
|
fields: ['time']
|
||||||
|
}],
|
||||||
|
legend: {
|
||||||
|
docked: 'bottom'
|
||||||
|
},
|
||||||
|
listeners: {
|
||||||
|
animationend: 'onAfterAnimation'
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
initComponent: function() {
|
||||||
|
var me = this;
|
||||||
|
|
||||||
|
if (!me.store) {
|
||||||
|
throw "cannot work without store";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!me.fields) {
|
||||||
|
throw "cannot work without fields";
|
||||||
|
}
|
||||||
|
|
||||||
|
me.callParent();
|
||||||
|
|
||||||
|
// add correct label for left axis
|
||||||
|
var axisTitle = "";
|
||||||
|
if (me.unit === 'percent') {
|
||||||
|
axisTitle = "%";
|
||||||
|
} else if (me.unit === 'bytes') {
|
||||||
|
axisTitle = "Bytes";
|
||||||
|
} else if (me.unit === 'bytespersecond') {
|
||||||
|
axisTitle = "Bytes/s";
|
||||||
|
}
|
||||||
|
|
||||||
|
me.axes[0].setTitle(axisTitle);
|
||||||
|
|
||||||
|
me.addTool([{
|
||||||
|
type: 'minus',
|
||||||
|
disabled: true,
|
||||||
|
tooltip: gettext('Undo Zoom'),
|
||||||
|
handler: function(){
|
||||||
|
var undoButton = me.interactions[0].getUndoButton();
|
||||||
|
if (undoButton.handler) {
|
||||||
|
undoButton.handler();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},{
|
||||||
|
type: 'restore',
|
||||||
|
tooltip: gettext('Toggle Legend'),
|
||||||
|
handler: function(){
|
||||||
|
me.legend.setVisible(!me.legend.isVisible());
|
||||||
|
}
|
||||||
|
}]);
|
||||||
|
// add a series for each field we get
|
||||||
|
me.fields.forEach(function(item, index){
|
||||||
|
var title = item;
|
||||||
|
if (me.fieldTitles && me.fieldTitles[index]) {
|
||||||
|
title = me.fieldTitles[index];
|
||||||
|
}
|
||||||
|
me.addSeries({
|
||||||
|
type: 'line',
|
||||||
|
xField: 'time',
|
||||||
|
yField: item,
|
||||||
|
title: title,
|
||||||
|
fill: true,
|
||||||
|
style: {
|
||||||
|
lineWidth: 1.5,
|
||||||
|
opacity: 0.60
|
||||||
|
},
|
||||||
|
marker: {
|
||||||
|
opacity: 0,
|
||||||
|
scaling: 0.01,
|
||||||
|
fx: {
|
||||||
|
duration: 200,
|
||||||
|
easing: 'easeOut'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
highlightCfg: {
|
||||||
|
opacity: 1,
|
||||||
|
scaling: 1.5
|
||||||
|
},
|
||||||
|
tooltip: {
|
||||||
|
trackMouse: true,
|
||||||
|
renderer: 'onSeriesTooltipRender'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// enable animation after the store is loaded
|
||||||
|
me.store.onAfter('load', function() {
|
||||||
|
me.setAnimation(true);
|
||||||
|
}, this, {single: true});
|
||||||
|
}
|
||||||
|
});
|
Loading…
Reference in New Issue
Block a user