@visactor/vgrammar-core
Version:
VGrammar is a visual grammar library
46 lines (41 loc) • 2.56 kB
JavaScript
import { DataFilterRank } from "../graph/enums";
import { isArray, isString } from "@visactor/vutils";
import { Filter } from "./filter";
export class RollUp extends Filter {
constructor(view, options) {
super(view, options), this.type = RollUp.type, this._isToggle = !1, this.handleStart = event => {
var _a, _b;
const element = event.element;
if (element && this._marks && this._marks.includes(element.mark)) {
const filterValue = null === (_b = null === (_a = event.element) || void 0 === _a ? void 0 : _a.getDatum) || void 0 === _b ? void 0 : _b.call(_a);
filterValue === this._filterData || isArray(filterValue) && isArray(this._filterValue) && filterValue.length === this._filterValue.length && filterValue.every((datum => !this._filterValue.includes(datum))) ? this._isToggle && (this._filterValue = null,
this.handleFilter(event)) : this.handleFilter(event);
}
}, this.handleReset = event => {
this._filterValue && (this._filterValue = null, this.handleFilter(event));
}, this.options = Object.assign({}, RollUp.defaultOptions, options), this._marks = view.getMarksBySelector(this.options.source),
this._data = isString(this.options.target.data) ? view.getDataById(this.options.target.data) : this.options.target.data;
}
getEvents() {
if (!this._marks || 0 === this._marks.length) return [];
if (!this._data) return [];
const transform = this.options.target.transform;
this._filterData(this._data, null, DataFilterRank.rollUp, (event => {
var _a, _b;
return null === (_b = null === (_a = null == event ? void 0 : event.element) || void 0 === _a ? void 0 : _a.getDatum) || void 0 === _b ? void 0 : _b.call(_a);
}), void 0, ((data, filterValue) => transform(data, filterValue)));
const events = [ {
type: this.options.trigger,
handler: this.handleStart
} ], eventName = "empty" === this.options.triggerOff ? this.options.trigger : this.options.triggerOff.includes("view:") ? this.options.triggerOff.replace("view:", "") : this.options.triggerOff;
return eventName !== this.options.trigger ? (events.push({
type: eventName,
handler: this.handleReset
}), this._isToggle = !1) : this._isToggle = !0, events;
}
}
RollUp.type = "roll-up", RollUp.defaultOptions = {
trigger: "click",
triggerOff: "empty"
};
//# sourceMappingURL=roll-up.js.map