UNPKG

@visactor/vgrammar-core

Version:

VGrammar is a visual grammar library

152 lines (140 loc) 7.16 kB
import { DataZoom as DatazoomComponent } from "@visactor/vrender-components"; import { isNil, isString, merge, mixin } from "@visactor/vutils"; import { ComponentEnum } from "../graph/enums"; import { invokeEncoder } from "../graph/mark/encode"; import { Component } from "../view/component"; import { parseEncodeType } from "../parse/mark"; import { Factory } from "../core/factory"; import { DatazoomFilter } from "../interactions/datazoom-filter"; import { Filter, FilterMixin } from "../interactions/filter"; export const generateDatazoomAttributes = (data, theme, addition) => { var _a; const datazoomTheme = null === (_a = null == theme ? void 0 : theme.components) || void 0 === _a ? void 0 : _a.datazoom; return data ? merge({}, datazoomTheme, { previewData: data }, null != addition ? addition : {}) : merge({}, datazoomTheme, null != addition ? addition : {}); }; export class Datazoom extends Component { constructor(view, group) { super(view, ComponentEnum.datazoom, group), this.spec.componentType = ComponentEnum.datazoom; } parseAddition(spec) { var _a; super.parseAddition(spec); const {data: data, x: x, y: y, x1: x1, y1: y1} = null !== (_a = spec.preview) && void 0 !== _a ? _a : {}; return this.preview(data, x, y, x1, y1), this._updateComponentEncoders(), this; } preview(data, x, y, x1, y1) { if (!isNil(this.spec.preview)) { const lastData = this.spec.preview.data, lastDataGrammar = isString(lastData) ? this.view.getDataById(lastData) : lastData; this.detach(lastDataGrammar), this.detach(parseEncodeType(this.spec.preview.x, this.view)), this.detach(parseEncodeType(this.spec.preview.y, this.view)), this.detach(parseEncodeType(this.spec.preview.x1, this.view)), this.detach(parseEncodeType(this.spec.preview.y1, this.view)); } if (this.spec.preview = void 0, data) { this.spec.preview = { data: data, x: x, y: y, x1: x1, y1: y1 }; const dataGrammar = isString(data) ? this.view.getDataById(data) : data; this.attach(dataGrammar), this.attach(parseEncodeType(x, this.view)), this.attach(parseEncodeType(y, this.view)), this.attach(parseEncodeType(x1, this.view)), this.attach(parseEncodeType(y1, this.view)); } return this._updateComponentEncoders(), this.commit(), this; } setStartEndValue(start, end) { const datazoom = this.getGroupGraphicItem(); return datazoom && datazoom.setStartAndEnd && datazoom.setStartAndEnd(start, end), this; } getStartEndValue() { const datazoom = this.getGroupGraphicItem(); if (datazoom) { const state = datazoom.state; return { start: state.start, end: state.end }; } return null; } addGraphicItem(attrs, groupKey) { var _a; const theme = this.spec.skipTheme ? null : this.view.getCurrentTheme(), initialAttributes = Object.assign({}, null === (_a = null == theme ? void 0 : theme.components) || void 0 === _a ? void 0 : _a.datazoom, attrs), graphicItem = Factory.createGraphicComponent(this.componentType, initialAttributes, { skipDefault: this.spec.skipTheme }); return this.setDatazoomHandlers(graphicItem), super.addGraphicItem(initialAttributes, groupKey, graphicItem); } reuse(grammar) { return super.reuse(grammar), this.setDatazoomHandlers(), this; } _updateComponentEncoders() { var _a; const data = null === (_a = this.spec.preview) || void 0 === _a ? void 0 : _a.data, dataGrammar = isString(data) ? this.view.getDataById(data) : data, encoders = Object.assign({ update: {} }, this.spec.encode), componentEncoders = Object.keys(encoders).reduce(((res, state) => { const encoder = encoders[state]; return encoder && (res[state] = { callback: (datum, element, parameters) => { var _a; const theme = this.spec.skipTheme ? null : this.view.getCurrentTheme(), addition = invokeEncoder(encoder, datum, element, parameters); return generateDatazoomAttributes(null === (_a = null == dataGrammar ? void 0 : dataGrammar.getValue) || void 0 === _a ? void 0 : _a.call(dataGrammar), theme, addition); } }), res; }), {}); this._encoders = componentEncoders; } invertDatazoomRatio(ratio) { const scale = this.getDatazoomMainScale(); if (scale) { const range = scale.range(), scaledValue = (range[range.length - 1] - range[0]) * ratio + range[0]; return scale.invert(scaledValue); } return null; } getDatazoomMainScale() { var _a, _b; const datazoom = this.getGroupGraphicItem(); if (datazoom && this.spec.preview) { const scale = "top" === datazoom.attribute.orient || "bottom" === datazoom.attribute.orient ? null === (_a = this.spec.preview.x) || void 0 === _a ? void 0 : _a.scale : null === (_b = this.spec.preview.y) || void 0 === _b ? void 0 : _b.scale, scaleGrammar = isString(scale) ? this.view.getScaleById(scale) : scale; return null == scaleGrammar ? void 0 : scaleGrammar.getScale(); } return null; } setDatazoomHandlers(graphicItem) { var _a; const datazoom = null != graphicItem ? graphicItem : this.getGroupGraphicItem(); datazoom.setStatePointToData((state => { var _a; return this.spec.preview && null !== (_a = this.invertDatazoomRatio(state)) && void 0 !== _a ? _a : state; })); const {data: data, x: x, y: y, x1: x1, y1: y1} = null !== (_a = this.spec.preview) && void 0 !== _a ? _a : {}; datazoom.setPreviewPointsX((datum => { if (x && data) return invokeEncoder({ x: x }, datum, this.elements[0], this.parameters()).x; })), datazoom.setPreviewPointsY((datum => { if (y && data) return invokeEncoder({ y: y }, datum, this.elements[0], this.parameters()).y; })), datazoom.setPreviewPointsX1((datum => { if (x1 && data) return invokeEncoder({ x1: x1 }, datum, this.elements[0], this.parameters()).x1; })), datazoom.setPreviewPointsY1((datum => { if (y1 && data) return invokeEncoder({ y1: y1 }, datum, this.elements[0], this.parameters()).y1; })); } } Datazoom.componentType = ComponentEnum.datazoom; export const registerDataZoom = () => { Factory.registerGraphicComponent(ComponentEnum.datazoom, (attrs => new DatazoomComponent(attrs))), Factory.registerComponent(ComponentEnum.datazoom, Datazoom), mixin(Filter, FilterMixin), Factory.registerInteraction(DatazoomFilter.type, DatazoomFilter); }; //# sourceMappingURL=datazoom.js.map