@visactor/vgrammar-core
Version:
VGrammar is a visual grammar library
82 lines (77 loc) • 5.26 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: !0
}), exports.ViewNavigationBase = void 0;
const vutils_1 = require("@visactor/vutils"), base_1 = require("./base"), enums_1 = require("../graph/enums"), scale_1 = require("../util/scale");
class ViewNavigationBase extends base_1.BaseInteraction {
constructor(view, options) {
super(view, options), this.options = options;
}
_parseLinkedComponent(option) {
if (!option) return null;
const comp = (0, vutils_1.isString)(option) ? this.view.getMarkById(option) : option;
return !comp || comp.markType !== enums_1.GrammarMarkType.component || comp.componentType !== enums_1.ComponentEnum.datazoom && comp.componentType !== enums_1.ComponentEnum.scrollbar ? null : comp;
}
_initStateByDim(dim, linkedComponent, scale, dataTarget, rangeOptions) {
const comp = this._parseLinkedComponent(linkedComponent);
if (comp) return void (this._state[dim] = {
linkedComponent: comp
});
const scaleGrammar = (0, vutils_1.isNil)(scale) ? null : (0, vutils_1.isString)(scale) ? this.view.getScaleById(scale) : scale, dataGrammar = (0,
vutils_1.isNil)(null == dataTarget ? void 0 : dataTarget.data) ? null : (0, vutils_1.isString)(dataTarget.data) ? this.view.getDataById(dataTarget.data) : dataTarget.data;
if (!scaleGrammar || !dataGrammar) return this._state[dim] = {
data: dataGrammar,
scale: scaleGrammar
}, void ((0, vutils_1.isArray)(rangeOptions) ? (this._state[dim].rangeFactor = rangeOptions,
this._state[dim].initRangeFactor = rangeOptions) : (0, vutils_1.isFunction)(rangeOptions) ? this._state[dim].getCurrentRange = rangeOptions : scaleGrammar && scaleGrammar.getRangeFactor() && (this._state[dim].rangeFactor = scaleGrammar.getRangeFactor(),
this._state[dim].initRangeFactor = scaleGrammar.getRangeFactor()));
dataGrammar.attach(scaleGrammar);
const filterByScale = (0, vutils_1.isString)(dataTarget.filter) ? (datum, filterValue) => {
const scale = scaleGrammar.getScale(), ratio = (0, scale_1.getScaleRangeRatio)(scale, datum[dataTarget.filter]);
return ratio >= filterValue[0] && ratio <= filterValue[1];
} : dataTarget.filter, dataFilter = {
source: `${scaleGrammar.uid}`,
rank: enums_1.DataFilterRank.normal,
filter: data => {
var _a, _b, _c, _d;
const filterValue = "x" === dim ? null === (_b = null === (_a = this._state) || void 0 === _a ? void 0 : _a.x) || void 0 === _b ? void 0 : _b.filterValue : null === (_d = null === (_c = this._state) || void 0 === _c ? void 0 : _c.y) || void 0 === _d ? void 0 : _d.filterValue;
if (!filterValue) return data;
const filteredData = data.filter((datum => filterByScale(datum, filterValue)));
return dataTarget.transform ? dataTarget.transform(filteredData, filterValue) : filteredData;
}
};
"x" === dim ? this._dataFilterX = dataFilter : this._dataFilterY = dataFilter, dataGrammar.addDataFilter(dataFilter),
this._state[dim] = {
data: dataGrammar,
scale: scaleGrammar
};
}
_initGrammars() {
const {enableX: enableX, enableY: enableY, scaleX: scaleX, scaleY: scaleY, dataTargetX: dataTargetX, dataTargetY: dataTargetY, linkedComponentX: linkedComponentX, linkedComponentY: linkedComponentY, rangeX: rangeX, rangeY: rangeY} = this.options;
this._state = {}, !1 !== enableX && this._initStateByDim("x", linkedComponentX, scaleX, dataTargetX, rangeX),
!1 !== enableY && this._initStateByDim("y", linkedComponentY, scaleY, dataTargetY, rangeY),
this._inited = !0;
}
_updateLinkedComponent(comp, newRange) {
comp.componentType === enums_1.ComponentEnum.datazoom ? comp.setStartEndValue(newRange[0], newRange[1]) : comp.setScrollStart(newRange[0]);
}
updateView(type, newRange, eventType, e) {
var _a, _b, _c, _d;
newRange && newRange.x && (null === (_b = null === (_a = this._state) || void 0 === _a ? void 0 : _a.x) || void 0 === _b ? void 0 : _b.linkedComponent) && this._updateLinkedComponent(this._state.x.linkedComponent, newRange.x),
newRange && newRange.y && (null === (_d = null === (_c = this._state) || void 0 === _c ? void 0 : _c.y) || void 0 === _d ? void 0 : _d.linkedComponent) && this._updateLinkedComponent(this._state.y.linkedComponent, newRange.y),
newRange && newRange.needUpdate && this.view.run(), this.dispatchEvent(type, {
viewRange: newRange,
event: e,
eventType: eventType
});
}
unbind() {
super.unbind(), this._state && Object.keys(this._state).forEach((dim => {
const {data: data, scale: scale} = this._state[dim];
data && scale ? (data.detach(scale), data.removeDataFilter("x" === dim ? this._dataFilterX : this._dataFilterY)) : scale && (scale.setRangeFactor(null),
scale.commit());
})), this._state = null;
}
}
exports.ViewNavigationBase = ViewNavigationBase;
//# sourceMappingURL=view-navigation-base.js.map