association.js 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. var tslib_1 = require("tslib");
  4. var g2_1 = require("@antv/g2");
  5. var util_1 = require("@antv/util");
  6. var utils_1 = require("../../../utils");
  7. var utils_2 = require("./utils");
  8. /**
  9. * 存在多个 view 时,view 之间的联动交互
  10. *
  11. * 提供四个反馈 action,均接受参数:linkField 关联字段,dim 维度
  12. * 1. showTooltip
  13. * 2. active
  14. * 3. highlight
  15. * 4. selected
  16. *
  17. * 附加,两个结束反馈 action:
  18. * 1. hidetooltip
  19. * 2. reset 清除激活和高亮状态
  20. */
  21. var Association = /** @class */ (function (_super) {
  22. tslib_1.__extends(Association, _super);
  23. function Association() {
  24. return _super !== null && _super.apply(this, arguments) || this;
  25. }
  26. /**
  27. * 获取关联的 elements
  28. *
  29. * - 如果 dim 参数存在,根据 dim 获取相应的 field。与 linkField 不匹配则 return
  30. * - 否则 dim 参数不存在,且 linkField 存在,则作为关联字段
  31. * - 否则若 linkField 不存在,则获取第一个分类字段
  32. * @returns EventItem[]
  33. */
  34. Association.prototype.getAssociationItems = function (views, params) {
  35. var _a;
  36. var event = this.context.event;
  37. var _b = params || {}, linkField = _b.linkField, dim = _b.dim;
  38. var items = [];
  39. if ((_a = event.data) === null || _a === void 0 ? void 0 : _a.data) {
  40. var data_1 = event.data.data;
  41. (0, util_1.each)(views, function (v) {
  42. var _a, _b;
  43. var field = linkField;
  44. if (dim === 'x') {
  45. field = v.getXScale().field;
  46. }
  47. else if (dim === 'y') {
  48. field = (_a = v.getYScales().find(function (s) { return s.field === field; })) === null || _a === void 0 ? void 0 : _a.field;
  49. }
  50. else if (!field) {
  51. field = (_b = v.getGroupScales()[0]) === null || _b === void 0 ? void 0 : _b.field;
  52. }
  53. if (!field) {
  54. return;
  55. }
  56. var elements = (0, util_1.map)((0, utils_1.getAllElements)(v), function (ele) {
  57. var active = false;
  58. var inactive = false;
  59. var dataValue = (0, util_1.isArray)(data_1) ? (0, util_1.get)(data_1[0], field) : (0, util_1.get)(data_1, field);
  60. if ((0, utils_2.getElementValue)(ele, field) === dataValue) {
  61. active = true;
  62. }
  63. else {
  64. inactive = true;
  65. }
  66. return { element: ele, view: v, active: active, inactive: inactive };
  67. });
  68. items.push.apply(items, elements);
  69. });
  70. }
  71. return items;
  72. };
  73. /**
  74. * 所有同一层级的 tooltip 显示
  75. */
  76. Association.prototype.showTooltip = function (params) {
  77. var siblings = (0, utils_1.getSiblingViews)(this.context.view);
  78. var elements = this.getAssociationItems(siblings, params);
  79. (0, util_1.each)(elements, function (ele) {
  80. if (ele.active) {
  81. var box = ele.element.shape.getCanvasBBox();
  82. ele.view.showTooltip({ x: box.minX + box.width / 2, y: box.minY + box.height / 2 });
  83. }
  84. });
  85. };
  86. /**
  87. * 隐藏同一层级的 tooltip
  88. */
  89. Association.prototype.hideTooltip = function () {
  90. var siblings = (0, utils_1.getSiblingViews)(this.context.view);
  91. (0, util_1.each)(siblings, function (sibling) {
  92. sibling.hideTooltip();
  93. });
  94. };
  95. /**
  96. * 设置 active 状态
  97. */
  98. Association.prototype.active = function (params) {
  99. var views = (0, utils_1.getViews)(this.context.view);
  100. var items = this.getAssociationItems(views, params);
  101. (0, util_1.each)(items, function (item) {
  102. var active = item.active, element = item.element;
  103. if (active) {
  104. element.setState('active', true);
  105. }
  106. });
  107. };
  108. /**
  109. * 设置 selected 状态
  110. */
  111. Association.prototype.selected = function (params) {
  112. var views = (0, utils_1.getViews)(this.context.view);
  113. var items = this.getAssociationItems(views, params);
  114. (0, util_1.each)(items, function (item) {
  115. var active = item.active, element = item.element;
  116. if (active) {
  117. element.setState('selected', true);
  118. }
  119. });
  120. };
  121. /**
  122. * 进行高亮 => 设置 inactive 状态
  123. */
  124. Association.prototype.highlight = function (params) {
  125. var views = (0, utils_1.getViews)(this.context.view);
  126. var items = this.getAssociationItems(views, params);
  127. (0, util_1.each)(items, function (item) {
  128. var inactive = item.inactive, element = item.element;
  129. if (inactive) {
  130. element.setState('inactive', true);
  131. }
  132. });
  133. };
  134. Association.prototype.reset = function () {
  135. var views = (0, utils_1.getViews)(this.context.view);
  136. (0, util_1.each)(views, function (v) {
  137. (0, utils_2.clearHighlight)(v);
  138. });
  139. };
  140. return Association;
  141. }(g2_1.Action));
  142. (0, g2_1.registerAction)('association', Association);
  143. /**
  144. * 相邻 view 的 active 联动(相同维值的 tooltip 联动)
  145. */
  146. (0, g2_1.registerInteraction)('association-active', {
  147. start: [{ trigger: 'element:mouseenter', action: 'association:active' }],
  148. end: [{ trigger: 'element:mouseleave', action: 'association:reset' }],
  149. });
  150. /**
  151. * 相邻 view 的 active 联动(相同维值的 tooltip 联动)
  152. */
  153. (0, g2_1.registerInteraction)('association-selected', {
  154. start: [{ trigger: 'element:mouseenter', action: 'association:selected' }],
  155. end: [{ trigger: 'element:mouseleave', action: 'association:reset' }],
  156. });
  157. /**
  158. * 相邻 view 的 highlight 联动, 突出当前 element
  159. */
  160. (0, g2_1.registerInteraction)('association-highlight', {
  161. start: [{ trigger: 'element:mouseenter', action: 'association:highlight' }],
  162. end: [{ trigger: 'element:mouseleave', action: 'association:reset' }],
  163. });
  164. /**
  165. * 相邻 view 的 tooltip 联动,根据 groupField 进行关联(相同维值的 tooltip 联动)
  166. */
  167. (0, g2_1.registerInteraction)('association-tooltip', {
  168. start: [{ trigger: 'element:mousemove', action: 'association:showTooltip' }],
  169. end: [{ trigger: 'element:mouseleave', action: 'association:hideTooltip' }],
  170. });
  171. //# sourceMappingURL=association.js.map