@alicloud/cloud-charts
Version:

264 lines (210 loc) • 7.87 kB
JavaScript
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);