UNPKG

5.98 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3exports.BRUSH_FILTER_EVENTS = void 0;
4var tslib_1 = require("tslib");
5var chart_1 = require("../../../chart");
6var base_1 = (0, tslib_1.__importDefault)(require("../base"));
7var util_1 = require("../util");
8// 获取对应的 scale
9function getFilter(scale, dim, point1, point2) {
10 var min = Math.min(point1[dim], point2[dim]);
11 var max = Math.max(point1[dim], point2[dim]);
12 var _a = scale.range, rangeMin = _a[0], rangeMax = _a[1];
13 // 约束值在 scale 的 range 之间
14 if (min < rangeMin) {
15 min = rangeMin;
16 }
17 if (max > rangeMax) {
18 max = rangeMax;
19 }
20 // 范围大于整个 view 的范围,则返回 null
21 if (min === rangeMax && max === rangeMax) {
22 return null;
23 }
24 var minValue = scale.invert(min);
25 var maxValue = scale.invert(max);
26 if (scale.isCategory) {
27 var minIndex = scale.values.indexOf(minValue);
28 var maxIndex = scale.values.indexOf(maxValue);
29 var arr_1 = scale.values.slice(minIndex, maxIndex + 1);
30 return function (value) {
31 return arr_1.includes(value);
32 };
33 }
34 else {
35 return function (value) {
36 return value >= minValue && value <= maxValue;
37 };
38 }
39}
40/** range-filter 只用于:brush-filter, brush-x-filter, brush-y-filter */
41var EVENTS;
42(function (EVENTS) {
43 EVENTS["FILTER"] = "brush-filter-processing";
44 EVENTS["RESET"] = "brush-filter-reset";
45 EVENTS["BEFORE_FILTER"] = "brush-filter:beforefilter";
46 EVENTS["AFTER_FILTER"] = "brush-filter:afterfilter";
47 EVENTS["BEFORE_RESET"] = "brush-filter:beforereset";
48 EVENTS["AFTER_RESET"] = "brush-filter:afterreset";
49})(EVENTS || (EVENTS = {}));
50exports.BRUSH_FILTER_EVENTS = EVENTS;
51/**
52 * 范围过滤的 Action
53 * @ignore
54 */
55var RangeFilter = /** @class */ (function (_super) {
56 (0, tslib_1.__extends)(RangeFilter, _super);
57 function RangeFilter() {
58 var _this = _super !== null && _super.apply(this, arguments) || this;
59 /**
60 * 范围过滤生效的字段/维度,可以是 x, y
61 */
62 _this.dims = ['x', 'y'];
63 /** 起始点 */
64 _this.startPoint = null;
65 _this.isStarted = false;
66 return _this;
67 }
68 // x,y 是否生效
69 RangeFilter.prototype.hasDim = function (dim) {
70 return this.dims.includes(dim);
71 };
72 /**
73 * 开始范围过滤,记录范围过滤的起点
74 */
75 RangeFilter.prototype.start = function () {
76 var context = this.context;
77 this.isStarted = true;
78 this.startPoint = context.getCurrentPoint();
79 };
80 /**
81 * 过滤,以开始的点和当前点对数据进行过滤
82 */
83 RangeFilter.prototype.filter = function () {
84 var startPoint;
85 var currentPoint;
86 if ((0, util_1.isMask)(this.context)) {
87 var maskShape = this.context.event.target;
88 var bbox = maskShape.getCanvasBBox();
89 startPoint = { x: bbox.x, y: bbox.y };
90 currentPoint = { x: bbox.maxX, y: bbox.maxY };
91 }
92 else {
93 if (!this.isStarted) {
94 // 如果没有开始,则不执行过滤
95 return;
96 }
97 startPoint = this.startPoint;
98 currentPoint = this.context.getCurrentPoint();
99 }
100 if (Math.abs(startPoint.x - currentPoint.x) < 5 || Math.abs(startPoint.x - currentPoint.y) < 5) {
101 // 距离过小也不生效
102 return;
103 }
104 var _a = this.context, view = _a.view, event = _a.event;
105 var payload = { view: view, event: event, dims: this.dims };
106 view.emit(EVENTS.BEFORE_FILTER, chart_1.Event.fromData(view, EVENTS.BEFORE_FILTER, payload));
107 var coord = view.getCoordinate();
108 var normalCurrent = coord.invert(currentPoint);
109 var normalStart = coord.invert(startPoint);
110 // 设置 x 方向的 filter
111 if (this.hasDim('x')) {
112 var xScale = view.getXScale();
113 var filter = getFilter(xScale, 'x', normalCurrent, normalStart);
114 this.filterView(view, xScale.field, filter);
115 }
116 // 设置 y 方向的 filter
117 if (this.hasDim('y')) {
118 var yScale = view.getYScales()[0];
119 var filter = getFilter(yScale, 'y', normalCurrent, normalStart);
120 this.filterView(view, yScale.field, filter);
121 }
122 this.reRender(view, { source: EVENTS.FILTER });
123 view.emit(EVENTS.AFTER_FILTER, chart_1.Event.fromData(view, EVENTS.AFTER_FILTER, payload));
124 };
125 /**
126 * 结束
127 */
128 RangeFilter.prototype.end = function () {
129 this.isStarted = false;
130 };
131 /**
132 * 取消同当前 Action 相关的过滤,指定的 x,y
133 */
134 RangeFilter.prototype.reset = function () {
135 var view = this.context.view;
136 view.emit(EVENTS.BEFORE_RESET, chart_1.Event.fromData(view, EVENTS.BEFORE_RESET, {}));
137 this.isStarted = false;
138 if (this.hasDim('x')) {
139 var xScale = view.getXScale();
140 this.filterView(view, xScale.field, null); // 取消过滤
141 }
142 if (this.hasDim('y')) {
143 // y 轴过滤仅取第一个 yScale
144 var yScale = view.getYScales()[0];
145 this.filterView(view, yScale.field, null); // 取消过滤
146 }
147 this.reRender(view, { source: EVENTS.RESET });
148 view.emit(EVENTS.AFTER_RESET, chart_1.Event.fromData(view, EVENTS.AFTER_RESET, {}));
149 };
150 /**
151 * 对 view 进行过滤
152 */
153 RangeFilter.prototype.filterView = function (view, field, filter) {
154 view.filter(field, filter);
155 };
156 /**
157 * 重新渲染
158 * @param view
159 */
160 RangeFilter.prototype.reRender = function (view, payload) {
161 view.render(true, payload);
162 };
163 return RangeFilter;
164}(base_1.default));
165exports.default = RangeFilter;
166//# sourceMappingURL=range-filter.js.map
\No newline at end of file