@visactor/vseed 0.0.40 → 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 +1130 -1880
  8. package/dist/index.cjs.map +1 -1
  9. package/dist/index.d.ts +1 -1
  10. package/dist/index.js +1076 -1835
  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 +1104 -1860
  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,84 +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);
1247
- const dimensionsToBeRemain = dimensions.slice(0, unfoldStartIndex);
1309
+ const unfoldDimensions = (dataset, dimensions, encoding, options)=>{
1310
+ const { foldMeasureId, separator, colorItemAsId } = options;
1248
1311
  const unfoldInfo = {
1249
- groupName: unfoldGroupName,
1250
- groupId: unfoldGroupId,
1312
+ encodingAngle: AngleEncoding,
1313
+ encodingX: XEncoding,
1314
+ encodingY: YEncoding,
1315
+ encodingDetail: DetailEncoding,
1316
+ encodingColor: ColorEncoding,
1317
+ encodingColorId: ColorIdEncoding,
1251
1318
  colorItems: [],
1252
1319
  colorIdMap: {}
1253
1320
  };
1254
- if (0 === dimensions.length || 0 === measures.length) return {
1255
- dataset,
1256
- unfoldInfo: {
1257
- groupName: unfoldGroupName,
1258
- groupId: unfoldGroupId,
1259
- colorItems: [],
1260
- colorIdMap: {}
1261
- }
1262
- };
1263
- const colorItems = [];
1264
- 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 = {};
1265
1329
  for(let i = 0; i < dataset.length; i++){
1266
1330
  const datum = dataset[i];
1267
- const colorName = generateDimGroupName(dimensionsToBeUnfolded, datum, dimensionsSeparator);
1268
- const colorId = datum[foldMeasureId] ? [
1269
- colorName,
1270
- datum[foldMeasureId]
1271
- ].join(dimensionsSeparator) : colorName;
1272
- datum[unfoldGroupName] = colorName;
1273
- datum[unfoldGroupId] = colorId;
1274
- colorItems.push(colorId);
1275
- colorMap[colorId] = colorName;
1276
- if (dimensionsToBeRemain.length > 0) for (const dim of dimensionsToBeRemain){
1277
- const dimValue = datum[dim.id];
1278
- if ('number' == typeof dimValue) datum[dim.id] = String(dimValue);
1279
- }
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);
1280
1346
  }
1281
- unfoldInfo.colorItems = unique(colorItems);
1282
- unfoldInfo.colorIdMap = colorMap;
1347
+ unfoldInfo.colorItems = Array.from(colorItems);
1348
+ unfoldInfo.colorIdMap = colorIdMap;
1283
1349
  return {
1284
1350
  dataset,
1285
1351
  unfoldInfo
1286
1352
  };
1287
1353
  };
1288
- const generateDimGroupName = (dimensionsToBeGrouped, datum, dimensionsSeparator)=>dimensionsToBeGrouped.map((dim)=>String(datum[dim.id])).join(dimensionsSeparator);
1289
- const unfoldZeroDimensions = (dataset, measures, measureName, unfoldGroupName = UnfoldDimensionGroup, unfoldGroupId = UnfoldDimensionGroupId)=>{
1290
- const unfoldInfo = {
1291
- groupName: unfoldGroupName,
1292
- groupId: unfoldGroupId,
1293
- colorItems: [],
1294
- colorIdMap: {}
1295
- };
1296
- if (0 === measures.length) return {
1297
- dataset,
1298
- unfoldInfo: {
1299
- groupName: unfoldGroupName,
1300
- groupId: unfoldGroupId,
1301
- colorItems: [],
1302
- colorIdMap: {}
1303
- }
1304
- };
1305
- const colorItems = [];
1306
- const colorMap = {};
1307
- for(let i = 0; i < dataset.length; i++){
1308
- const datum = dataset[i];
1309
- const colorName = measureName;
1310
- const colorId = measureName;
1311
- datum[unfoldGroupName] = colorName;
1312
- datum[unfoldGroupId] = colorId;
1313
- colorItems.push(colorId);
1314
- colorMap[colorId] = colorName;
1315
- }
1316
- unfoldInfo.colorItems = unique(colorItems);
1317
- unfoldInfo.colorIdMap = colorMap;
1318
- return {
1319
- dataset,
1320
- unfoldInfo
1321
- };
1354
+ const applyEncoding = (encoding, dimensions, datum, separator)=>{
1355
+ if (encoding && dimensions.length) datum[encoding] = dimensions.map((dim)=>String(datum[dim.id])).join(separator);
1322
1356
  };
1323
1357
  const emptyReshapeResult = {
1324
1358
  dataset: [],
@@ -1329,69 +1363,47 @@ const emptyReshapeResult = {
1329
1363
  measureValue: ''
1330
1364
  },
1331
1365
  unfoldInfo: {
1332
- groupName: '',
1333
- groupId: '',
1366
+ encodingAngle: AngleEncoding,
1367
+ encodingX: XEncoding,
1368
+ encodingY: YEncoding,
1369
+ encodingDetail: DetailEncoding,
1370
+ encodingColor: ColorEncoding,
1371
+ encodingColorId: ColorIdEncoding,
1334
1372
  colorItems: [],
1335
1373
  colorIdMap: {}
1336
1374
  }
1337
1375
  };
1338
- const dataReshapeFor2D1M0Name = (dataset, dimensions, measures, options)=>{
1339
- 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 || {};
1340
1378
  if (0 === dimensions.length && 0 === measures.length) return emptyReshapeResult;
1341
1379
  const { dataset: foldedDataset, foldInfo } = foldMeasures(dataset, measures, foldMeasureId, foldMeasureName, foldMeasureValue);
1342
- if (0 === dimensions.length) {
1343
- const { dataset: finalDataset, unfoldInfo } = unfoldZeroDimensions(foldedDataset, [
1344
- {
1345
- id: foldMeasureValue,
1346
- alias: i18n`指标值`
1347
- }
1348
- ], i18n`指标名称`, unfoldDimensionGroup, unfoldDimensionGroupId);
1349
- return {
1350
- dataset: finalDataset,
1351
- foldInfo,
1352
- unfoldInfo
1353
- };
1354
- }
1355
- {
1356
- const onlyOneMeasure = 1 === measures.length;
1357
- const onlyOneDimension = 1 === dimensions.length;
1358
- const dims = [
1359
- ...dimensions
1360
- ];
1361
- if (!onlyOneMeasure || onlyOneDimension) dims.push({
1362
- id: foldMeasureName,
1363
- alias: i18n`指标名称`,
1364
- location: 'dimension'
1365
- });
1366
- const { dataset: finalDataset, unfoldInfo } = unfoldDimensions(foldedDataset, dims, [
1367
- {
1368
- id: foldMeasureValue,
1369
- alias: i18n`指标值`
1370
- }
1371
- ], 1, unfoldDimensionGroup, unfoldDimensionGroupId, foldMeasureId);
1372
- return {
1373
- dataset: finalDataset,
1374
- foldInfo,
1375
- unfoldInfo
1376
- };
1377
- }
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
+ };
1378
1390
  };
1379
- const reshapeTo2D1M0Name = (advancedVSeed, context)=>{
1391
+ const reshapeWithEncoding = (advancedVSeed, context)=>{
1380
1392
  const result = {
1381
1393
  ...advancedVSeed
1382
1394
  };
1383
1395
  const { vseed } = context;
1384
- const { dataset } = vseed;
1385
- const { dimensions, measures } = advancedVSeed;
1386
- 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;
1387
1399
  if (0 === measures.length) throw new Error('measures can not be empty');
1388
- const { dataset: newDatasets, foldInfo, unfoldInfo } = dataReshapeFor2D1M0Name(dataset, dimensions, measures);
1400
+ const { dataset: newDatasets, foldInfo, unfoldInfo } = dataReshapeByEncoding(dataset, dimensions, measures, encoding);
1389
1401
  return {
1390
1402
  ...result,
1391
1403
  dataset: newDatasets,
1392
1404
  datasetReshapeInfo: [
1393
1405
  {
1394
- id: '2D1M',
1406
+ id: String(chartType),
1395
1407
  index: 0,
1396
1408
  foldInfo,
1397
1409
  unfoldInfo
@@ -1401,31 +1413,27 @@ const reshapeTo2D1M0Name = (advancedVSeed, context)=>{
1401
1413
  measures
1402
1414
  };
1403
1415
  };
1404
- const pivotReshapeTo2D1M0Name = (advancedVSeed, context)=>{
1416
+ const pivotReshapeWithEncoding = (advancedVSeed, context)=>{
1405
1417
  const result = {
1406
1418
  ...advancedVSeed
1407
1419
  };
1408
1420
  const { vseed } = context;
1409
1421
  const { dataset } = vseed;
1410
- const { measures } = advancedVSeed;
1411
- const dimensions = advancedVSeed.dimensions;
1412
- 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');
1413
1425
  const measureGroups = [];
1414
1426
  if (measures) measures.forEach((measure)=>{
1415
1427
  if (measure.children && measure.children.length > 0) measureGroups.push(measure);
1416
1428
  });
1417
- const commonDimensions = dimensions.filter((dim)=>'dimension' === dim.location);
1418
- const newDatasets = [];
1429
+ const datasets = [];
1419
1430
  const datasetReshapeInfo = [];
1420
1431
  measureGroups.forEach((measureGroup, index)=>{
1421
1432
  const measures = measureGroup.children;
1422
1433
  if (!measures) return;
1423
1434
  const groupId = measureGroup.id;
1424
- const { dataset: newSubDataset, foldInfo, unfoldInfo } = dataReshapeFor2D1M0Name(dataset, commonDimensions, measures, {
1425
- foldMeasureId: FoldMeasureId,
1426
- foldMeasureName: FoldMeasureName,
1427
- foldMeasureValue: FoldMeasureValue + groupId,
1428
- unfoldDimensionGroup: UnfoldDimensionGroup
1435
+ const { dataset: newSubDataset, foldInfo, unfoldInfo } = dataReshapeByEncoding(dataset, dimensions, measures, encoding, {
1436
+ foldMeasureValue: `${FoldMeasureValue}${groupId}`
1429
1437
  });
1430
1438
  const reshapeInfo = {
1431
1439
  id: groupId,
@@ -1433,93 +1441,60 @@ const pivotReshapeTo2D1M0Name = (advancedVSeed, context)=>{
1433
1441
  foldInfo,
1434
1442
  unfoldInfo
1435
1443
  };
1436
- newDatasets.push(newSubDataset);
1444
+ datasets.push(newSubDataset);
1437
1445
  datasetReshapeInfo.push(reshapeInfo);
1438
1446
  });
1439
1447
  return {
1440
1448
  ...result,
1441
- dataset: newDatasets,
1449
+ dataset: datasets,
1442
1450
  datasetReshapeInfo: datasetReshapeInfo
1443
1451
  };
1444
1452
  };
1445
- const encodingXY = (advancedVSeed)=>{
1446
- const result = {
1447
- ...advancedVSeed
1448
- };
1449
- const { datasetReshapeInfo, dimensions } = advancedVSeed;
1450
- if (!datasetReshapeInfo || !dimensions) return result;
1451
- const xDimension = dimensions.find((item)=>'rowDimension' !== item.location && 'columnDimension' !== item.location) || dimensions[0];
1452
- const isZeroDimension = 0 === dimensions.length;
1453
- const encoding = datasetReshapeInfo.reduce((prev, cur)=>{
1454
- const { foldInfo, unfoldInfo } = cur;
1455
- const x = [
1456
- isZeroDimension ? foldInfo.measureName : xDimension?.id
1457
- ];
1458
- const y = [
1459
- foldInfo.measureValue
1460
- ];
1461
- const group = [
1462
- unfoldInfo.groupId
1463
- ];
1464
- const color = [
1465
- foldInfo.measureName
1466
- ];
1467
- return [
1468
- ...prev,
1469
- {
1470
- x,
1471
- y,
1472
- group,
1473
- color
1474
- }
1475
- ];
1476
- }, []);
1477
- return {
1478
- ...result,
1479
- encoding
1480
- };
1481
- };
1482
1453
  const sortXBandAxis = (advancedVSeed, context)=>{
1483
1454
  const result = {
1484
1455
  ...advancedVSeed
1485
1456
  };
1486
1457
  const { vseed } = context;
1487
- const { sort: sortAxis, dataset } = vseed;
1488
- const { encoding } = advancedVSeed;
1489
- 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;
1490
1462
  if (!sortAxis || !xField) return advancedVSeed;
1491
1463
  if (!result.analysis) result.analysis = {};
1492
1464
  if (!result.analysis.orderMapping) result.analysis.orderMapping = {};
1493
- const axisOrderResult = calcOrder(sortAxis, xField, dataset);
1465
+ const axisOrderResult = calcOrder(sortAxis, xField, dataset.flat(2));
1494
1466
  result.analysis.orderMapping[xField] = axisOrderResult;
1495
1467
  return result;
1496
1468
  };
1497
- const sortYBandAxis = (advancedVSeed, context)=>{
1498
- const result = {
1499
- ...advancedVSeed
1500
- };
1501
- const { vseed } = context;
1502
- const { sort: sortAxis, dataset } = vseed;
1503
- const { encoding } = advancedVSeed;
1504
- const yField = encoding?.[0]?.y?.[0];
1505
- if (!sortAxis || !yField) return advancedVSeed;
1506
- if (!result.analysis) result.analysis = {};
1507
- if (!result.analysis.orderMapping) result.analysis.orderMapping = {};
1508
- const axisOrderResult = calcOrder(sortAxis, yField, dataset);
1509
- result.analysis.orderMapping[yField] = axisOrderResult;
1510
- 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]));
1511
1486
  };
1512
- const sort_sortLegend = (advancedVSeed, context)=>{
1487
+ const sortLegend_sortLegend = (advancedVSeed, context)=>{
1513
1488
  const result = {
1514
1489
  ...advancedVSeed
1515
1490
  };
1516
1491
  const { vseed } = context;
1517
1492
  const { sortLegend } = vseed;
1518
- const { datasetReshapeInfo } = advancedVSeed;
1519
- const groupField = datasetReshapeInfo?.[0]?.unfoldInfo?.groupId;
1493
+ const { datasetReshapeInfo, dataset } = advancedVSeed;
1494
+ const colorId = datasetReshapeInfo?.[0]?.unfoldInfo?.encodingColorId;
1520
1495
  const colorIdMap = datasetReshapeInfo?.[0]?.unfoldInfo?.colorIdMap;
1521
1496
  const colorItems = datasetReshapeInfo?.[0]?.unfoldInfo?.colorItems;
1522
- if (!sortLegend || !groupField || !colorIdMap || !colorItems) return advancedVSeed;
1497
+ if (!sortLegend || !colorId || !colorIdMap || !colorItems) return advancedVSeed;
1523
1498
  if (!result.analysis) result.analysis = {};
1524
1499
  if (!result.analysis.orderMapping) result.analysis.orderMapping = {};
1525
1500
  if (sortLegend.customOrder) {
@@ -1528,15 +1503,14 @@ const sort_sortLegend = (advancedVSeed, context)=>{
1528
1503
  return pre;
1529
1504
  }, {});
1530
1505
  const orderRes = sortLegend.customOrder.map((itemNameOrId)=>nameMap[itemNameOrId] ? nameMap[itemNameOrId] : itemNameOrId);
1531
- result.analysis.orderMapping[groupField] = orderRes;
1506
+ result.analysis.orderMapping[colorId] = orderRes;
1532
1507
  return result;
1533
1508
  }
1534
- const dataset = advancedVSeed.dataset?.flat(2);
1535
- const orderRes = calcOrder(sortLegend, groupField, dataset || []);
1536
- result.analysis.orderMapping[groupField] = orderRes;
1509
+ const orderRes = sortLegend_calcOrder(sortLegend, colorId, dataset?.flat(2) || []);
1510
+ result.analysis.orderMapping[colorId] = orderRes;
1537
1511
  return result;
1538
1512
  };
1539
- const calcOrder = (sortConfig, id, dataset)=>{
1513
+ const sortLegend_calcOrder = (sortConfig, id, dataset)=>{
1540
1514
  if (sortConfig.customOrder) return sortConfig.customOrder;
1541
1515
  const order = sortConfig.order || 'asc';
1542
1516
  const orderBy = sortConfig.orderBy;
@@ -1668,14 +1642,14 @@ const lineAdvancedPipeline = [
1668
1642
  initAdvancedVSeed_initAdvancedVSeed,
1669
1643
  autoMeasures_autoMeasures,
1670
1644
  autoDimensions_autoDimensions,
1645
+ encodingForColumn,
1671
1646
  pivotAdapter([
1672
- reshapeTo2D1M0Name
1647
+ reshapeWithEncoding
1673
1648
  ], [
1674
- pivotReshapeTo2D1M0Name
1649
+ pivotReshapeWithEncoding
1675
1650
  ]),
1676
- encodingXY,
1677
1651
  sortXBandAxis,
1678
- sort_sortLegend,
1652
+ sortLegend_sortLegend,
1679
1653
  lineConfig,
1680
1654
  theme_theme,
1681
1655
  markStyle_markStyle,
@@ -1686,13 +1660,13 @@ const initLine = (spec, context)=>{
1686
1660
  ...spec
1687
1661
  };
1688
1662
  const { advancedVSeed } = context;
1689
- const { encoding } = advancedVSeed;
1690
- if (!encoding[0].y || !encoding[0].x || !encoding[0].group) return result;
1663
+ const { datasetReshapeInfo } = advancedVSeed;
1664
+ const { foldInfo, unfoldInfo } = datasetReshapeInfo[0];
1691
1665
  result.type = 'line';
1692
1666
  result.direction = 'vertical';
1693
- result.xField = encoding[0].x[0];
1694
- result.yField = encoding[0].y[0];
1695
- result.seriesField = encoding[0].group[0];
1667
+ result.xField = unfoldInfo.encodingX;
1668
+ result.yField = foldInfo.measureValue;
1669
+ result.seriesField = unfoldInfo.encodingColorId;
1696
1670
  result.padding = 0;
1697
1671
  result.region = [
1698
1672
  {
@@ -1768,11 +1742,12 @@ const background_backgroundColor = (spec, context)=>{
1768
1742
  };
1769
1743
  const datasetXY = (spec, context)=>{
1770
1744
  const { advancedVSeed, vseed } = context;
1771
- const { encoding, analysis, datasetReshapeInfo } = advancedVSeed;
1745
+ const { analysis, datasetReshapeInfo } = advancedVSeed;
1746
+ const { unfoldInfo } = datasetReshapeInfo[0];
1772
1747
  const orderMapping = analysis?.orderMapping || {};
1773
- const angle = encoding[0]?.angle?.[0];
1774
- const x = encoding[0]?.x?.[0];
1775
- const group = encoding[0]?.group?.[0];
1748
+ const angle = unfoldInfo.encodingAngle;
1749
+ const x = unfoldInfo.encodingX;
1750
+ const colorId = unfoldInfo.encodingColorId;
1776
1751
  const id = datasetReshapeInfo[0].id;
1777
1752
  const fields = {};
1778
1753
  if (angle) fields[angle] = {
@@ -1789,14 +1764,14 @@ const datasetXY = (spec, context)=>{
1789
1764
  sortIndex: 0
1790
1765
  };
1791
1766
  }
1792
- if (group) {
1793
- const order = orderMapping[group];
1794
- if (order) fields[group] = {
1767
+ if (colorId) {
1768
+ const order = orderMapping[colorId];
1769
+ if (order) fields[colorId] = {
1795
1770
  sortIndex: 0,
1796
1771
  domain: order,
1797
1772
  lockStatisticsByDomain: true
1798
1773
  };
1799
- else fields[group] = {
1774
+ else fields[colorId] = {
1800
1775
  sortIndex: 0
1801
1776
  };
1802
1777
  }
@@ -2049,7 +2024,7 @@ const tooltip_tooltip = (spec, context)=>{
2049
2024
  } } = baseConfig;
2050
2025
  const { enable } = tooltip;
2051
2026
  const { measureId, measureValue, measureName } = datasetReshapeInfo[0].foldInfo;
2052
- const { groupName } = datasetReshapeInfo[0].unfoldInfo;
2027
+ const { encodingColor: colorName } = datasetReshapeInfo[0].unfoldInfo;
2053
2028
  result.tooltip = {
2054
2029
  visible: enable,
2055
2030
  mark: {
@@ -2070,7 +2045,7 @@ const tooltip_tooltip = (spec, context)=>{
2070
2045
  {
2071
2046
  visible: true,
2072
2047
  hasShape: true,
2073
- key: (datum)=>datum && datum[measureName || groupName] || '',
2048
+ key: (datum)=>datum && datum[measureName || colorName] || '',
2074
2049
  value: (datum)=>{
2075
2050
  if (!datum) return '';
2076
2051
  const value = datum[measureValue];
@@ -2092,7 +2067,7 @@ const tooltip_tooltip = (spec, context)=>{
2092
2067
  content: [
2093
2068
  {
2094
2069
  visible: true,
2095
- key: (datum)=>datum && datum[groupName] || '',
2070
+ key: (datum)=>datum && datum[colorName] || '',
2096
2071
  value: (datum)=>{
2097
2072
  if (!datum) return '';
2098
2073
  const value = datum[measureValue];
@@ -2430,7 +2405,8 @@ const pointStateDimensionHover = (spec)=>{
2430
2405
  const pointStateHover = (spec, context)=>{
2431
2406
  const point = spec.point || {};
2432
2407
  const { advancedVSeed } = context;
2433
- const { encoding } = advancedVSeed;
2408
+ const { datasetReshapeInfo } = advancedVSeed;
2409
+ const { unfoldInfo } = datasetReshapeInfo[0];
2434
2410
  const result = {
2435
2411
  ...spec,
2436
2412
  point: {
@@ -2441,7 +2417,7 @@ const pointStateHover = (spec, context)=>{
2441
2417
  scaleX: 1.4,
2442
2418
  scaleY: 1.4,
2443
2419
  stroke: (datum, context)=>{
2444
- const field = encoding[0]?.group?.[0];
2420
+ const field = unfoldInfo.encodingColorId;
2445
2421
  const color = context.seriesColor(datum[field]);
2446
2422
  return color;
2447
2423
  },
@@ -2455,7 +2431,8 @@ const pointStateHover = (spec, context)=>{
2455
2431
  };
2456
2432
  const lineStyle_lineStyle = (spec, context)=>{
2457
2433
  const { advancedVSeed } = context;
2458
- const { markStyle, encoding, dataset } = advancedVSeed;
2434
+ const { markStyle, datasetReshapeInfo, dataset } = advancedVSeed;
2435
+ const { unfoldInfo } = datasetReshapeInfo[0];
2459
2436
  const { lineStyle } = markStyle;
2460
2437
  if (!lineStyle) return spec;
2461
2438
  const result = {
@@ -2464,8 +2441,8 @@ const lineStyle_lineStyle = (spec, context)=>{
2464
2441
  const lineStyles = Array.isArray(lineStyle) ? lineStyle : [
2465
2442
  lineStyle
2466
2443
  ];
2467
- const group = encoding[0]?.group?.[0];
2468
- const lineGroups = groupBy(dataset, (d)=>d[group ?? '']);
2444
+ const colorId = unfoldInfo.encodingColorId;
2445
+ const lineGroups = groupBy(dataset, (d)=>d[colorId ?? '']);
2469
2446
  const customMap = lineStyles.reduce((result, style, index)=>{
2470
2447
  const { lineColor, lineColorOpacity, lineSmooth, lineStyle, lineWidth = 2, lineVisible = true } = style;
2471
2448
  const dashSegment = 2 * lineWidth;
@@ -2486,7 +2463,7 @@ const lineStyle_lineStyle = (spec, context)=>{
2486
2463
  [`custom${index + 1}`]: {
2487
2464
  level: index + 1,
2488
2465
  filter: (datum)=>{
2489
- const lineData = lineGroups[datum[group ?? '']];
2466
+ const lineData = lineGroups[datum[colorId ?? '']];
2490
2467
  for (const d of lineData)if (selector_selector(d, style.selector)) return true;
2491
2468
  return false;
2492
2469
  },
@@ -2581,7 +2558,8 @@ const annotationPoint_annotationPoint = (spec, context)=>{
2581
2558
  };
2582
2559
  const annotationVerticalLine_annotationVerticalLine = (spec, context)=>{
2583
2560
  const { advancedVSeed } = context;
2584
- const { annotation, encoding } = advancedVSeed;
2561
+ const { annotation, datasetReshapeInfo } = advancedVSeed;
2562
+ const { unfoldInfo } = datasetReshapeInfo[0];
2585
2563
  if (!annotation || !annotation.annotationVerticalLine) return spec;
2586
2564
  const { annotationVerticalLine } = annotation;
2587
2565
  const annotationVerticalLineList = Array.isArray(annotationVerticalLine) ? annotationVerticalLine : [
@@ -2661,7 +2639,7 @@ const annotationVerticalLine_annotationVerticalLine = (spec, context)=>{
2661
2639
  }
2662
2640
  const selectedData = selectorPoint ? dataset.filter((datum)=>selector_selector(datum, selectorPoint)) : [];
2663
2641
  return selectedData.map((datum)=>{
2664
- const x = encoding[0]?.x?.[0];
2642
+ const x = unfoldInfo.encodingX;
2665
2643
  if (!x) return {};
2666
2644
  return generateOneMarkLine(datum[x]);
2667
2645
  });
@@ -2678,7 +2656,8 @@ const annotationVerticalLine_annotationVerticalLine = (spec, context)=>{
2678
2656
  };
2679
2657
  const annotationHorizontalLine_annotationHorizontalLine = (spec, context)=>{
2680
2658
  const { advancedVSeed } = context;
2681
- const { annotation, encoding } = advancedVSeed;
2659
+ const { annotation, datasetReshapeInfo } = advancedVSeed;
2660
+ const { unfoldInfo } = datasetReshapeInfo[0];
2682
2661
  if (!annotation || !annotation.annotationHorizontalLine) return spec;
2683
2662
  const { annotationHorizontalLine } = annotation;
2684
2663
  const annotationVerticalLineList = Array.isArray(annotationHorizontalLine) ? annotationHorizontalLine : [
@@ -2758,7 +2737,7 @@ const annotationHorizontalLine_annotationHorizontalLine = (spec, context)=>{
2758
2737
  }
2759
2738
  const selectedData = selectorPoint ? dataset.filter((datum)=>selector_selector(datum, selectorPoint)) : [];
2760
2739
  return selectedData.map((datum)=>{
2761
- const y = encoding[0]?.y?.[0];
2740
+ const y = unfoldInfo.encodingY;
2762
2741
  if (!y) return {};
2763
2742
  return generateOneMarkLine(datum[y]);
2764
2743
  });
@@ -3039,13 +3018,10 @@ const pivotIndicators_pivotIndicators = (chartPipeline)=>(spec, context)=>{
3039
3018
  ...spec
3040
3019
  };
3041
3020
  const { advancedVSeed } = context;
3042
- const { measures, datasetReshapeInfo, encoding, dataset } = advancedVSeed;
3021
+ const { measures, datasetReshapeInfo, dataset } = advancedVSeed;
3043
3022
  const colorItems = unique(datasetReshapeInfo.flatMap((d)=>d.unfoldInfo.colorItems));
3044
3023
  const indicators = datasetReshapeInfo.map((reshapeInfo, index)=>{
3045
3024
  const measure = measures?.find((d)=>d.id === reshapeInfo.id);
3046
- const newEncoding = [
3047
- encoding[index]
3048
- ];
3049
3025
  const newDataset = dataset[index];
3050
3026
  const newDatasetReshapeInfo = [
3051
3027
  {
@@ -3061,8 +3037,7 @@ const pivotIndicators_pivotIndicators = (chartPipeline)=>(spec, context)=>{
3061
3037
  advancedVSeed: {
3062
3038
  ...advancedVSeed,
3063
3039
  datasetReshapeInfo: newDatasetReshapeInfo,
3064
- dataset: newDataset,
3065
- encoding: newEncoding
3040
+ dataset: newDataset
3066
3041
  }
3067
3042
  };
3068
3043
  const chartSpec = execPipeline(chartPipeline, newContext, {});
@@ -3248,7 +3223,7 @@ const pivotDiscreteLegend = (spec, context)=>{
3248
3223
  }
3249
3224
  },
3250
3225
  label: {
3251
- formatMethod: (value)=>colorIdMap[String(value)] ?? value,
3226
+ formatMethod: (value)=>colorIdMap[value] ?? value,
3252
3227
  style: {
3253
3228
  fontSize: labelFontSize,
3254
3229
  fill: labelFontColor,
@@ -3331,151 +3306,18 @@ const registerLine = ()=>{
3331
3306
  Builder._advancedPipelineMap.line = lineAdvancedPipeline;
3332
3307
  Builder._specPipelineMap.line = lineSpecPipeline;
3333
3308
  };
3334
- const dataReshapeFor2D1M_emptyReshapeResult = {
3335
- dataset: [],
3336
- foldInfo: {
3337
- foldMap: {},
3338
- measureId: '',
3339
- measureName: '',
3340
- measureValue: ''
3341
- },
3342
- unfoldInfo: {
3343
- groupName: '',
3344
- groupId: '',
3345
- colorItems: [],
3346
- colorIdMap: {}
3347
- }
3348
- };
3349
- const dataReshapeFor2D1M = (dataset, dimensions, measures, options)=>{
3350
- const { foldMeasureId = FoldMeasureId, foldMeasureName = FoldMeasureName, foldMeasureValue = FoldMeasureValue, unfoldDimensionGroup = UnfoldDimensionGroup, unfoldDimensionGroupId = UnfoldDimensionGroupId } = options || {};
3351
- if (0 === dimensions.length && 0 === measures.length) return dataReshapeFor2D1M_emptyReshapeResult;
3352
- const { dataset: foldedDataset, foldInfo } = foldMeasures(dataset, measures, foldMeasureId, foldMeasureName, foldMeasureValue);
3353
- if (0 === dimensions.length) {
3354
- const { dataset: finalDataset, unfoldInfo } = unfoldDimensions(foldedDataset, [
3355
- {
3356
- id: foldMeasureId,
3357
- alias: i18n`指标Id`,
3358
- location: 'dimension'
3359
- },
3360
- {
3361
- id: foldMeasureName,
3362
- alias: i18n`指标名称`,
3363
- location: 'dimension'
3364
- }
3365
- ], [
3366
- {
3367
- id: foldMeasureValue,
3368
- alias: i18n`指标值`
3369
- }
3370
- ], 1, unfoldDimensionGroup, unfoldDimensionGroupId, foldMeasureId);
3371
- return {
3372
- dataset: finalDataset,
3373
- foldInfo,
3374
- unfoldInfo
3375
- };
3376
- }
3377
- {
3378
- const onlyOneMeasure = 1 === measures.length;
3379
- const onlyOneDimension = 1 === dimensions.length;
3380
- const dims = [
3381
- ...dimensions
3382
- ];
3383
- if (!onlyOneMeasure || onlyOneDimension) dims.push({
3384
- id: foldMeasureName,
3385
- alias: i18n`指标名称`,
3386
- location: 'dimension'
3387
- });
3388
- const { dataset: finalDataset, unfoldInfo } = unfoldDimensions(foldedDataset, dims, [
3389
- {
3390
- id: foldMeasureValue,
3391
- alias: i18n`指标值`
3392
- }
3393
- ], 1, unfoldDimensionGroup, unfoldDimensionGroupId, foldMeasureId);
3394
- return {
3395
- dataset: finalDataset,
3396
- foldInfo,
3397
- unfoldInfo
3398
- };
3399
- }
3400
- };
3401
- const reshapeTo2D1M = (advancedVSeed, context)=>{
3402
- const result = {
3403
- ...advancedVSeed
3404
- };
3405
- const { vseed } = context;
3406
- const { dataset } = vseed;
3407
- const { dimensions, measures } = advancedVSeed;
3408
- if (!measures || !dimensions || !dataset) return result;
3409
- if (0 === measures.length) throw new Error('measures can not be empty');
3410
- const { dataset: newDatasets, foldInfo, unfoldInfo } = dataReshapeFor2D1M(dataset, dimensions, measures);
3411
- return {
3412
- ...result,
3413
- dataset: newDatasets,
3414
- datasetReshapeInfo: [
3415
- {
3416
- id: '2D1M',
3417
- index: 0,
3418
- foldInfo,
3419
- unfoldInfo
3420
- }
3421
- ],
3422
- dimensions,
3423
- measures
3424
- };
3425
- };
3426
- const pivotReshapeTo2D1M = (advancedVSeed, context)=>{
3427
- const result = {
3428
- ...advancedVSeed
3429
- };
3430
- const { vseed } = context;
3431
- const { dataset } = vseed;
3432
- const { measures } = advancedVSeed;
3433
- const dimensions = advancedVSeed.dimensions;
3434
- if (!measures || !dimensions) return result;
3435
- const measureGroups = [];
3436
- if (measures) measures.forEach((measure)=>{
3437
- if (measure.children && measure.children.length > 0) measureGroups.push(measure);
3438
- });
3439
- const commonDimensions = dimensions.filter((dim)=>'dimension' === dim.location);
3440
- const newDatasets = [];
3441
- const datasetReshapeInfo = [];
3442
- measureGroups.forEach((measureGroup, index)=>{
3443
- const measures = measureGroup.children;
3444
- if (!measures) return;
3445
- const groupId = measureGroup.id;
3446
- const { dataset: newSubDataset, foldInfo, unfoldInfo } = dataReshapeFor2D1M(dataset, commonDimensions, measures, {
3447
- foldMeasureId: FoldMeasureId,
3448
- foldMeasureName: FoldMeasureName,
3449
- foldMeasureValue: FoldMeasureValue + groupId,
3450
- unfoldDimensionGroup: UnfoldDimensionGroup
3451
- });
3452
- const reshapeInfo = {
3453
- id: groupId,
3454
- index,
3455
- foldInfo,
3456
- unfoldInfo
3457
- };
3458
- newDatasets.push(newSubDataset);
3459
- datasetReshapeInfo.push(reshapeInfo);
3460
- });
3461
- return {
3462
- ...result,
3463
- dataset: newDatasets,
3464
- datasetReshapeInfo: datasetReshapeInfo
3465
- };
3466
- };
3467
3309
  const columnAdvancedPipeline = [
3468
3310
  initAdvancedVSeed_initAdvancedVSeed,
3469
3311
  autoMeasures_autoMeasures,
3470
3312
  autoDimensions_autoDimensions,
3313
+ encodingForColumn,
3471
3314
  pivotAdapter([
3472
- reshapeTo2D1M
3315
+ reshapeWithEncoding
3473
3316
  ], [
3474
- pivotReshapeTo2D1M
3317
+ pivotReshapeWithEncoding
3475
3318
  ]),
3476
- encodingXY,
3477
3319
  sortXBandAxis,
3478
- sort_sortLegend,
3320
+ sortLegend_sortLegend,
3479
3321
  columnConfig,
3480
3322
  theme_theme,
3481
3323
  markStyle_markStyle,
@@ -3486,13 +3328,13 @@ const initColumn = (spec, context)=>{
3486
3328
  ...spec
3487
3329
  };
3488
3330
  const { advancedVSeed } = context;
3489
- const { encoding } = advancedVSeed;
3490
- if (!encoding[0].y || !encoding[0].x || !encoding[0].group) return result;
3331
+ const { datasetReshapeInfo } = advancedVSeed;
3332
+ const { unfoldInfo, foldInfo } = datasetReshapeInfo[0];
3491
3333
  result.type = 'bar';
3492
3334
  result.direction = 'vertical';
3493
- result.xField = encoding[0].x[0];
3494
- result.yField = encoding[0].y[0];
3495
- result.seriesField = encoding[0].group[0];
3335
+ result.xField = unfoldInfo.encodingX;
3336
+ result.yField = foldInfo.measureValue;
3337
+ result.seriesField = unfoldInfo.encodingColorId;
3496
3338
  result.padding = 0;
3497
3339
  result.region = [
3498
3340
  {
@@ -3812,14 +3654,14 @@ const columnParallelAdvancedPipeline = [
3812
3654
  initAdvancedVSeed_initAdvancedVSeed,
3813
3655
  autoMeasures_autoMeasures,
3814
3656
  autoDimensions_autoDimensions,
3657
+ encodingForColumn,
3815
3658
  pivotAdapter([
3816
- reshapeTo2D1M
3659
+ reshapeWithEncoding
3817
3660
  ], [
3818
- pivotReshapeTo2D1M
3661
+ pivotReshapeWithEncoding
3819
3662
  ]),
3820
- encodingXY,
3821
3663
  sortXBandAxis,
3822
- sort_sortLegend,
3664
+ sortLegend_sortLegend,
3823
3665
  columnParallelConfig,
3824
3666
  theme_theme,
3825
3667
  markStyle_markStyle,
@@ -3830,20 +3672,19 @@ const initColumnParallel = (spec, context)=>{
3830
3672
  ...spec
3831
3673
  };
3832
3674
  const { advancedVSeed } = context;
3833
- const { encoding, datasetReshapeInfo, dimensions } = advancedVSeed;
3834
- const { unfoldInfo } = datasetReshapeInfo[0];
3835
- if (!encoding[0].y || !encoding[0].x || !encoding[0].group) return result;
3675
+ const { datasetReshapeInfo, dimensions } = advancedVSeed;
3676
+ const { unfoldInfo, foldInfo } = datasetReshapeInfo[0];
3836
3677
  const sameDimensionsMode = dimensions.length > 1 && dimensions.every((dim)=>dim.id === dimensions[0].id);
3837
3678
  result.type = 'bar';
3838
3679
  result.direction = 'vertical';
3839
3680
  result.xField = sameDimensionsMode ? [
3840
- encoding[0].x[0]
3681
+ unfoldInfo.encodingX
3841
3682
  ] : [
3842
- encoding[0].x[0],
3843
- unfoldInfo.groupId
3683
+ unfoldInfo.encodingX,
3684
+ unfoldInfo.encodingDetail
3844
3685
  ];
3845
- result.yField = encoding[0].y[0];
3846
- result.seriesField = encoding[0].group[0];
3686
+ result.yField = foldInfo.measureValue;
3687
+ result.seriesField = unfoldInfo.encodingColorId;
3847
3688
  result.padding = 0;
3848
3689
  result.region = [
3849
3690
  {
@@ -3910,14 +3751,14 @@ const columnPercentAdvancedPipeline = [
3910
3751
  initAdvancedVSeed_initAdvancedVSeed,
3911
3752
  autoMeasures_autoMeasures,
3912
3753
  autoDimensions_autoDimensions,
3754
+ encodingForColumn,
3913
3755
  pivotAdapter([
3914
- reshapeTo2D1M
3756
+ reshapeWithEncoding
3915
3757
  ], [
3916
- pivotReshapeTo2D1M
3758
+ pivotReshapeWithEncoding
3917
3759
  ]),
3918
- encodingXY,
3919
3760
  sortXBandAxis,
3920
- sort_sortLegend,
3761
+ sortLegend_sortLegend,
3921
3762
  columnPercentConfig,
3922
3763
  theme_theme,
3923
3764
  markStyle_markStyle,
@@ -3987,57 +3828,72 @@ const registerColumnPercent = ()=>{
3987
3828
  Builder._advancedPipelineMap.columnPercent = columnPercentAdvancedPipeline;
3988
3829
  Builder._specPipelineMap.columnPercent = columnPercentSpecPipeline;
3989
3830
  };
3990
- const encodingYX = (advancedVSeed)=>{
3991
- const result = {
3992
- ...advancedVSeed
3993
- };
3994
- const { datasetReshapeInfo, dimensions } = advancedVSeed;
3995
- if (!datasetReshapeInfo || !dimensions) return result;
3996
- const yDimension = dimensions.find((item)=>'rowDimension' !== item.location && 'columnDimension' !== item.location) || dimensions[0];
3997
- const isZeroDimension = 0 === dimensions.length;
3998
- const encoding = datasetReshapeInfo.reduce((prev, cur)=>{
3999
- const { foldInfo, unfoldInfo } = cur;
4000
- const y = [
4001
- isZeroDimension ? foldInfo.measureName : yDimension?.id
4002
- ];
4003
- const x = [
4004
- foldInfo.measureValue
4005
- ];
4006
- const group = [
4007
- unfoldInfo.groupId
4008
- ];
4009
- const color = [
4010
- 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
4011
3843
  ];
4012
- return [
4013
- ...prev,
4014
- {
4015
- x,
4016
- y,
4017
- group,
4018
- color
3844
+ return {
3845
+ ...advancedVSeed,
3846
+ encoding: {
3847
+ ...encoding,
3848
+ detail: mergedDetail
4019
3849
  }
4020
- ];
4021
- }, []);
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
+ };
4022
3862
  return {
4023
- ...result,
4024
- encoding
3863
+ ...advancedVSeed,
3864
+ encoding: mergedEncoding
4025
3865
  };
4026
3866
  };
4027
- const barAdvancedPipeline = [
4028
- initAdvancedVSeed_initAdvancedVSeed,
4029
- autoMeasures_autoMeasures,
4030
- autoDimensions_autoDimensions,
4031
- pivotAdapter([
4032
- reshapeTo2D1M
4033
- ], [
4034
- pivotReshapeTo2D1M
4035
- ]),
4036
- encodingYX,
4037
- sortYBandAxis,
4038
- sort_sortLegend,
4039
- barConfig,
4040
- theme_theme,
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,
4041
3897
  markStyle_markStyle,
4042
3898
  annotation_annotation
4043
3899
  ];
@@ -4046,13 +3902,13 @@ const initBar = (spec, context)=>{
4046
3902
  ...spec
4047
3903
  };
4048
3904
  const { advancedVSeed } = context;
4049
- const { encoding } = advancedVSeed;
4050
- if (!encoding[0].y || !encoding[0].x || !encoding[0].group) return result;
3905
+ const { datasetReshapeInfo } = advancedVSeed;
3906
+ const { unfoldInfo, foldInfo } = datasetReshapeInfo[0];
4051
3907
  result.type = 'bar';
4052
3908
  result.direction = 'horizontal';
4053
- result.yField = encoding[0].y?.[0];
4054
- result.xField = encoding[0].x?.[0];
4055
- result.seriesField = encoding[0].group?.[0];
3909
+ result.yField = unfoldInfo.encodingY;
3910
+ result.xField = foldInfo.measureValue;
3911
+ result.seriesField = unfoldInfo.encodingColorId;
4056
3912
  result.padding = 0;
4057
3913
  result.region = [
4058
3914
  {
@@ -4064,11 +3920,12 @@ const initBar = (spec, context)=>{
4064
3920
  };
4065
3921
  const datasetYX = (spec, context)=>{
4066
3922
  const { advancedVSeed, vseed } = context;
4067
- const { encoding, analysis, datasetReshapeInfo } = advancedVSeed;
3923
+ const { analysis, datasetReshapeInfo } = advancedVSeed;
3924
+ const { unfoldInfo } = datasetReshapeInfo[0];
4068
3925
  const orderMapping = analysis?.orderMapping || {};
4069
- const angle = encoding[0]?.angle?.[0];
4070
- const y = encoding[0]?.y?.[0];
4071
- const group = encoding[0]?.group?.[0];
3926
+ const angle = unfoldInfo.encodingAngle;
3927
+ const y = unfoldInfo.encodingY;
3928
+ const colorId = unfoldInfo.encodingColorId;
4072
3929
  const id = datasetReshapeInfo[0].id;
4073
3930
  const fields = {};
4074
3931
  if (angle) fields[angle] = {
@@ -4085,14 +3942,14 @@ const datasetYX = (spec, context)=>{
4085
3942
  sortIndex: 0
4086
3943
  };
4087
3944
  }
4088
- if (group) {
4089
- const order = orderMapping[group];
4090
- if (order) fields[group] = {
3945
+ if (colorId) {
3946
+ const order = orderMapping[colorId];
3947
+ if (order) fields[colorId] = {
4091
3948
  sortIndex: 0,
4092
3949
  domain: order,
4093
3950
  lockStatisticsByDomain: true
4094
3951
  };
4095
- else fields[group] = {
3952
+ else fields[colorId] = {
4096
3953
  sortIndex: 0
4097
3954
  };
4098
3955
  }
@@ -4380,14 +4237,14 @@ const barParallelAdvancedPipeline = [
4380
4237
  initAdvancedVSeed_initAdvancedVSeed,
4381
4238
  autoMeasures_autoMeasures,
4382
4239
  autoDimensions_autoDimensions,
4240
+ encodingForBar,
4383
4241
  pivotAdapter([
4384
- reshapeTo2D1M
4242
+ reshapeWithEncoding
4385
4243
  ], [
4386
- pivotReshapeTo2D1M
4244
+ pivotReshapeWithEncoding
4387
4245
  ]),
4388
- encodingYX,
4389
4246
  sortYBandAxis,
4390
- sort_sortLegend,
4247
+ sortLegend_sortLegend,
4391
4248
  barParallelConfig,
4392
4249
  theme_theme,
4393
4250
  markStyle_markStyle,
@@ -4398,20 +4255,19 @@ const initBarParallel = (spec, context)=>{
4398
4255
  ...spec
4399
4256
  };
4400
4257
  const { advancedVSeed } = context;
4401
- const { encoding, datasetReshapeInfo, dimensions } = advancedVSeed;
4402
- const { unfoldInfo } = datasetReshapeInfo[0];
4403
- if (!encoding[0].y || !encoding[0].x || !encoding[0].group) return result;
4258
+ const { datasetReshapeInfo, dimensions } = advancedVSeed;
4259
+ const { unfoldInfo, foldInfo } = datasetReshapeInfo[0];
4404
4260
  const sameDimensionsMode = dimensions.length > 1 && dimensions.every((dim)=>dim.id === dimensions[0].id);
4405
4261
  result.type = 'bar';
4406
4262
  result.direction = 'horizontal';
4407
4263
  result.yField = sameDimensionsMode ? [
4408
- encoding[0].y[0]
4264
+ unfoldInfo.encodingY
4409
4265
  ] : [
4410
- encoding[0].y[0],
4411
- unfoldInfo.groupId
4266
+ unfoldInfo.encodingY,
4267
+ unfoldInfo.encodingDetail
4412
4268
  ];
4413
- result.xField = encoding[0].x[0];
4414
- result.seriesField = encoding[0].group[0];
4269
+ result.xField = foldInfo.measureValue;
4270
+ result.seriesField = unfoldInfo.encodingColorId;
4415
4271
  result.padding = 0;
4416
4272
  result.region = [
4417
4273
  {
@@ -4477,14 +4333,14 @@ const barPercentAdvancedPipeline = [
4477
4333
  initAdvancedVSeed_initAdvancedVSeed,
4478
4334
  autoMeasures_autoMeasures,
4479
4335
  autoDimensions_autoDimensions,
4336
+ encodingForBar,
4480
4337
  pivotAdapter([
4481
- reshapeTo2D1M
4338
+ reshapeWithEncoding
4482
4339
  ], [
4483
- pivotReshapeTo2D1M
4340
+ pivotReshapeWithEncoding
4484
4341
  ]),
4485
- encodingYX,
4486
4342
  sortYBandAxis,
4487
- sort_sortLegend,
4343
+ sortLegend_sortLegend,
4488
4344
  barPercentConfig,
4489
4345
  theme_theme,
4490
4346
  markStyle_markStyle,
@@ -4548,14 +4404,14 @@ const areaAdvancedPipeline = [
4548
4404
  initAdvancedVSeed_initAdvancedVSeed,
4549
4405
  autoMeasures_autoMeasures,
4550
4406
  autoDimensions_autoDimensions,
4407
+ encodingForColumn,
4551
4408
  pivotAdapter([
4552
- reshapeTo2D1M0Name
4409
+ reshapeWithEncoding
4553
4410
  ], [
4554
- pivotReshapeTo2D1M0Name
4411
+ pivotReshapeWithEncoding
4555
4412
  ]),
4556
- encodingXY,
4557
4413
  sortXBandAxis,
4558
- sort_sortLegend,
4414
+ sortLegend_sortLegend,
4559
4415
  areaConfig,
4560
4416
  theme_theme,
4561
4417
  markStyle_markStyle,
@@ -4566,13 +4422,13 @@ const initArea = (spec, context)=>{
4566
4422
  ...spec
4567
4423
  };
4568
4424
  const { advancedVSeed } = context;
4569
- const { encoding } = advancedVSeed;
4570
- if (!encoding[0].y || !encoding[0].x || !encoding[0].group) return result;
4425
+ const { datasetReshapeInfo } = advancedVSeed;
4426
+ const { unfoldInfo, foldInfo } = datasetReshapeInfo[0];
4571
4427
  result.type = 'area';
4572
4428
  result.direction = 'vertical';
4573
- result.xField = encoding[0].x[0];
4574
- result.yField = encoding[0].y[0];
4575
- result.seriesField = encoding[0].group[0];
4429
+ result.yField = foldInfo.measureValue;
4430
+ result.xField = unfoldInfo.encodingX;
4431
+ result.seriesField = unfoldInfo.encodingColorId;
4576
4432
  result.padding = 0;
4577
4433
  result.region = [
4578
4434
  {
@@ -4584,8 +4440,9 @@ const initArea = (spec, context)=>{
4584
4440
  };
4585
4441
  const areaStyle_areaStyle = (spec, context)=>{
4586
4442
  const { advancedVSeed } = context;
4587
- const { markStyle, encoding, dataset } = advancedVSeed;
4443
+ const { markStyle, datasetReshapeInfo, dataset } = advancedVSeed;
4588
4444
  const { areaStyle } = markStyle;
4445
+ const { unfoldInfo } = datasetReshapeInfo[0];
4589
4446
  if (!areaStyle) return {
4590
4447
  ...spec,
4591
4448
  area: {
@@ -4598,7 +4455,7 @@ const areaStyle_areaStyle = (spec, context)=>{
4598
4455
  const areaStyles = Array.isArray(areaStyle) ? areaStyle : [
4599
4456
  areaStyle
4600
4457
  ];
4601
- const group = encoding[0]?.group?.[0];
4458
+ const group = unfoldInfo.encodingColorId;
4602
4459
  const areaGroups = groupBy(dataset, (d)=>d[group ?? '']);
4603
4460
  const customMap = areaStyles.reduce((result, style, index)=>{
4604
4461
  const { areaColor, areaColorOpacity, areaVisible = true } = style;
@@ -4692,14 +4549,14 @@ const areaPercentAdvancedPipeline = [
4692
4549
  initAdvancedVSeed_initAdvancedVSeed,
4693
4550
  autoMeasures_autoMeasures,
4694
4551
  autoDimensions_autoDimensions,
4552
+ encodingForColumn,
4695
4553
  pivotAdapter([
4696
- reshapeTo2D1M0Name
4554
+ reshapeWithEncoding
4697
4555
  ], [
4698
- pivotReshapeTo2D1M0Name
4556
+ pivotReshapeWithEncoding
4699
4557
  ]),
4700
- encodingXY,
4701
4558
  sortXBandAxis,
4702
- sort_sortLegend,
4559
+ sortLegend_sortLegend,
4703
4560
  areaPercentConfig,
4704
4561
  theme_theme,
4705
4562
  markStyle_markStyle,
@@ -4764,16 +4621,20 @@ const registerAreaPercent = ()=>{
4764
4621
  Builder._advancedPipelineMap.areaPercent = areaPercentAdvancedPipeline;
4765
4622
  Builder._specPipelineMap.areaPercent = areaPercentSpecPipeline;
4766
4623
  };
4767
- const autoMeasuresBy2M1Group = (advancedVSeed, context)=>{
4624
+ const autoScatterMeasures = (advancedVSeed, context)=>{
4768
4625
  const result = {
4769
4626
  ...advancedVSeed
4770
4627
  };
4771
4628
  const { vseed } = context;
4772
- const { measures, dataset } = vseed;
4629
+ const { dataset, scatterMeasures, measures } = vseed;
4773
4630
  if (!dataset) throw new Error('dataset is required');
4774
4631
  if (0 === dataset.length) return result;
4775
- if (measures) {
4776
- 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;
4777
4638
  return result;
4778
4639
  }
4779
4640
  const top100dataset = dataset.slice(0, 100);
@@ -4781,7 +4642,7 @@ const autoMeasuresBy2M1Group = (advancedVSeed, context)=>{
4781
4642
  ...prev,
4782
4643
  ...cur
4783
4644
  }), {});
4784
- 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]) && ![
4785
4646
  '',
4786
4647
  null,
4787
4648
  void 0
@@ -4789,689 +4650,273 @@ const autoMeasuresBy2M1Group = (advancedVSeed, context)=>{
4789
4650
  id: measure,
4790
4651
  alias: measure
4791
4652
  }));
4792
- 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
+ ];
4793
4673
  return result;
4794
4674
  };
4795
- const auto2M1Group = (measures)=>{
4796
- const allMeasures = findAllMeasures(measures);
4797
- if (allMeasures.length <= 2) return allMeasures;
4798
- const groups = measures.filter((measure)=>'children' in measure);
4799
- const singleMeasures = measures.filter((measure)=>!('children' in measure));
4800
- for(let i = 0; i < singleMeasures.length; i += 2){
4801
- const group = autoMeasuresBy2M1Group_createEmptyMeasureGroup();
4802
- group.children = allMeasures.slice(i, i + 2);
4803
- groups.push(group);
4804
- }
4805
- return groups;
4806
- };
4807
- const autoMeasuresBy2M1Group_createEmptyMeasureGroup = ()=>({
4808
- id: '',
4809
- alias: '',
4810
- 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
+ };
4811
4709
  });
4812
- const dataReshapeFor1D_emptyReshapeResult = {
4813
- dataset: [],
4814
- foldInfo: {
4815
- foldMap: {},
4816
- measureId: '',
4817
- measureName: '',
4818
- measureValue: ''
4819
- },
4820
- unfoldInfo: {
4821
- groupName: '',
4822
- groupId: '',
4823
- colorItems: [],
4824
- colorIdMap: {}
4825
- }
4710
+ if (1 === scatterMeasures.length) return measureTree[0].children || [];
4711
+ return measureTree;
4826
4712
  };
4827
- const dataReshapeFor1D = (dataset, dimensions, measures, options)=>{
4828
- const { foldMeasureId = FoldMeasureId, foldMeasureName = FoldMeasureName, foldMeasureValue = FoldMeasureValue, unfoldDimensionGroup = UnfoldDimensionGroup, unfoldDimensionGroupId = UnfoldDimensionGroupId } = options || {};
4829
- if (0 === dimensions.length && 0 === measures.length) return dataReshapeFor1D_emptyReshapeResult;
4830
- if (0 === dimensions.length) {
4831
- 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
+ ]);
4832
4725
  return {
4833
- dataset: finalDataset,
4834
- foldInfo: {
4835
- foldMap: {},
4836
- measureId: foldMeasureId,
4837
- measureName: foldMeasureName,
4838
- measureValue: foldMeasureValue
4839
- },
4840
- unfoldInfo
4841
- };
4842
- }
4843
- {
4844
- const { dataset: finalDataset, unfoldInfo } = unfoldDimensions(dataset, [
4845
- ...dimensions
4846
- ], [
4847
- {
4848
- id: foldMeasureValue,
4849
- alias: i18n`指标值`
4726
+ ...advancedVSeed,
4727
+ encoding: {
4728
+ ...encoding,
4729
+ detail: mergedDetail
4850
4730
  }
4851
- ], 0, unfoldDimensionGroup, unfoldDimensionGroupId, foldMeasureId);
4852
- return {
4853
- dataset: finalDataset,
4854
- foldInfo: {
4855
- foldMap: {},
4856
- measureId: foldMeasureId,
4857
- measureName: foldMeasureName,
4858
- measureValue: foldMeasureValue
4859
- },
4860
- unfoldInfo
4861
4731
  };
4862
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
+ };
4863
4746
  };
4864
- const reshapeTo1D = (advancedVSeed, context)=>{
4747
+ const reshapeWithScatterEncoding = (advancedVSeed, context)=>{
4865
4748
  const result = {
4866
4749
  ...advancedVSeed
4867
4750
  };
4868
4751
  const { vseed } = context;
4869
4752
  const { dataset } = vseed;
4870
- const { dimensions, measures } = advancedVSeed;
4871
- if (!measures || !dimensions || !dataset) return result;
4753
+ const { dimensions, measures, encoding, chartType } = advancedVSeed;
4754
+ if (!measures || !dimensions || !dataset || !encoding) return result;
4872
4755
  if (0 === measures.length) throw new Error('measures can not be empty');
4873
- 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
+ };
4874
4788
  return {
4875
4789
  ...result,
4876
- dataset: newDatasets,
4790
+ dataset: datasets[0],
4877
4791
  datasetReshapeInfo: [
4878
4792
  {
4879
- id: '1D2M',
4793
+ id: String(chartType),
4880
4794
  index: 0,
4881
- foldInfo,
4882
- unfoldInfo
4795
+ foldInfo: foldInfoList[0],
4796
+ foldInfoList: foldInfoList,
4797
+ unfoldInfo: unfoldInfo
4883
4798
  }
4884
4799
  ]
4885
4800
  };
4886
4801
  };
4887
- const pivotReshapeTo1D = (advancedVSeed, context)=>{
4802
+ const pivotReshapeWithScatterEncoding = (advancedVSeed, context)=>{
4888
4803
  const result = {
4889
4804
  ...advancedVSeed
4890
4805
  };
4891
4806
  const { vseed } = context;
4892
4807
  const { dataset } = vseed;
4893
- const { measures } = advancedVSeed;
4894
- const dimensions = advancedVSeed.dimensions;
4895
- if (!measures || !dimensions) return result;
4808
+ const { dimensions, measures, encoding, chartType } = advancedVSeed;
4809
+ if (!measures || !dimensions || !dataset || !encoding) return result;
4896
4810
  const measureGroups = [];
4897
- if (measures) measures.forEach((measure)=>{
4898
- 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);
4899
4814
  });
4900
- const newDatasets = [];
4815
+ else if (2 === depth) measureGroups.push(measures);
4816
+ const datasetList = [];
4901
4817
  const datasetReshapeInfo = [];
4902
- measureGroups.forEach((measureGroup, index)=>{
4903
- const measures = measureGroup.children;
4904
- if (!measures) return;
4905
- const commonDimensions = dimensions.filter((dim)=>'dimension' === dim.location);
4906
- const groupId = measureGroup.id;
4907
- const { dataset: newSubDataset, foldInfo, unfoldInfo } = dataReshapeFor1D(dataset, commonDimensions, measures, {
4908
- foldMeasureId: FoldMeasureId,
4909
- foldMeasureName: FoldMeasureName,
4910
- foldMeasureValue: FoldMeasureValue + groupId,
4911
- unfoldDimensionGroup: UnfoldDimensionGroup
4912
- });
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
+ };
4913
4852
  const reshapeInfo = {
4914
- id: groupId,
4853
+ id: `${chartType}-${index}`,
4915
4854
  index,
4916
- foldInfo,
4917
- unfoldInfo
4855
+ foldInfo: foldInfoList[0],
4856
+ foldInfoList: foldInfoList,
4857
+ unfoldInfo: unfoldInfo
4918
4858
  };
4919
- newDatasets.push(newSubDataset);
4920
4859
  datasetReshapeInfo.push(reshapeInfo);
4860
+ datasetList.push(datasets[0].map((d, index)=>({
4861
+ ...d,
4862
+ ...datasets[1]?.[index] || {}
4863
+ })));
4921
4864
  });
4922
4865
  return {
4923
4866
  ...result,
4924
- dataset: newDatasets,
4867
+ dataset: datasetList,
4925
4868
  datasetReshapeInfo: datasetReshapeInfo
4926
4869
  };
4927
4870
  };
4928
- const encodingAreaRange = (advancedVSeed)=>{
4929
- const result = {
4930
- ...advancedVSeed
4931
- };
4932
- const { datasetReshapeInfo, measures } = advancedVSeed;
4933
- if (!datasetReshapeInfo || !measures) return result;
4934
- const encoding = datasetReshapeInfo.reduce((prev, cur, index)=>{
4935
- const measure = measures[index];
4936
- if ('children' in measure) {
4937
- const m1 = measure.children?.[0];
4938
- const m2 = measure.children?.[1] || m1;
4939
- const { foldInfo, unfoldInfo } = cur;
4940
- const x = [
4941
- unfoldInfo.groupId
4942
- ];
4943
- const y = [
4944
- m1?.id,
4945
- m2?.id
4946
- ];
4947
- const group = [
4948
- unfoldInfo.groupId
4949
- ];
4950
- const color = [
4951
- foldInfo.measureName
4952
- ];
4953
- return [
4954
- ...prev,
4955
- {
4956
- x,
4957
- y,
4958
- group,
4959
- color
4960
- }
4961
- ];
4962
- }
4963
- {
4964
- const m1 = measures[index];
4965
- const m2 = measures[index + 1] || m1;
4966
- const { foldInfo, unfoldInfo } = cur;
4967
- const x = [
4968
- unfoldInfo.groupId
4969
- ];
4970
- const y = [
4971
- m1.id,
4972
- m2.id
4973
- ];
4974
- const group = [
4975
- unfoldInfo.groupId
4976
- ];
4977
- const color = [
4978
- foldInfo.measureName
4979
- ];
4980
- return [
4981
- ...prev,
4982
- {
4983
- x,
4984
- y,
4985
- group,
4986
- color
4987
- }
4988
- ];
4989
- }
4990
- }, []);
4991
- return {
4992
- ...result,
4993
- encoding
4994
- };
4995
- };
4996
- const areaRangeAdvancedPipeline = [
4871
+ const scatterAdvancedPipeline = [
4997
4872
  initAdvancedVSeed_initAdvancedVSeed,
4998
- autoMeasuresBy2M1Group,
4873
+ autoScatterMeasures,
4999
4874
  autoDimensions_autoDimensions,
4875
+ encodingForScatter,
5000
4876
  pivotAdapter([
5001
- reshapeTo1D
4877
+ reshapeWithScatterEncoding
5002
4878
  ], [
5003
- pivotReshapeTo1D
4879
+ pivotReshapeWithScatterEncoding
5004
4880
  ]),
5005
- encodingAreaRange,
5006
- sortXBandAxis,
5007
- areaConfig,
4881
+ scatterConfig,
5008
4882
  theme_theme,
5009
4883
  markStyle_markStyle,
5010
4884
  annotation_annotation
5011
4885
  ];
5012
- const series = (...args)=>{
5013
- const result = {
5014
- type: 'common',
5015
- padding: 0,
5016
- region: [
5017
- {
5018
- clip: true
5019
- }
5020
- ]
5021
- };
5022
- return (_, context)=>{
5023
- result.series = args.map((pipeline)=>execPipeline(pipeline, context, {}));
5024
- return result;
5025
- };
5026
- };
5027
- const seriesDualAxis = (...args)=>{
5028
- const result = {
5029
- type: 'common',
5030
- padding: 0,
5031
- region: [
5032
- {
5033
- clip: true
5034
- }
5035
- ]
5036
- };
5037
- const createDualContext = (context, index)=>{
5038
- const { advancedVSeed } = context;
5039
- const dataset = advancedVSeed.dataset[index];
5040
- return {
5041
- ...context,
5042
- advancedVSeed: {
5043
- ...advancedVSeed,
5044
- dataset: dataset
5045
- }
5046
- };
5047
- };
5048
- return (_, context)=>{
5049
- result.series = args.map((pipeline, index)=>{
5050
- const seriesContext = createDualContext(context, index);
5051
- return execPipeline(pipeline, seriesContext, {});
5052
- });
5053
- return result;
5054
- };
5055
- };
5056
- const initAreaRange = (spec, context)=>{
4886
+ const initScatter = (spec, context)=>{
5057
4887
  const result = {
5058
4888
  ...spec
5059
4889
  };
5060
4890
  const { advancedVSeed } = context;
5061
- const { encoding } = advancedVSeed;
5062
- if (!encoding[0].y || !encoding[0].x || !encoding[0].group) return result;
5063
- const { color } = advancedVSeed.config.areaRange;
5064
- result.type = 'rangeArea';
4891
+ const { datasetReshapeInfo } = advancedVSeed;
4892
+ const { unfoldInfo, foldInfoList } = datasetReshapeInfo[0];
4893
+ result.type = 'scatter';
5065
4894
  result.direction = 'vertical';
5066
- result.stack = false;
5067
- result.xField = encoding[0].x[0];
5068
- result.yField = [
5069
- encoding[0].y[0],
5070
- 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
+ }
5071
4903
  ];
5072
4904
  result.animation = true;
5073
- result.area = {
5074
- style: {
5075
- fill: color.colorScheme?.[0]
5076
- }
5077
- };
5078
4905
  return result;
5079
4906
  };
5080
- const initAreaRangeLine1 = (spec, context)=>{
5081
- const result = {
5082
- ...spec
5083
- };
5084
- const { advancedVSeed } = context;
5085
- const { encoding } = advancedVSeed;
5086
- if (!encoding[0].y || !encoding[0].x || !encoding[0].group) return result;
5087
- const { color } = advancedVSeed.config.areaRange;
5088
- result.type = 'line';
5089
- result.direction = 'vertical';
5090
- result.stack = false;
5091
- result.xField = encoding[0].x[0];
5092
- result.yField = [
5093
- encoding[0].y[0]
5094
- ];
5095
- result.animation = true;
5096
- result.line = {
5097
- style: {
5098
- stroke: color.colorScheme?.[0]
5099
- }
5100
- };
5101
- result.point = {
5102
- style: {
5103
- visible: false,
5104
- fill: color.colorScheme?.[0]
5105
- }
5106
- };
5107
- return result;
5108
- };
5109
- const initAreaRangeLine2 = (spec, context)=>{
5110
- const result = {
5111
- ...spec
5112
- };
5113
- const { advancedVSeed } = context;
5114
- const { encoding } = advancedVSeed;
5115
- if (!encoding[0].y || !encoding[0].x || !encoding[0].group) return result;
5116
- const { color } = advancedVSeed.config.areaRange;
5117
- result.type = 'line';
5118
- result.direction = 'vertical';
5119
- result.stack = false;
5120
- result.xField = encoding[0].x[0];
5121
- result.yField = [
5122
- encoding[0].y[1]
5123
- ];
5124
- result.animation = true;
5125
- result.line = {
5126
- style: {
5127
- stroke: color.colorScheme?.[0]
5128
- }
5129
- };
5130
- result.point = {
5131
- style: {
5132
- visible: false,
5133
- fill: color.colorScheme?.[0]
5134
- }
5135
- };
5136
- return result;
5137
- };
5138
- const tooltipDisable = (spec)=>{
5139
- const result = {
5140
- ...spec
5141
- };
5142
- result.tooltip = {
5143
- visible: false
5144
- };
5145
- return result;
5146
- };
5147
- const tooltipAreaRange = (spec, context)=>{
5148
- const result = {
5149
- ...spec
5150
- };
5151
- const { advancedVSeed } = context;
5152
- const { measures, datasetReshapeInfo, chartType, locale, encoding } = advancedVSeed;
5153
- const baseConfig = advancedVSeed.config[chartType];
5154
- const { tooltip = {
5155
- enable: true
5156
- } } = baseConfig;
5157
- const { enable } = tooltip;
5158
- const { groupName } = datasetReshapeInfo[0].unfoldInfo;
5159
- const y = encoding[0]?.y || [];
5160
- result.tooltip = {
5161
- visible: enable,
5162
- dimension: {
5163
- content: [
5164
- {
5165
- visible: true,
5166
- key: (datum)=>datum && datum[groupName] || '',
5167
- value: (datum)=>{
5168
- if (!datum) return '';
5169
- const text = y.map((id)=>{
5170
- const value = datum[id];
5171
- const measure = findMeasureById(measures, id);
5172
- if (!measure) return String(value);
5173
- const { format = {}, autoFormat = true } = measure;
5174
- if (!isEmpty(format)) {
5175
- const formatter = createFormatter(format);
5176
- return formatter(value);
5177
- }
5178
- if (autoFormat) return autoFormatter(value, locale);
5179
- return String(value);
5180
- });
5181
- return text.join(' ~ ');
5182
- },
5183
- shapeType: 'rectRound'
5184
- },
5185
- ...y.map((id)=>{
5186
- const measure = findMeasureById(measures, id);
5187
- return {
5188
- visible: true,
5189
- key: measure?.alias || id,
5190
- value: (datum)=>{
5191
- if (!datum) return '';
5192
- const value = datum[id];
5193
- const measure = findMeasureById(measures, id);
5194
- if (!measure) return String(value);
5195
- const { format = {}, autoFormat = true } = measure;
5196
- if (!isEmpty(format)) {
5197
- const formatter = createFormatter(format);
5198
- return formatter(value);
5199
- }
5200
- if (autoFormat) return autoFormatter(value, locale);
5201
- return String(value);
5202
- },
5203
- shapeType: 'rectRound'
5204
- };
5205
- })
5206
- ]
5207
- }
5208
- };
5209
- return result;
5210
- };
5211
- const areaRange = [
5212
- series([
5213
- initAreaRange,
5214
- areaStyle_areaStyle
5215
- ], [
5216
- initAreaRangeLine1,
5217
- lineStyle_lineStyle,
5218
- pointStyle_pointStyle,
5219
- pointStateDimensionHover,
5220
- tooltipDisable
5221
- ], [
5222
- initAreaRangeLine2,
5223
- lineStyle_lineStyle,
5224
- pointStyle_pointStyle,
5225
- pointStateDimensionHover,
5226
- tooltipDisable
5227
- ]),
5228
- datasetXY,
5229
- progressive,
5230
- background_backgroundColor,
5231
- xBand,
5232
- yLinear,
5233
- label_label,
5234
- tooltipAreaRange,
5235
- verticalCrosshairLine,
5236
- annotationPoint_annotationPoint,
5237
- annotationVerticalLine_annotationVerticalLine,
5238
- annotationHorizontalLine_annotationHorizontalLine,
5239
- annotationArea_annotationArea
5240
- ];
5241
- const pivotAreaRange = [
5242
- initPivot,
5243
- pivotGridStyle,
5244
- pivotIndicators_pivotIndicatorsAsRow,
5245
- datasetPivot,
5246
- pivotIndicators_pivotIndicators([
5247
- series([
5248
- initAreaRange,
5249
- areaStyle_areaStyle
5250
- ], [
5251
- initAreaRangeLine1,
5252
- lineStyle_lineStyle,
5253
- pointStyle_pointStyle,
5254
- pointStateDimensionHover,
5255
- tooltipDisable
5256
- ], [
5257
- initAreaRangeLine2,
5258
- lineStyle_lineStyle,
5259
- pointStyle_pointStyle,
5260
- pointStateDimensionHover,
5261
- tooltipDisable
5262
- ]),
5263
- background_backgroundColor,
5264
- datasetXY,
5265
- progressive,
5266
- xBand,
5267
- yLinear,
5268
- label_label,
5269
- tooltipAreaRange,
5270
- verticalCrosshairLine,
5271
- annotationPoint_annotationPoint,
5272
- annotationVerticalLine_annotationVerticalLine,
5273
- annotationHorizontalLine_annotationHorizontalLine,
5274
- annotationArea_annotationArea
5275
- ]),
5276
- pivotRowDimensions,
5277
- pivotColumnDimensions
5278
- ];
5279
- const areaRangeSpecPipeline = [
5280
- pivotAdapter_pivotAdapter(areaRange, pivotAreaRange)
5281
- ];
5282
- const registerAreaRange = ()=>{
5283
- Builder._advancedPipelineMap.areaRange = areaRangeAdvancedPipeline;
5284
- Builder._specPipelineMap.areaRange = areaRangeSpecPipeline;
5285
- };
5286
- const dataReshapeFor1D2M_emptyReshapeResult = {
5287
- dataset: [],
5288
- foldInfo: {
5289
- foldMap: {},
5290
- measureId: '',
5291
- measureName: '',
5292
- measureValue: ''
5293
- },
5294
- unfoldInfo: {
5295
- groupName: '',
5296
- groupId: '',
5297
- colorItems: [],
5298
- colorIdMap: {}
5299
- }
5300
- };
5301
- const dataReshapeFor1D2M = (dataset, dimensions, measures, options)=>{
5302
- const { foldMeasureId = FoldMeasureId, foldMeasureName = FoldMeasureName, foldMeasureValue = FoldMeasureValue, unfoldDimensionGroup = UnfoldDimensionGroup, unfoldDimensionGroupId = UnfoldDimensionGroupId } = options || {};
5303
- if (0 === dimensions.length && 0 === measures.length) return dataReshapeFor1D2M_emptyReshapeResult;
5304
- const { dataset: foldedDataset, foldInfo } = foldMeasures(dataset, measures.length > 1 ? measures.slice(1) : measures, foldMeasureId, foldMeasureName, foldMeasureValue);
5305
- if (0 === dimensions.length) {
5306
- const { dataset: finalDataset, unfoldInfo } = unfoldDimensions(foldedDataset, [
5307
- {
5308
- id: foldMeasureValue,
5309
- alias: i18n`指标值`,
5310
- location: 'dimension'
5311
- }
5312
- ], [
5313
- {
5314
- id: foldMeasureValue,
5315
- alias: i18n`指标值`
5316
- }
5317
- ], 0, unfoldDimensionGroup, unfoldDimensionGroupId, foldMeasureId);
5318
- return {
5319
- dataset: finalDataset,
5320
- foldInfo,
5321
- unfoldInfo
5322
- };
5323
- }
5324
- {
5325
- const { dataset: finalDataset, unfoldInfo } = unfoldDimensions(foldedDataset, [
5326
- ...dimensions
5327
- ], [
5328
- {
5329
- id: foldMeasureValue,
5330
- alias: i18n`指标值`
5331
- }
5332
- ], 0, unfoldDimensionGroup, unfoldDimensionGroupId, foldMeasureId);
5333
- return {
5334
- dataset: finalDataset,
5335
- foldInfo,
5336
- unfoldInfo
5337
- };
5338
- }
5339
- };
5340
- const reshapeTo1D2M = (advancedVSeed, context)=>{
5341
- const result = {
5342
- ...advancedVSeed
5343
- };
5344
- const { vseed } = context;
5345
- const { dataset } = vseed;
5346
- const { dimensions, measures } = advancedVSeed;
5347
- if (!measures || !dimensions || !dataset) return result;
5348
- if (0 === measures.length) throw new Error('measures can not be empty');
5349
- const { dataset: newDatasets, foldInfo, unfoldInfo } = dataReshapeFor1D2M(dataset, dimensions, measures);
5350
- return {
5351
- ...result,
5352
- dataset: newDatasets,
5353
- datasetReshapeInfo: [
5354
- {
5355
- id: '1D2M',
5356
- index: 0,
5357
- foldInfo,
5358
- unfoldInfo
5359
- }
5360
- ]
5361
- };
5362
- };
5363
- const pivotReshapeTo1D2M = (advancedVSeed, context)=>{
5364
- const result = {
5365
- ...advancedVSeed
5366
- };
5367
- const { vseed } = context;
5368
- const { dataset } = vseed;
5369
- const { measures } = advancedVSeed;
5370
- const dimensions = advancedVSeed.dimensions;
5371
- if (!measures || !dimensions) return result;
5372
- const measureGroups = [];
5373
- if (measures) measures.forEach((measure)=>{
5374
- if (measure.children && measure.children.length > 0) measureGroups.push(measure);
5375
- });
5376
- const newDatasets = [];
5377
- const datasetReshapeInfo = [];
5378
- measureGroups.forEach((measureGroup, index)=>{
5379
- const measures = measureGroup.children;
5380
- if (!measures) return;
5381
- const commonDimensions = dimensions.filter((dim)=>'dimension' === dim.location);
5382
- const groupId = measureGroup.id;
5383
- const { dataset: newSubDataset, foldInfo, unfoldInfo } = dataReshapeFor1D2M(dataset, commonDimensions, measures, {
5384
- foldMeasureId: FoldMeasureId,
5385
- foldMeasureName: FoldMeasureName,
5386
- foldMeasureValue: FoldMeasureValue + groupId,
5387
- unfoldDimensionGroup: UnfoldDimensionGroup
5388
- });
5389
- const reshapeInfo = {
5390
- id: groupId,
5391
- index,
5392
- foldInfo,
5393
- unfoldInfo
5394
- };
5395
- newDatasets.push(newSubDataset);
5396
- datasetReshapeInfo.push(reshapeInfo);
5397
- });
5398
- return {
5399
- ...result,
5400
- dataset: newDatasets,
5401
- datasetReshapeInfo: datasetReshapeInfo
5402
- };
5403
- };
5404
- const encodingYY = (advancedVSeed)=>{
5405
- const result = {
5406
- ...advancedVSeed
5407
- };
5408
- const { datasetReshapeInfo, measures } = advancedVSeed;
5409
- if (!datasetReshapeInfo || !measures) return result;
5410
- const firstMeasure = findFirstMeasure(measures);
5411
- const encoding = datasetReshapeInfo.reduce((prev, cur)=>{
5412
- const { foldInfo, unfoldInfo } = cur;
5413
- const x = [
5414
- firstMeasure?.id
5415
- ];
5416
- const y = [
5417
- foldInfo.measureValue
5418
- ];
5419
- const group = [
5420
- unfoldInfo.groupId
5421
- ];
5422
- const color = [
5423
- unfoldInfo.groupId
5424
- ];
5425
- return [
5426
- ...prev,
5427
- {
5428
- x,
5429
- y,
5430
- group,
5431
- color
5432
- }
5433
- ];
5434
- }, []);
4907
+ const datasetScatter = (spec, context)=>{
4908
+ const { advancedVSeed, vseed } = context;
4909
+ const { datasetReshapeInfo } = advancedVSeed;
4910
+ const id = datasetReshapeInfo[0].id;
4911
+ const fields = {};
5435
4912
  return {
5436
- ...result,
5437
- encoding
5438
- };
5439
- };
5440
- const scatterAdvancedPipeline = [
5441
- initAdvancedVSeed_initAdvancedVSeed,
5442
- autoMeasures_autoMeasures,
5443
- autoDimensions_autoDimensions,
5444
- pivotAdapter([
5445
- reshapeTo1D2M
5446
- ], [
5447
- pivotReshapeTo1D2M
5448
- ]),
5449
- encodingYY,
5450
- scatterConfig,
5451
- theme_theme,
5452
- markStyle_markStyle,
5453
- annotation_annotation
5454
- ];
5455
- const initScatter = (spec, context)=>{
5456
- const result = {
5457
- ...spec
5458
- };
5459
- const { advancedVSeed } = context;
5460
- const { encoding } = advancedVSeed;
5461
- if (!encoding[0].y || !encoding[0].x || !encoding[0].group) return result;
5462
- result.type = 'scatter';
5463
- result.direction = 'vertical';
5464
- result.xField = encoding[0].x[0];
5465
- result.yField = encoding[0].y[0];
5466
- result.seriesField = encoding[0].group[0];
5467
- result.padding = 0;
5468
- result.region = [
5469
- {
5470
- clip: true
4913
+ ...spec,
4914
+ data: {
4915
+ id,
4916
+ values: isPivotChart(vseed) ? void 0 : advancedVSeed.dataset.flat(),
4917
+ fields: fields
5471
4918
  }
5472
- ];
5473
- result.animation = true;
5474
- return result;
4919
+ };
5475
4920
  };
5476
4921
  const horizontalCrosshairLine = (spec, context)=>{
5477
4922
  const result = {
@@ -5521,7 +4966,7 @@ const scatter = [
5521
4966
  initScatter,
5522
4967
  color_color,
5523
4968
  background_backgroundColor,
5524
- datasetXY,
4969
+ datasetScatter,
5525
4970
  progressive,
5526
4971
  xLinear,
5527
4972
  yLinear,
@@ -5546,7 +4991,7 @@ const pivotScatter = [
5546
4991
  initScatter,
5547
4992
  color_color,
5548
4993
  background_backgroundColor,
5549
- datasetXY,
4994
+ datasetScatter,
5550
4995
  progressive,
5551
4996
  xLinear,
5552
4997
  yLinear,
@@ -5572,41 +5017,163 @@ const registerScatter = ()=>{
5572
5017
  Builder._advancedPipelineMap.scatter = scatterAdvancedPipeline;
5573
5018
  Builder._specPipelineMap.scatter = scatterSpecPipeline;
5574
5019
  };
5575
- 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)=>{
5576
5145
  const result = {
5577
5146
  ...advancedVSeed
5578
5147
  };
5579
5148
  const { vseed } = context;
5580
5149
  const { dataset } = vseed;
5581
- const { dimensions, measures } = advancedVSeed;
5582
- if (!measures || !dimensions || !dataset) return result;
5150
+ const { dimensions, measures, encoding, chartType } = advancedVSeed;
5151
+ if (!measures || !dimensions || !dataset || !encoding) return result;
5583
5152
  if (0 === measures.length) throw new Error('measures can not be empty');
5584
5153
  if (measures.length > 2) throw new Error('measures can not be more than 2');
5585
- const commonDimensions = dimensions.filter((dim)=>'dimension' === dim.location);
5586
- const datasets = [];
5587
5154
  const foldInfoList = [];
5588
5155
  const unfoldInfoList = [];
5156
+ const datasets = [];
5589
5157
  const primaryMeasures = measures[0];
5590
5158
  const secondaryMeasures = measures[1] || [];
5591
5159
  if (primaryMeasures && primaryMeasures.children) {
5592
- const { dataset: newDatasets, foldInfo, unfoldInfo } = dataReshapeFor2D1M(dataset, commonDimensions, primaryMeasures.children, {
5160
+ const { dataset: newDataset, foldInfo, unfoldInfo } = dataReshapeByEncoding(dataset, dimensions, primaryMeasures.children, encoding, {
5593
5161
  foldMeasureValue: FoldPrimaryMeasureValue
5594
5162
  });
5595
- datasets.push(newDatasets);
5163
+ datasets.push(newDataset);
5596
5164
  foldInfoList.push(foldInfo);
5597
5165
  unfoldInfoList.push(unfoldInfo);
5598
5166
  }
5599
5167
  if (secondaryMeasures && secondaryMeasures.children) {
5600
- const { dataset: newDatasets, foldInfo, unfoldInfo } = dataReshapeFor2D1M(dataset, commonDimensions, secondaryMeasures.children, {
5168
+ const { dataset: newDataset, foldInfo, unfoldInfo } = dataReshapeByEncoding(dataset, dimensions, secondaryMeasures.children, encoding, {
5601
5169
  foldMeasureValue: FoldSecondaryMeasureValue
5602
5170
  });
5603
- datasets.push(newDatasets);
5171
+ datasets.push(newDataset);
5604
5172
  foldInfoList.push(foldInfo);
5605
5173
  unfoldInfoList.push(unfoldInfo);
5606
5174
  }
5607
5175
  const unfoldInfo = {
5608
- groupName: unfoldInfoList[0].groupName,
5609
- groupId: unfoldInfoList[0].groupId,
5176
+ ...unfoldInfoList[0],
5610
5177
  colorItems: unfoldInfoList.flatMap((d)=>d.colorItems),
5611
5178
  colorIdMap: unfoldInfoList.reduce((prev, cur)=>({
5612
5179
  ...prev,
@@ -5618,7 +5185,7 @@ const reshapeTo2D2M = (advancedVSeed, context)=>{
5618
5185
  dataset: datasets,
5619
5186
  datasetReshapeInfo: [
5620
5187
  {
5621
- id: '2D2M',
5188
+ id: String(chartType),
5622
5189
  index: 0,
5623
5190
  foldInfo: foldInfoList[0],
5624
5191
  foldInfoList: foldInfoList,
@@ -5627,46 +5194,48 @@ const reshapeTo2D2M = (advancedVSeed, context)=>{
5627
5194
  ]
5628
5195
  };
5629
5196
  };
5630
- const pivotReshapeTo2D2M = (advancedVSeed, context)=>{
5197
+ const pivotReshapeWithDualEncoding = (advancedVSeed, context)=>{
5631
5198
  const result = {
5632
5199
  ...advancedVSeed
5633
5200
  };
5634
5201
  const { vseed } = context;
5635
5202
  const { dataset } = vseed;
5636
- const { dimensions, measures } = advancedVSeed;
5637
- if (!measures || !dimensions || !dataset) return result;
5638
- const commonDimensions = dimensions.filter((dim)=>'dimension' === dim.location);
5203
+ const { dimensions, measures, encoding, chartType } = advancedVSeed;
5204
+ if (!measures || !dimensions || !dataset || !encoding) return result;
5639
5205
  const datasetList = [];
5640
5206
  const datasetReshapeInfo = [];
5641
- measures.forEach((measureGroup, index)=>{
5642
- 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)=>{
5643
5214
  if (0 === measures.length) throw new Error('measures can not be empty');
5644
5215
  if (measures.length > 2) throw new Error('measures can not be more than 2');
5645
- const datasets = [];
5646
5216
  const foldInfoList = [];
5647
5217
  const unfoldInfoList = [];
5218
+ const datasets = [];
5648
5219
  const primaryMeasures = measures[0];
5649
- const secondaryMeasures = measures[1] || measures[0];
5220
+ const secondaryMeasures = measures[1] || [];
5650
5221
  if (primaryMeasures && primaryMeasures.children) {
5651
- const { dataset: newDatasets, foldInfo, unfoldInfo } = dataReshapeFor2D1M(dataset, commonDimensions, primaryMeasures.children, {
5222
+ const { dataset: newDataset, foldInfo, unfoldInfo } = dataReshapeByEncoding(dataset, dimensions, primaryMeasures.children, encoding, {
5652
5223
  foldMeasureValue: `${FoldPrimaryMeasureValue}${index}`
5653
5224
  });
5654
- datasets.push(newDatasets);
5225
+ datasets.push(newDataset);
5655
5226
  foldInfoList.push(foldInfo);
5656
5227
  unfoldInfoList.push(unfoldInfo);
5657
5228
  }
5658
5229
  if (secondaryMeasures && secondaryMeasures.children) {
5659
- const { dataset: newDatasets, foldInfo, unfoldInfo } = dataReshapeFor2D1M(dataset, commonDimensions, secondaryMeasures.children, {
5230
+ const { dataset: newDataset, foldInfo, unfoldInfo } = dataReshapeByEncoding(dataset, dimensions, secondaryMeasures.children, encoding, {
5660
5231
  foldMeasureValue: `${FoldSecondaryMeasureValue}${index}`
5661
5232
  });
5662
- datasets.push(newDatasets);
5233
+ datasets.push(newDataset);
5663
5234
  foldInfoList.push(foldInfo);
5664
5235
  unfoldInfoList.push(unfoldInfo);
5665
5236
  }
5666
- datasetList.push(datasets.flat(2));
5667
5237
  const unfoldInfo = {
5668
- groupName: unfoldInfoList[0].groupName,
5669
- groupId: unfoldInfoList[0].groupId,
5238
+ ...unfoldInfoList[0],
5670
5239
  colorItems: unfoldInfoList.flatMap((d)=>d.colorItems),
5671
5240
  colorIdMap: unfoldInfoList.reduce((prev, cur)=>({
5672
5241
  ...prev,
@@ -5674,53 +5243,19 @@ const pivotReshapeTo2D2M = (advancedVSeed, context)=>{
5674
5243
  }), {})
5675
5244
  };
5676
5245
  const reshapeInfo = {
5677
- id: `2D2M-${index}`,
5246
+ id: `${chartType}-${index}`,
5678
5247
  index,
5679
5248
  foldInfo: foldInfoList[0],
5680
- unfoldInfo: unfoldInfo,
5681
- foldInfoList: foldInfoList
5249
+ foldInfoList: foldInfoList,
5250
+ unfoldInfo: unfoldInfo
5682
5251
  };
5683
5252
  datasetReshapeInfo.push(reshapeInfo);
5253
+ datasetList.push(datasets.flat(2));
5684
5254
  });
5685
5255
  return {
5686
5256
  ...result,
5687
5257
  dataset: datasetList,
5688
- datasetReshapeInfo
5689
- };
5690
- };
5691
- const encodingXYY = (advancedVSeed)=>{
5692
- const result = {
5693
- ...advancedVSeed
5694
- };
5695
- const { datasetReshapeInfo, dimensions } = advancedVSeed;
5696
- if (!datasetReshapeInfo || !dimensions) return result;
5697
- const xDimension = dimensions.find((item)=>'rowDimension' !== item.location && 'columnDimension' !== item.location) || dimensions[0];
5698
- const isZeroDimension = 0 === dimensions.length;
5699
- const encoding = datasetReshapeInfo.reduce((prev, cur)=>{
5700
- const { foldInfoList, unfoldInfo } = cur;
5701
- const x = [
5702
- isZeroDimension ? foldInfoList[0].measureName : xDimension?.id
5703
- ];
5704
- const y = foldInfoList.map((d)=>d.measureValue);
5705
- const group = [
5706
- unfoldInfo.groupId
5707
- ];
5708
- const color = [
5709
- foldInfoList[0].measureName
5710
- ];
5711
- return [
5712
- ...prev,
5713
- {
5714
- x,
5715
- y,
5716
- group,
5717
- color
5718
- }
5719
- ];
5720
- }, []);
5721
- return {
5722
- ...result,
5723
- encoding
5258
+ datasetReshapeInfo: datasetReshapeInfo
5724
5259
  };
5725
5260
  };
5726
5261
  const dualAxisConfig = (advancedVSeed, context)=>{
@@ -5749,125 +5284,80 @@ const dualAxisConfig = (advancedVSeed, context)=>{
5749
5284
  };
5750
5285
  return result;
5751
5286
  };
5752
- const autoDualMeasures = (advancedVSeed, context)=>{
5753
- const result = {
5754
- ...advancedVSeed
5755
- };
5756
- const { vseed } = context;
5757
- const { dataset, dualMeasures, measures } = vseed;
5758
- if (!dataset) throw new Error('dataset is required');
5759
- if (0 === dataset.length) return result;
5760
- if (dualMeasures) {
5761
- result.measures = dualMeasuresToMeasureTree(dualMeasures);
5762
- return result;
5763
- }
5764
- if (measures && measureDepth(measures) > 1) {
5765
- result.measures = measures;
5766
- return result;
5767
- }
5768
- const top100dataset = dataset.slice(0, 100);
5769
- const sample = top100dataset.reduce((prev, cur)=>({
5770
- ...prev,
5771
- ...cur
5772
- }), {});
5773
- const newMeasures = measures || Object.keys(sample).filter((key)=>top100dataset.some((item)=>'number' == typeof item[key]) && ![
5774
- '',
5775
- null,
5776
- void 0
5777
- ].includes(key)).map((measure)=>({
5778
- id: measure,
5779
- alias: measure
5780
- }));
5781
- if (0 === newMeasures.length) result.measures = [];
5782
- else if (1 === newMeasures.length) result.measures = [
5783
- {
5784
- id: 'primary',
5785
- alias: 'primary',
5786
- children: newMeasures
5787
- }
5788
- ];
5789
- else if (newMeasures.length > 1) result.measures = [
5790
- {
5791
- id: 'primary',
5792
- alias: 'primary',
5793
- children: newMeasures.slice(0, 1)
5794
- },
5795
- {
5796
- id: 'secondary',
5797
- alias: 'secondary',
5798
- children: newMeasures.slice(1)
5799
- }
5800
- ];
5801
- return result;
5802
- };
5803
- const dualMeasuresToMeasureTree = (dualMeasures)=>{
5804
- const measureTree = dualMeasures.map((item, index)=>{
5805
- const { primaryMeasures, secondaryMeasures } = item;
5806
- const groupChildren = [];
5807
- let id = '';
5808
- if (primaryMeasures) {
5809
- const arrPrimaryMeasures = Array.isArray(primaryMeasures) ? primaryMeasures : [
5810
- primaryMeasures
5811
- ];
5812
- const alias = arrPrimaryMeasures.map((item)=>item.alias || item.id).toString();
5813
- id += alias;
5814
- groupChildren.push({
5815
- id: `${index}-primary`,
5816
- alias: arrPrimaryMeasures.map((item)=>item.alias || item.id).toString(),
5817
- children: arrPrimaryMeasures
5818
- });
5819
- }
5820
- if (secondaryMeasures) {
5821
- const arrSecondaryMeasures = Array.isArray(secondaryMeasures) ? secondaryMeasures : [
5822
- secondaryMeasures
5823
- ];
5824
- const alias = arrSecondaryMeasures.map((item)=>item.alias || item.id).toString();
5825
- id += alias;
5826
- groupChildren.push({
5827
- id: `${index}-secondary`,
5828
- alias: arrSecondaryMeasures.map((item)=>item.alias || item.id).toString(),
5829
- children: arrSecondaryMeasures
5830
- });
5831
- }
5832
- return {
5833
- id,
5834
- alias: id,
5835
- children: groupChildren
5836
- };
5837
- });
5838
- if (1 === dualMeasures.length) return measureTree[0].children || [];
5839
- return measureTree;
5840
- };
5841
5287
  const dualAxisAdvancedPipeline = [
5842
5288
  initAdvancedVSeed_initAdvancedVSeed,
5843
5289
  autoDualMeasures,
5844
5290
  autoDimensions_autoDimensions,
5291
+ encodingForDualAxis,
5845
5292
  pivotAdapter([
5846
- reshapeTo2D2M
5293
+ reshapeWithDualEncoding
5847
5294
  ], [
5848
- pivotReshapeTo2D2M
5295
+ pivotReshapeWithDualEncoding
5849
5296
  ]),
5850
- encodingXYY,
5851
5297
  sortXBandAxis,
5852
- sort_sortLegend,
5298
+ sortLegend_sortLegend,
5853
5299
  dualAxisConfig,
5854
5300
  theme_theme,
5855
5301
  markStyle_markStyle,
5856
5302
  annotation_annotation
5857
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
+ };
5858
5348
  const initDualAxisPrimary = (spec, context)=>{
5859
5349
  const result = {
5860
5350
  ...spec
5861
5351
  };
5862
5352
  const { advancedVSeed } = context;
5863
- const { encoding, datasetReshapeInfo } = advancedVSeed;
5864
- if (!encoding[0].y || !encoding[0].x || !encoding[0].group) return result;
5865
- result.id = `${datasetReshapeInfo[0].id}-primary-series`;
5353
+ const { datasetReshapeInfo } = advancedVSeed;
5354
+ const { unfoldInfo, foldInfoList, id } = datasetReshapeInfo[0];
5355
+ result.id = `${id}-primary-series`;
5866
5356
  result.type = 'bar';
5867
5357
  result.direction = 'vertical';
5868
- result.xField = encoding[0].x[0];
5869
- result.yField = encoding[0].y[0];
5870
- result.seriesField = encoding[0].group[0];
5358
+ result.xField = unfoldInfo.encodingX;
5359
+ result.seriesField = unfoldInfo.encodingColorId;
5360
+ result.yField = foldInfoList?.[0].measureValue;
5871
5361
  result.animation = true;
5872
5362
  return result;
5873
5363
  };
@@ -5876,14 +5366,14 @@ const initDualAxisSecondary = (spec, context)=>{
5876
5366
  ...spec
5877
5367
  };
5878
5368
  const { advancedVSeed } = context;
5879
- const { encoding, datasetReshapeInfo } = advancedVSeed;
5880
- if (!encoding[0].y || !encoding[0].x || !encoding[0].group) return result;
5881
- result.id = `${datasetReshapeInfo[0].id}-secondary-series`;
5369
+ const { datasetReshapeInfo } = advancedVSeed;
5370
+ const { unfoldInfo, foldInfoList, id } = datasetReshapeInfo[0];
5371
+ result.id = `${id}-secondary-series`;
5882
5372
  result.type = 'line';
5883
5373
  result.direction = 'vertical';
5884
- result.xField = encoding[0].x[0];
5885
- result.yField = encoding[0].y[1];
5886
- 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;
5887
5377
  result.animation = true;
5888
5378
  return result;
5889
5379
  };
@@ -5915,10 +5405,10 @@ const dualChartTypePrimary = (spec, context)=>{
5915
5405
  case 'columnParallel':
5916
5406
  {
5917
5407
  const columnSpec = result;
5918
- 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);
5919
5409
  else if (columnSpec.xField) columnSpec.xField = [
5920
5410
  columnSpec.xField,
5921
- datasetReshapeInfo[0].unfoldInfo.groupId
5411
+ datasetReshapeInfo[0].unfoldInfo.encodingDetail
5922
5412
  ];
5923
5413
  columnSpec.type = 'bar';
5924
5414
  result.zIndex = DUAL_AXIS_CHART_COLUMN_Z_INDEX;
@@ -5971,10 +5461,10 @@ const dualChartTypeSecondary = (spec, context)=>{
5971
5461
  case 'columnParallel':
5972
5462
  {
5973
5463
  const columnSpec = result;
5974
- 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);
5975
5465
  else if (columnSpec.xField) columnSpec.xField = [
5976
5466
  columnSpec.xField,
5977
- datasetReshapeInfo[0].unfoldInfo.groupId
5467
+ datasetReshapeInfo[0].unfoldInfo.encodingDetail
5978
5468
  ];
5979
5469
  columnSpec.type = 'bar';
5980
5470
  result.zIndex = DUAL_AXIS_CHART_COLUMN_Z_INDEX;
@@ -6001,10 +5491,11 @@ const dualChartTypeSecondary = (spec, context)=>{
6001
5491
  };
6002
5492
  const datasetPrimary = (spec, context)=>{
6003
5493
  const { advancedVSeed, vseed } = context;
6004
- const { encoding, analysis, datasetReshapeInfo } = advancedVSeed;
5494
+ const { analysis, datasetReshapeInfo } = advancedVSeed;
6005
5495
  const orderMapping = analysis?.orderMapping || {};
6006
- const x = encoding[0]?.x?.[0];
6007
- const group = encoding[0]?.group?.[0];
5496
+ const { unfoldInfo } = datasetReshapeInfo[0];
5497
+ const x = unfoldInfo.encodingX;
5498
+ const colorId = unfoldInfo.encodingColorId;
6008
5499
  const id = datasetReshapeInfo[0].id;
6009
5500
  const fields = {};
6010
5501
  if (x) {
@@ -6018,14 +5509,14 @@ const datasetPrimary = (spec, context)=>{
6018
5509
  sortIndex: 0
6019
5510
  };
6020
5511
  }
6021
- if (group) {
6022
- const order = orderMapping[group];
6023
- if (order) fields[group] = {
5512
+ if (colorId) {
5513
+ const order = orderMapping[colorId];
5514
+ if (order) fields[colorId] = {
6024
5515
  sortIndex: 0,
6025
5516
  domain: order,
6026
5517
  lockStatisticsByDomain: true
6027
5518
  };
6028
- else fields[group] = {
5519
+ else fields[colorId] = {
6029
5520
  sortIndex: 0
6030
5521
  };
6031
5522
  }
@@ -6040,10 +5531,11 @@ const datasetPrimary = (spec, context)=>{
6040
5531
  };
6041
5532
  const datasetSecondary = (spec, context)=>{
6042
5533
  const { advancedVSeed, vseed } = context;
6043
- const { encoding, analysis, datasetReshapeInfo } = advancedVSeed;
5534
+ const { analysis, datasetReshapeInfo } = advancedVSeed;
6044
5535
  const orderMapping = analysis?.orderMapping || {};
6045
- const x = encoding[0]?.x?.[0];
6046
- const group = encoding[0]?.group?.[0];
5536
+ const { unfoldInfo } = datasetReshapeInfo[0];
5537
+ const x = unfoldInfo.encodingX;
5538
+ const colorId = unfoldInfo.encodingColorId;
6047
5539
  const id = datasetReshapeInfo[0].id;
6048
5540
  const fields = {};
6049
5541
  if (x) {
@@ -6057,14 +5549,14 @@ const datasetSecondary = (spec, context)=>{
6057
5549
  sortIndex: 0
6058
5550
  };
6059
5551
  }
6060
- if (group) {
6061
- const order = orderMapping[group];
6062
- if (order) fields[group] = {
5552
+ if (colorId) {
5553
+ const order = orderMapping[colorId];
5554
+ if (order) fields[colorId] = {
6063
5555
  sortIndex: 0,
6064
5556
  domain: order,
6065
5557
  lockStatisticsByDomain: true
6066
5558
  };
6067
- else fields[group] = {
5559
+ else fields[colorId] = {
6068
5560
  sortIndex: 0
6069
5561
  };
6070
5562
  }
@@ -6162,7 +5654,7 @@ const tooltipPrimary = (spec, context)=>{
6162
5654
  const foldInfoList = datasetReshapeInfo[0].foldInfoList;
6163
5655
  const unfoldInfo = datasetReshapeInfo[0].unfoldInfo;
6164
5656
  const { measureId, measureValue, measureName } = foldInfoList[0];
6165
- const { groupName } = unfoldInfo;
5657
+ const { encodingColor: colorName } = unfoldInfo;
6166
5658
  result.tooltip = {
6167
5659
  visible: enable,
6168
5660
  mark: {
@@ -6183,7 +5675,7 @@ const tooltipPrimary = (spec, context)=>{
6183
5675
  {
6184
5676
  visible: true,
6185
5677
  hasShape: true,
6186
- key: (datum)=>datum && datum[measureName || groupName] || '',
5678
+ key: (datum)=>datum && datum[measureName || colorName] || '',
6187
5679
  value: (datum)=>{
6188
5680
  if (!datum) return '';
6189
5681
  const value = datum[measureValue];
@@ -6205,7 +5697,7 @@ const tooltipPrimary = (spec, context)=>{
6205
5697
  content: [
6206
5698
  {
6207
5699
  visible: true,
6208
- key: (datum)=>datum && datum[groupName] || '',
5700
+ key: (datum)=>datum && datum[colorName] || '',
6209
5701
  value: (datum)=>{
6210
5702
  if (!datum) return '';
6211
5703
  const value = datum[measureValue];
@@ -6242,7 +5734,7 @@ const tooltipSecondary = (spec, context)=>{
6242
5734
  const foldInfoList = datasetReshapeInfo[0].foldInfoList;
6243
5735
  const unfoldInfo = datasetReshapeInfo[0].unfoldInfo;
6244
5736
  const { measureId, measureValue, measureName } = foldInfoList[1];
6245
- const { groupName } = unfoldInfo;
5737
+ const { encodingColorId } = unfoldInfo;
6246
5738
  result.tooltip = {
6247
5739
  visible: enable,
6248
5740
  mark: {
@@ -6263,7 +5755,7 @@ const tooltipSecondary = (spec, context)=>{
6263
5755
  {
6264
5756
  visible: true,
6265
5757
  hasShape: true,
6266
- key: (datum)=>datum && datum[measureName || groupName] || '',
5758
+ key: (datum)=>datum && datum[measureName || encodingColorId] || '',
6267
5759
  value: (datum)=>{
6268
5760
  if (!datum) return '';
6269
5761
  const value = datum[measureValue];
@@ -6285,7 +5777,7 @@ const tooltipSecondary = (spec, context)=>{
6285
5777
  content: [
6286
5778
  {
6287
5779
  visible: true,
6288
- key: (datum)=>datum && datum[groupName] || '',
5780
+ key: (datum)=>datum && datum[encodingColorId] || '',
6289
5781
  value: (datum)=>{
6290
5782
  if (!datum) return '';
6291
5783
  const value = datum[measureValue];
@@ -6314,16 +5806,16 @@ const yLinearPrimary = (spec, context)=>{
6314
5806
  const { advancedVSeed, vseed } = context;
6315
5807
  const { chartType } = vseed;
6316
5808
  const { locale, datasetReshapeInfo } = advancedVSeed;
6317
- const index = datasetReshapeInfo[0].index;
5809
+ const { index, id: reshapeInfoId, foldInfoList } = datasetReshapeInfo[0];
6318
5810
  const primaryYAxis = advancedVSeed.config?.[chartType]?.primaryYAxis;
6319
5811
  const yAxisConfig = Array.isArray(primaryYAxis) ? primaryYAxis[index] || primaryYAxis[0] : primaryYAxis;
6320
5812
  const alignTicks = advancedVSeed.config?.[chartType]?.alignTicks;
6321
5813
  const alignTicksConfig = Array.isArray(alignTicks) ? alignTicks[index] || alignTicks[0] : alignTicks;
6322
- if (datasetReshapeInfo[0].foldInfoList?.[0] && isEmpty(datasetReshapeInfo[0].foldInfoList[0].foldMap)) return result;
6323
- const id = `${datasetReshapeInfo[0].id}-primary-axis`;
5814
+ if (foldInfoList?.[0] && isEmpty(foldInfoList[0].foldMap)) return result;
5815
+ const id = `${reshapeInfoId}-primary-axis`;
6324
5816
  const seriesIds = [
6325
- `${datasetReshapeInfo[0].id}-primary-series`,
6326
- `${datasetReshapeInfo[0].id}-secondary-series`
5817
+ `${reshapeInfoId}-primary-series`,
5818
+ `${reshapeInfoId}-secondary-series`
6327
5819
  ];
6328
5820
  const seriesId = alignTicksConfig ? seriesIds : seriesIds[0];
6329
5821
  if (!result.axes) result.axes = [];
@@ -6411,20 +5903,20 @@ const yLinearSecondary = (spec, context)=>{
6411
5903
  const { advancedVSeed, vseed } = context;
6412
5904
  const { chartType } = vseed;
6413
5905
  const { locale, datasetReshapeInfo } = advancedVSeed;
6414
- const index = datasetReshapeInfo[0].index;
5906
+ const { index, id: reshapeInfoId, foldInfoList } = datasetReshapeInfo[0];
6415
5907
  const secondaryYAxis = advancedVSeed.config?.[chartType]?.secondaryYAxis;
6416
5908
  const yAxisConfig = Array.isArray(secondaryYAxis) ? secondaryYAxis[index] || secondaryYAxis[0] : secondaryYAxis;
6417
5909
  const alignTicks = advancedVSeed.config?.[chartType]?.alignTicks;
6418
5910
  const alignTicksConfig = Array.isArray(alignTicks) ? alignTicks[index] || alignTicks[0] : alignTicks;
6419
- if (isNullish(datasetReshapeInfo[0].foldInfoList?.[1])) return result;
5911
+ if (isNullish(foldInfoList?.[1])) return result;
6420
5912
  const sync = {
6421
- axisId: `${datasetReshapeInfo[0].id}-primary-axis`,
5913
+ axisId: `${reshapeInfoId}-primary-axis`,
6422
5914
  zeroAlign: true
6423
5915
  };
6424
- const id = `${datasetReshapeInfo[0].id}-secondary-axis`;
5916
+ const id = `${reshapeInfoId}-secondary-axis`;
6425
5917
  const seriesIds = [
6426
- `${datasetReshapeInfo[0].id}-primary-series`,
6427
- `${datasetReshapeInfo[0].id}-secondary-series`
5918
+ `${reshapeInfoId}-primary-series`,
5919
+ `${reshapeInfoId}-secondary-series`
6428
5920
  ];
6429
5921
  const seriesId = alignTicksConfig ? seriesIds : seriesIds[1];
6430
5922
  if (!result.axes) result.axes = [];
@@ -6565,210 +6057,74 @@ const pivotDualAxis = [
6565
6057
  areaStyle_areaStyle
6566
6058
  ], [
6567
6059
  initDualAxisSecondary,
6568
- dualChartTypeSecondary,
6569
- datasetSecondary,
6570
- labelSecondary,
6571
- tooltipSecondary,
6572
- progressive,
6573
- barStyle_barStyle,
6574
- pointStyle_pointStyle,
6575
- pointStateDimensionHover,
6576
- lineStyle_lineStyle,
6577
- areaStyle_areaStyle
6578
- ]),
6579
- xBand,
6580
- yLinearPrimary,
6581
- yLinearSecondary,
6582
- color_color,
6583
- background_backgroundColor,
6584
- verticalCrosshairRect,
6585
- annotationPoint_annotationPoint,
6586
- annotationVerticalLine_annotationVerticalLine,
6587
- annotationHorizontalLine_annotationHorizontalLine,
6588
- annotationArea_annotationArea
6589
- ]),
6590
- pivotRowDimensions,
6591
- pivotColumnDimensions,
6592
- pivotDiscreteLegend
6593
- ];
6594
- const dualAxisSpecPipeline = [
6595
- pivotAdapter_pivotAdapter(dualAxis, pivotDualAxis)
6596
- ];
6597
- const registerDualAxis = ()=>{
6598
- Builder._advancedPipelineMap.dualAxis = dualAxisAdvancedPipeline;
6599
- Builder._specPipelineMap.dualAxis = dualAxisSpecPipeline;
6600
- };
6601
- const dataReshapeFor1D1M_emptyReshapeResult = {
6602
- dataset: [],
6603
- foldInfo: {
6604
- foldMap: {},
6605
- measureId: '',
6606
- measureName: '',
6607
- measureValue: ''
6608
- },
6609
- unfoldInfo: {
6610
- groupName: '',
6611
- groupId: '',
6612
- colorItems: [],
6613
- colorIdMap: {}
6614
- }
6615
- };
6616
- const dataReshapeFor1D1M = (dataset, dimensions, measures, options)=>{
6617
- const { foldMeasureId = FoldMeasureId, foldMeasureName = FoldMeasureName, foldMeasureValue = FoldMeasureValue, unfoldDimensionGroup = UnfoldDimensionGroup, unfoldDimensionGroupId = UnfoldDimensionGroupId } = options || {};
6618
- if (0 === dimensions.length && 0 === measures.length) return dataReshapeFor1D1M_emptyReshapeResult;
6619
- const { dataset: foldedDataset, foldInfo } = foldMeasures(dataset, measures, foldMeasureId, foldMeasureName, foldMeasureValue);
6620
- if (0 === dimensions.length) {
6621
- const { dataset: finalDataset, unfoldInfo } = unfoldDimensions(foldedDataset, [
6622
- {
6623
- id: foldMeasureName,
6624
- alias: i18n`指标名称`,
6625
- location: 'dimension'
6626
- }
6627
- ], [
6628
- {
6629
- id: foldMeasureValue,
6630
- alias: i18n`指标值`
6631
- }
6632
- ], 0, unfoldDimensionGroup, unfoldDimensionGroupId, foldMeasureId);
6633
- return {
6634
- dataset: finalDataset,
6635
- foldInfo,
6636
- unfoldInfo
6637
- };
6638
- }
6639
- {
6640
- const dims = 1 === measures.length ? [
6641
- ...dimensions
6642
- ] : [
6643
- ...dimensions,
6644
- {
6645
- id: foldMeasureName,
6646
- alias: i18n`指标名称`,
6647
- location: 'dimension'
6648
- }
6649
- ];
6650
- const { dataset: finalDataset, unfoldInfo } = unfoldDimensions(foldedDataset, dims, [
6651
- {
6652
- id: foldMeasureValue,
6653
- alias: i18n`指标值`
6654
- }
6655
- ], 0, unfoldDimensionGroup, unfoldDimensionGroupId, foldMeasureId);
6656
- return {
6657
- dataset: finalDataset,
6658
- foldInfo,
6659
- unfoldInfo
6660
- };
6661
- }
6662
- };
6663
- const reshapeTo1D1M = (advancedVSeed, context)=>{
6664
- const result = {
6665
- ...advancedVSeed
6666
- };
6667
- const { vseed } = context;
6668
- const { dataset } = vseed;
6669
- const { dimensions, measures } = advancedVSeed;
6670
- if (!measures || !dimensions || !dataset) return result;
6671
- if (0 === measures.length) throw new Error('measures can not be empty');
6672
- const { dataset: newDatasets, foldInfo, unfoldInfo } = dataReshapeFor1D1M(dataset, dimensions, measures);
6673
- return {
6674
- ...result,
6675
- dataset: newDatasets,
6676
- datasetReshapeInfo: [
6677
- {
6678
- id: '1D1M',
6679
- index: 0,
6680
- foldInfo,
6681
- unfoldInfo
6682
- }
6683
- ]
6684
- };
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;
6685
6092
  };
6686
- const pivotReshapeTo1D1M = (advancedVSeed, context)=>{
6687
- const result = {
6688
- ...advancedVSeed
6689
- };
6093
+ const encodingForPie = (advancedVSeed, context)=>{
6690
6094
  const { vseed } = context;
6691
- const { dataset } = vseed;
6692
- const { measures } = advancedVSeed;
6693
- const dimensions = advancedVSeed.dimensions;
6694
- if (!measures || !dimensions) return result;
6695
- const measureGroups = [];
6696
- if (measures) measures.forEach((measure)=>{
6697
- if (measure.children && measure.children.length > 0) measureGroups.push(measure);
6698
- });
6699
- const newDatasets = [];
6700
- const datasetReshapeInfo = [];
6701
- measureGroups.forEach((measureGroup, index)=>{
6702
- const measures = measureGroup.children;
6703
- if (!measures) return;
6704
- const commonDimensions = dimensions.filter((dim)=>'dimension' === dim.location);
6705
- const groupId = measureGroup.id;
6706
- const { dataset: newSubDataset, foldInfo, unfoldInfo } = dataReshapeFor1D1M(dataset, commonDimensions, measures, {
6707
- foldMeasureId: FoldMeasureId,
6708
- foldMeasureName: FoldMeasureName,
6709
- foldMeasureValue: FoldMeasureValue + groupId,
6710
- unfoldDimensionGroup: UnfoldDimensionGroup
6711
- });
6712
- const reshapeInfo = {
6713
- id: groupId,
6714
- index,
6715
- foldInfo,
6716
- unfoldInfo
6717
- };
6718
- newDatasets.push(newSubDataset);
6719
- datasetReshapeInfo.push(reshapeInfo);
6720
- });
6721
- return {
6722
- ...result,
6723
- dataset: newDatasets,
6724
- 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
+ }
6725
6103
  };
6726
- };
6727
- const encodingPie = (advancedVSeed)=>{
6728
- const result = {
6729
- ...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: []
6730
6112
  };
6731
- const { datasetReshapeInfo } = advancedVSeed;
6732
- if (!datasetReshapeInfo) return result;
6733
- const encoding = datasetReshapeInfo.reduce((prev, cur)=>{
6734
- const { foldInfo, unfoldInfo } = cur;
6735
- const radius = [
6736
- foldInfo.measureValue
6737
- ];
6738
- const angle = [
6739
- unfoldInfo.groupId
6740
- ];
6741
- const group = [
6742
- unfoldInfo.groupId
6743
- ];
6744
- const color = [
6745
- unfoldInfo.groupId
6746
- ];
6747
- return [
6748
- ...prev,
6749
- {
6750
- angle,
6751
- radius,
6752
- group,
6753
- color
6754
- }
6755
- ];
6756
- }, []);
6757
6113
  return {
6758
- ...result,
6759
- encoding
6114
+ ...advancedVSeed,
6115
+ encoding: mergedEncoding
6760
6116
  };
6761
6117
  };
6762
6118
  const pieAdvancedPipeline = [
6763
6119
  initAdvancedVSeed_initAdvancedVSeed,
6764
6120
  autoMeasures_autoMeasures,
6765
6121
  autoDimensions_autoDimensions,
6122
+ encodingForPie,
6766
6123
  pivotAdapter([
6767
- reshapeTo1D1M
6124
+ reshapeWithEncoding
6768
6125
  ], [
6769
- pivotReshapeTo1D1M
6126
+ pivotReshapeWithEncoding
6770
6127
  ]),
6771
- encodingPie,
6772
6128
  pieConfig,
6773
6129
  theme_theme,
6774
6130
  annotation_annotation
@@ -6778,15 +6134,15 @@ const initPie = (spec, context)=>{
6778
6134
  ...spec
6779
6135
  };
6780
6136
  const { advancedVSeed } = context;
6781
- const { encoding, dataset } = advancedVSeed;
6782
- if (!encoding[0].angle || !encoding[0].radius || !encoding[0].group) return result;
6137
+ const { datasetReshapeInfo, dataset } = advancedVSeed;
6138
+ const { unfoldInfo, foldInfo } = datasetReshapeInfo[0];
6783
6139
  const showStroke = dataset.length <= 30;
6784
6140
  result.type = 'pie';
6785
6141
  result.outerRadius = 0.8;
6786
6142
  result.innerRadius = 0;
6787
- result.valueField = encoding[0].radius[0];
6788
- result.categoryField = encoding[0].angle[0];
6789
- result.seriesField = encoding[0].group[0];
6143
+ result.valueField = foldInfo.measureValue;
6144
+ result.categoryField = unfoldInfo.encodingAngle;
6145
+ result.seriesField = unfoldInfo.encodingColorId;
6790
6146
  result.padding = 0;
6791
6147
  result.region = [
6792
6148
  {
@@ -6855,12 +6211,12 @@ const donutAdvancedPipeline = [
6855
6211
  initAdvancedVSeed_initAdvancedVSeed,
6856
6212
  autoMeasures_autoMeasures,
6857
6213
  autoDimensions_autoDimensions,
6214
+ encodingForPie,
6858
6215
  pivotAdapter([
6859
- reshapeTo1D1M
6216
+ reshapeWithEncoding
6860
6217
  ], [
6861
- pivotReshapeTo1D1M
6218
+ pivotReshapeWithEncoding
6862
6219
  ]),
6863
- encodingPie,
6864
6220
  donutConfig,
6865
6221
  theme_theme,
6866
6222
  annotation_annotation
@@ -6870,15 +6226,15 @@ const initDonut = (spec, context)=>{
6870
6226
  ...spec
6871
6227
  };
6872
6228
  const { advancedVSeed } = context;
6873
- const { encoding, dataset } = advancedVSeed;
6874
- if (!encoding[0].angle || !encoding[0].radius || !encoding[0].group) return result;
6229
+ const { datasetReshapeInfo, dataset } = advancedVSeed;
6230
+ const { foldInfo, unfoldInfo } = datasetReshapeInfo[0];
6875
6231
  const showStroke = dataset.length <= 30;
6876
6232
  result.type = 'pie';
6877
6233
  result.outerRadius = 0.8;
6878
6234
  result.innerRadius = 0.8 * result.outerRadius;
6879
- result.valueField = encoding[0].radius[0];
6880
- result.categoryField = encoding[0].angle[0];
6881
- result.seriesField = encoding[0].group[0];
6235
+ result.valueField = foldInfo.measureValue;
6236
+ result.categoryField = unfoldInfo.encodingDetail;
6237
+ result.seriesField = unfoldInfo.encodingColorId;
6882
6238
  result.padding = 0;
6883
6239
  result.region = [
6884
6240
  {
@@ -6942,54 +6298,52 @@ const registerDonut = ()=>{
6942
6298
  Builder._advancedPipelineMap.donut = donutAdvancedPipeline;
6943
6299
  Builder._specPipelineMap.donut = donutSpecPipeline;
6944
6300
  };
6945
- const encodingRose = (advancedVSeed)=>{
6946
- const result = {
6947
- ...advancedVSeed
6948
- };
6949
- const { datasetReshapeInfo, dimensions, measures } = advancedVSeed;
6950
- if (!datasetReshapeInfo || !dimensions || !measures) return result;
6951
- const angleDimension = dimensions.find((item)=>'rowDimension' !== item.location && 'columnDimension' !== item.location) || dimensions[0];
6952
- const is1D1M = 1 === dimensions.length && 1 === measures.length;
6953
- const isZeroDimension = 0 === dimensions.length;
6954
- const encoding = datasetReshapeInfo.reduce((prev, cur)=>{
6955
- const { foldInfo, unfoldInfo } = cur;
6956
- const radius = [
6957
- foldInfo.measureValue
6958
- ];
6959
- const angle = [
6960
- isZeroDimension ? foldInfo.measureName : angleDimension?.id
6961
- ];
6962
- const group = [
6963
- is1D1M ? angleDimension?.id : unfoldInfo.groupId
6964
- ];
6965
- const color = [
6966
- 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
6967
6313
  ];
6968
- return [
6969
- ...prev,
6970
- {
6971
- angle,
6972
- radius,
6973
- group,
6974
- color
6314
+ return {
6315
+ ...advancedVSeed,
6316
+ encoding: {
6317
+ ...encoding,
6318
+ detail: mergedDetail
6975
6319
  }
6976
- ];
6977
- }, []);
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
+ };
6978
6332
  return {
6979
- ...result,
6980
- encoding
6333
+ ...advancedVSeed,
6334
+ encoding: mergedEncoding
6981
6335
  };
6982
6336
  };
6983
6337
  const roseAdvancedPipeline = [
6984
6338
  initAdvancedVSeed_initAdvancedVSeed,
6985
6339
  autoMeasures_autoMeasures,
6986
6340
  autoDimensions_autoDimensions,
6341
+ encodingForRose,
6987
6342
  pivotAdapter([
6988
- reshapeTo2D1M
6343
+ reshapeWithEncoding
6989
6344
  ], [
6990
- pivotReshapeTo2D1M
6345
+ pivotReshapeWithEncoding
6991
6346
  ]),
6992
- encodingRose,
6993
6347
  roseConfig,
6994
6348
  theme_theme,
6995
6349
  markStyle_markStyle,
@@ -7000,13 +6354,12 @@ const initRose = (spec, context)=>{
7000
6354
  ...spec
7001
6355
  };
7002
6356
  const { advancedVSeed } = context;
7003
- const { encoding, dataset, datasetReshapeInfo } = advancedVSeed;
7004
- const { foldInfo } = datasetReshapeInfo[0];
7005
- if (!encoding[0].radius || !encoding[0].angle || !encoding[0].group) return result;
6357
+ const { dataset, datasetReshapeInfo } = advancedVSeed;
6358
+ const { foldInfo, unfoldInfo } = datasetReshapeInfo[0];
7006
6359
  result.type = 'rose';
7007
- result.categoryField = encoding[0].angle[0];
7008
- result.valueField = encoding[0].radius[0];
7009
- result.seriesField = encoding[0].group[0];
6360
+ result.categoryField = unfoldInfo.encodingAngle;
6361
+ result.seriesField = unfoldInfo.encodingColorId;
6362
+ result.valueField = foldInfo.measureValue;
7010
6363
  result.padding = 0;
7011
6364
  result.outerRadius = 0.9;
7012
6365
  result.innerRadius = 0;
@@ -7154,12 +6507,12 @@ const roseParallelAdvancedPipeline = [
7154
6507
  initAdvancedVSeed_initAdvancedVSeed,
7155
6508
  autoMeasures_autoMeasures,
7156
6509
  autoDimensions_autoDimensions,
6510
+ encodingForRose,
7157
6511
  pivotAdapter([
7158
- reshapeTo2D1M
6512
+ reshapeWithEncoding
7159
6513
  ], [
7160
- pivotReshapeTo2D1M
6514
+ pivotReshapeWithEncoding
7161
6515
  ]),
7162
- encodingRose,
7163
6516
  roseParallelConfig,
7164
6517
  theme_theme,
7165
6518
  markStyle_markStyle,
@@ -7170,19 +6523,18 @@ const initRoseParallel = (spec, context)=>{
7170
6523
  ...spec
7171
6524
  };
7172
6525
  const { advancedVSeed } = context;
7173
- const { encoding, datasetReshapeInfo, dataset, dimensions } = advancedVSeed;
6526
+ const { datasetReshapeInfo, dataset, dimensions } = advancedVSeed;
7174
6527
  const { unfoldInfo, foldInfo } = datasetReshapeInfo[0];
7175
- if (!encoding[0].radius || !encoding[0].angle || !encoding[0].group) return result;
7176
6528
  const sameDimensionsMode = dimensions.length > 1 && dimensions.every((dim)=>dim.id === dimensions[0].id);
7177
6529
  result.type = 'rose';
7178
6530
  result.categoryField = sameDimensionsMode ? [
7179
- encoding[0].angle[0]
6531
+ unfoldInfo.encodingAngle
7180
6532
  ] : [
7181
- encoding[0].angle[0],
7182
- unfoldInfo.groupId
6533
+ unfoldInfo.encodingAngle,
6534
+ unfoldInfo.encodingDetail
7183
6535
  ];
7184
- result.valueField = encoding[0].radius[0];
7185
- result.seriesField = encoding[0].group[0];
6536
+ result.valueField = foldInfo.measureValue;
6537
+ result.seriesField = unfoldInfo.encodingColorId;
7186
6538
  result.padding = 0;
7187
6539
  result.outerRadius = 0.9;
7188
6540
  result.innerRadius = 0;
@@ -7259,54 +6611,52 @@ const registerRoseParallel = ()=>{
7259
6611
  Builder._advancedPipelineMap.roseParallel = roseParallelAdvancedPipeline;
7260
6612
  Builder._specPipelineMap.roseParallel = roseParallelSpecPipeline;
7261
6613
  };
7262
- const encodingAR = (advancedVSeed)=>{
7263
- const result = {
7264
- ...advancedVSeed
7265
- };
7266
- const { datasetReshapeInfo, dimensions, measures } = advancedVSeed;
7267
- if (!datasetReshapeInfo || !dimensions || !measures) return result;
7268
- const angleDimension = dimensions.find((item)=>'rowDimension' !== item.location && 'columnDimension' !== item.location) || dimensions[0];
7269
- const isZeroDimension = 0 === dimensions.length;
7270
- const encoding = datasetReshapeInfo.reduce((prev, cur)=>{
7271
- const { foldInfo, unfoldInfo } = cur;
7272
- const angle = [
7273
- isZeroDimension ? foldInfo.measureName : angleDimension?.id
7274
- ];
7275
- const radius = [
7276
- foldInfo.measureValue
7277
- ];
7278
- const group = [
7279
- unfoldInfo.groupId
7280
- ];
7281
- const color = [
7282
- 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
7283
6626
  ];
7284
- return [
7285
- ...prev,
7286
- {
7287
- angle,
7288
- radius,
7289
- group,
7290
- color
6627
+ return {
6628
+ ...advancedVSeed,
6629
+ encoding: {
6630
+ ...encoding,
6631
+ detail: mergedDetail
7291
6632
  }
7292
- ];
7293
- }, []);
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
+ };
7294
6644
  return {
7295
- ...result,
7296
- encoding
6645
+ ...advancedVSeed,
6646
+ encoding: mergedEncoding
7297
6647
  };
7298
6648
  };
7299
6649
  const radarAdvancedPipeline = [
7300
6650
  initAdvancedVSeed_initAdvancedVSeed,
7301
6651
  autoMeasures_autoMeasures,
7302
6652
  autoDimensions_autoDimensions,
6653
+ encodingForRadar,
7303
6654
  pivotAdapter([
7304
- reshapeTo2D1M0Name
6655
+ reshapeWithEncoding
7305
6656
  ], [
7306
- pivotReshapeTo2D1M0Name
6657
+ pivotReshapeWithEncoding
7307
6658
  ]),
7308
- encodingAR,
7309
- sort_sortLegend,
6659
+ sortLegend_sortLegend,
7310
6660
  radarConfig,
7311
6661
  theme_theme,
7312
6662
  markStyle_markStyle,
@@ -7317,12 +6667,12 @@ const initRadar = (spec, context)=>{
7317
6667
  ...spec
7318
6668
  };
7319
6669
  const { advancedVSeed } = context;
7320
- const { encoding } = advancedVSeed;
7321
- if (!encoding[0].angle || !encoding[0].radius || !encoding[0].group) return result;
6670
+ const { datasetReshapeInfo } = advancedVSeed;
6671
+ const { unfoldInfo, foldInfo } = datasetReshapeInfo[0];
7322
6672
  result.type = 'radar';
7323
- result.angleField = encoding[0].angle[0];
7324
- result.radiusField = encoding[0].radius[0];
7325
- result.seriesField = encoding[0].group[0];
6673
+ result.angleField = unfoldInfo.encodingAngle;
6674
+ result.radiusField = foldInfo.measureValue;
6675
+ result.seriesField = unfoldInfo.encodingColorId;
7326
6676
  result.padding = 0;
7327
6677
  result.region = [
7328
6678
  {
@@ -7434,47 +6784,40 @@ const registerRadar = ()=>{
7434
6784
  Builder._advancedPipelineMap.radar = radarAdvancedPipeline;
7435
6785
  Builder._specPipelineMap.radar = radarSpecPipeline;
7436
6786
  };
7437
- const encodingFunnel = (advancedVSeed)=>{
7438
- const result = {
7439
- ...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: []
7440
6805
  };
7441
- const { datasetReshapeInfo } = advancedVSeed;
7442
- if (!datasetReshapeInfo) return result;
7443
- const encoding = datasetReshapeInfo.reduce((prev, cur)=>{
7444
- const { foldInfo, unfoldInfo } = cur;
7445
- const size = [
7446
- foldInfo.measureValue
7447
- ];
7448
- const group = [
7449
- unfoldInfo.groupId
7450
- ];
7451
- const color = [
7452
- foldInfo.measureValue
7453
- ];
7454
- return [
7455
- ...prev,
7456
- {
7457
- size,
7458
- group,
7459
- color
7460
- }
7461
- ];
7462
- }, []);
7463
6806
  return {
7464
- ...result,
7465
- encoding
6807
+ ...advancedVSeed,
6808
+ encoding: mergedEncoding
7466
6809
  };
7467
6810
  };
7468
6811
  const funnelAdvancedPipeline = [
7469
6812
  initAdvancedVSeed_initAdvancedVSeed,
7470
6813
  autoMeasures_autoMeasures,
7471
6814
  autoDimensions_autoDimensions,
6815
+ encodingForFunnel,
7472
6816
  pivotAdapter([
7473
- reshapeTo1D1M
6817
+ reshapeWithEncoding
7474
6818
  ], [
7475
- pivotReshapeTo1D1M
6819
+ pivotReshapeWithEncoding
7476
6820
  ]),
7477
- encodingFunnel,
7478
6821
  funnelConfig,
7479
6822
  theme_theme,
7480
6823
  annotation_annotation
@@ -7484,11 +6827,12 @@ const initFunnel = (spec, context)=>{
7484
6827
  ...spec
7485
6828
  };
7486
6829
  const { advancedVSeed } = context;
7487
- const { encoding } = advancedVSeed;
7488
- if (!encoding[0].size || !encoding[0].group || !encoding[0].color) return result;
6830
+ const { datasetReshapeInfo } = advancedVSeed;
6831
+ const { foldInfo, unfoldInfo } = datasetReshapeInfo[0];
7489
6832
  result.type = 'funnel';
7490
- result.valueField = encoding[0].size[0];
7491
- result.categoryField = encoding[0].group[0];
6833
+ result.valueField = foldInfo.measureValue;
6834
+ result.categoryField = unfoldInfo.encodingDetail;
6835
+ result.seriesField = unfoldInfo.encodingColorId;
7492
6836
  result.padding = 0;
7493
6837
  result.isTransform = true;
7494
6838
  result.shape = 'rect';
@@ -7503,7 +6847,7 @@ const initFunnel = (spec, context)=>{
7503
6847
  style: {
7504
6848
  cornerRadius: 4,
7505
6849
  fill: {
7506
- field: encoding[0].color[0],
6850
+ field: unfoldInfo.encodingColorId,
7507
6851
  scale: 'color'
7508
6852
  }
7509
6853
  },
@@ -7519,99 +6863,13 @@ const initFunnel = (spec, context)=>{
7519
6863
  result.animation = true;
7520
6864
  return result;
7521
6865
  };
7522
- const linearColor = (spec, context)=>{
7523
- const result = {
7524
- ...spec
7525
- };
7526
- const { advancedVSeed } = context;
7527
- const { datasetReshapeInfo, chartType, encoding } = advancedVSeed;
7528
- const baseConfig = advancedVSeed.config[chartType];
7529
- if (!baseConfig || !baseConfig.color) return result;
7530
- const { color } = baseConfig;
7531
- const { colorScheme } = color;
7532
- result.color = {
7533
- type: 'linear',
7534
- domain: [
7535
- {
7536
- dataId: datasetReshapeInfo[0].id,
7537
- fields: encoding?.[0]?.color
7538
- }
7539
- ],
7540
- range: colorScheme
7541
- };
7542
- return result;
7543
- };
7544
- const colorLegend = (spec, context)=>{
7545
- const result = {
7546
- ...spec
7547
- };
7548
- const { advancedVSeed } = context;
7549
- const { chartType } = advancedVSeed;
7550
- const baseConfig = advancedVSeed.config[chartType];
7551
- const { encoding } = advancedVSeed;
7552
- if (!encoding[0].color) return result;
7553
- if (!baseConfig || !baseConfig.legend) return result;
7554
- const { legend } = baseConfig;
7555
- const { enable, position = 'bottom' } = legend || {};
7556
- const orient = [
7557
- 'bottom',
7558
- 'bottomLeft',
7559
- 'bottomRight',
7560
- 'bl',
7561
- 'br'
7562
- ].includes(position) ? 'bottom' : [
7563
- 'top',
7564
- 'topLeft',
7565
- 'topRight',
7566
- 'tl',
7567
- 'tr'
7568
- ].includes(position) ? 'top' : [
7569
- 'left',
7570
- 'leftTop',
7571
- 'leftBottom',
7572
- 'lt',
7573
- 'lb'
7574
- ].includes(position) ? 'left' : 'right';
7575
- const legendPosition = [
7576
- 'topLeft',
7577
- 'bottomLeft',
7578
- 'leftTop',
7579
- 'rightTop',
7580
- 'lt',
7581
- 'rt',
7582
- 'tl',
7583
- 'bl'
7584
- ].includes(position) ? 'start' : [
7585
- 'topRight',
7586
- 'bottomRight',
7587
- 'leftBottom',
7588
- 'rightBottom',
7589
- 'lb',
7590
- 'rb',
7591
- 'rt',
7592
- 'br'
7593
- ].includes(position) ? 'end' : 'middle';
7594
- result.legends = {
7595
- type: 'color',
7596
- visible: enable,
7597
- orient,
7598
- position: legendPosition,
7599
- field: encoding[0].color[0],
7600
- inverse: !![
7601
- 'left',
7602
- 'right'
7603
- ].includes(orient)
7604
- };
7605
- return result;
7606
- };
7607
6866
  const funnel = [
7608
6867
  initFunnel,
7609
- linearColor,
7610
6868
  background_backgroundColor,
7611
6869
  datasetXY,
7612
6870
  label_label,
7613
6871
  tooltip_tooltip,
7614
- colorLegend,
6872
+ discreteLegend,
7615
6873
  annotationPoint_annotationPoint,
7616
6874
  annotationVerticalLine_annotationVerticalLine,
7617
6875
  annotationHorizontalLine_annotationHorizontalLine,
@@ -7624,12 +6882,11 @@ const pivotFunnel = [
7624
6882
  datasetPivot,
7625
6883
  pivotIndicators_pivotIndicators([
7626
6884
  initFunnel,
7627
- linearColor,
7628
6885
  background_backgroundColor,
7629
6886
  datasetXY,
7630
6887
  label_label,
7631
6888
  tooltip_tooltip,
7632
- colorLegend,
6889
+ discreteLegend,
7633
6890
  annotationPoint_annotationPoint,
7634
6891
  annotationVerticalLine_annotationVerticalLine,
7635
6892
  annotationHorizontalLine_annotationHorizontalLine,
@@ -7645,49 +6902,42 @@ const registerFunnel = ()=>{
7645
6902
  Builder._advancedPipelineMap.funnel = funnelAdvancedPipeline;
7646
6903
  Builder._specPipelineMap.funnel = funnelSpecPipeline;
7647
6904
  };
7648
- const encodingMatrix = (advancedVSeed)=>{
7649
- const result = {
7650
- ...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: []
7651
6925
  };
7652
- const { datasetReshapeInfo, dimensions } = advancedVSeed;
7653
- if (!datasetReshapeInfo || !dimensions) return result;
7654
- const xDimension = dimensions.find((item)=>'rowDimension' !== item.location && 'columnDimension' !== item.location) || dimensions[0];
7655
- const isZeroDimension = 0 === dimensions.length;
7656
- const encoding = datasetReshapeInfo.reduce((prev, cur)=>{
7657
- const { foldInfo, unfoldInfo } = cur;
7658
- const x = [
7659
- isZeroDimension ? foldInfo.measureName : xDimension?.id
7660
- ];
7661
- const y = [
7662
- unfoldInfo.groupName
7663
- ];
7664
- const color = [
7665
- foldInfo.measureValue
7666
- ];
7667
- return [
7668
- ...prev,
7669
- {
7670
- x,
7671
- y,
7672
- color
7673
- }
7674
- ];
7675
- }, []);
7676
6926
  return {
7677
- ...result,
7678
- encoding
6927
+ ...advancedVSeed,
6928
+ encoding: mergedEncoding
7679
6929
  };
7680
6930
  };
7681
6931
  const heatmapAdvancedPipeline = [
7682
6932
  initAdvancedVSeed_initAdvancedVSeed,
7683
6933
  autoMeasures_autoMeasures,
7684
6934
  autoDimensions_autoDimensions,
6935
+ encodingForHeatmap,
7685
6936
  pivotAdapter([
7686
- reshapeTo2D1M
6937
+ reshapeWithEncoding
7687
6938
  ], [
7688
- pivotReshapeTo2D1M
6939
+ pivotReshapeWithEncoding
7689
6940
  ]),
7690
- encodingMatrix,
7691
6941
  sortXBandAxis,
7692
6942
  heatmapConfig,
7693
6943
  theme_theme,
@@ -7709,23 +6959,20 @@ const initHeatmap = (spec, context)=>{
7709
6959
  ...spec
7710
6960
  };
7711
6961
  const { advancedVSeed } = context;
7712
- const { encoding } = advancedVSeed;
7713
- if (!encoding[0].y || !encoding[0].x || !encoding[0].color) return result;
6962
+ const { datasetReshapeInfo } = advancedVSeed;
6963
+ const { unfoldInfo, foldInfo } = datasetReshapeInfo[0];
7714
6964
  result.type = 'heatmap';
7715
6965
  result.direction = 'vertical';
7716
- result.xField = encoding[0].x[0];
7717
- result.yField = encoding[0].y[0];
7718
- 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;
7719
6970
  result.padding = 0;
7720
6971
  result.cell = {
7721
6972
  style: {
7722
6973
  shape: 'rect',
7723
6974
  stroke: '#ffffff',
7724
- lineWidth: 1,
7725
- fill: {
7726
- field: encoding[0].color[0],
7727
- scale: 'color'
7728
- }
6975
+ lineWidth: 1
7729
6976
  }
7730
6977
  };
7731
6978
  result.axes = [
@@ -7750,12 +6997,11 @@ const initHeatmap = (spec, context)=>{
7750
6997
  };
7751
6998
  const heatmap = [
7752
6999
  initHeatmap,
7753
- linearColor,
7754
7000
  background_backgroundColor,
7755
7001
  datasetXY,
7756
7002
  label_label,
7757
7003
  labelColorInversion,
7758
- colorLegend,
7004
+ discreteLegend,
7759
7005
  tooltip_tooltip,
7760
7006
  pointStyle_pointStyle,
7761
7007
  pointStateDimensionHover,
@@ -7772,12 +7018,11 @@ const pivotHeatmap = [
7772
7018
  datasetPivot,
7773
7019
  pivotIndicators_pivotIndicators([
7774
7020
  initHeatmap,
7775
- linearColor,
7776
7021
  background_backgroundColor,
7777
7022
  datasetXY,
7778
7023
  label_label,
7779
7024
  labelColorInversion,
7780
- colorLegend,
7025
+ discreteLegend,
7781
7026
  tooltip_tooltip,
7782
7027
  pointStyle_pointStyle,
7783
7028
  pointStateDimensionHover,
@@ -8045,12 +7290,6 @@ const lightTheme = ()=>{
8045
7290
  yAxis: linearAxis,
8046
7291
  crosshairLine
8047
7292
  },
8048
- areaRange: {
8049
- ...baseConfig,
8050
- xAxis: bandAxis,
8051
- yAxis: linearAxis,
8052
- crosshairLine
8053
- },
8054
7293
  scatter: {
8055
7294
  ...baseConfig,
8056
7295
  xAxis: {
@@ -8383,12 +7622,6 @@ const darkTheme = ()=>{
8383
7622
  yAxis: linearAxis,
8384
7623
  crosshairLine: crosshairLine
8385
7624
  },
8386
- areaRange: {
8387
- ...baseConfig,
8388
- xAxis: bandAxis,
8389
- yAxis: linearAxis,
8390
- crosshairLine: crosshairLine
8391
- },
8392
7625
  scatter: {
8393
7626
  ...baseConfig,
8394
7627
  xAxis: {
@@ -8486,7 +7719,6 @@ const registerAll = ()=>{
8486
7719
  registerBarPercent();
8487
7720
  registerArea();
8488
7721
  registerAreaPercent();
8489
- registerAreaRange();
8490
7722
  registerScatter();
8491
7723
  registerDualAxis();
8492
7724
  registerPie();
@@ -8520,7 +7752,6 @@ const zChartType = z["enum"]([
8520
7752
  'barParallel',
8521
7753
  'area',
8522
7754
  'areaPercent',
8523
- 'areaRange',
8524
7755
  'scatter',
8525
7756
  'dualAxis',
8526
7757
  'rose',
@@ -8618,6 +7849,12 @@ const zDualMeasure = z.object({
8618
7849
  secondaryMeasures: z.array(zMeasure).or(zMeasure).optional()
8619
7850
  });
8620
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);
8621
7858
  const zFoldInfo = z.object({
8622
7859
  foldMap: z.record(z.string(), z.string().or(z.undefined())),
8623
7860
  measureId: z.string(),
@@ -8625,10 +7862,14 @@ const zFoldInfo = z.object({
8625
7862
  measureValue: z.string()
8626
7863
  });
8627
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(),
8628
7871
  colorItems: z.array(z.string()),
8629
- groupId: z.string(),
8630
- colorIdMap: z.record(z.string(), z.string()),
8631
- groupName: z.string()
7872
+ colorIdMap: z.record(z.string(), z.string())
8632
7873
  });
8633
7874
  const zDatasetReshapeInfo = z.array(z.object({
8634
7875
  id: z.string(),
@@ -8637,16 +7878,21 @@ const zDatasetReshapeInfo = z.array(z.object({
8637
7878
  foldInfoList: z.array(zFoldInfo).nullish(),
8638
7879
  unfoldInfo: zUnfoldInfo
8639
7880
  }));
8640
- const zEncoding = z.array(z.object({
7881
+ const zEncoding = z.object({
8641
7882
  x: z.array(z.string()).nullish(),
8642
7883
  y: z.array(z.string()).nullish(),
8643
- color: z.array(z.string()).nullish(),
8644
- group: z.array(z.string()).nullish(),
8645
7884
  angle: z.array(z.string()).nullish(),
8646
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(),
8647
7889
  tooltip: z.array(z.string()).nullish(),
8648
- size: z.array(z.string()).nullish()
8649
- }));
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);
8650
7896
  const zXBandAxis = z.object({
8651
7897
  visible: z.boolean().default(true).nullish(),
8652
7898
  labelAutoHide: z.boolean().default(true).nullish(),
@@ -8909,7 +8155,6 @@ const zAreaConfig = z.object({
8909
8155
  crosshairLine: zCrosshairLine.nullish()
8910
8156
  });
8911
8157
  const zAreaPercentConfig = zAreaConfig;
8912
- const zAreaRangeConfig = zAreaConfig;
8913
8158
  const zDualAxisConfig = z.object({
8914
8159
  backgroundColor: zBackgroundColor.nullish(),
8915
8160
  label: zLabel.nullish(),
@@ -8964,7 +8209,6 @@ const zConfig = z.object({
8964
8209
  barPercent: zBarPercentConfig.nullish(),
8965
8210
  area: zAreaConfig.nullish(),
8966
8211
  areaPercent: zAreaPercentConfig.nullish(),
8967
- areaRange: zAreaRangeConfig.nullish(),
8968
8212
  scatter: zScatterConfig.nullish(),
8969
8213
  dualAxis: zDualAxisConfig.nullish(),
8970
8214
  rose: zRoseConfig.nullish(),
@@ -9403,6 +8647,7 @@ const zPivotTable = z.object({
9403
8647
  const zLine = z.object({
9404
8648
  chartType: z.literal('line'),
9405
8649
  dataset: zDataset.nullish(),
8650
+ encoding: zEncoding.nullish(),
9406
8651
  dimensions: zDimensions.nullish(),
9407
8652
  measures: zMeasureTree.nullish(),
9408
8653
  backgroundColor: zBackgroundColor.nullish(),
@@ -9427,6 +8672,7 @@ const zLine = z.object({
9427
8672
  const zColumn = z.object({
9428
8673
  chartType: z.literal('column'),
9429
8674
  dataset: zDataset.nullish(),
8675
+ encoding: zEncoding.nullish(),
9430
8676
  dimensions: zDimensions.nullish(),
9431
8677
  measures: zMeasureTree.nullish(),
9432
8678
  backgroundColor: zBackgroundColor.nullish(),
@@ -9449,6 +8695,7 @@ const zColumn = z.object({
9449
8695
  const zColumnParallel = z.object({
9450
8696
  chartType: z.literal('columnParallel'),
9451
8697
  dataset: zDataset.nullish(),
8698
+ encoding: zEncoding.nullish(),
9452
8699
  dimensions: zDimensions.nullish(),
9453
8700
  measures: zMeasureTree.nullish(),
9454
8701
  backgroundColor: zBackgroundColor.nullish(),
@@ -9471,6 +8718,7 @@ const zColumnParallel = z.object({
9471
8718
  const zColumnPercent = z.object({
9472
8719
  chartType: z.literal('columnPercent'),
9473
8720
  dataset: zDataset.nullish(),
8721
+ encoding: zEncoding.nullish(),
9474
8722
  dimensions: zDimensions.nullish(),
9475
8723
  measures: zMeasureTree.nullish(),
9476
8724
  backgroundColor: zBackgroundColor.nullish(),
@@ -9493,6 +8741,7 @@ const zColumnPercent = z.object({
9493
8741
  const zBar = z.object({
9494
8742
  chartType: z.literal('bar'),
9495
8743
  dataset: zDataset.nullish(),
8744
+ encoding: zEncoding.nullish(),
9496
8745
  dimensions: zDimensions.nullish(),
9497
8746
  measures: zMeasureTree.nullish(),
9498
8747
  backgroundColor: zBackgroundColor.nullish(),
@@ -9515,6 +8764,7 @@ const zBar = z.object({
9515
8764
  const zBarParallel = z.object({
9516
8765
  chartType: z.literal('barParallel'),
9517
8766
  dataset: zDataset.nullish(),
8767
+ encoding: zEncoding.nullish(),
9518
8768
  dimensions: zDimensions.nullish(),
9519
8769
  measures: zMeasureTree.nullish(),
9520
8770
  backgroundColor: zBackgroundColor.nullish(),
@@ -9537,6 +8787,7 @@ const zBarParallel = z.object({
9537
8787
  const zBarPercent = z.object({
9538
8788
  chartType: z.literal('barPercent'),
9539
8789
  dataset: zDataset.nullish(),
8790
+ encoding: zEncoding.nullish(),
9540
8791
  dimensions: zDimensions.nullish(),
9541
8792
  measures: zMeasureTree.nullish(),
9542
8793
  backgroundColor: zBackgroundColor.nullish(),
@@ -9559,6 +8810,7 @@ const zBarPercent = z.object({
9559
8810
  const zArea = z.object({
9560
8811
  chartType: z.literal('area'),
9561
8812
  dataset: zDataset.nullish(),
8813
+ encoding: zEncoding.nullish(),
9562
8814
  dimensions: zDimensions.nullish(),
9563
8815
  measures: zMeasureTree.nullish(),
9564
8816
  backgroundColor: zBackgroundColor.nullish(),
@@ -9582,6 +8834,7 @@ const zArea = z.object({
9582
8834
  const zAreaPercent = z.object({
9583
8835
  chartType: z.literal('areaPercent'),
9584
8836
  dataset: zDataset.nullish(),
8837
+ encoding: zEncoding.nullish(),
9585
8838
  dimensions: zDimensions.nullish(),
9586
8839
  measures: zMeasureTree.nullish(),
9587
8840
  backgroundColor: zBackgroundColor.nullish(),
@@ -9602,31 +8855,13 @@ const zAreaPercent = z.object({
9602
8855
  annotationArea: z.array(zAnnotationArea).or(zAnnotationArea).nullish(),
9603
8856
  locale: zLocale.nullish()
9604
8857
  });
9605
- const zAreaRange = z.object({
9606
- chartType: z.literal('areaRange'),
9607
- dataset: zDataset.nullish(),
9608
- dimensions: zDimensions.nullish(),
9609
- measures: zMeasureTree.nullish(),
9610
- backgroundColor: zBackgroundColor.nullish(),
9611
- label: zLabel.nullish(),
9612
- xAxis: zXBandAxis.nullish(),
9613
- yAxis: zYLinearAxis.nullish(),
9614
- crosshairLine: zCrosshairLine.nullish(),
9615
- theme: zTheme.nullish(),
9616
- pointStyle: z.array(zPointStyle).or(zPointStyle).nullish(),
9617
- lineStyle: z.array(zLineStyle).or(zLineStyle).nullish(),
9618
- areaStyle: z.array(zAreaStyle).or(zAreaStyle).nullish(),
9619
- annotationPoint: z.array(zAnnotationPoint).or(zAnnotationPoint).nullish(),
9620
- annotationVerticalLine: z.array(zAnnotationVerticalLine).or(zAnnotationVerticalLine).nullish(),
9621
- annotationHorizontalLine: z.array(zAnnotationHorizontalLine).or(zAnnotationHorizontalLine).nullish(),
9622
- annotationArea: z.array(zAnnotationArea).or(zAnnotationArea).nullish(),
9623
- locale: zLocale.nullish()
9624
- });
9625
8858
  const zScatter = z.object({
9626
8859
  chartType: z.literal('scatter'),
9627
8860
  dataset: zDataset.nullish(),
8861
+ encoding: zEncoding.nullish(),
9628
8862
  dimensions: zDimensions.nullish(),
9629
8863
  measures: zMeasureTree.nullish(),
8864
+ scatterMeasures: zScatterMeasures.nullish(),
9630
8865
  backgroundColor: zBackgroundColor.nullish(),
9631
8866
  color: zColor.nullish(),
9632
8867
  label: zLabel.nullish(),
@@ -9676,6 +8911,7 @@ const zDualAxis = z.object({
9676
8911
  const zRose = z.object({
9677
8912
  chartType: z.literal('rose'),
9678
8913
  dataset: zDataset.nullish(),
8914
+ encoding: zEncoding.nullish(),
9679
8915
  dimensions: zDimensions.nullish(),
9680
8916
  measures: zMeasureTree.nullish(),
9681
8917
  backgroundColor: zBackgroundColor.nullish(),
@@ -9689,6 +8925,7 @@ const zRose = z.object({
9689
8925
  const zRoseParallel = z.object({
9690
8926
  chartType: z.literal('roseParallel'),
9691
8927
  dataset: zDataset.nullish(),
8928
+ encoding: zEncoding.nullish(),
9692
8929
  dimensions: zDimensions.nullish(),
9693
8930
  measures: zMeasureTree.nullish(),
9694
8931
  backgroundColor: zBackgroundColor.nullish(),
@@ -9702,6 +8939,7 @@ const zRoseParallel = z.object({
9702
8939
  const zPie = z.object({
9703
8940
  chartType: z.literal('pie'),
9704
8941
  dataset: zDataset.nullish(),
8942
+ encoding: zEncoding.nullish(),
9705
8943
  dimensions: zDimensions.nullish(),
9706
8944
  measures: zMeasureTree.nullish(),
9707
8945
  backgroundColor: zBackgroundColor.nullish(),
@@ -9715,6 +8953,7 @@ const zPie = z.object({
9715
8953
  const zDonut = z.object({
9716
8954
  chartType: z.literal('donut'),
9717
8955
  dataset: zDataset.nullish(),
8956
+ encoding: zEncoding.nullish(),
9718
8957
  dimensions: zDimensions.nullish(),
9719
8958
  measures: zMeasureTree.nullish(),
9720
8959
  backgroundColor: zBackgroundColor.nullish(),
@@ -9728,6 +8967,7 @@ const zDonut = z.object({
9728
8967
  const zRadar = z.object({
9729
8968
  chartType: z.literal('radar'),
9730
8969
  dataset: zDataset.nullish(),
8970
+ encoding: zEncoding.nullish(),
9731
8971
  dimensions: zDimensions.nullish(),
9732
8972
  measures: zMeasureTree.nullish(),
9733
8973
  backgroundColor: zBackgroundColor.nullish(),
@@ -9741,6 +8981,7 @@ const zRadar = z.object({
9741
8981
  const zFunnel = z.object({
9742
8982
  chartType: z.literal('funnel'),
9743
8983
  dataset: zDataset.nullish(),
8984
+ encoding: zEncoding.nullish(),
9744
8985
  dimensions: zDimensions.nullish(),
9745
8986
  measures: zMeasureTree.nullish(),
9746
8987
  backgroundColor: zBackgroundColor.nullish(),
@@ -9776,7 +9017,6 @@ const zVSeed = z.discriminatedUnion('chartType', [
9776
9017
  zBarPercent,
9777
9018
  zArea,
9778
9019
  zAreaPercent,
9779
- zAreaRange,
9780
9020
  zScatter,
9781
9021
  zDualAxis,
9782
9022
  zPie,
@@ -9794,6 +9034,7 @@ const zAdvancedVSeed = z.object({
9794
9034
  dimensions: zDimensionTree,
9795
9035
  measures: zMeasureTree,
9796
9036
  encoding: zEncoding,
9037
+ encodings: zEncodings,
9797
9038
  config: zConfig,
9798
9039
  analysis: zAnalysis,
9799
9040
  theme: zTheme,
@@ -9802,6 +9043,6 @@ const zAdvancedVSeed = z.object({
9802
9043
  annotation: zAnnotation,
9803
9044
  locale: zLocale
9804
9045
  });
9805
- 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 };
9806
9047
 
9807
9048
  //# sourceMappingURL=index.js.map