@visactor/vchart
Version:
charts lib based @visactor/VGrammar
771 lines (742 loc) • 37.3 kB
JavaScript
import { ChartEvent } from "../../constant/event";
import { DEFAULT_DATA_KEY, DEFAULT_DATA_SERIES_FIELD, DEFAULT_SERIES_STYLE_NAME, STACK_FIELD_END, STACK_FIELD_END_PERCENT, STACK_FIELD_START, STACK_FIELD_START_PERCENT } from "../../constant/data";
import { AttributeLevel } from "../../constant/attribute";
import { PREFIX } from "../../constant/base";
import { DataView } from "@visactor/vdataset";
import { BaseModel } from "../../model/base-model";
import { dataToDataView, dataViewFromDataView, updateDataViewInData } from "../../data/initialize";
import { mergeFields, getFieldAlias } from "../../util/data";
import { couldBeValidNumber } from "../../util/type";
import { mergeSpec } from "@visactor/vutils-extension";
import { addVChartProperty } from "../../data/transforms/add-property";
import { registerDataSetInstanceTransform } from "../../data/register";
import { BaseSeriesTooltipHelper } from "./tooltip-helper";
import { dimensionStatistics, dimensionStatisticsOfSimpleData } from "../../data/transforms/dimension-statistics";
import { invalidTravel } from "../../data/transforms/invalid-travel";
import { getDataScheme } from "../../theme/color-scheme/util";
import { addDataKey, initKeyMap } from "../../data/transforms/data-key";
import { STATE_VALUE_ENUM } from "../../compile/mark";
import { array, isEqual, isNil, isValid, isBoolean, isString, isFunction, isArray, isValidNumber, isObject, minInArray, maxInArray, merge } from "@visactor/vutils";
import { ColorOrdinalScale } from "../../scale/color-ordinal-scale";
import { baseSeriesMark, defaultSeriesIgnoreCheckKeys, defaultSeriesCompileCheckKeys } from "./constant";
import { animationConfig, userAnimationConfig, isAnimationEnabledForSeries } from "../../animation/utils";
import { BaseSeriesSpecTransformer } from "./base-series-transformer";
import { getDefaultInteractionConfigByMode } from "../../interaction/config";
import { LayoutZIndex } from "../../constant/layout";
import { CompilableData } from "../../compile/data";
import { filterMarksOfInteraction } from "../../interaction/triggers/util";
export class BaseSeries extends BaseModel {
getRegion() {
return this._region;
}
getLayoutStartPoint() {
return this._region.getLayoutStartPoint();
}
getRootMark() {
return this._rootMark;
}
getSeriesMark() {
return this._seriesMark;
}
getRawData() {
return this._rawData;
}
getViewDataFilter() {
return this._viewDataFilter;
}
getViewData() {
var _a;
return null === (_a = this._data) || void 0 === _a ? void 0 : _a.getDataView();
}
getViewDataProductId() {
var _a;
return null === (_a = this._data) || void 0 === _a ? void 0 : _a.getProductId();
}
getViewDataStatistics() {
return this._viewDataStatistics;
}
getViewStackData() {
return this._viewStackData;
}
getSeriesField() {
return this._seriesField;
}
setSeriesField(field) {
isValid(field) && (this._seriesField = field);
}
getGroups() {
return this._groups;
}
getStack() {
var _a;
return null === (_a = this.getSpecInfo()) || void 0 === _a ? void 0 : _a.stack;
}
getStackValue() {
var _a;
return null !== (_a = this._spec.stackValue) && void 0 !== _a ? _a : `${PREFIX}_series_${this.type}`;
}
getPercent() {
return this._spec.percent;
}
getStackOffsetSilhouette() {
return this._spec.stackOffsetSilhouette;
}
get tooltipHelper() {
return this._tooltipHelper || this.initTooltip(), this._tooltipHelper;
}
getInvalidType() {
return this._invalidType;
}
setInvalidType(t) {
var _a;
this._invalidType = t, null === (_a = this.getViewData()) || void 0 === _a || _a.reRunAllTransform();
}
getMarkAttributeContext() {
return this._markAttributeContext;
}
constructor(spec, options) {
var _a;
super(spec, options), this.specKey = "series", this.type = "series", this.layoutType = "absolute",
this.modelType = "series", this.name = void 0, this.transformerConstructor = BaseSeriesSpecTransformer,
this.coordinate = "none", this._region = null, this._layoutStartPoint = {
x: 0,
y: 0
}, this._layoutRect = {
width: null,
height: null
}, this.getLayoutRect = () => {
var _a, _b;
return {
width: null !== (_a = this._layoutRect.width) && void 0 !== _a ? _a : this._region.getLayoutRect().width,
height: null !== (_b = this._layoutRect.height) && void 0 !== _b ? _b : this._region.getLayoutRect().height
};
}, this._rootMark = null, this._seriesMark = null, this._viewDataMap = new Map,
this._viewDataFilter = null, this._data = null, this.layoutZIndex = LayoutZIndex.SeriesGroup,
this._invalidType = "break", this._region = options.region, this._dataSet = options.dataSet,
(null === (_a = this._spec) || void 0 === _a ? void 0 : _a.name) && (this.name = this._spec.name);
}
created() {
super.created(), this._buildMarkAttributeContext(), this.initData(), this.initGroups(),
this.initStatisticalData(), this.event.emit(ChartEvent.afterInitData, {
model: this
}), this.initRootMark(), this.initMark();
const hasAnimation = isAnimationEnabledForSeries(this);
this._initExtensionMark({
hasAnimation: hasAnimation
}), this.initMarkStyle(), this.initMarkState(), hasAnimation && this.initAnimation(),
this.afterInitMark(), this.initEvent(), this.event.emit(ChartEvent.afterInitEvent, {
model: this
});
}
_buildMarkAttributeContext() {
this._markAttributeContext = {
vchart: this._option.globalInstance,
globalScale: (key, value) => {
var _a;
return null === (_a = this._option.globalScale.getScale(key)) || void 0 === _a ? void 0 : _a.scale(value);
},
seriesColor: seriesValue => {
var _a;
return isNil(seriesValue) && (seriesValue = this.getSeriesKeys()[0]), null === (_a = this._option.globalScale.getScale("color")) || void 0 === _a ? void 0 : _a.scale(seriesValue);
},
getRegion: () => this._region
};
}
setAttrFromSpec() {
super.setAttrFromSpec(), this.setSeriesField(this._spec.seriesField), isValid(this._spec.invalidType) && (this._invalidType = this._spec.invalidType);
}
getInvalidCheckFields() {
return [ this.getStackValueField() ];
}
initInvalidDataTransform() {
var _a, _b;
"zero" === this._invalidType && (null === (_a = this._rawData) || void 0 === _a ? void 0 : _a.dataSet) && (registerDataSetInstanceTransform(this._rawData.dataSet, "invalidTravel", invalidTravel),
null === (_b = this._rawData) || void 0 === _b || _b.transform({
type: "invalidTravel",
options: {
config: () => ({
invalidType: this._invalidType,
checkField: this.getInvalidCheckFields()
})
}
}, !1));
}
initData() {
var _a, _b, _c;
const d = null !== (_a = this._spec.data) && void 0 !== _a ? _a : this._option.getSeriesData(this._spec.dataId, this._spec.dataIndex);
if (d && (this._rawData = dataToDataView(d, this._dataSet, this._option.sourceDataList)),
null === (_c = null === (_b = this._rawData) || void 0 === _b ? void 0 : _b.target) || void 0 === _c || _c.addListener("change", this.rawDataUpdate.bind(this)),
this._addDataIndexAndKey(), this._rawData) {
this.getStack() && (this._viewDataFilter = dataViewFromDataView(this._rawData, this._dataSet, {
name: `${this.type}_${this.id}_viewDataFilter`
}));
const viewData = dataViewFromDataView(this.getStack() ? this._viewDataFilter : this._rawData, this._dataSet, {
name: `${this.type}_${this.id}_viewData`
});
this._data = new CompilableData(this._option, viewData), this.getStack() && this._viewDataFilter.target.removeListener("change", viewData.reRunAllTransform);
}
this.initInvalidDataTransform();
}
initGroups() {
const groupFields = this.getGroupFields();
groupFields && groupFields.length && (this._groups = {
fields: groupFields
});
}
initStatisticalData() {
this._data && this._statisticViewData();
}
getRawDataStatisticsByField(field, isNumeric) {
var _a, _b, _c;
if (this._rawStatisticsCache || (this._rawStatisticsCache = {}), !this._rawStatisticsCache[field] || isNumeric && (isNil(this._rawStatisticsCache[field].min) || isNil(this._rawStatisticsCache[field].max)) || !isNumeric && isNil(this._rawStatisticsCache[field].values)) {
if (this._viewDataStatistics && (!this._viewDataFilter || this._viewDataFilter.transformsArr.length <= 1) && this.getViewData().transformsArr.length <= 1 && (null === (_a = this._viewDataStatistics.latestData) || void 0 === _a ? void 0 : _a[field])) this._rawStatisticsCache[field] = this._viewDataStatistics.latestData[field]; else if (this._rawData) {
const fieldInfo = null === (_b = this._rawData.getFields()) || void 0 === _b ? void 0 : _b[field];
if (fieldInfo && fieldInfo.lockStatisticsByDomain && fieldInfo.domain) this._rawStatisticsCache[field] = {},
isNumeric ? (this._rawStatisticsCache[field].min = minInArray(fieldInfo.domain),
this._rawStatisticsCache[field].max = maxInArray(fieldInfo.domain)) : this._rawStatisticsCache[field].values = fieldInfo.domain; else {
const result = dimensionStatisticsOfSimpleData(this._rawData.latestData, [ {
key: field,
operations: isNumeric ? [ "min", "max" ] : [ "values" ]
} ])[field];
this._rawStatisticsCache[field] = merge(null !== (_c = this._rawStatisticsCache[field]) && void 0 !== _c ? _c : {}, result);
}
}
}
return this._rawStatisticsCache[field];
}
_statisticViewData() {
registerDataSetInstanceTransform(this._dataSet, "dimensionStatistics", dimensionStatistics);
const viewDataStatisticsName = `${this.type}_${this.id}_viewDataStatic`;
this._viewDataStatistics = new DataView(this._dataSet, {
name: viewDataStatisticsName
}), this._viewDataStatistics.parse([ this._data.getDataView() ], {
type: "dataview"
}), this._viewDataStatistics.transform({
type: "dimensionStatistics",
options: {
fields: () => {
const fields = this.getStatisticFields();
return this._seriesField && mergeFields(fields, [ {
key: this._seriesField,
operations: [ "values" ]
} ]), fields;
},
target: "latest"
}
}, !1), this._data.getDataView().target.removeListener("change", this._viewDataStatistics.reRunAllTransform),
this.getStack() && this.createdStackData();
}
createStatisticalData(dataName, rawData, staticFields) {
registerDataSetInstanceTransform(this._dataSet, "dimensionStatistics", dimensionStatistics);
const data = new DataView(this._dataSet, {
name: dataName
});
return data.parse([ rawData ], {
type: "dataview"
}), data.transform({
type: "dimensionStatistics",
options: {
operations: [ "max", "min", "values" ],
fields: () => {
var _a;
const fields = mergeFields(this.getStatisticFields(), null !== (_a = null == staticFields ? void 0 : staticFields(rawData.name)) && void 0 !== _a ? _a : []);
return this._seriesField && mergeFields(fields, [ {
key: this._seriesField,
operations: [ "values" ]
} ]), fields;
},
target: "latest"
}
}, !1), data;
}
createdStackData() {
const dataName = `${this.type}_${this.id}_viewStackData`;
this._viewStackData = new DataView(this._dataSet, {
name: dataName
}), this._viewStackData.parse([ this._viewDataFilter ], {
type: "dataview"
}), this._viewStackData.transform({
type: "stackSplit",
options: {
fields: this.getStackGroupFields()
}
}, !1);
}
_noAnimationDataKey(datum, index) {
return index;
}
generateDefaultDataKey(dataKey) {
var _a;
return isNil(dataKey) ? (datum, index, context) => {
if (!1 === this._spec.animation) {
const v = this._noAnimationDataKey(datum, index);
if (void 0 !== v) return v;
}
const {keyMap: keyMap} = context, seriesDataKey = this._getSeriesDataKey(datum);
return void 0 === keyMap.get(seriesDataKey) ? (keyMap.set(seriesDataKey, 0), seriesDataKey) : (keyMap.set(seriesDataKey, keyMap.get(seriesDataKey) + 1),
`${seriesDataKey}_${keyMap.get(seriesDataKey)}`);
} : isString(dataKey) ? datum => datum[dataKey] : isArray(dataKey) && dataKey.every((d => isString(d))) ? datum => dataKey.map((k => datum[k])).join("-") : isFunction(dataKey) ? (datum, index) => dataKey(datum, index) : (null === (_a = this._option) || void 0 === _a || _a.onError(`invalid dataKey: ${dataKey}`),
(datum, index) => {});
}
_addDataIndexAndKey() {
var _a;
(null === (_a = this._rawData) || void 0 === _a ? void 0 : _a.dataSet) && (registerDataSetInstanceTransform(this._rawData.dataSet, "addVChartProperty", addVChartProperty),
this._rawData.transform({
type: "addVChartProperty",
options: {
beforeCall: initKeyMap.bind(this),
call: addDataKey
}
}, !1));
}
updateRawData(d) {
this._rawData && this._rawData.updateRawData(d);
}
rawDataUpdate(d) {
var _a;
null === (_a = this._rawDataStatistics) || void 0 === _a || _a.reRunAllTransform(),
this._rawStatisticsCache = null, this.event.emit(ChartEvent.rawDataUpdate, {
model: this
});
}
viewDataFilterOver(d) {
this.event.emit(ChartEvent.viewDataFilterOver, {
model: this
});
}
viewDataUpdate(d) {
var _a;
this.event.emit(ChartEvent.viewDataUpdate, {
model: this
}), null === (_a = this._data) || void 0 === _a || _a.updateData(), this._viewDataStatistics && this._viewDataStatistics.reRunAllTransform();
}
viewDataStatisticsUpdate(d) {
this.event.emit(ChartEvent.viewDataStatisticsUpdate, {
model: this
});
}
getDatumPositionValue(datum, field) {
return !datum || isNil(field) ? null : datum[field];
}
getDatumPositionValues(datum, fields) {
return !datum || isNil(fields) ? [] : isString(fields) ? [ datum[fields] ] : fields.map((f => datum[f]));
}
setValueFieldToStack() {}
setValueFieldToPercent() {}
setValueFieldToStackOffsetSilhouette() {}
initRootMark() {
var _a, _b, _c;
this._rootMark = this._createMark({
type: "group",
name: `seriesGroup_${this.type}_${this.id}`
}, {
parent: null === (_b = (_a = this._region).getGroupMark) || void 0 === _b ? void 0 : _b.call(_a),
dataView: !1
}), this._rootMark.setMarkConfig({
zIndex: null !== (_c = this._spec.zIndex) && void 0 !== _c ? _c : this.layoutZIndex
});
}
_getExtensionMarkNamePrefix() {
return `${this.type}_${this.id}_extensionMark`;
}
_initExtensionMark(options) {
var _a;
this._spec.extensionMark && (null === (_a = this._spec.extensionMark) || void 0 === _a || _a.forEach(((m, i) => {
this._createExtensionMark(m, null, this._getExtensionMarkNamePrefix(), i, options);
})));
}
_createExtensionMark(spec, parentMark, namePrefix, index, options) {
var _a;
const mark = this._createMark({
type: spec.type,
name: isValid(spec.name) ? `${spec.name}` : `${namePrefix}_${index}`
}, {
skipBeforeLayouted: !0,
markSpec: spec,
parent: parentMark,
dataView: !1,
componentType: spec.componentType,
key: spec.dataKey
});
if (mark) {
if (isValid(spec.id) && mark.setUserId(spec.id), options.hasAnimation) {
const config = animationConfig({}, userAnimationConfig(spec.type, spec, this._markAttributeContext));
mark.setAnimationConfig(config);
}
if ("group" === spec.type) namePrefix = `${namePrefix}_${index}`, null === (_a = spec.children) || void 0 === _a || _a.forEach(((s, i) => {
this._createExtensionMark(s, mark, namePrefix, i, options);
})); else if (!(parentMark || isNil(spec.dataId) && isNil(spec.dataIndex))) {
const dataView = this._option.getSeriesData(spec.dataId, spec.dataIndex);
dataView === this._rawData ? mark.setData(this._data) : (mark.setDataView(dataView),
dataView.target.addListener("change", (() => {
mark.getData().updateData();
})));
}
}
}
_updateExtensionMarkSpec() {
var _a;
null === (_a = this._spec.extensionMark) || void 0 === _a || _a.forEach(((spec, i) => {
const mark = this._marks.getMarkWithInfo({
name: isValid(spec.name) ? `${spec.name}` : `${this._getExtensionMarkNamePrefix()}_${i}`
});
mark && (this.initMarkStyleWithSpec(mark, spec), mark.commit(!1, !0));
}));
}
getStackData() {
var _a;
return null === (_a = this._viewStackData) || void 0 === _a ? void 0 : _a.latestData;
}
_parseDefaultInteractionConfig(mainMarks) {
if (!(null == mainMarks ? void 0 : mainMarks.length)) return [];
const defaultConfig = getDefaultInteractionConfigByMode(this._option.mode);
let finalHoverSpec = Object.assign({}, null == defaultConfig ? void 0 : defaultConfig.hover), finalSelectSpec = Object.assign({}, null == defaultConfig ? void 0 : defaultConfig.select);
const hoverSpec = this._spec.hover;
isBoolean(hoverSpec) ? finalHoverSpec.enable = hoverSpec : isObject(hoverSpec) && (finalHoverSpec.enable = !0,
finalHoverSpec = mergeSpec(finalHoverSpec, hoverSpec));
const selectSpec = this._spec.select;
isBoolean(selectSpec) ? finalSelectSpec.enable = selectSpec : isObject(selectSpec) && (finalSelectSpec.enable = !0,
finalSelectSpec = mergeSpec(finalSelectSpec, selectSpec));
const res = [ {
trigger: {
type: "dimension-hover"
},
marks: mainMarks
} ];
if (finalHoverSpec.enable) {
const marks = filterMarksOfInteraction(finalHoverSpec, mainMarks);
marks.length && res.push({
trigger: this._defaultHoverConfig(finalHoverSpec),
marks: marks
});
}
if (finalSelectSpec.enable) {
const marks = filterMarksOfInteraction(finalSelectSpec, mainMarks);
marks.length && res.push({
trigger: this._defaultSelectConfig(finalSelectSpec),
marks: marks
});
}
return res;
}
_defaultHoverConfig(finalHoverSpec) {
return {
type: "element-highlight",
trigger: finalHoverSpec.trigger,
triggerOff: finalHoverSpec.triggerOff,
blurState: STATE_VALUE_ENUM.STATE_HOVER_REVERSE,
highlightState: STATE_VALUE_ENUM.STATE_HOVER
};
}
_defaultSelectConfig(finalSelectSpec) {
const isMultiple = "multiple" === finalSelectSpec.mode, triggerOff = isValid(finalSelectSpec.triggerOff) ? finalSelectSpec.triggerOff : isMultiple ? [ "empty" ] : [ "empty", finalSelectSpec.trigger ];
return {
type: "element-select",
trigger: finalSelectSpec.trigger,
triggerOff: triggerOff,
reverseState: STATE_VALUE_ENUM.STATE_SELECTED_REVERSE,
state: STATE_VALUE_ENUM.STATE_SELECTED,
isMultiple: isMultiple
};
}
_parseInteractionConfig(mainMarks) {
const {interactions: interactions} = this._spec, res = this._parseDefaultInteractionConfig(mainMarks);
return interactions && interactions.length && interactions.forEach((interaction => {
const marks = filterMarksOfInteraction(interaction, this.getMarks());
marks.length && res.push({
trigger: interaction,
marks: marks
});
})), res;
}
getInteractionTriggers() {
if (!0 !== this._option.disableTriggerEvent) {
const marks = this.getMarksWithoutRoot();
return this._parseInteractionConfig(marks);
}
return [];
}
initAnimation() {}
initMarkState() {
this.initSeriesStyleState();
}
initSeriesStyleState() {
var _a;
const seriesStyle = this._spec.seriesStyle;
if (!seriesStyle || !seriesStyle.length) return;
const groupBy = null !== (_a = this._seriesField) && void 0 !== _a ? _a : DEFAULT_DATA_SERIES_FIELD;
this.getMarksWithoutRoot().forEach((mark => {
const filterMap = {}, attrMap = {}, markStyle = {};
seriesStyle.forEach((item => {
var _a;
const style = null === (_a = item[mark.name]) || void 0 === _a ? void 0 : _a.style;
style && (filterMap[item.name] = !0, markStyle[item.name] = markStyle[item.name] || {},
Object.keys(style).forEach((key => {
attrMap[key] = !0, markStyle[item.name][key] = style[key];
})));
})), mark.state.addStateInfo({
stateValue: DEFAULT_SERIES_STYLE_NAME,
level: -1,
filter: datum => Array.isArray(datum) ? 0 !== datum.length && !0 === filterMap[datum[0][groupBy]] : !0 === filterMap[datum[groupBy]]
});
const style = {};
Object.keys(attrMap).forEach((key => {
style[key] = datum => {
var _a, _b;
let style;
if (Array.isArray(datum)) {
if (0 === datum.length) return;
style = null === (_a = markStyle[datum[0][groupBy]]) || void 0 === _a ? void 0 : _a[key];
}
return style = null === (_b = markStyle[datum[groupBy]]) || void 0 === _b ? void 0 : _b[key],
isValid(style) ? style : mark.getAttribute(key, datum);
};
})), this.setMarkStyle(mark, style, DEFAULT_SERIES_STYLE_NAME, AttributeLevel.User_SeriesStyle);
}));
}
afterInitMark() {
this.event.emit(ChartEvent.afterInitMark, {
model: this
}), this.setSeriesField(this._spec.seriesField), this.getMarks().forEach((m => {
var _a, _b;
(null === (_b = null === (_a = m.stateStyle) || void 0 === _a ? void 0 : _a.normal) || void 0 === _b ? void 0 : _b.lineWidth) && m.setAttribute("stroke", this.getColorAttribute(), "normal", AttributeLevel.Base_Series);
}));
}
getMarksWithoutRoot() {
return this.getMarks().filter((m => {
var _a;
return !(null === (_a = m.name) || void 0 === _a ? void 0 : _a.includes("seriesGroup"));
}));
}
getMarksInType(type) {
return this._marks.getMarksInType(type);
}
getMarkInName(name) {
return this._marks.get(name);
}
getMarkInId(markId) {
return this.getMarks().find((m => m.id === markId));
}
initEvent() {
var _a, _b, _c;
null === (_b = null === (_a = this._data) || void 0 === _a ? void 0 : _a.getDataView()) || void 0 === _b || _b.target.addListener("change", this.viewDataUpdate.bind(this)),
null === (_c = this._viewDataStatistics) || void 0 === _c || _c.target.addListener("change", this.viewDataStatisticsUpdate.bind(this));
}
_releaseEvent() {
super._releaseEvent();
}
initTooltip() {
this._tooltipHelper = new BaseSeriesTooltipHelper(this);
}
_compareExtensionMarksSpec(newMarks, prevMarks, compareResult) {
newMarks.length !== prevMarks.length || prevMarks.some(((prev, index) => prev.type !== newMarks[index].type || prev.id !== newMarks[index].id || prev.name !== newMarks[index].name)) ? compareResult.reMake = !0 : prevMarks.some(((prev, index) => prev.visible !== newMarks[index].visible)) && (compareResult.reCompile = !0);
}
_compareLabelSpec(newLabels, prevLabels, compareResult) {
newLabels.length !== prevLabels.length || prevLabels.some(((prev, index) => prev.labelLayout !== newLabels[index].labelLayout || prev.visible !== newLabels[index].visible)) ? compareResult.reMake = !0 : !compareResult.reCompile && prevLabels.some(((prev, index) => !isEqual(prev, newLabels[index]))) && (compareResult.reCompile = !0);
}
_compareSpec(spec, prevSpec, ignoreCheckKeys) {
const result = super._compareSpec(spec, prevSpec), currentKeys = Object.keys(prevSpec || {}).sort(), nextKeys = Object.keys(spec || {}).sort();
if (!isEqual(currentKeys, nextKeys)) return result.reMake = !0, result;
const ignores = Object.assign(Object.assign(Object.assign(Object.assign({}, defaultSeriesIgnoreCheckKeys), defaultSeriesCompileCheckKeys), ignoreCheckKeys), {
extensionMark: !0,
label: !0,
totalLabel: !0
});
return this._compareExtensionMarksSpec(array(spec.extensionMark), array(prevSpec.extensionMark), result),
!result.reMake && this._compareLabelSpec(array(spec.label), array(prevSpec.label), result),
!result.reMake && this._compareLabelSpec(array(spec.totalLabel), array(prevSpec.totalLabel), result),
result.reMake ? result : (!result.reCompile && this._marks.getMarks().some((m => {
var _a, _b;
return ignores[m.name] = !0, (null === (_a = prevSpec[m.name]) || void 0 === _a ? void 0 : _a.visible) !== (null === (_b = spec[m.name]) || void 0 === _b ? void 0 : _b.visible);
})) && (result.reCompile = !0), !result.reCompile && currentKeys.some((k => defaultSeriesCompileCheckKeys[k] && !isEqual(spec[k], prevSpec[k]))) && (result.reCompile = !0),
currentKeys.some((k => !ignores[k] && !isEqual(spec[k], prevSpec[k]))) ? (result.reMake = !0,
result) : result);
}
_updateSpecData() {
!this._rawData || !this._spec.data || this._spec.data instanceof DataView || updateDataViewInData(this._rawData, this._spec.data, !0);
}
reInit(spec) {
super.reInit(spec);
const marks = this.getMarksWithoutRoot();
marks.forEach((mark => {
this._spec[mark.name] && this.initMarkStyleWithSpec(mark, this._spec[mark.name]);
})), this.initMarkStyle(), marks.forEach((mark => {
mark.commit(!1);
})), this._updateExtensionMarkSpec(), this._updateSpecData(), this._tooltipHelper && this._tooltipHelper.updateTooltipSpec();
isAnimationEnabledForSeries(this) && this.initAnimation();
}
onEvaluateEnd(ctx) {
this._data.updateData();
}
release() {
var _a, _b;
super.release(), this._viewDataMap.clear();
const transformIndex = null === (_b = null === (_a = this._rawData) || void 0 === _a ? void 0 : _a.transformsArr) || void 0 === _b ? void 0 : _b.findIndex((t => "addVChartProperty" === t.type));
transformIndex >= 0 && this._rawData.transformsArr.splice(transformIndex, 1), this._dataSet = this._data = this._rawData = this._rawDataStatistics = this._spec = this._region = this._viewDataStatistics = this._viewStackData = null;
}
setLayoutStartPosition(pos) {
isValidNumber(pos.x) && (this._layoutStartPoint.x = pos.x), isValidNumber(pos.y) && (this._layoutStartPoint.y = pos.y);
}
setLayoutRect({width: width, height: height}, levelMap) {
isValidNumber(width) && (this._layoutRect.width = width), isValidNumber(height) && (this._layoutRect.height = height);
}
getSeriesKeys() {
var _a, _b;
return this._seriesField ? null !== (_b = null === (_a = this.getRawDataStatisticsByField(this._seriesField)) || void 0 === _a ? void 0 : _a.values) && void 0 !== _b ? _b : [] : this.name ? [ this.name ] : this.userId ? [ `${this.userId}` ] : [ `${this.type}_${this.id}` ];
}
getSeriesStyle(datum) {
return attribute => {
var _a, _b;
return null !== (_b = null === (_a = this._seriesMark) || void 0 === _a ? void 0 : _a.getAttribute(attribute, datum)) && void 0 !== _b ? _b : void 0;
};
}
_getSeriesInfo(field, keys) {
const defaultShapeType = this.getDefaultShapeType();
return keys.map((key => ({
key: key,
originalKey: key,
style: this.getSeriesStyle({
[field]: key
}),
shapeType: defaultShapeType
})));
}
getSeriesInfoInField(field) {
var _a, _b;
return this._getSeriesInfo(field, null !== (_b = null === (_a = this.getRawDataStatisticsByField(field)) || void 0 === _a ? void 0 : _a.values) && void 0 !== _b ? _b : []);
}
getSeriesInfoList() {
var _a;
return this._getSeriesInfo(null !== (_a = this._seriesField) && void 0 !== _a ? _a : DEFAULT_DATA_SERIES_FIELD, this.getSeriesKeys());
}
_getDefaultColorScale() {
var _a, _b;
const colorDomain = this.getDefaultColorDomain(), colorRange = this._getDataScheme();
return null === (_b = (_a = (new ColorOrdinalScale).domain(colorDomain)).range) || void 0 === _b ? void 0 : _b.call(_a, colorRange);
}
_getDataScheme() {
return getDataScheme(this.getColorScheme(), this.type);
}
getDefaultColorDomain() {
var _a, _b;
return this._seriesField ? null === (_b = null === (_a = this.getViewDataStatistics()) || void 0 === _a ? void 0 : _a.latestData[this._seriesField]) || void 0 === _b ? void 0 : _b.values : [];
}
getColorAttribute() {
var _a, _b;
return {
scale: null !== (_a = this._option.globalScale.getScale("color")) && void 0 !== _a ? _a : this._getDefaultColorScale(),
field: null !== (_b = this._seriesField) && void 0 !== _b ? _b : DEFAULT_DATA_SERIES_FIELD
};
}
getDimensionField() {
return [];
}
getMeasureField() {
return [];
}
onMarkPositionUpdate() {
this.onMarkTreePositionUpdate(this.getMarksWithoutRoot());
}
onMarkTreePositionUpdate(marks) {}
_createMark(markInfo, option = {}, config = {}) {
var _a, _b, _c, _d, _e;
const {key: key, groupKey: groupKey, skipBeforeLayouted: skipBeforeLayouted, themeSpec: themeSpec = {}, markSpec: markSpec, dataView: dataView, parent: parent, isSeriesMark: isSeriesMark, noSeparateStyle: noSeparateStyle = !1} = option, m = super._createMark(markInfo, {
key: null != key ? key : this._getDataIdKey(),
seriesId: this.id,
attributeContext: this._markAttributeContext,
componentType: option.componentType,
noSeparateStyle: noSeparateStyle,
parent: !1 !== parent ? null != parent ? parent : this._rootMark : null
});
if (isValid(m)) {
const spec = this.getSpec() || {};
this._marks.addMark(m, {
name: markInfo.name
}), isSeriesMark && (this._seriesMark = m), isNil(dataView) ? (m.setData(this._data),
m.setSkipBeforeLayouted(!0)) : !1 !== dataView && m.setDataView(dataView), isBoolean(skipBeforeLayouted) && m.setSkipBeforeLayouted(skipBeforeLayouted),
isNil(groupKey) || m.setGroupKey(groupKey);
const markConfig = Object.assign(Object.assign({}, config), {
progressiveStep: spec.progressiveStep,
progressiveThreshold: spec.progressiveThreshold,
large: spec.large,
largeThreshold: spec.largeThreshold,
morph: null !== (_a = config.morph) && void 0 !== _a && _a,
useSequentialAnimation: spec.useSequentialAnimation,
support3d: null !== (_b = config.support3d) && void 0 !== _b ? _b : spec.support3d || !!spec.zField,
morphKey: (null === (_c = spec.morph) || void 0 === _c ? void 0 : _c.morphKey) || `${this.getSpecIndex()}_${this.getMarks().length}`,
morphElementKey: null !== (_e = null === (_d = spec.morph) || void 0 === _d ? void 0 : _d.morphElementKey) && void 0 !== _e ? _e : config.morphElementKey
});
m.setMarkConfig(markConfig), this.initMarkStyleWithSpec(m, mergeSpec({}, themeSpec, markSpec || spec[m.name]));
}
return m;
}
_getDataIdKey() {
var _a;
return null !== (_a = super._getDataIdKey()) && void 0 !== _a ? _a : DEFAULT_DATA_KEY;
}
_getSeriesDataKey(datum) {
let key = "";
if (!datum) return key;
const dimensionFields = this.getDimensionField();
key = dimensionFields.map((field => datum[field])).join("_");
const seriesField = this.getSeriesField();
return seriesField && !dimensionFields.includes(seriesField) && (key += `_${datum[seriesField]}`),
key;
}
addViewDataFilter(option) {
var _a, _b;
null === (_b = null !== (_a = this._viewDataFilter) && void 0 !== _a ? _a : this.getViewData()) || void 0 === _b || _b.transform(option, !1);
}
reFilterViewData() {
var _a, _b;
null === (_b = null !== (_a = this._viewDataFilter) && void 0 !== _a ? _a : this.getViewData()) || void 0 === _b || _b.reRunAllTransform();
}
reTransformViewData() {
var _a, _b;
null === (_b = null === (_a = this._data) || void 0 === _a ? void 0 : _a.getDataView()) || void 0 === _b || _b.reRunAllTransform();
}
fillData() {
var _a;
null === (_a = this.getRawData()) || void 0 === _a || _a.reRunAllTransform();
}
compile() {
this.compileData();
}
getDefaultShapeType() {
return "circle";
}
getFieldAlias(field) {
var _a;
return field !== STACK_FIELD_END && field !== STACK_FIELD_END_PERCENT && field !== STACK_FIELD_START && field !== STACK_FIELD_START_PERCENT || (field = this.getStackValueField()),
null !== (_a = getFieldAlias(this.getRawData(), field)) && void 0 !== _a ? _a : field;
}
_getInvalidConnectType() {
return "zero" === this._invalidType ? "zero" : "link" === this._invalidType ? "connect" : "none";
}
_getInvalidDefined(datum) {
const checkFields = this.getInvalidCheckFields();
return !checkFields.length || checkFields.every((field => couldBeValidNumber(datum[field])));
}
_getRelatedComponentSpecInfo(specKey) {
var _a;
const specIndex = this.getSpecIndex(), relatedComponent = null === (_a = this._option.getSpecInfo().component[specKey]) || void 0 === _a ? void 0 : _a.filter((componentInfo => componentInfo.seriesIndexes.includes(specIndex)));
return null != relatedComponent ? relatedComponent : [];
}
_forEachStackGroup(callback, node) {
var _a, _b;
(node = null != node ? node : null === (_a = this._viewStackData) || void 0 === _a ? void 0 : _a.latestData) && ((null === (_b = node.values) || void 0 === _b ? void 0 : _b.length) ? callback(node) : node.nodes && Object.values(node.nodes).forEach((n => {
this._forEachStackGroup(callback, n);
})));
}
isDatumInViewData(datum) {
if (!datum) return !1;
const viewDataList = this.getViewData().latestData;
return !!viewDataList && (!!viewDataList.includes(datum) || viewDataList.some((viewDatum => Object.keys(datum).every((key => datum[key] === viewDatum[key])))));
}
getSeriesFieldValue(datum, seriesField) {
var _a;
return datum[null !== (_a = null != seriesField ? seriesField : this.getSeriesField()) && void 0 !== _a ? _a : DEFAULT_DATA_SERIES_FIELD];
}
}
BaseSeries.mark = baseSeriesMark, BaseSeries.transformerConstructor = BaseSeriesSpecTransformer;
//# sourceMappingURL=base-series.js.map