UNPKG

@alicloud/cloud-charts

Version:

![](https://img.shields.io/npm/v/@alicloud/cloud-charts?color=%23ff8200)

264 lines (210 loc) 7.87 kB
import _inheritsLoose from "@babel/runtime/helpers/inheritsLoose"; import { registerInteraction } from '@antv/g2/esm/core'; import ListUnchecked from '@antv/g2/esm/interaction/action/component/list-unchecked'; import DimRect from '@antv/g2/esm/interaction/action/mask/dim-rect'; import themes from '../themes'; // 图例反选 Action 默认行为 export var ListReverseChecked = /*#__PURE__*/function (_ListUnchecked) { _inheritsLoose(ListReverseChecked, _ListUnchecked); function ListReverseChecked() { return _ListUnchecked.apply(this, arguments) || this; } var _proto = ListReverseChecked.prototype; _proto.toggle = function toggle() { var _this = this; // 获取原始事件 var originEvent = this.context.event.event; var _ref = this.getTriggerListInfo() || {}, item = _ref.item, list = _ref.list; // 用于显示分组的items不触发交互 if (!item || !!item.dodge) { return; } // 是否按Control var hasControl = originEvent.ctrlKey || originEvent.metaKey; // 当前选中状态 false-选中,true-未选 var currentEnable = this.hasState(list, item); if (hasControl) { // Control进入单选默认 var listItems = list.getItems(); var isOneChecked = listItems.reduce(function (pre, cur) { return pre + (_this.hasState(list, cur) ? 0 : 1); }, 0) === 1; listItems.forEach(function (listItem) { var enable = _this.hasState(list, listItem); var otherEnable = !currentEnable && isOneChecked ? !enable : true; if (listItem !== item) { _this.setItemState(list, listItem, otherEnable); } else { _this.setItemState(list, listItem, false); } }); } else { // 非Control时保持默认反选 this.setItemState(list, item, !currentEnable); } }; return ListReverseChecked; }(ListUnchecked); // 图例正选 Action export var ListChecked = /*#__PURE__*/function (_ListUnchecked2) { _inheritsLoose(ListChecked, _ListUnchecked2); function ListChecked() { return _ListUnchecked2.apply(this, arguments) || this; } var _proto2 = ListChecked.prototype; _proto2.toggle = function toggle() { var _this2 = this; // 获取原始事件 var originEvent = this.context.event.event; var _ref2 = this.getTriggerListInfo() || {}, item = _ref2.item, list = _ref2.list; if (!item || !!item.dodge) { return; } // 是否按Control var hasControl = originEvent.ctrlKey || originEvent.metaKey; // 当前选中状态 false-选中,true-未选 var currentEnable = this.hasState(list, item); var listItems = list.getItems(); // 是否点击唯一选中的一个 var checkedNums = 0; var isSameItem = false; listItems.forEach(function (listItem) { if (!_this2.hasState(list, listItem)) { checkedNums += 1; isSameItem = listItem === item; } }); var isOneChecked = checkedNums === 1 && isSameItem; if (!hasControl) { // 非Control时采用默认单选模式 listItems.forEach(function (listItem) { if (listItem !== item) { _this2.setItemState(list, listItem, !isOneChecked); } else { _this2.setItemState(list, listItem, false); } }); } else { // Control时反选 this.setItemState(list, item, !currentEnable); } }; return ListChecked; }(ListUnchecked); // 图例单选模式封装交互 registerInteraction('legend-custom-filter', { showEnable: [{ trigger: 'legend-item:mouseenter', action: 'cursor:pointer' }, { trigger: 'legend-item:mouseleave', action: 'cursor:default' }], start: [{ trigger: 'legend-item:click', action: ['list-checked:toggle', 'data-filter:filter'] }] }); function notLastLegend(context) { // @ts-ignore var _ref3 = context.getAction('list-checked').getTriggerListInfo() || {}, item = _ref3.item, list = _ref3.list; if (!item) { return true; } var items = list.getItems(); var stateItems = list.getItemsByState('unchecked'); // 当前选中项状态 var currentEnable = list.hasState(item, 'unchecked'); // 获取原始事件 var originEvent = context.event.event; // 是否按Control var hasControl = originEvent.ctrlKey || originEvent.metaKey; // 按Control进入单选模式则一直可用,或者:当前是要 unchecked,且只剩下一个 非unchecked 的 item,则返回 false return hasControl || !(!currentEnable && stateItems.length === items.length - 1); } registerInteraction('legend-custom-filter-last', { showEnable: [{ trigger: 'legend-item:mouseenter', action: 'cursor:pointer', isEnable: notLastLegend }, { trigger: 'legend-item:mouseleave', action: 'cursor:default' }], start: [{ trigger: 'legend-item:click', action: ['list-checked:toggle', 'data-filter:filter', 'element-highlight:clear'], isEnable: notLastLegend }] }); function notLastCheckedLegend(context) { // @ts-ignore var _ref4 = context.getAction('list-checked').getTriggerListInfo() || {}, item = _ref4.item, list = _ref4.list; if (!item) { return true; } var items = list.getItems(); var stateItems = list.getItemsByState('unchecked'); // 当前选中项状态 var currentEnable = list.hasState(item, 'unchecked'); // 获取原始事件 var originEvent = context.event.event; // 是否按Control var hasControl = originEvent.ctrlKey || originEvent.metaKey; // 单选情况下,非Control时一直可用,control时不能消除最后一个legend return !hasControl || !(!currentEnable && stateItems.length === items.length - 1); } // 正选时的交互 registerInteraction('legend-singlechecked-filter-last', { showEnable: [{ trigger: 'legend-item:mouseenter', action: 'cursor:pointer', isEnable: notLastCheckedLegend }, { trigger: 'legend-item:mouseleave', action: 'cursor:default' }], start: [{ trigger: 'legend-item:click', action: ['list-checked:toggle', 'data-filter:filter', 'element-highlight:clear'], isEnable: notLastCheckedLegend }] }); /* 更新内置的 interaction */ // 带主题设置的 active-region 配置项,使用函数包裹,保证主题始终保持最新 export function activeRegionWithTheme(view) { view.interaction('active-region', { start: [{ trigger: 'plot:mousemove', action: 'active-region:show', arg: { style: { // 这一段必须放在函数中运行,否则主题无法更新 fill: themes['widgets-tooltip-cross-react'], opacity: themes['widgets-tooltip-cross-react-opacity'] } // {number} appendRatio 适用于笛卡尔坐标系. 对于 x 轴非 linear 类型: 默认:0.25, x 轴 linear 类型: 默认 0 // appendRatio, // {number} appendWidth 适用于笛卡尔坐标系. 像素级别,优先级 > appendRatio // appendWidth, } }], end: [{ trigger: 'plot:mouseleave', action: 'active-region:hide' }] }); } // 拖拽缩放时的mask显示 export var NoCaptureDimRect = /*#__PURE__*/function (_DimRect) { _inheritsLoose(NoCaptureDimRect, _DimRect); function NoCaptureDimRect() { return _DimRect.apply(this, arguments) || this; } var _proto3 = NoCaptureDimRect.prototype; // 添加图形 _proto3.getMaskAttrs = function getMaskAttrs() { var _this$getRegion = this.getRegion(), start = _this$getRegion.start, end = _this$getRegion.end; var x = Math.min(start.x, end.x); var y = Math.min(start.y, end.y); var width = Math.abs(end.x - start.x); var height = Math.abs(end.y - start.y); return { x: x, y: y, width: width - 2, height: height }; }; return NoCaptureDimRect; }(DimRect);