@visactor/vseed 0.0.39 → 0.1.0

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 (131) hide show
  1. package/dist/builder/builder/builder.d.ts +61 -671
  2. package/dist/builder/register/chartType/index.d.ts +0 -1
  3. package/dist/dataReshape/constant.d.ts +17 -2
  4. package/dist/dataReshape/dataReshapeByEncoding.d.ts +11 -0
  5. package/dist/dataReshape/index.d.ts +3 -7
  6. package/dist/dataReshape/unfoldDimensions.d.ts +12 -14
  7. package/dist/index.cjs +1139 -1875
  8. package/dist/index.cjs.map +1 -1
  9. package/dist/index.d.ts +1 -1
  10. package/dist/index.js +1086 -1831
  11. package/dist/index.js.map +1 -1
  12. package/dist/pipeline/advanced/chart/pipeline/index.d.ts +0 -1
  13. package/dist/pipeline/advanced/chart/pipes/analysis/index.d.ts +3 -1
  14. package/dist/pipeline/advanced/chart/pipes/analysis/sort.d.ts +0 -4
  15. package/dist/pipeline/advanced/chart/pipes/{encoding/encodingAR.d.ts → analysis/sortLegend.d.ts} +1 -1
  16. package/dist/pipeline/advanced/chart/pipes/analysis/sortXBand.d.ts +3 -0
  17. package/dist/pipeline/advanced/chart/pipes/{encoding/encodingPie.d.ts → analysis/sortYBand.d.ts} +1 -1
  18. package/dist/pipeline/advanced/chart/pipes/encoding/{encodingFunnel.d.ts → bar.d.ts} +1 -1
  19. package/dist/pipeline/advanced/chart/pipes/encoding/{encodingAreaRange.d.ts → column.d.ts} +1 -1
  20. package/dist/pipeline/advanced/chart/pipes/encoding/dualAxis.d.ts +2 -0
  21. package/dist/pipeline/advanced/chart/pipes/encoding/funnel.d.ts +2 -0
  22. package/dist/pipeline/advanced/chart/pipes/encoding/heatmap.d.ts +2 -0
  23. package/dist/pipeline/advanced/chart/pipes/encoding/index.d.ts +8 -9
  24. package/dist/pipeline/advanced/chart/pipes/encoding/{encodingMatrix.d.ts → pie.d.ts} +1 -1
  25. package/dist/pipeline/advanced/chart/pipes/encoding/radar.d.ts +2 -0
  26. package/dist/pipeline/advanced/chart/pipes/encoding/rose.d.ts +2 -0
  27. package/dist/pipeline/advanced/chart/pipes/encoding/scatter.d.ts +2 -0
  28. package/dist/pipeline/advanced/chart/pipes/init/autoScatterMeasures.d.ts +2 -0
  29. package/dist/pipeline/advanced/chart/pipes/init/index.d.ts +2 -1
  30. package/dist/pipeline/advanced/chart/pipes/reshape/index.d.ts +4 -12
  31. package/dist/pipeline/advanced/chart/pipes/reshape/pivotReshapeWithDualEncoding.d.ts +2 -0
  32. package/dist/pipeline/advanced/chart/pipes/reshape/pivotReshapeWithEncoding.d.ts +2 -0
  33. package/dist/pipeline/advanced/chart/pipes/reshape/pivotReshapeWithScatterEncoding.d.ts +2 -0
  34. package/dist/pipeline/advanced/chart/pipes/reshape/reshapeWithDualEncoding.d.ts +2 -0
  35. package/dist/pipeline/advanced/chart/pipes/reshape/reshapeWithEncoding.d.ts +2 -0
  36. package/dist/pipeline/advanced/chart/pipes/reshape/reshapeWithScatterEncoding.d.ts +2 -0
  37. package/dist/pipeline/spec/chart/pipeline/index.d.ts +0 -1
  38. package/dist/pipeline/spec/chart/pipes/color/index.d.ts +0 -1
  39. package/dist/pipeline/spec/chart/pipes/{color/linearColor.d.ts → dataset/datasetScatter.d.ts} +1 -1
  40. package/dist/pipeline/spec/chart/pipes/dataset/index.d.ts +1 -0
  41. package/dist/pipeline/spec/chart/pipes/init/index.d.ts +1 -2
  42. package/dist/pipeline/spec/chart/pipes/legend/index.d.ts +0 -1
  43. package/dist/pipeline/spec/chart/pipes/tooltip/index.d.ts +0 -1
  44. package/dist/types/advancedVSeed.d.ts +26 -311
  45. package/dist/types/chartType/area/area.d.ts +10 -1
  46. package/dist/types/chartType/area/zArea.d.ts +14 -0
  47. package/dist/types/chartType/areaPercent/areaPercent.d.ts +10 -1
  48. package/dist/types/chartType/areaPercent/zAreaPercent.d.ts +14 -0
  49. package/dist/types/chartType/bar/bar.d.ts +19 -30
  50. package/dist/types/chartType/bar/zBar.d.ts +14 -0
  51. package/dist/types/chartType/barParallel/barParallel.d.ts +18 -30
  52. package/dist/types/chartType/barParallel/zBarParallel.d.ts +14 -0
  53. package/dist/types/chartType/barPercent/barPercent.d.ts +16 -21
  54. package/dist/types/chartType/barPercent/zBarPercent.d.ts +14 -0
  55. package/dist/types/chartType/column/column.d.ts +16 -28
  56. package/dist/types/chartType/column/zColumn.d.ts +14 -0
  57. package/dist/types/chartType/columnParallel/columnParallel.d.ts +19 -27
  58. package/dist/types/chartType/columnParallel/zColumnParallel.d.ts +14 -0
  59. package/dist/types/chartType/columnPercent/columnPercent.d.ts +16 -25
  60. package/dist/types/chartType/columnPercent/zColumnPercent.d.ts +14 -0
  61. package/dist/types/chartType/donut/donut.d.ts +10 -1
  62. package/dist/types/chartType/donut/zDonut.d.ts +14 -0
  63. package/dist/types/chartType/dualAxis/dualAxis.d.ts +9 -1
  64. package/dist/types/chartType/funnel/funnel.d.ts +9 -1
  65. package/dist/types/chartType/funnel/zFunnel.d.ts +14 -0
  66. package/dist/types/chartType/heatmap/heatmap.d.ts +10 -1
  67. package/dist/types/chartType/index.d.ts +0 -1
  68. package/dist/types/chartType/line/line.d.ts +14 -10
  69. package/dist/types/chartType/line/zLine.d.ts +14 -0
  70. package/dist/types/chartType/pie/pie.d.ts +10 -1
  71. package/dist/types/chartType/pie/zPie.d.ts +14 -0
  72. package/dist/types/chartType/radar/radar.d.ts +10 -1
  73. package/dist/types/chartType/radar/zRadar.d.ts +14 -0
  74. package/dist/types/chartType/rose/rose.d.ts +10 -1
  75. package/dist/types/chartType/rose/zRose.d.ts +14 -0
  76. package/dist/types/chartType/roseParallel/roseParallel.d.ts +10 -1
  77. package/dist/types/chartType/roseParallel/zRoseParallel.d.ts +14 -0
  78. package/dist/types/chartType/scatter/scatter.d.ts +88 -5
  79. package/dist/types/chartType/scatter/zScatter.d.ts +155 -0
  80. package/dist/types/index.d.ts +2 -1
  81. package/dist/types/properties/chartType/chartType.d.ts +1 -3
  82. package/dist/types/properties/config/config.d.ts +0 -307
  83. package/dist/types/properties/datasetReshapeInfo/datasetReshapeInfo.d.ts +13 -38
  84. package/dist/types/properties/datasetReshapeInfo/index.d.ts +1 -1
  85. package/dist/types/properties/datasetReshapeInfo/zDatasetReshapeInfo.d.ts +43 -0
  86. package/dist/types/properties/encoding/encoding.d.ts +49 -16
  87. package/dist/types/properties/encoding/index.d.ts +2 -2
  88. package/dist/types/properties/encoding/zEncoding.d.ts +29 -0
  89. package/dist/types/properties/measures/index.d.ts +4 -2
  90. package/dist/types/properties/measures/scatterMeasures.d.ts +6 -0
  91. package/dist/types/properties/measures/zScatterMeasures.d.ts +283 -0
  92. package/dist/types/properties/theme/customTheme.d.ts +0 -306
  93. package/dist/types/vseed.d.ts +2 -16816
  94. package/dist/types/zVseed.d.ts +15738 -0
  95. package/dist/umd/index.js +1113 -1855
  96. package/dist/umd/index.js.map +1 -1
  97. package/package.json +13 -5
  98. package/dist/builder/register/chartType/areaRange.d.ts +0 -1
  99. package/dist/dataReshape/dataReshapeFor1D.d.ts +0 -19
  100. package/dist/dataReshape/dataReshapeFor1D1M.d.ts +0 -19
  101. package/dist/dataReshape/dataReshapeFor1D2M.d.ts +0 -19
  102. package/dist/dataReshape/dataReshapeFor2D1M.d.ts +0 -19
  103. package/dist/dataReshape/dataReshapeFor2D1M0Name.d.ts +0 -19
  104. package/dist/dataReshape/unfoldZeroDimensions.d.ts +0 -10
  105. package/dist/pipeline/advanced/chart/pipeline/areaRange.d.ts +0 -2
  106. package/dist/pipeline/advanced/chart/pipes/encoding/encodingRose.d.ts +0 -2
  107. package/dist/pipeline/advanced/chart/pipes/encoding/encodingXY.d.ts +0 -2
  108. package/dist/pipeline/advanced/chart/pipes/encoding/encodingXYY.d.ts +0 -2
  109. package/dist/pipeline/advanced/chart/pipes/encoding/encodingYX.d.ts +0 -2
  110. package/dist/pipeline/advanced/chart/pipes/encoding/encodingYY.d.ts +0 -2
  111. package/dist/pipeline/advanced/chart/pipes/init/autoMeasuresBy2M1Group.d.ts +0 -8
  112. package/dist/pipeline/advanced/chart/pipes/reshape/pivotReshapeTo1D.d.ts +0 -8
  113. package/dist/pipeline/advanced/chart/pipes/reshape/pivotReshapeTo1D1M.d.ts +0 -8
  114. package/dist/pipeline/advanced/chart/pipes/reshape/pivotReshapeTo1D2M.d.ts +0 -8
  115. package/dist/pipeline/advanced/chart/pipes/reshape/pivotReshapeTo2D1M.d.ts +0 -8
  116. package/dist/pipeline/advanced/chart/pipes/reshape/pivotReshapeTo2D1M0Name.d.ts +0 -8
  117. package/dist/pipeline/advanced/chart/pipes/reshape/pivotReshapeTo2D2M.d.ts +0 -8
  118. package/dist/pipeline/advanced/chart/pipes/reshape/reshapeTo1D.d.ts +0 -8
  119. package/dist/pipeline/advanced/chart/pipes/reshape/reshapeTo1D1M.d.ts +0 -8
  120. package/dist/pipeline/advanced/chart/pipes/reshape/reshapeTo1D2M.d.ts +0 -8
  121. package/dist/pipeline/advanced/chart/pipes/reshape/reshapeTo2D1M.d.ts +0 -8
  122. package/dist/pipeline/advanced/chart/pipes/reshape/reshapeTo2D1M0Name.d.ts +0 -8
  123. package/dist/pipeline/advanced/chart/pipes/reshape/reshapeTo2D2M.d.ts +0 -8
  124. package/dist/pipeline/spec/chart/pipeline/areaRange.d.ts +0 -1
  125. package/dist/pipeline/spec/chart/pipes/init/areaRange.d.ts +0 -4
  126. package/dist/pipeline/spec/chart/pipes/legend/colorLegend.d.ts +0 -2
  127. package/dist/pipeline/spec/chart/pipes/tooltip/tooltipAreaRange.d.ts +0 -2
  128. package/dist/types/chartType/areaRange/areaRange.d.ts +0 -151
  129. package/dist/types/chartType/areaRange/index.d.ts +0 -2
  130. package/dist/types/chartType/areaRange/zAreaRange.d.ts +0 -1427
  131. /package/dist/pipeline/spec/chart/pipes/init/{initDualAxis.d.ts → dualAxis.d.ts} +0 -0
package/dist/index.js CHANGED
@@ -1080,13 +1080,26 @@ const isVTable = (vseed)=>[
1080
1080
  const isVChart = (vseed)=>!isVTable(vseed);
1081
1081
  const isPivotChart = (vseed)=>{
1082
1082
  if (isVTable(vseed)) return false;
1083
- if ('dualAxis' === vseed.chartType) {
1084
- if (vseed.measures) {
1085
- const depth = measureDepth(vseed.measures);
1086
- if (3 === depth) return true;
1087
- return false;
1083
+ if ('dualAxis' === vseed.chartType || 'scatter' === vseed.chartType) {
1084
+ const { dimensions = [] } = vseed;
1085
+ const hasRowOrColumnDimension = dimensions && dimensions.some((dimension)=>'rowDimension' === dimension.location || 'columnDimension' === dimension.location);
1086
+ if (hasRowOrColumnDimension) return true;
1087
+ if ('scatter' === vseed.chartType) {
1088
+ if (vseed.measures) {
1089
+ const depth = measureDepth(vseed.measures);
1090
+ if (3 === depth) return true;
1091
+ return false;
1092
+ }
1093
+ if (vseed.scatterMeasures && vseed.scatterMeasures.length > 1) return true;
1094
+ }
1095
+ if ('dualAxis' === vseed.chartType) {
1096
+ if (vseed.measures) {
1097
+ const depth = measureDepth(vseed.measures);
1098
+ if (3 === depth) return true;
1099
+ return false;
1100
+ }
1101
+ if (vseed.dualMeasures && vseed.dualMeasures.length > 1) return true;
1088
1102
  }
1089
- if (vseed.dualMeasures && vseed.dualMeasures.length > 1) return true;
1090
1103
  return false;
1091
1104
  }
1092
1105
  const { measures = [], dimensions = [] } = vseed;
@@ -1165,6 +1178,24 @@ const createEmptyMeasureGroup = ()=>({
1165
1178
  alias: '',
1166
1179
  children: []
1167
1180
  });
1181
+ const ORIGINAL_DATA = '__OriginalData__';
1182
+ const Separator = '-';
1183
+ const FoldMeasureName = '__MeaName__';
1184
+ const FoldMeasureId = '__MeaId__';
1185
+ const FoldMeasureValue = '__MeaValue__';
1186
+ const MeasureName = FoldMeasureName;
1187
+ const FoldPrimaryMeasureValue = '__MeaPrimaryValue__';
1188
+ const FoldSecondaryMeasureValue = '__MeaSecondaryValue__';
1189
+ const FoldXMeasureValue = '__MeaXValue__';
1190
+ const FoldYMeasureValue = '__MeaYValue__';
1191
+ const XEncoding = '__Dim_X__';
1192
+ const YEncoding = '__Dim_Y__';
1193
+ const AngleEncoding = '__Dim_Angle__';
1194
+ const DetailEncoding = '__Dim_Detail__';
1195
+ const ColorEncoding = '__Dim_Color__';
1196
+ const ColorIdEncoding = '__Dim_ColorId__';
1197
+ const UnfoldDimensionGroup = '__DimGroup__';
1198
+ const UnfoldDimensionGroupId = '__DimGroupID__';
1168
1199
  const autoDimensions_autoDimensions = (advancedVSeed, context)=>{
1169
1200
  const result = {
1170
1201
  ...advancedVSeed
@@ -1172,6 +1203,10 @@ const autoDimensions_autoDimensions = (advancedVSeed, context)=>{
1172
1203
  const { vseed } = context;
1173
1204
  const { dimensions, dataset } = vseed;
1174
1205
  const measures = findAllMeasures(advancedVSeed.measures);
1206
+ const MeaName = {
1207
+ id: MeasureName,
1208
+ alias: intl.i18n`指标名称`
1209
+ };
1175
1210
  if (!dataset) throw new Error('dataset is required');
1176
1211
  if (0 === dataset.length) return result;
1177
1212
  if (dimensions) {
@@ -1179,6 +1214,8 @@ const autoDimensions_autoDimensions = (advancedVSeed, context)=>{
1179
1214
  location: 'dimension',
1180
1215
  ...dim
1181
1216
  }));
1217
+ if (result.dimensions.some((dim)=>dim.id === MeasureName)) return result;
1218
+ result.dimensions.push(MeaName);
1182
1219
  return result;
1183
1220
  }
1184
1221
  const top100dataset = dataset.slice(0, 100);
@@ -1195,23 +1232,51 @@ const autoDimensions_autoDimensions = (advancedVSeed, context)=>{
1195
1232
  alias: dim,
1196
1233
  location: 'dimension'
1197
1234
  }));
1235
+ result.dimensions.push(MeaName);
1198
1236
  return result;
1199
1237
  };
1238
+ const encodingForColumn = (advancedVSeed, context)=>{
1239
+ const { vseed } = context;
1240
+ const { dimensions } = advancedVSeed;
1241
+ if (!dimensions) return advancedVSeed;
1242
+ const encoding = vseed.encoding;
1243
+ if (encoding) {
1244
+ const x = encoding.x || [];
1245
+ const detail = encoding.detail || [];
1246
+ const color = encoding.color || [];
1247
+ const mergedDetail = [
1248
+ ...color.filter((d)=>!x.includes(d)),
1249
+ ...detail
1250
+ ];
1251
+ return {
1252
+ ...advancedVSeed,
1253
+ encoding: {
1254
+ ...encoding,
1255
+ detail: mergedDetail
1256
+ }
1257
+ };
1258
+ }
1259
+ const onlyMeasureName = 1 === dimensions.length && dimensions.find((item)=>item.id === MeasureName);
1260
+ const mergedEncoding = {
1261
+ x: dimensions.slice(0, 1).map((item)=>item.id),
1262
+ color: dimensions.slice(1).map((item)=>item.id),
1263
+ detail: dimensions.slice(onlyMeasureName ? 0 : 1).map((item)=>item.id),
1264
+ tooltip: dimensions.map((item)=>item.id),
1265
+ label: [],
1266
+ row: [],
1267
+ column: []
1268
+ };
1269
+ return {
1270
+ ...advancedVSeed,
1271
+ encoding: mergedEncoding
1272
+ };
1273
+ };
1200
1274
  const pivotAdapter = (pipeline, pivotPipeline)=>(advancedVSeed, context)=>{
1201
1275
  const { vseed } = context;
1202
1276
  const usePivotChart = isPivotChart(vseed);
1203
1277
  if (usePivotChart) return execPipeline(pivotPipeline, context, advancedVSeed);
1204
1278
  return execPipeline(pipeline, context, advancedVSeed);
1205
1279
  };
1206
- const FoldMeasureName = '__MeaName__';
1207
- const FoldMeasureId = '__MeaId__';
1208
- const FoldMeasureValue = '__MeaValue__';
1209
- const FoldPrimaryMeasureValue = '__MeaPrimaryValue__';
1210
- const FoldSecondaryMeasureValue = '__MeaSecondaryValue__';
1211
- const UnfoldDimensionGroup = '__DimGroup__';
1212
- const UnfoldDimensionGroupId = '__DimGroupID__';
1213
- const Separator = '-';
1214
- const ORIGINAL_DATA = '__OriginalData__';
1215
1280
  const foldMeasures = (dataset, measures, measureId = FoldMeasureId, measureName = FoldMeasureName, measureValue = FoldMeasureValue)=>{
1216
1281
  const foldInfo = {
1217
1282
  measureId,
@@ -1241,79 +1306,53 @@ const foldMeasures = (dataset, measures, measureId = FoldMeasureId, measureName
1241
1306
  foldInfo
1242
1307
  };
1243
1308
  };
1244
- const unfoldDimensions = (dataset, dimensions, measures, unfoldStartIndex = 0, unfoldGroupName = UnfoldDimensionGroup, unfoldGroupId = UnfoldDimensionGroupId, foldMeasureId = FoldMeasureId, dimensionsSeparator = Separator)=>{
1245
- if (unfoldStartIndex < 0 || unfoldStartIndex >= dimensions.length) throw new Error('unfoldStartIndex is out of range');
1246
- const dimensionsToBeUnfolded = dimensions.slice(unfoldStartIndex);
1309
+ const unfoldDimensions = (dataset, dimensions, encoding, options)=>{
1310
+ const { foldMeasureId, separator, colorItemAsId } = options;
1247
1311
  const unfoldInfo = {
1248
- groupName: unfoldGroupName,
1249
- groupId: unfoldGroupId,
1312
+ encodingAngle: AngleEncoding,
1313
+ encodingX: XEncoding,
1314
+ encodingY: YEncoding,
1315
+ encodingDetail: DetailEncoding,
1316
+ encodingColor: ColorEncoding,
1317
+ encodingColorId: ColorIdEncoding,
1250
1318
  colorItems: [],
1251
1319
  colorIdMap: {}
1252
1320
  };
1253
- if (0 === dimensions.length || 0 === measures.length) return {
1254
- dataset,
1255
- unfoldInfo: {
1256
- groupName: unfoldGroupName,
1257
- groupId: unfoldGroupId,
1258
- colorItems: [],
1259
- colorIdMap: {}
1260
- }
1261
- };
1262
- const colorItems = [];
1263
- const colorMap = {};
1321
+ const { color, x, y, detail, angle } = encoding;
1322
+ const angleDimensions = angle ? dimensions.filter((dim)=>angle.includes(dim.id)) : [];
1323
+ const xDimensions = x ? dimensions.filter((dim)=>x.includes(dim.id)) : [];
1324
+ const yDimensions = y ? dimensions.filter((dim)=>y.includes(dim.id)) : [];
1325
+ const colorDimensions = color ? dimensions.filter((dim)=>color.includes(dim.id)) : [];
1326
+ const detailDimensions = detail ? dimensions.filter((dim)=>detail.includes(dim.id)) : [];
1327
+ const colorItems = new Set();
1328
+ const colorIdMap = {};
1264
1329
  for(let i = 0; i < dataset.length; i++){
1265
1330
  const datum = dataset[i];
1266
- const colorName = generateDimGroupName(dimensionsToBeUnfolded, datum, dimensionsSeparator);
1267
- const colorId = datum[foldMeasureId] ? [
1268
- colorName,
1269
- datum[foldMeasureId]
1270
- ].join(dimensionsSeparator) : colorName;
1271
- datum[unfoldGroupName] = colorName;
1272
- datum[unfoldGroupId] = colorId;
1273
- colorItems.push(colorId);
1274
- colorMap[colorId] = colorName;
1331
+ applyEncoding(AngleEncoding, angleDimensions, datum, separator);
1332
+ applyEncoding(XEncoding, xDimensions, datum, separator);
1333
+ applyEncoding(YEncoding, yDimensions, datum, separator);
1334
+ applyEncoding(ColorEncoding, colorDimensions, datum, separator);
1335
+ applyEncoding(DetailEncoding, detailDimensions, datum, separator);
1336
+ if (!datum[ColorEncoding]) continue;
1337
+ const measureId = String(datum[foldMeasureId]);
1338
+ const colorItem = String(datum[ColorEncoding]);
1339
+ const colorId = colorItemAsId ? colorItem : measureId ? [
1340
+ colorItem,
1341
+ measureId
1342
+ ].join(separator) : colorItem;
1343
+ datum[ColorIdEncoding] = colorId;
1344
+ colorIdMap[colorId] = colorItem;
1345
+ colorItems.add(colorId);
1275
1346
  }
1276
- unfoldInfo.colorItems = unique(colorItems);
1277
- unfoldInfo.colorIdMap = colorMap;
1347
+ unfoldInfo.colorItems = Array.from(colorItems);
1348
+ unfoldInfo.colorIdMap = colorIdMap;
1278
1349
  return {
1279
1350
  dataset,
1280
1351
  unfoldInfo
1281
1352
  };
1282
1353
  };
1283
- const generateDimGroupName = (dimensionsToBeGrouped, datum, dimensionsSeparator)=>dimensionsToBeGrouped.map((dim)=>String(datum[dim.id])).join(dimensionsSeparator);
1284
- const unfoldZeroDimensions = (dataset, measures, measureName, unfoldGroupName = UnfoldDimensionGroup, unfoldGroupId = UnfoldDimensionGroupId)=>{
1285
- const unfoldInfo = {
1286
- groupName: unfoldGroupName,
1287
- groupId: unfoldGroupId,
1288
- colorItems: [],
1289
- colorIdMap: {}
1290
- };
1291
- if (0 === measures.length) return {
1292
- dataset,
1293
- unfoldInfo: {
1294
- groupName: unfoldGroupName,
1295
- groupId: unfoldGroupId,
1296
- colorItems: [],
1297
- colorIdMap: {}
1298
- }
1299
- };
1300
- const colorItems = [];
1301
- const colorMap = {};
1302
- for(let i = 0; i < dataset.length; i++){
1303
- const datum = dataset[i];
1304
- const colorName = measureName;
1305
- const colorId = measureName;
1306
- datum[unfoldGroupName] = colorName;
1307
- datum[unfoldGroupId] = colorId;
1308
- colorItems.push(colorId);
1309
- colorMap[colorId] = colorName;
1310
- }
1311
- unfoldInfo.colorItems = unique(colorItems);
1312
- unfoldInfo.colorIdMap = colorMap;
1313
- return {
1314
- dataset,
1315
- unfoldInfo
1316
- };
1354
+ const applyEncoding = (encoding, dimensions, datum, separator)=>{
1355
+ if (encoding && dimensions.length) datum[encoding] = dimensions.map((dim)=>String(datum[dim.id])).join(separator);
1317
1356
  };
1318
1357
  const emptyReshapeResult = {
1319
1358
  dataset: [],
@@ -1324,69 +1363,47 @@ const emptyReshapeResult = {
1324
1363
  measureValue: ''
1325
1364
  },
1326
1365
  unfoldInfo: {
1327
- groupName: '',
1328
- groupId: '',
1366
+ encodingAngle: AngleEncoding,
1367
+ encodingX: XEncoding,
1368
+ encodingY: YEncoding,
1369
+ encodingDetail: DetailEncoding,
1370
+ encodingColor: ColorEncoding,
1371
+ encodingColorId: ColorIdEncoding,
1329
1372
  colorItems: [],
1330
1373
  colorIdMap: {}
1331
1374
  }
1332
1375
  };
1333
- const dataReshapeFor2D1M0Name = (dataset, dimensions, measures, options)=>{
1334
- const { foldMeasureId = FoldMeasureId, foldMeasureName = FoldMeasureName, foldMeasureValue = FoldMeasureValue, unfoldDimensionGroup = UnfoldDimensionGroup, unfoldDimensionGroupId = UnfoldDimensionGroupId } = options || {};
1376
+ const dataReshapeByEncoding = (dataset, dimensions, measures, encoding, options)=>{
1377
+ const { foldMeasureId = FoldMeasureId, foldMeasureName = FoldMeasureName, foldMeasureValue = FoldMeasureValue, colorItemAsId = false } = options || {};
1335
1378
  if (0 === dimensions.length && 0 === measures.length) return emptyReshapeResult;
1336
1379
  const { dataset: foldedDataset, foldInfo } = foldMeasures(dataset, measures, foldMeasureId, foldMeasureName, foldMeasureValue);
1337
- if (0 === dimensions.length) {
1338
- const { dataset: finalDataset, unfoldInfo } = unfoldZeroDimensions(foldedDataset, [
1339
- {
1340
- id: foldMeasureValue,
1341
- alias: i18n`指标值`
1342
- }
1343
- ], i18n`指标名称`, unfoldDimensionGroup, unfoldDimensionGroupId);
1344
- return {
1345
- dataset: finalDataset,
1346
- foldInfo,
1347
- unfoldInfo
1348
- };
1349
- }
1350
- {
1351
- const onlyOneMeasure = 1 === measures.length;
1352
- const onlyOneDimension = 1 === dimensions.length;
1353
- const dims = [
1354
- ...dimensions
1355
- ];
1356
- if (!onlyOneMeasure || onlyOneDimension) dims.push({
1357
- id: foldMeasureName,
1358
- alias: i18n`指标名称`,
1359
- location: 'dimension'
1360
- });
1361
- const { dataset: finalDataset, unfoldInfo } = unfoldDimensions(foldedDataset, dims, [
1362
- {
1363
- id: foldMeasureValue,
1364
- alias: i18n`指标值`
1365
- }
1366
- ], 1, unfoldDimensionGroup, unfoldDimensionGroupId, foldMeasureId);
1367
- return {
1368
- dataset: finalDataset,
1369
- foldInfo,
1370
- unfoldInfo
1371
- };
1372
- }
1380
+ const { dataset: finalDataset, unfoldInfo } = unfoldDimensions(foldedDataset, dimensions, encoding, {
1381
+ foldMeasureId,
1382
+ separator: Separator,
1383
+ colorItemAsId
1384
+ });
1385
+ return {
1386
+ dataset: finalDataset,
1387
+ foldInfo,
1388
+ unfoldInfo
1389
+ };
1373
1390
  };
1374
- const reshapeTo2D1M0Name = (advancedVSeed, context)=>{
1391
+ const reshapeWithEncoding = (advancedVSeed, context)=>{
1375
1392
  const result = {
1376
1393
  ...advancedVSeed
1377
1394
  };
1378
1395
  const { vseed } = context;
1379
- const { dataset } = vseed;
1380
- const { dimensions, measures } = advancedVSeed;
1381
- if (!measures || !dimensions || !dataset) return result;
1396
+ const { dataset, chartType } = vseed;
1397
+ const { dimensions, measures, encoding } = advancedVSeed;
1398
+ if (!measures || !dimensions || !dataset || !encoding) return result;
1382
1399
  if (0 === measures.length) throw new Error('measures can not be empty');
1383
- const { dataset: newDatasets, foldInfo, unfoldInfo } = dataReshapeFor2D1M0Name(dataset, dimensions, measures);
1400
+ const { dataset: newDatasets, foldInfo, unfoldInfo } = dataReshapeByEncoding(dataset, dimensions, measures, encoding);
1384
1401
  return {
1385
1402
  ...result,
1386
1403
  dataset: newDatasets,
1387
1404
  datasetReshapeInfo: [
1388
1405
  {
1389
- id: '2D1M',
1406
+ id: String(chartType),
1390
1407
  index: 0,
1391
1408
  foldInfo,
1392
1409
  unfoldInfo
@@ -1396,31 +1413,27 @@ const reshapeTo2D1M0Name = (advancedVSeed, context)=>{
1396
1413
  measures
1397
1414
  };
1398
1415
  };
1399
- const pivotReshapeTo2D1M0Name = (advancedVSeed, context)=>{
1416
+ const pivotReshapeWithEncoding = (advancedVSeed, context)=>{
1400
1417
  const result = {
1401
1418
  ...advancedVSeed
1402
1419
  };
1403
1420
  const { vseed } = context;
1404
1421
  const { dataset } = vseed;
1405
- const { measures } = advancedVSeed;
1406
- const dimensions = advancedVSeed.dimensions;
1407
- if (!measures || !dimensions) return result;
1422
+ const { dimensions, measures, encoding } = advancedVSeed;
1423
+ if (!measures || !dimensions || !dataset || !encoding) return result;
1424
+ if (0 === measures.length) throw new Error('measures can not be empty');
1408
1425
  const measureGroups = [];
1409
1426
  if (measures) measures.forEach((measure)=>{
1410
1427
  if (measure.children && measure.children.length > 0) measureGroups.push(measure);
1411
1428
  });
1412
- const commonDimensions = dimensions.filter((dim)=>'dimension' === dim.location);
1413
- const newDatasets = [];
1429
+ const datasets = [];
1414
1430
  const datasetReshapeInfo = [];
1415
1431
  measureGroups.forEach((measureGroup, index)=>{
1416
1432
  const measures = measureGroup.children;
1417
1433
  if (!measures) return;
1418
1434
  const groupId = measureGroup.id;
1419
- const { dataset: newSubDataset, foldInfo, unfoldInfo } = dataReshapeFor2D1M0Name(dataset, commonDimensions, measures, {
1420
- foldMeasureId: FoldMeasureId,
1421
- foldMeasureName: FoldMeasureName,
1422
- foldMeasureValue: FoldMeasureValue + groupId,
1423
- unfoldDimensionGroup: UnfoldDimensionGroup
1435
+ const { dataset: newSubDataset, foldInfo, unfoldInfo } = dataReshapeByEncoding(dataset, dimensions, measures, encoding, {
1436
+ foldMeasureValue: `${FoldMeasureValue}${groupId}`
1424
1437
  });
1425
1438
  const reshapeInfo = {
1426
1439
  id: groupId,
@@ -1428,93 +1441,60 @@ const pivotReshapeTo2D1M0Name = (advancedVSeed, context)=>{
1428
1441
  foldInfo,
1429
1442
  unfoldInfo
1430
1443
  };
1431
- newDatasets.push(newSubDataset);
1444
+ datasets.push(newSubDataset);
1432
1445
  datasetReshapeInfo.push(reshapeInfo);
1433
1446
  });
1434
1447
  return {
1435
1448
  ...result,
1436
- dataset: newDatasets,
1449
+ dataset: datasets,
1437
1450
  datasetReshapeInfo: datasetReshapeInfo
1438
1451
  };
1439
1452
  };
1440
- const encodingXY = (advancedVSeed)=>{
1441
- const result = {
1442
- ...advancedVSeed
1443
- };
1444
- const { datasetReshapeInfo, dimensions } = advancedVSeed;
1445
- if (!datasetReshapeInfo || !dimensions) return result;
1446
- const xDimension = dimensions.find((item)=>'rowDimension' !== item.location && 'columnDimension' !== item.location) || dimensions[0];
1447
- const isZeroDimension = 0 === dimensions.length;
1448
- const encoding = datasetReshapeInfo.reduce((prev, cur)=>{
1449
- const { foldInfo, unfoldInfo } = cur;
1450
- const x = [
1451
- isZeroDimension ? foldInfo.measureName : xDimension?.id
1452
- ];
1453
- const y = [
1454
- foldInfo.measureValue
1455
- ];
1456
- const group = [
1457
- unfoldInfo.groupId
1458
- ];
1459
- const color = [
1460
- foldInfo.measureName
1461
- ];
1462
- return [
1463
- ...prev,
1464
- {
1465
- x,
1466
- y,
1467
- group,
1468
- color
1469
- }
1470
- ];
1471
- }, []);
1472
- return {
1473
- ...result,
1474
- encoding
1475
- };
1476
- };
1477
1453
  const sortXBandAxis = (advancedVSeed, context)=>{
1478
1454
  const result = {
1479
1455
  ...advancedVSeed
1480
1456
  };
1481
1457
  const { vseed } = context;
1482
- const { sort: sortAxis, dataset } = vseed;
1483
- const { encoding } = advancedVSeed;
1484
- const xField = encoding?.[0]?.x?.[0];
1458
+ const { sort: sortAxis } = vseed;
1459
+ const { datasetReshapeInfo, dataset } = advancedVSeed;
1460
+ const { unfoldInfo } = datasetReshapeInfo[0];
1461
+ const xField = unfoldInfo.encodingX;
1485
1462
  if (!sortAxis || !xField) return advancedVSeed;
1486
1463
  if (!result.analysis) result.analysis = {};
1487
1464
  if (!result.analysis.orderMapping) result.analysis.orderMapping = {};
1488
- const axisOrderResult = calcOrder(sortAxis, xField, dataset);
1465
+ const axisOrderResult = calcOrder(sortAxis, xField, dataset.flat(2));
1489
1466
  result.analysis.orderMapping[xField] = axisOrderResult;
1490
1467
  return result;
1491
1468
  };
1492
- const sortYBandAxis = (advancedVSeed, context)=>{
1493
- const result = {
1494
- ...advancedVSeed
1495
- };
1496
- const { vseed } = context;
1497
- const { sort: sortAxis, dataset } = vseed;
1498
- const { encoding } = advancedVSeed;
1499
- const yField = encoding?.[0]?.y?.[0];
1500
- if (!sortAxis || !yField) return advancedVSeed;
1501
- if (!result.analysis) result.analysis = {};
1502
- if (!result.analysis.orderMapping) result.analysis.orderMapping = {};
1503
- const axisOrderResult = calcOrder(sortAxis, yField, dataset);
1504
- result.analysis.orderMapping[yField] = axisOrderResult;
1505
- return result;
1469
+ const calcOrder = (sortConfig, id, dataset)=>{
1470
+ if (sortConfig.customOrder) return sortConfig.customOrder;
1471
+ const order = sortConfig.order || 'asc';
1472
+ const orderBy = sortConfig.orderBy;
1473
+ const res = sort(dataset, (a, b)=>{
1474
+ const aValue = a[orderBy || id];
1475
+ const bValue = b[orderBy || id];
1476
+ if ('asc' === order) {
1477
+ if (aValue < bValue) return -1;
1478
+ if (aValue > bValue) return 1;
1479
+ return 0;
1480
+ }
1481
+ if (aValue > bValue) return -1;
1482
+ if (aValue < bValue) return 1;
1483
+ return 0;
1484
+ });
1485
+ return unique(res.map((item)=>item[id]));
1506
1486
  };
1507
- const sort_sortLegend = (advancedVSeed, context)=>{
1487
+ const sortLegend_sortLegend = (advancedVSeed, context)=>{
1508
1488
  const result = {
1509
1489
  ...advancedVSeed
1510
1490
  };
1511
1491
  const { vseed } = context;
1512
1492
  const { sortLegend } = vseed;
1513
- const { datasetReshapeInfo } = advancedVSeed;
1514
- const groupField = datasetReshapeInfo?.[0]?.unfoldInfo?.groupId;
1493
+ const { datasetReshapeInfo, dataset } = advancedVSeed;
1494
+ const colorId = datasetReshapeInfo?.[0]?.unfoldInfo?.encodingColorId;
1515
1495
  const colorIdMap = datasetReshapeInfo?.[0]?.unfoldInfo?.colorIdMap;
1516
1496
  const colorItems = datasetReshapeInfo?.[0]?.unfoldInfo?.colorItems;
1517
- if (!sortLegend || !groupField || !colorIdMap || !colorItems) return advancedVSeed;
1497
+ if (!sortLegend || !colorId || !colorIdMap || !colorItems) return advancedVSeed;
1518
1498
  if (!result.analysis) result.analysis = {};
1519
1499
  if (!result.analysis.orderMapping) result.analysis.orderMapping = {};
1520
1500
  if (sortLegend.customOrder) {
@@ -1523,15 +1503,14 @@ const sort_sortLegend = (advancedVSeed, context)=>{
1523
1503
  return pre;
1524
1504
  }, {});
1525
1505
  const orderRes = sortLegend.customOrder.map((itemNameOrId)=>nameMap[itemNameOrId] ? nameMap[itemNameOrId] : itemNameOrId);
1526
- result.analysis.orderMapping[groupField] = orderRes;
1506
+ result.analysis.orderMapping[colorId] = orderRes;
1527
1507
  return result;
1528
1508
  }
1529
- const dataset = advancedVSeed.dataset?.flat(2);
1530
- const orderRes = calcOrder(sortLegend, groupField, dataset || []);
1531
- result.analysis.orderMapping[groupField] = orderRes;
1509
+ const orderRes = sortLegend_calcOrder(sortLegend, colorId, dataset?.flat(2) || []);
1510
+ result.analysis.orderMapping[colorId] = orderRes;
1532
1511
  return result;
1533
1512
  };
1534
- const calcOrder = (sortConfig, id, dataset)=>{
1513
+ const sortLegend_calcOrder = (sortConfig, id, dataset)=>{
1535
1514
  if (sortConfig.customOrder) return sortConfig.customOrder;
1536
1515
  const order = sortConfig.order || 'asc';
1537
1516
  const orderBy = sortConfig.orderBy;
@@ -1663,14 +1642,14 @@ const lineAdvancedPipeline = [
1663
1642
  initAdvancedVSeed_initAdvancedVSeed,
1664
1643
  autoMeasures_autoMeasures,
1665
1644
  autoDimensions_autoDimensions,
1645
+ encodingForColumn,
1666
1646
  pivotAdapter([
1667
- reshapeTo2D1M0Name
1647
+ reshapeWithEncoding
1668
1648
  ], [
1669
- pivotReshapeTo2D1M0Name
1649
+ pivotReshapeWithEncoding
1670
1650
  ]),
1671
- encodingXY,
1672
1651
  sortXBandAxis,
1673
- sort_sortLegend,
1652
+ sortLegend_sortLegend,
1674
1653
  lineConfig,
1675
1654
  theme_theme,
1676
1655
  markStyle_markStyle,
@@ -1681,13 +1660,13 @@ const initLine = (spec, context)=>{
1681
1660
  ...spec
1682
1661
  };
1683
1662
  const { advancedVSeed } = context;
1684
- const { encoding } = advancedVSeed;
1685
- if (!encoding[0].y || !encoding[0].x || !encoding[0].group) return result;
1663
+ const { datasetReshapeInfo } = advancedVSeed;
1664
+ const { foldInfo, unfoldInfo } = datasetReshapeInfo[0];
1686
1665
  result.type = 'line';
1687
1666
  result.direction = 'vertical';
1688
- result.xField = encoding[0].x[0];
1689
- result.yField = encoding[0].y[0];
1690
- result.seriesField = encoding[0].group[0];
1667
+ result.xField = unfoldInfo.encodingX;
1668
+ result.yField = foldInfo.measureValue;
1669
+ result.seriesField = unfoldInfo.encodingColorId;
1691
1670
  result.padding = 0;
1692
1671
  result.region = [
1693
1672
  {
@@ -1763,11 +1742,12 @@ const background_backgroundColor = (spec, context)=>{
1763
1742
  };
1764
1743
  const datasetXY = (spec, context)=>{
1765
1744
  const { advancedVSeed, vseed } = context;
1766
- const { encoding, analysis, datasetReshapeInfo } = advancedVSeed;
1745
+ const { analysis, datasetReshapeInfo } = advancedVSeed;
1746
+ const { unfoldInfo } = datasetReshapeInfo[0];
1767
1747
  const orderMapping = analysis?.orderMapping || {};
1768
- const angle = encoding[0]?.angle?.[0];
1769
- const x = encoding[0]?.x?.[0];
1770
- const group = encoding[0]?.group?.[0];
1748
+ const angle = unfoldInfo.encodingAngle;
1749
+ const x = unfoldInfo.encodingX;
1750
+ const colorId = unfoldInfo.encodingColorId;
1771
1751
  const id = datasetReshapeInfo[0].id;
1772
1752
  const fields = {};
1773
1753
  if (angle) fields[angle] = {
@@ -1784,14 +1764,14 @@ const datasetXY = (spec, context)=>{
1784
1764
  sortIndex: 0
1785
1765
  };
1786
1766
  }
1787
- if (group) {
1788
- const order = orderMapping[group];
1789
- if (order) fields[group] = {
1767
+ if (colorId) {
1768
+ const order = orderMapping[colorId];
1769
+ if (order) fields[colorId] = {
1790
1770
  sortIndex: 0,
1791
1771
  domain: order,
1792
1772
  lockStatisticsByDomain: true
1793
1773
  };
1794
- else fields[group] = {
1774
+ else fields[colorId] = {
1795
1775
  sortIndex: 0
1796
1776
  };
1797
1777
  }
@@ -2044,7 +2024,7 @@ const tooltip_tooltip = (spec, context)=>{
2044
2024
  } } = baseConfig;
2045
2025
  const { enable } = tooltip;
2046
2026
  const { measureId, measureValue, measureName } = datasetReshapeInfo[0].foldInfo;
2047
- const { groupName } = datasetReshapeInfo[0].unfoldInfo;
2027
+ const { encodingColor: colorName } = datasetReshapeInfo[0].unfoldInfo;
2048
2028
  result.tooltip = {
2049
2029
  visible: enable,
2050
2030
  mark: {
@@ -2065,7 +2045,7 @@ const tooltip_tooltip = (spec, context)=>{
2065
2045
  {
2066
2046
  visible: true,
2067
2047
  hasShape: true,
2068
- key: (datum)=>datum && datum[measureName || groupName] || '',
2048
+ key: (datum)=>datum && datum[measureName || colorName] || '',
2069
2049
  value: (datum)=>{
2070
2050
  if (!datum) return '';
2071
2051
  const value = datum[measureValue];
@@ -2087,7 +2067,7 @@ const tooltip_tooltip = (spec, context)=>{
2087
2067
  content: [
2088
2068
  {
2089
2069
  visible: true,
2090
- key: (datum)=>datum && datum[groupName] || '',
2070
+ key: (datum)=>datum && datum[colorName] || '',
2091
2071
  value: (datum)=>{
2092
2072
  if (!datum) return '';
2093
2073
  const value = datum[measureValue];
@@ -2425,7 +2405,8 @@ const pointStateDimensionHover = (spec)=>{
2425
2405
  const pointStateHover = (spec, context)=>{
2426
2406
  const point = spec.point || {};
2427
2407
  const { advancedVSeed } = context;
2428
- const { encoding } = advancedVSeed;
2408
+ const { datasetReshapeInfo } = advancedVSeed;
2409
+ const { unfoldInfo } = datasetReshapeInfo[0];
2429
2410
  const result = {
2430
2411
  ...spec,
2431
2412
  point: {
@@ -2436,7 +2417,7 @@ const pointStateHover = (spec, context)=>{
2436
2417
  scaleX: 1.4,
2437
2418
  scaleY: 1.4,
2438
2419
  stroke: (datum, context)=>{
2439
- const field = encoding[0]?.group?.[0];
2420
+ const field = unfoldInfo.encodingColorId;
2440
2421
  const color = context.seriesColor(datum[field]);
2441
2422
  return color;
2442
2423
  },
@@ -2450,7 +2431,8 @@ const pointStateHover = (spec, context)=>{
2450
2431
  };
2451
2432
  const lineStyle_lineStyle = (spec, context)=>{
2452
2433
  const { advancedVSeed } = context;
2453
- const { markStyle, encoding, dataset } = advancedVSeed;
2434
+ const { markStyle, datasetReshapeInfo, dataset } = advancedVSeed;
2435
+ const { unfoldInfo } = datasetReshapeInfo[0];
2454
2436
  const { lineStyle } = markStyle;
2455
2437
  if (!lineStyle) return spec;
2456
2438
  const result = {
@@ -2459,8 +2441,8 @@ const lineStyle_lineStyle = (spec, context)=>{
2459
2441
  const lineStyles = Array.isArray(lineStyle) ? lineStyle : [
2460
2442
  lineStyle
2461
2443
  ];
2462
- const group = encoding[0]?.group?.[0];
2463
- const lineGroups = groupBy(dataset, (d)=>d[group ?? '']);
2444
+ const colorId = unfoldInfo.encodingColorId;
2445
+ const lineGroups = groupBy(dataset, (d)=>d[colorId ?? '']);
2464
2446
  const customMap = lineStyles.reduce((result, style, index)=>{
2465
2447
  const { lineColor, lineColorOpacity, lineSmooth, lineStyle, lineWidth = 2, lineVisible = true } = style;
2466
2448
  const dashSegment = 2 * lineWidth;
@@ -2481,7 +2463,7 @@ const lineStyle_lineStyle = (spec, context)=>{
2481
2463
  [`custom${index + 1}`]: {
2482
2464
  level: index + 1,
2483
2465
  filter: (datum)=>{
2484
- const lineData = lineGroups[datum[group ?? '']];
2466
+ const lineData = lineGroups[datum[colorId ?? '']];
2485
2467
  for (const d of lineData)if (selector_selector(d, style.selector)) return true;
2486
2468
  return false;
2487
2469
  },
@@ -2576,7 +2558,8 @@ const annotationPoint_annotationPoint = (spec, context)=>{
2576
2558
  };
2577
2559
  const annotationVerticalLine_annotationVerticalLine = (spec, context)=>{
2578
2560
  const { advancedVSeed } = context;
2579
- const { annotation, encoding } = advancedVSeed;
2561
+ const { annotation, datasetReshapeInfo } = advancedVSeed;
2562
+ const { unfoldInfo } = datasetReshapeInfo[0];
2580
2563
  if (!annotation || !annotation.annotationVerticalLine) return spec;
2581
2564
  const { annotationVerticalLine } = annotation;
2582
2565
  const annotationVerticalLineList = Array.isArray(annotationVerticalLine) ? annotationVerticalLine : [
@@ -2656,7 +2639,7 @@ const annotationVerticalLine_annotationVerticalLine = (spec, context)=>{
2656
2639
  }
2657
2640
  const selectedData = selectorPoint ? dataset.filter((datum)=>selector_selector(datum, selectorPoint)) : [];
2658
2641
  return selectedData.map((datum)=>{
2659
- const x = encoding[0]?.x?.[0];
2642
+ const x = unfoldInfo.encodingX;
2660
2643
  if (!x) return {};
2661
2644
  return generateOneMarkLine(datum[x]);
2662
2645
  });
@@ -2673,7 +2656,8 @@ const annotationVerticalLine_annotationVerticalLine = (spec, context)=>{
2673
2656
  };
2674
2657
  const annotationHorizontalLine_annotationHorizontalLine = (spec, context)=>{
2675
2658
  const { advancedVSeed } = context;
2676
- const { annotation, encoding } = advancedVSeed;
2659
+ const { annotation, datasetReshapeInfo } = advancedVSeed;
2660
+ const { unfoldInfo } = datasetReshapeInfo[0];
2677
2661
  if (!annotation || !annotation.annotationHorizontalLine) return spec;
2678
2662
  const { annotationHorizontalLine } = annotation;
2679
2663
  const annotationVerticalLineList = Array.isArray(annotationHorizontalLine) ? annotationHorizontalLine : [
@@ -2753,7 +2737,7 @@ const annotationHorizontalLine_annotationHorizontalLine = (spec, context)=>{
2753
2737
  }
2754
2738
  const selectedData = selectorPoint ? dataset.filter((datum)=>selector_selector(datum, selectorPoint)) : [];
2755
2739
  return selectedData.map((datum)=>{
2756
- const y = encoding[0]?.y?.[0];
2740
+ const y = unfoldInfo.encodingY;
2757
2741
  if (!y) return {};
2758
2742
  return generateOneMarkLine(datum[y]);
2759
2743
  });
@@ -3034,13 +3018,10 @@ const pivotIndicators_pivotIndicators = (chartPipeline)=>(spec, context)=>{
3034
3018
  ...spec
3035
3019
  };
3036
3020
  const { advancedVSeed } = context;
3037
- const { measures, datasetReshapeInfo, encoding, dataset } = advancedVSeed;
3021
+ const { measures, datasetReshapeInfo, dataset } = advancedVSeed;
3038
3022
  const colorItems = unique(datasetReshapeInfo.flatMap((d)=>d.unfoldInfo.colorItems));
3039
3023
  const indicators = datasetReshapeInfo.map((reshapeInfo, index)=>{
3040
3024
  const measure = measures?.find((d)=>d.id === reshapeInfo.id);
3041
- const newEncoding = [
3042
- encoding[index]
3043
- ];
3044
3025
  const newDataset = dataset[index];
3045
3026
  const newDatasetReshapeInfo = [
3046
3027
  {
@@ -3056,8 +3037,7 @@ const pivotIndicators_pivotIndicators = (chartPipeline)=>(spec, context)=>{
3056
3037
  advancedVSeed: {
3057
3038
  ...advancedVSeed,
3058
3039
  datasetReshapeInfo: newDatasetReshapeInfo,
3059
- dataset: newDataset,
3060
- encoding: newEncoding
3040
+ dataset: newDataset
3061
3041
  }
3062
3042
  };
3063
3043
  const chartSpec = execPipeline(chartPipeline, newContext, {});
@@ -3243,7 +3223,7 @@ const pivotDiscreteLegend = (spec, context)=>{
3243
3223
  }
3244
3224
  },
3245
3225
  label: {
3246
- formatMethod: (value)=>colorIdMap[String(value)] ?? value,
3226
+ formatMethod: (value)=>colorIdMap[value] ?? value,
3247
3227
  style: {
3248
3228
  fontSize: labelFontSize,
3249
3229
  fill: labelFontColor,
@@ -3326,151 +3306,18 @@ const registerLine = ()=>{
3326
3306
  Builder._advancedPipelineMap.line = lineAdvancedPipeline;
3327
3307
  Builder._specPipelineMap.line = lineSpecPipeline;
3328
3308
  };
3329
- const dataReshapeFor2D1M_emptyReshapeResult = {
3330
- dataset: [],
3331
- foldInfo: {
3332
- foldMap: {},
3333
- measureId: '',
3334
- measureName: '',
3335
- measureValue: ''
3336
- },
3337
- unfoldInfo: {
3338
- groupName: '',
3339
- groupId: '',
3340
- colorItems: [],
3341
- colorIdMap: {}
3342
- }
3343
- };
3344
- const dataReshapeFor2D1M = (dataset, dimensions, measures, options)=>{
3345
- const { foldMeasureId = FoldMeasureId, foldMeasureName = FoldMeasureName, foldMeasureValue = FoldMeasureValue, unfoldDimensionGroup = UnfoldDimensionGroup, unfoldDimensionGroupId = UnfoldDimensionGroupId } = options || {};
3346
- if (0 === dimensions.length && 0 === measures.length) return dataReshapeFor2D1M_emptyReshapeResult;
3347
- const { dataset: foldedDataset, foldInfo } = foldMeasures(dataset, measures, foldMeasureId, foldMeasureName, foldMeasureValue);
3348
- if (0 === dimensions.length) {
3349
- const { dataset: finalDataset, unfoldInfo } = unfoldDimensions(foldedDataset, [
3350
- {
3351
- id: foldMeasureId,
3352
- alias: i18n`指标Id`,
3353
- location: 'dimension'
3354
- },
3355
- {
3356
- id: foldMeasureName,
3357
- alias: i18n`指标名称`,
3358
- location: 'dimension'
3359
- }
3360
- ], [
3361
- {
3362
- id: foldMeasureValue,
3363
- alias: i18n`指标值`
3364
- }
3365
- ], 1, unfoldDimensionGroup, unfoldDimensionGroupId, foldMeasureId);
3366
- return {
3367
- dataset: finalDataset,
3368
- foldInfo,
3369
- unfoldInfo
3370
- };
3371
- }
3372
- {
3373
- const onlyOneMeasure = 1 === measures.length;
3374
- const onlyOneDimension = 1 === dimensions.length;
3375
- const dims = [
3376
- ...dimensions
3377
- ];
3378
- if (!onlyOneMeasure || onlyOneDimension) dims.push({
3379
- id: foldMeasureName,
3380
- alias: i18n`指标名称`,
3381
- location: 'dimension'
3382
- });
3383
- const { dataset: finalDataset, unfoldInfo } = unfoldDimensions(foldedDataset, dims, [
3384
- {
3385
- id: foldMeasureValue,
3386
- alias: i18n`指标值`
3387
- }
3388
- ], 1, unfoldDimensionGroup, unfoldDimensionGroupId, foldMeasureId);
3389
- return {
3390
- dataset: finalDataset,
3391
- foldInfo,
3392
- unfoldInfo
3393
- };
3394
- }
3395
- };
3396
- const reshapeTo2D1M = (advancedVSeed, context)=>{
3397
- const result = {
3398
- ...advancedVSeed
3399
- };
3400
- const { vseed } = context;
3401
- const { dataset } = vseed;
3402
- const { dimensions, measures } = advancedVSeed;
3403
- if (!measures || !dimensions || !dataset) return result;
3404
- if (0 === measures.length) throw new Error('measures can not be empty');
3405
- const { dataset: newDatasets, foldInfo, unfoldInfo } = dataReshapeFor2D1M(dataset, dimensions, measures);
3406
- return {
3407
- ...result,
3408
- dataset: newDatasets,
3409
- datasetReshapeInfo: [
3410
- {
3411
- id: '2D1M',
3412
- index: 0,
3413
- foldInfo,
3414
- unfoldInfo
3415
- }
3416
- ],
3417
- dimensions,
3418
- measures
3419
- };
3420
- };
3421
- const pivotReshapeTo2D1M = (advancedVSeed, context)=>{
3422
- const result = {
3423
- ...advancedVSeed
3424
- };
3425
- const { vseed } = context;
3426
- const { dataset } = vseed;
3427
- const { measures } = advancedVSeed;
3428
- const dimensions = advancedVSeed.dimensions;
3429
- if (!measures || !dimensions) return result;
3430
- const measureGroups = [];
3431
- if (measures) measures.forEach((measure)=>{
3432
- if (measure.children && measure.children.length > 0) measureGroups.push(measure);
3433
- });
3434
- const commonDimensions = dimensions.filter((dim)=>'dimension' === dim.location);
3435
- const newDatasets = [];
3436
- const datasetReshapeInfo = [];
3437
- measureGroups.forEach((measureGroup, index)=>{
3438
- const measures = measureGroup.children;
3439
- if (!measures) return;
3440
- const groupId = measureGroup.id;
3441
- const { dataset: newSubDataset, foldInfo, unfoldInfo } = dataReshapeFor2D1M(dataset, commonDimensions, measures, {
3442
- foldMeasureId: FoldMeasureId,
3443
- foldMeasureName: FoldMeasureName,
3444
- foldMeasureValue: FoldMeasureValue + groupId,
3445
- unfoldDimensionGroup: UnfoldDimensionGroup
3446
- });
3447
- const reshapeInfo = {
3448
- id: groupId,
3449
- index,
3450
- foldInfo,
3451
- unfoldInfo
3452
- };
3453
- newDatasets.push(newSubDataset);
3454
- datasetReshapeInfo.push(reshapeInfo);
3455
- });
3456
- return {
3457
- ...result,
3458
- dataset: newDatasets,
3459
- datasetReshapeInfo: datasetReshapeInfo
3460
- };
3461
- };
3462
3309
  const columnAdvancedPipeline = [
3463
3310
  initAdvancedVSeed_initAdvancedVSeed,
3464
3311
  autoMeasures_autoMeasures,
3465
3312
  autoDimensions_autoDimensions,
3313
+ encodingForColumn,
3466
3314
  pivotAdapter([
3467
- reshapeTo2D1M
3315
+ reshapeWithEncoding
3468
3316
  ], [
3469
- pivotReshapeTo2D1M
3317
+ pivotReshapeWithEncoding
3470
3318
  ]),
3471
- encodingXY,
3472
3319
  sortXBandAxis,
3473
- sort_sortLegend,
3320
+ sortLegend_sortLegend,
3474
3321
  columnConfig,
3475
3322
  theme_theme,
3476
3323
  markStyle_markStyle,
@@ -3481,13 +3328,13 @@ const initColumn = (spec, context)=>{
3481
3328
  ...spec
3482
3329
  };
3483
3330
  const { advancedVSeed } = context;
3484
- const { encoding } = advancedVSeed;
3485
- if (!encoding[0].y || !encoding[0].x || !encoding[0].group) return result;
3331
+ const { datasetReshapeInfo } = advancedVSeed;
3332
+ const { unfoldInfo, foldInfo } = datasetReshapeInfo[0];
3486
3333
  result.type = 'bar';
3487
3334
  result.direction = 'vertical';
3488
- result.xField = encoding[0].x[0];
3489
- result.yField = encoding[0].y[0];
3490
- result.seriesField = encoding[0].group[0];
3335
+ result.xField = unfoldInfo.encodingX;
3336
+ result.yField = foldInfo.measureValue;
3337
+ result.seriesField = unfoldInfo.encodingColorId;
3491
3338
  result.padding = 0;
3492
3339
  result.region = [
3493
3340
  {
@@ -3807,14 +3654,14 @@ const columnParallelAdvancedPipeline = [
3807
3654
  initAdvancedVSeed_initAdvancedVSeed,
3808
3655
  autoMeasures_autoMeasures,
3809
3656
  autoDimensions_autoDimensions,
3657
+ encodingForColumn,
3810
3658
  pivotAdapter([
3811
- reshapeTo2D1M
3659
+ reshapeWithEncoding
3812
3660
  ], [
3813
- pivotReshapeTo2D1M
3661
+ pivotReshapeWithEncoding
3814
3662
  ]),
3815
- encodingXY,
3816
3663
  sortXBandAxis,
3817
- sort_sortLegend,
3664
+ sortLegend_sortLegend,
3818
3665
  columnParallelConfig,
3819
3666
  theme_theme,
3820
3667
  markStyle_markStyle,
@@ -3825,17 +3672,19 @@ const initColumnParallel = (spec, context)=>{
3825
3672
  ...spec
3826
3673
  };
3827
3674
  const { advancedVSeed } = context;
3828
- const { encoding, datasetReshapeInfo } = advancedVSeed;
3829
- const { unfoldInfo } = datasetReshapeInfo[0];
3830
- if (!encoding[0].y || !encoding[0].x || !encoding[0].group) return result;
3675
+ const { datasetReshapeInfo, dimensions } = advancedVSeed;
3676
+ const { unfoldInfo, foldInfo } = datasetReshapeInfo[0];
3677
+ const sameDimensionsMode = dimensions.length > 1 && dimensions.every((dim)=>dim.id === dimensions[0].id);
3831
3678
  result.type = 'bar';
3832
3679
  result.direction = 'vertical';
3833
- result.xField = [
3834
- encoding[0].x[0],
3835
- unfoldInfo.groupId
3680
+ result.xField = sameDimensionsMode ? [
3681
+ unfoldInfo.encodingX
3682
+ ] : [
3683
+ unfoldInfo.encodingX,
3684
+ unfoldInfo.encodingDetail
3836
3685
  ];
3837
- result.yField = encoding[0].y[0];
3838
- result.seriesField = encoding[0].group[0];
3686
+ result.yField = foldInfo.measureValue;
3687
+ result.seriesField = unfoldInfo.encodingColorId;
3839
3688
  result.padding = 0;
3840
3689
  result.region = [
3841
3690
  {
@@ -3902,14 +3751,14 @@ const columnPercentAdvancedPipeline = [
3902
3751
  initAdvancedVSeed_initAdvancedVSeed,
3903
3752
  autoMeasures_autoMeasures,
3904
3753
  autoDimensions_autoDimensions,
3754
+ encodingForColumn,
3905
3755
  pivotAdapter([
3906
- reshapeTo2D1M
3756
+ reshapeWithEncoding
3907
3757
  ], [
3908
- pivotReshapeTo2D1M
3758
+ pivotReshapeWithEncoding
3909
3759
  ]),
3910
- encodingXY,
3911
3760
  sortXBandAxis,
3912
- sort_sortLegend,
3761
+ sortLegend_sortLegend,
3913
3762
  columnPercentConfig,
3914
3763
  theme_theme,
3915
3764
  markStyle_markStyle,
@@ -3979,58 +3828,73 @@ const registerColumnPercent = ()=>{
3979
3828
  Builder._advancedPipelineMap.columnPercent = columnPercentAdvancedPipeline;
3980
3829
  Builder._specPipelineMap.columnPercent = columnPercentSpecPipeline;
3981
3830
  };
3982
- const encodingYX = (advancedVSeed)=>{
3983
- const result = {
3984
- ...advancedVSeed
3985
- };
3986
- const { datasetReshapeInfo, dimensions } = advancedVSeed;
3987
- if (!datasetReshapeInfo || !dimensions) return result;
3988
- const yDimension = dimensions.find((item)=>'rowDimension' !== item.location && 'columnDimension' !== item.location) || dimensions[0];
3989
- const isZeroDimension = 0 === dimensions.length;
3990
- const encoding = datasetReshapeInfo.reduce((prev, cur)=>{
3991
- const { foldInfo, unfoldInfo } = cur;
3992
- const y = [
3993
- isZeroDimension ? foldInfo.measureName : yDimension?.id
3994
- ];
3995
- const x = [
3996
- foldInfo.measureValue
3997
- ];
3998
- const group = [
3999
- unfoldInfo.groupId
4000
- ];
4001
- const color = [
4002
- foldInfo.measureName
3831
+ const encodingForBar = (advancedVSeed, context)=>{
3832
+ const { vseed } = context;
3833
+ const { dimensions } = advancedVSeed;
3834
+ if (!dimensions) return advancedVSeed;
3835
+ const encoding = vseed.encoding;
3836
+ if (encoding) {
3837
+ const y = encoding.y || [];
3838
+ const detail = encoding.detail || [];
3839
+ const color = encoding.color || [];
3840
+ const mergedDetail = [
3841
+ ...color.filter((d)=>!y.includes(d)),
3842
+ ...detail
4003
3843
  ];
4004
- return [
4005
- ...prev,
4006
- {
4007
- x,
4008
- y,
4009
- group,
4010
- color
3844
+ return {
3845
+ ...advancedVSeed,
3846
+ encoding: {
3847
+ ...encoding,
3848
+ detail: mergedDetail
4011
3849
  }
4012
- ];
4013
- }, []);
3850
+ };
3851
+ }
3852
+ const onlyMeasureName = 1 === dimensions.length && dimensions.find((item)=>item.id === MeasureName);
3853
+ const mergedEncoding = {
3854
+ y: dimensions.slice(0, 1).map((item)=>item.id),
3855
+ color: dimensions.slice(1).map((item)=>item.id),
3856
+ detail: dimensions.slice(onlyMeasureName ? 0 : 1).map((item)=>item.id),
3857
+ tooltip: dimensions.map((item)=>item.id),
3858
+ label: [],
3859
+ row: [],
3860
+ column: []
3861
+ };
4014
3862
  return {
4015
- ...result,
4016
- encoding
3863
+ ...advancedVSeed,
3864
+ encoding: mergedEncoding
4017
3865
  };
4018
3866
  };
4019
- const barAdvancedPipeline = [
4020
- initAdvancedVSeed_initAdvancedVSeed,
4021
- autoMeasures_autoMeasures,
4022
- autoDimensions_autoDimensions,
4023
- pivotAdapter([
4024
- reshapeTo2D1M
4025
- ], [
4026
- pivotReshapeTo2D1M
4027
- ]),
4028
- encodingYX,
4029
- sortYBandAxis,
4030
- sort_sortLegend,
4031
- barConfig,
4032
- theme_theme,
4033
- markStyle_markStyle,
3867
+ const sortYBandAxis = (advancedVSeed, context)=>{
3868
+ const result = {
3869
+ ...advancedVSeed
3870
+ };
3871
+ const { vseed } = context;
3872
+ const { sort: sortAxis } = vseed;
3873
+ const { datasetReshapeInfo, dataset } = advancedVSeed;
3874
+ const { unfoldInfo } = datasetReshapeInfo[0];
3875
+ const yField = unfoldInfo?.encodingY;
3876
+ if (!sortAxis || !yField) return advancedVSeed;
3877
+ if (!result.analysis) result.analysis = {};
3878
+ if (!result.analysis.orderMapping) result.analysis.orderMapping = {};
3879
+ const axisOrderResult = calcOrder(sortAxis, yField, dataset.flat(2));
3880
+ result.analysis.orderMapping[yField] = axisOrderResult;
3881
+ return result;
3882
+ };
3883
+ const barAdvancedPipeline = [
3884
+ initAdvancedVSeed_initAdvancedVSeed,
3885
+ autoMeasures_autoMeasures,
3886
+ autoDimensions_autoDimensions,
3887
+ encodingForBar,
3888
+ pivotAdapter([
3889
+ reshapeWithEncoding
3890
+ ], [
3891
+ pivotReshapeWithEncoding
3892
+ ]),
3893
+ sortYBandAxis,
3894
+ sortLegend_sortLegend,
3895
+ barConfig,
3896
+ theme_theme,
3897
+ markStyle_markStyle,
4034
3898
  annotation_annotation
4035
3899
  ];
4036
3900
  const initBar = (spec, context)=>{
@@ -4038,13 +3902,13 @@ const initBar = (spec, context)=>{
4038
3902
  ...spec
4039
3903
  };
4040
3904
  const { advancedVSeed } = context;
4041
- const { encoding } = advancedVSeed;
4042
- if (!encoding[0].y || !encoding[0].x || !encoding[0].group) return result;
3905
+ const { datasetReshapeInfo } = advancedVSeed;
3906
+ const { unfoldInfo, foldInfo } = datasetReshapeInfo[0];
4043
3907
  result.type = 'bar';
4044
3908
  result.direction = 'horizontal';
4045
- result.yField = encoding[0].y?.[0];
4046
- result.xField = encoding[0].x?.[0];
4047
- result.seriesField = encoding[0].group?.[0];
3909
+ result.yField = unfoldInfo.encodingY;
3910
+ result.xField = foldInfo.measureValue;
3911
+ result.seriesField = unfoldInfo.encodingColorId;
4048
3912
  result.padding = 0;
4049
3913
  result.region = [
4050
3914
  {
@@ -4056,11 +3920,12 @@ const initBar = (spec, context)=>{
4056
3920
  };
4057
3921
  const datasetYX = (spec, context)=>{
4058
3922
  const { advancedVSeed, vseed } = context;
4059
- const { encoding, analysis, datasetReshapeInfo } = advancedVSeed;
3923
+ const { analysis, datasetReshapeInfo } = advancedVSeed;
3924
+ const { unfoldInfo } = datasetReshapeInfo[0];
4060
3925
  const orderMapping = analysis?.orderMapping || {};
4061
- const angle = encoding[0]?.angle?.[0];
4062
- const y = encoding[0]?.y?.[0];
4063
- const group = encoding[0]?.group?.[0];
3926
+ const angle = unfoldInfo.encodingAngle;
3927
+ const y = unfoldInfo.encodingY;
3928
+ const colorId = unfoldInfo.encodingColorId;
4064
3929
  const id = datasetReshapeInfo[0].id;
4065
3930
  const fields = {};
4066
3931
  if (angle) fields[angle] = {
@@ -4077,14 +3942,14 @@ const datasetYX = (spec, context)=>{
4077
3942
  sortIndex: 0
4078
3943
  };
4079
3944
  }
4080
- if (group) {
4081
- const order = orderMapping[group];
4082
- if (order) fields[group] = {
3945
+ if (colorId) {
3946
+ const order = orderMapping[colorId];
3947
+ if (order) fields[colorId] = {
4083
3948
  sortIndex: 0,
4084
3949
  domain: order,
4085
3950
  lockStatisticsByDomain: true
4086
3951
  };
4087
- else fields[group] = {
3952
+ else fields[colorId] = {
4088
3953
  sortIndex: 0
4089
3954
  };
4090
3955
  }
@@ -4372,14 +4237,14 @@ const barParallelAdvancedPipeline = [
4372
4237
  initAdvancedVSeed_initAdvancedVSeed,
4373
4238
  autoMeasures_autoMeasures,
4374
4239
  autoDimensions_autoDimensions,
4240
+ encodingForBar,
4375
4241
  pivotAdapter([
4376
- reshapeTo2D1M
4242
+ reshapeWithEncoding
4377
4243
  ], [
4378
- pivotReshapeTo2D1M
4244
+ pivotReshapeWithEncoding
4379
4245
  ]),
4380
- encodingYX,
4381
4246
  sortYBandAxis,
4382
- sort_sortLegend,
4247
+ sortLegend_sortLegend,
4383
4248
  barParallelConfig,
4384
4249
  theme_theme,
4385
4250
  markStyle_markStyle,
@@ -4390,17 +4255,19 @@ const initBarParallel = (spec, context)=>{
4390
4255
  ...spec
4391
4256
  };
4392
4257
  const { advancedVSeed } = context;
4393
- const { encoding, datasetReshapeInfo } = advancedVSeed;
4394
- const { unfoldInfo } = datasetReshapeInfo[0];
4395
- if (!encoding[0].y || !encoding[0].x || !encoding[0].group) return result;
4258
+ const { datasetReshapeInfo, dimensions } = advancedVSeed;
4259
+ const { unfoldInfo, foldInfo } = datasetReshapeInfo[0];
4260
+ const sameDimensionsMode = dimensions.length > 1 && dimensions.every((dim)=>dim.id === dimensions[0].id);
4396
4261
  result.type = 'bar';
4397
4262
  result.direction = 'horizontal';
4398
- result.yField = [
4399
- encoding[0].y[0],
4400
- unfoldInfo.groupId
4263
+ result.yField = sameDimensionsMode ? [
4264
+ unfoldInfo.encodingY
4265
+ ] : [
4266
+ unfoldInfo.encodingY,
4267
+ unfoldInfo.encodingDetail
4401
4268
  ];
4402
- result.xField = encoding[0].x[0];
4403
- result.seriesField = encoding[0].group[0];
4269
+ result.xField = foldInfo.measureValue;
4270
+ result.seriesField = unfoldInfo.encodingColorId;
4404
4271
  result.padding = 0;
4405
4272
  result.region = [
4406
4273
  {
@@ -4466,14 +4333,14 @@ const barPercentAdvancedPipeline = [
4466
4333
  initAdvancedVSeed_initAdvancedVSeed,
4467
4334
  autoMeasures_autoMeasures,
4468
4335
  autoDimensions_autoDimensions,
4336
+ encodingForBar,
4469
4337
  pivotAdapter([
4470
- reshapeTo2D1M
4338
+ reshapeWithEncoding
4471
4339
  ], [
4472
- pivotReshapeTo2D1M
4340
+ pivotReshapeWithEncoding
4473
4341
  ]),
4474
- encodingYX,
4475
4342
  sortYBandAxis,
4476
- sort_sortLegend,
4343
+ sortLegend_sortLegend,
4477
4344
  barPercentConfig,
4478
4345
  theme_theme,
4479
4346
  markStyle_markStyle,
@@ -4537,14 +4404,14 @@ const areaAdvancedPipeline = [
4537
4404
  initAdvancedVSeed_initAdvancedVSeed,
4538
4405
  autoMeasures_autoMeasures,
4539
4406
  autoDimensions_autoDimensions,
4407
+ encodingForColumn,
4540
4408
  pivotAdapter([
4541
- reshapeTo2D1M0Name
4409
+ reshapeWithEncoding
4542
4410
  ], [
4543
- pivotReshapeTo2D1M0Name
4411
+ pivotReshapeWithEncoding
4544
4412
  ]),
4545
- encodingXY,
4546
4413
  sortXBandAxis,
4547
- sort_sortLegend,
4414
+ sortLegend_sortLegend,
4548
4415
  areaConfig,
4549
4416
  theme_theme,
4550
4417
  markStyle_markStyle,
@@ -4555,13 +4422,13 @@ const initArea = (spec, context)=>{
4555
4422
  ...spec
4556
4423
  };
4557
4424
  const { advancedVSeed } = context;
4558
- const { encoding } = advancedVSeed;
4559
- if (!encoding[0].y || !encoding[0].x || !encoding[0].group) return result;
4425
+ const { datasetReshapeInfo } = advancedVSeed;
4426
+ const { unfoldInfo, foldInfo } = datasetReshapeInfo[0];
4560
4427
  result.type = 'area';
4561
4428
  result.direction = 'vertical';
4562
- result.xField = encoding[0].x[0];
4563
- result.yField = encoding[0].y[0];
4564
- result.seriesField = encoding[0].group[0];
4429
+ result.yField = foldInfo.measureValue;
4430
+ result.xField = unfoldInfo.encodingX;
4431
+ result.seriesField = unfoldInfo.encodingColorId;
4565
4432
  result.padding = 0;
4566
4433
  result.region = [
4567
4434
  {
@@ -4573,8 +4440,9 @@ const initArea = (spec, context)=>{
4573
4440
  };
4574
4441
  const areaStyle_areaStyle = (spec, context)=>{
4575
4442
  const { advancedVSeed } = context;
4576
- const { markStyle, encoding, dataset } = advancedVSeed;
4443
+ const { markStyle, datasetReshapeInfo, dataset } = advancedVSeed;
4577
4444
  const { areaStyle } = markStyle;
4445
+ const { unfoldInfo } = datasetReshapeInfo[0];
4578
4446
  if (!areaStyle) return {
4579
4447
  ...spec,
4580
4448
  area: {
@@ -4587,7 +4455,7 @@ const areaStyle_areaStyle = (spec, context)=>{
4587
4455
  const areaStyles = Array.isArray(areaStyle) ? areaStyle : [
4588
4456
  areaStyle
4589
4457
  ];
4590
- const group = encoding[0]?.group?.[0];
4458
+ const group = unfoldInfo.encodingColorId;
4591
4459
  const areaGroups = groupBy(dataset, (d)=>d[group ?? '']);
4592
4460
  const customMap = areaStyles.reduce((result, style, index)=>{
4593
4461
  const { areaColor, areaColorOpacity, areaVisible = true } = style;
@@ -4681,14 +4549,14 @@ const areaPercentAdvancedPipeline = [
4681
4549
  initAdvancedVSeed_initAdvancedVSeed,
4682
4550
  autoMeasures_autoMeasures,
4683
4551
  autoDimensions_autoDimensions,
4552
+ encodingForColumn,
4684
4553
  pivotAdapter([
4685
- reshapeTo2D1M0Name
4554
+ reshapeWithEncoding
4686
4555
  ], [
4687
- pivotReshapeTo2D1M0Name
4556
+ pivotReshapeWithEncoding
4688
4557
  ]),
4689
- encodingXY,
4690
4558
  sortXBandAxis,
4691
- sort_sortLegend,
4559
+ sortLegend_sortLegend,
4692
4560
  areaPercentConfig,
4693
4561
  theme_theme,
4694
4562
  markStyle_markStyle,
@@ -4753,16 +4621,20 @@ const registerAreaPercent = ()=>{
4753
4621
  Builder._advancedPipelineMap.areaPercent = areaPercentAdvancedPipeline;
4754
4622
  Builder._specPipelineMap.areaPercent = areaPercentSpecPipeline;
4755
4623
  };
4756
- const autoMeasuresBy2M1Group = (advancedVSeed, context)=>{
4624
+ const autoScatterMeasures = (advancedVSeed, context)=>{
4757
4625
  const result = {
4758
4626
  ...advancedVSeed
4759
4627
  };
4760
4628
  const { vseed } = context;
4761
- const { measures, dataset } = vseed;
4629
+ const { dataset, scatterMeasures, measures } = vseed;
4762
4630
  if (!dataset) throw new Error('dataset is required');
4763
4631
  if (0 === dataset.length) return result;
4764
- if (measures) {
4765
- result.measures = auto2M1Group(measures);
4632
+ if (scatterMeasures) {
4633
+ result.measures = scatterMeasuresToMeasureTree(scatterMeasures);
4634
+ return result;
4635
+ }
4636
+ if (measures && measureDepth(measures) > 1) {
4637
+ result.measures = measures;
4766
4638
  return result;
4767
4639
  }
4768
4640
  const top100dataset = dataset.slice(0, 100);
@@ -4770,7 +4642,7 @@ const autoMeasuresBy2M1Group = (advancedVSeed, context)=>{
4770
4642
  ...prev,
4771
4643
  ...cur
4772
4644
  }), {});
4773
- const newMeasures = Object.keys(sample).filter((key)=>top100dataset.some((item)=>'number' == typeof item[key]) && ![
4645
+ const newMeasures = measures || Object.keys(sample).filter((key)=>top100dataset.some((item)=>'number' == typeof item[key]) && ![
4774
4646
  '',
4775
4647
  null,
4776
4648
  void 0
@@ -4778,689 +4650,273 @@ const autoMeasuresBy2M1Group = (advancedVSeed, context)=>{
4778
4650
  id: measure,
4779
4651
  alias: measure
4780
4652
  }));
4781
- result.measures = auto2M1Group(newMeasures);
4653
+ if (0 === newMeasures.length) result.measures = [];
4654
+ else if (1 === newMeasures.length) result.measures = [
4655
+ {
4656
+ id: 'primary',
4657
+ alias: 'primary',
4658
+ children: newMeasures
4659
+ }
4660
+ ];
4661
+ else if (newMeasures.length > 1) result.measures = [
4662
+ {
4663
+ id: 'primary',
4664
+ alias: 'primary',
4665
+ children: newMeasures.slice(0, 1)
4666
+ },
4667
+ {
4668
+ id: 'secondary',
4669
+ alias: 'secondary',
4670
+ children: newMeasures.slice(1)
4671
+ }
4672
+ ];
4782
4673
  return result;
4783
4674
  };
4784
- const auto2M1Group = (measures)=>{
4785
- const allMeasures = findAllMeasures(measures);
4786
- if (allMeasures.length <= 2) return allMeasures;
4787
- const groups = measures.filter((measure)=>'children' in measure);
4788
- const singleMeasures = measures.filter((measure)=>!('children' in measure));
4789
- for(let i = 0; i < singleMeasures.length; i += 2){
4790
- const group = autoMeasuresBy2M1Group_createEmptyMeasureGroup();
4791
- group.children = allMeasures.slice(i, i + 2);
4792
- groups.push(group);
4793
- }
4794
- return groups;
4795
- };
4796
- const autoMeasuresBy2M1Group_createEmptyMeasureGroup = ()=>({
4797
- id: '',
4798
- alias: '',
4799
- children: []
4675
+ const scatterMeasuresToMeasureTree = (scatterMeasures)=>{
4676
+ const measureTree = scatterMeasures.map((item, index)=>{
4677
+ const { xMeasures, yMeasures } = item;
4678
+ const groupChildren = [];
4679
+ let id = '';
4680
+ if (xMeasures) {
4681
+ const arrXMeasures = Array.isArray(xMeasures) ? xMeasures : [
4682
+ xMeasures
4683
+ ];
4684
+ const alias = arrXMeasures.map((item)=>item.alias || item.id).toString();
4685
+ id += alias;
4686
+ groupChildren.push({
4687
+ id: `${index}-x`,
4688
+ alias: arrXMeasures.map((item)=>item.alias || item.id).toString(),
4689
+ children: arrXMeasures
4690
+ });
4691
+ }
4692
+ if (yMeasures) {
4693
+ const arrYMeasures = Array.isArray(yMeasures) ? yMeasures : [
4694
+ yMeasures
4695
+ ];
4696
+ const alias = arrYMeasures.map((item)=>item.alias || item.id).toString();
4697
+ id += alias;
4698
+ groupChildren.push({
4699
+ id: `${index}-y`,
4700
+ alias: arrYMeasures.map((item)=>item.alias || item.id).toString(),
4701
+ children: arrYMeasures
4702
+ });
4703
+ }
4704
+ return {
4705
+ id,
4706
+ alias: id,
4707
+ children: groupChildren
4708
+ };
4800
4709
  });
4801
- const dataReshapeFor1D_emptyReshapeResult = {
4802
- dataset: [],
4803
- foldInfo: {
4804
- foldMap: {},
4805
- measureId: '',
4806
- measureName: '',
4807
- measureValue: ''
4808
- },
4809
- unfoldInfo: {
4810
- groupName: '',
4811
- groupId: '',
4812
- colorItems: [],
4813
- colorIdMap: {}
4814
- }
4710
+ if (1 === scatterMeasures.length) return measureTree[0].children || [];
4711
+ return measureTree;
4815
4712
  };
4816
- const dataReshapeFor1D = (dataset, dimensions, measures, options)=>{
4817
- const { foldMeasureId = FoldMeasureId, foldMeasureName = FoldMeasureName, foldMeasureValue = FoldMeasureValue, unfoldDimensionGroup = UnfoldDimensionGroup, unfoldDimensionGroupId = UnfoldDimensionGroupId } = options || {};
4818
- if (0 === dimensions.length && 0 === measures.length) return dataReshapeFor1D_emptyReshapeResult;
4819
- if (0 === dimensions.length) {
4820
- const { dataset: finalDataset, unfoldInfo } = unfoldDimensions(dataset, [], [], 0, unfoldDimensionGroup, unfoldDimensionGroupId, foldMeasureId);
4713
+ const encodingForScatter = (advancedVSeed, context)=>{
4714
+ const { vseed } = context;
4715
+ const { dimensions } = advancedVSeed;
4716
+ if (!dimensions) return advancedVSeed;
4717
+ const encoding = vseed.encoding;
4718
+ if (encoding) {
4719
+ const detail = encoding.detail || [];
4720
+ const color = encoding.color || [];
4721
+ const mergedDetail = unique([
4722
+ ...color,
4723
+ ...detail
4724
+ ]);
4821
4725
  return {
4822
- dataset: finalDataset,
4823
- foldInfo: {
4824
- foldMap: {},
4825
- measureId: foldMeasureId,
4826
- measureName: foldMeasureName,
4827
- measureValue: foldMeasureValue
4828
- },
4829
- unfoldInfo
4830
- };
4831
- }
4832
- {
4833
- const { dataset: finalDataset, unfoldInfo } = unfoldDimensions(dataset, [
4834
- ...dimensions
4835
- ], [
4836
- {
4837
- id: foldMeasureValue,
4838
- alias: i18n`指标值`
4726
+ ...advancedVSeed,
4727
+ encoding: {
4728
+ ...encoding,
4729
+ detail: mergedDetail
4839
4730
  }
4840
- ], 0, unfoldDimensionGroup, unfoldDimensionGroupId, foldMeasureId);
4841
- return {
4842
- dataset: finalDataset,
4843
- foldInfo: {
4844
- foldMap: {},
4845
- measureId: foldMeasureId,
4846
- measureName: foldMeasureName,
4847
- measureValue: foldMeasureValue
4848
- },
4849
- unfoldInfo
4850
4731
  };
4851
4732
  }
4733
+ const dimensionsWithoutMeasureName = dimensions.filter((item)=>item.id !== MeasureName);
4734
+ const mergedEncoding = {
4735
+ color: dimensions.slice(0).map((item)=>item.id),
4736
+ detail: dimensionsWithoutMeasureName.slice(0).map((item)=>item.id),
4737
+ tooltip: dimensionsWithoutMeasureName.map((item)=>item.id),
4738
+ label: [],
4739
+ row: [],
4740
+ column: []
4741
+ };
4742
+ return {
4743
+ ...advancedVSeed,
4744
+ encoding: mergedEncoding
4745
+ };
4852
4746
  };
4853
- const reshapeTo1D = (advancedVSeed, context)=>{
4747
+ const reshapeWithScatterEncoding = (advancedVSeed, context)=>{
4854
4748
  const result = {
4855
4749
  ...advancedVSeed
4856
4750
  };
4857
4751
  const { vseed } = context;
4858
4752
  const { dataset } = vseed;
4859
- const { dimensions, measures } = advancedVSeed;
4860
- if (!measures || !dimensions || !dataset) return result;
4753
+ const { dimensions, measures, encoding, chartType } = advancedVSeed;
4754
+ if (!measures || !dimensions || !dataset || !encoding) return result;
4861
4755
  if (0 === measures.length) throw new Error('measures can not be empty');
4862
- const { dataset: newDatasets, foldInfo, unfoldInfo } = dataReshapeFor1D(dataset, dimensions, measures);
4756
+ if (measures.length > 2) throw new Error('measures can not be more than 2');
4757
+ const foldInfoList = [];
4758
+ const unfoldInfoList = [];
4759
+ const datasets = [];
4760
+ const xMeasures = measures[0];
4761
+ const yMeasures = measures[1] || xMeasures;
4762
+ if (xMeasures && xMeasures.children) {
4763
+ const { dataset: newDataset, foldInfo, unfoldInfo } = dataReshapeByEncoding(dataset, dimensions, xMeasures.children, encoding, {
4764
+ foldMeasureValue: FoldXMeasureValue,
4765
+ colorItemAsId: true
4766
+ });
4767
+ datasets.push(newDataset);
4768
+ foldInfoList.push(foldInfo);
4769
+ unfoldInfoList.push(unfoldInfo);
4770
+ }
4771
+ if (yMeasures && yMeasures.children) {
4772
+ const { dataset: newDataset, foldInfo, unfoldInfo } = dataReshapeByEncoding(datasets[0], dimensions, yMeasures.children, encoding, {
4773
+ foldMeasureValue: FoldYMeasureValue,
4774
+ colorItemAsId: true
4775
+ });
4776
+ datasets[0] = newDataset;
4777
+ foldInfoList.push(foldInfo);
4778
+ unfoldInfoList.push(unfoldInfo);
4779
+ }
4780
+ const unfoldInfo = {
4781
+ ...unfoldInfoList[0],
4782
+ colorItems: unfoldInfoList.flatMap((d)=>d.colorItems),
4783
+ colorIdMap: unfoldInfoList.reduce((prev, cur)=>({
4784
+ ...prev,
4785
+ ...cur.colorIdMap
4786
+ }), {})
4787
+ };
4863
4788
  return {
4864
4789
  ...result,
4865
- dataset: newDatasets,
4790
+ dataset: datasets[0],
4866
4791
  datasetReshapeInfo: [
4867
4792
  {
4868
- id: '1D2M',
4793
+ id: String(chartType),
4869
4794
  index: 0,
4870
- foldInfo,
4871
- unfoldInfo
4795
+ foldInfo: foldInfoList[0],
4796
+ foldInfoList: foldInfoList,
4797
+ unfoldInfo: unfoldInfo
4872
4798
  }
4873
4799
  ]
4874
4800
  };
4875
4801
  };
4876
- const pivotReshapeTo1D = (advancedVSeed, context)=>{
4802
+ const pivotReshapeWithScatterEncoding = (advancedVSeed, context)=>{
4877
4803
  const result = {
4878
4804
  ...advancedVSeed
4879
4805
  };
4880
4806
  const { vseed } = context;
4881
4807
  const { dataset } = vseed;
4882
- const { measures } = advancedVSeed;
4883
- const dimensions = advancedVSeed.dimensions;
4884
- if (!measures || !dimensions) return result;
4808
+ const { dimensions, measures, encoding, chartType } = advancedVSeed;
4809
+ if (!measures || !dimensions || !dataset || !encoding) return result;
4885
4810
  const measureGroups = [];
4886
- if (measures) measures.forEach((measure)=>{
4887
- if (measure.children && measure.children.length > 0) measureGroups.push(measure);
4811
+ const depth = measureDepth(measures);
4812
+ if (3 === depth) measures.forEach((measure)=>{
4813
+ measureGroups.push(measure.children);
4888
4814
  });
4889
- const newDatasets = [];
4815
+ else if (2 === depth) measureGroups.push(measures);
4816
+ const datasetList = [];
4890
4817
  const datasetReshapeInfo = [];
4891
- measureGroups.forEach((measureGroup, index)=>{
4892
- const measures = measureGroup.children;
4893
- if (!measures) return;
4894
- const commonDimensions = dimensions.filter((dim)=>'dimension' === dim.location);
4895
- const groupId = measureGroup.id;
4896
- const { dataset: newSubDataset, foldInfo, unfoldInfo } = dataReshapeFor1D(dataset, commonDimensions, measures, {
4897
- foldMeasureId: FoldMeasureId,
4898
- foldMeasureName: FoldMeasureName,
4899
- foldMeasureValue: FoldMeasureValue + groupId,
4900
- unfoldDimensionGroup: UnfoldDimensionGroup
4901
- });
4818
+ measureGroups.forEach((measures, index)=>{
4819
+ if (0 === measures.length) throw new Error('measures can not be empty');
4820
+ if (measures.length > 2) throw new Error('measures can not be more than 2');
4821
+ const foldInfoList = [];
4822
+ const unfoldInfoList = [];
4823
+ const datasets = [];
4824
+ const xMeasures = measures[0];
4825
+ const yMeasures = measures[1] || xMeasures;
4826
+ if (xMeasures && xMeasures.children) {
4827
+ const { dataset: newDataset, foldInfo, unfoldInfo } = dataReshapeByEncoding(dataset, dimensions, xMeasures.children, encoding, {
4828
+ foldMeasureValue: `${FoldXMeasureValue}${index}`,
4829
+ colorItemAsId: true
4830
+ });
4831
+ datasets.push(newDataset);
4832
+ foldInfoList.push(foldInfo);
4833
+ unfoldInfoList.push(unfoldInfo);
4834
+ }
4835
+ if (yMeasures && yMeasures.children) {
4836
+ const { dataset: newDataset, foldInfo, unfoldInfo } = dataReshapeByEncoding(dataset, dimensions, yMeasures.children, encoding, {
4837
+ foldMeasureValue: `${FoldYMeasureValue}${index}`,
4838
+ colorItemAsId: true
4839
+ });
4840
+ datasets.push(newDataset);
4841
+ foldInfoList.push(foldInfo);
4842
+ unfoldInfoList.push(unfoldInfo);
4843
+ }
4844
+ const unfoldInfo = {
4845
+ ...unfoldInfoList[0],
4846
+ colorItems: unfoldInfoList.flatMap((d)=>d.colorItems),
4847
+ colorIdMap: unfoldInfoList.reduce((prev, cur)=>({
4848
+ ...prev,
4849
+ ...cur.colorIdMap
4850
+ }), {})
4851
+ };
4902
4852
  const reshapeInfo = {
4903
- id: groupId,
4853
+ id: `${chartType}-${index}`,
4904
4854
  index,
4905
- foldInfo,
4906
- unfoldInfo
4855
+ foldInfo: foldInfoList[0],
4856
+ foldInfoList: foldInfoList,
4857
+ unfoldInfo: unfoldInfo
4907
4858
  };
4908
- newDatasets.push(newSubDataset);
4909
4859
  datasetReshapeInfo.push(reshapeInfo);
4860
+ datasetList.push(datasets[0].map((d, index)=>({
4861
+ ...d,
4862
+ ...datasets[1]?.[index] || {}
4863
+ })));
4910
4864
  });
4911
4865
  return {
4912
4866
  ...result,
4913
- dataset: newDatasets,
4867
+ dataset: datasetList,
4914
4868
  datasetReshapeInfo: datasetReshapeInfo
4915
4869
  };
4916
4870
  };
4917
- const encodingAreaRange = (advancedVSeed)=>{
4918
- const result = {
4919
- ...advancedVSeed
4920
- };
4921
- const { datasetReshapeInfo, measures } = advancedVSeed;
4922
- if (!datasetReshapeInfo || !measures) return result;
4923
- const encoding = datasetReshapeInfo.reduce((prev, cur, index)=>{
4924
- const measure = measures[index];
4925
- if ('children' in measure) {
4926
- const m1 = measure.children?.[0];
4927
- const m2 = measure.children?.[1] || m1;
4928
- const { foldInfo, unfoldInfo } = cur;
4929
- const x = [
4930
- unfoldInfo.groupId
4931
- ];
4932
- const y = [
4933
- m1?.id,
4934
- m2?.id
4935
- ];
4936
- const group = [
4937
- unfoldInfo.groupId
4938
- ];
4939
- const color = [
4940
- foldInfo.measureName
4941
- ];
4942
- return [
4943
- ...prev,
4944
- {
4945
- x,
4946
- y,
4947
- group,
4948
- color
4949
- }
4950
- ];
4951
- }
4952
- {
4953
- const m1 = measures[index];
4954
- const m2 = measures[index + 1] || m1;
4955
- const { foldInfo, unfoldInfo } = cur;
4956
- const x = [
4957
- unfoldInfo.groupId
4958
- ];
4959
- const y = [
4960
- m1.id,
4961
- m2.id
4962
- ];
4963
- const group = [
4964
- unfoldInfo.groupId
4965
- ];
4966
- const color = [
4967
- foldInfo.measureName
4968
- ];
4969
- return [
4970
- ...prev,
4971
- {
4972
- x,
4973
- y,
4974
- group,
4975
- color
4976
- }
4977
- ];
4978
- }
4979
- }, []);
4980
- return {
4981
- ...result,
4982
- encoding
4983
- };
4984
- };
4985
- const areaRangeAdvancedPipeline = [
4871
+ const scatterAdvancedPipeline = [
4986
4872
  initAdvancedVSeed_initAdvancedVSeed,
4987
- autoMeasuresBy2M1Group,
4873
+ autoScatterMeasures,
4988
4874
  autoDimensions_autoDimensions,
4875
+ encodingForScatter,
4989
4876
  pivotAdapter([
4990
- reshapeTo1D
4877
+ reshapeWithScatterEncoding
4991
4878
  ], [
4992
- pivotReshapeTo1D
4879
+ pivotReshapeWithScatterEncoding
4993
4880
  ]),
4994
- encodingAreaRange,
4995
- sortXBandAxis,
4996
- areaConfig,
4881
+ scatterConfig,
4997
4882
  theme_theme,
4998
4883
  markStyle_markStyle,
4999
4884
  annotation_annotation
5000
4885
  ];
5001
- const series = (...args)=>{
5002
- const result = {
5003
- type: 'common',
5004
- padding: 0,
5005
- region: [
5006
- {
5007
- clip: true
5008
- }
5009
- ]
5010
- };
5011
- return (_, context)=>{
5012
- result.series = args.map((pipeline)=>execPipeline(pipeline, context, {}));
5013
- return result;
5014
- };
5015
- };
5016
- const seriesDualAxis = (...args)=>{
5017
- const result = {
5018
- type: 'common',
5019
- padding: 0,
5020
- region: [
5021
- {
5022
- clip: true
5023
- }
5024
- ]
5025
- };
5026
- const createDualContext = (context, index)=>{
5027
- const { advancedVSeed } = context;
5028
- const dataset = advancedVSeed.dataset[index];
5029
- return {
5030
- ...context,
5031
- advancedVSeed: {
5032
- ...advancedVSeed,
5033
- dataset: dataset
5034
- }
5035
- };
5036
- };
5037
- return (_, context)=>{
5038
- result.series = args.map((pipeline, index)=>{
5039
- const seriesContext = createDualContext(context, index);
5040
- return execPipeline(pipeline, seriesContext, {});
5041
- });
5042
- return result;
5043
- };
5044
- };
5045
- const initAreaRange = (spec, context)=>{
4886
+ const initScatter = (spec, context)=>{
5046
4887
  const result = {
5047
4888
  ...spec
5048
4889
  };
5049
4890
  const { advancedVSeed } = context;
5050
- const { encoding } = advancedVSeed;
5051
- if (!encoding[0].y || !encoding[0].x || !encoding[0].group) return result;
5052
- const { color } = advancedVSeed.config.areaRange;
5053
- result.type = 'rangeArea';
4891
+ const { datasetReshapeInfo } = advancedVSeed;
4892
+ const { unfoldInfo, foldInfoList } = datasetReshapeInfo[0];
4893
+ result.type = 'scatter';
5054
4894
  result.direction = 'vertical';
5055
- result.stack = false;
5056
- result.xField = encoding[0].x[0];
5057
- result.yField = [
5058
- encoding[0].y[0],
5059
- encoding[0].y[1]
4895
+ result.xField = foldInfoList?.[0].measureValue;
4896
+ if (foldInfoList?.[1]) result.yField = foldInfoList[1].measureValue;
4897
+ result.seriesField = unfoldInfo.encodingColorId;
4898
+ result.padding = 0;
4899
+ result.region = [
4900
+ {
4901
+ clip: true
4902
+ }
5060
4903
  ];
5061
4904
  result.animation = true;
5062
- result.area = {
5063
- style: {
5064
- fill: color.colorScheme?.[0]
5065
- }
5066
- };
5067
4905
  return result;
5068
4906
  };
5069
- const initAreaRangeLine1 = (spec, context)=>{
5070
- const result = {
5071
- ...spec
5072
- };
5073
- const { advancedVSeed } = context;
5074
- const { encoding } = advancedVSeed;
5075
- if (!encoding[0].y || !encoding[0].x || !encoding[0].group) return result;
5076
- const { color } = advancedVSeed.config.areaRange;
5077
- result.type = 'line';
5078
- result.direction = 'vertical';
5079
- result.stack = false;
5080
- result.xField = encoding[0].x[0];
5081
- result.yField = [
5082
- encoding[0].y[0]
5083
- ];
5084
- result.animation = true;
5085
- result.line = {
5086
- style: {
5087
- stroke: color.colorScheme?.[0]
5088
- }
5089
- };
5090
- result.point = {
5091
- style: {
5092
- visible: false,
5093
- fill: color.colorScheme?.[0]
5094
- }
5095
- };
5096
- return result;
5097
- };
5098
- const initAreaRangeLine2 = (spec, context)=>{
5099
- const result = {
5100
- ...spec
5101
- };
5102
- const { advancedVSeed } = context;
5103
- const { encoding } = advancedVSeed;
5104
- if (!encoding[0].y || !encoding[0].x || !encoding[0].group) return result;
5105
- const { color } = advancedVSeed.config.areaRange;
5106
- result.type = 'line';
5107
- result.direction = 'vertical';
5108
- result.stack = false;
5109
- result.xField = encoding[0].x[0];
5110
- result.yField = [
5111
- encoding[0].y[1]
5112
- ];
5113
- result.animation = true;
5114
- result.line = {
5115
- style: {
5116
- stroke: color.colorScheme?.[0]
5117
- }
5118
- };
5119
- result.point = {
5120
- style: {
5121
- visible: false,
5122
- fill: color.colorScheme?.[0]
5123
- }
5124
- };
5125
- return result;
5126
- };
5127
- const tooltipDisable = (spec)=>{
5128
- const result = {
5129
- ...spec
5130
- };
5131
- result.tooltip = {
5132
- visible: false
5133
- };
5134
- return result;
5135
- };
5136
- const tooltipAreaRange = (spec, context)=>{
5137
- const result = {
5138
- ...spec
5139
- };
5140
- const { advancedVSeed } = context;
5141
- const { measures, datasetReshapeInfo, chartType, locale, encoding } = advancedVSeed;
5142
- const baseConfig = advancedVSeed.config[chartType];
5143
- const { tooltip = {
5144
- enable: true
5145
- } } = baseConfig;
5146
- const { enable } = tooltip;
5147
- const { groupName } = datasetReshapeInfo[0].unfoldInfo;
5148
- const y = encoding[0]?.y || [];
5149
- result.tooltip = {
5150
- visible: enable,
5151
- dimension: {
5152
- content: [
5153
- {
5154
- visible: true,
5155
- key: (datum)=>datum && datum[groupName] || '',
5156
- value: (datum)=>{
5157
- if (!datum) return '';
5158
- const text = y.map((id)=>{
5159
- const value = datum[id];
5160
- const measure = findMeasureById(measures, id);
5161
- if (!measure) return String(value);
5162
- const { format = {}, autoFormat = true } = measure;
5163
- if (!isEmpty(format)) {
5164
- const formatter = createFormatter(format);
5165
- return formatter(value);
5166
- }
5167
- if (autoFormat) return autoFormatter(value, locale);
5168
- return String(value);
5169
- });
5170
- return text.join(' ~ ');
5171
- },
5172
- shapeType: 'rectRound'
5173
- },
5174
- ...y.map((id)=>{
5175
- const measure = findMeasureById(measures, id);
5176
- return {
5177
- visible: true,
5178
- key: measure?.alias || id,
5179
- value: (datum)=>{
5180
- if (!datum) return '';
5181
- const value = datum[id];
5182
- const measure = findMeasureById(measures, id);
5183
- if (!measure) return String(value);
5184
- const { format = {}, autoFormat = true } = measure;
5185
- if (!isEmpty(format)) {
5186
- const formatter = createFormatter(format);
5187
- return formatter(value);
5188
- }
5189
- if (autoFormat) return autoFormatter(value, locale);
5190
- return String(value);
5191
- },
5192
- shapeType: 'rectRound'
5193
- };
5194
- })
5195
- ]
5196
- }
5197
- };
5198
- return result;
5199
- };
5200
- const areaRange = [
5201
- series([
5202
- initAreaRange,
5203
- areaStyle_areaStyle
5204
- ], [
5205
- initAreaRangeLine1,
5206
- lineStyle_lineStyle,
5207
- pointStyle_pointStyle,
5208
- pointStateDimensionHover,
5209
- tooltipDisable
5210
- ], [
5211
- initAreaRangeLine2,
5212
- lineStyle_lineStyle,
5213
- pointStyle_pointStyle,
5214
- pointStateDimensionHover,
5215
- tooltipDisable
5216
- ]),
5217
- datasetXY,
5218
- progressive,
5219
- background_backgroundColor,
5220
- xBand,
5221
- yLinear,
5222
- label_label,
5223
- tooltipAreaRange,
5224
- verticalCrosshairLine,
5225
- annotationPoint_annotationPoint,
5226
- annotationVerticalLine_annotationVerticalLine,
5227
- annotationHorizontalLine_annotationHorizontalLine,
5228
- annotationArea_annotationArea
5229
- ];
5230
- const pivotAreaRange = [
5231
- initPivot,
5232
- pivotGridStyle,
5233
- pivotIndicators_pivotIndicatorsAsRow,
5234
- datasetPivot,
5235
- pivotIndicators_pivotIndicators([
5236
- series([
5237
- initAreaRange,
5238
- areaStyle_areaStyle
5239
- ], [
5240
- initAreaRangeLine1,
5241
- lineStyle_lineStyle,
5242
- pointStyle_pointStyle,
5243
- pointStateDimensionHover,
5244
- tooltipDisable
5245
- ], [
5246
- initAreaRangeLine2,
5247
- lineStyle_lineStyle,
5248
- pointStyle_pointStyle,
5249
- pointStateDimensionHover,
5250
- tooltipDisable
5251
- ]),
5252
- background_backgroundColor,
5253
- datasetXY,
5254
- progressive,
5255
- xBand,
5256
- yLinear,
5257
- label_label,
5258
- tooltipAreaRange,
5259
- verticalCrosshairLine,
5260
- annotationPoint_annotationPoint,
5261
- annotationVerticalLine_annotationVerticalLine,
5262
- annotationHorizontalLine_annotationHorizontalLine,
5263
- annotationArea_annotationArea
5264
- ]),
5265
- pivotRowDimensions,
5266
- pivotColumnDimensions
5267
- ];
5268
- const areaRangeSpecPipeline = [
5269
- pivotAdapter_pivotAdapter(areaRange, pivotAreaRange)
5270
- ];
5271
- const registerAreaRange = ()=>{
5272
- Builder._advancedPipelineMap.areaRange = areaRangeAdvancedPipeline;
5273
- Builder._specPipelineMap.areaRange = areaRangeSpecPipeline;
5274
- };
5275
- const dataReshapeFor1D2M_emptyReshapeResult = {
5276
- dataset: [],
5277
- foldInfo: {
5278
- foldMap: {},
5279
- measureId: '',
5280
- measureName: '',
5281
- measureValue: ''
5282
- },
5283
- unfoldInfo: {
5284
- groupName: '',
5285
- groupId: '',
5286
- colorItems: [],
5287
- colorIdMap: {}
5288
- }
5289
- };
5290
- const dataReshapeFor1D2M = (dataset, dimensions, measures, options)=>{
5291
- const { foldMeasureId = FoldMeasureId, foldMeasureName = FoldMeasureName, foldMeasureValue = FoldMeasureValue, unfoldDimensionGroup = UnfoldDimensionGroup, unfoldDimensionGroupId = UnfoldDimensionGroupId } = options || {};
5292
- if (0 === dimensions.length && 0 === measures.length) return dataReshapeFor1D2M_emptyReshapeResult;
5293
- const { dataset: foldedDataset, foldInfo } = foldMeasures(dataset, measures.length > 1 ? measures.slice(1) : measures, foldMeasureId, foldMeasureName, foldMeasureValue);
5294
- if (0 === dimensions.length) {
5295
- const { dataset: finalDataset, unfoldInfo } = unfoldDimensions(foldedDataset, [
5296
- {
5297
- id: foldMeasureValue,
5298
- alias: i18n`指标值`,
5299
- location: 'dimension'
5300
- }
5301
- ], [
5302
- {
5303
- id: foldMeasureValue,
5304
- alias: i18n`指标值`
5305
- }
5306
- ], 0, unfoldDimensionGroup, unfoldDimensionGroupId, foldMeasureId);
5307
- return {
5308
- dataset: finalDataset,
5309
- foldInfo,
5310
- unfoldInfo
5311
- };
5312
- }
5313
- {
5314
- const { dataset: finalDataset, unfoldInfo } = unfoldDimensions(foldedDataset, [
5315
- ...dimensions
5316
- ], [
5317
- {
5318
- id: foldMeasureValue,
5319
- alias: i18n`指标值`
5320
- }
5321
- ], 0, unfoldDimensionGroup, unfoldDimensionGroupId, foldMeasureId);
5322
- return {
5323
- dataset: finalDataset,
5324
- foldInfo,
5325
- unfoldInfo
5326
- };
5327
- }
5328
- };
5329
- const reshapeTo1D2M = (advancedVSeed, context)=>{
5330
- const result = {
5331
- ...advancedVSeed
5332
- };
5333
- const { vseed } = context;
5334
- const { dataset } = vseed;
5335
- const { dimensions, measures } = advancedVSeed;
5336
- if (!measures || !dimensions || !dataset) return result;
5337
- if (0 === measures.length) throw new Error('measures can not be empty');
5338
- const { dataset: newDatasets, foldInfo, unfoldInfo } = dataReshapeFor1D2M(dataset, dimensions, measures);
5339
- return {
5340
- ...result,
5341
- dataset: newDatasets,
5342
- datasetReshapeInfo: [
5343
- {
5344
- id: '1D2M',
5345
- index: 0,
5346
- foldInfo,
5347
- unfoldInfo
5348
- }
5349
- ]
5350
- };
5351
- };
5352
- const pivotReshapeTo1D2M = (advancedVSeed, context)=>{
5353
- const result = {
5354
- ...advancedVSeed
5355
- };
5356
- const { vseed } = context;
5357
- const { dataset } = vseed;
5358
- const { measures } = advancedVSeed;
5359
- const dimensions = advancedVSeed.dimensions;
5360
- if (!measures || !dimensions) return result;
5361
- const measureGroups = [];
5362
- if (measures) measures.forEach((measure)=>{
5363
- if (measure.children && measure.children.length > 0) measureGroups.push(measure);
5364
- });
5365
- const newDatasets = [];
5366
- const datasetReshapeInfo = [];
5367
- measureGroups.forEach((measureGroup, index)=>{
5368
- const measures = measureGroup.children;
5369
- if (!measures) return;
5370
- const commonDimensions = dimensions.filter((dim)=>'dimension' === dim.location);
5371
- const groupId = measureGroup.id;
5372
- const { dataset: newSubDataset, foldInfo, unfoldInfo } = dataReshapeFor1D2M(dataset, commonDimensions, measures, {
5373
- foldMeasureId: FoldMeasureId,
5374
- foldMeasureName: FoldMeasureName,
5375
- foldMeasureValue: FoldMeasureValue + groupId,
5376
- unfoldDimensionGroup: UnfoldDimensionGroup
5377
- });
5378
- const reshapeInfo = {
5379
- id: groupId,
5380
- index,
5381
- foldInfo,
5382
- unfoldInfo
5383
- };
5384
- newDatasets.push(newSubDataset);
5385
- datasetReshapeInfo.push(reshapeInfo);
5386
- });
5387
- return {
5388
- ...result,
5389
- dataset: newDatasets,
5390
- datasetReshapeInfo: datasetReshapeInfo
5391
- };
5392
- };
5393
- const encodingYY = (advancedVSeed)=>{
5394
- const result = {
5395
- ...advancedVSeed
5396
- };
5397
- const { datasetReshapeInfo, measures } = advancedVSeed;
5398
- if (!datasetReshapeInfo || !measures) return result;
5399
- const firstMeasure = findFirstMeasure(measures);
5400
- const encoding = datasetReshapeInfo.reduce((prev, cur)=>{
5401
- const { foldInfo, unfoldInfo } = cur;
5402
- const x = [
5403
- firstMeasure?.id
5404
- ];
5405
- const y = [
5406
- foldInfo.measureValue
5407
- ];
5408
- const group = [
5409
- unfoldInfo.groupId
5410
- ];
5411
- const color = [
5412
- unfoldInfo.groupId
5413
- ];
5414
- return [
5415
- ...prev,
5416
- {
5417
- x,
5418
- y,
5419
- group,
5420
- color
5421
- }
5422
- ];
5423
- }, []);
4907
+ const datasetScatter = (spec, context)=>{
4908
+ const { advancedVSeed, vseed } = context;
4909
+ const { datasetReshapeInfo } = advancedVSeed;
4910
+ const id = datasetReshapeInfo[0].id;
4911
+ const fields = {};
5424
4912
  return {
5425
- ...result,
5426
- encoding
5427
- };
5428
- };
5429
- const scatterAdvancedPipeline = [
5430
- initAdvancedVSeed_initAdvancedVSeed,
5431
- autoMeasures_autoMeasures,
5432
- autoDimensions_autoDimensions,
5433
- pivotAdapter([
5434
- reshapeTo1D2M
5435
- ], [
5436
- pivotReshapeTo1D2M
5437
- ]),
5438
- encodingYY,
5439
- scatterConfig,
5440
- theme_theme,
5441
- markStyle_markStyle,
5442
- annotation_annotation
5443
- ];
5444
- const initScatter = (spec, context)=>{
5445
- const result = {
5446
- ...spec
5447
- };
5448
- const { advancedVSeed } = context;
5449
- const { encoding } = advancedVSeed;
5450
- if (!encoding[0].y || !encoding[0].x || !encoding[0].group) return result;
5451
- result.type = 'scatter';
5452
- result.direction = 'vertical';
5453
- result.xField = encoding[0].x[0];
5454
- result.yField = encoding[0].y[0];
5455
- result.seriesField = encoding[0].group[0];
5456
- result.padding = 0;
5457
- result.region = [
5458
- {
5459
- clip: true
4913
+ ...spec,
4914
+ data: {
4915
+ id,
4916
+ values: isPivotChart(vseed) ? void 0 : advancedVSeed.dataset.flat(),
4917
+ fields: fields
5460
4918
  }
5461
- ];
5462
- result.animation = true;
5463
- return result;
4919
+ };
5464
4920
  };
5465
4921
  const horizontalCrosshairLine = (spec, context)=>{
5466
4922
  const result = {
@@ -5510,7 +4966,7 @@ const scatter = [
5510
4966
  initScatter,
5511
4967
  color_color,
5512
4968
  background_backgroundColor,
5513
- datasetXY,
4969
+ datasetScatter,
5514
4970
  progressive,
5515
4971
  xLinear,
5516
4972
  yLinear,
@@ -5535,7 +4991,7 @@ const pivotScatter = [
5535
4991
  initScatter,
5536
4992
  color_color,
5537
4993
  background_backgroundColor,
5538
- datasetXY,
4994
+ datasetScatter,
5539
4995
  progressive,
5540
4996
  xLinear,
5541
4997
  yLinear,
@@ -5561,41 +5017,163 @@ const registerScatter = ()=>{
5561
5017
  Builder._advancedPipelineMap.scatter = scatterAdvancedPipeline;
5562
5018
  Builder._specPipelineMap.scatter = scatterSpecPipeline;
5563
5019
  };
5564
- const reshapeTo2D2M = (advancedVSeed, context)=>{
5020
+ const autoDualMeasures = (advancedVSeed, context)=>{
5021
+ const result = {
5022
+ ...advancedVSeed
5023
+ };
5024
+ const { vseed } = context;
5025
+ const { dataset, dualMeasures, measures } = vseed;
5026
+ if (!dataset) throw new Error('dataset is required');
5027
+ if (0 === dataset.length) return result;
5028
+ if (dualMeasures) {
5029
+ result.measures = dualMeasuresToMeasureTree(dualMeasures);
5030
+ return result;
5031
+ }
5032
+ if (measures && measureDepth(measures) > 1) {
5033
+ result.measures = measures;
5034
+ return result;
5035
+ }
5036
+ const top100dataset = dataset.slice(0, 100);
5037
+ const sample = top100dataset.reduce((prev, cur)=>({
5038
+ ...prev,
5039
+ ...cur
5040
+ }), {});
5041
+ const newMeasures = measures || Object.keys(sample).filter((key)=>top100dataset.some((item)=>'number' == typeof item[key]) && ![
5042
+ '',
5043
+ null,
5044
+ void 0
5045
+ ].includes(key)).map((measure)=>({
5046
+ id: measure,
5047
+ alias: measure
5048
+ }));
5049
+ if (0 === newMeasures.length) result.measures = [];
5050
+ else if (1 === newMeasures.length) result.measures = [
5051
+ {
5052
+ id: 'primary',
5053
+ alias: 'primary',
5054
+ children: newMeasures
5055
+ }
5056
+ ];
5057
+ else if (newMeasures.length > 1) result.measures = [
5058
+ {
5059
+ id: 'primary',
5060
+ alias: 'primary',
5061
+ children: newMeasures.slice(0, 1)
5062
+ },
5063
+ {
5064
+ id: 'secondary',
5065
+ alias: 'secondary',
5066
+ children: newMeasures.slice(1)
5067
+ }
5068
+ ];
5069
+ return result;
5070
+ };
5071
+ const dualMeasuresToMeasureTree = (dualMeasures)=>{
5072
+ const measureTree = dualMeasures.map((item, index)=>{
5073
+ const { primaryMeasures, secondaryMeasures } = item;
5074
+ const groupChildren = [];
5075
+ let id = '';
5076
+ if (primaryMeasures) {
5077
+ const arrPrimaryMeasures = Array.isArray(primaryMeasures) ? primaryMeasures : [
5078
+ primaryMeasures
5079
+ ];
5080
+ const alias = arrPrimaryMeasures.map((item)=>item.alias || item.id).toString();
5081
+ id += alias;
5082
+ groupChildren.push({
5083
+ id: `${index}-primary`,
5084
+ alias: arrPrimaryMeasures.map((item)=>item.alias || item.id).toString(),
5085
+ children: arrPrimaryMeasures
5086
+ });
5087
+ }
5088
+ if (secondaryMeasures) {
5089
+ const arrSecondaryMeasures = Array.isArray(secondaryMeasures) ? secondaryMeasures : [
5090
+ secondaryMeasures
5091
+ ];
5092
+ const alias = arrSecondaryMeasures.map((item)=>item.alias || item.id).toString();
5093
+ id += alias;
5094
+ groupChildren.push({
5095
+ id: `${index}-secondary`,
5096
+ alias: arrSecondaryMeasures.map((item)=>item.alias || item.id).toString(),
5097
+ children: arrSecondaryMeasures
5098
+ });
5099
+ }
5100
+ return {
5101
+ id,
5102
+ alias: id,
5103
+ children: groupChildren
5104
+ };
5105
+ });
5106
+ if (1 === dualMeasures.length) return measureTree[0].children || [];
5107
+ return measureTree;
5108
+ };
5109
+ const encodingForDualAxis = (advancedVSeed, context)=>{
5110
+ const { vseed } = context;
5111
+ const { dimensions } = advancedVSeed;
5112
+ if (!dimensions) return advancedVSeed;
5113
+ const encoding = vseed.encoding;
5114
+ if (encoding) {
5115
+ const x = encoding.x || [];
5116
+ const detail = encoding.detail || [];
5117
+ const color = encoding.color || [];
5118
+ const mergedDetail = [
5119
+ ...color.filter((d)=>!x.includes(d)),
5120
+ ...detail
5121
+ ];
5122
+ return {
5123
+ ...advancedVSeed,
5124
+ encoding: {
5125
+ ...encoding,
5126
+ detail: mergedDetail
5127
+ }
5128
+ };
5129
+ }
5130
+ const mergedEncoding = {
5131
+ x: dimensions.slice(0, 1).map((item)=>item.id),
5132
+ color: dimensions.slice(1).map((item)=>item.id),
5133
+ detail: dimensions.slice(1).map((item)=>item.id),
5134
+ tooltip: dimensions.map((item)=>item.id),
5135
+ label: [],
5136
+ row: [],
5137
+ column: []
5138
+ };
5139
+ return {
5140
+ ...advancedVSeed,
5141
+ encoding: mergedEncoding
5142
+ };
5143
+ };
5144
+ const reshapeWithDualEncoding = (advancedVSeed, context)=>{
5565
5145
  const result = {
5566
5146
  ...advancedVSeed
5567
5147
  };
5568
5148
  const { vseed } = context;
5569
5149
  const { dataset } = vseed;
5570
- const { dimensions, measures } = advancedVSeed;
5571
- if (!measures || !dimensions || !dataset) return result;
5150
+ const { dimensions, measures, encoding, chartType } = advancedVSeed;
5151
+ if (!measures || !dimensions || !dataset || !encoding) return result;
5572
5152
  if (0 === measures.length) throw new Error('measures can not be empty');
5573
5153
  if (measures.length > 2) throw new Error('measures can not be more than 2');
5574
- const commonDimensions = dimensions.filter((dim)=>'dimension' === dim.location);
5575
- const datasets = [];
5576
5154
  const foldInfoList = [];
5577
5155
  const unfoldInfoList = [];
5156
+ const datasets = [];
5578
5157
  const primaryMeasures = measures[0];
5579
5158
  const secondaryMeasures = measures[1] || [];
5580
5159
  if (primaryMeasures && primaryMeasures.children) {
5581
- const { dataset: newDatasets, foldInfo, unfoldInfo } = dataReshapeFor2D1M(dataset, commonDimensions, primaryMeasures.children, {
5160
+ const { dataset: newDataset, foldInfo, unfoldInfo } = dataReshapeByEncoding(dataset, dimensions, primaryMeasures.children, encoding, {
5582
5161
  foldMeasureValue: FoldPrimaryMeasureValue
5583
5162
  });
5584
- datasets.push(newDatasets);
5163
+ datasets.push(newDataset);
5585
5164
  foldInfoList.push(foldInfo);
5586
5165
  unfoldInfoList.push(unfoldInfo);
5587
5166
  }
5588
5167
  if (secondaryMeasures && secondaryMeasures.children) {
5589
- const { dataset: newDatasets, foldInfo, unfoldInfo } = dataReshapeFor2D1M(dataset, commonDimensions, secondaryMeasures.children, {
5168
+ const { dataset: newDataset, foldInfo, unfoldInfo } = dataReshapeByEncoding(dataset, dimensions, secondaryMeasures.children, encoding, {
5590
5169
  foldMeasureValue: FoldSecondaryMeasureValue
5591
5170
  });
5592
- datasets.push(newDatasets);
5171
+ datasets.push(newDataset);
5593
5172
  foldInfoList.push(foldInfo);
5594
5173
  unfoldInfoList.push(unfoldInfo);
5595
5174
  }
5596
5175
  const unfoldInfo = {
5597
- groupName: unfoldInfoList[0].groupName,
5598
- groupId: unfoldInfoList[0].groupId,
5176
+ ...unfoldInfoList[0],
5599
5177
  colorItems: unfoldInfoList.flatMap((d)=>d.colorItems),
5600
5178
  colorIdMap: unfoldInfoList.reduce((prev, cur)=>({
5601
5179
  ...prev,
@@ -5607,7 +5185,7 @@ const reshapeTo2D2M = (advancedVSeed, context)=>{
5607
5185
  dataset: datasets,
5608
5186
  datasetReshapeInfo: [
5609
5187
  {
5610
- id: '2D2M',
5188
+ id: String(chartType),
5611
5189
  index: 0,
5612
5190
  foldInfo: foldInfoList[0],
5613
5191
  foldInfoList: foldInfoList,
@@ -5616,46 +5194,48 @@ const reshapeTo2D2M = (advancedVSeed, context)=>{
5616
5194
  ]
5617
5195
  };
5618
5196
  };
5619
- const pivotReshapeTo2D2M = (advancedVSeed, context)=>{
5197
+ const pivotReshapeWithDualEncoding = (advancedVSeed, context)=>{
5620
5198
  const result = {
5621
5199
  ...advancedVSeed
5622
5200
  };
5623
5201
  const { vseed } = context;
5624
5202
  const { dataset } = vseed;
5625
- const { dimensions, measures } = advancedVSeed;
5626
- if (!measures || !dimensions || !dataset) return result;
5627
- const commonDimensions = dimensions.filter((dim)=>'dimension' === dim.location);
5203
+ const { dimensions, measures, encoding, chartType } = advancedVSeed;
5204
+ if (!measures || !dimensions || !dataset || !encoding) return result;
5628
5205
  const datasetList = [];
5629
5206
  const datasetReshapeInfo = [];
5630
- measures.forEach((measureGroup, index)=>{
5631
- const measures = measureGroup.children || [];
5207
+ const measureGroups = [];
5208
+ const depth = measureDepth(measures);
5209
+ if (3 === depth) measures.forEach((measure)=>{
5210
+ measureGroups.push(measure.children);
5211
+ });
5212
+ else if (2 === depth) measureGroups.push(measures);
5213
+ measureGroups.forEach((measures, index)=>{
5632
5214
  if (0 === measures.length) throw new Error('measures can not be empty');
5633
5215
  if (measures.length > 2) throw new Error('measures can not be more than 2');
5634
- const datasets = [];
5635
5216
  const foldInfoList = [];
5636
5217
  const unfoldInfoList = [];
5218
+ const datasets = [];
5637
5219
  const primaryMeasures = measures[0];
5638
- const secondaryMeasures = measures[1] || measures[0];
5220
+ const secondaryMeasures = measures[1] || [];
5639
5221
  if (primaryMeasures && primaryMeasures.children) {
5640
- const { dataset: newDatasets, foldInfo, unfoldInfo } = dataReshapeFor2D1M(dataset, commonDimensions, primaryMeasures.children, {
5222
+ const { dataset: newDataset, foldInfo, unfoldInfo } = dataReshapeByEncoding(dataset, dimensions, primaryMeasures.children, encoding, {
5641
5223
  foldMeasureValue: `${FoldPrimaryMeasureValue}${index}`
5642
5224
  });
5643
- datasets.push(newDatasets);
5225
+ datasets.push(newDataset);
5644
5226
  foldInfoList.push(foldInfo);
5645
5227
  unfoldInfoList.push(unfoldInfo);
5646
5228
  }
5647
5229
  if (secondaryMeasures && secondaryMeasures.children) {
5648
- const { dataset: newDatasets, foldInfo, unfoldInfo } = dataReshapeFor2D1M(dataset, commonDimensions, secondaryMeasures.children, {
5230
+ const { dataset: newDataset, foldInfo, unfoldInfo } = dataReshapeByEncoding(dataset, dimensions, secondaryMeasures.children, encoding, {
5649
5231
  foldMeasureValue: `${FoldSecondaryMeasureValue}${index}`
5650
5232
  });
5651
- datasets.push(newDatasets);
5233
+ datasets.push(newDataset);
5652
5234
  foldInfoList.push(foldInfo);
5653
5235
  unfoldInfoList.push(unfoldInfo);
5654
5236
  }
5655
- datasetList.push(datasets.flat(2));
5656
5237
  const unfoldInfo = {
5657
- groupName: unfoldInfoList[0].groupName,
5658
- groupId: unfoldInfoList[0].groupId,
5238
+ ...unfoldInfoList[0],
5659
5239
  colorItems: unfoldInfoList.flatMap((d)=>d.colorItems),
5660
5240
  colorIdMap: unfoldInfoList.reduce((prev, cur)=>({
5661
5241
  ...prev,
@@ -5663,53 +5243,19 @@ const pivotReshapeTo2D2M = (advancedVSeed, context)=>{
5663
5243
  }), {})
5664
5244
  };
5665
5245
  const reshapeInfo = {
5666
- id: `2D2M-${index}`,
5246
+ id: `${chartType}-${index}`,
5667
5247
  index,
5668
5248
  foldInfo: foldInfoList[0],
5669
- unfoldInfo: unfoldInfo,
5670
- foldInfoList: foldInfoList
5249
+ foldInfoList: foldInfoList,
5250
+ unfoldInfo: unfoldInfo
5671
5251
  };
5672
5252
  datasetReshapeInfo.push(reshapeInfo);
5253
+ datasetList.push(datasets.flat(2));
5673
5254
  });
5674
5255
  return {
5675
5256
  ...result,
5676
5257
  dataset: datasetList,
5677
- datasetReshapeInfo
5678
- };
5679
- };
5680
- const encodingXYY = (advancedVSeed)=>{
5681
- const result = {
5682
- ...advancedVSeed
5683
- };
5684
- const { datasetReshapeInfo, dimensions } = advancedVSeed;
5685
- if (!datasetReshapeInfo || !dimensions) return result;
5686
- const xDimension = dimensions.find((item)=>'rowDimension' !== item.location && 'columnDimension' !== item.location) || dimensions[0];
5687
- const isZeroDimension = 0 === dimensions.length;
5688
- const encoding = datasetReshapeInfo.reduce((prev, cur)=>{
5689
- const { foldInfoList, unfoldInfo } = cur;
5690
- const x = [
5691
- isZeroDimension ? foldInfoList[0].measureName : xDimension?.id
5692
- ];
5693
- const y = foldInfoList.map((d)=>d.measureValue);
5694
- const group = [
5695
- unfoldInfo.groupId
5696
- ];
5697
- const color = [
5698
- foldInfoList[0].measureName
5699
- ];
5700
- return [
5701
- ...prev,
5702
- {
5703
- x,
5704
- y,
5705
- group,
5706
- color
5707
- }
5708
- ];
5709
- }, []);
5710
- return {
5711
- ...result,
5712
- encoding
5258
+ datasetReshapeInfo: datasetReshapeInfo
5713
5259
  };
5714
5260
  };
5715
5261
  const dualAxisConfig = (advancedVSeed, context)=>{
@@ -5738,125 +5284,80 @@ const dualAxisConfig = (advancedVSeed, context)=>{
5738
5284
  };
5739
5285
  return result;
5740
5286
  };
5741
- const autoDualMeasures = (advancedVSeed, context)=>{
5742
- const result = {
5743
- ...advancedVSeed
5744
- };
5745
- const { vseed } = context;
5746
- const { dataset, dualMeasures, measures } = vseed;
5747
- if (!dataset) throw new Error('dataset is required');
5748
- if (0 === dataset.length) return result;
5749
- if (dualMeasures) {
5750
- result.measures = dualMeasuresToMeasureTree(dualMeasures);
5751
- return result;
5752
- }
5753
- if (measures && measureDepth(measures) > 1) {
5754
- result.measures = measures;
5755
- return result;
5756
- }
5757
- const top100dataset = dataset.slice(0, 100);
5758
- const sample = top100dataset.reduce((prev, cur)=>({
5759
- ...prev,
5760
- ...cur
5761
- }), {});
5762
- const newMeasures = measures || Object.keys(sample).filter((key)=>top100dataset.some((item)=>'number' == typeof item[key]) && ![
5763
- '',
5764
- null,
5765
- void 0
5766
- ].includes(key)).map((measure)=>({
5767
- id: measure,
5768
- alias: measure
5769
- }));
5770
- if (0 === newMeasures.length) result.measures = [];
5771
- else if (1 === newMeasures.length) result.measures = [
5772
- {
5773
- id: 'primary',
5774
- alias: 'primary',
5775
- children: newMeasures
5776
- }
5777
- ];
5778
- else if (newMeasures.length > 1) result.measures = [
5779
- {
5780
- id: 'primary',
5781
- alias: 'primary',
5782
- children: newMeasures.slice(0, 1)
5783
- },
5784
- {
5785
- id: 'secondary',
5786
- alias: 'secondary',
5787
- children: newMeasures.slice(1)
5788
- }
5789
- ];
5790
- return result;
5791
- };
5792
- const dualMeasuresToMeasureTree = (dualMeasures)=>{
5793
- const measureTree = dualMeasures.map((item, index)=>{
5794
- const { primaryMeasures, secondaryMeasures } = item;
5795
- const groupChildren = [];
5796
- let id = '';
5797
- if (primaryMeasures) {
5798
- const arrPrimaryMeasures = Array.isArray(primaryMeasures) ? primaryMeasures : [
5799
- primaryMeasures
5800
- ];
5801
- const alias = arrPrimaryMeasures.map((item)=>item.alias || item.id).toString();
5802
- id += alias;
5803
- groupChildren.push({
5804
- id: `${index}-primary`,
5805
- alias: arrPrimaryMeasures.map((item)=>item.alias || item.id).toString(),
5806
- children: arrPrimaryMeasures
5807
- });
5808
- }
5809
- if (secondaryMeasures) {
5810
- const arrSecondaryMeasures = Array.isArray(secondaryMeasures) ? secondaryMeasures : [
5811
- secondaryMeasures
5812
- ];
5813
- const alias = arrSecondaryMeasures.map((item)=>item.alias || item.id).toString();
5814
- id += alias;
5815
- groupChildren.push({
5816
- id: `${index}-secondary`,
5817
- alias: arrSecondaryMeasures.map((item)=>item.alias || item.id).toString(),
5818
- children: arrSecondaryMeasures
5819
- });
5820
- }
5821
- return {
5822
- id,
5823
- alias: id,
5824
- children: groupChildren
5825
- };
5826
- });
5827
- if (1 === dualMeasures.length) return measureTree[0].children || [];
5828
- return measureTree;
5829
- };
5830
5287
  const dualAxisAdvancedPipeline = [
5831
5288
  initAdvancedVSeed_initAdvancedVSeed,
5832
5289
  autoDualMeasures,
5833
5290
  autoDimensions_autoDimensions,
5291
+ encodingForDualAxis,
5834
5292
  pivotAdapter([
5835
- reshapeTo2D2M
5293
+ reshapeWithDualEncoding
5836
5294
  ], [
5837
- pivotReshapeTo2D2M
5295
+ pivotReshapeWithDualEncoding
5838
5296
  ]),
5839
- encodingXYY,
5840
5297
  sortXBandAxis,
5841
- sort_sortLegend,
5298
+ sortLegend_sortLegend,
5842
5299
  dualAxisConfig,
5843
5300
  theme_theme,
5844
5301
  markStyle_markStyle,
5845
5302
  annotation_annotation
5846
5303
  ];
5304
+ const series = (...args)=>{
5305
+ const result = {
5306
+ type: 'common',
5307
+ padding: 0,
5308
+ region: [
5309
+ {
5310
+ clip: true
5311
+ }
5312
+ ]
5313
+ };
5314
+ return (_, context)=>{
5315
+ result.series = args.map((pipeline)=>execPipeline(pipeline, context, {}));
5316
+ return result;
5317
+ };
5318
+ };
5319
+ const seriesDualAxis = (...args)=>{
5320
+ const result = {
5321
+ type: 'common',
5322
+ padding: 0,
5323
+ region: [
5324
+ {
5325
+ clip: true
5326
+ }
5327
+ ]
5328
+ };
5329
+ const createDualContext = (context, index)=>{
5330
+ const { advancedVSeed } = context;
5331
+ const dataset = advancedVSeed.dataset[index];
5332
+ return {
5333
+ ...context,
5334
+ advancedVSeed: {
5335
+ ...advancedVSeed,
5336
+ dataset: dataset
5337
+ }
5338
+ };
5339
+ };
5340
+ return (_, context)=>{
5341
+ result.series = args.map((pipeline, index)=>{
5342
+ const seriesContext = createDualContext(context, index);
5343
+ return execPipeline(pipeline, seriesContext, {});
5344
+ });
5345
+ return result;
5346
+ };
5347
+ };
5847
5348
  const initDualAxisPrimary = (spec, context)=>{
5848
5349
  const result = {
5849
5350
  ...spec
5850
5351
  };
5851
5352
  const { advancedVSeed } = context;
5852
- const { encoding, datasetReshapeInfo } = advancedVSeed;
5853
- if (!encoding[0].y || !encoding[0].x || !encoding[0].group) return result;
5854
- result.id = `${datasetReshapeInfo[0].id}-primary-series`;
5353
+ const { datasetReshapeInfo } = advancedVSeed;
5354
+ const { unfoldInfo, foldInfoList, id } = datasetReshapeInfo[0];
5355
+ result.id = `${id}-primary-series`;
5855
5356
  result.type = 'bar';
5856
5357
  result.direction = 'vertical';
5857
- result.xField = encoding[0].x[0];
5858
- result.yField = encoding[0].y[0];
5859
- result.seriesField = encoding[0].group[0];
5358
+ result.xField = unfoldInfo.encodingX;
5359
+ result.seriesField = unfoldInfo.encodingColorId;
5360
+ result.yField = foldInfoList?.[0].measureValue;
5860
5361
  result.animation = true;
5861
5362
  return result;
5862
5363
  };
@@ -5865,14 +5366,14 @@ const initDualAxisSecondary = (spec, context)=>{
5865
5366
  ...spec
5866
5367
  };
5867
5368
  const { advancedVSeed } = context;
5868
- const { encoding, datasetReshapeInfo } = advancedVSeed;
5869
- if (!encoding[0].y || !encoding[0].x || !encoding[0].group) return result;
5870
- result.id = `${datasetReshapeInfo[0].id}-secondary-series`;
5369
+ const { datasetReshapeInfo } = advancedVSeed;
5370
+ const { unfoldInfo, foldInfoList, id } = datasetReshapeInfo[0];
5371
+ result.id = `${id}-secondary-series`;
5871
5372
  result.type = 'line';
5872
5373
  result.direction = 'vertical';
5873
- result.xField = encoding[0].x[0];
5874
- result.yField = encoding[0].y[1];
5875
- result.seriesField = encoding[0].group[0];
5374
+ result.xField = unfoldInfo.encodingX;
5375
+ if (foldInfoList?.[1]) result.yField = foldInfoList[1].measureValue;
5376
+ result.seriesField = unfoldInfo.encodingColorId;
5876
5377
  result.animation = true;
5877
5378
  return result;
5878
5379
  };
@@ -5904,10 +5405,10 @@ const dualChartTypePrimary = (spec, context)=>{
5904
5405
  case 'columnParallel':
5905
5406
  {
5906
5407
  const columnSpec = result;
5907
- if (Array.isArray(columnSpec.xField)) columnSpec.xField.push(datasetReshapeInfo[0].unfoldInfo.groupId);
5408
+ if (Array.isArray(columnSpec.xField)) columnSpec.xField.push(datasetReshapeInfo[0].unfoldInfo.encodingDetail);
5908
5409
  else if (columnSpec.xField) columnSpec.xField = [
5909
5410
  columnSpec.xField,
5910
- datasetReshapeInfo[0].unfoldInfo.groupId
5411
+ datasetReshapeInfo[0].unfoldInfo.encodingDetail
5911
5412
  ];
5912
5413
  columnSpec.type = 'bar';
5913
5414
  result.zIndex = DUAL_AXIS_CHART_COLUMN_Z_INDEX;
@@ -5960,10 +5461,10 @@ const dualChartTypeSecondary = (spec, context)=>{
5960
5461
  case 'columnParallel':
5961
5462
  {
5962
5463
  const columnSpec = result;
5963
- if (Array.isArray(columnSpec.xField)) columnSpec.xField.push(datasetReshapeInfo[0].unfoldInfo.groupId);
5464
+ if (Array.isArray(columnSpec.xField)) columnSpec.xField.push(datasetReshapeInfo[0].unfoldInfo.encodingDetail);
5964
5465
  else if (columnSpec.xField) columnSpec.xField = [
5965
5466
  columnSpec.xField,
5966
- datasetReshapeInfo[0].unfoldInfo.groupId
5467
+ datasetReshapeInfo[0].unfoldInfo.encodingDetail
5967
5468
  ];
5968
5469
  columnSpec.type = 'bar';
5969
5470
  result.zIndex = DUAL_AXIS_CHART_COLUMN_Z_INDEX;
@@ -5990,10 +5491,11 @@ const dualChartTypeSecondary = (spec, context)=>{
5990
5491
  };
5991
5492
  const datasetPrimary = (spec, context)=>{
5992
5493
  const { advancedVSeed, vseed } = context;
5993
- const { encoding, analysis, datasetReshapeInfo } = advancedVSeed;
5494
+ const { analysis, datasetReshapeInfo } = advancedVSeed;
5994
5495
  const orderMapping = analysis?.orderMapping || {};
5995
- const x = encoding[0]?.x?.[0];
5996
- const group = encoding[0]?.group?.[0];
5496
+ const { unfoldInfo } = datasetReshapeInfo[0];
5497
+ const x = unfoldInfo.encodingX;
5498
+ const colorId = unfoldInfo.encodingColorId;
5997
5499
  const id = datasetReshapeInfo[0].id;
5998
5500
  const fields = {};
5999
5501
  if (x) {
@@ -6007,14 +5509,14 @@ const datasetPrimary = (spec, context)=>{
6007
5509
  sortIndex: 0
6008
5510
  };
6009
5511
  }
6010
- if (group) {
6011
- const order = orderMapping[group];
6012
- if (order) fields[group] = {
5512
+ if (colorId) {
5513
+ const order = orderMapping[colorId];
5514
+ if (order) fields[colorId] = {
6013
5515
  sortIndex: 0,
6014
5516
  domain: order,
6015
5517
  lockStatisticsByDomain: true
6016
5518
  };
6017
- else fields[group] = {
5519
+ else fields[colorId] = {
6018
5520
  sortIndex: 0
6019
5521
  };
6020
5522
  }
@@ -6029,10 +5531,11 @@ const datasetPrimary = (spec, context)=>{
6029
5531
  };
6030
5532
  const datasetSecondary = (spec, context)=>{
6031
5533
  const { advancedVSeed, vseed } = context;
6032
- const { encoding, analysis, datasetReshapeInfo } = advancedVSeed;
5534
+ const { analysis, datasetReshapeInfo } = advancedVSeed;
6033
5535
  const orderMapping = analysis?.orderMapping || {};
6034
- const x = encoding[0]?.x?.[0];
6035
- const group = encoding[0]?.group?.[0];
5536
+ const { unfoldInfo } = datasetReshapeInfo[0];
5537
+ const x = unfoldInfo.encodingX;
5538
+ const colorId = unfoldInfo.encodingColorId;
6036
5539
  const id = datasetReshapeInfo[0].id;
6037
5540
  const fields = {};
6038
5541
  if (x) {
@@ -6046,14 +5549,14 @@ const datasetSecondary = (spec, context)=>{
6046
5549
  sortIndex: 0
6047
5550
  };
6048
5551
  }
6049
- if (group) {
6050
- const order = orderMapping[group];
6051
- if (order) fields[group] = {
5552
+ if (colorId) {
5553
+ const order = orderMapping[colorId];
5554
+ if (order) fields[colorId] = {
6052
5555
  sortIndex: 0,
6053
5556
  domain: order,
6054
5557
  lockStatisticsByDomain: true
6055
5558
  };
6056
- else fields[group] = {
5559
+ else fields[colorId] = {
6057
5560
  sortIndex: 0
6058
5561
  };
6059
5562
  }
@@ -6151,7 +5654,7 @@ const tooltipPrimary = (spec, context)=>{
6151
5654
  const foldInfoList = datasetReshapeInfo[0].foldInfoList;
6152
5655
  const unfoldInfo = datasetReshapeInfo[0].unfoldInfo;
6153
5656
  const { measureId, measureValue, measureName } = foldInfoList[0];
6154
- const { groupName } = unfoldInfo;
5657
+ const { encodingColor: colorName } = unfoldInfo;
6155
5658
  result.tooltip = {
6156
5659
  visible: enable,
6157
5660
  mark: {
@@ -6172,7 +5675,7 @@ const tooltipPrimary = (spec, context)=>{
6172
5675
  {
6173
5676
  visible: true,
6174
5677
  hasShape: true,
6175
- key: (datum)=>datum && datum[measureName || groupName] || '',
5678
+ key: (datum)=>datum && datum[measureName || colorName] || '',
6176
5679
  value: (datum)=>{
6177
5680
  if (!datum) return '';
6178
5681
  const value = datum[measureValue];
@@ -6194,7 +5697,7 @@ const tooltipPrimary = (spec, context)=>{
6194
5697
  content: [
6195
5698
  {
6196
5699
  visible: true,
6197
- key: (datum)=>datum && datum[groupName] || '',
5700
+ key: (datum)=>datum && datum[colorName] || '',
6198
5701
  value: (datum)=>{
6199
5702
  if (!datum) return '';
6200
5703
  const value = datum[measureValue];
@@ -6231,7 +5734,7 @@ const tooltipSecondary = (spec, context)=>{
6231
5734
  const foldInfoList = datasetReshapeInfo[0].foldInfoList;
6232
5735
  const unfoldInfo = datasetReshapeInfo[0].unfoldInfo;
6233
5736
  const { measureId, measureValue, measureName } = foldInfoList[1];
6234
- const { groupName } = unfoldInfo;
5737
+ const { encodingColorId } = unfoldInfo;
6235
5738
  result.tooltip = {
6236
5739
  visible: enable,
6237
5740
  mark: {
@@ -6252,7 +5755,7 @@ const tooltipSecondary = (spec, context)=>{
6252
5755
  {
6253
5756
  visible: true,
6254
5757
  hasShape: true,
6255
- key: (datum)=>datum && datum[measureName || groupName] || '',
5758
+ key: (datum)=>datum && datum[measureName || encodingColorId] || '',
6256
5759
  value: (datum)=>{
6257
5760
  if (!datum) return '';
6258
5761
  const value = datum[measureValue];
@@ -6274,7 +5777,7 @@ const tooltipSecondary = (spec, context)=>{
6274
5777
  content: [
6275
5778
  {
6276
5779
  visible: true,
6277
- key: (datum)=>datum && datum[groupName] || '',
5780
+ key: (datum)=>datum && datum[encodingColorId] || '',
6278
5781
  value: (datum)=>{
6279
5782
  if (!datum) return '';
6280
5783
  const value = datum[measureValue];
@@ -6303,16 +5806,16 @@ const yLinearPrimary = (spec, context)=>{
6303
5806
  const { advancedVSeed, vseed } = context;
6304
5807
  const { chartType } = vseed;
6305
5808
  const { locale, datasetReshapeInfo } = advancedVSeed;
6306
- const index = datasetReshapeInfo[0].index;
5809
+ const { index, id: reshapeInfoId, foldInfoList } = datasetReshapeInfo[0];
6307
5810
  const primaryYAxis = advancedVSeed.config?.[chartType]?.primaryYAxis;
6308
5811
  const yAxisConfig = Array.isArray(primaryYAxis) ? primaryYAxis[index] || primaryYAxis[0] : primaryYAxis;
6309
5812
  const alignTicks = advancedVSeed.config?.[chartType]?.alignTicks;
6310
5813
  const alignTicksConfig = Array.isArray(alignTicks) ? alignTicks[index] || alignTicks[0] : alignTicks;
6311
- if (datasetReshapeInfo[0].foldInfoList?.[0] && isEmpty(datasetReshapeInfo[0].foldInfoList[0].foldMap)) return result;
6312
- const id = `${datasetReshapeInfo[0].id}-primary-axis`;
5814
+ if (foldInfoList?.[0] && isEmpty(foldInfoList[0].foldMap)) return result;
5815
+ const id = `${reshapeInfoId}-primary-axis`;
6313
5816
  const seriesIds = [
6314
- `${datasetReshapeInfo[0].id}-primary-series`,
6315
- `${datasetReshapeInfo[0].id}-secondary-series`
5817
+ `${reshapeInfoId}-primary-series`,
5818
+ `${reshapeInfoId}-secondary-series`
6316
5819
  ];
6317
5820
  const seriesId = alignTicksConfig ? seriesIds : seriesIds[0];
6318
5821
  if (!result.axes) result.axes = [];
@@ -6400,20 +5903,20 @@ const yLinearSecondary = (spec, context)=>{
6400
5903
  const { advancedVSeed, vseed } = context;
6401
5904
  const { chartType } = vseed;
6402
5905
  const { locale, datasetReshapeInfo } = advancedVSeed;
6403
- const index = datasetReshapeInfo[0].index;
5906
+ const { index, id: reshapeInfoId, foldInfoList } = datasetReshapeInfo[0];
6404
5907
  const secondaryYAxis = advancedVSeed.config?.[chartType]?.secondaryYAxis;
6405
5908
  const yAxisConfig = Array.isArray(secondaryYAxis) ? secondaryYAxis[index] || secondaryYAxis[0] : secondaryYAxis;
6406
5909
  const alignTicks = advancedVSeed.config?.[chartType]?.alignTicks;
6407
5910
  const alignTicksConfig = Array.isArray(alignTicks) ? alignTicks[index] || alignTicks[0] : alignTicks;
6408
- if (isNullish(datasetReshapeInfo[0].foldInfoList?.[1])) return result;
5911
+ if (isNullish(foldInfoList?.[1])) return result;
6409
5912
  const sync = {
6410
- axisId: `${datasetReshapeInfo[0].id}-primary-axis`,
5913
+ axisId: `${reshapeInfoId}-primary-axis`,
6411
5914
  zeroAlign: true
6412
5915
  };
6413
- const id = `${datasetReshapeInfo[0].id}-secondary-axis`;
5916
+ const id = `${reshapeInfoId}-secondary-axis`;
6414
5917
  const seriesIds = [
6415
- `${datasetReshapeInfo[0].id}-primary-series`,
6416
- `${datasetReshapeInfo[0].id}-secondary-series`
5918
+ `${reshapeInfoId}-primary-series`,
5919
+ `${reshapeInfoId}-secondary-series`
6417
5920
  ];
6418
5921
  const seriesId = alignTicksConfig ? seriesIds : seriesIds[1];
6419
5922
  if (!result.axes) result.axes = [];
@@ -6554,210 +6057,74 @@ const pivotDualAxis = [
6554
6057
  areaStyle_areaStyle
6555
6058
  ], [
6556
6059
  initDualAxisSecondary,
6557
- dualChartTypeSecondary,
6558
- datasetSecondary,
6559
- labelSecondary,
6560
- tooltipSecondary,
6561
- progressive,
6562
- barStyle_barStyle,
6563
- pointStyle_pointStyle,
6564
- pointStateDimensionHover,
6565
- lineStyle_lineStyle,
6566
- areaStyle_areaStyle
6567
- ]),
6568
- xBand,
6569
- yLinearPrimary,
6570
- yLinearSecondary,
6571
- color_color,
6572
- background_backgroundColor,
6573
- verticalCrosshairRect,
6574
- annotationPoint_annotationPoint,
6575
- annotationVerticalLine_annotationVerticalLine,
6576
- annotationHorizontalLine_annotationHorizontalLine,
6577
- annotationArea_annotationArea
6578
- ]),
6579
- pivotRowDimensions,
6580
- pivotColumnDimensions,
6581
- pivotDiscreteLegend
6582
- ];
6583
- const dualAxisSpecPipeline = [
6584
- pivotAdapter_pivotAdapter(dualAxis, pivotDualAxis)
6585
- ];
6586
- const registerDualAxis = ()=>{
6587
- Builder._advancedPipelineMap.dualAxis = dualAxisAdvancedPipeline;
6588
- Builder._specPipelineMap.dualAxis = dualAxisSpecPipeline;
6589
- };
6590
- const dataReshapeFor1D1M_emptyReshapeResult = {
6591
- dataset: [],
6592
- foldInfo: {
6593
- foldMap: {},
6594
- measureId: '',
6595
- measureName: '',
6596
- measureValue: ''
6597
- },
6598
- unfoldInfo: {
6599
- groupName: '',
6600
- groupId: '',
6601
- colorItems: [],
6602
- colorIdMap: {}
6603
- }
6604
- };
6605
- const dataReshapeFor1D1M = (dataset, dimensions, measures, options)=>{
6606
- const { foldMeasureId = FoldMeasureId, foldMeasureName = FoldMeasureName, foldMeasureValue = FoldMeasureValue, unfoldDimensionGroup = UnfoldDimensionGroup, unfoldDimensionGroupId = UnfoldDimensionGroupId } = options || {};
6607
- if (0 === dimensions.length && 0 === measures.length) return dataReshapeFor1D1M_emptyReshapeResult;
6608
- const { dataset: foldedDataset, foldInfo } = foldMeasures(dataset, measures, foldMeasureId, foldMeasureName, foldMeasureValue);
6609
- if (0 === dimensions.length) {
6610
- const { dataset: finalDataset, unfoldInfo } = unfoldDimensions(foldedDataset, [
6611
- {
6612
- id: foldMeasureName,
6613
- alias: i18n`指标名称`,
6614
- location: 'dimension'
6615
- }
6616
- ], [
6617
- {
6618
- id: foldMeasureValue,
6619
- alias: i18n`指标值`
6620
- }
6621
- ], 0, unfoldDimensionGroup, unfoldDimensionGroupId, foldMeasureId);
6622
- return {
6623
- dataset: finalDataset,
6624
- foldInfo,
6625
- unfoldInfo
6626
- };
6627
- }
6628
- {
6629
- const dims = 1 === measures.length ? [
6630
- ...dimensions
6631
- ] : [
6632
- ...dimensions,
6633
- {
6634
- id: foldMeasureName,
6635
- alias: i18n`指标名称`,
6636
- location: 'dimension'
6637
- }
6638
- ];
6639
- const { dataset: finalDataset, unfoldInfo } = unfoldDimensions(foldedDataset, dims, [
6640
- {
6641
- id: foldMeasureValue,
6642
- alias: i18n`指标值`
6643
- }
6644
- ], 0, unfoldDimensionGroup, unfoldDimensionGroupId, foldMeasureId);
6645
- return {
6646
- dataset: finalDataset,
6647
- foldInfo,
6648
- unfoldInfo
6649
- };
6650
- }
6651
- };
6652
- const reshapeTo1D1M = (advancedVSeed, context)=>{
6653
- const result = {
6654
- ...advancedVSeed
6655
- };
6656
- const { vseed } = context;
6657
- const { dataset } = vseed;
6658
- const { dimensions, measures } = advancedVSeed;
6659
- if (!measures || !dimensions || !dataset) return result;
6660
- if (0 === measures.length) throw new Error('measures can not be empty');
6661
- const { dataset: newDatasets, foldInfo, unfoldInfo } = dataReshapeFor1D1M(dataset, dimensions, measures);
6662
- return {
6663
- ...result,
6664
- dataset: newDatasets,
6665
- datasetReshapeInfo: [
6666
- {
6667
- id: '1D1M',
6668
- index: 0,
6669
- foldInfo,
6670
- unfoldInfo
6671
- }
6672
- ]
6673
- };
6060
+ dualChartTypeSecondary,
6061
+ datasetSecondary,
6062
+ labelSecondary,
6063
+ tooltipSecondary,
6064
+ progressive,
6065
+ barStyle_barStyle,
6066
+ pointStyle_pointStyle,
6067
+ pointStateDimensionHover,
6068
+ lineStyle_lineStyle,
6069
+ areaStyle_areaStyle
6070
+ ]),
6071
+ xBand,
6072
+ yLinearPrimary,
6073
+ yLinearSecondary,
6074
+ color_color,
6075
+ background_backgroundColor,
6076
+ verticalCrosshairRect,
6077
+ annotationPoint_annotationPoint,
6078
+ annotationVerticalLine_annotationVerticalLine,
6079
+ annotationHorizontalLine_annotationHorizontalLine,
6080
+ annotationArea_annotationArea
6081
+ ]),
6082
+ pivotRowDimensions,
6083
+ pivotColumnDimensions,
6084
+ pivotDiscreteLegend
6085
+ ];
6086
+ const dualAxisSpecPipeline = [
6087
+ pivotAdapter_pivotAdapter(dualAxis, pivotDualAxis)
6088
+ ];
6089
+ const registerDualAxis = ()=>{
6090
+ Builder._advancedPipelineMap.dualAxis = dualAxisAdvancedPipeline;
6091
+ Builder._specPipelineMap.dualAxis = dualAxisSpecPipeline;
6674
6092
  };
6675
- const pivotReshapeTo1D1M = (advancedVSeed, context)=>{
6676
- const result = {
6677
- ...advancedVSeed
6678
- };
6093
+ const encodingForPie = (advancedVSeed, context)=>{
6679
6094
  const { vseed } = context;
6680
- const { dataset } = vseed;
6681
- const { measures } = advancedVSeed;
6682
- const dimensions = advancedVSeed.dimensions;
6683
- if (!measures || !dimensions) return result;
6684
- const measureGroups = [];
6685
- if (measures) measures.forEach((measure)=>{
6686
- if (measure.children && measure.children.length > 0) measureGroups.push(measure);
6687
- });
6688
- const newDatasets = [];
6689
- const datasetReshapeInfo = [];
6690
- measureGroups.forEach((measureGroup, index)=>{
6691
- const measures = measureGroup.children;
6692
- if (!measures) return;
6693
- const commonDimensions = dimensions.filter((dim)=>'dimension' === dim.location);
6694
- const groupId = measureGroup.id;
6695
- const { dataset: newSubDataset, foldInfo, unfoldInfo } = dataReshapeFor1D1M(dataset, commonDimensions, measures, {
6696
- foldMeasureId: FoldMeasureId,
6697
- foldMeasureName: FoldMeasureName,
6698
- foldMeasureValue: FoldMeasureValue + groupId,
6699
- unfoldDimensionGroup: UnfoldDimensionGroup
6700
- });
6701
- const reshapeInfo = {
6702
- id: groupId,
6703
- index,
6704
- foldInfo,
6705
- unfoldInfo
6706
- };
6707
- newDatasets.push(newSubDataset);
6708
- datasetReshapeInfo.push(reshapeInfo);
6709
- });
6710
- return {
6711
- ...result,
6712
- dataset: newDatasets,
6713
- datasetReshapeInfo: datasetReshapeInfo
6095
+ const { dimensions } = advancedVSeed;
6096
+ if (!dimensions) return advancedVSeed;
6097
+ const encoding = vseed.encoding;
6098
+ if (encoding) return {
6099
+ ...advancedVSeed,
6100
+ encoding: {
6101
+ ...encoding
6102
+ }
6714
6103
  };
6715
- };
6716
- const encodingPie = (advancedVSeed)=>{
6717
- const result = {
6718
- ...advancedVSeed
6104
+ const mergedEncoding = {
6105
+ angle: dimensions.slice(0, 1).map((item)=>item.id),
6106
+ color: dimensions.slice(0).map((item)=>item.id),
6107
+ detail: dimensions.slice(0).map((item)=>item.id),
6108
+ tooltip: dimensions.map((item)=>item.id),
6109
+ label: [],
6110
+ row: [],
6111
+ column: []
6719
6112
  };
6720
- const { datasetReshapeInfo } = advancedVSeed;
6721
- if (!datasetReshapeInfo) return result;
6722
- const encoding = datasetReshapeInfo.reduce((prev, cur)=>{
6723
- const { foldInfo, unfoldInfo } = cur;
6724
- const radius = [
6725
- foldInfo.measureValue
6726
- ];
6727
- const angle = [
6728
- unfoldInfo.groupId
6729
- ];
6730
- const group = [
6731
- unfoldInfo.groupId
6732
- ];
6733
- const color = [
6734
- unfoldInfo.groupId
6735
- ];
6736
- return [
6737
- ...prev,
6738
- {
6739
- angle,
6740
- radius,
6741
- group,
6742
- color
6743
- }
6744
- ];
6745
- }, []);
6746
6113
  return {
6747
- ...result,
6748
- encoding
6114
+ ...advancedVSeed,
6115
+ encoding: mergedEncoding
6749
6116
  };
6750
6117
  };
6751
6118
  const pieAdvancedPipeline = [
6752
6119
  initAdvancedVSeed_initAdvancedVSeed,
6753
6120
  autoMeasures_autoMeasures,
6754
6121
  autoDimensions_autoDimensions,
6122
+ encodingForPie,
6755
6123
  pivotAdapter([
6756
- reshapeTo1D1M
6124
+ reshapeWithEncoding
6757
6125
  ], [
6758
- pivotReshapeTo1D1M
6126
+ pivotReshapeWithEncoding
6759
6127
  ]),
6760
- encodingPie,
6761
6128
  pieConfig,
6762
6129
  theme_theme,
6763
6130
  annotation_annotation
@@ -6767,15 +6134,15 @@ const initPie = (spec, context)=>{
6767
6134
  ...spec
6768
6135
  };
6769
6136
  const { advancedVSeed } = context;
6770
- const { encoding, dataset } = advancedVSeed;
6771
- if (!encoding[0].angle || !encoding[0].radius || !encoding[0].group) return result;
6137
+ const { datasetReshapeInfo, dataset } = advancedVSeed;
6138
+ const { unfoldInfo, foldInfo } = datasetReshapeInfo[0];
6772
6139
  const showStroke = dataset.length <= 30;
6773
6140
  result.type = 'pie';
6774
6141
  result.outerRadius = 0.8;
6775
6142
  result.innerRadius = 0;
6776
- result.valueField = encoding[0].radius[0];
6777
- result.categoryField = encoding[0].angle[0];
6778
- result.seriesField = encoding[0].group[0];
6143
+ result.valueField = foldInfo.measureValue;
6144
+ result.categoryField = unfoldInfo.encodingAngle;
6145
+ result.seriesField = unfoldInfo.encodingColorId;
6779
6146
  result.padding = 0;
6780
6147
  result.region = [
6781
6148
  {
@@ -6844,12 +6211,12 @@ const donutAdvancedPipeline = [
6844
6211
  initAdvancedVSeed_initAdvancedVSeed,
6845
6212
  autoMeasures_autoMeasures,
6846
6213
  autoDimensions_autoDimensions,
6214
+ encodingForPie,
6847
6215
  pivotAdapter([
6848
- reshapeTo1D1M
6216
+ reshapeWithEncoding
6849
6217
  ], [
6850
- pivotReshapeTo1D1M
6218
+ pivotReshapeWithEncoding
6851
6219
  ]),
6852
- encodingPie,
6853
6220
  donutConfig,
6854
6221
  theme_theme,
6855
6222
  annotation_annotation
@@ -6859,15 +6226,15 @@ const initDonut = (spec, context)=>{
6859
6226
  ...spec
6860
6227
  };
6861
6228
  const { advancedVSeed } = context;
6862
- const { encoding, dataset } = advancedVSeed;
6863
- if (!encoding[0].angle || !encoding[0].radius || !encoding[0].group) return result;
6229
+ const { datasetReshapeInfo, dataset } = advancedVSeed;
6230
+ const { foldInfo, unfoldInfo } = datasetReshapeInfo[0];
6864
6231
  const showStroke = dataset.length <= 30;
6865
6232
  result.type = 'pie';
6866
6233
  result.outerRadius = 0.8;
6867
6234
  result.innerRadius = 0.8 * result.outerRadius;
6868
- result.valueField = encoding[0].radius[0];
6869
- result.categoryField = encoding[0].angle[0];
6870
- result.seriesField = encoding[0].group[0];
6235
+ result.valueField = foldInfo.measureValue;
6236
+ result.categoryField = unfoldInfo.encodingDetail;
6237
+ result.seriesField = unfoldInfo.encodingColorId;
6871
6238
  result.padding = 0;
6872
6239
  result.region = [
6873
6240
  {
@@ -6931,54 +6298,52 @@ const registerDonut = ()=>{
6931
6298
  Builder._advancedPipelineMap.donut = donutAdvancedPipeline;
6932
6299
  Builder._specPipelineMap.donut = donutSpecPipeline;
6933
6300
  };
6934
- const encodingRose = (advancedVSeed)=>{
6935
- const result = {
6936
- ...advancedVSeed
6937
- };
6938
- const { datasetReshapeInfo, dimensions, measures } = advancedVSeed;
6939
- if (!datasetReshapeInfo || !dimensions || !measures) return result;
6940
- const angleDimension = dimensions.find((item)=>'rowDimension' !== item.location && 'columnDimension' !== item.location) || dimensions[0];
6941
- const is1D1M = 1 === dimensions.length && 1 === measures.length;
6942
- const isZeroDimension = 0 === dimensions.length;
6943
- const encoding = datasetReshapeInfo.reduce((prev, cur)=>{
6944
- const { foldInfo, unfoldInfo } = cur;
6945
- const radius = [
6946
- foldInfo.measureValue
6947
- ];
6948
- const angle = [
6949
- isZeroDimension ? foldInfo.measureName : angleDimension?.id
6950
- ];
6951
- const group = [
6952
- is1D1M ? angleDimension?.id : unfoldInfo.groupId
6953
- ];
6954
- const color = [
6955
- is1D1M ? angleDimension?.id : unfoldInfo.groupId
6301
+ const encodingForRose = (advancedVSeed, context)=>{
6302
+ const { vseed } = context;
6303
+ const { dimensions } = advancedVSeed;
6304
+ if (!dimensions) return advancedVSeed;
6305
+ const encoding = vseed.encoding;
6306
+ if (encoding) {
6307
+ const angle = encoding.angle || [];
6308
+ const detail = encoding.detail || [];
6309
+ const color = encoding.color || [];
6310
+ const mergedDetail = [
6311
+ ...color.filter((d)=>!angle.includes(d)),
6312
+ ...detail
6956
6313
  ];
6957
- return [
6958
- ...prev,
6959
- {
6960
- angle,
6961
- radius,
6962
- group,
6963
- color
6314
+ return {
6315
+ ...advancedVSeed,
6316
+ encoding: {
6317
+ ...encoding,
6318
+ detail: mergedDetail
6964
6319
  }
6965
- ];
6966
- }, []);
6320
+ };
6321
+ }
6322
+ const onlyMeasureName = 1 === dimensions.length && dimensions.find((item)=>item.id === MeasureName);
6323
+ const mergedEncoding = {
6324
+ angle: dimensions.slice(0, 1).map((item)=>item.id),
6325
+ color: dimensions.slice(1).map((item)=>item.id),
6326
+ detail: dimensions.slice(onlyMeasureName ? 0 : 1).map((item)=>item.id),
6327
+ tooltip: dimensions.map((item)=>item.id),
6328
+ label: [],
6329
+ row: [],
6330
+ column: []
6331
+ };
6967
6332
  return {
6968
- ...result,
6969
- encoding
6333
+ ...advancedVSeed,
6334
+ encoding: mergedEncoding
6970
6335
  };
6971
6336
  };
6972
6337
  const roseAdvancedPipeline = [
6973
6338
  initAdvancedVSeed_initAdvancedVSeed,
6974
6339
  autoMeasures_autoMeasures,
6975
6340
  autoDimensions_autoDimensions,
6341
+ encodingForRose,
6976
6342
  pivotAdapter([
6977
- reshapeTo2D1M
6343
+ reshapeWithEncoding
6978
6344
  ], [
6979
- pivotReshapeTo2D1M
6345
+ pivotReshapeWithEncoding
6980
6346
  ]),
6981
- encodingRose,
6982
6347
  roseConfig,
6983
6348
  theme_theme,
6984
6349
  markStyle_markStyle,
@@ -6989,13 +6354,12 @@ const initRose = (spec, context)=>{
6989
6354
  ...spec
6990
6355
  };
6991
6356
  const { advancedVSeed } = context;
6992
- const { encoding, dataset, datasetReshapeInfo } = advancedVSeed;
6993
- const { foldInfo } = datasetReshapeInfo[0];
6994
- if (!encoding[0].radius || !encoding[0].angle || !encoding[0].group) return result;
6357
+ const { dataset, datasetReshapeInfo } = advancedVSeed;
6358
+ const { foldInfo, unfoldInfo } = datasetReshapeInfo[0];
6995
6359
  result.type = 'rose';
6996
- result.categoryField = encoding[0].angle[0];
6997
- result.valueField = encoding[0].radius[0];
6998
- result.seriesField = encoding[0].group[0];
6360
+ result.categoryField = unfoldInfo.encodingAngle;
6361
+ result.seriesField = unfoldInfo.encodingColorId;
6362
+ result.valueField = foldInfo.measureValue;
6999
6363
  result.padding = 0;
7000
6364
  result.outerRadius = 0.9;
7001
6365
  result.innerRadius = 0;
@@ -7143,12 +6507,12 @@ const roseParallelAdvancedPipeline = [
7143
6507
  initAdvancedVSeed_initAdvancedVSeed,
7144
6508
  autoMeasures_autoMeasures,
7145
6509
  autoDimensions_autoDimensions,
6510
+ encodingForRose,
7146
6511
  pivotAdapter([
7147
- reshapeTo2D1M
6512
+ reshapeWithEncoding
7148
6513
  ], [
7149
- pivotReshapeTo2D1M
6514
+ pivotReshapeWithEncoding
7150
6515
  ]),
7151
- encodingRose,
7152
6516
  roseParallelConfig,
7153
6517
  theme_theme,
7154
6518
  markStyle_markStyle,
@@ -7159,16 +6523,18 @@ const initRoseParallel = (spec, context)=>{
7159
6523
  ...spec
7160
6524
  };
7161
6525
  const { advancedVSeed } = context;
7162
- const { encoding, datasetReshapeInfo, dataset } = advancedVSeed;
6526
+ const { datasetReshapeInfo, dataset, dimensions } = advancedVSeed;
7163
6527
  const { unfoldInfo, foldInfo } = datasetReshapeInfo[0];
7164
- if (!encoding[0].radius || !encoding[0].angle || !encoding[0].group) return result;
6528
+ const sameDimensionsMode = dimensions.length > 1 && dimensions.every((dim)=>dim.id === dimensions[0].id);
7165
6529
  result.type = 'rose';
7166
- result.categoryField = [
7167
- encoding[0].angle[0],
7168
- unfoldInfo.groupId
6530
+ result.categoryField = sameDimensionsMode ? [
6531
+ unfoldInfo.encodingAngle
6532
+ ] : [
6533
+ unfoldInfo.encodingAngle,
6534
+ unfoldInfo.encodingDetail
7169
6535
  ];
7170
- result.valueField = encoding[0].radius[0];
7171
- result.seriesField = encoding[0].group[0];
6536
+ result.valueField = foldInfo.measureValue;
6537
+ result.seriesField = unfoldInfo.encodingColorId;
7172
6538
  result.padding = 0;
7173
6539
  result.outerRadius = 0.9;
7174
6540
  result.innerRadius = 0;
@@ -7245,54 +6611,52 @@ const registerRoseParallel = ()=>{
7245
6611
  Builder._advancedPipelineMap.roseParallel = roseParallelAdvancedPipeline;
7246
6612
  Builder._specPipelineMap.roseParallel = roseParallelSpecPipeline;
7247
6613
  };
7248
- const encodingAR = (advancedVSeed)=>{
7249
- const result = {
7250
- ...advancedVSeed
7251
- };
7252
- const { datasetReshapeInfo, dimensions, measures } = advancedVSeed;
7253
- if (!datasetReshapeInfo || !dimensions || !measures) return result;
7254
- const angleDimension = dimensions.find((item)=>'rowDimension' !== item.location && 'columnDimension' !== item.location) || dimensions[0];
7255
- const isZeroDimension = 0 === dimensions.length;
7256
- const encoding = datasetReshapeInfo.reduce((prev, cur)=>{
7257
- const { foldInfo, unfoldInfo } = cur;
7258
- const angle = [
7259
- isZeroDimension ? foldInfo.measureName : angleDimension?.id
7260
- ];
7261
- const radius = [
7262
- foldInfo.measureValue
7263
- ];
7264
- const group = [
7265
- unfoldInfo.groupId
7266
- ];
7267
- const color = [
7268
- unfoldInfo.groupId
6614
+ const encodingForRadar = (advancedVSeed, context)=>{
6615
+ const { vseed } = context;
6616
+ const { dimensions } = advancedVSeed;
6617
+ if (!dimensions) return advancedVSeed;
6618
+ const encoding = vseed.encoding;
6619
+ if (encoding) {
6620
+ const angle = encoding.angle || [];
6621
+ const detail = encoding.detail || [];
6622
+ const color = encoding.color || [];
6623
+ const mergedDetail = [
6624
+ ...color.filter((d)=>!angle.includes(d)),
6625
+ ...detail
7269
6626
  ];
7270
- return [
7271
- ...prev,
7272
- {
7273
- angle,
7274
- radius,
7275
- group,
7276
- color
6627
+ return {
6628
+ ...advancedVSeed,
6629
+ encoding: {
6630
+ ...encoding,
6631
+ detail: mergedDetail
7277
6632
  }
7278
- ];
7279
- }, []);
6633
+ };
6634
+ }
6635
+ const mergedEncoding = {
6636
+ angle: dimensions.slice(0, 1).map((item)=>item.id),
6637
+ color: dimensions.slice(1).map((item)=>item.id),
6638
+ detail: dimensions.slice(1).map((item)=>item.id),
6639
+ tooltip: dimensions.map((item)=>item.id),
6640
+ label: [],
6641
+ row: [],
6642
+ column: []
6643
+ };
7280
6644
  return {
7281
- ...result,
7282
- encoding
6645
+ ...advancedVSeed,
6646
+ encoding: mergedEncoding
7283
6647
  };
7284
6648
  };
7285
6649
  const radarAdvancedPipeline = [
7286
6650
  initAdvancedVSeed_initAdvancedVSeed,
7287
6651
  autoMeasures_autoMeasures,
7288
6652
  autoDimensions_autoDimensions,
6653
+ encodingForRadar,
7289
6654
  pivotAdapter([
7290
- reshapeTo2D1M0Name
6655
+ reshapeWithEncoding
7291
6656
  ], [
7292
- pivotReshapeTo2D1M0Name
6657
+ pivotReshapeWithEncoding
7293
6658
  ]),
7294
- encodingAR,
7295
- sort_sortLegend,
6659
+ sortLegend_sortLegend,
7296
6660
  radarConfig,
7297
6661
  theme_theme,
7298
6662
  markStyle_markStyle,
@@ -7303,12 +6667,12 @@ const initRadar = (spec, context)=>{
7303
6667
  ...spec
7304
6668
  };
7305
6669
  const { advancedVSeed } = context;
7306
- const { encoding } = advancedVSeed;
7307
- if (!encoding[0].angle || !encoding[0].radius || !encoding[0].group) return result;
6670
+ const { datasetReshapeInfo } = advancedVSeed;
6671
+ const { unfoldInfo, foldInfo } = datasetReshapeInfo[0];
7308
6672
  result.type = 'radar';
7309
- result.angleField = encoding[0].angle[0];
7310
- result.radiusField = encoding[0].radius[0];
7311
- result.seriesField = encoding[0].group[0];
6673
+ result.angleField = unfoldInfo.encodingAngle;
6674
+ result.radiusField = foldInfo.measureValue;
6675
+ result.seriesField = unfoldInfo.encodingColorId;
7312
6676
  result.padding = 0;
7313
6677
  result.region = [
7314
6678
  {
@@ -7420,47 +6784,40 @@ const registerRadar = ()=>{
7420
6784
  Builder._advancedPipelineMap.radar = radarAdvancedPipeline;
7421
6785
  Builder._specPipelineMap.radar = radarSpecPipeline;
7422
6786
  };
7423
- const encodingFunnel = (advancedVSeed)=>{
7424
- const result = {
7425
- ...advancedVSeed
6787
+ const encodingForFunnel = (advancedVSeed, context)=>{
6788
+ const { vseed } = context;
6789
+ const { dimensions } = advancedVSeed;
6790
+ if (!dimensions) return advancedVSeed;
6791
+ const encoding = vseed.encoding;
6792
+ if (encoding) return {
6793
+ ...advancedVSeed,
6794
+ encoding: {
6795
+ ...encoding
6796
+ }
6797
+ };
6798
+ const mergedEncoding = {
6799
+ color: dimensions.slice(0).map((item)=>item.id),
6800
+ detail: dimensions.slice(0).map((item)=>item.id),
6801
+ tooltip: dimensions.map((item)=>item.id),
6802
+ label: [],
6803
+ row: [],
6804
+ column: []
7426
6805
  };
7427
- const { datasetReshapeInfo } = advancedVSeed;
7428
- if (!datasetReshapeInfo) return result;
7429
- const encoding = datasetReshapeInfo.reduce((prev, cur)=>{
7430
- const { foldInfo, unfoldInfo } = cur;
7431
- const size = [
7432
- foldInfo.measureValue
7433
- ];
7434
- const group = [
7435
- unfoldInfo.groupId
7436
- ];
7437
- const color = [
7438
- foldInfo.measureValue
7439
- ];
7440
- return [
7441
- ...prev,
7442
- {
7443
- size,
7444
- group,
7445
- color
7446
- }
7447
- ];
7448
- }, []);
7449
6806
  return {
7450
- ...result,
7451
- encoding
6807
+ ...advancedVSeed,
6808
+ encoding: mergedEncoding
7452
6809
  };
7453
6810
  };
7454
6811
  const funnelAdvancedPipeline = [
7455
6812
  initAdvancedVSeed_initAdvancedVSeed,
7456
6813
  autoMeasures_autoMeasures,
7457
6814
  autoDimensions_autoDimensions,
6815
+ encodingForFunnel,
7458
6816
  pivotAdapter([
7459
- reshapeTo1D1M
6817
+ reshapeWithEncoding
7460
6818
  ], [
7461
- pivotReshapeTo1D1M
6819
+ pivotReshapeWithEncoding
7462
6820
  ]),
7463
- encodingFunnel,
7464
6821
  funnelConfig,
7465
6822
  theme_theme,
7466
6823
  annotation_annotation
@@ -7470,11 +6827,12 @@ const initFunnel = (spec, context)=>{
7470
6827
  ...spec
7471
6828
  };
7472
6829
  const { advancedVSeed } = context;
7473
- const { encoding } = advancedVSeed;
7474
- if (!encoding[0].size || !encoding[0].group || !encoding[0].color) return result;
6830
+ const { datasetReshapeInfo } = advancedVSeed;
6831
+ const { foldInfo, unfoldInfo } = datasetReshapeInfo[0];
7475
6832
  result.type = 'funnel';
7476
- result.valueField = encoding[0].size[0];
7477
- result.categoryField = encoding[0].group[0];
6833
+ result.valueField = foldInfo.measureValue;
6834
+ result.categoryField = unfoldInfo.encodingDetail;
6835
+ result.seriesField = unfoldInfo.encodingColorId;
7478
6836
  result.padding = 0;
7479
6837
  result.isTransform = true;
7480
6838
  result.shape = 'rect';
@@ -7489,7 +6847,7 @@ const initFunnel = (spec, context)=>{
7489
6847
  style: {
7490
6848
  cornerRadius: 4,
7491
6849
  fill: {
7492
- field: encoding[0].color[0],
6850
+ field: unfoldInfo.encodingColorId,
7493
6851
  scale: 'color'
7494
6852
  }
7495
6853
  },
@@ -7505,99 +6863,13 @@ const initFunnel = (spec, context)=>{
7505
6863
  result.animation = true;
7506
6864
  return result;
7507
6865
  };
7508
- const linearColor = (spec, context)=>{
7509
- const result = {
7510
- ...spec
7511
- };
7512
- const { advancedVSeed } = context;
7513
- const { datasetReshapeInfo, chartType, encoding } = advancedVSeed;
7514
- const baseConfig = advancedVSeed.config[chartType];
7515
- if (!baseConfig || !baseConfig.color) return result;
7516
- const { color } = baseConfig;
7517
- const { colorScheme } = color;
7518
- result.color = {
7519
- type: 'linear',
7520
- domain: [
7521
- {
7522
- dataId: datasetReshapeInfo[0].id,
7523
- fields: encoding?.[0]?.color
7524
- }
7525
- ],
7526
- range: colorScheme
7527
- };
7528
- return result;
7529
- };
7530
- const colorLegend = (spec, context)=>{
7531
- const result = {
7532
- ...spec
7533
- };
7534
- const { advancedVSeed } = context;
7535
- const { chartType } = advancedVSeed;
7536
- const baseConfig = advancedVSeed.config[chartType];
7537
- const { encoding } = advancedVSeed;
7538
- if (!encoding[0].color) return result;
7539
- if (!baseConfig || !baseConfig.legend) return result;
7540
- const { legend } = baseConfig;
7541
- const { enable, position = 'bottom' } = legend || {};
7542
- const orient = [
7543
- 'bottom',
7544
- 'bottomLeft',
7545
- 'bottomRight',
7546
- 'bl',
7547
- 'br'
7548
- ].includes(position) ? 'bottom' : [
7549
- 'top',
7550
- 'topLeft',
7551
- 'topRight',
7552
- 'tl',
7553
- 'tr'
7554
- ].includes(position) ? 'top' : [
7555
- 'left',
7556
- 'leftTop',
7557
- 'leftBottom',
7558
- 'lt',
7559
- 'lb'
7560
- ].includes(position) ? 'left' : 'right';
7561
- const legendPosition = [
7562
- 'topLeft',
7563
- 'bottomLeft',
7564
- 'leftTop',
7565
- 'rightTop',
7566
- 'lt',
7567
- 'rt',
7568
- 'tl',
7569
- 'bl'
7570
- ].includes(position) ? 'start' : [
7571
- 'topRight',
7572
- 'bottomRight',
7573
- 'leftBottom',
7574
- 'rightBottom',
7575
- 'lb',
7576
- 'rb',
7577
- 'rt',
7578
- 'br'
7579
- ].includes(position) ? 'end' : 'middle';
7580
- result.legends = {
7581
- type: 'color',
7582
- visible: enable,
7583
- orient,
7584
- position: legendPosition,
7585
- field: encoding[0].color[0],
7586
- inverse: !![
7587
- 'left',
7588
- 'right'
7589
- ].includes(orient)
7590
- };
7591
- return result;
7592
- };
7593
6866
  const funnel = [
7594
6867
  initFunnel,
7595
- linearColor,
7596
6868
  background_backgroundColor,
7597
6869
  datasetXY,
7598
6870
  label_label,
7599
6871
  tooltip_tooltip,
7600
- colorLegend,
6872
+ discreteLegend,
7601
6873
  annotationPoint_annotationPoint,
7602
6874
  annotationVerticalLine_annotationVerticalLine,
7603
6875
  annotationHorizontalLine_annotationHorizontalLine,
@@ -7610,12 +6882,11 @@ const pivotFunnel = [
7610
6882
  datasetPivot,
7611
6883
  pivotIndicators_pivotIndicators([
7612
6884
  initFunnel,
7613
- linearColor,
7614
6885
  background_backgroundColor,
7615
6886
  datasetXY,
7616
6887
  label_label,
7617
6888
  tooltip_tooltip,
7618
- colorLegend,
6889
+ discreteLegend,
7619
6890
  annotationPoint_annotationPoint,
7620
6891
  annotationVerticalLine_annotationVerticalLine,
7621
6892
  annotationHorizontalLine_annotationHorizontalLine,
@@ -7631,49 +6902,42 @@ const registerFunnel = ()=>{
7631
6902
  Builder._advancedPipelineMap.funnel = funnelAdvancedPipeline;
7632
6903
  Builder._specPipelineMap.funnel = funnelSpecPipeline;
7633
6904
  };
7634
- const encodingMatrix = (advancedVSeed)=>{
7635
- const result = {
7636
- ...advancedVSeed
6905
+ const encodingForHeatmap = (advancedVSeed, context)=>{
6906
+ const { vseed } = context;
6907
+ const { dimensions } = advancedVSeed;
6908
+ if (!dimensions) return advancedVSeed;
6909
+ const encoding = vseed.encoding;
6910
+ if (encoding) return {
6911
+ ...advancedVSeed,
6912
+ encoding: {
6913
+ ...encoding
6914
+ }
6915
+ };
6916
+ const onlyMeasureName = 1 === dimensions.length && dimensions.find((item)=>item.id === MeasureName);
6917
+ const mergedEncoding = {
6918
+ x: dimensions.slice(0, 1).map((item)=>item.id),
6919
+ y: dimensions.slice(onlyMeasureName ? 0 : 1).map((item)=>item.id),
6920
+ color: dimensions.slice(0).map((item)=>item.id),
6921
+ tooltip: dimensions.map((item)=>item.id),
6922
+ label: [],
6923
+ row: [],
6924
+ column: []
7637
6925
  };
7638
- const { datasetReshapeInfo, dimensions } = advancedVSeed;
7639
- if (!datasetReshapeInfo || !dimensions) return result;
7640
- const xDimension = dimensions.find((item)=>'rowDimension' !== item.location && 'columnDimension' !== item.location) || dimensions[0];
7641
- const isZeroDimension = 0 === dimensions.length;
7642
- const encoding = datasetReshapeInfo.reduce((prev, cur)=>{
7643
- const { foldInfo, unfoldInfo } = cur;
7644
- const x = [
7645
- isZeroDimension ? foldInfo.measureName : xDimension?.id
7646
- ];
7647
- const y = [
7648
- unfoldInfo.groupName
7649
- ];
7650
- const color = [
7651
- foldInfo.measureValue
7652
- ];
7653
- return [
7654
- ...prev,
7655
- {
7656
- x,
7657
- y,
7658
- color
7659
- }
7660
- ];
7661
- }, []);
7662
6926
  return {
7663
- ...result,
7664
- encoding
6927
+ ...advancedVSeed,
6928
+ encoding: mergedEncoding
7665
6929
  };
7666
6930
  };
7667
6931
  const heatmapAdvancedPipeline = [
7668
6932
  initAdvancedVSeed_initAdvancedVSeed,
7669
6933
  autoMeasures_autoMeasures,
7670
6934
  autoDimensions_autoDimensions,
6935
+ encodingForHeatmap,
7671
6936
  pivotAdapter([
7672
- reshapeTo2D1M
6937
+ reshapeWithEncoding
7673
6938
  ], [
7674
- pivotReshapeTo2D1M
6939
+ pivotReshapeWithEncoding
7675
6940
  ]),
7676
- encodingMatrix,
7677
6941
  sortXBandAxis,
7678
6942
  heatmapConfig,
7679
6943
  theme_theme,
@@ -7695,23 +6959,20 @@ const initHeatmap = (spec, context)=>{
7695
6959
  ...spec
7696
6960
  };
7697
6961
  const { advancedVSeed } = context;
7698
- const { encoding } = advancedVSeed;
7699
- if (!encoding[0].y || !encoding[0].x || !encoding[0].color) return result;
6962
+ const { datasetReshapeInfo } = advancedVSeed;
6963
+ const { unfoldInfo, foldInfo } = datasetReshapeInfo[0];
7700
6964
  result.type = 'heatmap';
7701
6965
  result.direction = 'vertical';
7702
- result.xField = encoding[0].x[0];
7703
- result.yField = encoding[0].y[0];
7704
- result.valueField = encoding[0].color[0];
6966
+ result.xField = unfoldInfo.encodingX;
6967
+ result.yField = unfoldInfo.encodingY;
6968
+ result.seriesField = unfoldInfo.encodingColorId;
6969
+ result.valueField = foldInfo.measureValue;
7705
6970
  result.padding = 0;
7706
6971
  result.cell = {
7707
6972
  style: {
7708
6973
  shape: 'rect',
7709
6974
  stroke: '#ffffff',
7710
- lineWidth: 1,
7711
- fill: {
7712
- field: encoding[0].color[0],
7713
- scale: 'color'
7714
- }
6975
+ lineWidth: 1
7715
6976
  }
7716
6977
  };
7717
6978
  result.axes = [
@@ -7736,12 +6997,11 @@ const initHeatmap = (spec, context)=>{
7736
6997
  };
7737
6998
  const heatmap = [
7738
6999
  initHeatmap,
7739
- linearColor,
7740
7000
  background_backgroundColor,
7741
7001
  datasetXY,
7742
7002
  label_label,
7743
7003
  labelColorInversion,
7744
- colorLegend,
7004
+ discreteLegend,
7745
7005
  tooltip_tooltip,
7746
7006
  pointStyle_pointStyle,
7747
7007
  pointStateDimensionHover,
@@ -7758,12 +7018,11 @@ const pivotHeatmap = [
7758
7018
  datasetPivot,
7759
7019
  pivotIndicators_pivotIndicators([
7760
7020
  initHeatmap,
7761
- linearColor,
7762
7021
  background_backgroundColor,
7763
7022
  datasetXY,
7764
7023
  label_label,
7765
7024
  labelColorInversion,
7766
- colorLegend,
7025
+ discreteLegend,
7767
7026
  tooltip_tooltip,
7768
7027
  pointStyle_pointStyle,
7769
7028
  pointStateDimensionHover,
@@ -8031,12 +7290,6 @@ const lightTheme = ()=>{
8031
7290
  yAxis: linearAxis,
8032
7291
  crosshairLine
8033
7292
  },
8034
- areaRange: {
8035
- ...baseConfig,
8036
- xAxis: bandAxis,
8037
- yAxis: linearAxis,
8038
- crosshairLine
8039
- },
8040
7293
  scatter: {
8041
7294
  ...baseConfig,
8042
7295
  xAxis: {
@@ -8369,12 +7622,6 @@ const darkTheme = ()=>{
8369
7622
  yAxis: linearAxis,
8370
7623
  crosshairLine: crosshairLine
8371
7624
  },
8372
- areaRange: {
8373
- ...baseConfig,
8374
- xAxis: bandAxis,
8375
- yAxis: linearAxis,
8376
- crosshairLine: crosshairLine
8377
- },
8378
7625
  scatter: {
8379
7626
  ...baseConfig,
8380
7627
  xAxis: {
@@ -8472,7 +7719,6 @@ const registerAll = ()=>{
8472
7719
  registerBarPercent();
8473
7720
  registerArea();
8474
7721
  registerAreaPercent();
8475
- registerAreaRange();
8476
7722
  registerScatter();
8477
7723
  registerDualAxis();
8478
7724
  registerPie();
@@ -8506,7 +7752,6 @@ const zChartType = z["enum"]([
8506
7752
  'barParallel',
8507
7753
  'area',
8508
7754
  'areaPercent',
8509
- 'areaRange',
8510
7755
  'scatter',
8511
7756
  'dualAxis',
8512
7757
  'rose',
@@ -8604,6 +7849,12 @@ const zDualMeasure = z.object({
8604
7849
  secondaryMeasures: z.array(zMeasure).or(zMeasure).optional()
8605
7850
  });
8606
7851
  const zDualMeasures = z.array(zDualMeasure);
7852
+ const zScatterMeasure = z.object({
7853
+ id: z.string(),
7854
+ xMeasures: z.array(zMeasure).or(zMeasure).optional(),
7855
+ yMeasures: z.array(zMeasure).or(zMeasure).optional()
7856
+ });
7857
+ const zScatterMeasures = z.array(zScatterMeasure);
8607
7858
  const zFoldInfo = z.object({
8608
7859
  foldMap: z.record(z.string(), z.string().or(z.undefined())),
8609
7860
  measureId: z.string(),
@@ -8611,10 +7862,14 @@ const zFoldInfo = z.object({
8611
7862
  measureValue: z.string()
8612
7863
  });
8613
7864
  const zUnfoldInfo = z.object({
7865
+ encodingX: z.string(),
7866
+ encodingY: z.string(),
7867
+ encodingColor: z.string(),
7868
+ encodingColorId: z.string(),
7869
+ encodingDetail: z.string(),
7870
+ encodingAngle: z.string(),
8614
7871
  colorItems: z.array(z.string()),
8615
- groupId: z.string(),
8616
- colorIdMap: z.record(z.string(), z.string()),
8617
- groupName: z.string()
7872
+ colorIdMap: z.record(z.string(), z.string())
8618
7873
  });
8619
7874
  const zDatasetReshapeInfo = z.array(z.object({
8620
7875
  id: z.string(),
@@ -8623,16 +7878,21 @@ const zDatasetReshapeInfo = z.array(z.object({
8623
7878
  foldInfoList: z.array(zFoldInfo).nullish(),
8624
7879
  unfoldInfo: zUnfoldInfo
8625
7880
  }));
8626
- const zEncoding = z.array(z.object({
7881
+ const zEncoding = z.object({
8627
7882
  x: z.array(z.string()).nullish(),
8628
7883
  y: z.array(z.string()).nullish(),
8629
- color: z.array(z.string()).nullish(),
8630
- group: z.array(z.string()).nullish(),
8631
7884
  angle: z.array(z.string()).nullish(),
8632
7885
  radius: z.array(z.string()).nullish(),
7886
+ detail: z.array(z.string()).nullish(),
7887
+ color: z.array(z.string()).nullish(),
7888
+ size: z.array(z.string()).nullish(),
8633
7889
  tooltip: z.array(z.string()).nullish(),
8634
- size: z.array(z.string()).nullish()
8635
- }));
7890
+ label: z.array(z.string()).nullish(),
7891
+ row: z.array(z.string()).nullish(),
7892
+ column: z.array(z.string()).nullish(),
7893
+ group: z.array(z.string()).nullish().describe("\u5DF2\u5F03\u7528, \u8BF7\u4F7F\u7528\u989C\u8272\u66FF\u4EE3")
7894
+ });
7895
+ const zEncodings = z.array(zEncoding);
8636
7896
  const zXBandAxis = z.object({
8637
7897
  visible: z.boolean().default(true).nullish(),
8638
7898
  labelAutoHide: z.boolean().default(true).nullish(),
@@ -8895,7 +8155,6 @@ const zAreaConfig = z.object({
8895
8155
  crosshairLine: zCrosshairLine.nullish()
8896
8156
  });
8897
8157
  const zAreaPercentConfig = zAreaConfig;
8898
- const zAreaRangeConfig = zAreaConfig;
8899
8158
  const zDualAxisConfig = z.object({
8900
8159
  backgroundColor: zBackgroundColor.nullish(),
8901
8160
  label: zLabel.nullish(),
@@ -8950,7 +8209,6 @@ const zConfig = z.object({
8950
8209
  barPercent: zBarPercentConfig.nullish(),
8951
8210
  area: zAreaConfig.nullish(),
8952
8211
  areaPercent: zAreaPercentConfig.nullish(),
8953
- areaRange: zAreaRangeConfig.nullish(),
8954
8212
  scatter: zScatterConfig.nullish(),
8955
8213
  dualAxis: zDualAxisConfig.nullish(),
8956
8214
  rose: zRoseConfig.nullish(),
@@ -9389,6 +8647,7 @@ const zPivotTable = z.object({
9389
8647
  const zLine = z.object({
9390
8648
  chartType: z.literal('line'),
9391
8649
  dataset: zDataset.nullish(),
8650
+ encoding: zEncoding.nullish(),
9392
8651
  dimensions: zDimensions.nullish(),
9393
8652
  measures: zMeasureTree.nullish(),
9394
8653
  backgroundColor: zBackgroundColor.nullish(),
@@ -9413,6 +8672,7 @@ const zLine = z.object({
9413
8672
  const zColumn = z.object({
9414
8673
  chartType: z.literal('column'),
9415
8674
  dataset: zDataset.nullish(),
8675
+ encoding: zEncoding.nullish(),
9416
8676
  dimensions: zDimensions.nullish(),
9417
8677
  measures: zMeasureTree.nullish(),
9418
8678
  backgroundColor: zBackgroundColor.nullish(),
@@ -9435,6 +8695,7 @@ const zColumn = z.object({
9435
8695
  const zColumnParallel = z.object({
9436
8696
  chartType: z.literal('columnParallel'),
9437
8697
  dataset: zDataset.nullish(),
8698
+ encoding: zEncoding.nullish(),
9438
8699
  dimensions: zDimensions.nullish(),
9439
8700
  measures: zMeasureTree.nullish(),
9440
8701
  backgroundColor: zBackgroundColor.nullish(),
@@ -9457,6 +8718,7 @@ const zColumnParallel = z.object({
9457
8718
  const zColumnPercent = z.object({
9458
8719
  chartType: z.literal('columnPercent'),
9459
8720
  dataset: zDataset.nullish(),
8721
+ encoding: zEncoding.nullish(),
9460
8722
  dimensions: zDimensions.nullish(),
9461
8723
  measures: zMeasureTree.nullish(),
9462
8724
  backgroundColor: zBackgroundColor.nullish(),
@@ -9479,6 +8741,7 @@ const zColumnPercent = z.object({
9479
8741
  const zBar = z.object({
9480
8742
  chartType: z.literal('bar'),
9481
8743
  dataset: zDataset.nullish(),
8744
+ encoding: zEncoding.nullish(),
9482
8745
  dimensions: zDimensions.nullish(),
9483
8746
  measures: zMeasureTree.nullish(),
9484
8747
  backgroundColor: zBackgroundColor.nullish(),
@@ -9501,6 +8764,7 @@ const zBar = z.object({
9501
8764
  const zBarParallel = z.object({
9502
8765
  chartType: z.literal('barParallel'),
9503
8766
  dataset: zDataset.nullish(),
8767
+ encoding: zEncoding.nullish(),
9504
8768
  dimensions: zDimensions.nullish(),
9505
8769
  measures: zMeasureTree.nullish(),
9506
8770
  backgroundColor: zBackgroundColor.nullish(),
@@ -9523,6 +8787,7 @@ const zBarParallel = z.object({
9523
8787
  const zBarPercent = z.object({
9524
8788
  chartType: z.literal('barPercent'),
9525
8789
  dataset: zDataset.nullish(),
8790
+ encoding: zEncoding.nullish(),
9526
8791
  dimensions: zDimensions.nullish(),
9527
8792
  measures: zMeasureTree.nullish(),
9528
8793
  backgroundColor: zBackgroundColor.nullish(),
@@ -9545,6 +8810,7 @@ const zBarPercent = z.object({
9545
8810
  const zArea = z.object({
9546
8811
  chartType: z.literal('area'),
9547
8812
  dataset: zDataset.nullish(),
8813
+ encoding: zEncoding.nullish(),
9548
8814
  dimensions: zDimensions.nullish(),
9549
8815
  measures: zMeasureTree.nullish(),
9550
8816
  backgroundColor: zBackgroundColor.nullish(),
@@ -9568,6 +8834,7 @@ const zArea = z.object({
9568
8834
  const zAreaPercent = z.object({
9569
8835
  chartType: z.literal('areaPercent'),
9570
8836
  dataset: zDataset.nullish(),
8837
+ encoding: zEncoding.nullish(),
9571
8838
  dimensions: zDimensions.nullish(),
9572
8839
  measures: zMeasureTree.nullish(),
9573
8840
  backgroundColor: zBackgroundColor.nullish(),
@@ -9588,31 +8855,13 @@ const zAreaPercent = z.object({
9588
8855
  annotationArea: z.array(zAnnotationArea).or(zAnnotationArea).nullish(),
9589
8856
  locale: zLocale.nullish()
9590
8857
  });
9591
- const zAreaRange = z.object({
9592
- chartType: z.literal('areaRange'),
9593
- dataset: zDataset.nullish(),
9594
- dimensions: zDimensions.nullish(),
9595
- measures: zMeasureTree.nullish(),
9596
- backgroundColor: zBackgroundColor.nullish(),
9597
- label: zLabel.nullish(),
9598
- xAxis: zXBandAxis.nullish(),
9599
- yAxis: zYLinearAxis.nullish(),
9600
- crosshairLine: zCrosshairLine.nullish(),
9601
- theme: zTheme.nullish(),
9602
- pointStyle: z.array(zPointStyle).or(zPointStyle).nullish(),
9603
- lineStyle: z.array(zLineStyle).or(zLineStyle).nullish(),
9604
- areaStyle: z.array(zAreaStyle).or(zAreaStyle).nullish(),
9605
- annotationPoint: z.array(zAnnotationPoint).or(zAnnotationPoint).nullish(),
9606
- annotationVerticalLine: z.array(zAnnotationVerticalLine).or(zAnnotationVerticalLine).nullish(),
9607
- annotationHorizontalLine: z.array(zAnnotationHorizontalLine).or(zAnnotationHorizontalLine).nullish(),
9608
- annotationArea: z.array(zAnnotationArea).or(zAnnotationArea).nullish(),
9609
- locale: zLocale.nullish()
9610
- });
9611
8858
  const zScatter = z.object({
9612
8859
  chartType: z.literal('scatter'),
9613
8860
  dataset: zDataset.nullish(),
8861
+ encoding: zEncoding.nullish(),
9614
8862
  dimensions: zDimensions.nullish(),
9615
8863
  measures: zMeasureTree.nullish(),
8864
+ scatterMeasures: zScatterMeasures.nullish(),
9616
8865
  backgroundColor: zBackgroundColor.nullish(),
9617
8866
  color: zColor.nullish(),
9618
8867
  label: zLabel.nullish(),
@@ -9662,6 +8911,7 @@ const zDualAxis = z.object({
9662
8911
  const zRose = z.object({
9663
8912
  chartType: z.literal('rose'),
9664
8913
  dataset: zDataset.nullish(),
8914
+ encoding: zEncoding.nullish(),
9665
8915
  dimensions: zDimensions.nullish(),
9666
8916
  measures: zMeasureTree.nullish(),
9667
8917
  backgroundColor: zBackgroundColor.nullish(),
@@ -9675,6 +8925,7 @@ const zRose = z.object({
9675
8925
  const zRoseParallel = z.object({
9676
8926
  chartType: z.literal('roseParallel'),
9677
8927
  dataset: zDataset.nullish(),
8928
+ encoding: zEncoding.nullish(),
9678
8929
  dimensions: zDimensions.nullish(),
9679
8930
  measures: zMeasureTree.nullish(),
9680
8931
  backgroundColor: zBackgroundColor.nullish(),
@@ -9688,6 +8939,7 @@ const zRoseParallel = z.object({
9688
8939
  const zPie = z.object({
9689
8940
  chartType: z.literal('pie'),
9690
8941
  dataset: zDataset.nullish(),
8942
+ encoding: zEncoding.nullish(),
9691
8943
  dimensions: zDimensions.nullish(),
9692
8944
  measures: zMeasureTree.nullish(),
9693
8945
  backgroundColor: zBackgroundColor.nullish(),
@@ -9701,6 +8953,7 @@ const zPie = z.object({
9701
8953
  const zDonut = z.object({
9702
8954
  chartType: z.literal('donut'),
9703
8955
  dataset: zDataset.nullish(),
8956
+ encoding: zEncoding.nullish(),
9704
8957
  dimensions: zDimensions.nullish(),
9705
8958
  measures: zMeasureTree.nullish(),
9706
8959
  backgroundColor: zBackgroundColor.nullish(),
@@ -9714,6 +8967,7 @@ const zDonut = z.object({
9714
8967
  const zRadar = z.object({
9715
8968
  chartType: z.literal('radar'),
9716
8969
  dataset: zDataset.nullish(),
8970
+ encoding: zEncoding.nullish(),
9717
8971
  dimensions: zDimensions.nullish(),
9718
8972
  measures: zMeasureTree.nullish(),
9719
8973
  backgroundColor: zBackgroundColor.nullish(),
@@ -9727,6 +8981,7 @@ const zRadar = z.object({
9727
8981
  const zFunnel = z.object({
9728
8982
  chartType: z.literal('funnel'),
9729
8983
  dataset: zDataset.nullish(),
8984
+ encoding: zEncoding.nullish(),
9730
8985
  dimensions: zDimensions.nullish(),
9731
8986
  measures: zMeasureTree.nullish(),
9732
8987
  backgroundColor: zBackgroundColor.nullish(),
@@ -9762,7 +9017,6 @@ const zVSeed = z.discriminatedUnion('chartType', [
9762
9017
  zBarPercent,
9763
9018
  zArea,
9764
9019
  zAreaPercent,
9765
- zAreaRange,
9766
9020
  zScatter,
9767
9021
  zDualAxis,
9768
9022
  zPie,
@@ -9780,6 +9034,7 @@ const zAdvancedVSeed = z.object({
9780
9034
  dimensions: zDimensionTree,
9781
9035
  measures: zMeasureTree,
9782
9036
  encoding: zEncoding,
9037
+ encodings: zEncodings,
9783
9038
  config: zConfig,
9784
9039
  analysis: zAnalysis,
9785
9040
  theme: zTheme,
@@ -9788,6 +9043,6 @@ const zAdvancedVSeed = z.object({
9788
9043
  annotation: zAnnotation,
9789
9044
  locale: zLocale
9790
9045
  });
9791
- export { Builder, FoldMeasureId, FoldMeasureName, FoldMeasureValue, FoldPrimaryMeasureValue, FoldSecondaryMeasureValue, ORIGINAL_DATA, Separator, UnfoldDimensionGroup, UnfoldDimensionGroupId, areaAdvancedPipeline, areaPercentAdvancedPipeline, areaPercentSpecPipeline, areaRangeAdvancedPipeline, areaRangeSpecPipeline, areaSpecPipeline, autoFormatter, autoNumFormatter, barAdvancedPipeline, barParallelAdvancedPipeline, barParallelSpecPipeline, barPercentAdvancedPipeline, barPercentSpecPipeline, barSpecPipeline, columnAdvancedPipeline, columnParallelAdvancedPipeline, columnParallelSpecPipeline, columnPercentAdvancedPipeline, columnPercentSpecPipeline, columnSpecPipeline, createFormatter, createNumFormatter, darkTheme, dataReshapeFor1D, dataReshapeFor1D1M, dataReshapeFor1D2M, dataReshapeFor2D1M, dataReshapeFor2D1M0Name, donutAdvancedPipeline, donutSpecPipeline, dualAxisAdvancedPipeline, dualAxisSpecPipeline, execPipeline, findAllDimensions, findAllMeasures, findDimensionById, findFirstDimension, findFirstMeasure, findMeasureById, foldMeasures, funnelAdvancedPipeline, funnelSpecPipeline, heatmapAdvancedPipeline, heatmapSpecPipeline, i18n, intl, isDimension, isDimensionGroup, isDimensionSelector, isDimensions, isMeasure, isMeasureGroup, isMeasureSelector, isMeasures, isPartialDatumSelector, isPivotChart, isPivotTable, isTable, isVChart, isVTable, isValueSelector, lightTheme, lineAdvancedPipeline, lineSpecPipeline, measureDepth, pieAdvancedPipeline, pieSpecPipeline, pivotTableAdvancedPipeline, pivotTableSpecPipeline, preorderTraverse, radarAdvancedPipeline, radarSpecPipeline, registerAll, registerArea, registerAreaPercent, registerAreaRange, registerBar, registerBarParallel, registerBarPercent, registerColumn, registerColumnParallel, registerColumnPercent, registerCustomTheme, registerDarkTheme, registerDonut, registerFunnel, registerHeatmap, registerLightTheme, registerLine, registerPie, registerPivotTable, registerRadar, registerRose, registerRoseParallel, registerScatter, registerTable, roseAdvancedPipeline, roseParallelAdvancedPipeline, roseParallelSpecPipeline, roseSpecPipeline, scatterAdvancedPipeline, scatterSpecPipeline, selector_selector as selector, tableAdvancedPipeline, tableSpecPipeline, unfoldDimensions, updateAdvanced, updateSpec, zAdvancedVSeed, zAnalysis, zAnnotation, zAnnotationArea, zAnnotationHorizontalLine, zAnnotationPoint, zAnnotationVerticalLine, zArea, zAreaConfig, zAreaPercent, zAreaPercentConfig, zAreaRange, zAreaRangeConfig, zAreaStyle, zAxis, zBackgroundColor, zBar, zBarConfig, zBarParallel, zBarParallelConfig, zBarPercent, zBarPercentConfig, zBarStyle, zChartType, zColor, zColorLegend, zColumn, zColumnConfig, zColumnParallel, zColumnParallelConfig, zColumnPercent, zColumnPercentConfig, zConfig, zCrosshairLine, zCrosshairRect, zCustomTheme, zCustomThemeConfig, zDataset, zDatasetReshapeInfo, zDatum, zDimension, zDimensionGroup, zDimensionTree, zDimensions, zDonut, zDonutConfig, zDualAxis, zDualAxisConfig, zDualChartType, zDualMeasure, zDualMeasures, zEncoding, zFoldInfo, zFunnel, zFunnelConfig, zHeatmap, zHeatmapConfig, zLabel, zLegend, zLine, zLineConfig, zLineStyle, zLinearColor, zLocale, zMarkStyle, zMeasure, zMeasureGroup, zMeasureTree, zMeasures, zNumFormat, zPie, zPieConfig, zPivotTable, zPivotTableConfig, zPointStyle, zRadar, zRadarConfig, zRose, zRoseConfig, zRoseParallel, zRoseParallelConfig, zScatter, zScatterConfig, zSort, zSortLegend, zStackCornerRadius, zTable, zTableConfig, zTheme, zTooltip, zUnfoldInfo, zVSeed, zXBandAxis, zXLinearAxis, zYBandAxis, zYLinearAxis };
9046
+ export { AngleEncoding, Builder, ColorEncoding, ColorIdEncoding, DetailEncoding, FoldMeasureId, FoldMeasureName, FoldMeasureValue, FoldPrimaryMeasureValue, FoldSecondaryMeasureValue, FoldXMeasureValue, FoldYMeasureValue, MeasureName, ORIGINAL_DATA, Separator, UnfoldDimensionGroup, UnfoldDimensionGroupId, XEncoding, YEncoding, areaAdvancedPipeline, areaPercentAdvancedPipeline, areaPercentSpecPipeline, areaSpecPipeline, autoFormatter, autoNumFormatter, barAdvancedPipeline, barParallelAdvancedPipeline, barParallelSpecPipeline, barPercentAdvancedPipeline, barPercentSpecPipeline, barSpecPipeline, columnAdvancedPipeline, columnParallelAdvancedPipeline, columnParallelSpecPipeline, columnPercentAdvancedPipeline, columnPercentSpecPipeline, columnSpecPipeline, createFormatter, createNumFormatter, darkTheme, dataReshapeByEncoding, donutAdvancedPipeline, donutSpecPipeline, dualAxisAdvancedPipeline, dualAxisSpecPipeline, execPipeline, findAllDimensions, findAllMeasures, findDimensionById, findFirstDimension, findFirstMeasure, findMeasureById, foldMeasures, funnelAdvancedPipeline, funnelSpecPipeline, heatmapAdvancedPipeline, heatmapSpecPipeline, i18n, intl, isDimension, isDimensionGroup, isDimensionSelector, isDimensions, isMeasure, isMeasureGroup, isMeasureSelector, isMeasures, isPartialDatumSelector, isPivotChart, isPivotTable, isTable, isVChart, isVTable, isValueSelector, lightTheme, lineAdvancedPipeline, lineSpecPipeline, measureDepth, pieAdvancedPipeline, pieSpecPipeline, pivotTableAdvancedPipeline, pivotTableSpecPipeline, preorderTraverse, radarAdvancedPipeline, radarSpecPipeline, registerAll, registerArea, registerAreaPercent, registerBar, registerBarParallel, registerBarPercent, registerColumn, registerColumnParallel, registerColumnPercent, registerCustomTheme, registerDarkTheme, registerDonut, registerFunnel, registerHeatmap, registerLightTheme, registerLine, registerPie, registerPivotTable, registerRadar, registerRose, registerRoseParallel, registerScatter, registerTable, roseAdvancedPipeline, roseParallelAdvancedPipeline, roseParallelSpecPipeline, roseSpecPipeline, scatterAdvancedPipeline, scatterSpecPipeline, selector_selector as selector, tableAdvancedPipeline, tableSpecPipeline, unfoldDimensions, updateAdvanced, updateSpec, zAdvancedVSeed, zAnalysis, zAnnotation, zAnnotationArea, zAnnotationHorizontalLine, zAnnotationPoint, zAnnotationVerticalLine, zArea, zAreaConfig, zAreaPercent, zAreaPercentConfig, zAreaStyle, zAxis, zBackgroundColor, zBar, zBarConfig, zBarParallel, zBarParallelConfig, zBarPercent, zBarPercentConfig, zBarStyle, zChartType, zColor, zColorLegend, zColumn, zColumnConfig, zColumnParallel, zColumnParallelConfig, zColumnPercent, zColumnPercentConfig, zConfig, zCrosshairLine, zCrosshairRect, zCustomTheme, zCustomThemeConfig, zDataset, zDatasetReshapeInfo, zDatum, zDimension, zDimensionGroup, zDimensionTree, zDimensions, zDonut, zDonutConfig, zDualAxis, zDualAxisConfig, zDualChartType, zDualMeasure, zDualMeasures, zEncoding, zEncodings, zFoldInfo, zFunnel, zFunnelConfig, zHeatmap, zHeatmapConfig, zLabel, zLegend, zLine, zLineConfig, zLineStyle, zLinearColor, zLocale, zMarkStyle, zMeasure, zMeasureGroup, zMeasureTree, zMeasures, zNumFormat, zPie, zPieConfig, zPivotTable, zPivotTableConfig, zPointStyle, zRadar, zRadarConfig, zRose, zRoseConfig, zRoseParallel, zRoseParallelConfig, zScatter, zScatterConfig, zScatterMeasure, zScatterMeasures, zSort, zSortLegend, zStackCornerRadius, zTable, zTableConfig, zTheme, zTooltip, zUnfoldInfo, zVSeed, zXBandAxis, zXLinearAxis, zYBandAxis, zYLinearAxis };
9792
9047
 
9793
9048
  //# sourceMappingURL=index.js.map