@visactor/vchart
Version:
charts lib based @visactor/VGrammar
284 lines (260 loc) • 12.5 kB
JavaScript
import { DEFAULT_DATA_SERIES_FIELD } from "../../constant/data";
import { CartesianSeries } from "../cartesian/cartesian";
import { mergeSpec } from "@visactor/vutils-extension";
import { isValid } from "@visactor/vutils";
import { SeriesTypeEnum } from "../interface/type";
import { dataViewParser } from "@visactor/vdataset";
import { registerDataSetInstanceParser, registerDataSetInstanceTransform } from "../../data/register";
import { DotSeriesTooltipHelper } from "./tooltip-helper";
import { copyDataView } from "../../data/transforms/copy-data-view";
import { objFlat } from "../../data/transforms/obj-flat";
import { DEFAULT_GRID_BACKGROUND } from "./config";
import { ColorOrdinalScale } from "../../scale/color-ordinal-scale";
import { registerSymbolMark } from "../../mark/symbol";
import { registerTextMark } from "../../mark/text";
import { registerRuleMark } from "../../mark/rule";
import { registerRectMark } from "../../mark/rect";
import { dotSeriesMark } from "./constant";
import { Factory } from "../../core/factory";
import { TransformLevel } from "../../data/initialize";
import { AttributeLevel } from "../../constant/attribute";
import { dot } from "../../theme/builtin/common/series/dot";
export class DotSeries extends CartesianSeries {
constructor() {
super(...arguments), this.type = SeriesTypeEnum.dot;
}
getSeriesGroupField() {
return this._seriesField;
}
setSeriesGroupField(field) {
isValid(field) && (this._seriesGroupField = field);
}
getTitleField() {
return this._titleField;
}
setTitleField(field) {
isValid(field) && (this._titleField = field);
}
getSubTitleField() {
return this._subTitleField;
}
setSubTitleField(field) {
isValid(field) && (this._subTitleField = field);
}
getDotTypeField() {
return this._dotTypeField;
}
setDotTypeField(field) {
isValid(field) && (this._dotTypeField = field);
}
getHighLightSeriesGroup() {
return this._highLightSeriesGroup;
}
setHighLightSeriesGroup(field) {
isValid(field) && (this._highLightSeriesGroup = field);
}
setGridBackground(gridBackground) {
isValid(gridBackground) && (this._gridBackground = gridBackground);
}
initData() {
var _a;
super.initData(), this._xDimensionStatisticsDomain = this.getRawData().latestData.map((d => d[this._fieldY[0]])),
registerDataSetInstanceTransform(this._option.dataSet, "objFlat", objFlat), registerDataSetInstanceTransform(this._option.dataSet, "copyDataView", copyDataView),
registerDataSetInstanceParser(this._option.dataSet, "dataview", dataViewParser),
null === (_a = this.getViewData()) || void 0 === _a || _a.transform({
type: "objFlat",
options: "dots",
level: TransformLevel.dotObjFlat
}, !1);
}
getStatisticFields() {
return [ {
key: this._fieldY[0],
operations: [ "values" ],
customize: this._xDimensionStatisticsDomain
} ];
}
setAttrFromSpec() {
var _a;
super.setAttrFromSpec(), this.setSeriesGroupField(this._spec.seriesGroupField),
this.setTitleField(this._spec.titleField), this.setSubTitleField(this._spec.subTitleField),
this.setDotTypeField(this._spec.dotTypeField), this.setHighLightSeriesGroup(this._spec.highLightSeriesGroup),
this.setGridBackground(mergeSpec(DEFAULT_GRID_BACKGROUND, (null === (_a = this._spec.grid) || void 0 === _a ? void 0 : _a.background) || {}));
}
initMark() {
this._clipMark = this._createMark(DotSeries.mark.group), this._containerMark = this._createMark(DotSeries.mark.group, {
parent: this._clipMark,
dataView: this.getRawData()
}), this._gridBackgroundMark = this._createMark(DotSeries.mark.gridBackground, {
parent: this._containerMark,
dataView: this.getRawData()
}), this._gridMark = this._createMark(DotSeries.mark.grid, {
parent: this._containerMark,
dataView: this.getRawData()
}), this._dotMark = this._createMark(DotSeries.mark.dot, {
skipBeforeLayouted: !1,
isSeriesMark: !0,
parent: this._containerMark
}), this._titleMark = this._createMark(DotSeries.mark.title, {
parent: this._containerMark,
dataView: this.getRawData()
}), this._subTitleMark = this._createMark(DotSeries.mark.subTitle, {
parent: this._containerMark,
dataView: this.getRawData()
}), this._symbolMark = this._createMark(DotSeries.mark.symbol, {
parent: this._containerMark,
dataView: this.getRawData()
});
}
initMarkStyle() {
const clipMark = this._clipMark;
clipMark && (this.setMarkStyle(clipMark, {
x: -this._spec.leftAppendPadding,
y: 0,
width: 1e4,
height: this._spec.clipHeight
}, "normal", AttributeLevel.Series), clipMark.setMarkConfig({
interactive: !1,
clip: !0
}));
const containerMark = this._containerMark;
containerMark && (this.setMarkStyle(containerMark, {
x: this._spec.leftAppendPadding
}, "normal", AttributeLevel.Series), containerMark.setMarkConfig({
interactive: !1
}));
const gridBackgroundMark = this._gridBackgroundMark;
gridBackgroundMark && this.setMarkStyle(gridBackgroundMark, {
x: this.getRegionRectLeft.bind(this),
x1: this.getRegionRectRight.bind(this),
y: this.dataToGridBackgroundPositionY.bind(this),
y1: this.dataToGridBackgroundPositionY1.bind(this),
fill: this._gridBackground.fill,
fillOpacity: this.dataToGridBackgroundOpacity.bind(this)
}, "normal", AttributeLevel.Series);
const gridMark = this._gridMark;
gridMark && this.setMarkStyle(gridMark, {
stroke: this.getColorAttribute(),
x: this.getRegionRectLeft.bind(this),
y: this.dataToPositionY.bind(this),
x1: this.getRegionRectRight.bind(this),
y1: this.dataToPositionY.bind(this)
}, "normal", AttributeLevel.Series);
const dotMark = this._dotMark;
dotMark && this.setMarkStyle(dotMark, {
x: this.dataToPositionX.bind(this),
y: this.dataToPositionY.bind(this),
fill: this.getDotColorAttribute(),
stroke: this.getDotColorAttribute(),
fillOpacity: this.dataToOpacity.bind(this)
}, "normal", AttributeLevel.Series);
const titleMark = this._titleMark;
titleMark && this.setMarkStyle(titleMark, {
fill: this.getColorAttribute(),
text: datum => datum[this.getTitleField()],
x: this.getRegionRectLeft.bind(this),
y: this.dataToPositionY.bind(this)
}, "normal", AttributeLevel.Series);
const subTitleMark = this._subTitleMark;
subTitleMark && this.setMarkStyle(subTitleMark, {
fill: this.getColorAttribute(),
text: datum => datum[this.getSubTitleField()],
x: this.getRegionRectLeft.bind(this),
y: this.dataToPositionY.bind(this)
}, "normal", AttributeLevel.Series);
const symbolMark = this._symbolMark;
symbolMark && this.setMarkStyle(symbolMark, {
x: this.getRegionRectLeft.bind(this),
y: this.dataToPositionY.bind(this),
fill: this.getColorAttribute()
}, "normal", AttributeLevel.Series);
}
dataToGridBackgroundPositionY(datum) {
if (!this._yAxisHelper) return Number.NaN;
const {dataToPosition: dataToPosition, getBandwidth: getBandwidth} = this._yAxisHelper;
return dataToPosition(this.getDatumPositionValues(datum, this._fieldY), {
bandPosition: this._bandPosition
}) - getBandwidth(0) / 2;
}
dataToGridBackgroundPositionY1(datum) {
if (!this._yAxisHelper) return Number.NaN;
const {dataToPosition: dataToPosition, getBandwidth: getBandwidth} = this._yAxisHelper;
return dataToPosition(this.getDatumPositionValues(datum, this._fieldY), {
bandPosition: this._bandPosition
}) + getBandwidth(0) / 2;
}
dataToOpacity(datum) {
var _a, _b, _c, _d;
if (!this._xAxisHelper) return Number.NaN;
const {dataToPosition: dataToPosition, getScale: getScale} = this._xAxisHelper;
return dataToPosition(this.getDatumPositionValues(datum, this._fieldX), {
bandPosition: this._bandPosition
}) < getScale(0).range()[0] || dataToPosition(this.getDatumPositionValues(datum, this._fieldX), {
bandPosition: this._bandPosition
}) > getScale(0).range()[1] ? 0 : null !== (_d = null === (_c = null === (_b = null === (_a = this._theme) || void 0 === _a ? void 0 : _a.dot) || void 0 === _b ? void 0 : _b.style) || void 0 === _c ? void 0 : _c.fillOpacity) && void 0 !== _d ? _d : 1;
}
dataToGridBackgroundOpacity(datum) {
return datum[this._seriesGroupField] === this._highLightSeriesGroup ? this._gridBackground.fillOpacity : 0;
}
onLayoutEnd() {
var _a, _b;
super.onLayoutEnd();
const layoutOffsetX = null !== (_b = null === (_a = this._spec) || void 0 === _a ? void 0 : _a.leftAppendPadding) && void 0 !== _b ? _b : 0;
this.setMarkStyle(this._clipMark, {
width: this.getLayoutRect().width + layoutOffsetX
}, "normal", AttributeLevel.Series);
}
getDefaultColorDomain() {
var _a, _b;
return this._seriesGroupField ? null === (_a = this.getViewDataStatistics()) || void 0 === _a ? void 0 : _a.latestData[this._seriesGroupField].values : this._seriesField ? null === (_b = this.getViewDataStatistics()) || void 0 === _b ? void 0 : _b.latestData[this._seriesField].values : [];
}
getColorAttribute() {
var _a, _b, _c;
return {
scale: null !== (_a = this._option.globalScale.getScale("color")) && void 0 !== _a ? _a : this._getDefaultColorScale(),
field: null !== (_c = null !== (_b = this._seriesGroupField) && void 0 !== _b ? _b : this._seriesField) && void 0 !== _c ? _c : DEFAULT_DATA_SERIES_FIELD
};
}
getDotColorScale() {
var _a, _b, _c;
const colorDomain = this._dotTypeField ? null === (_a = this.getViewDataStatistics()) || void 0 === _a ? void 0 : _a.latestData[this._dotTypeField].values : this._seriesGroupField ? null === (_b = this.getViewDataStatistics()) || void 0 === _b ? void 0 : _b.latestData[this._seriesGroupField].values : this._seriesField ? null === (_c = this.getViewDataStatistics()) || void 0 === _c ? void 0 : _c.latestData[this._seriesField].values : [], colorRange = this._getDataScheme();
return (new ColorOrdinalScale).domain(colorDomain).range(colorRange);
}
getDotColorAttribute() {
var _a, _b, _c, _d;
return {
scale: null !== (_a = this._option.globalScale.getScale("color")) && void 0 !== _a ? _a : this.getDotColorScale(),
field: null !== (_d = null !== (_c = null !== (_b = this._dotTypeField) && void 0 !== _b ? _b : this._seriesGroupField) && void 0 !== _c ? _c : this._seriesField) && void 0 !== _d ? _d : DEFAULT_DATA_SERIES_FIELD
};
}
initTooltip() {
this._tooltipHelper = new DotSeriesTooltipHelper(this), this._dotMark && this._tooltipHelper.activeTriggerSet.mark.add(this._dotMark);
}
onEvaluateEnd(ctx) {
super.onEvaluateEnd(ctx);
}
onMarkTreePositionUpdate(marks) {
marks.forEach((m => {
m.commit(!1, !0);
}));
}
getDotData() {
var _a;
return null === (_a = this._dotMark) || void 0 === _a ? void 0 : _a.getData();
}
_getDataIdKey() {}
getStackValueField() {
return null;
}
getActiveMarks() {
return [ this._dotMark ];
}
}
DotSeries.type = SeriesTypeEnum.dot, DotSeries.mark = dotSeriesMark, DotSeries.builtInTheme = {
dot: dot
};
export const registerDotSeries = () => {
registerSymbolMark(), registerRuleMark(), registerRectMark(), registerTextMark(),
Factory.registerSeries(DotSeries.type, DotSeries);
};
//# sourceMappingURL=dot.js.map