devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
208 lines (207 loc) • 9.6 kB
JavaScript
/**
* DevExtreme (cjs/viz/components/chart_theme_manager.js)
* Version: 24.2.6
* Build date: Mon Mar 17 2025
*
* Copyright (c) 2012 - 2025 Developer Express Inc. ALL RIGHTS RESERVED
* Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
*/
"use strict";
exports.ThemeManager = void 0;
var _common = require("../../core/utils/common");
var _type = require("../../core/utils/type");
var _extend = require("../../core/utils/extend");
var _base_theme_manager = require("../core/base_theme_manager");
var _utils = require("../core/utils");
const ThemeManager = exports.ThemeManager = _base_theme_manager.BaseThemeManager.inherit(function() {
const processAxisOptions = function(axisOptions) {
if (!axisOptions) {
return {}
}
axisOptions = (0, _extend.extend)(true, {}, axisOptions);
axisOptions.title = (options = axisOptions.title, (0, _type.isString)(options) ? {
text: options
} : options);
var options;
if ("logarithmic" === axisOptions.type && axisOptions.logarithmBase <= 0 || axisOptions.logarithmBase && !(0, _type.isNumeric)(axisOptions.logarithmBase)) {
axisOptions.logarithmBase = void 0;
axisOptions.logarithmBaseError = true
}
if (axisOptions.label) {
if (axisOptions.label.alignment) {
axisOptions.label.userAlignment = true
}
}
return axisOptions
};
const applyParticularAxisOptions = function(name, userOptions, rotated) {
const theme = this._theme;
const position = !(rotated ^ "valueAxis" === name) ? "horizontalAxis" : "verticalAxis";
const processedUserOptions = processAxisOptions(userOptions);
const commonAxisSettings = processAxisOptions(this._userOptions.commonAxisSettings);
const mergeOptions = (0, _extend.extend)(true, {}, theme.commonAxisSettings, theme[position], theme[name], commonAxisSettings, processedUserOptions);
mergeOptions.workWeek = processedUserOptions.workWeek || theme[name].workWeek;
mergeOptions.forceUserTickInterval |= (0, _type.isDefined)(processedUserOptions.tickInterval) && !(0, _type.isDefined)(processedUserOptions.axisDivisionFactor);
return mergeOptions
};
const mergeOptions = function(name, userOptions) {
userOptions = userOptions || this._userOptions[name];
const theme = this._theme[name];
let result = this._mergedSettings[name];
if (result) {
return result
}
if ((0, _type.isPlainObject)(theme) && (0, _type.isPlainObject)(userOptions)) {
result = (0, _extend.extend)(true, {}, theme, userOptions)
} else {
result = (0, _type.isDefined)(userOptions) ? userOptions : theme
}
this._mergedSettings[name] = result;
return result
};
const applyParticularTheme = {
base: mergeOptions,
argumentAxis: applyParticularAxisOptions,
valueAxisRangeSelector: function() {
return mergeOptions.call(this, "valueAxis")
},
valueAxis: applyParticularAxisOptions,
series: function(name, userOptions, seriesCount) {
const that = this;
const theme = that._theme;
let userCommonSettings = that._userOptions.commonSeriesSettings || {};
const themeCommonSettings = theme.commonSeriesSettings;
const widgetType = that._themeSection.split(".").slice(-1)[0];
const type = (0, _utils.normalizeEnum)(userOptions.type || userCommonSettings.type || themeCommonSettings.type || "pie" === widgetType && theme.type);
const palette = that.palette;
const isBar = ~type.indexOf("bar");
const isLine = ~type.indexOf("line");
const isArea = ~type.indexOf("area");
const isBubble = "bubble" === type;
let mainSeriesColor;
const resolveLabelsOverlapping = that.getOptions("resolveLabelsOverlapping");
const containerBackgroundColor = that.getOptions("containerBackgroundColor");
const seriesTemplate = applyParticularTheme.seriesTemplate.call(this);
let seriesVisibility;
if (isBar || isBubble) {
userOptions = (0, _extend.extend)(true, {}, userCommonSettings, userCommonSettings[type], userOptions);
seriesVisibility = userOptions.visible;
userCommonSettings = {
type: {}
};
(0, _extend.extend)(true, userOptions, userOptions.point);
userOptions.visible = seriesVisibility
}
const settings = (0, _extend.extend)(true, {
aggregation: {}
}, themeCommonSettings, themeCommonSettings[type], userCommonSettings, userCommonSettings[type], userOptions);
settings.aggregation.enabled = "chart" === widgetType && !!settings.aggregation.enabled;
settings.type = type;
settings.widgetType = widgetType;
settings.containerBackgroundColor = containerBackgroundColor;
if ("pie" !== widgetType) {
mainSeriesColor = (0, _utils.extractColor)(settings.color, true) || palette.getNextColor(seriesCount)
} else {
mainSeriesColor = function(argument, index, count) {
const cat = `${argument}-${index}`;
if (!that._multiPieColors[cat]) {
that._multiPieColors[cat] = palette.getNextColor(count)
}
return that._multiPieColors[cat]
}
}
settings.mainSeriesColor = mainSeriesColor;
settings.resolveLabelsOverlapping = resolveLabelsOverlapping;
if (settings.label && (isLine || isArea && "rangearea" !== type || "scatter" === type)) {
settings.label.position = "outside"
}
if (seriesTemplate) {
settings.nameField = seriesTemplate.nameField
}
return settings
},
animation: function(name) {
let userOptions = this._userOptions[name];
userOptions = (0, _type.isPlainObject)(userOptions) ? userOptions : (0, _type.isDefined)(userOptions) ? {
enabled: !!userOptions
} : {};
return mergeOptions.call(this, name, userOptions)
},
seriesTemplate() {
const value = mergeOptions.call(this, "seriesTemplate");
if (value) {
value.nameField = value.nameField || "series"
}
return value
},
zoomAndPan() {
function parseOption(option) {
option = (0, _utils.normalizeEnum)(option);
const pan = "pan" === option || "both" === option;
const zoom = "zoom" === option || "both" === option;
return {
pan: pan,
zoom: zoom,
none: !pan && !zoom
}
}
const options = mergeOptions.call(this, "zoomAndPan");
return {
valueAxis: parseOption(options.valueAxis),
argumentAxis: parseOption(options.argumentAxis),
dragToZoom: !!options.dragToZoom,
dragBoxStyle: {
class: "dxc-shutter",
fill: options.dragBoxStyle.color,
opacity: options.dragBoxStyle.opacity
},
panKey: options.panKey,
allowMouseWheel: !!options.allowMouseWheel,
allowTouchGestures: !!options.allowTouchGestures
}
}
};
return {
_themeSection: "chart",
ctor: function(params) {
this.callBase.apply(this, arguments);
const options = params.options || {};
this._userOptions = options;
this._mergeAxisTitleOptions = [];
this._multiPieColors = {};
this._callback = _common.noop
},
dispose: function() {
this.palette && this.palette.dispose();
this.palette = this._userOptions = this._mergedSettings = this._multiPieColors = null;
return this.callBase.apply(this, arguments)
},
resetPalette: function() {
this.palette.reset();
this._multiPieColors = {}
},
getOptions: function(name) {
return (applyParticularTheme[name] || applyParticularTheme.base).apply(this, arguments)
},
refresh: function() {
this._mergedSettings = {};
return this.callBase.apply(this, arguments)
},
_initializeTheme: function() {
this.callBase.apply(this, arguments);
this.updatePalette()
},
resetOptions: function(name) {
this._mergedSettings[name] = null
},
update: function(options) {
this._userOptions = options
},
updatePalette: function() {
this.palette = this.createPalette(this.getOptions("palette"), {
useHighlight: true,
extensionMode: this.getOptions("paletteExtensionMode")
})
}
}
}());