adaptor.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. import { __assign } from "tslib";
  2. import { clone, each, isFunction } from '@antv/util';
  3. import { animation, annotation, scale, theme, tooltip } from '../../adaptor/common';
  4. import { getLocale } from '../../core/locale';
  5. import { deepAssign, flow } from '../../utils';
  6. import { conversionTagFormatter } from '../../utils/conversion';
  7. import { FUNNEL_CONVERSATION, FUNNEL_PERCENT } from './constant';
  8. import { basicFunnel } from './geometries/basic';
  9. import { compareFunnel } from './geometries/compare';
  10. import { dynamicHeightFunnel } from './geometries/dynamic-height';
  11. import { facetFunnel } from './geometries/facet';
  12. import { FUNNEL_LEGEND_FILTER, interactionStart } from './interactions';
  13. /**
  14. *
  15. * 各式漏斗图geometry实现细节有较大不同,
  16. * 1. 普通漏斗图:interval.shape('funnel')
  17. * 2. 对比漏斗图:分面
  18. * 3. 动态高度漏斗图:polypon
  19. * 4. 分面漏斗图:普通 + list 分面
  20. * /
  21. /**
  22. * options 处理
  23. * @param params
  24. */
  25. function defaultOptions(params) {
  26. var options = params.options;
  27. var compareField = options.compareField, xField = options.xField, yField = options.yField, locale = options.locale, funnelStyle = options.funnelStyle, data = options.data;
  28. var i18n = getLocale(locale);
  29. var defaultOption = {
  30. label: compareField
  31. ? {
  32. fields: [xField, yField, compareField, FUNNEL_PERCENT, FUNNEL_CONVERSATION],
  33. formatter: function (datum) { return "".concat(datum[yField]); },
  34. }
  35. : {
  36. fields: [xField, yField, FUNNEL_PERCENT, FUNNEL_CONVERSATION],
  37. offset: 0,
  38. position: 'middle',
  39. formatter: function (datum) { return "".concat(datum[xField], " ").concat(datum[yField]); },
  40. },
  41. tooltip: {
  42. title: xField,
  43. formatter: function (datum) {
  44. return { name: datum[xField], value: datum[yField] };
  45. },
  46. },
  47. conversionTag: {
  48. // conversionTag 的计算和显示逻辑统一保持一致
  49. formatter: function (datum) {
  50. return "".concat(i18n.get(['conversionTag', 'label']), ": ").concat(conversionTagFormatter.apply(void 0, datum[FUNNEL_CONVERSATION]));
  51. },
  52. },
  53. };
  54. // 漏斗图样式
  55. var style;
  56. if (compareField || funnelStyle) {
  57. style = function (datum) {
  58. return deepAssign({},
  59. // 对比漏斗图默认描边
  60. compareField && { lineWidth: 1, stroke: '#fff' }, isFunction(funnelStyle) ? funnelStyle(datum) : funnelStyle);
  61. };
  62. }
  63. return deepAssign({ options: defaultOption }, params, { options: { funnelStyle: style, data: clone(data) } });
  64. }
  65. /**
  66. * geometry处理
  67. * @param params
  68. */
  69. function geometry(params) {
  70. var options = params.options;
  71. var compareField = options.compareField, dynamicHeight = options.dynamicHeight, seriesField = options.seriesField;
  72. if (seriesField) {
  73. return facetFunnel(params);
  74. }
  75. if (compareField) {
  76. return compareFunnel(params);
  77. }
  78. if (dynamicHeight) {
  79. return dynamicHeightFunnel(params);
  80. }
  81. return basicFunnel(params);
  82. }
  83. /**
  84. * meta 配置
  85. * @param params
  86. */
  87. export function meta(params) {
  88. var _a;
  89. var options = params.options;
  90. var xAxis = options.xAxis, yAxis = options.yAxis, xField = options.xField, yField = options.yField;
  91. return flow(scale((_a = {},
  92. _a[xField] = xAxis,
  93. _a[yField] = yAxis,
  94. _a)))(params);
  95. }
  96. /**
  97. * 坐标轴
  98. * @param params
  99. */
  100. function axis(params) {
  101. var chart = params.chart;
  102. chart.axis(false);
  103. return params;
  104. }
  105. /**
  106. * legend 配置
  107. * @param params
  108. */
  109. function legend(params) {
  110. var chart = params.chart, options = params.options;
  111. var legend = options.legend;
  112. if (legend === false) {
  113. chart.legend(false);
  114. }
  115. else {
  116. chart.legend(legend);
  117. // TODO FIX: legend-click 时间和转化率组件之间的关联
  118. }
  119. return params;
  120. }
  121. /**
  122. * Interaction 配置
  123. * @param params
  124. */
  125. export function interaction(params) {
  126. var chart = params.chart, options = params.options;
  127. // @ts-ignore
  128. var interactions = options.interactions, dynamicHeight = options.dynamicHeight;
  129. each(interactions, function (i) {
  130. if (i.enable === false) {
  131. chart.removeInteraction(i.type);
  132. }
  133. else {
  134. chart.interaction(i.type, i.cfg || {});
  135. }
  136. });
  137. // 动态高度 不进行交互操作
  138. if (!dynamicHeight) {
  139. chart.interaction(FUNNEL_LEGEND_FILTER, {
  140. start: [__assign(__assign({}, interactionStart), { arg: options })],
  141. });
  142. }
  143. else {
  144. chart.removeInteraction(FUNNEL_LEGEND_FILTER);
  145. }
  146. return params;
  147. }
  148. /**
  149. * 漏斗图适配器
  150. * @param chart
  151. * @param options
  152. */
  153. export function adaptor(params) {
  154. return flow(defaultOptions, geometry, meta, axis, tooltip, interaction, legend, animation, theme, annotation())(params);
  155. }
  156. //# sourceMappingURL=adaptor.js.map