@visactor/vchart
Version:
charts lib based @visactor/VGrammar
83 lines (75 loc) • 3.5 kB
JavaScript
import { isArray, isEmpty, isNil } from "@visactor/vutils";
import { drillFilter, DrillEnum } from "../../data/transforms/drill";
import { getDefaultTriggerEventByMode } from "../../component/common/trigger/config";
import { findHierarchyPath } from "../../util/hierarchy";
import { ChartEvent } from "../../constant/event";
import { registerDataSetInstanceTransform } from "../../data/register";
import { ComponentTypeEnum } from "../../component/interface/type";
export class Drillable {
_getDrillTriggerEvent(type) {
var _a;
const {mode: mode} = this._drillParams;
return null === (_a = getDefaultTriggerEventByMode(mode)) || void 0 === _a ? void 0 : _a[type];
}
_hideTooltip() {
const tooltip = this.getChart().getComponentsByType(ComponentTypeEnum.tooltip)[0];
tooltip && tooltip.hideTooltip();
}
initDrillable(params) {
this._drillParams = params;
}
initDrillableData(dataSet) {
const {getRawData: getRawData} = this._drillParams;
registerDataSetInstanceTransform(dataSet, "drillFilter", drillFilter), getRawData().transform({
type: "drillFilter",
options: {
info: () => this._drillInfo,
keyField: () => this._drillParams.drillField()
}
});
}
bindDrillEvent() {
const {event: event, getRawData: getRawData, drillField: drillField} = this._drillParams, keyField = drillField();
this._getDrillTriggerEvent("start") && event.on(this._getDrillTriggerEvent("start"), (e => {
var _a, _b, _c;
if (isNil(e.datum) || isNil(null === (_a = e.datum) || void 0 === _a ? void 0 : _a[keyField])) return void this.drillUp();
this._hideTooltip();
const dataKey = e.datum[keyField], selectPath = null !== (_c = null === (_b = this._drillInfo) || void 0 === _b ? void 0 : _b.path) && void 0 !== _c ? _c : [], clickedPath = findHierarchyPath(getRawData().rawData, dataKey, keyField, "children");
selectPath[selectPath.length - 1] === clickedPath[clickedPath.length - 1] ? this.drillUp() : this.drillDown(clickedPath);
}));
}
drillDown(drillPath = []) {
const {getRawData: getRawData, event: event} = this._drillParams;
if (!isArray(drillPath) || isEmpty(drillPath)) return drillPath;
const dataKey = drillPath[drillPath.length - 1];
return this._drillInfo = {
key: dataKey,
path: drillPath,
type: DrillEnum.DrillDown
}, getRawData().reRunAllTransform(), event.emit(ChartEvent.drill, {
value: {
path: drillPath,
type: DrillEnum.DrillDown
},
model: this
}), drillPath;
}
drillUp() {
var _a, _b;
const {getRawData: getRawData, event: event} = this._drillParams, path = null !== (_b = null === (_a = this._drillInfo) || void 0 === _a ? void 0 : _a.path) && void 0 !== _b ? _b : [];
if (!isArray(path) || isEmpty(path)) return path;
const dataKey = path.pop();
return this._drillInfo = {
key: dataKey,
path: path,
type: DrillEnum.DrillUp
}, getRawData().reRunAllTransform(), event.emit(ChartEvent.drill, {
value: {
path: path,
type: DrillEnum.DrillUp
},
model: this
}), path;
}
}
//# sourceMappingURL=drillable.js.map