123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255 |
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- exports.DrillDownAction = exports.HIERARCHY_DATA_TRANSFORM_PARAMS = exports.DEFAULT_BREAD_CRUMB_CONFIG = exports.BREAD_CRUMB_NAME = exports.PADDING_TOP = void 0;
- var tslib_1 = require("tslib");
- var g2_1 = require("@antv/g2");
- var util_1 = require("@antv/util");
- var deep_assign_1 = require("../../utils/deep-assign");
- // 面包屑文字和分割符'/'之间的距离
- var PADDING = 4;
- // 面包屑位置距离树图的距离
- var PADDING_LEFT = 0;
- // 面包屑位置距离树图的顶部距离
- exports.PADDING_TOP = 5;
- /** Group name of breadCrumb: 面包屑 */
- exports.BREAD_CRUMB_NAME = 'drilldown-bread-crumb';
- // 面包屑默认配置
- exports.DEFAULT_BREAD_CRUMB_CONFIG = {
- /** 位置,默认:左上角 */
- position: 'top-left',
- dividerText: '/',
- textStyle: {
- fontSize: 12,
- fill: 'rgba(0, 0, 0, 0.65)',
- cursor: 'pointer',
- },
- activeTextStyle: {
- fill: '#87B5FF',
- },
- };
- /**
- * hierarchy 数据转换的参数
- */
- exports.HIERARCHY_DATA_TRANSFORM_PARAMS = 'hierarchy-data-transform-params';
- /**
- * @description 下钻交互的 action
- * @author liuzhenying
- *
- * 适用于:hierarchy plot
- */
- var DrillDownAction = /** @class */ (function (_super) {
- tslib_1.__extends(DrillDownAction, _super);
- function DrillDownAction() {
- var _this = _super !== null && _super.apply(this, arguments) || this;
- /** Action name */
- _this.name = 'drill-down';
- // 存储历史下钻数据
- _this.historyCache = [];
- // 面包屑 group
- _this.breadCrumbGroup = null;
- // 面包屑基础配置
- _this.breadCrumbCfg = exports.DEFAULT_BREAD_CRUMB_CONFIG;
- return _this;
- }
- /**
- * 点击事件, 下钻数据,并绘制面包屑
- */
- DrillDownAction.prototype.click = function () {
- var data = (0, util_1.get)(this.context, ['event', 'data', 'data']);
- if (!data)
- return false;
- this.drill(data);
- this.drawBreadCrumb();
- };
- /**
- * 重置位置,初始化及触发 chart afterchangesize 回调时使用
- */
- DrillDownAction.prototype.resetPosition = function () {
- // 当在第一层级未绘制面包屑,此时 changedata 触发 resetPosition 函数,需判断 this.breadCrumbGroup 是否存在
- if (!this.breadCrumbGroup)
- return;
- var coordinate = this.context.view.getCoordinate();
- var breadCrumbGroup = this.breadCrumbGroup;
- var bbox = breadCrumbGroup.getBBox();
- var position = this.getButtonCfg().position;
- // @todo 后续抽取一个函数来处理,以及增加 margin 或者 padding 的设置
- // 非 polar 的,需要使用 coordinate,除却图表组件
- var point = { x: coordinate.start.x, y: coordinate.end.y - (bbox.height + exports.PADDING_TOP * 2) };
- if (coordinate.isPolar) {
- // 默认,左上角直接出发
- point = { x: 0, y: 0 };
- }
- if (position === 'bottom-left') {
- // 涉及到坐标反转的问题
- point = { x: coordinate.start.x, y: coordinate.start.y };
- }
- /** PADDING_LEFT, PADDING_TOP 与画布边缘的距离 */
- var matrix = g2_1.Util.transform(null, [['t', point.x + PADDING_LEFT, point.y + bbox.height + exports.PADDING_TOP]]);
- breadCrumbGroup.setMatrix(matrix);
- };
- /**
- * 返回上一层
- */
- DrillDownAction.prototype.back = function () {
- if ((0, util_1.size)(this.historyCache)) {
- this.backTo(this.historyCache.slice(0, -1));
- }
- };
- /**
- * 重置
- */
- DrillDownAction.prototype.reset = function () {
- if (this.historyCache[0]) {
- this.backTo(this.historyCache.slice(0, 1));
- }
- // 清空
- this.historyCache = [];
- this.hideCrumbGroup();
- };
- /**
- * 下钻数据并更新 view 显示层
- * @param nodeInfo 下钻数据
- */
- DrillDownAction.prototype.drill = function (nodeInfo) {
- var view = this.context.view;
- var transformData = (0, util_1.get)(view, ['interactions', 'drill-down', 'cfg', 'transformData'], function (v) { return v; });
- // 重新 update 数据
- var drillData = transformData(tslib_1.__assign({ data: nodeInfo.data }, nodeInfo[exports.HIERARCHY_DATA_TRANSFORM_PARAMS]));
- view.changeData(drillData);
- // 存储历史记录
- var historyCache = [];
- var node = nodeInfo;
- while (node) {
- var nodeData = node.data;
- historyCache.unshift({
- id: "".concat(nodeData.name, "_").concat(node.height, "_").concat(node.depth),
- name: nodeData.name,
- // children 是实际数据
- children: transformData(tslib_1.__assign({ data: nodeData }, nodeInfo[exports.HIERARCHY_DATA_TRANSFORM_PARAMS])),
- });
- node = node.parent;
- }
- this.historyCache = (this.historyCache || []).slice(0, -1).concat(historyCache);
- };
- /**
- * 回退事件,点击面包屑时触发
- * @param historyCache 当前要回退到的历史
- */
- DrillDownAction.prototype.backTo = function (historyCache) {
- if (!historyCache || historyCache.length <= 0) {
- return;
- }
- var view = this.context.view;
- var data = (0, util_1.last)(historyCache).children; // 处理后的数组
- view.changeData(data);
- if (historyCache.length > 1) {
- this.historyCache = historyCache;
- this.drawBreadCrumb();
- }
- else {
- // 清空
- this.historyCache = [];
- this.hideCrumbGroup();
- }
- };
- /**
- * 获取 mix 默认的配置和用户配置
- */
- DrillDownAction.prototype.getButtonCfg = function () {
- var view = this.context.view;
- var drillDownConfig = (0, util_1.get)(view, ['interactions', 'drill-down', 'cfg', 'drillDownConfig']);
- return (0, deep_assign_1.deepAssign)(this.breadCrumbCfg, drillDownConfig === null || drillDownConfig === void 0 ? void 0 : drillDownConfig.breadCrumb, this.cfg);
- };
- /**
- * 显示面包屑
- */
- DrillDownAction.prototype.drawBreadCrumb = function () {
- this.drawBreadCrumbGroup();
- this.resetPosition();
- this.breadCrumbGroup.show();
- };
- /**
- * 绘制 Button 和 文本
- */
- DrillDownAction.prototype.drawBreadCrumbGroup = function () {
- var _this = this;
- var config = this.getButtonCfg();
- var cache = this.historyCache;
- // 初始化面包屑 group
- if (!this.breadCrumbGroup) {
- this.breadCrumbGroup = this.context.view.foregroundGroup.addGroup({
- name: exports.BREAD_CRUMB_NAME,
- });
- }
- else {
- this.breadCrumbGroup.clear();
- }
- // 绘制面包屑
- var left = 0;
- cache.forEach(function (record, index) {
- // 添加文本
- var textShape = _this.breadCrumbGroup.addShape({
- type: 'text',
- id: record.id,
- name: "".concat(exports.BREAD_CRUMB_NAME, "_").concat(record.name, "_text"),
- attrs: tslib_1.__assign(tslib_1.__assign({ text: index === 0 && !(0, util_1.isNil)(config.rootText) ? config.rootText : record.name }, config.textStyle), { x: left, y: 0 }),
- });
- var textShapeBox = textShape.getBBox();
- left += textShapeBox.width + PADDING;
- // 增加文本事件
- textShape.on('click', function (event) {
- var _a;
- var targetId = event.target.get('id');
- if (targetId !== ((_a = (0, util_1.last)(cache)) === null || _a === void 0 ? void 0 : _a.id)) {
- var newHistoryCache = cache.slice(0, cache.findIndex(function (d) { return d.id === targetId; }) + 1);
- _this.backTo(newHistoryCache);
- }
- });
- // active 效果内置
- textShape.on('mouseenter', function (event) {
- var _a;
- var targetId = event.target.get('id');
- if (targetId !== ((_a = (0, util_1.last)(cache)) === null || _a === void 0 ? void 0 : _a.id)) {
- textShape.attr(config.activeTextStyle);
- }
- else {
- textShape.attr({ cursor: 'default' });
- }
- });
- textShape.on('mouseleave', function () {
- textShape.attr(config.textStyle);
- });
- if (index < cache.length - 1) {
- // 添加反斜杠
- var dividerShape = _this.breadCrumbGroup.addShape({
- type: 'text',
- name: "".concat(config.name, "_").concat(record.name, "_divider"),
- attrs: tslib_1.__assign(tslib_1.__assign({ text: config.dividerText }, config.textStyle), { x: left, y: 0 }),
- });
- var dividerBox = dividerShape.getBBox();
- left += dividerBox.width + PADDING;
- }
- });
- };
- /**
- * 隐藏面包屑
- */
- DrillDownAction.prototype.hideCrumbGroup = function () {
- if (this.breadCrumbGroup) {
- this.breadCrumbGroup.hide();
- }
- };
- /**
- * @override
- * destroy: 销毁资源
- */
- DrillDownAction.prototype.destroy = function () {
- if (this.breadCrumbGroup) {
- this.breadCrumbGroup.remove();
- }
- _super.prototype.destroy.call(this);
- };
- return DrillDownAction;
- }(g2_1.Action));
- exports.DrillDownAction = DrillDownAction;
- //# sourceMappingURL=drill-down.js.map
|