@antv/g2
Version:
the Grammar of Graphics in Javascript
166 lines • 5.99 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.BRUSH_FILTER_EVENTS = void 0;
var tslib_1 = require("tslib");
var chart_1 = require("../../../chart");
var base_1 = tslib_1.__importDefault(require("../base"));
var util_1 = require("../util");
// 获取对应的 scale
function getFilter(scale, dim, point1, point2) {
var min = Math.min(point1[dim], point2[dim]);
var max = Math.max(point1[dim], point2[dim]);
var _a = tslib_1.__read(scale.range, 2), rangeMin = _a[0], rangeMax = _a[1];
// 约束值在 scale 的 range 之间
if (min < rangeMin) {
min = rangeMin;
}
if (max > rangeMax) {
max = rangeMax;
}
// 范围大于整个 view 的范围,则返回 null
if (min === rangeMax && max === rangeMax) {
return null;
}
var minValue = scale.invert(min);
var maxValue = scale.invert(max);
if (scale.isCategory) {
var minIndex = scale.values.indexOf(minValue);
var maxIndex = scale.values.indexOf(maxValue);
var arr_1 = scale.values.slice(minIndex, maxIndex + 1);
return function (value) {
return arr_1.includes(value);
};
}
else {
return function (value) {
return value >= minValue && value <= maxValue;
};
}
}
/** range-filter 只用于:brush-filter, brush-x-filter, brush-y-filter */
var EVENTS;
(function (EVENTS) {
EVENTS["FILTER"] = "brush-filter-processing";
EVENTS["RESET"] = "brush-filter-reset";
EVENTS["BEFORE_FILTER"] = "brush-filter:beforefilter";
EVENTS["AFTER_FILTER"] = "brush-filter:afterfilter";
EVENTS["BEFORE_RESET"] = "brush-filter:beforereset";
EVENTS["AFTER_RESET"] = "brush-filter:afterreset";
})(EVENTS || (EVENTS = {}));
exports.BRUSH_FILTER_EVENTS = EVENTS;
/**
* 范围过滤的 Action
* @ignore
*/
var RangeFilter = /** @class */ (function (_super) {
tslib_1.__extends(RangeFilter, _super);
function RangeFilter() {
var _this = _super !== null && _super.apply(this, arguments) || this;
/**
* 范围过滤生效的字段/维度,可以是 x, y
*/
_this.dims = ['x', 'y'];
/** 起始点 */
_this.startPoint = null;
_this.isStarted = false;
return _this;
}
// x,y 是否生效
RangeFilter.prototype.hasDim = function (dim) {
return this.dims.includes(dim);
};
/**
* 开始范围过滤,记录范围过滤的起点
*/
RangeFilter.prototype.start = function () {
var context = this.context;
this.isStarted = true;
this.startPoint = context.getCurrentPoint();
};
/**
* 过滤,以开始的点和当前点对数据进行过滤
*/
RangeFilter.prototype.filter = function () {
var startPoint;
var currentPoint;
if ((0, util_1.isMask)(this.context)) {
var maskShape = this.context.event.target;
var bbox = maskShape.getCanvasBBox();
startPoint = { x: bbox.x, y: bbox.y };
currentPoint = { x: bbox.maxX, y: bbox.maxY };
}
else {
if (!this.isStarted) {
// 如果没有开始,则不执行过滤
return;
}
startPoint = this.startPoint;
currentPoint = this.context.getCurrentPoint();
}
if (Math.abs(startPoint.x - currentPoint.x) < 5 || Math.abs(startPoint.x - currentPoint.y) < 5) {
// 距离过小也不生效
return;
}
var _a = this.context, view = _a.view, event = _a.event;
var payload = { view: view, event: event, dims: this.dims };
view.emit(EVENTS.BEFORE_FILTER, chart_1.Event.fromData(view, EVENTS.BEFORE_FILTER, payload));
var coord = view.getCoordinate();
var normalCurrent = coord.invert(currentPoint);
var normalStart = coord.invert(startPoint);
// 设置 x 方向的 filter
if (this.hasDim('x')) {
var xScale = view.getXScale();
var filter = getFilter(xScale, 'x', normalCurrent, normalStart);
this.filterView(view, xScale.field, filter);
}
// 设置 y 方向的 filter
if (this.hasDim('y')) {
var yScale = view.getYScales()[0];
var filter = getFilter(yScale, 'y', normalCurrent, normalStart);
this.filterView(view, yScale.field, filter);
}
this.reRender(view, { source: EVENTS.FILTER });
view.emit(EVENTS.AFTER_FILTER, chart_1.Event.fromData(view, EVENTS.AFTER_FILTER, payload));
};
/**
* 结束
*/
RangeFilter.prototype.end = function () {
this.isStarted = false;
};
/**
* 取消同当前 Action 相关的过滤,指定的 x,y
*/
RangeFilter.prototype.reset = function () {
var view = this.context.view;
view.emit(EVENTS.BEFORE_RESET, chart_1.Event.fromData(view, EVENTS.BEFORE_RESET, {}));
this.isStarted = false;
if (this.hasDim('x')) {
var xScale = view.getXScale();
this.filterView(view, xScale.field, null); // 取消过滤
}
if (this.hasDim('y')) {
// y 轴过滤仅取第一个 yScale
var yScale = view.getYScales()[0];
this.filterView(view, yScale.field, null); // 取消过滤
}
this.reRender(view, { source: EVENTS.RESET });
view.emit(EVENTS.AFTER_RESET, chart_1.Event.fromData(view, EVENTS.AFTER_RESET, {}));
};
/**
* 对 view 进行过滤
*/
RangeFilter.prototype.filterView = function (view, field, filter) {
view.filter(field, filter);
};
/**
* 重新渲染
* @param view
*/
RangeFilter.prototype.reRender = function (view, payload) {
view.render(true, payload);
};
return RangeFilter;
}(base_1.default));
exports.default = RangeFilter;
//# sourceMappingURL=range-filter.js.map