@visactor/vgrammar-core
Version:
VGrammar is a visual grammar library
152 lines (140 loc) • 7.16 kB
JavaScript
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