devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
358 lines (302 loc) • 12.4 kB
JavaScript
var _Number = Number,
_getAppropriateFormat = require("../core/utils").getAppropriateFormat,
extend = require("../../core/utils/extend").extend,
translator1DModule = require("../translators/translator1d"),
_extend = extend,
BaseWidget = require("../core/base_widget"),
_normalizeEnum = require("../core/utils").normalizeEnum,
Tracker = require("./tracker"),
_isString = require("../../core/utils/type").isString;
var dxBaseGauge = BaseWidget.inherit({
_rootClassPrefix: "dxg",
_createThemeManager: function _createThemeManager() {
return new this._factory.ThemeManager();
},
_setDeprecatedOptions: function _setDeprecatedOptions() {
this.callBase();
_extend(this._deprecatedOptions, {
subtitle: {
since: '15.2',
message: "Use the 'title.subtitle' option instead"
},
"title.position": {
since: "15.2",
message: "Use the 'verticalAlignment' and 'horizontalAlignment' options instead"
},
"scale.hideFirstTick": {
since: "15.2",
message: "The functionality is not more available"
},
"scale.hideLastTick": {
since: "15.2",
message: "The functionality is not more available"
},
"scale.hideFirstLabel": {
since: "15.2",
message: "The functionality is not more available"
},
"scale.hideLastLabel": {
since: "15.2",
message: "The functionality is not more available"
},
"scale.majorTick": {
since: "15.2",
message: "Use the 'tick' option instead"
},
"scale.minorTick.showCalculatedTicks": {
since: "15.2",
message: "The functionality is not more available"
},
"scale.minorTick.customTickValues": {
since: "15.2",
message: "Use the 'customMinorTicks' option instead"
},
"scale.minorTick.tickInterval": {
since: "15.2",
message: "Use the 'minorTickInterval' option instead"
},
"scale.label.overlappingBehavior.useAutoArrangement": {
since: "17.1",
message: "Use the 'scale.label.overlappingBehavior' option instead"
},
"scale.label.overlappingBehavior.hideFirstOrLast": {
since: "17.1",
message: "Use the 'scale.label.hideFirstOrLast' option instead"
}
});
},
_initCore: function _initCore() {
var that = this,
root = that._renderer.root;
that._valueChangingLocker = 0;
that._translator = that._factory.createTranslator();
that._tracker = that._factory.createTracker({ renderer: that._renderer, container: root });
that._setTrackerCallbacks();
},
_beginValueChanging: function _beginValueChanging() {
this._resetIsReady();
++this._valueChangingLocker;
},
_endValueChanging: function _endValueChanging() {
if (--this._valueChangingLocker === 0) {
this._drawn();
}
},
_setTrackerCallbacks: function _setTrackerCallbacks() {
var that = this,
renderer = that._renderer,
tooltip = that._tooltip;
that._tracker.setCallbacks({
'tooltip-show': function tooltipShow(target, info) {
var tooltipParameters = target.getTooltipParameters(),
offset = renderer.getRootOffset(),
formatObject = _extend({
value: tooltipParameters.value,
valueText: tooltip.formatValue(tooltipParameters.value),
color: tooltipParameters.color
}, info);
return tooltip.show(formatObject, {
x: tooltipParameters.x + offset.left,
y: tooltipParameters.y + offset.top,
offset: tooltipParameters.offset
}, { target: info });
},
'tooltip-hide': function tooltipHide() {
return tooltip.hide();
}
});
},
_dispose: function _dispose() {
this._cleanCore();
this.callBase.apply(this, arguments);
},
_disposeCore: function _disposeCore() {
var that = this;
that._themeManager.dispose();
that._tracker.dispose();
that._translator = that._tracker = null;
},
_cleanCore: function _cleanCore() {
var that = this;
that._tracker.deactivate();
that._cleanContent();
},
_renderCore: function _renderCore() {
var that = this;
if (!that._isValidDomain) return;
that._renderContent();
that._tracker.setTooltipState(that._tooltip.isEnabled());
that._tracker.activate();
that._noAnimation = false;
///#DEBUG
that._debug_rendered && that._debug_rendered();
///#ENDDEBUG
},
_applyChanges: function _applyChanges() {
this.callBase.apply(this, arguments);
this._resizing = this._noAnimation = false;
},
_setContentSize: function _setContentSize() {
var that = this;
that._resizing = that._noAnimation = that._changes.count() === 2;
that.callBase.apply(that, arguments);
},
_applySize: function _applySize(rect) {
var that = this;
///#DEBUG
that._DEBUG_rootRect = rect;
///#ENDDEBUG
that._innerRect = { left: rect[0], top: rect[1], right: rect[2], bottom: rect[3] };
// If loading indicator is shown it is got hidden at the end of "_renderCore" - during "_drawn". Then "loadingIndicator" option is changed.
// It causes another "_setContentSize" execution (inside of the first one). Layout backwards during inner "_setContentSize" and clears its cache and
// then backwards again during outer "_setContentSize" when "_cache" is null - so it fails.
// The following code dirtily preserves layout cache for the outer backward.
// The appropriate solution is to remove heavy rendering from "_applySize" - it should be done later during some other change processing.
// It would be even better to somehow defer any inside option changes - so they all are applied after all changes are processed.
var layoutCache = that._layout._cache;
that._cleanCore();
that._renderCore();
that._layout._cache = that._layout._cache || layoutCache;
return [rect[0], that._innerRect.top, rect[2], that._innerRect.bottom];
},
_initialChanges: ["DOMAIN"],
_themeDependentChanges: ["DOMAIN"],
_optionChangesMap: {
subtitle: "MOSTLY_TOTAL",
indicator: "MOSTLY_TOTAL",
geometry: "MOSTLY_TOTAL",
animation: "MOSTLY_TOTAL",
startValue: "DOMAIN",
endValue: "DOMAIN"
},
_optionChangesOrder: ["DOMAIN", "MOSTLY_TOTAL"],
_change_DOMAIN: function _change_DOMAIN() {
this._setupDomain();
},
_change_MOSTLY_TOTAL: function _change_MOSTLY_TOTAL() {
this._applyMostlyTotalChange();
},
_setupDomain: function _setupDomain() {
var that = this;
that._setupDomainCore();
// T130599
that._isValidDomain = isFinite(1 / (that._translator.getDomain()[1] - that._translator.getDomain()[0]));
if (!that._isValidDomain) {
that._incidentOccurred("W2301");
}
that._change(["MOSTLY_TOTAL"]);
},
_applyMostlyTotalChange: function _applyMostlyTotalChange() {
var that = this;
that._setupCodomain();
that._setupAnimationSettings();
that._setupDefaultFormat();
that._change(["LAYOUT"]);
},
_setupAnimationSettings: function _setupAnimationSettings() {
var that = this,
option = that.option("animation");
that._animationSettings = null;
if (option === undefined || option) {
option = _extend({
enabled: true,
duration: 1000,
easing: "easeOutCubic"
}, option);
if (option.enabled && option.duration > 0) {
that._animationSettings = { duration: _Number(option.duration), easing: option.easing };
}
}
// It is better to place it here than to create separate function for one line of code
that._containerBackgroundColor = that.option("containerBackgroundColor") || that._themeManager.theme().containerBackgroundColor;
},
_setupDefaultFormat: function _setupDefaultFormat() {
var domain = this._translator.getDomain();
this._defaultFormatOptions = _getAppropriateFormat(domain[0], domain[1], this._getApproximateScreenRange());
},
_setupDomainCore: null,
_calculateSize: null,
_cleanContent: null,
_renderContent: null,
_setupCodomain: null,
_getApproximateScreenRange: null,
_factory: {
createTranslator: function createTranslator() {
return new translator1DModule.Translator1D();
},
createTracker: function createTracker(parameters) {
return new Tracker(parameters);
}
}
});
exports.dxBaseGauge = dxBaseGauge;
var _format = require("../core/format");
// TODO: find a better place for it
var formatValue = function formatValue(value, options, extra) {
options = options || {};
var text = _format(value, options),
formatObject;
if (typeof options.customizeText === "function") {
formatObject = _extend({ value: value, valueText: text }, extra);
return String(options.customizeText.call(formatObject, formatObject));
}
return text;
};
// TODO: find a better place for it
var getSampleText = function getSampleText(translator, options) {
var text1 = formatValue(translator.getDomainStart(), options),
text2 = formatValue(translator.getDomainEnd(), options);
return text1.length >= text2.length ? text1 : text2;
};
exports.formatValue = formatValue;
exports.getSampleText = getSampleText;
exports.compareArrays = function (array1, array2) {
return array1 && array2 && array1.length === array2.length && compareArraysElements(array1, array2);
};
function compareArraysElements(array1, array2) {
var i,
ii = array1.length,
array1ValueIsNaN,
array2ValueIsNaN;
for (i = 0; i < ii; ++i) {
array1ValueIsNaN = array1[i] !== array1[i];
array2ValueIsNaN = array2[i] !== array2[i];
if (array1ValueIsNaN && array2ValueIsNaN) {
continue;
}
if (array1[i] !== array2[i]) return false;
}
return true;
}
// PLUGINS_SECTION
dxBaseGauge.addPlugin(require("../core/export").plugin);
dxBaseGauge.addPlugin(require("../core/title").plugin);
dxBaseGauge.addPlugin(require("../core/tooltip").plugin);
dxBaseGauge.addPlugin(require("../core/loading_indicator").plugin);
// These are gauges specifics on using tooltip - they require refactoring.
var _setTooltipOptions = dxBaseGauge.prototype._setTooltipOptions;
dxBaseGauge.prototype._setTooltipOptions = function () {
_setTooltipOptions.apply(this, arguments);
this._tracker && this._tracker.setTooltipState(this._tooltip.isEnabled());
};
// DEPRECATED_15_2
function processTitleOptions(options) {
return _isString(options) ? { text: options } : options || {};
}
dxBaseGauge.prototype._getTitleOptions = function () {
var that = this,
titleOptions = processTitleOptions(that.option("title")),
options,
position;
that._suppressDeprecatedWarnings();
titleOptions.subtitle = extend(processTitleOptions(titleOptions.subtitle), processTitleOptions(that.option("subtitle")));
that._resumeDeprecatedWarnings();
options = _extend(true, {}, that._themeManager.theme("title"), titleOptions);
if (options.position) {
position = _normalizeEnum(options.position).split('-');
options.verticalAlignment = position[0];
options.horizontalAlignment = position[1];
}
return options;
};
;