@visactor/vchart
Version:
charts lib based @visactor/VGrammar
266 lines (239 loc) • 11.2 kB
JavaScript
import { array, isArray, isNil, isValid, isObject, degreeToRadian, mixin } from "@visactor/vutils";
import { registerSunburstAnimation } from "./animation";
import { registerDataSetInstanceTransform } from "../../data/register";
import { flatten } from "../../data/transforms/flatten";
import { sunburstLayout } from "../../data/transforms/sunburst";
import { SeriesTypeEnum } from "../interface/type";
import { DEFAULT_DATA_KEY } from "../../constant/data";
import { AttributeLevel } from "../../constant/attribute";
import { STATE_VALUE_ENUM } from "../../compile/mark/interface";
import { DEFAULT_HIERARCHY_ROOT } from "../../constant/hierarchy";
import { registerFadeInOutAnimation } from "../../animation/config";
import { addHierarchyDataKey, initHierarchyKeyMap } from "../../data/transforms/data-key";
import { addVChartProperty } from "../../data/transforms/add-property";
import { animationConfig, userAnimationConfig } from "../../animation/utils";
import { PolarSeries } from "../polar/polar";
import { SUNBURST_AUTO_VISIBLE_DEFAULT_THRESHOLD } from "../../constant/sunburst";
import { SunburstTooltipHelper } from "./tooltip-helper";
import { Drillable } from "../../interaction/drill/drillable";
import { registerArcMark } from "../../mark/arc";
import { registerTextMark } from "../../mark/text";
import { sunburstSeriesMark } from "./constant";
import { Factory } from "../../core/factory";
import { appendHierarchyFields } from "../util/hierarchy";
import { sunburst } from "../../theme/builtin/common/series/sunburst";
export class SunburstSeries extends PolarSeries {
constructor() {
super(...arguments), this.type = SeriesTypeEnum.sunburst;
}
setCategoryField(f) {
return this._categoryField = f, this._categoryField;
}
getCategoryField() {
return this._categoryField;
}
setValueField(f) {
return this._valueField = f, this._valueField;
}
getValueField() {
return this._valueField;
}
getDimensionField() {
return [ this._categoryField ];
}
getMeasureField() {
return [ this._valueField ];
}
setAttrFromSpec() {
var _a;
super.setAttrFromSpec(), this.setCategoryField(this._spec.categoryField), this.setValueField(this._spec.valueField),
this.setSeriesField(null !== (_a = this._spec.seriesField) && void 0 !== _a ? _a : DEFAULT_HIERARCHY_ROOT),
this._spec.drill && this.initDrillable({
event: this.event,
mode: this._option.mode,
drillField: () => {
var _a;
return null !== (_a = this._spec.drillField) && void 0 !== _a ? _a : DEFAULT_DATA_KEY;
},
getRawData: () => this.getRawData()
}), this._startAngle = degreeToRadian(this._spec.startAngle), this._endAngle = degreeToRadian(this._spec.endAngle),
this._centerX = this._spec.centerX, this._centerY = this._spec.centerY, this._offsetX = this._spec.offsetX,
this._offsetY = this._spec.offsetY, this.__innerRadius = this._spec.innerRadius,
this.__outerRadius = this._spec.outerRadius, this._gap = this._spec.gap, this._labelLayout = this._spec.labelLayout,
this._sunburst = this._spec.sunburst, this._label = this._spec.label, this._labelAutoVisible = this._spec.labelAutoVisible;
}
initData() {
super.initData();
const rawData = this.getRawData();
rawData && (this._spec.drill && this.initDrillableData(this._dataSet), registerDataSetInstanceTransform(this._dataSet, "sunburstLayout", sunburstLayout),
registerDataSetInstanceTransform(this._dataSet, "flatten", flatten), rawData.transform({
type: "sunburstLayout",
options: () => {
const {innerRadius: innerRadius, outerRadius: outerRadius, gap: gap, label: label} = this._computeLevel();
return {
nodeKey: this._categoryField,
width: this.getLayoutRect().width,
height: this.getLayoutRect().height,
center: [ isValid(this._centerX) ? this._centerX : this.getLayoutRect().width / 2, isValid(this._centerY) ? this._centerY : this.getLayoutRect().height / 2 ],
startAngle: this._startAngle,
endAngle: this._endAngle,
innerRadius: innerRadius,
outerRadius: outerRadius,
gapRadius: gap,
label: label
};
}
}), rawData.transform({
type: "flatten",
options: {
callback: node => {
if (node.datum) {
const nodeData = node.datum[node.depth];
return Object.assign(Object.assign({}, node), nodeData);
}
return node;
}
}
}));
}
getStatisticFields() {
return appendHierarchyFields(super.getStatisticFields(), this._categoryField, this._valueField);
}
_addDataIndexAndKey() {
const rawData = this.getRawData();
isNil(null == rawData ? void 0 : rawData.dataSet) || (registerDataSetInstanceTransform(rawData.dataSet, "addVChartProperty", addVChartProperty),
rawData.transform({
type: "addVChartProperty",
options: {
beforeCall: initHierarchyKeyMap.bind(this),
call: addHierarchyDataKey
}
}));
}
initMark() {
this._initArcMark(), this._initLabelMark();
}
initMarkStyle() {
this._initArcMarkStyle(), this._initLabelMarkStyle();
}
_initArcMark() {
if (!1 === this._sunburst.visible) return;
const sunburstMark = this._createMark(SunburstSeries.mark.sunburst, {
isSeriesMark: !0
});
this._sunburstMark = sunburstMark;
}
_initArcMarkStyle() {
isNil(this._sunburstMark) || this.setMarkStyle(this._sunburstMark, {
x: d => d.x + (isValid(this._offsetX) ? this._offsetX : 0),
y: d => d.y + (isValid(this._offsetY) ? this._offsetY : 0),
outerRadius: d => d.outerRadius,
innerRadius: d => d.innerRadius,
startAngle: d => d.startAngle,
endAngle: d => d.endAngle,
fill: this.getColorAttribute()
}, STATE_VALUE_ENUM.STATE_NORMAL, AttributeLevel.Series);
}
_initLabelMark() {
if (!0 !== this._label.visible) return;
const labelMark = this._createMark(SunburstSeries.mark.label, {
isSeriesMark: !1
});
this._labelMark = labelMark;
}
_initLabelMarkStyle() {
isNil(this._labelMark) || this.setMarkStyle(this._labelMark, {
visible: d => {
var _a;
const labelAutoVisible = this._labelAutoVisible;
return isObject(labelAutoVisible) && !0 === labelAutoVisible.enable ? (d.endAngle - d.startAngle) * (d.outerRadius - d.innerRadius) > (null !== (_a = null == labelAutoVisible ? void 0 : labelAutoVisible.circumference) && void 0 !== _a ? _a : SUNBURST_AUTO_VISIBLE_DEFAULT_THRESHOLD) : this._spec.label.visible;
},
x: d => {
var _a;
return (null === (_a = d.label) || void 0 === _a ? void 0 : _a.x) + (isValid(this._offsetX) ? this._offsetX : 0);
},
y: d => {
var _a;
return (null === (_a = d.label) || void 0 === _a ? void 0 : _a.y) + (isValid(this._offsetY) ? this._offsetY : 0);
},
textBaseline: d => {
var _a;
return null === (_a = d.label) || void 0 === _a ? void 0 : _a.textBaseline;
},
textAlign: d => {
var _a;
return null === (_a = d.label) || void 0 === _a ? void 0 : _a.textAlign;
},
angle: d => {
var _a, _b;
return null !== (_b = null === (_a = d.label) || void 0 === _a ? void 0 : _a.angle) && void 0 !== _b ? _b : 0;
},
fontSize: 10,
text: d => d.name
}, STATE_VALUE_ENUM.STATE_NORMAL, AttributeLevel.Series);
}
initTooltip() {
this._tooltipHelper = new SunburstTooltipHelper(this), this._sunburstMark && this._tooltipHelper.activeTriggerSet.mark.add(this._sunburstMark),
this._labelMark && this._tooltipHelper.activeTriggerSet.mark.add(this._labelMark);
}
initAnimation() {
var _a, _b;
const animationParams = {
animationInfo: () => ({
innerRadius: this._computeRadius(array(this.__innerRadius))[0],
outerRadius: this._computeRadius(array(this.__outerRadius))[0],
startAngle: array(this._startAngle)[0],
endAngle: array(this._endAngle)[0]
})
}, appearPreset = null === (_b = null === (_a = this._spec) || void 0 === _a ? void 0 : _a.animationAppear) || void 0 === _b ? void 0 : _b.preset;
this.getMarksInType("arc").forEach((mark => {
var _a;
mark.setAnimationConfig(animationConfig(null === (_a = Factory.getAnimationInKey("sunburst")) || void 0 === _a ? void 0 : _a(animationParams, appearPreset), userAnimationConfig(mark.name, this._spec, this._markAttributeContext)));
})), this.getMarksInType("text").forEach((mark => {
var _a;
mark.setAnimationConfig(animationConfig(null === (_a = Factory.getAnimationInKey("fadeInOut")) || void 0 === _a ? void 0 : _a(), userAnimationConfig(mark.name, this._spec, this._markAttributeContext)));
}));
}
initEvent() {
super.initEvent(), this._spec.drill && this.bindDrillEvent();
}
onLayoutEnd() {
super.onLayoutEnd(), this._rawData.reRunAllTransform();
}
_computeRadius(radius) {
return isArray(radius) ? radius.map((r => this._computeLayoutRadius() * r)) : this._computeLayoutRadius() * radius;
}
_computeLevel() {
return {
innerRadius: this._computeRadius(this.__innerRadius),
outerRadius: this._computeRadius(this.__outerRadius),
gap: this._gap,
label: this._labelLayout
};
}
getGroupFields() {
return [];
}
getStackGroupFields() {
return [];
}
getStackValueField() {
return "";
}
_noAnimationDataKey(datum, index) {}
getActiveMarks() {
return [ this._sunburstMark ];
}
getMarkData(datum) {
return (null == datum ? void 0 : datum.datum) ? datum.datum[datum.datum.length - 1] : datum;
}
}
SunburstSeries.type = SeriesTypeEnum.sunburst, SunburstSeries.mark = sunburstSeriesMark,
SunburstSeries.builtInTheme = {
sunburst: sunburst
}, mixin(SunburstSeries, Drillable);
export const registerSunBurstSeries = () => {
Factory.registerSeries(SunburstSeries.type, SunburstSeries), registerArcMark(),
registerTextMark(), registerFadeInOutAnimation(), registerSunburstAnimation();
};
//# sourceMappingURL=sunburst.js.map