@visactor/vseed 0.5.4 → 0.5.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (217) hide show
  1. package/dist/cjs/index.cjs +2 -2
  2. package/dist/cjs/index.cjs.map +1 -1
  3. package/dist/esm/builder/register/all.js +3 -1
  4. package/dist/esm/builder/register/all.js.map +1 -1
  5. package/dist/esm/builder/register/chartType/hierarchySankey.d.ts +4 -0
  6. package/dist/esm/builder/register/chartType/hierarchySankey.js +9 -0
  7. package/dist/esm/builder/register/chartType/hierarchySankey.js.map +1 -0
  8. package/dist/esm/builder/register/chartType/index.d.ts +2 -0
  9. package/dist/esm/builder/register/chartType/index.js +2 -0
  10. package/dist/esm/builder/register/chartType/sankey.d.ts +1 -0
  11. package/dist/esm/builder/register/chartType/sankey.js +9 -0
  12. package/dist/esm/builder/register/chartType/sankey.js.map +1 -0
  13. package/dist/esm/dataReshape/constant.d.ts +2 -0
  14. package/dist/esm/dataReshape/constant.js +3 -1
  15. package/dist/esm/dataReshape/constant.js.map +1 -1
  16. package/dist/esm/dataReshape/unfoldDimensions.js +8 -2
  17. package/dist/esm/dataReshape/unfoldDimensions.js.map +1 -1
  18. package/dist/esm/index.d.ts +1 -1
  19. package/dist/esm/index.js +1 -1
  20. package/dist/esm/pipeline/advanced/chart/pipeline/hierarchySankey.d.ts +2 -0
  21. package/dist/esm/pipeline/advanced/chart/pipeline/hierarchySankey.js +33 -0
  22. package/dist/esm/pipeline/advanced/chart/pipeline/hierarchySankey.js.map +1 -0
  23. package/dist/esm/pipeline/advanced/chart/pipeline/index.d.ts +2 -0
  24. package/dist/esm/pipeline/advanced/chart/pipeline/index.js +2 -0
  25. package/dist/esm/pipeline/advanced/chart/pipeline/sankey.d.ts +2 -0
  26. package/dist/esm/pipeline/advanced/chart/pipeline/sankey.js +33 -0
  27. package/dist/esm/pipeline/advanced/chart/pipeline/sankey.js.map +1 -0
  28. package/dist/esm/pipeline/advanced/chart/pipes/config/hierarchySankey.d.ts +2 -0
  29. package/dist/esm/pipeline/advanced/chart/pipes/config/hierarchySankey.js +27 -0
  30. package/dist/esm/pipeline/advanced/chart/pipes/config/hierarchySankey.js.map +1 -0
  31. package/dist/esm/pipeline/advanced/chart/pipes/config/index.d.ts +2 -0
  32. package/dist/esm/pipeline/advanced/chart/pipes/config/index.js +2 -0
  33. package/dist/esm/pipeline/advanced/chart/pipes/config/index.js.map +1 -1
  34. package/dist/esm/pipeline/advanced/chart/pipes/config/sankey.d.ts +2 -0
  35. package/dist/esm/pipeline/advanced/chart/pipes/config/sankey.js +27 -0
  36. package/dist/esm/pipeline/advanced/chart/pipes/config/sankey.js.map +1 -0
  37. package/dist/esm/pipeline/advanced/chart/pipes/encoding/index.d.ts +1 -0
  38. package/dist/esm/pipeline/advanced/chart/pipes/encoding/index.js +1 -0
  39. package/dist/esm/pipeline/advanced/chart/pipes/encoding/sankey.d.ts +3 -0
  40. package/dist/esm/pipeline/advanced/chart/pipes/encoding/sankey.js +83 -0
  41. package/dist/esm/pipeline/advanced/chart/pipes/encoding/sankey.js.map +1 -0
  42. package/dist/esm/pipeline/spec/chart/pipeline/hierarchySankey.d.ts +1 -0
  43. package/dist/esm/pipeline/spec/chart/pipeline/hierarchySankey.js +39 -0
  44. package/dist/esm/pipeline/spec/chart/pipeline/hierarchySankey.js.map +1 -0
  45. package/dist/esm/pipeline/spec/chart/pipeline/index.d.ts +2 -0
  46. package/dist/esm/pipeline/spec/chart/pipeline/index.js +2 -0
  47. package/dist/esm/pipeline/spec/chart/pipeline/sankey.d.ts +1 -0
  48. package/dist/esm/pipeline/spec/chart/pipeline/sankey.js +39 -0
  49. package/dist/esm/pipeline/spec/chart/pipeline/sankey.js.map +1 -0
  50. package/dist/esm/pipeline/spec/chart/pipes/annotation/annotationPointOfDualAxis.js +11 -2
  51. package/dist/esm/pipeline/spec/chart/pipes/annotation/annotationPointOfDualAxis.js.map +1 -1
  52. package/dist/esm/pipeline/spec/chart/pipes/dataset/datasetHierarchy.js +5 -2
  53. package/dist/esm/pipeline/spec/chart/pipes/dataset/datasetHierarchy.js.map +1 -1
  54. package/dist/esm/pipeline/spec/chart/pipes/dataset/datasetHierarchySankey.d.ts +4 -0
  55. package/dist/esm/pipeline/spec/chart/pipes/dataset/datasetHierarchySankey.js +136 -0
  56. package/dist/esm/pipeline/spec/chart/pipes/dataset/datasetHierarchySankey.js.map +1 -0
  57. package/dist/esm/pipeline/spec/chart/pipes/dataset/datasetPivotHierarchy.d.ts +1 -0
  58. package/dist/esm/pipeline/spec/chart/pipes/dataset/datasetPivotHierarchy.js +1 -1
  59. package/dist/esm/pipeline/spec/chart/pipes/dataset/datasetPivotHierarchy.js.map +1 -1
  60. package/dist/esm/pipeline/spec/chart/pipes/dataset/datasetPivotHierarchySankey.d.ts +2 -0
  61. package/dist/esm/pipeline/spec/chart/pipes/dataset/datasetPivotHierarchySankey.js +44 -0
  62. package/dist/esm/pipeline/spec/chart/pipes/dataset/datasetPivotHierarchySankey.js.map +1 -0
  63. package/dist/esm/pipeline/spec/chart/pipes/dataset/datasetPivotSankey.d.ts +2 -0
  64. package/dist/esm/pipeline/spec/chart/pipes/dataset/datasetPivotSankey.js +50 -0
  65. package/dist/esm/pipeline/spec/chart/pipes/dataset/datasetPivotSankey.js.map +1 -0
  66. package/dist/esm/pipeline/spec/chart/pipes/dataset/datasetSankey.d.ts +16 -0
  67. package/dist/esm/pipeline/spec/chart/pipes/dataset/datasetSankey.js +97 -0
  68. package/dist/esm/pipeline/spec/chart/pipes/dataset/datasetSankey.js.map +1 -0
  69. package/dist/esm/pipeline/spec/chart/pipes/dataset/index.d.ts +4 -0
  70. package/dist/esm/pipeline/spec/chart/pipes/dataset/index.js +4 -0
  71. package/dist/esm/pipeline/spec/chart/pipes/init/circlePacking.js +1 -1
  72. package/dist/esm/pipeline/spec/chart/pipes/init/circlePacking.js.map +1 -1
  73. package/dist/esm/pipeline/spec/chart/pipes/init/hierarchySankey.d.ts +2 -0
  74. package/dist/esm/pipeline/spec/chart/pipes/init/hierarchySankey.js +32 -0
  75. package/dist/esm/pipeline/spec/chart/pipes/init/hierarchySankey.js.map +1 -0
  76. package/dist/esm/pipeline/spec/chart/pipes/init/index.d.ts +2 -0
  77. package/dist/esm/pipeline/spec/chart/pipes/init/index.js +2 -0
  78. package/dist/esm/pipeline/spec/chart/pipes/init/sankey.d.ts +2 -0
  79. package/dist/esm/pipeline/spec/chart/pipes/init/sankey.js +33 -0
  80. package/dist/esm/pipeline/spec/chart/pipes/init/sankey.js.map +1 -0
  81. package/dist/esm/pipeline/spec/chart/pipes/init/sunburst.js +1 -1
  82. package/dist/esm/pipeline/spec/chart/pipes/init/sunburst.js.map +1 -1
  83. package/dist/esm/pipeline/spec/chart/pipes/init/treeMap.js +1 -1
  84. package/dist/esm/pipeline/spec/chart/pipes/init/treeMap.js.map +1 -1
  85. package/dist/esm/pipeline/spec/chart/pipes/label/index.d.ts +2 -0
  86. package/dist/esm/pipeline/spec/chart/pipes/label/index.js +2 -0
  87. package/dist/esm/pipeline/spec/chart/pipes/label/label.js.map +1 -1
  88. package/dist/esm/pipeline/spec/chart/pipes/label/labelHierarchySankey.d.ts +17 -0
  89. package/dist/esm/pipeline/spec/chart/pipes/label/labelHierarchySankey.js +92 -0
  90. package/dist/esm/pipeline/spec/chart/pipes/label/labelHierarchySankey.js.map +1 -0
  91. package/dist/esm/pipeline/spec/chart/pipes/label/labelSankey.d.ts +2 -0
  92. package/dist/esm/pipeline/spec/chart/pipes/label/labelSankey.js +78 -0
  93. package/dist/esm/pipeline/spec/chart/pipes/label/labelSankey.js.map +1 -0
  94. package/dist/esm/pipeline/spec/chart/pipes/label/labelTreeMapLeaf.js +4 -4
  95. package/dist/esm/pipeline/spec/chart/pipes/label/labelTreeMapLeaf.js.map +1 -1
  96. package/dist/esm/pipeline/spec/chart/pipes/legend/pivotColorLegend.js +1 -1
  97. package/dist/esm/pipeline/spec/chart/pipes/legend/pivotColorLegend.js.map +1 -1
  98. package/dist/esm/pipeline/spec/chart/pipes/legend/pivotDiscreteLegend.js +1 -1
  99. package/dist/esm/pipeline/spec/chart/pipes/legend/pivotDiscreteLegend.js.map +1 -1
  100. package/dist/esm/pipeline/spec/chart/pipes/markStyle/index.d.ts +1 -0
  101. package/dist/esm/pipeline/spec/chart/pipes/markStyle/index.js +1 -0
  102. package/dist/esm/pipeline/spec/chart/pipes/markStyle/sankeyInteractive.d.ts +2 -0
  103. package/dist/esm/pipeline/spec/chart/pipes/markStyle/sankeyInteractive.js +33 -0
  104. package/dist/esm/pipeline/spec/chart/pipes/markStyle/sankeyInteractive.js.map +1 -0
  105. package/dist/esm/pipeline/spec/chart/pipes/tooltip/index.d.ts +2 -0
  106. package/dist/esm/pipeline/spec/chart/pipes/tooltip/index.js +2 -0
  107. package/dist/esm/pipeline/spec/chart/pipes/tooltip/tooltipHierarchySankey.d.ts +2 -0
  108. package/dist/esm/pipeline/spec/chart/pipes/tooltip/tooltipHierarchySankey.js +150 -0
  109. package/dist/esm/pipeline/spec/chart/pipes/tooltip/tooltipHierarchySankey.js.map +1 -0
  110. package/dist/esm/pipeline/spec/chart/pipes/tooltip/tooltipSankey.d.ts +2 -0
  111. package/dist/esm/pipeline/spec/chart/pipes/tooltip/tooltipSankey.js +75 -0
  112. package/dist/esm/pipeline/spec/chart/pipes/tooltip/tooltipSankey.js.map +1 -0
  113. package/dist/esm/pipeline/utils/chatType.d.ts +2 -0
  114. package/dist/esm/pipeline/utils/chatType.js +3 -1
  115. package/dist/esm/pipeline/utils/chatType.js.map +1 -1
  116. package/dist/esm/pipeline/utils/constant.d.ts +2 -0
  117. package/dist/esm/pipeline/utils/constant.js +2 -0
  118. package/dist/esm/pipeline/utils/constant.js.map +1 -1
  119. package/dist/esm/pipeline/utils/measures/typeGuard.js +1 -1
  120. package/dist/esm/pipeline/utils/measures/typeGuard.js.map +1 -1
  121. package/dist/esm/theme/dark/dark.js +3 -1
  122. package/dist/esm/theme/dark/dark.js.map +1 -1
  123. package/dist/esm/theme/dark/hierarchy.d.ts +132 -0
  124. package/dist/esm/theme/dark/hierarchy.js +3 -1
  125. package/dist/esm/theme/dark/hierarchy.js.map +1 -1
  126. package/dist/esm/theme/light/hierarchy.d.ts +132 -0
  127. package/dist/esm/theme/light/hierarchy.js +3 -1
  128. package/dist/esm/theme/light/hierarchy.js.map +1 -1
  129. package/dist/esm/theme/light/light.js +3 -1
  130. package/dist/esm/theme/light/light.js.map +1 -1
  131. package/dist/esm/types/chartType/area/zArea.d.ts +4 -0
  132. package/dist/esm/types/chartType/areaPercent/zAreaPercent.d.ts +4 -0
  133. package/dist/esm/types/chartType/bar/zBar.d.ts +4 -0
  134. package/dist/esm/types/chartType/barParallel/zBarParallel.d.ts +4 -0
  135. package/dist/esm/types/chartType/barPercent/zBarPercent.d.ts +4 -0
  136. package/dist/esm/types/chartType/boxPlot/zBoxPlot.d.ts +4 -0
  137. package/dist/esm/types/chartType/circlePacking/zCirclePacking.d.ts +2 -0
  138. package/dist/esm/types/chartType/column/zColumn.d.ts +4 -0
  139. package/dist/esm/types/chartType/columnParallel/zColumnParallel.d.ts +4 -0
  140. package/dist/esm/types/chartType/columnPercent/zColumnPercent.d.ts +4 -0
  141. package/dist/esm/types/chartType/donut/zDonut.d.ts +4 -0
  142. package/dist/esm/types/chartType/dualAxis/zDualAxis.d.ts +2 -0
  143. package/dist/esm/types/chartType/funnel/zFunnel.d.ts +4 -0
  144. package/dist/esm/types/chartType/heatmap/zHeatmap.d.ts +2 -0
  145. package/dist/esm/types/chartType/hierarchySankey/hierarchySankey.d.ts +92 -0
  146. package/dist/esm/types/chartType/hierarchySankey/hierarchySankey.js +0 -0
  147. package/dist/esm/types/chartType/hierarchySankey/index.d.ts +2 -0
  148. package/dist/esm/types/chartType/hierarchySankey/index.js +1 -0
  149. package/dist/esm/types/chartType/hierarchySankey/zHierarchySankey.d.ts +422 -0
  150. package/dist/esm/types/chartType/hierarchySankey/zHierarchySankey.js +20 -0
  151. package/dist/esm/types/chartType/hierarchySankey/zHierarchySankey.js.map +1 -0
  152. package/dist/esm/types/chartType/histogram/zHistogram.d.ts +4 -0
  153. package/dist/esm/types/chartType/index.d.ts +2 -0
  154. package/dist/esm/types/chartType/index.js +2 -0
  155. package/dist/esm/types/chartType/line/zLine.d.ts +4 -0
  156. package/dist/esm/types/chartType/pie/zPie.d.ts +4 -0
  157. package/dist/esm/types/chartType/pivotTable/zPivotTable.d.ts +2 -0
  158. package/dist/esm/types/chartType/raceBar/zRaceBar.d.ts +4 -0
  159. package/dist/esm/types/chartType/raceColumn/zRaceColumn.d.ts +4 -0
  160. package/dist/esm/types/chartType/raceDonut/zRaceDonut.d.ts +4 -0
  161. package/dist/esm/types/chartType/raceLine/zRaceLine.d.ts +4 -0
  162. package/dist/esm/types/chartType/racePie/zRacePie.d.ts +4 -0
  163. package/dist/esm/types/chartType/raceScatter/zRaceScatter.d.ts +4 -0
  164. package/dist/esm/types/chartType/radar/zRadar.d.ts +4 -0
  165. package/dist/esm/types/chartType/rose/zRose.d.ts +4 -0
  166. package/dist/esm/types/chartType/roseParallel/zRoseParallel.d.ts +4 -0
  167. package/dist/esm/types/chartType/sankey/index.d.ts +2 -0
  168. package/dist/esm/types/chartType/sankey/index.js +1 -0
  169. package/dist/esm/types/chartType/sankey/sankey.d.ts +91 -0
  170. package/dist/esm/types/chartType/sankey/sankey.js +0 -0
  171. package/dist/esm/types/chartType/sankey/zSankey.d.ts +422 -0
  172. package/dist/esm/types/chartType/sankey/zSankey.js +20 -0
  173. package/dist/esm/types/chartType/sankey/zSankey.js.map +1 -0
  174. package/dist/esm/types/chartType/scatter/zScatter.d.ts +4 -0
  175. package/dist/esm/types/chartType/sunburst/zSunburst.d.ts +2 -0
  176. package/dist/esm/types/chartType/table/zTable.d.ts +2 -0
  177. package/dist/esm/types/chartType/treeMap/zTreeMap.d.ts +2 -0
  178. package/dist/esm/types/properties/chartType/chartType.d.ts +3 -1
  179. package/dist/esm/types/properties/chartType/chartType.js +2 -0
  180. package/dist/esm/types/properties/chartType/chartType.js.map +1 -1
  181. package/dist/esm/types/properties/config/config.d.ts +602 -0
  182. package/dist/esm/types/properties/config/config.js +4 -0
  183. package/dist/esm/types/properties/config/config.js.map +1 -1
  184. package/dist/esm/types/properties/config/hierarchySankey.d.ts +303 -0
  185. package/dist/esm/types/properties/config/hierarchySankey.js +18 -0
  186. package/dist/esm/types/properties/config/hierarchySankey.js.map +1 -0
  187. package/dist/esm/types/properties/config/index.d.ts +2 -0
  188. package/dist/esm/types/properties/config/index.js +2 -0
  189. package/dist/esm/types/properties/config/sankey.d.ts +303 -0
  190. package/dist/esm/types/properties/config/sankey.js +18 -0
  191. package/dist/esm/types/properties/config/sankey.js.map +1 -0
  192. package/dist/esm/types/properties/datasetReshapeInfo/datasetReshapeInfo.d.ts +2 -0
  193. package/dist/esm/types/properties/datasetReshapeInfo/zDatasetReshapeInfo.d.ts +4 -0
  194. package/dist/esm/types/properties/datasetReshapeInfo/zDatasetReshapeInfo.js +2 -0
  195. package/dist/esm/types/properties/datasetReshapeInfo/zDatasetReshapeInfo.js.map +1 -1
  196. package/dist/esm/types/properties/dimensions/index.d.ts +1 -0
  197. package/dist/esm/types/properties/dimensions/sankeyDimension.d.ts +15 -0
  198. package/dist/esm/types/properties/dimensions/sankeyDimension.js +0 -0
  199. package/dist/esm/types/properties/dimensions/zDimensions.d.ts +6 -0
  200. package/dist/esm/types/properties/encoding/dimensionEncoding.d.ts +3 -1
  201. package/dist/esm/types/properties/encoding/encoding.d.ts +8 -0
  202. package/dist/esm/types/properties/encoding/zDimensionEncoding.d.ts +4 -0
  203. package/dist/esm/types/properties/encoding/zDimensionEncoding.js +6 -2
  204. package/dist/esm/types/properties/encoding/zDimensionEncoding.js.map +1 -1
  205. package/dist/esm/types/properties/encoding/zEncoding.d.ts +4 -0
  206. package/dist/esm/types/properties/encoding/zEncoding.js +5 -1
  207. package/dist/esm/types/properties/encoding/zEncoding.js.map +1 -1
  208. package/dist/esm/types/properties/measures/index.d.ts +1 -0
  209. package/dist/esm/types/properties/measures/sankeyMeasure.d.ts +11 -0
  210. package/dist/esm/types/properties/measures/sankeyMeasure.js +0 -0
  211. package/dist/esm/types/properties/theme/customTheme.d.ts +3752 -2548
  212. package/dist/esm/types/vseed.d.ts +2 -2
  213. package/dist/esm/types/zVseed.js +3 -1
  214. package/dist/esm/types/zVseed.js.map +1 -1
  215. package/dist/umd/index.js +1309 -182
  216. package/dist/umd/index.js.map +1 -1
  217. package/package.json +1 -1
@@ -0,0 +1,97 @@
1
+ import { ColorEncoding, Separator } from "../../../../../dataReshape/index.js";
2
+ const getNodeInfo = (datum, encodedField, sourceFields, foldInfo)=>{
3
+ const id = String(datum[encodedField] ?? '');
4
+ if (!sourceFields.length) return {
5
+ id,
6
+ nodeName: id
7
+ };
8
+ const nodeName = sourceFields.map((field)=>{
9
+ const value = String(datum[field] ?? '');
10
+ return field === foldInfo?.measureId && foldInfo.measureName && void 0 !== datum[foldInfo.measureName] ? String(datum[foldInfo.measureName]) : value;
11
+ }).join(Separator);
12
+ return {
13
+ id,
14
+ nodeName: nodeName || id
15
+ };
16
+ };
17
+ const buildSankeyData = (dataset, sourceField, targetField, valueField, options = {})=>{
18
+ const nodeIndexMap = new Map();
19
+ const nodeNameMap = new Map();
20
+ const nodeColorMap = new Map();
21
+ const linksMap = new Map();
22
+ const { foldInfo, sourceFields = [], targetFields = [] } = options;
23
+ const ensureNode = (node)=>{
24
+ const { id, nodeName } = node;
25
+ if (!nodeIndexMap.has(id)) {
26
+ nodeIndexMap.set(id, nodeIndexMap.size);
27
+ nodeNameMap.set(id, nodeName);
28
+ }
29
+ return nodeIndexMap.get(id);
30
+ };
31
+ dataset.forEach((datum)=>{
32
+ const sourceNode = getNodeInfo(datum, sourceField, sourceFields, foldInfo);
33
+ const targetNode = getNodeInfo(datum, targetField, targetFields, foldInfo);
34
+ const rawValue = Number(datum[valueField] ?? 0);
35
+ const colorCategory = datum[ColorEncoding];
36
+ const colorCategoryValue = null == colorCategory || '' === colorCategory ? void 0 : String(colorCategory);
37
+ if (!sourceNode.id || !targetNode.id || Number.isNaN(rawValue)) return;
38
+ const source = ensureNode(sourceNode);
39
+ const target = ensureNode(targetNode);
40
+ if (!nodeColorMap.has(sourceNode.id) && colorCategoryValue) nodeColorMap.set(sourceNode.id, colorCategoryValue);
41
+ if (!nodeColorMap.has(targetNode.id) && colorCategoryValue) nodeColorMap.set(targetNode.id, colorCategoryValue);
42
+ const linkKey = `${source}__${target}`;
43
+ const prev = linksMap.get(linkKey);
44
+ if (prev) prev.value += rawValue;
45
+ else {
46
+ const linkDatum = {
47
+ source,
48
+ target,
49
+ value: rawValue,
50
+ sourceNodeName: sourceNode.nodeName,
51
+ targetNodeName: targetNode.nodeName
52
+ };
53
+ if (colorCategoryValue) linkDatum[ColorEncoding] = colorCategoryValue;
54
+ linksMap.set(linkKey, linkDatum);
55
+ }
56
+ });
57
+ const nodes = Array.from(nodeIndexMap.entries()).sort((a, b)=>a[1] - b[1]).map(([id])=>{
58
+ const nodeDatum = {
59
+ id,
60
+ nodeName: nodeNameMap.get(id) || id
61
+ };
62
+ const nodeColor = nodeColorMap.get(id);
63
+ if (nodeColor) nodeDatum[ColorEncoding] = nodeColor;
64
+ return nodeDatum;
65
+ });
66
+ return {
67
+ nodes,
68
+ links: Array.from(linksMap.values())
69
+ };
70
+ };
71
+ const datasetSankey = (spec, context)=>{
72
+ const result = {
73
+ ...spec
74
+ };
75
+ const { advancedVSeed } = context;
76
+ const { dataset = [], datasetReshapeInfo } = advancedVSeed;
77
+ const { foldInfo, unfoldInfo } = datasetReshapeInfo[0];
78
+ const sourceFields = advancedVSeed.encoding?.source || [];
79
+ const targetFields = advancedVSeed.encoding?.target || [];
80
+ const graphData = buildSankeyData(dataset, unfoldInfo.encodingSource || 'source', unfoldInfo.encodingTarget || 'target', foldInfo.measureValue, {
81
+ foldInfo,
82
+ sourceFields,
83
+ targetFields
84
+ });
85
+ result.data = [
86
+ {
87
+ id: 'data',
88
+ values: [
89
+ graphData
90
+ ]
91
+ }
92
+ ];
93
+ return result;
94
+ };
95
+ export { buildSankeyData, datasetSankey };
96
+
97
+ //# sourceMappingURL=datasetSankey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline/spec/chart/pipes/dataset/datasetSankey.js","sources":["../../../../../../../src/pipeline/spec/chart/pipes/dataset/datasetSankey.ts"],"sourcesContent":["import { ColorEncoding, Separator } from 'src/dataReshape'\nimport type { Datum, FoldInfo, VChartSpecPipe } from 'src/types'\n\ntype SankeyDataOptions = {\n foldInfo?: Pick<FoldInfo, 'measureId' | 'measureName'>\n sourceFields?: string[]\n targetFields?: string[]\n}\n\ntype SankeyNodeInfo = {\n id: string\n nodeName: string\n}\n\nconst getNodeInfo = (\n datum: Datum,\n encodedField: string,\n sourceFields: string[],\n foldInfo?: Pick<FoldInfo, 'measureId' | 'measureName'>,\n) => {\n const id = String(datum[encodedField] ?? '')\n\n if (!sourceFields.length) {\n return {\n id,\n nodeName: id,\n }\n }\n\n const nodeName = sourceFields\n .map((field) => {\n const value = String(datum[field] ?? '')\n return field === foldInfo?.measureId && foldInfo.measureName && datum[foldInfo.measureName] !== undefined\n ? String(datum[foldInfo.measureName])\n : value\n })\n .join(Separator)\n\n return {\n id,\n nodeName: nodeName || id,\n }\n}\n\nexport const buildSankeyData = (\n dataset: Datum[],\n sourceField: string,\n targetField: string,\n valueField: string,\n options: SankeyDataOptions = {},\n) => {\n const nodeIndexMap = new Map<string, number>()\n const nodeNameMap = new Map<string, string>()\n const nodeColorMap = new Map<string, string>()\n const linksMap = new Map<\n string,\n { source: number; target: number; value: number } & Record<string, string | number>\n >()\n const { foldInfo, sourceFields = [], targetFields = [] } = options\n\n const ensureNode = (node: SankeyNodeInfo) => {\n const { id, nodeName } = node\n if (!nodeIndexMap.has(id)) {\n nodeIndexMap.set(id, nodeIndexMap.size)\n nodeNameMap.set(id, nodeName)\n }\n return nodeIndexMap.get(id)!\n }\n\n dataset.forEach((datum) => {\n const sourceNode = getNodeInfo(datum, sourceField, sourceFields, foldInfo)\n const targetNode = getNodeInfo(datum, targetField, targetFields, foldInfo)\n const rawValue = Number(datum[valueField] ?? 0)\n const colorCategory = datum[ColorEncoding]\n const colorCategoryValue =\n colorCategory === undefined || colorCategory === null || colorCategory === '' ? undefined : String(colorCategory)\n\n if (!sourceNode.id || !targetNode.id || Number.isNaN(rawValue)) {\n return\n }\n\n const source = ensureNode(sourceNode)\n const target = ensureNode(targetNode)\n\n if (!nodeColorMap.has(sourceNode.id) && colorCategoryValue) {\n nodeColorMap.set(sourceNode.id, colorCategoryValue)\n }\n if (!nodeColorMap.has(targetNode.id) && colorCategoryValue) {\n nodeColorMap.set(targetNode.id, colorCategoryValue)\n }\n\n const linkKey = `${source}__${target}`\n const prev = linksMap.get(linkKey)\n\n if (prev) {\n prev.value += rawValue\n } else {\n const linkDatum: { source: number; target: number; value: number } & Record<string, string | number> = {\n source,\n target,\n value: rawValue,\n sourceNodeName: sourceNode.nodeName,\n targetNodeName: targetNode.nodeName,\n }\n\n if (colorCategoryValue) {\n linkDatum[ColorEncoding] = colorCategoryValue\n }\n\n linksMap.set(linkKey, linkDatum)\n }\n })\n\n const nodes = Array.from(nodeIndexMap.entries())\n .sort((a, b) => a[1] - b[1])\n .map(([id]) => {\n const nodeDatum: Record<string, string | number> = {\n id,\n nodeName: nodeNameMap.get(id) || id,\n }\n const nodeColor = nodeColorMap.get(id)\n\n if (nodeColor) {\n nodeDatum[ColorEncoding] = nodeColor\n }\n\n return nodeDatum\n })\n\n return {\n nodes,\n links: Array.from(linksMap.values()),\n }\n}\n\nexport const datasetSankey: VChartSpecPipe = (spec, context) => {\n const result = { ...spec } as Record<string, any>\n const { advancedVSeed } = context\n const { dataset = [], datasetReshapeInfo } = advancedVSeed\n const { foldInfo, unfoldInfo } = datasetReshapeInfo[0]\n const sourceFields = (advancedVSeed.encoding as Datum)?.source || []\n const targetFields = (advancedVSeed.encoding as Datum)?.target || []\n const graphData = buildSankeyData(\n dataset as Datum[],\n unfoldInfo.encodingSource || 'source',\n unfoldInfo.encodingTarget || 'target',\n foldInfo.measureValue,\n {\n foldInfo,\n sourceFields,\n targetFields,\n },\n )\n\n result.data = [\n {\n id: 'data',\n values: [graphData] as any,\n },\n ]\n\n return result as any\n}\n"],"names":["getNodeInfo","datum","encodedField","sourceFields","foldInfo","id","String","nodeName","field","value","undefined","Separator","buildSankeyData","dataset","sourceField","targetField","valueField","options","nodeIndexMap","Map","nodeNameMap","nodeColorMap","linksMap","targetFields","ensureNode","node","sourceNode","targetNode","rawValue","Number","colorCategory","ColorEncoding","colorCategoryValue","source","target","linkKey","prev","linkDatum","nodes","Array","a","b","nodeDatum","nodeColor","datasetSankey","spec","context","result","advancedVSeed","datasetReshapeInfo","unfoldInfo","graphData"],"mappings":"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"}
@@ -7,4 +7,8 @@ export { datasetScatter } from './datasetScatter';
7
7
  export { datasetHistogram } from './datasetHistogram';
8
8
  export { datasetBoxplot } from './datasetBoxplot';
9
9
  export { datasetHierarchy } from './datasetHierarchy';
10
+ export { datasetHierarchySankey } from './datasetHierarchySankey';
11
+ export { datasetSankey } from './datasetSankey';
10
12
  export { datasetPivotHierarchy } from './datasetPivotHierarchy';
13
+ export { datasetPivotHierarchySankey } from './datasetPivotHierarchySankey';
14
+ export { datasetPivotSankey } from './datasetPivotSankey';
@@ -7,4 +7,8 @@ export { datasetScatter } from "./datasetScatter.js";
7
7
  export { datasetHistogram } from "./datasetHistogram.js";
8
8
  export { datasetBoxplot } from "./datasetBoxplot.js";
9
9
  export { datasetHierarchy } from "./datasetHierarchy.js";
10
+ export { datasetHierarchySankey } from "./datasetHierarchySankey.js";
11
+ export { datasetSankey } from "./datasetSankey.js";
10
12
  export { datasetPivotHierarchy } from "./datasetPivotHierarchy.js";
13
+ export { datasetPivotHierarchySankey } from "./datasetPivotHierarchySankey.js";
14
+ export { datasetPivotSankey } from "./datasetPivotSankey.js";
@@ -6,7 +6,7 @@ const initCirclePacking = (spec, context)=>{
6
6
  const { datasetReshapeInfo } = advancedVSeed;
7
7
  const { foldInfo } = datasetReshapeInfo[0];
8
8
  result.type = 'circlePacking';
9
- result.categoryField = 'name';
9
+ result.categoryField = 'key';
10
10
  result.valueField = foldInfo.measureValue;
11
11
  result.circlePacking = {
12
12
  style: {
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline/spec/chart/pipes/init/circlePacking.js","sources":["../../../../../../../src/pipeline/spec/chart/pipes/init/circlePacking.ts"],"sourcesContent":["import type { VChartSpecPipe } from 'src/types'\nimport type { ICirclePackingChartSpec } from '@visactor/vchart'\n\nexport const initCirclePacking: VChartSpecPipe = (spec, context) => {\n const result = { ...spec } as ICirclePackingChartSpec\n const { advancedVSeed } = context\n const { datasetReshapeInfo } = advancedVSeed\n const { foldInfo } = datasetReshapeInfo[0]\n\n result.type = 'circlePacking'\n result.categoryField = 'name'\n result.valueField = foldInfo.measureValue\n // Style configuration\n result.circlePacking = {\n style: {\n fillOpacity: (d: any) => (d.isLeaf ? 0.75 : 0.25),\n },\n }\n result.layoutPadding = [0, 10, 10]\n result.padding = 0\n // Animation configuration\n result.animationEnter = {\n easing: 'cubicInOut',\n }\n result.animationExit = {\n easing: 'cubicInOut',\n }\n result.animationUpdate = {\n easing: 'cubicInOut',\n }\n\n return result\n}\n"],"names":["initCirclePacking","spec","context","result","advancedVSeed","datasetReshapeInfo","foldInfo","d"],"mappings":"AAGO,MAAMA,oBAAoC,CAACC,MAAMC;IACtD,MAAMC,SAAS;QAAE,GAAGF,IAAI;IAAC;IACzB,MAAM,EAAEG,aAAa,EAAE,GAAGF;IAC1B,MAAM,EAAEG,kBAAkB,EAAE,GAAGD;IAC/B,MAAM,EAAEE,QAAQ,EAAE,GAAGD,kBAAkB,CAAC,EAAE;IAE1CF,OAAO,IAAI,GAAG;IACdA,OAAO,aAAa,GAAG;IACvBA,OAAO,UAAU,GAAGG,SAAS,YAAY;IAEzCH,OAAO,aAAa,GAAG;QACrB,OAAO;YACL,aAAa,CAACI,IAAYA,EAAE,MAAM,GAAG,OAAO;QAC9C;IACF;IACAJ,OAAO,aAAa,GAAG;QAAC;QAAG;QAAI;KAAG;IAClCA,OAAO,OAAO,GAAG;IAEjBA,OAAO,cAAc,GAAG;QACtB,QAAQ;IACV;IACAA,OAAO,aAAa,GAAG;QACrB,QAAQ;IACV;IACAA,OAAO,eAAe,GAAG;QACvB,QAAQ;IACV;IAEA,OAAOA;AACT"}
1
+ {"version":3,"file":"pipeline/spec/chart/pipes/init/circlePacking.js","sources":["../../../../../../../src/pipeline/spec/chart/pipes/init/circlePacking.ts"],"sourcesContent":["import type { VChartSpecPipe } from 'src/types'\nimport type { ICirclePackingChartSpec } from '@visactor/vchart'\n\nexport const initCirclePacking: VChartSpecPipe = (spec, context) => {\n const result = { ...spec } as ICirclePackingChartSpec\n const { advancedVSeed } = context\n const { datasetReshapeInfo } = advancedVSeed\n const { foldInfo } = datasetReshapeInfo[0]\n\n result.type = 'circlePacking'\n result.categoryField = 'key'\n result.valueField = foldInfo.measureValue\n // Style configuration\n result.circlePacking = {\n style: {\n fillOpacity: (d: any) => (d.isLeaf ? 0.75 : 0.25),\n },\n }\n result.layoutPadding = [0, 10, 10]\n result.padding = 0\n // Animation configuration\n result.animationEnter = {\n easing: 'cubicInOut',\n }\n result.animationExit = {\n easing: 'cubicInOut',\n }\n result.animationUpdate = {\n easing: 'cubicInOut',\n }\n\n return result\n}\n"],"names":["initCirclePacking","spec","context","result","advancedVSeed","datasetReshapeInfo","foldInfo","d"],"mappings":"AAGO,MAAMA,oBAAoC,CAACC,MAAMC;IACtD,MAAMC,SAAS;QAAE,GAAGF,IAAI;IAAC;IACzB,MAAM,EAAEG,aAAa,EAAE,GAAGF;IAC1B,MAAM,EAAEG,kBAAkB,EAAE,GAAGD;IAC/B,MAAM,EAAEE,QAAQ,EAAE,GAAGD,kBAAkB,CAAC,EAAE;IAE1CF,OAAO,IAAI,GAAG;IACdA,OAAO,aAAa,GAAG;IACvBA,OAAO,UAAU,GAAGG,SAAS,YAAY;IAEzCH,OAAO,aAAa,GAAG;QACrB,OAAO;YACL,aAAa,CAACI,IAAYA,EAAE,MAAM,GAAG,OAAO;QAC9C;IACF;IACAJ,OAAO,aAAa,GAAG;QAAC;QAAG;QAAI;KAAG;IAClCA,OAAO,OAAO,GAAG;IAEjBA,OAAO,cAAc,GAAG;QACtB,QAAQ;IACV;IACAA,OAAO,aAAa,GAAG;QACrB,QAAQ;IACV;IACAA,OAAO,eAAe,GAAG;QACvB,QAAQ;IACV;IAEA,OAAOA;AACT"}
@@ -0,0 +1,2 @@
1
+ import type { VChartSpecPipe } from '../../../../../types';
2
+ export declare const initHierarchySankey: VChartSpecPipe;
@@ -0,0 +1,32 @@
1
+ const initHierarchySankey = (spec, context)=>{
2
+ const result = {
3
+ ...spec
4
+ };
5
+ const { advancedVSeed } = context;
6
+ const { datasetReshapeInfo } = advancedVSeed;
7
+ const { foldInfo } = datasetReshapeInfo[0];
8
+ result.type = 'sankey';
9
+ result.nodeKey = (datum)=>datum?.key;
10
+ result.categoryField = 'key';
11
+ result.valueField = foldInfo.measureValue;
12
+ result.nodeAlign = 'justify';
13
+ result.nodeGap = 8;
14
+ result.nodeWidth = 12;
15
+ result.minNodeHeight = 4;
16
+ result.iterations = 0;
17
+ result.padding = {
18
+ top: 0,
19
+ left: 2,
20
+ bottom: 0,
21
+ right: 2
22
+ };
23
+ result.link = {
24
+ style: {
25
+ pathType: 'smooth'
26
+ }
27
+ };
28
+ return result;
29
+ };
30
+ export { initHierarchySankey };
31
+
32
+ //# sourceMappingURL=hierarchySankey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline/spec/chart/pipes/init/hierarchySankey.js","sources":["../../../../../../../src/pipeline/spec/chart/pipes/init/hierarchySankey.ts"],"sourcesContent":["import type { VChartSpecPipe } from 'src/types'\n\nexport const initHierarchySankey: VChartSpecPipe = (spec, context) => {\n const result = { ...spec } as Record<string, any>\n const { advancedVSeed } = context\n const { datasetReshapeInfo } = advancedVSeed\n const { foldInfo } = datasetReshapeInfo[0]\n\n result.type = 'sankey'\n result.nodeKey = (datum: any) => datum?.key\n result.categoryField = 'key'\n result.valueField = foldInfo.measureValue\n\n result.nodeAlign = 'justify'\n result.nodeGap = 8\n result.nodeWidth = 12\n result.minNodeHeight = 4\n result.iterations = 0\n result.padding = {\n top: 0,\n left: 2,\n bottom: 0,\n right: 2,\n }\n\n result.link = {\n style: {\n pathType: 'smooth',\n },\n }\n\n return result as any\n}\n"],"names":["initHierarchySankey","spec","context","result","advancedVSeed","datasetReshapeInfo","foldInfo","datum"],"mappings":"AAEO,MAAMA,sBAAsC,CAACC,MAAMC;IACxD,MAAMC,SAAS;QAAE,GAAGF,IAAI;IAAC;IACzB,MAAM,EAAEG,aAAa,EAAE,GAAGF;IAC1B,MAAM,EAAEG,kBAAkB,EAAE,GAAGD;IAC/B,MAAM,EAAEE,QAAQ,EAAE,GAAGD,kBAAkB,CAAC,EAAE;IAE1CF,OAAO,IAAI,GAAG;IACdA,OAAO,OAAO,GAAG,CAACI,QAAeA,OAAO;IACxCJ,OAAO,aAAa,GAAG;IACvBA,OAAO,UAAU,GAAGG,SAAS,YAAY;IAEzCH,OAAO,SAAS,GAAG;IACnBA,OAAO,OAAO,GAAG;IACjBA,OAAO,SAAS,GAAG;IACnBA,OAAO,aAAa,GAAG;IACvBA,OAAO,UAAU,GAAG;IACpBA,OAAO,OAAO,GAAG;QACf,KAAK;QACL,MAAM;QACN,QAAQ;QACR,OAAO;IACT;IAEAA,OAAO,IAAI,GAAG;QACZ,OAAO;YACL,UAAU;QACZ;IACF;IAEA,OAAOA;AACT"}
@@ -17,4 +17,6 @@ export { initHistogram } from './histogram';
17
17
  export { initTreeMap } from './treeMap';
18
18
  export { initSunburst } from './sunburst';
19
19
  export { initCirclePacking } from './circlePacking';
20
+ export { initHierarchySankey } from './hierarchySankey';
21
+ export { initSankey } from './sankey';
20
22
  export { initBoxplot } from './boxplot';
@@ -17,4 +17,6 @@ export { initHistogram } from "./histogram.js";
17
17
  export { initTreeMap } from "./treeMap.js";
18
18
  export { initSunburst } from "./sunburst.js";
19
19
  export { initCirclePacking } from "./circlePacking.js";
20
+ export { initHierarchySankey } from "./hierarchySankey.js";
21
+ export { initSankey } from "./sankey.js";
20
22
  export { initBoxplot } from "./boxplot.js";
@@ -0,0 +1,2 @@
1
+ import type { VChartSpecPipe } from '../../../../../types';
2
+ export declare const initSankey: VChartSpecPipe;
@@ -0,0 +1,33 @@
1
+ import { ColorEncoding } from "../../../../../dataReshape/index.js";
2
+ const initSankey = (spec, context)=>{
3
+ const result = {
4
+ ...spec
5
+ };
6
+ const { advancedVSeed } = context;
7
+ const hasColorEncoding = (advancedVSeed.encoding?.color?.length || 0) > 0;
8
+ result.type = 'sankey';
9
+ result.categoryField = hasColorEncoding ? ColorEncoding : 'nodeName';
10
+ result.valueField = 'value';
11
+ result.sourceField = 'source';
12
+ result.targetField = 'target';
13
+ result.nodeAlign = 'justify';
14
+ result.nodeGap = 8;
15
+ result.nodeWidth = 12;
16
+ result.minNodeHeight = 4;
17
+ result.iterations = 0;
18
+ result.padding = {
19
+ top: 0,
20
+ left: 2,
21
+ bottom: 0,
22
+ right: 2
23
+ };
24
+ result.link = {
25
+ style: {
26
+ pathType: 'smooth'
27
+ }
28
+ };
29
+ return result;
30
+ };
31
+ export { initSankey };
32
+
33
+ //# sourceMappingURL=sankey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline/spec/chart/pipes/init/sankey.js","sources":["../../../../../../../src/pipeline/spec/chart/pipes/init/sankey.ts"],"sourcesContent":["import { ColorEncoding } from 'src/dataReshape'\nimport type { VChartSpecPipe } from 'src/types'\n\nexport const initSankey: VChartSpecPipe = (spec, context) => {\n const result = { ...spec } as Record<string, any>\n const { advancedVSeed } = context\n const hasColorEncoding = (advancedVSeed.encoding?.color?.length || 0) > 0\n\n result.type = 'sankey'\n result.categoryField = hasColorEncoding ? ColorEncoding : 'nodeName'\n result.valueField = 'value'\n result.sourceField = 'source'\n result.targetField = 'target'\n\n result.nodeAlign = 'justify'\n result.nodeGap = 8\n result.nodeWidth = 12\n result.minNodeHeight = 4\n result.iterations = 0\n result.padding = {\n top: 0,\n left: 2,\n bottom: 0,\n right: 2,\n }\n\n result.link = {\n style: {\n pathType: 'smooth',\n },\n }\n\n return result as any\n}\n"],"names":["initSankey","spec","context","result","advancedVSeed","hasColorEncoding","ColorEncoding"],"mappings":";AAGO,MAAMA,aAA6B,CAACC,MAAMC;IAC/C,MAAMC,SAAS;QAAE,GAAGF,IAAI;IAAC;IACzB,MAAM,EAAEG,aAAa,EAAE,GAAGF;IAC1B,MAAMG,mBAAoBD,AAAAA,CAAAA,cAAc,QAAQ,EAAE,OAAO,UAAU,KAAK;IAExED,OAAO,IAAI,GAAG;IACdA,OAAO,aAAa,GAAGE,mBAAmBC,gBAAgB;IAC1DH,OAAO,UAAU,GAAG;IACpBA,OAAO,WAAW,GAAG;IACrBA,OAAO,WAAW,GAAG;IAErBA,OAAO,SAAS,GAAG;IACnBA,OAAO,OAAO,GAAG;IACjBA,OAAO,SAAS,GAAG;IACnBA,OAAO,aAAa,GAAG;IACvBA,OAAO,UAAU,GAAG;IACpBA,OAAO,OAAO,GAAG;QACf,KAAK;QACL,MAAM;QACN,QAAQ;QACR,OAAO;IACT;IAEAA,OAAO,IAAI,GAAG;QACZ,OAAO;YACL,UAAU;QACZ;IACF;IAEA,OAAOA;AACT"}
@@ -6,7 +6,7 @@ const initSunburst = (spec, context)=>{
6
6
  const { datasetReshapeInfo, encoding } = advancedVSeed;
7
7
  const { foldInfo } = datasetReshapeInfo[0];
8
8
  result.type = 'sunburst';
9
- result.categoryField = 'name';
9
+ result.categoryField = 'key';
10
10
  result.valueField = foldInfo.measureValue;
11
11
  result.outerRadius = 1;
12
12
  result.innerRadius = 0;
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline/spec/chart/pipes/init/sunburst.js","sources":["../../../../../../../src/pipeline/spec/chart/pipes/init/sunburst.ts"],"sourcesContent":["import type { VChartSpecPipe } from 'src/types'\nimport type { ISunburstChartSpec } from '@visactor/vchart'\n\nexport const initSunburst: VChartSpecPipe = (spec, context) => {\n const result = { ...spec } as ISunburstChartSpec\n const { advancedVSeed } = context\n const { datasetReshapeInfo, encoding } = advancedVSeed\n const { foldInfo } = datasetReshapeInfo[0]\n\n result.type = 'sunburst'\n result.categoryField = 'name'\n result.valueField = foldInfo.measureValue\n result.outerRadius = 1\n result.innerRadius = 0\n result.gap = 0\n result.offsetX = 0\n result.offsetY = 0\n result.padding = 0\n result.labelAutoVisible = {\n enable: true,\n circumference: 5,\n }\n result.sunburst = {\n visible: true,\n style: {\n fillOpacity: (datum: any) => {\n if (encoding.hierarchy?.length === 1) {\n return 1\n }\n return datum.isLeaf ? 0.4 : 0.8\n },\n },\n }\n\n result.animationEnter = {\n easing: 'cubicInOut',\n }\n result.animationExit = {\n easing: 'cubicInOut',\n }\n result.animationUpdate = {\n easing: 'cubicInOut',\n }\n\n return result\n}\n"],"names":["initSunburst","spec","context","result","advancedVSeed","datasetReshapeInfo","encoding","foldInfo","datum"],"mappings":"AAGO,MAAMA,eAA+B,CAACC,MAAMC;IACjD,MAAMC,SAAS;QAAE,GAAGF,IAAI;IAAC;IACzB,MAAM,EAAEG,aAAa,EAAE,GAAGF;IAC1B,MAAM,EAAEG,kBAAkB,EAAEC,QAAQ,EAAE,GAAGF;IACzC,MAAM,EAAEG,QAAQ,EAAE,GAAGF,kBAAkB,CAAC,EAAE;IAE1CF,OAAO,IAAI,GAAG;IACdA,OAAO,aAAa,GAAG;IACvBA,OAAO,UAAU,GAAGI,SAAS,YAAY;IACzCJ,OAAO,WAAW,GAAG;IACrBA,OAAO,WAAW,GAAG;IACrBA,OAAO,GAAG,GAAG;IACbA,OAAO,OAAO,GAAG;IACjBA,OAAO,OAAO,GAAG;IACjBA,OAAO,OAAO,GAAG;IACjBA,OAAO,gBAAgB,GAAG;QACxB,QAAQ;QACR,eAAe;IACjB;IACAA,OAAO,QAAQ,GAAG;QAChB,SAAS;QACT,OAAO;YACL,aAAa,CAACK;gBACZ,IAAIF,SAAS,SAAS,EAAE,WAAW,GACjC,OAAO;gBAET,OAAOE,MAAM,MAAM,GAAG,MAAM;YAC9B;QACF;IACF;IAEAL,OAAO,cAAc,GAAG;QACtB,QAAQ;IACV;IACAA,OAAO,aAAa,GAAG;QACrB,QAAQ;IACV;IACAA,OAAO,eAAe,GAAG;QACvB,QAAQ;IACV;IAEA,OAAOA;AACT"}
1
+ {"version":3,"file":"pipeline/spec/chart/pipes/init/sunburst.js","sources":["../../../../../../../src/pipeline/spec/chart/pipes/init/sunburst.ts"],"sourcesContent":["import type { VChartSpecPipe } from 'src/types'\nimport type { ISunburstChartSpec } from '@visactor/vchart'\n\nexport const initSunburst: VChartSpecPipe = (spec, context) => {\n const result = { ...spec } as ISunburstChartSpec\n const { advancedVSeed } = context\n const { datasetReshapeInfo, encoding } = advancedVSeed\n const { foldInfo } = datasetReshapeInfo[0]\n\n result.type = 'sunburst'\n result.categoryField = 'key'\n result.valueField = foldInfo.measureValue\n result.outerRadius = 1\n result.innerRadius = 0\n result.gap = 0\n result.offsetX = 0\n result.offsetY = 0\n result.padding = 0\n result.labelAutoVisible = {\n enable: true,\n circumference: 5,\n }\n result.sunburst = {\n visible: true,\n style: {\n fillOpacity: (datum: any) => {\n if (encoding.hierarchy?.length === 1) {\n return 1\n }\n return datum.isLeaf ? 0.4 : 0.8\n },\n },\n }\n\n result.animationEnter = {\n easing: 'cubicInOut',\n }\n result.animationExit = {\n easing: 'cubicInOut',\n }\n result.animationUpdate = {\n easing: 'cubicInOut',\n }\n\n return result\n}\n"],"names":["initSunburst","spec","context","result","advancedVSeed","datasetReshapeInfo","encoding","foldInfo","datum"],"mappings":"AAGO,MAAMA,eAA+B,CAACC,MAAMC;IACjD,MAAMC,SAAS;QAAE,GAAGF,IAAI;IAAC;IACzB,MAAM,EAAEG,aAAa,EAAE,GAAGF;IAC1B,MAAM,EAAEG,kBAAkB,EAAEC,QAAQ,EAAE,GAAGF;IACzC,MAAM,EAAEG,QAAQ,EAAE,GAAGF,kBAAkB,CAAC,EAAE;IAE1CF,OAAO,IAAI,GAAG;IACdA,OAAO,aAAa,GAAG;IACvBA,OAAO,UAAU,GAAGI,SAAS,YAAY;IACzCJ,OAAO,WAAW,GAAG;IACrBA,OAAO,WAAW,GAAG;IACrBA,OAAO,GAAG,GAAG;IACbA,OAAO,OAAO,GAAG;IACjBA,OAAO,OAAO,GAAG;IACjBA,OAAO,OAAO,GAAG;IACjBA,OAAO,gBAAgB,GAAG;QACxB,QAAQ;QACR,eAAe;IACjB;IACAA,OAAO,QAAQ,GAAG;QAChB,SAAS;QACT,OAAO;YACL,aAAa,CAACK;gBACZ,IAAIF,SAAS,SAAS,EAAE,WAAW,GACjC,OAAO;gBAET,OAAOE,MAAM,MAAM,GAAG,MAAM;YAC9B;QACF;IACF;IAEAL,OAAO,cAAc,GAAG;QACtB,QAAQ;IACV;IACAA,OAAO,aAAa,GAAG;QACrB,QAAQ;IACV;IACAA,OAAO,eAAe,GAAG;QACvB,QAAQ;IACV;IAEA,OAAOA;AACT"}
@@ -6,7 +6,7 @@ const initTreeMap = (spec, context)=>{
6
6
  const { datasetReshapeInfo } = advancedVSeed;
7
7
  const { foldInfo } = datasetReshapeInfo[0];
8
8
  result.type = 'treemap';
9
- result.categoryField = 'name';
9
+ result.categoryField = 'key';
10
10
  result.valueField = foldInfo.measureValue;
11
11
  result.padding = 0;
12
12
  result.animationEnter = {
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline/spec/chart/pipes/init/treeMap.js","sources":["../../../../../../../src/pipeline/spec/chart/pipes/init/treeMap.ts"],"sourcesContent":["import type { VChartSpecPipe } from 'src/types'\nimport type { ITreemapChartSpec } from '@visactor/vchart'\n\nexport const initTreeMap: VChartSpecPipe = (spec, context) => {\n const result = { ...spec } as ITreemapChartSpec\n const { advancedVSeed } = context\n const { datasetReshapeInfo } = advancedVSeed\n const { foldInfo } = datasetReshapeInfo[0]\n\n result.type = 'treemap'\n result.categoryField = 'name'\n result.valueField = foldInfo.measureValue\n result.padding = 0\n result.animationEnter = {\n easing: 'cubicInOut',\n }\n result.animationExit = {\n easing: 'cubicInOut',\n }\n result.animationUpdate = {\n easing: 'cubicInOut',\n }\n\n return result\n}\n"],"names":["initTreeMap","spec","context","result","advancedVSeed","datasetReshapeInfo","foldInfo"],"mappings":"AAGO,MAAMA,cAA8B,CAACC,MAAMC;IAChD,MAAMC,SAAS;QAAE,GAAGF,IAAI;IAAC;IACzB,MAAM,EAAEG,aAAa,EAAE,GAAGF;IAC1B,MAAM,EAAEG,kBAAkB,EAAE,GAAGD;IAC/B,MAAM,EAAEE,QAAQ,EAAE,GAAGD,kBAAkB,CAAC,EAAE;IAE1CF,OAAO,IAAI,GAAG;IACdA,OAAO,aAAa,GAAG;IACvBA,OAAO,UAAU,GAAGG,SAAS,YAAY;IACzCH,OAAO,OAAO,GAAG;IACjBA,OAAO,cAAc,GAAG;QACtB,QAAQ;IACV;IACAA,OAAO,aAAa,GAAG;QACrB,QAAQ;IACV;IACAA,OAAO,eAAe,GAAG;QACvB,QAAQ;IACV;IAEA,OAAOA;AACT"}
1
+ {"version":3,"file":"pipeline/spec/chart/pipes/init/treeMap.js","sources":["../../../../../../../src/pipeline/spec/chart/pipes/init/treeMap.ts"],"sourcesContent":["import type { VChartSpecPipe } from 'src/types'\nimport type { ITreemapChartSpec } from '@visactor/vchart'\n\nexport const initTreeMap: VChartSpecPipe = (spec, context) => {\n const result = { ...spec } as ITreemapChartSpec\n const { advancedVSeed } = context\n const { datasetReshapeInfo } = advancedVSeed\n const { foldInfo } = datasetReshapeInfo[0]\n\n result.type = 'treemap'\n result.categoryField = 'key'\n result.valueField = foldInfo.measureValue\n result.padding = 0\n result.animationEnter = {\n easing: 'cubicInOut',\n }\n result.animationExit = {\n easing: 'cubicInOut',\n }\n result.animationUpdate = {\n easing: 'cubicInOut',\n }\n\n return result\n}\n"],"names":["initTreeMap","spec","context","result","advancedVSeed","datasetReshapeInfo","foldInfo"],"mappings":"AAGO,MAAMA,cAA8B,CAACC,MAAMC;IAChD,MAAMC,SAAS;QAAE,GAAGF,IAAI;IAAC;IACzB,MAAM,EAAEG,aAAa,EAAE,GAAGF;IAC1B,MAAM,EAAEG,kBAAkB,EAAE,GAAGD;IAC/B,MAAM,EAAEE,QAAQ,EAAE,GAAGD,kBAAkB,CAAC,EAAE;IAE1CF,OAAO,IAAI,GAAG;IACdA,OAAO,aAAa,GAAG;IACvBA,OAAO,UAAU,GAAGG,SAAS,YAAY;IACzCH,OAAO,OAAO,GAAG;IACjBA,OAAO,cAAc,GAAG;QACtB,QAAQ;IACV;IACAA,OAAO,aAAa,GAAG;QACrB,QAAQ;IACV;IACAA,OAAO,eAAe,GAAG;QACvB,QAAQ;IACV;IAEA,OAAOA;AACT"}
@@ -7,3 +7,5 @@ export { labelCirclePacking } from './labelCirclePacking';
7
7
  export { labelSunburst } from './labelSunburst';
8
8
  export { labelTreeMapLeaf } from './labelTreeMapLeaf';
9
9
  export { labelTreeMapGroup } from './labelTreeMapGroup';
10
+ export { labelHierarchySankey } from './labelHierarchySankey';
11
+ export { labelSankey } from './labelSankey';
@@ -7,3 +7,5 @@ export { labelCirclePacking } from "./labelCirclePacking.js";
7
7
  export { labelSunburst } from "./labelSunburst.js";
8
8
  export { labelTreeMapLeaf } from "./labelTreeMapLeaf.js";
9
9
  export { labelTreeMapGroup } from "./labelTreeMapGroup.js";
10
+ export { labelHierarchySankey } from "./labelHierarchySankey.js";
11
+ export { labelSankey } from "./labelSankey.js";
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline/spec/chart/pipes/label/label.js","sources":["../../../../../../../src/pipeline/spec/chart/pipes/label/label.ts"],"sourcesContent":["import type { ILineChartSpec } from '@visactor/vchart'\nimport {\n createFormatter,\n createFormatterByDimension,\n createFormatterByMeasure,\n DATUM_HIDE_KEY,\n findMeasureById,\n} from '../../../../utils'\nimport type {\n Datum,\n Dimension,\n Dimensions,\n Encoding,\n FoldInfo,\n Formatter,\n Label,\n Locale,\n Measure,\n Measures,\n NumFormat,\n VChartSpecPipe,\n} from 'src/types'\nimport { isNumber, merge, uniqueBy } from 'remeda'\nimport { selector, selectorWithDynamicFilter } from 'src/dataSelector'\nimport { MeasureId } from 'src/dataReshape/constant'\n\nexport const label: VChartSpecPipe = (spec, context) => {\n const result = { ...spec } as ILineChartSpec\n const { advancedVSeed, vseed } = context\n const { datasetReshapeInfo } = advancedVSeed\n const { chartType, encoding } = advancedVSeed\n const baseConfig = advancedVSeed.config[chartType] as { label: Label }\n const foldInfo = datasetReshapeInfo[0].foldInfo as FoldInfo\n\n const { label } = baseConfig\n result.label = buildLabel(\n label,\n vseed.measures,\n vseed.dimensions,\n advancedVSeed.dimensions!,\n advancedVSeed.measures!,\n encoding as Encoding,\n [foldInfo],\n ) as unknown as ILineChartSpec['label']\n\n return result\n}\n\nexport const generateMeasureValue = (\n value: number | string,\n measure: Measure,\n labelAutoFormat?: boolean,\n numFormat: NumFormat = {},\n) => {\n const format = merge(numFormat, measure.numFormat || measure.format)\n const mergedMeasure = { ...measure, numFormat: format, autoFormat: labelAutoFormat || measure.autoFormat }\n\n const formatter = createFormatterByMeasure(mergedMeasure)\n return formatter(value)\n}\n\nexport const generateMeasurePercent = (value: number | string, sum: number, formatter: Formatter) => {\n if (value === undefined || value === null) return String(value)\n const num = Number(value)\n if (Number.isNaN(num)) return String(value)\n\n const percentValue = num / sum\n return formatter(percentValue)\n}\n\nexport const buildLabel = (\n label: Label,\n vseedMeasures: Measures = [],\n vseedDimensions: Dimensions = [],\n advancedVSeedDimensions: Dimensions,\n advancedVSeedMeasures: Measures,\n encoding: Encoding,\n foldInfoList: (Pick<FoldInfo, 'measureId' | 'measureValue'> & Partial<Pick<FoldInfo, 'statistics'>>)[],\n locale: Locale = 'zh-CN',\n) => {\n const {\n enable,\n wrap,\n showValue,\n showValuePercent,\n showDimension,\n labelOverlap,\n labelColorSmartInvert,\n labelStroke,\n labelColor,\n labelFontSize,\n labelFontWeight,\n labelBackgroundColor,\n labelPosition,\n autoFormat,\n numFormat = {},\n } = label\n\n const hasDimLabelEncoding = vseedDimensions.some((item) => encoding.label?.includes(item.id))\n\n const labelDims = uniqueBy(\n hasDimLabelEncoding\n ? vseedDimensions.filter((item) => encoding.label?.includes(item.id))\n : showDimension\n ? advancedVSeedDimensions.filter((d) => d.id !== MeasureId && d.encoding !== 'row' && d.encoding !== 'column')\n : [],\n (item: Dimension) => item.id,\n )\n\n const labelMeas = uniqueBy(\n vseedMeasures.filter((item) => encoding.label?.includes(item.id)),\n (item: Measure) => item.id,\n )\n\n const percentFormat: NumFormat = merge(numFormat, {\n type: 'percent',\n } as NumFormat)\n\n const percentFormatter = createFormatter(percentFormat)\n\n const result = {\n visible: enable,\n dataFilter: (data: Datum[]) => {\n return data.filter((entry) => {\n if (entry.data?.[DATUM_HIDE_KEY]) {\n return false\n }\n const shouldApply = label.dynamicFilter\n ? selectorWithDynamicFilter(entry.data as Datum, label.dynamicFilter, label.selector)\n : selector(entry.data as Datum, label.selector, 'Or')\n return shouldApply\n })\n },\n formatMethod: (_: unknown, datum: Datum) => {\n const result = []\n\n const dimLabels = labelDims.map((item: Dimension) => {\n const id = item.id\n const formatter = createFormatterByDimension(item, locale)\n return formatter(datum[id] as number | string)\n })\n\n const meaLabels = labelMeas.map((item: Measure) =>\n generateMeasureValue(datum[item.id] as number | string, item, autoFormat, numFormat),\n )\n\n result.push(...dimLabels)\n\n foldInfoList.forEach((foldInfo) => {\n const { measureId, measureValue, statistics } = foldInfo\n const measure = findMeasureById(advancedVSeedMeasures, datum[measureId] as string)\n if (measure) {\n const measureValueLabel = generateMeasureValue(\n datum[measureValue] as number | string,\n measure,\n autoFormat,\n numFormat,\n )\n\n if (showValue) {\n result.push(measureValueLabel)\n }\n if (showValuePercent) {\n if (isNumber(datum['__VCHART_ARC_RATIO'])) {\n // 饼图/环图需要使用实际占比数据\n result.push(generateMeasurePercent(datum['__VCHART_ARC_RATIO'], 1, percentFormatter))\n } else if (statistics && isNumber(statistics.sum)) {\n result.push(\n generateMeasurePercent(datum[measureValue] as number | string, statistics.sum, percentFormatter),\n )\n }\n }\n }\n })\n\n result.push(...meaLabels)\n\n if (wrap) {\n return result\n }\n return result.join(' ')\n },\n syncState: true,\n position: labelPosition,\n style: {\n stroke: labelStroke,\n fill: labelColor,\n fontSize: labelFontSize,\n fontWeight: labelFontWeight,\n background: labelBackgroundColor,\n },\n smartInvert: labelColorSmartInvert,\n }\n\n if (labelColorSmartInvert) {\n ;(result.style as any).lineWidth = 2 // label 边框线宽度,不设置这个会导致智能反色失败\n }\n\n if (labelOverlap) {\n ;(result as any).overlap = {\n hideOnHit: true,\n clampForce: true,\n }\n }\n\n return result\n}\n"],"names":["label","spec","context","result","advancedVSeed","vseed","datasetReshapeInfo","chartType","encoding","baseConfig","foldInfo","buildLabel","generateMeasureValue","value","measure","labelAutoFormat","numFormat","format","merge","mergedMeasure","formatter","createFormatterByMeasure","generateMeasurePercent","sum","String","num","Number","percentValue","vseedMeasures","vseedDimensions","advancedVSeedDimensions","advancedVSeedMeasures","foldInfoList","locale","enable","wrap","showValue","showValuePercent","showDimension","labelOverlap","labelColorSmartInvert","labelStroke","labelColor","labelFontSize","labelFontWeight","labelBackgroundColor","labelPosition","autoFormat","hasDimLabelEncoding","item","labelDims","uniqueBy","d","MeasureId","labelMeas","percentFormat","percentFormatter","createFormatter","data","entry","DATUM_HIDE_KEY","shouldApply","selectorWithDynamicFilter","selector","_","datum","dimLabels","id","createFormatterByDimension","meaLabels","measureId","measureValue","statistics","findMeasureById","measureValueLabel","isNumber"],"mappings":"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"}
1
+ {"version":3,"file":"pipeline/spec/chart/pipes/label/label.js","sources":["../../../../../../../src/pipeline/spec/chart/pipes/label/label.ts"],"sourcesContent":["import type { ILineChartSpec } from '@visactor/vchart'\nimport {\n createFormatter,\n createFormatterByDimension,\n createFormatterByMeasure,\n DATUM_HIDE_KEY,\n findMeasureById,\n} from '../../../../utils'\nimport type {\n Datum,\n Dimension,\n Dimensions,\n Encoding,\n FoldInfo,\n Formatter,\n Label,\n Locale,\n Measure,\n Measures,\n NumFormat,\n VChartSpecPipe,\n} from 'src/types'\nimport { isNumber, merge, uniqueBy } from 'remeda'\nimport { selector, selectorWithDynamicFilter } from 'src/dataSelector'\nimport { MeasureId } from 'src/dataReshape/constant'\n\nexport const label: VChartSpecPipe = (spec, context) => {\n const result = { ...spec } as ILineChartSpec\n const { advancedVSeed, vseed } = context\n const { datasetReshapeInfo } = advancedVSeed\n const { chartType, encoding } = advancedVSeed\n const baseConfig = advancedVSeed.config[chartType] as { label: Label }\n const foldInfo = datasetReshapeInfo[0].foldInfo as FoldInfo\n\n const { label } = baseConfig\n result.label = buildLabel(\n label,\n vseed.measures,\n vseed.dimensions,\n advancedVSeed.dimensions!,\n advancedVSeed.measures!,\n encoding as Encoding,\n [foldInfo],\n ) as unknown as ILineChartSpec['label']\n\n return result\n}\n\nexport const generateMeasureValue = (\n value: number | string,\n measure: Measure,\n labelAutoFormat?: boolean,\n numFormat: NumFormat = {},\n) => {\n const format = merge(numFormat, measure.numFormat || measure.format)\n const mergedMeasure = { ...measure, numFormat: format, autoFormat: labelAutoFormat || measure.autoFormat }\n\n const formatter = createFormatterByMeasure(mergedMeasure)\n return formatter(value)\n}\n\nexport const generateMeasurePercent = (value: number | string, sum: number, formatter: Formatter) => {\n if (value === undefined || value === null) return String(value)\n const num = Number(value)\n if (Number.isNaN(num)) return String(value)\n\n const percentValue = num / sum\n return formatter(percentValue)\n}\n\nexport const buildLabel = (\n label: Label,\n vseedMeasures: Measures = [],\n vseedDimensions: Dimensions = [],\n advancedVSeedDimensions: Dimensions,\n advancedVSeedMeasures: Measures,\n encoding: Encoding,\n foldInfoList: (Pick<FoldInfo, 'measureId' | 'measureValue'> & Partial<Pick<FoldInfo, 'statistics'>>)[],\n locale: Locale = 'zh-CN',\n) => {\n const {\n enable,\n wrap,\n showValue,\n showValuePercent,\n showDimension,\n labelOverlap,\n labelColorSmartInvert,\n labelStroke,\n labelColor,\n labelFontSize,\n labelFontWeight,\n labelBackgroundColor,\n labelPosition,\n autoFormat,\n numFormat = {},\n } = label\n\n const hasDimLabelEncoding = vseedDimensions.some((item) => encoding.label?.includes(item.id))\n\n const labelDims = uniqueBy(\n hasDimLabelEncoding\n ? vseedDimensions.filter((item) => encoding.label?.includes(item.id))\n : showDimension\n ? advancedVSeedDimensions.filter((d) => d.id !== MeasureId && d.encoding !== 'row' && d.encoding !== 'column')\n : [],\n (item: Dimension) => item.id,\n )\n\n const labelMeas = uniqueBy(\n vseedMeasures.filter((item) => encoding.label?.includes(item.id)),\n (item: Measure) => item.id,\n )\n\n const percentFormat: NumFormat = merge(numFormat, {\n type: 'percent',\n } as NumFormat)\n\n const percentFormatter = createFormatter(percentFormat)\n\n const result = {\n visible: enable,\n dataFilter: (data: Datum[]) => {\n return data.filter((entry) => {\n if (entry.data?.[DATUM_HIDE_KEY]) {\n return false\n }\n const shouldApply = label.dynamicFilter\n ? selectorWithDynamicFilter(entry.data as Datum, label.dynamicFilter, label.selector)\n : selector(entry.data as Datum, label.selector, 'Or')\n return shouldApply\n })\n },\n formatMethod: (_: unknown, datum: Datum) => {\n const result = []\n\n const dimLabels = labelDims.map((item: Dimension) => {\n const id = item.id\n const formatter = createFormatterByDimension(item, locale)\n return formatter(datum[id] as number | string)\n })\n\n const meaLabels = labelMeas.map((item: Measure) =>\n generateMeasureValue(datum[item.id] as number | string, item, autoFormat, numFormat),\n )\n result.push(...dimLabels)\n\n foldInfoList.forEach((foldInfo) => {\n const { measureId, measureValue, statistics } = foldInfo\n const measure = findMeasureById(advancedVSeedMeasures, datum[measureId] as string)\n if (measure) {\n const measureValueLabel = generateMeasureValue(\n datum[measureValue] as number | string,\n measure,\n autoFormat,\n numFormat,\n )\n\n if (showValue) {\n result.push(measureValueLabel)\n }\n if (showValuePercent) {\n if (isNumber(datum['__VCHART_ARC_RATIO'])) {\n // 饼图/环图需要使用实际占比数据\n result.push(generateMeasurePercent(datum['__VCHART_ARC_RATIO'], 1, percentFormatter))\n } else if (statistics && isNumber(statistics.sum)) {\n result.push(\n generateMeasurePercent(datum[measureValue] as number | string, statistics.sum, percentFormatter),\n )\n }\n }\n }\n })\n\n result.push(...meaLabels)\n\n if (wrap) {\n return result\n }\n return result.join(' ')\n },\n syncState: true,\n position: labelPosition,\n style: {\n stroke: labelStroke,\n fill: labelColor,\n fontSize: labelFontSize,\n fontWeight: labelFontWeight,\n background: labelBackgroundColor,\n },\n smartInvert: labelColorSmartInvert,\n }\n\n if (labelColorSmartInvert) {\n ;(result.style as any).lineWidth = 2 // label 边框线宽度,不设置这个会导致智能反色失败\n }\n\n if (labelOverlap) {\n ;(result as any).overlap = {\n hideOnHit: true,\n clampForce: true,\n }\n }\n\n return result\n}\n"],"names":["label","spec","context","result","advancedVSeed","vseed","datasetReshapeInfo","chartType","encoding","baseConfig","foldInfo","buildLabel","generateMeasureValue","value","measure","labelAutoFormat","numFormat","format","merge","mergedMeasure","formatter","createFormatterByMeasure","generateMeasurePercent","sum","String","num","Number","percentValue","vseedMeasures","vseedDimensions","advancedVSeedDimensions","advancedVSeedMeasures","foldInfoList","locale","enable","wrap","showValue","showValuePercent","showDimension","labelOverlap","labelColorSmartInvert","labelStroke","labelColor","labelFontSize","labelFontWeight","labelBackgroundColor","labelPosition","autoFormat","hasDimLabelEncoding","item","labelDims","uniqueBy","d","MeasureId","labelMeas","percentFormat","percentFormatter","createFormatter","data","entry","DATUM_HIDE_KEY","shouldApply","selectorWithDynamicFilter","selector","_","datum","dimLabels","id","createFormatterByDimension","meaLabels","measureId","measureValue","statistics","findMeasureById","measureValueLabel","isNumber"],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { Datum, Dimensions, Encoding, FoldInfo, Label, Locale, Measures, VChartSpecPipe } from '../../../../../types';
2
+ export declare const labelHierarchySankey: VChartSpecPipe;
3
+ export declare const buildLabel: (label: Label, vseedMeasures: Measures | undefined, vseedDimensions: Dimensions | undefined, advancedVSeedDimensions: Dimensions, advancedVSeedMeasures: Measures, encoding: Encoding, foldInfoList: (Pick<FoldInfo, "measureId" | "measureValue"> & Partial<Pick<FoldInfo, "statistics">>)[], locale?: Locale) => {
4
+ visible: boolean;
5
+ dataFilter: (data: Datum[]) => Record<string | number, any>[];
6
+ formatMethod: (_: unknown, datum: Datum) => string | string[];
7
+ syncState: boolean;
8
+ position: "inside" | "outside" | undefined;
9
+ style: {
10
+ stroke: string | undefined;
11
+ fill: string | undefined;
12
+ fontSize: number | undefined;
13
+ fontWeight: string | number | undefined;
14
+ background: string | undefined;
15
+ };
16
+ smartInvert: boolean | undefined;
17
+ };
@@ -0,0 +1,92 @@
1
+ import { DATUM_HIDE_KEY, createFormatter, createFormatterByDimension, findMeasureById } from "../../../../utils/index.js";
2
+ import { isNumber, merge, uniqueBy } from "remeda";
3
+ import { selector, selectorWithDynamicFilter } from "../../../../../dataSelector/index.js";
4
+ import { MeasureId } from "../../../../../dataReshape/constant.js";
5
+ import { generateMeasurePercent, generateMeasureValue } from "./label.js";
6
+ const labelHierarchySankey = (spec, context)=>{
7
+ const result = {
8
+ ...spec
9
+ };
10
+ const { advancedVSeed, vseed } = context;
11
+ const { datasetReshapeInfo } = advancedVSeed;
12
+ const { chartType, encoding } = advancedVSeed;
13
+ const baseConfig = advancedVSeed.config[chartType];
14
+ const foldInfo = datasetReshapeInfo[0].foldInfo;
15
+ const { label } = baseConfig;
16
+ result.label = buildLabel(label, vseed.measures, vseed.dimensions, advancedVSeed.dimensions, advancedVSeed.measures, encoding, [
17
+ foldInfo
18
+ ]);
19
+ return result;
20
+ };
21
+ const buildLabel = (label, vseedMeasures = [], vseedDimensions = [], advancedVSeedDimensions, advancedVSeedMeasures, encoding, foldInfoList, locale = 'zh-CN')=>{
22
+ const { enable, wrap, showValue, showValuePercent, showDimension, labelOverlap, labelColorSmartInvert, labelStroke, labelColor, labelFontSize, labelFontWeight, labelBackgroundColor, labelPosition, autoFormat, numFormat = {} } = label;
23
+ const hasDimLabelEncoding = vseedDimensions.some((item)=>encoding.label?.includes(item.id));
24
+ const labelDims = uniqueBy(hasDimLabelEncoding ? vseedDimensions.filter((item)=>encoding.label?.includes(item.id)) : showDimension ? advancedVSeedDimensions.filter((d)=>d.id !== MeasureId && 'row' !== d.encoding && 'column' !== d.encoding) : [], (item)=>item.id);
25
+ const labelMeas = uniqueBy(vseedMeasures.filter((item)=>encoding.label?.includes(item.id)), (item)=>item.id);
26
+ const percentFormat = merge(numFormat, {
27
+ type: 'percent'
28
+ });
29
+ const percentFormatter = createFormatter(percentFormat);
30
+ const result = {
31
+ visible: enable,
32
+ dataFilter: (data)=>data.filter((entry)=>{
33
+ if (entry.data?.[DATUM_HIDE_KEY]) return false;
34
+ const shouldApply = label.dynamicFilter ? selectorWithDynamicFilter(entry.data, label.dynamicFilter, label.selector) : selector(entry.data, label.selector, 'Or');
35
+ return shouldApply;
36
+ }),
37
+ formatMethod: (_, datum)=>{
38
+ const result = [];
39
+ const dimLabels = labelDims.flatMap((item)=>{
40
+ const id = item.id;
41
+ const rawValue = datum[id];
42
+ if (null == rawValue || '' === rawValue) return [];
43
+ const formatter = createFormatterByDimension(item, locale);
44
+ return [
45
+ formatter(rawValue)
46
+ ];
47
+ });
48
+ const meaLabels = labelMeas.flatMap((item)=>{
49
+ const rawValue = datum[item.id];
50
+ if (null == rawValue || '' === rawValue) return [];
51
+ return [
52
+ generateMeasureValue(rawValue, item, autoFormat, numFormat)
53
+ ];
54
+ });
55
+ result.push(...dimLabels);
56
+ foldInfoList.forEach((foldInfo)=>{
57
+ const { measureId, measureValue, statistics } = foldInfo;
58
+ const measure = findMeasureById(advancedVSeedMeasures, datum[measureId]);
59
+ if (measure) {
60
+ const measureValueLabel = generateMeasureValue(datum[measureValue], measure, autoFormat, numFormat);
61
+ if (showValue) result.push(measureValueLabel);
62
+ if (showValuePercent) {
63
+ if (isNumber(datum['__VCHART_ARC_RATIO'])) result.push(generateMeasurePercent(datum['__VCHART_ARC_RATIO'], 1, percentFormatter));
64
+ else if (statistics && isNumber(statistics.sum)) result.push(generateMeasurePercent(datum[measureValue], statistics.sum, percentFormatter));
65
+ }
66
+ }
67
+ });
68
+ result.push(...meaLabels);
69
+ if (wrap) return result;
70
+ return result.join(' ');
71
+ },
72
+ syncState: true,
73
+ position: labelPosition,
74
+ style: {
75
+ stroke: labelStroke,
76
+ fill: labelColor,
77
+ fontSize: labelFontSize,
78
+ fontWeight: labelFontWeight,
79
+ background: labelBackgroundColor
80
+ },
81
+ smartInvert: labelColorSmartInvert
82
+ };
83
+ if (labelColorSmartInvert) result.style.lineWidth = 2;
84
+ if (labelOverlap) result.overlap = {
85
+ hideOnHit: true,
86
+ clampForce: true
87
+ };
88
+ return result;
89
+ };
90
+ export { buildLabel, labelHierarchySankey };
91
+
92
+ //# sourceMappingURL=labelHierarchySankey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline/spec/chart/pipes/label/labelHierarchySankey.js","sources":["../../../../../../../src/pipeline/spec/chart/pipes/label/labelHierarchySankey.ts"],"sourcesContent":["import type { ILineChartSpec } from '@visactor/vchart'\nimport { createFormatter, createFormatterByDimension, DATUM_HIDE_KEY, findMeasureById } from '../../../../utils'\nimport type {\n Datum,\n Dimension,\n Dimensions,\n Encoding,\n FoldInfo,\n Label,\n Locale,\n Measure,\n Measures,\n NumFormat,\n VChartSpecPipe,\n} from 'src/types'\nimport { isNumber, merge, uniqueBy } from 'remeda'\nimport { selector, selectorWithDynamicFilter } from 'src/dataSelector'\nimport { MeasureId } from 'src/dataReshape/constant'\nimport { generateMeasurePercent, generateMeasureValue } from './label'\n\nexport const labelHierarchySankey: VChartSpecPipe = (spec, context) => {\n const result = { ...spec } as ILineChartSpec\n const { advancedVSeed, vseed } = context\n const { datasetReshapeInfo } = advancedVSeed\n const { chartType, encoding } = advancedVSeed\n const baseConfig = advancedVSeed.config[chartType] as { label: Label }\n const foldInfo = datasetReshapeInfo[0].foldInfo as FoldInfo\n\n const { label } = baseConfig\n result.label = buildLabel(\n label,\n vseed.measures,\n vseed.dimensions,\n advancedVSeed.dimensions!,\n advancedVSeed.measures!,\n encoding as Encoding,\n [foldInfo],\n ) as unknown as ILineChartSpec['label']\n\n return result\n}\n\nexport const buildLabel = (\n label: Label,\n vseedMeasures: Measures = [],\n vseedDimensions: Dimensions = [],\n advancedVSeedDimensions: Dimensions,\n advancedVSeedMeasures: Measures,\n encoding: Encoding,\n foldInfoList: (Pick<FoldInfo, 'measureId' | 'measureValue'> & Partial<Pick<FoldInfo, 'statistics'>>)[],\n locale: Locale = 'zh-CN',\n) => {\n const {\n enable,\n wrap,\n showValue,\n showValuePercent,\n showDimension,\n labelOverlap,\n labelColorSmartInvert,\n labelStroke,\n labelColor,\n labelFontSize,\n labelFontWeight,\n labelBackgroundColor,\n labelPosition,\n autoFormat,\n numFormat = {},\n } = label\n\n const hasDimLabelEncoding = vseedDimensions.some((item) => encoding.label?.includes(item.id))\n\n const labelDims = uniqueBy(\n hasDimLabelEncoding\n ? vseedDimensions.filter((item) => encoding.label?.includes(item.id))\n : showDimension\n ? advancedVSeedDimensions.filter((d) => d.id !== MeasureId && d.encoding !== 'row' && d.encoding !== 'column')\n : [],\n (item: Dimension) => item.id,\n )\n\n const labelMeas = uniqueBy(\n vseedMeasures.filter((item) => encoding.label?.includes(item.id)),\n (item: Measure) => item.id,\n )\n\n const percentFormat: NumFormat = merge(numFormat, {\n type: 'percent',\n } as NumFormat)\n\n const percentFormatter = createFormatter(percentFormat)\n\n const result = {\n visible: enable,\n dataFilter: (data: Datum[]) => {\n return data.filter((entry) => {\n if (entry.data?.[DATUM_HIDE_KEY]) {\n return false\n }\n const shouldApply = label.dynamicFilter\n ? selectorWithDynamicFilter(entry.data as Datum, label.dynamicFilter, label.selector)\n : selector(entry.data as Datum, label.selector, 'Or')\n return shouldApply\n })\n },\n formatMethod: (_: unknown, datum: Datum) => {\n const result = []\n\n const dimLabels = labelDims.flatMap((item: Dimension) => {\n const id = item.id\n const rawValue = datum[id]\n if (rawValue === undefined || rawValue === null || rawValue === '') {\n return []\n }\n const formatter = createFormatterByDimension(item, locale)\n return [formatter(rawValue as number | string)]\n })\n\n const meaLabels = labelMeas.flatMap((item: Measure) => {\n const rawValue = datum[item.id]\n if (rawValue === undefined || rawValue === null || rawValue === '') {\n return []\n }\n\n return [generateMeasureValue(rawValue as number | string, item, autoFormat, numFormat)]\n })\n\n result.push(...dimLabels)\n\n foldInfoList.forEach((foldInfo) => {\n const { measureId, measureValue, statistics } = foldInfo\n const measure = findMeasureById(advancedVSeedMeasures, datum[measureId] as string)\n if (measure) {\n const measureValueLabel = generateMeasureValue(\n datum[measureValue] as number | string,\n measure,\n autoFormat,\n numFormat,\n )\n\n if (showValue) {\n result.push(measureValueLabel)\n }\n if (showValuePercent) {\n if (isNumber(datum['__VCHART_ARC_RATIO'])) {\n // 饼图/环图需要使用实际占比数据\n result.push(generateMeasurePercent(datum['__VCHART_ARC_RATIO'], 1, percentFormatter))\n } else if (statistics && isNumber(statistics.sum)) {\n result.push(\n generateMeasurePercent(datum[measureValue] as number | string, statistics.sum, percentFormatter),\n )\n }\n }\n }\n })\n\n result.push(...meaLabels)\n\n if (wrap) {\n return result\n }\n return result.join(' ')\n },\n syncState: true,\n position: labelPosition,\n style: {\n stroke: labelStroke,\n fill: labelColor,\n fontSize: labelFontSize,\n fontWeight: labelFontWeight,\n background: labelBackgroundColor,\n },\n smartInvert: labelColorSmartInvert,\n }\n\n if (labelColorSmartInvert) {\n ;(result.style as any).lineWidth = 2 // label 边框线宽度,不设置这个会导致智能反色失败\n }\n\n if (labelOverlap) {\n ;(result as any).overlap = {\n hideOnHit: true,\n clampForce: true,\n }\n }\n\n return result\n}\n"],"names":["labelHierarchySankey","spec","context","result","advancedVSeed","vseed","datasetReshapeInfo","chartType","encoding","baseConfig","foldInfo","label","buildLabel","vseedMeasures","vseedDimensions","advancedVSeedDimensions","advancedVSeedMeasures","foldInfoList","locale","enable","wrap","showValue","showValuePercent","showDimension","labelOverlap","labelColorSmartInvert","labelStroke","labelColor","labelFontSize","labelFontWeight","labelBackgroundColor","labelPosition","autoFormat","numFormat","hasDimLabelEncoding","item","labelDims","uniqueBy","d","MeasureId","labelMeas","percentFormat","merge","percentFormatter","createFormatter","data","entry","DATUM_HIDE_KEY","shouldApply","selectorWithDynamicFilter","selector","_","datum","dimLabels","id","rawValue","formatter","createFormatterByDimension","meaLabels","generateMeasureValue","measureId","measureValue","statistics","measure","findMeasureById","measureValueLabel","isNumber","generateMeasurePercent"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { VChartSpecPipe } from '../../../../../types';
2
+ export declare const labelSankey: VChartSpecPipe;
@@ -0,0 +1,78 @@
1
+ import { isNumber, merge } from "remeda";
2
+ import { selector, selectorWithDynamicFilter } from "../../../../../dataSelector/index.js";
3
+ import { DATUM_HIDE_KEY, createFormatter, findMeasureById } from "../../../../utils/index.js";
4
+ import { generateMeasurePercent, generateMeasureValue } from "./label.js";
5
+ const labelSankey = (spec, context)=>{
6
+ const result = {
7
+ ...spec
8
+ };
9
+ const { advancedVSeed, vseed } = context;
10
+ const { datasetReshapeInfo, chartType, encoding } = advancedVSeed;
11
+ const baseConfig = advancedVSeed.config[chartType];
12
+ const foldInfo = datasetReshapeInfo[0].foldInfo;
13
+ const label = baseConfig?.label;
14
+ if (!label) return result;
15
+ result.label = buildLabel(label, vseed.measures || advancedVSeed.measures || [], advancedVSeed.measures || [], encoding.label || [], foldInfo);
16
+ return result;
17
+ };
18
+ const buildLabel = (label, vseedMeasures, advancedVSeedMeasures, labelEncodingIds, foldInfo)=>{
19
+ const { enable, wrap, showValue, showValuePercent, showDimension, labelOverlap, labelColorSmartInvert, labelStroke, labelColor, labelFontSize, labelFontWeight, labelBackgroundColor, labelPosition, autoFormat, numFormat = {} } = label;
20
+ const hasMeasureLabelEncoding = vseedMeasures.some((item)=>labelEncodingIds.includes(item.id));
21
+ const labelMeasures = hasMeasureLabelEncoding ? vseedMeasures.filter((item)=>labelEncodingIds.includes(item.id)) : [];
22
+ const percentFormat = merge(numFormat, {
23
+ type: 'percent'
24
+ });
25
+ const percentFormatter = createFormatter(percentFormat);
26
+ const result = {
27
+ visible: enable,
28
+ dataFilter: (data)=>data.filter((entry)=>{
29
+ if (entry.data?.[DATUM_HIDE_KEY]) return false;
30
+ const shouldApply = label.dynamicFilter ? selectorWithDynamicFilter(entry.data, label.dynamicFilter, label.selector) : selector(entry.data, label.selector, 'Or');
31
+ return shouldApply;
32
+ }),
33
+ formatMethod: (_, datum)=>{
34
+ const parts = [];
35
+ if (showDimension && datum?.nodeName) parts.push(String(datum.nodeName));
36
+ if (showValue) {
37
+ const { measureId, measureValue } = foldInfo;
38
+ const measure = findMeasureById(advancedVSeedMeasures, datum[measureId]);
39
+ if (measure && void 0 !== datum[measureValue] && null !== datum[measureValue]) parts.push(generateMeasureValue(datum[measureValue], measure, autoFormat, numFormat));
40
+ else if (void 0 !== datum.value && null !== datum.value) {
41
+ const fallbackMeasure = findMeasureById(advancedVSeedMeasures, foldInfo.measureId) || findMeasureById(vseedMeasures, foldInfo.measureId) || advancedVSeedMeasures[0];
42
+ if (fallbackMeasure) parts.push(generateMeasureValue(datum.value, fallbackMeasure, autoFormat, numFormat));
43
+ else parts.push(String(datum.value));
44
+ }
45
+ }
46
+ if (showValuePercent) {
47
+ const ratioValue = datum['__VCHART_ARC_RATIO'];
48
+ if (isNumber(ratioValue)) parts.push(generateMeasurePercent(ratioValue, 1, percentFormatter));
49
+ else if (foldInfo.statistics && isNumber(foldInfo.statistics.sum) && void 0 !== datum[foldInfo.measureValue] && null !== datum[foldInfo.measureValue]) parts.push(generateMeasurePercent(datum[foldInfo.measureValue], foldInfo.statistics.sum, percentFormatter));
50
+ }
51
+ labelMeasures.forEach((measure)=>{
52
+ const rawValue = datum[measure.id];
53
+ if (null == rawValue || '' === rawValue) return;
54
+ parts.push(generateMeasureValue(rawValue, measure, autoFormat, numFormat));
55
+ });
56
+ return wrap ? parts : parts.join(' ');
57
+ },
58
+ syncState: true,
59
+ position: labelPosition,
60
+ style: {
61
+ stroke: labelStroke,
62
+ fill: labelColor,
63
+ fontSize: labelFontSize,
64
+ fontWeight: labelFontWeight,
65
+ background: labelBackgroundColor
66
+ },
67
+ smartInvert: labelColorSmartInvert
68
+ };
69
+ if (labelColorSmartInvert) result.style.lineWidth = 2;
70
+ if (labelOverlap) result.overlap = {
71
+ hideOnHit: true,
72
+ clampForce: true
73
+ };
74
+ return result;
75
+ };
76
+ export { labelSankey };
77
+
78
+ //# sourceMappingURL=labelSankey.js.map