adaptor.js 9.1 KB

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