UNPKG

10.3 kBSource Map (JSON)View Raw
1{"version":3,"file":"range-filter.js","sourceRoot":"","sources":["../../../../src/interaction/action/data/range-filter.ts"],"names":[],"mappings":"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","sourcesContent":["import { Point, Scale } from '../../../dependents';\nimport { FilterCondition, EventPayload } from '../../../interface';\nimport { View, Event } from '../../../chart';\nimport Action from '../base';\nimport { isMask } from '../util';\n\n// 获取对应的 scale\nfunction getFilter(scale: Scale, dim: string, point1: Point, point2: Point): FilterCondition {\n let min = Math.min(point1[dim], point2[dim]);\n let max = Math.max(point1[dim], point2[dim]);\n const [rangeMin, rangeMax] = scale.range;\n // 约束值在 scale 的 range 之间\n if (min < rangeMin) {\n min = rangeMin;\n }\n if (max > rangeMax) {\n max = rangeMax;\n }\n // 范围大于整个 view 的范围,则返回 null\n if (min === rangeMax && max === rangeMax) {\n return null;\n }\n const minValue = scale.invert(min);\n const maxValue = scale.invert(max);\n if (scale.isCategory) {\n const minIndex = scale.values.indexOf(minValue);\n const maxIndex = scale.values.indexOf(maxValue);\n const arr = scale.values.slice(minIndex, maxIndex + 1);\n return (value) => {\n return arr.includes(value);\n };\n } else {\n return (value) => {\n return value >= minValue && value <= maxValue;\n };\n }\n}\n\n/** range-filter 只用于:brush-filter, brush-x-filter, brush-y-filter */\nenum EVENTS {\n FILTER = 'brush-filter-processing',\n RESET = 'brush-filter-reset',\n BEFORE_FILTER = 'brush-filter:beforefilter',\n AFTER_FILTER = 'brush-filter:afterfilter',\n BEFORE_RESET = 'brush-filter:beforereset',\n AFTER_RESET = 'brush-filter:afterreset',\n}\n\nexport { EVENTS as BRUSH_FILTER_EVENTS };\n\n/**\n * 范围过滤的 Action\n * @ignore\n */\nclass RangeFilter extends Action {\n /** 允许外部传入 dims */\n protected cfgFields: ['dims'];\n /**\n * 范围过滤生效的字段/维度,可以是 x, y\n */\n protected dims: string[] = ['x', 'y'];\n /** 起始点 */\n protected startPoint: Point = null;\n\n private isStarted: boolean = false;\n\n // x,y 是否生效\n private hasDim(dim: string) {\n return this.dims.includes(dim);\n }\n\n /**\n * 开始范围过滤,记录范围过滤的起点\n */\n public start() {\n const context = this.context;\n this.isStarted = true;\n this.startPoint = context.getCurrentPoint();\n }\n\n /**\n * 过滤,以开始的点和当前点对数据进行过滤\n */\n public filter() {\n let startPoint;\n let currentPoint;\n if (isMask(this.context)) {\n const maskShape = this.context.event.target;\n const bbox = maskShape.getCanvasBBox();\n startPoint = { x: bbox.x, y: bbox.y };\n currentPoint = { x: bbox.maxX, y: bbox.maxY };\n } else {\n if (!this.isStarted) {\n // 如果没有开始,则不执行过滤\n return;\n }\n startPoint = this.startPoint;\n currentPoint = this.context.getCurrentPoint();\n }\n if (Math.abs(startPoint.x - currentPoint.x) < 5 || Math.abs(startPoint.x - currentPoint.y) < 5) {\n // 距离过小也不生效\n return;\n }\n const { view, event } = this.context;\n const payload = { view, event, dims: this.dims };\n view.emit(EVENTS.BEFORE_FILTER, Event.fromData(view, EVENTS.BEFORE_FILTER, payload));\n\n const coord = view.getCoordinate();\n const normalCurrent = coord.invert(currentPoint);\n const normalStart = coord.invert(startPoint);\n // 设置 x 方向的 filter\n if (this.hasDim('x')) {\n const xScale = view.getXScale();\n const filter = getFilter(xScale, 'x', normalCurrent, normalStart);\n this.filterView(view, xScale.field, filter);\n }\n // 设置 y 方向的 filter\n if (this.hasDim('y')) {\n const yScale = view.getYScales()[0];\n const filter = getFilter(yScale, 'y', normalCurrent, normalStart);\n this.filterView(view, yScale.field, filter);\n }\n this.reRender(view, { source: EVENTS.FILTER });\n\n view.emit(EVENTS.AFTER_FILTER, Event.fromData(view, EVENTS.AFTER_FILTER, payload));\n }\n\n /**\n * 结束\n */\n public end() {\n this.isStarted = false;\n }\n\n /**\n * 取消同当前 Action 相关的过滤,指定的 x,y\n */\n public reset() {\n const view = this.context.view;\n view.emit(EVENTS.BEFORE_RESET, Event.fromData(view, EVENTS.BEFORE_RESET, {}));\n\n this.isStarted = false;\n if (this.hasDim('x')) {\n const xScale = view.getXScale();\n this.filterView(view, xScale.field, null); // 取消过滤\n }\n if (this.hasDim('y')) {\n // y 轴过滤仅取第一个 yScale\n const yScale = view.getYScales()[0];\n this.filterView(view, yScale.field, null); // 取消过滤\n }\n this.reRender(view, { source: EVENTS.RESET });\n\n view.emit(EVENTS.AFTER_RESET, Event.fromData(view, EVENTS.AFTER_RESET, {}));\n }\n\n /**\n * 对 view 进行过滤\n */\n protected filterView(view: View, field: string, filter: FilterCondition) {\n view.filter(field, filter);\n }\n\n /**\n * 重新渲染\n * @param view\n */\n protected reRender(view: View, payload?: EventPayload) {\n view.render(true, payload);\n }\n}\n\nexport default RangeFilter;\n"]}
\No newline at end of file