@visactor/vchart
Version:
charts lib based @visactor/VGrammar
233 lines (215 loc) • 9.78 kB
JavaScript
import { DEFAULT_DATA_SERIES_FIELD } from "../../constant/data";
import { CartesianSeries } from "../cartesian/cartesian";
import { isValid } from "@visactor/vutils";
import { SeriesTypeEnum } from "../interface/type";
import { registerDataSetInstanceTransform } from "../../data/register";
import { LinkSeriesTooltipHelper } from "./tooltip-helper";
import { registerRuleMark } from "../../mark/rule";
import { registerSymbolMark } from "../../mark/symbol";
import { linkSeriesMark } from "./constant";
import { linkDotInfo } from "../../data/transforms/link-dot-info";
import { Factory } from "../../core/factory";
import { TransformLevel } from "../../data/initialize";
import { registerCartesianLinearAxis, registerCartesianBandAxis } from "../../component/axis/cartesian";
import { AttributeLevel } from "../../constant/attribute";
import { link } from "../../theme/builtin/common/series/link";
export class LinkSeries extends CartesianSeries {
constructor() {
super(...arguments), this.type = SeriesTypeEnum.link;
}
getFromField() {
return this._fromField;
}
setFromField(field) {
isValid(field) && (this._fromField = field);
}
getToField() {
return this._toField;
}
setToField(field) {
isValid(field) && (this._toField = field);
}
getDotTypeField() {
return this._dotTypeField;
}
setDotTypeField(field) {
isValid(field) && (this._dotTypeField = field);
}
getDotSeriesSpec() {
return this._dotSeriesSpec;
}
setDotSeriesSpec(spec) {
isValid(spec) && (this._dotSeriesSpec = spec);
}
_getDotData() {
const dotSeries = this._option.getChart().getSeriesInIndex([ this._spec.dotSeriesIndex ])[0];
return dotSeries ? dotSeries.getRawData().latestData : [];
}
initData() {
var _a;
super.initData(), registerDataSetInstanceTransform(this._option.dataSet, "linkDotInfo", linkDotInfo),
null === (_a = this.getViewData()) || void 0 === _a || _a.transform({
type: "linkDotInfo",
options: {
infoKey: "dots",
fields: () => ({
fromField: this._fromField,
toField: this._toField,
xField: this._dotSeriesSpec.xField,
yField: this._dotSeriesSpec.yField
}),
linkData: () => this._rawData.latestData,
dotData: () => this._getDotData()
},
level: TransformLevel.linkDotInfo
}, !1);
}
setAttrFromSpec() {
super.setAttrFromSpec(), this.setFromField(this._spec.fromField), this.setToField(this._spec.toField),
this.setDotTypeField(this._spec.dotTypeField), this.setDotSeriesSpec(this._spec.dotSeriesSpec);
}
initMark() {
this._clipMark = this._createMark(LinkSeries.mark.group), this._containerMark = this._createMark(LinkSeries.mark.group, {
parent: this._clipMark
}), this._linkMark = this._createMark(LinkSeries.mark.link, {
skipBeforeLayouted: !1,
parent: this._containerMark
}), this._arrowMark = this._createMark(LinkSeries.mark.arrow, {
skipBeforeLayouted: !1,
isSeriesMark: !0,
parent: this._containerMark
});
}
initMarkStyle() {
var _a, _b, _c, _d;
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,
width: this.getLayoutRect().width
}, "normal", AttributeLevel.Series), containerMark.setMarkConfig({
interactive: !1
}));
const linkMark = this._linkMark;
linkMark && this.setMarkStyle(linkMark, {
stroke: this.getColorAttribute(),
strokeOpacity: this.dataToOpacity.bind(this),
x: this.dataToPositionXFrom.bind(this),
y: this.dataToPositionYFrom.bind(this),
x1: this.dataToPositionXTo.bind(this),
y1: this.dataToPositionYTo.bind(this)
}, "normal", AttributeLevel.Series);
const arrowMark = this._arrowMark;
if (arrowMark) {
const arrowSize = null !== (_d = null === (_c = null === (_b = null === (_a = this._theme) || void 0 === _a ? void 0 : _a.arrow) || void 0 === _b ? void 0 : _b.style) || void 0 === _c ? void 0 : _c.size) && void 0 !== _d ? _d : 10;
this.setMarkStyle(arrowMark, {
x: this.dataToPositionXTo.bind(this),
y: datum => this.dataToPositionArrowYTo(datum, arrowSize),
fill: this.getColorAttribute(),
fillOpacity: this.dataToOpacity.bind(this),
size: arrowSize,
symbolType: datum => this.isPositionYFromHigher(datum) ? "triangleDown" : "triangleUp"
}, "normal", AttributeLevel.Series);
}
}
afterInitMark() {
super.afterInitMark();
}
dataToPositionXFrom(datum) {
if (!this._xAxisHelper) return Number.NaN;
const {dataToPosition: dataToPosition} = this._xAxisHelper;
return dataToPosition(this.getDatumPositionValues(datum, this._fromField + "_xField"), {
bandPosition: this._bandPosition
});
}
dataToPositionYFrom(datum) {
if (!this._yAxisHelper) return Number.NaN;
const {dataToPosition: dataToPosition} = this._yAxisHelper;
return dataToPosition(this.getDatumPositionValues(datum, this._fromField + "_yField"));
}
dataToPositionXTo(datum) {
if (!this._xAxisHelper) return Number.NaN;
const {dataToPosition: dataToPosition} = this._xAxisHelper;
return dataToPosition(this.getDatumPositionValues(datum, this._toField + "_xField"), {
bandPosition: this._bandPosition
});
}
dataToPositionYTo(datum) {
if (!this._yAxisHelper) return Number.NaN;
const {dataToPosition: dataToPosition} = this._yAxisHelper;
return dataToPosition(this.getDatumPositionValues(datum, this._toField + "_yField"), {
bandPosition: this._bandPosition
});
}
dataToPositionArrowYTo(datum, arrowSize) {
if (!this._yAxisHelper) return Number.NaN;
const {dataToPosition: dataToPosition} = this._yAxisHelper, offset = this.isPositionYFromHigher(datum) ? -arrowSize / 2 : arrowSize / 2;
return dataToPosition(this.getDatumPositionValues(datum, this._toField + "_yField"), {
bandPosition: this._bandPosition
}) + offset;
}
dataToOpacity(datum) {
return this.isPositionXOuterRange(datum, this._fromField + "_xField") || this.isPositionXOuterRange(datum, this._toField + "_xField") || datum[this._fromField] === datum[this._toField] ? 0 : 1;
}
isPositionYFromHigher(datum) {
return this.dataToPositionYFrom(datum) < this.dataToPositionYTo(datum);
}
isPositionXOuterRange(datum, field) {
if (!this._xAxisHelper) return !1;
const {dataToPosition: dataToPosition, getScale: getScale} = this._xAxisHelper;
return dataToPosition(this.getDatumPositionValues(datum, field), {
bandPosition: this._bandPosition
}) < getScale(0).range()[0] || dataToPosition(this.getDatumPositionValues(datum, field), {
bandPosition: this._bandPosition
}) > getScale(0).range()[1];
}
getDefaultColorDomain() {
var _a, _b;
return this._dotTypeField ? null === (_a = this.getViewDataStatistics()) || void 0 === _a ? void 0 : _a.latestData[this._dotTypeField].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._dotTypeField) && void 0 !== _b ? _b : this._seriesField) && void 0 !== _c ? _c : DEFAULT_DATA_SERIES_FIELD
};
}
getInteractionTriggers() {
const marks = [];
return this._linkMark && marks.push(this._linkMark), this._arrowMark && marks.push(this._arrowMark),
this._parseInteractionConfig(marks);
}
initTooltip() {
this._tooltipHelper = new LinkSeriesTooltipHelper(this), this._linkMark && this._tooltipHelper.activeTriggerSet.mark.add(this._linkMark),
this._arrowMark && this._tooltipHelper.activeTriggerSet.mark.add(this._arrowMark);
}
onMarkTreePositionUpdate(marks) {
marks.forEach((m => {
m.commit(!1, !0);
}));
}
getDotInfoData() {
var _a, _b;
return null === (_b = null !== (_a = this._linkMark) && void 0 !== _a ? _a : this._arrowMark) || void 0 === _b ? void 0 : _b.getData();
}
getActiveMarks() {
return [ this._linkMark, this._arrowMark ];
}
}
LinkSeries.type = SeriesTypeEnum.link, LinkSeries.mark = linkSeriesMark, LinkSeries.builtInTheme = {
link: link
};
export const registerLinkSeries = () => {
registerRuleMark(), registerSymbolMark(), registerCartesianBandAxis(), registerCartesianLinearAxis(),
Factory.registerSeries(LinkSeries.type, LinkSeries);
};
//# sourceMappingURL=link.js.map