adaptor.js 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.adaptor = exports.axis = exports.legend = exports.LEGEND_SPACE = void 0;
  4. var tslib_1 = require("tslib");
  5. var util_1 = require("@antv/util");
  6. var common_1 = require("../../adaptor/common");
  7. var geometries_1 = require("../../adaptor/geometries");
  8. var utils_1 = require("../../utils");
  9. var constant_1 = require("./constant");
  10. require("./interactions");
  11. require("./label");
  12. require("./shape");
  13. var utils_2 = require("./utils");
  14. /** 图例默认预留空间 */
  15. exports.LEGEND_SPACE = 40;
  16. /**
  17. * 获取 color 映射
  18. */
  19. function colorMap(params, data, colorPalette) {
  20. var chart = params.chart, options = params.options;
  21. var blendMode = options.blendMode, setsField = options.setsField;
  22. var _a = chart.getTheme(), colors10 = _a.colors10, colors20 = _a.colors20;
  23. var palette = colorPalette;
  24. if (!(0, util_1.isArray)(palette)) {
  25. palette = data.filter(function (d) { return d[setsField].length === 1; }).length <= 10 ? colors10 : colors20;
  26. }
  27. var map = (0, utils_2.getColorMap)(palette, data, blendMode, setsField);
  28. return function (id) { return map.get(id) || palette[0]; };
  29. }
  30. /**
  31. * color options 转换
  32. */
  33. function transformColor(params, data) {
  34. var options = params.options;
  35. var color = options.color;
  36. if (typeof color !== 'function') {
  37. var colorPalette = typeof color === 'string' ? [color] : color;
  38. var map_1 = colorMap(params, data, colorPalette);
  39. return function (datum) { return map_1(datum[constant_1.ID_FIELD]); };
  40. }
  41. return color;
  42. }
  43. /**
  44. * 处理 padding
  45. */
  46. function padding(params) {
  47. var chart = params.chart, options = params.options;
  48. var legend = options.legend, appendPadding = options.appendPadding, padding = options.padding;
  49. // 处理 legend 的位置. 默认预留 40px, 业务上可以通过 appendPadding 增加
  50. var tempPadding = (0, utils_1.normalPadding)(appendPadding);
  51. if (legend !== false) {
  52. tempPadding = (0, utils_1.getAdjustAppendPadding)(appendPadding, (0, util_1.get)(legend, 'position'), exports.LEGEND_SPACE);
  53. }
  54. chart.appendPadding = (0, utils_1.resolveAllPadding)([tempPadding, padding]);
  55. return params;
  56. }
  57. /**
  58. * 处理非法数据
  59. * @param params
  60. */
  61. function data(params) {
  62. var options = params.options;
  63. /* 如遇到 交集 中存在 非法元素 的情况,就过滤掉
  64. * 如:
  65. * data = [
  66. * { sets: ['A'], size: 3 }, // 集合
  67. * { sets: ['B'], size: 4 }, // 集合
  68. * { sets: ['A', 'B'], size: 2 }, // 交集
  69. * { sets: ['A', 'B', 'C'], size: 2 }, // 交集 (存在非法 C,过滤该条数据)
  70. * ...
  71. * ]
  72. */
  73. var data = options['data'];
  74. if (!data) {
  75. (0, utils_1.log)(utils_1.LEVEL.WARN, false, 'warn: %s', '数据不能为空');
  76. data = [];
  77. }
  78. // 合法元素的集合:['A', 'B']
  79. var currSets = data.filter(function (datum) { return datum.sets.length === 1; }).map(function (datum) { return datum.sets[0]; });
  80. // 过滤 data
  81. var filterSets = data.filter(function (datum) {
  82. var sets = datum.sets;
  83. // 存在非法元素,就过滤这条数据
  84. return (0, utils_2.islegalSets)(currSets, sets);
  85. });
  86. if (!(0, util_1.isEqual)(filterSets, data))
  87. (0, utils_1.log)(utils_1.LEVEL.WARN, false, 'warn: %s', '交集中不能出现不存在的集合, 请输入合法数据');
  88. return (0, util_1.deepMix)({}, params, {
  89. options: {
  90. data: filterSets,
  91. },
  92. });
  93. }
  94. /**
  95. * geometry 处理
  96. * @param params
  97. */
  98. function geometry(params) {
  99. var chart = params.chart, options = params.options;
  100. var pointStyle = options.pointStyle, setsField = options.setsField, sizeField = options.sizeField;
  101. // 获取容器大小
  102. var _a = (0, utils_1.normalPadding)(chart.appendPadding), t = _a[0], r = _a[1], b = _a[2], l = _a[3];
  103. // 处理 legend 的位置. 默认预留 40px, 业务上可以通过 appendPadding 增加
  104. var customInfo = { offsetX: l, offsetY: t };
  105. // coordinateBBox + appendPadding = viewBBox, 不需要再计算 appendPadding 部分,因此直接使用 viewBBox
  106. var _b = chart.viewBBox, width = _b.width, height = _b.height;
  107. // 处理padding输入不合理的情况, w 和 h 不能为负数
  108. var vennData = (0, utils_2.layoutVennData)(options, Math.max(width - (r + l), 0), Math.max(height - (t + b), 0), 0);
  109. chart.data(vennData);
  110. var ext = (0, geometries_1.schema)((0, utils_1.deepAssign)({}, params, {
  111. options: {
  112. xField: 'x',
  113. yField: 'y',
  114. sizeField: sizeField,
  115. seriesField: constant_1.ID_FIELD,
  116. rawFields: [setsField, sizeField],
  117. schema: {
  118. shape: 'venn',
  119. style: pointStyle,
  120. },
  121. },
  122. })).ext;
  123. var geometry = ext.geometry;
  124. geometry.customInfo(customInfo);
  125. var colorOptions = transformColor(params, vennData);
  126. // 韦恩图试点, color 通道只能映射一个字段. 通过外部查找获取 datum
  127. if (typeof colorOptions === 'function') {
  128. geometry.color(constant_1.ID_FIELD, function (id) {
  129. var datum = vennData.find(function (d) { return d[constant_1.ID_FIELD] === id; });
  130. var defaultColor = colorMap(params, vennData)(id);
  131. return colorOptions(datum, defaultColor);
  132. });
  133. }
  134. return params;
  135. }
  136. /**
  137. * 处理 label
  138. * @param params
  139. */
  140. function label(params) {
  141. var chart = params.chart, options = params.options;
  142. var label = options.label;
  143. // 获取容器大小
  144. var _a = (0, utils_1.normalPadding)(chart.appendPadding), t = _a[0], l = _a[3];
  145. // 传入 label 布局函数所需的 自定义参数
  146. var customLabelInfo = { offsetX: l, offsetY: t };
  147. var geometry = (0, utils_1.findGeometry)(chart, 'schema');
  148. if (!label) {
  149. geometry.label(false);
  150. }
  151. else {
  152. var callback = label.callback, cfg = tslib_1.__rest(label, ["callback"]);
  153. geometry.label({
  154. fields: ['id'],
  155. callback: callback,
  156. cfg: (0, util_1.deepMix)({}, (0, utils_1.transformLabel)(cfg), {
  157. // 使用 G2 的 自定义label 修改位置
  158. type: 'venn',
  159. customLabelInfo: customLabelInfo,
  160. }),
  161. });
  162. }
  163. return params;
  164. }
  165. /**
  166. * legend 配置
  167. * @param params
  168. */
  169. function legend(params) {
  170. var chart = params.chart, options = params.options;
  171. var legend = options.legend, sizeField = options.sizeField;
  172. chart.legend(constant_1.ID_FIELD, legend);
  173. // 强制不开启 连续图例
  174. chart.legend(sizeField, false);
  175. return params;
  176. }
  177. exports.legend = legend;
  178. /**
  179. * 默认关闭坐标轴
  180. * @param params
  181. */
  182. function axis(params) {
  183. var chart = params.chart;
  184. chart.axis(false);
  185. return params;
  186. }
  187. exports.axis = axis;
  188. /**
  189. * 韦恩图 interaction 交互适配器
  190. */
  191. function vennInteraction(params) {
  192. var options = params.options, chart = params.chart;
  193. var interactions = options.interactions;
  194. if (interactions) {
  195. var MAP_1 = {
  196. 'legend-active': 'venn-legend-active',
  197. 'legend-highlight': 'venn-legend-highlight',
  198. };
  199. (0, common_1.interaction)((0, utils_1.deepAssign)({}, params, {
  200. options: {
  201. interactions: interactions.map(function (i) { return (tslib_1.__assign(tslib_1.__assign({}, i), { type: MAP_1[i.type] || i.type })); }),
  202. },
  203. }));
  204. }
  205. chart.removeInteraction('legend-active');
  206. chart.removeInteraction('legend-highlight');
  207. return params;
  208. }
  209. /**
  210. * 图适配器
  211. * @param chart
  212. * @param options
  213. */
  214. function adaptor(params) {
  215. // flow 的方式处理所有的配置到 G2 API
  216. return (0, utils_1.flow)(padding, common_1.theme, data, geometry, label, (0, common_1.scale)({}), legend, axis, common_1.tooltip, vennInteraction, common_1.animation
  217. // ... 其他的 adaptor flow
  218. )(params);
  219. }
  220. exports.adaptor = adaptor;
  221. //# sourceMappingURL=adaptor.js.map