adaptor.js 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. import { __assign, __rest } from "tslib";
  2. import { each, filter, isMatch } from '@antv/util';
  3. import { brushInteraction } from '../../adaptor/brush';
  4. import { animation, annotation, interaction, limitInPlot, scale, scrollbar, slider, state, theme, transformations, } from '../../adaptor/common';
  5. import { connectedArea } from '../../adaptor/connected-area';
  6. import { conversionTag } from '../../adaptor/conversion-tag';
  7. import { interval } from '../../adaptor/geometries';
  8. import { pattern } from '../../adaptor/pattern';
  9. import { adjustYMetaByZero, deepAssign, findGeometry, flow, pick, transformLabel } from '../../utils';
  10. import { getDataWhetherPercentage, getDeepPercent } from '../../utils/transform/percent';
  11. /**
  12. * defaultOptions
  13. * @param params
  14. */
  15. function defaultOptions(params) {
  16. var options = params.options;
  17. // 默认 legend 位置
  18. var legend = options.legend;
  19. var seriesField = options.seriesField, isStack = options.isStack;
  20. if (seriesField) {
  21. if (legend !== false) {
  22. legend = __assign({ position: isStack ? 'right-top' : 'top-left' }, legend);
  23. }
  24. }
  25. else {
  26. legend = false;
  27. }
  28. // @ts-ignore 直接改值
  29. params.options.legend = legend;
  30. return params;
  31. }
  32. /**
  33. * 字段
  34. * @param params
  35. */
  36. function geometry(params) {
  37. var chart = params.chart, options = params.options;
  38. var data = options.data, columnStyle = options.columnStyle, color = options.color, columnWidthRatio = options.columnWidthRatio, isPercent = options.isPercent, isGroup = options.isGroup, isStack = options.isStack, xField = options.xField, yField = options.yField, seriesField = options.seriesField, groupField = options.groupField, tooltip = options.tooltip, shape = options.shape;
  39. var percentData = isPercent && isGroup && isStack
  40. ? getDeepPercent(data, yField, [xField, groupField], yField)
  41. : getDataWhetherPercentage(data, yField, xField, yField, isPercent);
  42. var chartData = [];
  43. // 存在堆叠,并且存在堆叠seriesField分类,并且不存在分组的时候 进行堆叠
  44. if (isStack && seriesField && !isGroup) {
  45. percentData.forEach(function (item) {
  46. var stackedItem = chartData.find(function (v) { return v[xField] === item[xField] && v[seriesField] === item[seriesField]; });
  47. if (stackedItem) {
  48. stackedItem[yField] += item[yField] || 0;
  49. }
  50. else {
  51. chartData.push(__assign({}, item));
  52. }
  53. });
  54. }
  55. else {
  56. chartData = percentData;
  57. }
  58. chart.data(chartData);
  59. // 百分比堆积图,默认会给一个 % 格式化逻辑, 用户可自定义
  60. var tooltipOptions = isPercent
  61. ? __assign({ formatter: function (datum) {
  62. var _a;
  63. return ({
  64. name: isGroup && isStack ? "".concat(datum[seriesField], " - ").concat(datum[groupField]) : (_a = datum[seriesField]) !== null && _a !== void 0 ? _a : datum[xField],
  65. value: (Number(datum[yField]) * 100).toFixed(2) + '%',
  66. });
  67. } }, tooltip) : tooltip;
  68. var p = deepAssign({}, params, {
  69. options: {
  70. data: chartData,
  71. widthRatio: columnWidthRatio,
  72. tooltip: tooltipOptions,
  73. interval: {
  74. shape: shape,
  75. style: columnStyle,
  76. color: color,
  77. },
  78. },
  79. });
  80. interval(p);
  81. return p;
  82. }
  83. /**
  84. * meta 配置
  85. * @param params
  86. */
  87. export function meta(params) {
  88. var _a, _b;
  89. var options = params.options;
  90. var xAxis = options.xAxis, yAxis = options.yAxis, xField = options.xField, yField = options.yField, data = options.data, isPercent = options.isPercent;
  91. var percentYMeta = isPercent ? { max: 1, min: 0, minLimit: 0, maxLimit: 1 } : {};
  92. return flow(scale((_a = {},
  93. _a[xField] = xAxis,
  94. _a[yField] = yAxis,
  95. _a), (_b = {},
  96. _b[xField] = {
  97. type: 'cat',
  98. },
  99. _b[yField] = __assign(__assign({}, adjustYMetaByZero(data, yField)), percentYMeta),
  100. _b)))(params);
  101. }
  102. /**
  103. * axis 配置
  104. * @param params
  105. */
  106. function axis(params) {
  107. var chart = params.chart, options = params.options;
  108. var xAxis = options.xAxis, yAxis = options.yAxis, xField = options.xField, yField = options.yField;
  109. // 为 false 则是不显示轴
  110. if (xAxis === false) {
  111. chart.axis(xField, false);
  112. }
  113. else {
  114. chart.axis(xField, xAxis);
  115. }
  116. if (yAxis === false) {
  117. chart.axis(yField, false);
  118. }
  119. else {
  120. chart.axis(yField, yAxis);
  121. }
  122. return params;
  123. }
  124. /**
  125. * legend 配置
  126. * @param params
  127. */
  128. export function legend(params) {
  129. var chart = params.chart, options = params.options;
  130. var legend = options.legend, seriesField = options.seriesField;
  131. if (legend && seriesField) {
  132. chart.legend(seriesField, legend);
  133. }
  134. else if (legend === false) {
  135. chart.legend(false);
  136. }
  137. return params;
  138. }
  139. /**
  140. * 数据标签
  141. * @param params
  142. */
  143. function label(params) {
  144. var chart = params.chart, options = params.options;
  145. var label = options.label, yField = options.yField, isRange = options.isRange;
  146. var geometry = findGeometry(chart, 'interval');
  147. if (!label) {
  148. geometry.label(false);
  149. }
  150. else {
  151. var callback = label.callback, cfg = __rest(label, ["callback"]);
  152. geometry.label({
  153. fields: [yField],
  154. callback: callback,
  155. cfg: __assign({
  156. // 配置默认的 label layout: 如果用户没有指定 layout 和 position, 则自动配置 layout
  157. layout: (cfg === null || cfg === void 0 ? void 0 : cfg.position)
  158. ? undefined
  159. : [
  160. { type: 'interval-adjust-position' },
  161. { type: 'interval-hide-overlap' },
  162. { type: 'adjust-color' },
  163. { type: 'limit-in-plot', cfg: { action: 'hide' } },
  164. ] }, transformLabel(isRange
  165. ? __assign({ content: function (item) {
  166. var _a;
  167. return (_a = item[yField]) === null || _a === void 0 ? void 0 : _a.join('-');
  168. } }, cfg) : cfg)),
  169. });
  170. }
  171. return params;
  172. }
  173. /**
  174. * 柱形图 tooltip 配置 (对堆叠、分组做特殊处理)
  175. * @param params
  176. */
  177. function columnTooltip(params) {
  178. var chart = params.chart, options = params.options;
  179. var tooltip = options.tooltip, isGroup = options.isGroup, isStack = options.isStack, groupField = options.groupField, data = options.data, xField = options.xField, yField = options.yField, seriesField = options.seriesField;
  180. if (tooltip === false) {
  181. chart.tooltip(false);
  182. }
  183. else {
  184. var tooltipOptions = tooltip;
  185. // fix: https://github.com/antvis/G2Plot/issues/2572
  186. if (isGroup && isStack) {
  187. var customItems_1 = tooltipOptions.customItems;
  188. var tooltipFormatter_1 = (tooltipOptions === null || tooltipOptions === void 0 ? void 0 : tooltipOptions.formatter) ||
  189. (function (datum) { return ({ name: "".concat(datum[seriesField], " - ").concat(datum[groupField]), value: datum[yField] }); });
  190. tooltipOptions = __assign(__assign({}, tooltipOptions), { customItems: function (originalItems) {
  191. var items = [];
  192. each(originalItems, function (item) {
  193. // Find datas in same cluster
  194. var datas = filter(data, function (d) { return isMatch(d, pick(item.data, [xField, seriesField])); });
  195. datas.forEach(function (datum) {
  196. items.push(__assign(__assign(__assign({}, item), { value: datum[yField], data: datum, mappingData: { _origin: datum } }), tooltipFormatter_1(datum)));
  197. });
  198. });
  199. // fix https://github.com/antvis/G2Plot/issues/3367
  200. return customItems_1 ? customItems_1(items) : items;
  201. } });
  202. }
  203. chart.tooltip(tooltipOptions);
  204. }
  205. return params;
  206. }
  207. /**
  208. * 柱形图适配器
  209. * @param params
  210. */
  211. export function adaptor(params, isBar) {
  212. if (isBar === void 0) { isBar = false; }
  213. var options = params.options;
  214. var seriesField = options.seriesField;
  215. return flow(defaultOptions, // 处理默认配置
  216. theme, // theme 需要在 geometry 之前
  217. pattern('columnStyle'), state, transformations('rect'), geometry, meta, axis, legend, columnTooltip, slider, scrollbar, label, brushInteraction, interaction, animation, annotation(), conversionTag(options.yField, !isBar, !!seriesField), // 有拆分的时候禁用转化率
  218. connectedArea(!options.isStack), limitInPlot)(params);
  219. }
  220. //# sourceMappingURL=adaptor.js.map