@visactor/vseed 0.1.3 → 0.1.5

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 (49) hide show
  1. package/dist/builder/builder/builder.d.ts +4 -2
  2. package/dist/dataReshape/foldMeasures.d.ts +2 -2
  3. package/dist/index.cjs +1001 -765
  4. package/dist/index.cjs.map +1 -1
  5. package/dist/index.js +1014 -778
  6. package/dist/index.js.map +1 -1
  7. package/dist/pipeline/advanced/chart/pipes/init/index.d.ts +1 -0
  8. package/dist/pipeline/advanced/chart/pipes/init/utils.d.ts +2 -0
  9. package/dist/pipeline/advanced/chart/pipes/measures/index.d.ts +1 -0
  10. package/dist/pipeline/spec/chart/pipes/color/colorCellStyleFill.d.ts +2 -0
  11. package/dist/pipeline/spec/chart/pipes/color/colorFunnelStyleFill.d.ts +2 -0
  12. package/dist/pipeline/spec/chart/pipes/color/colorPieStyleFill.d.ts +2 -0
  13. package/dist/pipeline/spec/chart/pipes/color/colorRoseStyleFill.d.ts +2 -0
  14. package/dist/pipeline/spec/chart/pipes/color/index.d.ts +4 -0
  15. package/dist/pipeline/spec/chart/pipes/markStyle/cellStyle.d.ts +2 -0
  16. package/dist/pipeline/spec/chart/pipes/markStyle/funnelStyle.d.ts +2 -0
  17. package/dist/pipeline/spec/chart/pipes/markStyle/index.d.ts +5 -1
  18. package/dist/pipeline/spec/chart/pipes/markStyle/pieStyle.d.ts +2 -0
  19. package/dist/pipeline/spec/chart/pipes/markStyle/roseStyle.d.ts +2 -0
  20. package/dist/types/advancedVSeed.d.ts +16 -5
  21. package/dist/types/chartType/area/zArea.d.ts +16 -5
  22. package/dist/types/chartType/areaPercent/zAreaPercent.d.ts +16 -5
  23. package/dist/types/chartType/bar/zBar.d.ts +16 -5
  24. package/dist/types/chartType/barParallel/zBarParallel.d.ts +16 -5
  25. package/dist/types/chartType/barPercent/zBarPercent.d.ts +16 -5
  26. package/dist/types/chartType/column/zColumn.d.ts +16 -5
  27. package/dist/types/chartType/columnParallel/zColumnParallel.d.ts +16 -5
  28. package/dist/types/chartType/columnPercent/zColumnPercent.d.ts +16 -5
  29. package/dist/types/chartType/donut/zDonut.d.ts +16 -5
  30. package/dist/types/chartType/dualAxis/zDualAxis.d.ts +36 -25
  31. package/dist/types/chartType/funnel/zFunnel.d.ts +16 -5
  32. package/dist/types/chartType/heatmap/zHeatmap.d.ts +16 -5
  33. package/dist/types/chartType/line/zLine.d.ts +16 -5
  34. package/dist/types/chartType/pie/zPie.d.ts +16 -5
  35. package/dist/types/chartType/pivotTable/zPivotTable.d.ts +16 -5
  36. package/dist/types/chartType/radar/zRadar.d.ts +16 -5
  37. package/dist/types/chartType/rose/zRose.d.ts +16 -5
  38. package/dist/types/chartType/roseParallel/zRoseParallel.d.ts +16 -5
  39. package/dist/types/chartType/scatter/zScatter.d.ts +36 -25
  40. package/dist/types/chartType/table/zTable.d.ts +16 -5
  41. package/dist/types/properties/dimensions/dimensions.d.ts +16 -0
  42. package/dist/types/properties/dimensions/zDimensions.d.ts +33 -0
  43. package/dist/types/properties/measures/zDualMeasures.d.ts +40 -40
  44. package/dist/types/properties/measures/zMeasures.d.ts +15 -15
  45. package/dist/types/properties/measures/zScatterMeasures.d.ts +40 -40
  46. package/dist/types/zVseed.d.ts +360 -140
  47. package/dist/umd/index.js +953 -703
  48. package/dist/umd/index.js.map +1 -1
  49. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { clone, groupBy, isArray, isEmpty, isNullish, isNumber, isObjectType, isString, merge, mergeDeep, omit, pick, sort, unique } from "remeda";
1
+ import { clone, groupBy, isArray, isEmpty as external_remeda_isEmpty, isNullish, isNumber, isObjectType, isString, merge, mergeDeep, omit, pick, sort, unique, uniqueBy } from "remeda";
2
2
  import { z } from "zod";
3
3
  const execPipeline = (pipeline, context, initialValue = {})=>{
4
4
  const result = pipeline.reduce((prev, cur)=>cur(prev, context), initialValue);
@@ -519,7 +519,7 @@ const measureTreeToColumns = (spec, context)=>{
519
519
  const fieldFormat = (node, locale)=>(datum)=>{
520
520
  const { format = {}, autoFormat = true, id } = node;
521
521
  const value = datum[id];
522
- if (!isEmpty(format)) {
522
+ if (!external_remeda_isEmpty(format)) {
523
523
  const formatter = createFormatter(format);
524
524
  return formatter(value);
525
525
  }
@@ -882,7 +882,7 @@ const pivotIndicators = (spec, context)=>{
882
882
  };
883
883
  const pivotIndicators_fieldFormat = (node, locale)=>(value)=>{
884
884
  const { format = {}, autoFormat = true } = node;
885
- if (!isEmpty(format)) {
885
+ if (!external_remeda_isEmpty(format)) {
886
886
  const formatter = createFormatter(format);
887
887
  return formatter(value);
888
888
  }
@@ -1036,6 +1036,56 @@ const initAdvancedVSeed_initAdvancedVSeed = (advancedVSeed, context)=>{
1036
1036
  locale: locale || 'zh-CN'
1037
1037
  };
1038
1038
  };
1039
+ const ORIGINAL_DATA = '__OriginalData__';
1040
+ const Separator = '-';
1041
+ const FoldMeasureName = '__MeaName__';
1042
+ const FoldMeasureId = '__MeaId__';
1043
+ const FoldMeasureValue = '__MeaValue__';
1044
+ const MeasureName = FoldMeasureName;
1045
+ const FoldPrimaryMeasureValue = '__MeaPrimaryValue__';
1046
+ const FoldSecondaryMeasureValue = '__MeaSecondaryValue__';
1047
+ const FoldXMeasureValue = '__MeaXValue__';
1048
+ const FoldYMeasureValue = '__MeaYValue__';
1049
+ const XEncoding = '__Dim_X__';
1050
+ const YEncoding = '__Dim_Y__';
1051
+ const AngleEncoding = '__Dim_Angle__';
1052
+ const DetailEncoding = '__Dim_Detail__';
1053
+ const ColorEncoding = '__Dim_Color__';
1054
+ const ColorIdEncoding = '__Dim_ColorId__';
1055
+ const getBasicDimensions = (vseed)=>{
1056
+ const { dimensions, dataset } = vseed;
1057
+ const MeaName = {
1058
+ id: MeasureName,
1059
+ alias: intl.i18n`指标名称`
1060
+ };
1061
+ if (!dataset) throw new Error('dataset is required');
1062
+ if (0 === dataset.length) return [];
1063
+ if (dimensions) {
1064
+ const basicDimensions = dimensions.map((dim)=>({
1065
+ location: 'dimension',
1066
+ ...dim
1067
+ }));
1068
+ if (basicDimensions.some((dim)=>dim.id === MeasureName)) return basicDimensions;
1069
+ basicDimensions.push(MeaName);
1070
+ return basicDimensions;
1071
+ }
1072
+ const top100dataset = dataset.slice(0, 100);
1073
+ const sample = top100dataset.reduce((prev, cur)=>({
1074
+ ...prev,
1075
+ ...cur
1076
+ }), {});
1077
+ const basicDimensions = Object.keys(sample).filter((key)=>top100dataset.some((item)=>'string' == typeof item[key]) && ![
1078
+ '',
1079
+ null,
1080
+ void 0
1081
+ ].includes(key)).map((dim)=>({
1082
+ id: dim,
1083
+ alias: dim,
1084
+ location: 'dimension'
1085
+ }));
1086
+ basicDimensions.push(MeaName);
1087
+ return basicDimensions;
1088
+ };
1039
1089
  const getBasicMeasures = (vseed)=>{
1040
1090
  const { dataset, measures } = vseed;
1041
1091
  if (!measures || 0 === measures.length) return generateMeasuresByDataset(dataset);
@@ -1069,6 +1119,52 @@ const isMeasureTreeWithParentId = (vseed)=>{
1069
1119
  if (!measures) return false;
1070
1120
  return measures.some((measure)=>'parentId' in measure);
1071
1121
  };
1122
+ const encodingForLine = (advancedVSeed, context)=>{
1123
+ const { vseed } = context;
1124
+ const { measures: vseedMeasures = [] } = vseed;
1125
+ const measures = vseedMeasures.length ? findAllMeasures(vseedMeasures) : getBasicMeasures(vseed);
1126
+ const dimensions = getBasicDimensions(vseed);
1127
+ const hasDimensionEncoding = dimensions.some((item)=>item.encoding);
1128
+ const hasMeasureEncoding = measures.some((item)=>item.encoding);
1129
+ const encoding = {};
1130
+ if (hasDimensionEncoding) generateDimensionEncoding(dimensions, encoding);
1131
+ else generateDefaultDimensionEncoding(dimensions, encoding);
1132
+ if (hasMeasureEncoding) generateMeasureEncoding(measures, encoding);
1133
+ else generateDefaultMeasureEncoding(measures, encoding);
1134
+ return {
1135
+ ...advancedVSeed,
1136
+ encoding
1137
+ };
1138
+ };
1139
+ const generateDefaultMeasureEncoding = (measures, encoding)=>{
1140
+ encoding.tooltip = unique(measures.map((item)=>item.id));
1141
+ encoding.y = unique(measures.filter((item)=>'yAxis' === item.encoding || !item.encoding).map((item)=>item.id));
1142
+ };
1143
+ const generateDefaultDimensionEncoding = (dimensions, encoding)=>{
1144
+ const uniqueDimIds = unique(dimensions.map((d)=>d.id));
1145
+ encoding.x = uniqueDimIds.slice(0, 1);
1146
+ encoding.color = uniqueDimIds.slice(1);
1147
+ encoding.tooltip = uniqueDimIds;
1148
+ encoding.detail = [];
1149
+ encoding.label = [];
1150
+ encoding.row = [];
1151
+ encoding.column = [];
1152
+ };
1153
+ const generateMeasureEncoding = (measures, encoding)=>{
1154
+ encoding.tooltip = measures.map((item)=>item.id);
1155
+ encoding.y = unique(measures.filter((item)=>'yAxis' === item.encoding || !item.encoding).map((item)=>item.id));
1156
+ const color = unique(measures.filter((item)=>'color' === item.encoding).map((item)=>item.id));
1157
+ if (color.length > 0) encoding.color = color;
1158
+ };
1159
+ const generateDimensionEncoding = (dimensions, encoding)=>{
1160
+ encoding.x = unique(dimensions.filter((item)=>'xAxis' === item.encoding).map((item)=>item.id));
1161
+ encoding.color = unique(dimensions.filter((item)=>'color' === item.encoding).map((item)=>item.id));
1162
+ encoding.detail = [];
1163
+ if (0 === encoding.x.length) encoding.x = [
1164
+ dimensions[0].id
1165
+ ];
1166
+ if (0 === encoding.color.length) encoding.color = dimensions.filter((item)=>!encoding.x?.includes(item.id)).map((item)=>item.id);
1167
+ };
1072
1168
  const measureDepth = (measures = [])=>{
1073
1169
  if (!measures) return 0;
1074
1170
  let depth = 1;
@@ -1089,7 +1185,7 @@ const isPivotChart = (vseed)=>{
1089
1185
  if (isVTable(vseed)) return false;
1090
1186
  if (isMeasureTreeWithParentId(vseed)) {
1091
1187
  const parentIds = vseed.measures?.map((measure)=>measure.parentId);
1092
- return parentIds && parentIds.length > 1;
1188
+ return parentIds && unique(parentIds).length > 1;
1093
1189
  }
1094
1190
  if ('dualAxis' === vseed.chartType || 'scatter' === vseed.chartType) {
1095
1191
  const { dimensions = [] } = vseed;
@@ -1160,22 +1256,6 @@ const basicMeasuresToMeasureTree = (measures)=>{
1160
1256
  }
1161
1257
  ];
1162
1258
  };
1163
- const ORIGINAL_DATA = '__OriginalData__';
1164
- const Separator = '-';
1165
- const FoldMeasureName = '__MeaName__';
1166
- const FoldMeasureId = '__MeaId__';
1167
- const FoldMeasureValue = '__MeaValue__';
1168
- const MeasureName = FoldMeasureName;
1169
- const FoldPrimaryMeasureValue = '__MeaPrimaryValue__';
1170
- const FoldSecondaryMeasureValue = '__MeaSecondaryValue__';
1171
- const FoldXMeasureValue = '__MeaXValue__';
1172
- const FoldYMeasureValue = '__MeaYValue__';
1173
- const XEncoding = '__Dim_X__';
1174
- const YEncoding = '__Dim_Y__';
1175
- const AngleEncoding = '__Dim_Angle__';
1176
- const DetailEncoding = '__Dim_Detail__';
1177
- const ColorEncoding = '__Dim_Color__';
1178
- const ColorIdEncoding = '__Dim_ColorId__';
1179
1259
  const autoDimensions_autoDimensions = (advancedVSeed, context)=>{
1180
1260
  const result = {
1181
1261
  ...advancedVSeed
@@ -1215,52 +1295,13 @@ const autoDimensions_autoDimensions = (advancedVSeed, context)=>{
1215
1295
  result.dimensions.push(MeaName);
1216
1296
  return result;
1217
1297
  };
1218
- const encodingForLine = (advancedVSeed, context)=>{
1219
- const { vseed } = context;
1220
- const { dimensions } = advancedVSeed;
1221
- if (!dimensions) return advancedVSeed;
1222
- const encoding = vseed.encoding;
1223
- if (encoding) {
1224
- const x = encoding.x || [
1225
- dimensions[0].id
1226
- ];
1227
- const color = encoding.color || [
1228
- (dimensions[1] || dimensions[0]).id
1229
- ];
1230
- const detail = encoding.detail || [];
1231
- const mergedDetail = 0 === detail.length ? dimensions.map((d)=>d.id).filter((id)=>!x.includes(id)) : encoding.detail;
1232
- return {
1233
- ...advancedVSeed,
1234
- encoding: {
1235
- ...encoding,
1236
- x,
1237
- color,
1238
- detail: mergedDetail
1239
- }
1240
- };
1241
- }
1242
- const onlyMeasureName = 1 === dimensions.length && dimensions.find((item)=>item.id === MeasureName);
1243
- const mergedEncoding = {
1244
- x: dimensions.slice(0, 1).map((item)=>item.id),
1245
- color: dimensions.slice(onlyMeasureName ? 0 : 1).map((item)=>item.id),
1246
- detail: dimensions.slice(onlyMeasureName ? 0 : 1).map((item)=>item.id),
1247
- tooltip: dimensions.map((item)=>item.id),
1248
- label: [],
1249
- row: [],
1250
- column: []
1251
- };
1252
- return {
1253
- ...advancedVSeed,
1254
- encoding: mergedEncoding
1255
- };
1256
- };
1257
1298
  const pivotAdapter = (pipeline, pivotPipeline)=>(advancedVSeed, context)=>{
1258
1299
  const { vseed } = context;
1259
1300
  const usePivotChart = isPivotChart(vseed);
1260
1301
  if (usePivotChart) return execPipeline(pivotPipeline, context, advancedVSeed);
1261
1302
  return execPipeline(pipeline, context, advancedVSeed);
1262
1303
  };
1263
- const foldMeasures = (dataset, measures, encoding, options)=>{
1304
+ const foldMeasures = (dataset, measures, options)=>{
1264
1305
  const { measureId, measureName, measureValue, colorMeasureId } = options || {};
1265
1306
  const foldInfo = {
1266
1307
  measureId,
@@ -1361,7 +1402,7 @@ const applyEncoding = (encoding, dimensions, datum, separator)=>{
1361
1402
  };
1362
1403
  const dataReshapeByEncoding = (dataset, dimensions, measures, encoding, options)=>{
1363
1404
  const { foldMeasureId = FoldMeasureId, foldMeasureName = FoldMeasureName, foldMeasureValue = FoldMeasureValue, colorItemAsId = false, colorMeasureId } = options || {};
1364
- const { dataset: foldedDataset, foldInfo } = foldMeasures(dataset, measures, encoding, {
1405
+ const { dataset: foldedDataset, foldInfo } = foldMeasures(dataset, measures, {
1365
1406
  measureId: foldMeasureId,
1366
1407
  measureName: foldMeasureName,
1367
1408
  measureValue: foldMeasureValue,
@@ -1405,7 +1446,7 @@ const reshapeWithEncoding = (advancedVSeed, context)=>{
1405
1446
  const { dimensions, measures, encoding } = advancedVSeed;
1406
1447
  if (!measures || !dimensions || !dataset || !encoding) return result;
1407
1448
  if (0 === measures.length) throw new Error('measures can not be empty');
1408
- const { dataset: newDatasets, foldInfo, unfoldInfo } = dataReshapeByEncoding(dataset, dimensions, measures, encoding, {
1449
+ const { dataset: newDatasets, foldInfo, unfoldInfo } = dataReshapeByEncoding(dataset, uniqueBy(dimensions, (item)=>item.id), uniqueBy(findAllMeasures(measures), (item)=>item.id), encoding, {
1409
1450
  colorMeasureId: getColorMeasureId(advancedVSeed)
1410
1451
  });
1411
1452
  return {
@@ -1442,7 +1483,7 @@ const pivotReshapeWithEncoding = (advancedVSeed, context)=>{
1442
1483
  const measures = measureGroup.children;
1443
1484
  if (!measures) return;
1444
1485
  const groupId = measureGroup.id;
1445
- const { dataset: newSubDataset, foldInfo, unfoldInfo } = dataReshapeByEncoding(dataset, dimensions, measures, encoding, {
1486
+ const { dataset: newSubDataset, foldInfo, unfoldInfo } = dataReshapeByEncoding(dataset, uniqueBy(dimensions, (item)=>item.id), uniqueBy(measures, (item)=>item.id), encoding, {
1446
1487
  foldMeasureValue: `${FoldMeasureValue}${groupId}`,
1447
1488
  colorMeasureId: getColorMeasureId(advancedVSeed)
1448
1489
  });
@@ -1651,9 +1692,9 @@ const annotation_annotation = (advancedVSeed, context)=>{
1651
1692
  };
1652
1693
  const lineAdvancedPipeline = [
1653
1694
  initAdvancedVSeed_initAdvancedVSeed,
1695
+ encodingForLine,
1654
1696
  buildMeasures,
1655
1697
  autoDimensions_autoDimensions,
1656
- encodingForLine,
1657
1698
  pivotAdapter([
1658
1699
  reshapeWithEncoding
1659
1700
  ], [
@@ -2014,117 +2055,6 @@ const yLinear = (spec, context)=>{
2014
2055
  ];
2015
2056
  return result;
2016
2057
  };
2017
- const label_label = (spec, context)=>{
2018
- const result = {
2019
- ...spec
2020
- };
2021
- const { advancedVSeed } = context;
2022
- const { measures, datasetReshapeInfo, locale } = advancedVSeed;
2023
- const { chartType } = advancedVSeed;
2024
- const baseConfig = advancedVSeed.config[chartType];
2025
- if (!baseConfig || !baseConfig.label) return result;
2026
- const { measureId, measureValue } = datasetReshapeInfo[0].foldInfo;
2027
- const { label } = baseConfig;
2028
- const { enable } = label;
2029
- result.label = {
2030
- visible: enable,
2031
- formatMethod: (value, datum)=>{
2032
- const result = [];
2033
- const formatValue = (value)=>{
2034
- const id = datum[measureId];
2035
- const measure = findMeasureById(measures, id);
2036
- if (!measure) return value;
2037
- const { format = {}, autoFormat = true } = measure;
2038
- if (!isEmpty(format)) {
2039
- const formatter = createFormatter(format);
2040
- return formatter(value);
2041
- }
2042
- if (autoFormat) return autoFormatter(value, locale);
2043
- return String(value);
2044
- };
2045
- result.push(formatValue(datum[measureValue]));
2046
- return result.join(' ');
2047
- }
2048
- };
2049
- return result;
2050
- };
2051
- const tooltip_tooltip = (spec, context)=>{
2052
- const result = {
2053
- ...spec
2054
- };
2055
- const { advancedVSeed } = context;
2056
- const { measures, datasetReshapeInfo, chartType, locale, dimensions } = advancedVSeed;
2057
- const baseConfig = advancedVSeed.config[chartType];
2058
- const { tooltip = {
2059
- enable: true
2060
- } } = baseConfig;
2061
- const { enable } = tooltip;
2062
- const { measureId, measureValue, measureName } = datasetReshapeInfo[0].foldInfo;
2063
- const { encodingColor: colorName } = datasetReshapeInfo[0].unfoldInfo;
2064
- result.tooltip = {
2065
- visible: enable,
2066
- mark: {
2067
- title: {
2068
- visible: true
2069
- },
2070
- content: [
2071
- ...dimensions.map((item)=>({
2072
- visible: true,
2073
- hasShape: true,
2074
- shapeType: 'rectRound',
2075
- key: (datum)=>{
2076
- if (item.alias || item.id) return item.alias || item.id;
2077
- return datum && datum[item.id];
2078
- },
2079
- value: (datum)=>datum && datum[item.id]
2080
- })),
2081
- {
2082
- visible: true,
2083
- hasShape: true,
2084
- key: (datum)=>datum && datum[measureName || colorName] || '',
2085
- value: (datum)=>{
2086
- if (!datum) return '';
2087
- const value = datum[measureValue];
2088
- const id = datum[measureId];
2089
- const measure = findMeasureById(measures, id);
2090
- if (!measure) return String(value);
2091
- const { format = {}, autoFormat = true } = measure;
2092
- if (!isEmpty(format)) {
2093
- const formatter = createFormatter(format);
2094
- return formatter(value);
2095
- }
2096
- if (autoFormat) return autoFormatter(value, locale);
2097
- return String(value);
2098
- }
2099
- }
2100
- ]
2101
- },
2102
- dimension: {
2103
- content: [
2104
- {
2105
- visible: true,
2106
- key: (datum)=>datum && datum[colorName] || '',
2107
- value: (datum)=>{
2108
- if (!datum) return '';
2109
- const value = datum[measureValue];
2110
- const id = datum[measureId];
2111
- const measure = findMeasureById(measures, id);
2112
- if (!measure) return String(value);
2113
- const { format = {}, autoFormat = true } = measure;
2114
- if (!isEmpty(format)) {
2115
- const formatter = createFormatter(format);
2116
- return formatter(value);
2117
- }
2118
- if (autoFormat) return autoFormatter(value, locale);
2119
- return String(value);
2120
- },
2121
- shapeType: 'rectRound'
2122
- }
2123
- ]
2124
- }
2125
- };
2126
- return result;
2127
- };
2128
2058
  const verticalCrosshairLine = (spec, context)=>{
2129
2059
  const result = {
2130
2060
  ...spec
@@ -2633,72 +2563,183 @@ const lineStyle_lineStyle = (spec, context)=>{
2633
2563
  }
2634
2564
  };
2635
2565
  };
2636
- const isSubset = (sub, obj)=>Object.entries(sub).every(([key, value])=>{
2637
- if ('string' == typeof value) return obj[key] === value;
2638
- if ('number' == typeof value) return obj[key] === value;
2639
- return true;
2640
- });
2641
- const annotationPoint_annotationPoint = (spec, context)=>{
2566
+ const label_label = (spec, context)=>{
2567
+ const result = {
2568
+ ...spec
2569
+ };
2642
2570
  const { advancedVSeed } = context;
2643
- const { annotation } = advancedVSeed;
2644
- if (!annotation || !annotation.annotationPoint) return spec;
2645
- const { annotationPoint } = annotation;
2646
- const annotationPointList = Array.isArray(annotationPoint) ? annotationPoint : [
2647
- annotationPoint
2648
- ];
2649
- const markPoint = annotationPointList.flatMap((annotationPoint)=>{
2650
- const { selector: selectorPoint, text = '', textColor = '#ffffff', textFontSize = 12, textFontWeight = 400, textAlign = 'center', textBaseline = 'top', textBackgroundBorderColor, textBackgroundBorderRadius = 4, textBackgroundBorderWidth = 1, textBackgroundColor = '#212121', textBackgroundPadding = 2, textBackgroundVisible = true, offsetX = 0, offsetY = 0 } = annotationPoint;
2651
- const dataset = advancedVSeed.dataset.flat();
2652
- const selectedData = selectorPoint ? dataset.filter((datum)=>selector_selector(datum, selectorPoint)) : [];
2653
- return selectedData.map((datum)=>({
2654
- zIndex: ANNOTATION_Z_INDEX,
2655
- regionRelative: true,
2656
- position: (data, context)=>{
2657
- const targetDatum = data.find((item)=>isSubset(datum, item));
2658
- if (targetDatum) {
2659
- const { x, y } = context.dataToPosition(targetDatum);
2660
- return {
2661
- x,
2662
- y
2663
- };
2664
- }
2665
- },
2666
- itemLine: {
2667
- visible: false
2668
- },
2669
- itemContent: {
2670
- offsetY,
2671
- offsetX,
2672
- text: {
2673
- text: text,
2674
- style: {
2675
- visible: true,
2676
- textAlign: textAlign,
2677
- textBaseline: textBaseline,
2678
- fill: textColor,
2679
- stroke: textBackgroundColor,
2680
- lineWidth: 1,
2681
- fontSize: textFontSize,
2682
- fontWeight: textFontWeight,
2683
- dy: textFontSize
2684
- },
2685
- labelBackground: {
2686
- visible: textBackgroundVisible,
2687
- padding: textBackgroundPadding,
2688
- style: {
2689
- cornerRadius: textBackgroundBorderRadius ?? 4,
2690
- fill: textBackgroundColor,
2691
- stroke: textBackgroundBorderColor,
2692
- lineWidth: textBackgroundBorderWidth,
2693
- dy: textFontSize
2694
- }
2695
- }
2696
- }
2697
- }
2698
- }));
2699
- });
2700
- return {
2701
- ...spec,
2571
+ const { measures, datasetReshapeInfo, locale } = advancedVSeed;
2572
+ const { chartType } = advancedVSeed;
2573
+ const baseConfig = advancedVSeed.config[chartType];
2574
+ if (!baseConfig || !baseConfig.label) return result;
2575
+ const { measureId, measureValue } = datasetReshapeInfo[0].foldInfo;
2576
+ const { label } = baseConfig;
2577
+ const { enable } = label;
2578
+ result.label = {
2579
+ visible: enable,
2580
+ formatMethod: (value, datum)=>{
2581
+ const result = [];
2582
+ const formatValue = (value)=>{
2583
+ const id = datum[measureId];
2584
+ const measure = findMeasureById(measures, id);
2585
+ if (!measure) return value;
2586
+ const { format = {}, autoFormat = true } = measure;
2587
+ if (!external_remeda_isEmpty(format)) {
2588
+ const formatter = createFormatter(format);
2589
+ return formatter(value);
2590
+ }
2591
+ if (autoFormat) return autoFormatter(value, locale);
2592
+ return String(value);
2593
+ };
2594
+ result.push(formatValue(datum[measureValue]));
2595
+ return result.join(' ');
2596
+ }
2597
+ };
2598
+ return result;
2599
+ };
2600
+ const tooltip_tooltip = (spec, context)=>{
2601
+ const result = {
2602
+ ...spec
2603
+ };
2604
+ const { advancedVSeed } = context;
2605
+ const { measures, datasetReshapeInfo, chartType, locale, dimensions } = advancedVSeed;
2606
+ const baseConfig = advancedVSeed.config[chartType];
2607
+ const { tooltip = {
2608
+ enable: true
2609
+ } } = baseConfig;
2610
+ const { enable } = tooltip;
2611
+ const { measureId, measureValue, measureName } = datasetReshapeInfo[0].foldInfo;
2612
+ const { encodingColor: colorName } = datasetReshapeInfo[0].unfoldInfo;
2613
+ result.tooltip = {
2614
+ visible: enable,
2615
+ mark: {
2616
+ title: {
2617
+ visible: true
2618
+ },
2619
+ content: [
2620
+ ...dimensions.map((item)=>({
2621
+ visible: true,
2622
+ hasShape: true,
2623
+ shapeType: 'rectRound',
2624
+ key: (datum)=>{
2625
+ if (item.alias || item.id) return item.alias || item.id;
2626
+ return datum && datum[item.id];
2627
+ },
2628
+ value: (datum)=>datum && datum[item.id]
2629
+ })),
2630
+ {
2631
+ visible: true,
2632
+ hasShape: true,
2633
+ key: (datum)=>datum && datum[measureName || colorName] || '',
2634
+ value: (datum)=>{
2635
+ if (!datum) return '';
2636
+ const value = datum[measureValue];
2637
+ const id = datum[measureId];
2638
+ const measure = findMeasureById(measures, id);
2639
+ if (!measure) return String(value);
2640
+ const { format = {}, autoFormat = true } = measure;
2641
+ if (!external_remeda_isEmpty(format)) {
2642
+ const formatter = createFormatter(format);
2643
+ return formatter(value);
2644
+ }
2645
+ if (autoFormat) return autoFormatter(value, locale);
2646
+ return String(value);
2647
+ }
2648
+ }
2649
+ ]
2650
+ },
2651
+ dimension: {
2652
+ content: [
2653
+ {
2654
+ visible: true,
2655
+ key: (datum)=>datum && datum[colorName] || '',
2656
+ value: (datum)=>{
2657
+ if (!datum) return '';
2658
+ const value = datum[measureValue];
2659
+ const id = datum[measureId];
2660
+ const measure = findMeasureById(measures, id);
2661
+ if (!measure) return String(value);
2662
+ const { format = {}, autoFormat = true } = measure;
2663
+ if (!external_remeda_isEmpty(format)) {
2664
+ const formatter = createFormatter(format);
2665
+ return formatter(value);
2666
+ }
2667
+ if (autoFormat) return autoFormatter(value, locale);
2668
+ return String(value);
2669
+ },
2670
+ shapeType: 'rectRound'
2671
+ }
2672
+ ]
2673
+ }
2674
+ };
2675
+ return result;
2676
+ };
2677
+ const isSubset = (sub, obj)=>Object.entries(sub).every(([key, value])=>{
2678
+ if ('string' == typeof value) return obj[key] === value;
2679
+ if ('number' == typeof value) return obj[key] === value;
2680
+ return true;
2681
+ });
2682
+ const annotationPoint_annotationPoint = (spec, context)=>{
2683
+ const { advancedVSeed } = context;
2684
+ const { annotation } = advancedVSeed;
2685
+ if (!annotation || !annotation.annotationPoint) return spec;
2686
+ const { annotationPoint } = annotation;
2687
+ const annotationPointList = Array.isArray(annotationPoint) ? annotationPoint : [
2688
+ annotationPoint
2689
+ ];
2690
+ const markPoint = annotationPointList.flatMap((annotationPoint)=>{
2691
+ const { selector: selectorPoint, text = '', textColor = '#ffffff', textFontSize = 12, textFontWeight = 400, textAlign = 'center', textBaseline = 'top', textBackgroundBorderColor, textBackgroundBorderRadius = 4, textBackgroundBorderWidth = 1, textBackgroundColor = '#212121', textBackgroundPadding = 2, textBackgroundVisible = true, offsetX = 0, offsetY = 0 } = annotationPoint;
2692
+ const dataset = advancedVSeed.dataset.flat();
2693
+ const selectedData = selectorPoint ? dataset.filter((datum)=>selector_selector(datum, selectorPoint)) : [];
2694
+ return selectedData.map((datum)=>({
2695
+ zIndex: ANNOTATION_Z_INDEX,
2696
+ regionRelative: true,
2697
+ position: (data, context)=>{
2698
+ const targetDatum = data.find((item)=>isSubset(datum, item));
2699
+ if (targetDatum) {
2700
+ const { x, y } = context.dataToPosition(targetDatum);
2701
+ return {
2702
+ x,
2703
+ y
2704
+ };
2705
+ }
2706
+ },
2707
+ itemLine: {
2708
+ visible: false
2709
+ },
2710
+ itemContent: {
2711
+ offsetY,
2712
+ offsetX,
2713
+ text: {
2714
+ text: text,
2715
+ style: {
2716
+ visible: true,
2717
+ textAlign: textAlign,
2718
+ textBaseline: textBaseline,
2719
+ fill: textColor,
2720
+ stroke: textBackgroundColor,
2721
+ lineWidth: 1,
2722
+ fontSize: textFontSize,
2723
+ fontWeight: textFontWeight,
2724
+ dy: textFontSize
2725
+ },
2726
+ labelBackground: {
2727
+ visible: textBackgroundVisible,
2728
+ padding: textBackgroundPadding,
2729
+ style: {
2730
+ cornerRadius: textBackgroundBorderRadius ?? 4,
2731
+ fill: textBackgroundColor,
2732
+ stroke: textBackgroundBorderColor,
2733
+ lineWidth: textBackgroundBorderWidth,
2734
+ dy: textFontSize
2735
+ }
2736
+ }
2737
+ }
2738
+ }
2739
+ }));
2740
+ });
2741
+ return {
2742
+ ...spec,
2702
2743
  markPoint
2703
2744
  };
2704
2745
  };
@@ -3391,6 +3432,93 @@ const pivotDiscreteLegend = (spec, context)=>{
3391
3432
  legends
3392
3433
  };
3393
3434
  };
3435
+ const pivotColorLegend = (spec, context)=>{
3436
+ const result = {
3437
+ ...spec
3438
+ };
3439
+ const { advancedVSeed } = context;
3440
+ const { chartType } = advancedVSeed;
3441
+ const baseConfig = advancedVSeed.config[chartType];
3442
+ if (!baseConfig || !baseConfig.legend) return result;
3443
+ const { datasetReshapeInfo } = advancedVSeed;
3444
+ const max = Math.max(...datasetReshapeInfo.map((d)=>d.foldInfo.colorRange[1]));
3445
+ const min = Math.min(...datasetReshapeInfo.map((d)=>d.foldInfo.colorRange[0]));
3446
+ const { legend, color } = baseConfig;
3447
+ const { colorScheme, linearColorScheme } = color;
3448
+ const { enable, position = 'bottom', labelFontColor, labelFontSize = 12, labelFontWeight = 400 } = legend || {};
3449
+ const orient = [
3450
+ 'bottom',
3451
+ 'bottomLeft',
3452
+ 'bottomRight',
3453
+ 'bl',
3454
+ 'br'
3455
+ ].includes(position) ? 'bottom' : [
3456
+ 'top',
3457
+ 'topLeft',
3458
+ 'topRight',
3459
+ 'tl',
3460
+ 'tr'
3461
+ ].includes(position) ? 'top' : [
3462
+ 'left',
3463
+ 'leftTop',
3464
+ 'leftBottom',
3465
+ 'lt',
3466
+ 'lb'
3467
+ ].includes(position) ? 'left' : 'right';
3468
+ const legendPosition = [
3469
+ 'topLeft',
3470
+ 'bottomLeft',
3471
+ 'leftTop',
3472
+ 'rightTop',
3473
+ 'lt',
3474
+ 'rt',
3475
+ 'tl',
3476
+ 'bl'
3477
+ ].includes(position) ? 'start' : [
3478
+ 'topRight',
3479
+ 'bottomRight',
3480
+ 'leftBottom',
3481
+ 'rightBottom',
3482
+ 'lb',
3483
+ 'rb',
3484
+ 'rt',
3485
+ 'br'
3486
+ ].includes(position) ? 'end' : 'middle';
3487
+ const legends = {
3488
+ visible: enable,
3489
+ type: 'color',
3490
+ orient,
3491
+ position: legendPosition,
3492
+ colors: linearColorScheme || colorScheme || [],
3493
+ value: [
3494
+ min,
3495
+ max
3496
+ ],
3497
+ min: min,
3498
+ max: max,
3499
+ maxWidth: '30%',
3500
+ startText: {
3501
+ visible: true,
3502
+ style: {
3503
+ fill: labelFontColor,
3504
+ fontSize: labelFontSize,
3505
+ fontWeight: labelFontWeight
3506
+ }
3507
+ },
3508
+ endText: {
3509
+ visible: true,
3510
+ style: {
3511
+ fill: labelFontColor,
3512
+ fontSize: labelFontSize,
3513
+ fontWeight: labelFontWeight
3514
+ }
3515
+ }
3516
+ };
3517
+ return {
3518
+ ...result,
3519
+ legends
3520
+ };
3521
+ };
3394
3522
  const pivotAdapter_pivotAdapter = (pipeline, pivotPipeline)=>(spec, context)=>{
3395
3523
  const { vseed } = context;
3396
3524
  const usePivotChart = isPivotChart(vseed);
@@ -3405,13 +3533,13 @@ const line_line = [
3405
3533
  progressive,
3406
3534
  xBand,
3407
3535
  yLinear,
3408
- label_label,
3409
- tooltip_tooltip,
3410
3536
  verticalCrosshairLine,
3411
3537
  colorAdapter(discreteLegend, colorLegend),
3412
3538
  colorPointStyleFill(pointStyle_pointStyle),
3413
3539
  pointStateDimensionHover,
3414
3540
  colorLineStyleFill(lineStyle_lineStyle),
3541
+ label_label,
3542
+ tooltip_tooltip,
3415
3543
  annotationPoint_annotationPoint,
3416
3544
  annotationVerticalLine_annotationVerticalLine,
3417
3545
  annotationHorizontalLine_annotationHorizontalLine,
@@ -3424,18 +3552,18 @@ const pivotLine = [
3424
3552
  datasetPivot,
3425
3553
  pivotIndicators_pivotIndicators([
3426
3554
  initLine,
3427
- color_color,
3555
+ colorAdapter(color_color, linearColor),
3428
3556
  background_backgroundColor,
3429
3557
  datasetXY,
3430
3558
  progressive,
3431
3559
  xBand,
3432
3560
  yLinear,
3433
- label_label,
3434
- tooltip_tooltip,
3435
3561
  verticalCrosshairLine,
3436
- pointStyle_pointStyle,
3562
+ colorPointStyleFill(pointStyle_pointStyle),
3437
3563
  pointStateDimensionHover,
3438
- lineStyle_lineStyle,
3564
+ colorLineStyleFill(lineStyle_lineStyle),
3565
+ label_label,
3566
+ tooltip_tooltip,
3439
3567
  annotationPoint_annotationPoint,
3440
3568
  annotationVerticalLine_annotationVerticalLine,
3441
3569
  annotationHorizontalLine_annotationHorizontalLine,
@@ -3443,7 +3571,7 @@ const pivotLine = [
3443
3571
  ]),
3444
3572
  pivotRowDimensions,
3445
3573
  pivotColumnDimensions,
3446
- pivotDiscreteLegend
3574
+ colorAdapter(pivotDiscreteLegend, pivotColorLegend)
3447
3575
  ];
3448
3576
  const lineSpecPipeline = [
3449
3577
  pivotAdapter_pivotAdapter(line_line, pivotLine)
@@ -3454,51 +3582,58 @@ const registerLine = ()=>{
3454
3582
  };
3455
3583
  const encodingForColumn = (advancedVSeed, context)=>{
3456
3584
  const { vseed } = context;
3457
- const { dimensions } = advancedVSeed;
3458
- if (!dimensions) return advancedVSeed;
3459
- const encoding = vseed.encoding;
3460
- if (encoding) {
3461
- const x = encoding.x || [
3462
- dimensions[0].id
3463
- ];
3464
- const color = encoding.color || [
3465
- (dimensions[1] || dimensions[0]).id
3466
- ];
3467
- const detail = encoding.detail || [];
3468
- const mergedDetail = 0 === detail.length ? unique([
3469
- ...color,
3470
- ...detail
3471
- ]) : detail;
3472
- return {
3473
- ...advancedVSeed,
3474
- encoding: {
3475
- ...encoding,
3476
- x,
3477
- color,
3478
- detail: mergedDetail
3479
- }
3480
- };
3481
- }
3482
- const onlyMeasureName = 1 === dimensions.length && dimensions.find((item)=>item.id === MeasureName);
3483
- const mergedEncoding = {
3484
- x: dimensions.slice(0, 1).map((item)=>item.id),
3485
- color: dimensions.slice(onlyMeasureName ? 0 : 1).map((item)=>item.id),
3486
- detail: dimensions.slice(onlyMeasureName ? 0 : 1).map((item)=>item.id),
3487
- tooltip: dimensions.map((item)=>item.id),
3488
- label: [],
3489
- row: [],
3490
- column: []
3491
- };
3585
+ const { measures: vseedMeasures = [] } = vseed;
3586
+ const measures = vseedMeasures.length ? findAllMeasures(vseedMeasures) : getBasicMeasures(vseed);
3587
+ const dimensions = getBasicDimensions(vseed);
3588
+ const hasDimensionEncoding = dimensions.some((item)=>item.encoding);
3589
+ const hasMeasureEncoding = measures.some((item)=>item.encoding);
3590
+ const encoding = {};
3591
+ if (hasDimensionEncoding) column_generateDimensionEncoding(dimensions, encoding);
3592
+ else column_generateDefaultDimensionEncoding(dimensions, encoding);
3593
+ if (hasMeasureEncoding) column_generateMeasureEncoding(measures, encoding);
3594
+ else column_generateDefaultMeasureEncoding(measures, encoding);
3492
3595
  return {
3493
3596
  ...advancedVSeed,
3494
- encoding: mergedEncoding
3597
+ encoding
3495
3598
  };
3496
3599
  };
3600
+ const column_generateDefaultMeasureEncoding = (measures, encoding)=>{
3601
+ encoding.tooltip = unique(measures.map((item)=>item.id));
3602
+ encoding.y = unique(measures.filter((item)=>'yAxis' === item.encoding || !item.encoding).map((item)=>item.id));
3603
+ };
3604
+ const column_generateDefaultDimensionEncoding = (dimensions, encoding)=>{
3605
+ const onlyMeasureName = 1 === dimensions.length && dimensions.find((item)=>item.id === MeasureName);
3606
+ const uniqueDimIds = unique(dimensions.map((d)=>d.id));
3607
+ encoding.x = uniqueDimIds.slice(0, 1);
3608
+ encoding.color = uniqueDimIds.slice(onlyMeasureName ? 0 : 1);
3609
+ encoding.detail = uniqueDimIds.slice(onlyMeasureName ? 0 : 1);
3610
+ encoding.tooltip = uniqueDimIds;
3611
+ encoding.label = [];
3612
+ encoding.row = [];
3613
+ encoding.column = [];
3614
+ };
3615
+ const column_generateMeasureEncoding = (measures, encoding)=>{
3616
+ encoding.tooltip = measures.map((item)=>item.id);
3617
+ encoding.y = unique(measures.filter((item)=>'yAxis' === item.encoding || !item.encoding).map((item)=>item.id));
3618
+ const color = unique(measures.filter((item)=>'color' === item.encoding).map((item)=>item.id));
3619
+ if (color.length > 0) encoding.color = color;
3620
+ return encoding;
3621
+ };
3622
+ const column_generateDimensionEncoding = (dimensions, encoding)=>{
3623
+ encoding.x = unique(dimensions.filter((item)=>'xAxis' === item.encoding).map((item)=>item.id));
3624
+ encoding.color = unique(dimensions.filter((item)=>'color' === item.encoding).map((item)=>item.id));
3625
+ encoding.detail = unique(dimensions.filter((item)=>'detail' === item.encoding).map((item)=>item.id));
3626
+ if (0 === encoding.x.length) encoding.x = [
3627
+ dimensions[0].id
3628
+ ];
3629
+ if (0 === encoding.color.length) encoding.color = dimensions.filter((item)=>!encoding.x?.includes(item.id)).map((item)=>item.id);
3630
+ if (0 === encoding.detail.length) encoding.detail = dimensions.filter((item)=>!encoding.x?.includes(item.id)).map((item)=>item.id);
3631
+ };
3497
3632
  const columnAdvancedPipeline = [
3498
3633
  initAdvancedVSeed_initAdvancedVSeed,
3634
+ encodingForColumn,
3499
3635
  buildMeasures,
3500
3636
  autoDimensions_autoDimensions,
3501
- encodingForColumn,
3502
3637
  pivotAdapter([
3503
3638
  reshapeWithEncoding
3504
3639
  ], [
@@ -3801,93 +3936,6 @@ const annotationAreaBand = (spec, context)=>{
3801
3936
  markArea: markArea
3802
3937
  };
3803
3938
  };
3804
- const pivotColorLegend = (spec, context)=>{
3805
- const result = {
3806
- ...spec
3807
- };
3808
- const { advancedVSeed } = context;
3809
- const { chartType } = advancedVSeed;
3810
- const baseConfig = advancedVSeed.config[chartType];
3811
- if (!baseConfig || !baseConfig.legend) return result;
3812
- const { datasetReshapeInfo } = advancedVSeed;
3813
- const max = Math.max(...datasetReshapeInfo.map((d)=>d.foldInfo.colorRange[1]));
3814
- const min = Math.min(...datasetReshapeInfo.map((d)=>d.foldInfo.colorRange[0]));
3815
- const { legend, color } = baseConfig;
3816
- const { colorScheme, linearColorScheme } = color;
3817
- const { enable, position = 'bottom', labelFontColor, labelFontSize = 12, labelFontWeight = 400 } = legend || {};
3818
- const orient = [
3819
- 'bottom',
3820
- 'bottomLeft',
3821
- 'bottomRight',
3822
- 'bl',
3823
- 'br'
3824
- ].includes(position) ? 'bottom' : [
3825
- 'top',
3826
- 'topLeft',
3827
- 'topRight',
3828
- 'tl',
3829
- 'tr'
3830
- ].includes(position) ? 'top' : [
3831
- 'left',
3832
- 'leftTop',
3833
- 'leftBottom',
3834
- 'lt',
3835
- 'lb'
3836
- ].includes(position) ? 'left' : 'right';
3837
- const legendPosition = [
3838
- 'topLeft',
3839
- 'bottomLeft',
3840
- 'leftTop',
3841
- 'rightTop',
3842
- 'lt',
3843
- 'rt',
3844
- 'tl',
3845
- 'bl'
3846
- ].includes(position) ? 'start' : [
3847
- 'topRight',
3848
- 'bottomRight',
3849
- 'leftBottom',
3850
- 'rightBottom',
3851
- 'lb',
3852
- 'rb',
3853
- 'rt',
3854
- 'br'
3855
- ].includes(position) ? 'end' : 'middle';
3856
- const legends = {
3857
- visible: enable,
3858
- type: 'color',
3859
- orient,
3860
- position: legendPosition,
3861
- colors: linearColorScheme || colorScheme || [],
3862
- value: [
3863
- min,
3864
- max
3865
- ],
3866
- min: min,
3867
- max: max,
3868
- maxWidth: '30%',
3869
- startText: {
3870
- visible: true,
3871
- style: {
3872
- fill: labelFontColor,
3873
- fontSize: labelFontSize,
3874
- fontWeight: labelFontWeight
3875
- }
3876
- },
3877
- endText: {
3878
- visible: true,
3879
- style: {
3880
- fill: labelFontColor,
3881
- fontSize: labelFontSize,
3882
- fontWeight: labelFontWeight
3883
- }
3884
- }
3885
- };
3886
- return {
3887
- ...result,
3888
- legends
3889
- };
3890
- };
3891
3939
  const column = [
3892
3940
  initColumn,
3893
3941
  stackCornerRadius_stackCornerRadius,
@@ -3945,9 +3993,9 @@ const registerColumn = ()=>{
3945
3993
  };
3946
3994
  const columnParallelAdvancedPipeline = [
3947
3995
  initAdvancedVSeed_initAdvancedVSeed,
3996
+ encodingForColumn,
3948
3997
  buildMeasures,
3949
3998
  autoDimensions_autoDimensions,
3950
- encodingForColumn,
3951
3999
  pivotAdapter([
3952
4000
  reshapeWithEncoding
3953
4001
  ], [
@@ -4042,9 +4090,9 @@ const registerColumnParallel = ()=>{
4042
4090
  };
4043
4091
  const columnPercentAdvancedPipeline = [
4044
4092
  initAdvancedVSeed_initAdvancedVSeed,
4093
+ encodingForColumn,
4045
4094
  buildMeasures,
4046
4095
  autoDimensions_autoDimensions,
4047
- encodingForColumn,
4048
4096
  pivotAdapter([
4049
4097
  reshapeWithEncoding
4050
4098
  ], [
@@ -4123,46 +4171,53 @@ const registerColumnPercent = ()=>{
4123
4171
  };
4124
4172
  const encodingForBar = (advancedVSeed, context)=>{
4125
4173
  const { vseed } = context;
4126
- const { dimensions } = advancedVSeed;
4127
- if (!dimensions) return advancedVSeed;
4128
- const encoding = vseed.encoding;
4129
- if (encoding) {
4130
- const y = encoding.y || [
4131
- dimensions[0].id
4132
- ];
4133
- const color = encoding.color || [
4134
- (dimensions[1] || dimensions[0]).id
4135
- ];
4136
- const detail = encoding.detail || [];
4137
- const mergedDetail = 0 === detail.length ? unique([
4138
- ...color,
4139
- ...detail
4140
- ]) : detail;
4141
- return {
4142
- ...advancedVSeed,
4143
- encoding: {
4144
- ...encoding,
4145
- y,
4146
- color,
4147
- detail: mergedDetail
4148
- }
4149
- };
4150
- }
4151
- const onlyMeasureName = 1 === dimensions.length && dimensions.find((item)=>item.id === MeasureName);
4152
- const mergedEncoding = {
4153
- y: dimensions.slice(0, 1).map((item)=>item.id),
4154
- color: dimensions.slice(onlyMeasureName ? 0 : 1).map((item)=>item.id),
4155
- detail: dimensions.slice(onlyMeasureName ? 0 : 1).map((item)=>item.id),
4156
- tooltip: dimensions.map((item)=>item.id),
4157
- label: [],
4158
- row: [],
4159
- column: []
4160
- };
4174
+ const { measures: vseedMeasures = [] } = vseed;
4175
+ const measures = vseedMeasures.length ? findAllMeasures(vseedMeasures) : getBasicMeasures(vseed);
4176
+ const dimensions = getBasicDimensions(vseed);
4177
+ const hasDimensionEncoding = dimensions.some((item)=>item.encoding);
4178
+ const hasMeasureEncoding = measures.some((item)=>item.encoding);
4179
+ const encoding = {};
4180
+ if (hasDimensionEncoding) bar_generateDimensionEncoding(dimensions, encoding);
4181
+ else bar_generateDefaultDimensionEncoding(dimensions, encoding);
4182
+ if (hasMeasureEncoding) bar_generateMeasureEncoding(measures, encoding);
4183
+ else bar_generateDefaultMeasureEncoding(measures, encoding);
4161
4184
  return {
4162
4185
  ...advancedVSeed,
4163
- encoding: mergedEncoding
4186
+ encoding
4164
4187
  };
4165
4188
  };
4189
+ const bar_generateDefaultMeasureEncoding = (measures, encoding)=>{
4190
+ encoding.tooltip = unique(measures.map((item)=>item.id));
4191
+ encoding.x = unique(measures.filter((item)=>'xAxis' === item.encoding || !item.encoding).map((item)=>item.id));
4192
+ };
4193
+ const bar_generateDefaultDimensionEncoding = (dimensions, encoding)=>{
4194
+ const onlyMeasureName = 1 === dimensions.length && dimensions.find((item)=>item.id === MeasureName);
4195
+ const uniqueDimIds = unique(dimensions.map((d)=>d.id));
4196
+ encoding.y = uniqueDimIds.slice(0, 1);
4197
+ encoding.color = uniqueDimIds.slice(onlyMeasureName ? 0 : 1);
4198
+ encoding.detail = uniqueDimIds.slice(onlyMeasureName ? 0 : 1);
4199
+ encoding.tooltip = uniqueDimIds;
4200
+ encoding.label = [];
4201
+ encoding.row = [];
4202
+ encoding.column = [];
4203
+ };
4204
+ const bar_generateMeasureEncoding = (measures, encoding)=>{
4205
+ encoding.tooltip = measures.map((item)=>item.id);
4206
+ encoding.x = unique(measures.filter((item)=>'xAxis' === item.encoding || !item.encoding).map((item)=>item.id));
4207
+ const color = unique(measures.filter((item)=>'color' === item.encoding).map((item)=>item.id));
4208
+ if (color.length > 0) encoding.color = color;
4209
+ return encoding;
4210
+ };
4211
+ const bar_generateDimensionEncoding = (dimensions, encoding)=>{
4212
+ encoding.y = unique(dimensions.filter((item)=>'yAxis' === item.encoding).map((item)=>item.id));
4213
+ encoding.color = unique(dimensions.filter((item)=>'color' === item.encoding).map((item)=>item.id));
4214
+ encoding.detail = unique(dimensions.filter((item)=>'detail' === item.encoding).map((item)=>item.id));
4215
+ if (0 === encoding.y.length) encoding.y = [
4216
+ dimensions[0].id
4217
+ ];
4218
+ if (0 === encoding.color.length) encoding.color = dimensions.filter((item)=>!encoding.y?.includes(item.id)).map((item)=>item.id);
4219
+ if (0 === encoding.detail.length) encoding.detail = dimensions.filter((item)=>!encoding.y?.includes(item.id)).map((item)=>item.id);
4220
+ };
4166
4221
  const sortYBandAxis = (advancedVSeed, context)=>{
4167
4222
  const result = {
4168
4223
  ...advancedVSeed
@@ -4181,9 +4236,9 @@ const sortYBandAxis = (advancedVSeed, context)=>{
4181
4236
  };
4182
4237
  const barAdvancedPipeline = [
4183
4238
  initAdvancedVSeed_initAdvancedVSeed,
4239
+ encodingForBar,
4184
4240
  buildMeasures,
4185
4241
  autoDimensions_autoDimensions,
4186
- encodingForBar,
4187
4242
  pivotAdapter([
4188
4243
  reshapeWithEncoding
4189
4244
  ], [
@@ -4701,9 +4756,9 @@ const registerBarPercent = ()=>{
4701
4756
  };
4702
4757
  const areaAdvancedPipeline = [
4703
4758
  initAdvancedVSeed_initAdvancedVSeed,
4759
+ encodingForLine,
4704
4760
  buildMeasures,
4705
4761
  autoDimensions_autoDimensions,
4706
- encodingForColumn,
4707
4762
  pivotAdapter([
4708
4763
  reshapeWithEncoding
4709
4764
  ], [
@@ -4859,9 +4914,9 @@ const registerArea = ()=>{
4859
4914
  };
4860
4915
  const areaPercentAdvancedPipeline = [
4861
4916
  initAdvancedVSeed_initAdvancedVSeed,
4917
+ encodingForLine,
4862
4918
  buildMeasures,
4863
4919
  autoDimensions_autoDimensions,
4864
- encodingForColumn,
4865
4920
  pivotAdapter([
4866
4921
  reshapeWithEncoding
4867
4922
  ], [
@@ -4935,6 +4990,49 @@ const registerAreaPercent = ()=>{
4935
4990
  Builder._advancedPipelineMap.areaPercent = areaPercentAdvancedPipeline;
4936
4991
  Builder._specPipelineMap.areaPercent = areaPercentSpecPipeline;
4937
4992
  };
4993
+ const encodingForScatter = (advancedVSeed, context)=>{
4994
+ const { vseed } = context;
4995
+ const { measures: vseedMeasures = [] } = vseed;
4996
+ const measures = vseedMeasures.length ? findAllMeasures(vseedMeasures) : getBasicMeasures(vseed);
4997
+ const dimensions = getBasicDimensions(vseed);
4998
+ const hasDimensionEncoding = dimensions.some((item)=>item.encoding);
4999
+ const hasMeasureEncoding = measures.some((item)=>item.encoding);
5000
+ const encoding = {};
5001
+ if (hasDimensionEncoding) scatter_generateDimensionEncoding(dimensions, encoding);
5002
+ else scatter_generateDefaultDimensionEncoding(dimensions, encoding);
5003
+ if (hasMeasureEncoding) scatter_generateMeasureEncoding(measures, encoding);
5004
+ else scatter_generateDefaultMeasureEncoding(measures, encoding);
5005
+ return {
5006
+ ...advancedVSeed,
5007
+ encoding
5008
+ };
5009
+ };
5010
+ const scatter_generateDefaultMeasureEncoding = (measures, encoding)=>{
5011
+ encoding.tooltip = unique(measures.map((item)=>item.id));
5012
+ encoding.y = unique(measures.filter((item)=>'xAxis' === item.encoding || 'yAxis' === item.encoding || !item.encoding).map((item)=>item.id));
5013
+ };
5014
+ const scatter_generateDefaultDimensionEncoding = (dimensions, encoding)=>{
5015
+ const dimensionsWithoutMeasureName = dimensions.filter((item)=>item.id !== MeasureName);
5016
+ const uniqueDimIds = unique(dimensionsWithoutMeasureName.map((d)=>d.id));
5017
+ encoding.color = uniqueDimIds.slice(0);
5018
+ encoding.detail = uniqueDimIds.slice(0);
5019
+ encoding.tooltip = uniqueDimIds;
5020
+ encoding.label = [];
5021
+ encoding.row = [];
5022
+ encoding.column = [];
5023
+ };
5024
+ const scatter_generateMeasureEncoding = (measures, encoding)=>{
5025
+ encoding.tooltip = measures.map((item)=>item.id);
5026
+ encoding.y = unique(measures.filter((item)=>'xAxis' === item.encoding || 'yAxis' === item.encoding || !item.encoding).map((item)=>item.id));
5027
+ const color = unique(measures.filter((item)=>'color' === item.encoding).map((item)=>item.id));
5028
+ if (color.length > 0) encoding.color = color;
5029
+ };
5030
+ const scatter_generateDimensionEncoding = (dimensions, encoding)=>{
5031
+ encoding.color = unique(dimensions.filter((item)=>'color' === item.encoding).map((item)=>item.id));
5032
+ encoding.detail = unique(dimensions.filter((item)=>'detail' === item.encoding).map((item)=>item.id));
5033
+ if (0 === encoding.color.length) encoding.color = dimensions.filter((item)=>!encoding.x?.includes(item.id)).map((item)=>item.id);
5034
+ if (0 === encoding.detail.length) encoding.detail = dimensions.filter((item)=>!encoding.x?.includes(item.id)).map((item)=>item.id);
5035
+ };
4938
5036
  const buildMeasuresForScatter = (advancedVSeed, context)=>{
4939
5037
  const { vseed } = context;
4940
5038
  if (isMeasureTreeWithChildren(vseed)) {
@@ -5025,52 +5123,16 @@ const buildMeasuresForScatter_generateMeasuresByParentId = (measures)=>{
5025
5123
  const encoding = Array.isArray(item.encoding) ? item.encoding : [
5026
5124
  item.encoding
5027
5125
  ];
5028
- const isY = encoding.includes('yAxis');
5029
5126
  const isX = encoding.includes('xAxis');
5127
+ const isY = encoding.includes('yAxis');
5128
+ const isEmpty = !encoding.length;
5030
5129
  if (isY) scatterChart.yMeasures.push(item);
5031
5130
  else if (isX) scatterChart.xMeasures.push(item);
5032
- else if (!isY && !isX) if (0 === scatterChart.yMeasures.length) scatterChart.yMeasures.push(item);
5131
+ else if (isEmpty) if (0 === scatterChart.yMeasures.length) scatterChart.yMeasures.push(item);
5033
5132
  else scatterChart.xMeasures.push(item);
5034
5133
  });
5035
5134
  return scatterMeasuresToMeasureTree(scatterMeasures);
5036
5135
  };
5037
- const encodingForScatter = (advancedVSeed, context)=>{
5038
- const { vseed } = context;
5039
- const { dimensions } = advancedVSeed;
5040
- if (!dimensions) return advancedVSeed;
5041
- const encoding = vseed.encoding;
5042
- if (encoding) {
5043
- const detail = encoding.detail || [];
5044
- const color = encoding.color || [
5045
- (dimensions[1] || dimensions[0]).id
5046
- ];
5047
- const mergedDetail = 0 === detail.length ? unique([
5048
- ...color,
5049
- ...detail
5050
- ]) : detail;
5051
- return {
5052
- ...advancedVSeed,
5053
- encoding: {
5054
- ...encoding,
5055
- color,
5056
- detail: mergedDetail
5057
- }
5058
- };
5059
- }
5060
- const dimensionsWithoutMeasureName = dimensions.filter((item)=>item.id !== MeasureName);
5061
- const mergedEncoding = {
5062
- color: dimensions.slice(0).map((item)=>item.id),
5063
- detail: dimensionsWithoutMeasureName.slice(0).map((item)=>item.id),
5064
- tooltip: dimensionsWithoutMeasureName.map((item)=>item.id),
5065
- label: [],
5066
- row: [],
5067
- column: []
5068
- };
5069
- return {
5070
- ...advancedVSeed,
5071
- encoding: mergedEncoding
5072
- };
5073
- };
5074
5136
  const reshapeWithScatterEncoding = (advancedVSeed, context)=>{
5075
5137
  const result = {
5076
5138
  ...advancedVSeed
@@ -5087,7 +5149,7 @@ const reshapeWithScatterEncoding = (advancedVSeed, context)=>{
5087
5149
  const xMeasures = measures[0];
5088
5150
  const yMeasures = measures[1] || xMeasures;
5089
5151
  if (xMeasures && xMeasures.children) {
5090
- const { dataset: newDataset, foldInfo, unfoldInfo } = dataReshapeByEncoding(dataset, dimensions, xMeasures.children, encoding, {
5152
+ const { dataset: newDataset, foldInfo, unfoldInfo } = dataReshapeByEncoding(dataset, uniqueBy(dimensions, (d)=>d.id), uniqueBy(xMeasures.children, (d)=>d.id), encoding, {
5091
5153
  foldMeasureValue: FoldXMeasureValue,
5092
5154
  colorItemAsId: true,
5093
5155
  colorMeasureId: getColorMeasureId(advancedVSeed)
@@ -5097,7 +5159,7 @@ const reshapeWithScatterEncoding = (advancedVSeed, context)=>{
5097
5159
  unfoldInfoList.push(unfoldInfo);
5098
5160
  }
5099
5161
  if (yMeasures && yMeasures.children) {
5100
- const { dataset: newDataset, foldInfo, unfoldInfo } = dataReshapeByEncoding(datasets[0], dimensions, yMeasures.children, encoding, {
5162
+ const { dataset: newDataset, foldInfo, unfoldInfo } = dataReshapeByEncoding(datasets[0], uniqueBy(dimensions, (d)=>d.id), uniqueBy(yMeasures.children, (d)=>d.id), encoding, {
5101
5163
  foldMeasureValue: FoldYMeasureValue,
5102
5164
  colorItemAsId: true,
5103
5165
  colorMeasureId: getColorMeasureId(advancedVSeed)
@@ -5201,9 +5263,9 @@ const pivotReshapeWithScatterEncoding = (advancedVSeed, context)=>{
5201
5263
  };
5202
5264
  const scatterAdvancedPipeline = [
5203
5265
  initAdvancedVSeed_initAdvancedVSeed,
5266
+ encodingForScatter,
5204
5267
  buildMeasuresForScatter,
5205
5268
  autoDimensions_autoDimensions,
5206
- encodingForScatter,
5207
5269
  pivotAdapter([
5208
5270
  reshapeWithScatterEncoding
5209
5271
  ], [
@@ -5339,7 +5401,7 @@ const pivotScatter = [
5339
5401
  ]),
5340
5402
  pivotRowDimensions,
5341
5403
  pivotColumnDimensions,
5342
- pivotDiscreteLegend
5404
+ colorAdapter(pivotDiscreteLegend, pivotColorLegend)
5343
5405
  ];
5344
5406
  const scatterSpecPipeline = [
5345
5407
  pivotAdapter_pivotAdapter(scatter, pivotScatter)
@@ -5348,6 +5410,55 @@ const registerScatter = ()=>{
5348
5410
  Builder._advancedPipelineMap.scatter = scatterAdvancedPipeline;
5349
5411
  Builder._specPipelineMap.scatter = scatterSpecPipeline;
5350
5412
  };
5413
+ const encodingForDualAxis = (advancedVSeed, context)=>{
5414
+ const { vseed } = context;
5415
+ const { measures: vseedMeasures = [] } = vseed;
5416
+ const measures = vseedMeasures.length ? findAllMeasures(vseedMeasures) : getBasicMeasures(vseed);
5417
+ const dimensions = getBasicDimensions(vseed);
5418
+ const hasDimensionEncoding = dimensions.some((item)=>item.encoding);
5419
+ const hasMeasureEncoding = measures.some((item)=>item.encoding);
5420
+ const encoding = {};
5421
+ if (hasDimensionEncoding) dualAxis_generateDimensionEncoding(dimensions, encoding);
5422
+ else dualAxis_generateDefaultDimensionEncoding(dimensions, encoding);
5423
+ if (hasMeasureEncoding) dualAxis_generateMeasureEncoding(measures, encoding);
5424
+ else dualAxis_generateDefaultMeasureEncoding(measures, encoding);
5425
+ return {
5426
+ ...advancedVSeed,
5427
+ encoding
5428
+ };
5429
+ };
5430
+ const dualAxis_generateDefaultMeasureEncoding = (measures, encoding)=>{
5431
+ encoding.tooltip = unique(measures.map((item)=>item.id));
5432
+ encoding.y = unique(measures.filter((item)=>'primaryYAxis' === item.encoding || 'secondaryYAxis' === item.encoding || !item.encoding).map((item)=>item.id));
5433
+ };
5434
+ const dualAxis_generateDefaultDimensionEncoding = (dimensions, encoding)=>{
5435
+ const onlyMeasureName = 1 === dimensions.length && dimensions.find((item)=>item.id === MeasureName);
5436
+ const uniqueDimIds = unique(dimensions.map((d)=>d.id));
5437
+ encoding.x = uniqueDimIds.slice(0, 1);
5438
+ encoding.color = uniqueDimIds.slice(onlyMeasureName ? 0 : 1);
5439
+ encoding.detail = uniqueDimIds.slice(onlyMeasureName ? 0 : 1);
5440
+ encoding.tooltip = uniqueDimIds;
5441
+ encoding.label = [];
5442
+ encoding.row = [];
5443
+ encoding.column = [];
5444
+ };
5445
+ const dualAxis_generateMeasureEncoding = (measures, encoding)=>{
5446
+ encoding.tooltip = measures.map((item)=>item.id);
5447
+ encoding.y = unique(measures.filter((item)=>'primaryYAxis' === item.encoding || 'secondaryYAxis' === item.encoding || !item.encoding).map((item)=>item.id));
5448
+ const color = unique(measures.filter((item)=>'color' === item.encoding).map((item)=>item.id));
5449
+ if (color.length > 0) encoding.color = color;
5450
+ return encoding;
5451
+ };
5452
+ const dualAxis_generateDimensionEncoding = (dimensions, encoding)=>{
5453
+ encoding.x = unique(dimensions.filter((item)=>'xAxis' === item.encoding).map((item)=>item.id));
5454
+ encoding.color = unique(dimensions.filter((item)=>'color' === item.encoding).map((item)=>item.id));
5455
+ encoding.detail = unique(dimensions.filter((item)=>'detail' === item.encoding).map((item)=>item.id));
5456
+ if (0 === encoding.x.length) encoding.x = [
5457
+ dimensions[0].id
5458
+ ];
5459
+ if (0 === encoding.color.length) encoding.color = dimensions.filter((item)=>!encoding.x?.includes(item.id)).map((item)=>item.id);
5460
+ if (0 === encoding.detail.length) encoding.detail = dimensions.filter((item)=>!encoding.x?.includes(item.id)).map((item)=>item.id);
5461
+ };
5351
5462
  const buildMeasuresForDualAxis = (advancedVSeed, context)=>{
5352
5463
  const { vseed } = context;
5353
5464
  if (isMeasureTreeWithChildren(vseed)) {
@@ -5440,54 +5551,14 @@ const buildMeasuresForDualAxis_generateMeasuresByParentId = (measures)=>{
5440
5551
  ];
5441
5552
  const isPrimary = encoding.includes('primaryYAxis');
5442
5553
  const isSecondary = encoding.includes('secondaryYAxis');
5554
+ const isEmpty = !item.encoding;
5443
5555
  if (isPrimary) dualChart.primaryMeasures.push(item);
5444
5556
  else if (isSecondary) dualChart.secondaryMeasures.push(item);
5445
- else if (!isPrimary && !isSecondary) if (0 === dualChart.primaryMeasures.length) dualChart.primaryMeasures.push(item);
5557
+ else if (isEmpty) if (0 === dualChart.primaryMeasures.length) dualChart.primaryMeasures.push(item);
5446
5558
  else dualChart.secondaryMeasures.push(item);
5447
5559
  });
5448
5560
  return dualMeasuresToMeasureTree(dualMeasures);
5449
5561
  };
5450
- const encodingForDualAxis = (advancedVSeed, context)=>{
5451
- const { vseed } = context;
5452
- const { dimensions } = advancedVSeed;
5453
- if (!dimensions) return advancedVSeed;
5454
- const encoding = vseed.encoding;
5455
- if (encoding) {
5456
- const x = encoding.x || [
5457
- dimensions[0].id
5458
- ];
5459
- const color = encoding.color || [
5460
- (dimensions[1] || dimensions[0]).id
5461
- ];
5462
- const detail = encoding.detail || [];
5463
- const mergedDetail = 0 === detail.length ? unique([
5464
- ...color,
5465
- ...detail
5466
- ]) : detail;
5467
- return {
5468
- ...advancedVSeed,
5469
- encoding: {
5470
- ...encoding,
5471
- x,
5472
- color,
5473
- detail: mergedDetail
5474
- }
5475
- };
5476
- }
5477
- const mergedEncoding = {
5478
- x: dimensions.slice(0, 1).map((item)=>item.id),
5479
- color: dimensions.slice(1).map((item)=>item.id),
5480
- detail: dimensions.slice(1).map((item)=>item.id),
5481
- tooltip: dimensions.map((item)=>item.id),
5482
- label: [],
5483
- row: [],
5484
- column: []
5485
- };
5486
- return {
5487
- ...advancedVSeed,
5488
- encoding: mergedEncoding
5489
- };
5490
- };
5491
5562
  const reshapeWithDualEncoding = (advancedVSeed, context)=>{
5492
5563
  const result = {
5493
5564
  ...advancedVSeed
@@ -5637,9 +5708,9 @@ const dualAxisConfig = (advancedVSeed, context)=>{
5637
5708
  };
5638
5709
  const dualAxisAdvancedPipeline = [
5639
5710
  initAdvancedVSeed_initAdvancedVSeed,
5711
+ encodingForDualAxis,
5640
5712
  buildMeasuresForDualAxis,
5641
5713
  autoDimensions_autoDimensions,
5642
- encodingForDualAxis,
5643
5714
  pivotAdapter([
5644
5715
  reshapeWithDualEncoding
5645
5716
  ], [
@@ -5942,7 +6013,7 @@ const labelPrimary = (spec, context)=>{
5942
6013
  const measure = findMeasureById(measures, id);
5943
6014
  if (!measure) return value;
5944
6015
  const { format = {}, autoFormat = true } = measure;
5945
- if (!isEmpty(format)) {
6016
+ if (!external_remeda_isEmpty(format)) {
5946
6017
  const formatter = createFormatter(format);
5947
6018
  return formatter(value);
5948
6019
  }
@@ -5978,7 +6049,7 @@ const labelSecondary = (spec, context)=>{
5978
6049
  const measure = findMeasureById(measures, id);
5979
6050
  if (!measure) return value;
5980
6051
  const { format = {}, autoFormat = true } = measure;
5981
- if (!isEmpty(format)) {
6052
+ if (!external_remeda_isEmpty(format)) {
5982
6053
  const formatter = createFormatter(format);
5983
6054
  return formatter(value);
5984
6055
  }
@@ -6034,7 +6105,7 @@ const tooltipPrimary = (spec, context)=>{
6034
6105
  const measure = findMeasureById(measures, id);
6035
6106
  if (!measure) return String(value);
6036
6107
  const { format = {}, autoFormat = true } = measure;
6037
- if (!isEmpty(format)) {
6108
+ if (!external_remeda_isEmpty(format)) {
6038
6109
  const formatter = createFormatter(format);
6039
6110
  return formatter(value);
6040
6111
  }
@@ -6056,7 +6127,7 @@ const tooltipPrimary = (spec, context)=>{
6056
6127
  const measure = findMeasureById(measures, id);
6057
6128
  if (!measure) return String(value);
6058
6129
  const { format = {}, autoFormat = true } = measure;
6059
- if (!isEmpty(format)) {
6130
+ if (!external_remeda_isEmpty(format)) {
6060
6131
  const formatter = createFormatter(format);
6061
6132
  return formatter(value);
6062
6133
  }
@@ -6114,7 +6185,7 @@ const tooltipSecondary = (spec, context)=>{
6114
6185
  const measure = findMeasureById(measures, id);
6115
6186
  if (!measure) return String(value);
6116
6187
  const { format = {}, autoFormat = true } = measure;
6117
- if (!isEmpty(format)) {
6188
+ if (!external_remeda_isEmpty(format)) {
6118
6189
  const formatter = createFormatter(format);
6119
6190
  return formatter(value);
6120
6191
  }
@@ -6136,7 +6207,7 @@ const tooltipSecondary = (spec, context)=>{
6136
6207
  const measure = findMeasureById(measures, id);
6137
6208
  if (!measure) return String(value);
6138
6209
  const { format = {}, autoFormat = true } = measure;
6139
- if (!isEmpty(format)) {
6210
+ if (!external_remeda_isEmpty(format)) {
6140
6211
  const formatter = createFormatter(format);
6141
6212
  return formatter(value);
6142
6213
  }
@@ -6162,7 +6233,7 @@ const yLinearPrimary = (spec, context)=>{
6162
6233
  const yAxisConfig = Array.isArray(primaryYAxis) ? primaryYAxis[index] || primaryYAxis[0] : primaryYAxis;
6163
6234
  const alignTicks = advancedVSeed.config?.[chartType]?.alignTicks;
6164
6235
  const alignTicksConfig = Array.isArray(alignTicks) ? alignTicks[index] || alignTicks[0] : alignTicks;
6165
- if (foldInfoList?.[0] && isEmpty(foldInfoList[0].foldMap)) return result;
6236
+ if (foldInfoList?.[0] && external_remeda_isEmpty(foldInfoList[0].foldMap)) return result;
6166
6237
  const id = `${reshapeInfoId}-primary-axis`;
6167
6238
  const seriesIds = [
6168
6239
  `${reshapeInfoId}-primary-series`,
@@ -6474,33 +6545,51 @@ const registerDualAxis = ()=>{
6474
6545
  };
6475
6546
  const encodingForPie = (advancedVSeed, context)=>{
6476
6547
  const { vseed } = context;
6477
- const { dimensions } = advancedVSeed;
6478
- if (!dimensions) return advancedVSeed;
6479
- const encoding = vseed.encoding;
6480
- if (encoding) return {
6481
- ...advancedVSeed,
6482
- encoding: {
6483
- ...encoding
6484
- }
6485
- };
6486
- const mergedEncoding = {
6487
- color: dimensions.slice(0).map((item)=>item.id),
6488
- detail: dimensions.slice(0).map((item)=>item.id),
6489
- tooltip: dimensions.map((item)=>item.id),
6490
- label: [],
6491
- row: [],
6492
- column: []
6493
- };
6548
+ const { measures: vseedMeasures = [] } = vseed;
6549
+ const measures = vseedMeasures.length ? findAllMeasures(vseedMeasures) : getBasicMeasures(vseed);
6550
+ const dimensions = getBasicDimensions(vseed);
6551
+ const hasDimensionEncoding = dimensions.some((item)=>item.encoding);
6552
+ const hasMeasureEncoding = measures.some((item)=>item.encoding);
6553
+ const encoding = {};
6554
+ if (hasDimensionEncoding) pie_generateDimensionEncoding(dimensions, encoding);
6555
+ else pie_generateDefaultDimensionEncoding(dimensions, encoding);
6556
+ if (hasMeasureEncoding) pie_generateMeasureEncoding(measures, encoding);
6557
+ else pie_generateDefaultMeasureEncoding(measures, encoding);
6494
6558
  return {
6495
6559
  ...advancedVSeed,
6496
- encoding: mergedEncoding
6497
- };
6560
+ encoding
6561
+ };
6562
+ };
6563
+ const pie_generateDefaultMeasureEncoding = (measures, encoding)=>{
6564
+ encoding.tooltip = unique(measures.map((item)=>item.id));
6565
+ encoding.angle = unique(measures.filter((item)=>'angle' === item.encoding || !item.encoding).map((item)=>item.id));
6566
+ };
6567
+ const pie_generateDefaultDimensionEncoding = (dimensions, encoding)=>{
6568
+ const uniqueDimIds = unique(dimensions.map((d)=>d.id));
6569
+ encoding.color = uniqueDimIds.slice(0);
6570
+ encoding.detail = uniqueDimIds.slice(0);
6571
+ encoding.tooltip = uniqueDimIds;
6572
+ encoding.label = [];
6573
+ encoding.row = [];
6574
+ encoding.column = [];
6575
+ };
6576
+ const pie_generateMeasureEncoding = (measures, encoding)=>{
6577
+ encoding.tooltip = measures.map((item)=>item.id);
6578
+ encoding.angle = unique(measures.filter((item)=>'angle' === item.encoding || !item.encoding).map((item)=>item.id));
6579
+ const color = unique(measures.filter((item)=>'color' === item.encoding).map((item)=>item.id));
6580
+ if (color.length > 0) encoding.color = color;
6581
+ };
6582
+ const pie_generateDimensionEncoding = (dimensions, encoding)=>{
6583
+ encoding.color = unique(dimensions.filter((item)=>'color' === item.encoding).map((item)=>item.id));
6584
+ encoding.detail = unique(dimensions.filter((item)=>'detail' === item.encoding).map((item)=>item.id));
6585
+ if (0 === encoding.color.length) encoding.color = dimensions.map((item)=>item.id);
6586
+ if (0 === encoding.detail.length) encoding.detail = dimensions.map((item)=>item.id);
6498
6587
  };
6499
6588
  const pieAdvancedPipeline = [
6500
6589
  initAdvancedVSeed_initAdvancedVSeed,
6590
+ encodingForPie,
6501
6591
  buildMeasures,
6502
6592
  autoDimensions_autoDimensions,
6503
- encodingForPie,
6504
6593
  pivotAdapter([
6505
6594
  reshapeWithEncoding
6506
6595
  ], [
@@ -6515,9 +6604,8 @@ const initPie = (spec, context)=>{
6515
6604
  ...spec
6516
6605
  };
6517
6606
  const { advancedVSeed } = context;
6518
- const { datasetReshapeInfo, dataset } = advancedVSeed;
6607
+ const { datasetReshapeInfo } = advancedVSeed;
6519
6608
  const { unfoldInfo, foldInfo } = datasetReshapeInfo[0];
6520
- const showStroke = dataset.length <= 30;
6521
6609
  result.type = 'pie';
6522
6610
  result.outerRadius = 0.8;
6523
6611
  result.innerRadius = 0;
@@ -6529,30 +6617,57 @@ const initPie = (spec, context)=>{
6529
6617
  clip: true
6530
6618
  }
6531
6619
  ];
6532
- result.pie = {
6533
- style: {
6534
- stroke: '#ffffff',
6535
- lineWidth: showStroke ? 1 : 0,
6536
- centerOffset: 0
6537
- },
6538
- state: {
6539
- hover: {
6540
- outerRadius: 1.1 * result.outerRadius
6620
+ result.animation = true;
6621
+ return result;
6622
+ };
6623
+ const colorPieStyleFill = (stylePipe)=>(spec, context)=>{
6624
+ const result = stylePipe(spec, context);
6625
+ const { advancedVSeed } = context;
6626
+ const { datasetReshapeInfo } = advancedVSeed;
6627
+ const { unfoldInfo } = datasetReshapeInfo[0];
6628
+ if (isLinearColor(advancedVSeed)) {
6629
+ if (result?.pie?.style) result.pie.style.fill = {
6630
+ field: unfoldInfo.encodingColor,
6631
+ scale: 'color'
6632
+ };
6633
+ }
6634
+ return result;
6635
+ };
6636
+ const pieStyle = (spec, context)=>{
6637
+ const { advancedVSeed } = context;
6638
+ const { dataset } = advancedVSeed;
6639
+ const showStroke = dataset.length <= 30;
6640
+ const result = {
6641
+ ...spec,
6642
+ pie: {
6643
+ style: {}
6644
+ }
6645
+ };
6646
+ return {
6647
+ ...result,
6648
+ pie: {
6649
+ style: {
6650
+ stroke: '#ffffff',
6651
+ lineWidth: showStroke ? 1 : 0
6652
+ },
6653
+ state: {
6654
+ hover: {
6655
+ outerRadius: 1.1 * result.outerRadius
6656
+ }
6541
6657
  }
6542
6658
  }
6543
6659
  };
6544
- result.animation = true;
6545
- return result;
6546
6660
  };
6547
6661
  const pie = [
6548
6662
  initPie,
6549
- color_color,
6663
+ colorAdapter(color_color, linearColor),
6550
6664
  background_backgroundColor,
6551
6665
  datasetXY,
6552
6666
  progressive,
6667
+ colorPieStyleFill(pieStyle),
6668
+ colorAdapter(discreteLegend, colorLegend),
6553
6669
  label_label,
6554
6670
  tooltip_tooltip,
6555
- discreteLegend,
6556
6671
  annotationPoint_annotationPoint,
6557
6672
  annotationVerticalLine_annotationVerticalLine,
6558
6673
  annotationHorizontalLine_annotationHorizontalLine,
@@ -6565,10 +6680,11 @@ const pivotPie = [
6565
6680
  datasetPivot,
6566
6681
  pivotIndicators_pivotIndicators([
6567
6682
  initPie,
6568
- color_color,
6683
+ colorAdapter(color_color, linearColor),
6569
6684
  background_backgroundColor,
6570
6685
  datasetXY,
6571
6686
  progressive,
6687
+ colorPieStyleFill(pieStyle),
6572
6688
  label_label,
6573
6689
  tooltip_tooltip,
6574
6690
  annotationPoint_annotationPoint,
@@ -6578,7 +6694,7 @@ const pivotPie = [
6578
6694
  ]),
6579
6695
  pivotRowDimensions,
6580
6696
  pivotColumnDimensions,
6581
- pivotDiscreteLegend
6697
+ colorAdapter(pivotDiscreteLegend, pivotColorLegend)
6582
6698
  ];
6583
6699
  const pieSpecPipeline = [
6584
6700
  pivotAdapter_pivotAdapter(pie, pivotPie)
@@ -6606,43 +6722,32 @@ const initDonut = (spec, context)=>{
6606
6722
  ...spec
6607
6723
  };
6608
6724
  const { advancedVSeed } = context;
6609
- const { datasetReshapeInfo, dataset } = advancedVSeed;
6725
+ const { datasetReshapeInfo } = advancedVSeed;
6610
6726
  const { foldInfo, unfoldInfo } = datasetReshapeInfo[0];
6611
- const showStroke = dataset.length <= 30;
6612
6727
  result.type = 'pie';
6613
6728
  result.outerRadius = 0.8;
6614
6729
  result.innerRadius = 0.8 * result.outerRadius;
6615
6730
  result.valueField = foldInfo.measureValue;
6616
6731
  result.categoryField = unfoldInfo.encodingColorId;
6617
6732
  result.padding = 0;
6618
- result.region = [
6619
- {
6620
- clip: true
6621
- }
6622
- ];
6623
- result.pie = {
6624
- style: {
6625
- stroke: '#ffffff',
6626
- lineWidth: showStroke ? 1 : 0
6627
- },
6628
- state: {
6629
- hover: {
6630
- outerRadius: 1.1 * result.outerRadius
6631
- }
6733
+ result.region = [
6734
+ {
6735
+ clip: true
6632
6736
  }
6633
- };
6737
+ ];
6634
6738
  result.animation = true;
6635
6739
  return result;
6636
6740
  };
6637
6741
  const donut = [
6638
6742
  initDonut,
6639
- color_color,
6743
+ colorAdapter(color_color, linearColor),
6640
6744
  background_backgroundColor,
6641
6745
  datasetXY,
6642
6746
  progressive,
6643
6747
  label_label,
6748
+ colorPieStyleFill(pieStyle),
6749
+ colorAdapter(discreteLegend, colorLegend),
6644
6750
  tooltip_tooltip,
6645
- discreteLegend,
6646
6751
  annotationPoint_annotationPoint,
6647
6752
  annotationVerticalLine_annotationVerticalLine,
6648
6753
  annotationHorizontalLine_annotationHorizontalLine,
@@ -6655,11 +6760,12 @@ const pivotDonut = [
6655
6760
  datasetPivot,
6656
6761
  pivotIndicators_pivotIndicators([
6657
6762
  initDonut,
6658
- color_color,
6763
+ colorAdapter(color_color, linearColor),
6659
6764
  background_backgroundColor,
6660
6765
  datasetXY,
6661
6766
  progressive,
6662
6767
  label_label,
6768
+ colorPieStyleFill(pieStyle),
6663
6769
  tooltip_tooltip,
6664
6770
  annotationPoint_annotationPoint,
6665
6771
  annotationVerticalLine_annotationVerticalLine,
@@ -6668,7 +6774,7 @@ const pivotDonut = [
6668
6774
  ]),
6669
6775
  pivotRowDimensions,
6670
6776
  pivotColumnDimensions,
6671
- pivotDiscreteLegend
6777
+ colorAdapter(pivotDiscreteLegend, pivotColorLegend)
6672
6778
  ];
6673
6779
  const donutSpecPipeline = [
6674
6780
  pivotAdapter_pivotAdapter(donut, pivotDonut)
@@ -6679,51 +6785,57 @@ const registerDonut = ()=>{
6679
6785
  };
6680
6786
  const encodingForRose = (advancedVSeed, context)=>{
6681
6787
  const { vseed } = context;
6682
- const { dimensions } = advancedVSeed;
6683
- if (!dimensions) return advancedVSeed;
6684
- const encoding = vseed.encoding;
6685
- if (encoding) {
6686
- const angle = encoding.angle || [
6687
- dimensions[0].id
6688
- ];
6689
- const color = encoding.color || [
6690
- (dimensions[1] || dimensions[0]).id
6691
- ];
6692
- const detail = encoding.detail || [];
6693
- const mergedDetail = 0 === detail.length ? unique([
6694
- ...color,
6695
- ...detail
6696
- ]) : detail;
6697
- return {
6698
- ...advancedVSeed,
6699
- encoding: {
6700
- ...encoding,
6701
- angle,
6702
- color,
6703
- detail: mergedDetail
6704
- }
6705
- };
6706
- }
6707
- const onlyMeasureName = 1 === dimensions.length && dimensions.find((item)=>item.id === MeasureName);
6708
- const mergedEncoding = {
6709
- angle: dimensions.slice(0, 1).map((item)=>item.id),
6710
- color: dimensions.slice(onlyMeasureName ? 0 : 1).map((item)=>item.id),
6711
- detail: dimensions.slice(onlyMeasureName ? 0 : 1).map((item)=>item.id),
6712
- tooltip: dimensions.map((item)=>item.id),
6713
- label: [],
6714
- row: [],
6715
- column: []
6716
- };
6788
+ const { measures: vseedMeasures = [] } = vseed;
6789
+ const measures = vseedMeasures.length ? findAllMeasures(vseedMeasures) : getBasicMeasures(vseed);
6790
+ const dimensions = getBasicDimensions(vseed);
6791
+ const hasDimensionEncoding = dimensions.some((item)=>item.encoding);
6792
+ const hasMeasureEncoding = measures.some((item)=>item.encoding);
6793
+ const encoding = {};
6794
+ if (hasDimensionEncoding) rose_generateDimensionEncoding(dimensions, encoding);
6795
+ else rose_generateDefaultDimensionEncoding(dimensions, encoding);
6796
+ if (hasMeasureEncoding) rose_generateMeasureEncoding(measures, encoding);
6797
+ else rose_generateDefaultMeasureEncoding(measures, encoding);
6717
6798
  return {
6718
6799
  ...advancedVSeed,
6719
- encoding: mergedEncoding
6800
+ encoding
6720
6801
  };
6721
6802
  };
6803
+ const rose_generateDefaultMeasureEncoding = (measures, encoding)=>{
6804
+ encoding.tooltip = unique(measures.map((item)=>item.id));
6805
+ encoding.radius = unique(measures.filter((item)=>'radius' === item.encoding || !item.encoding).map((item)=>item.id));
6806
+ };
6807
+ const rose_generateDefaultDimensionEncoding = (dimensions, encoding)=>{
6808
+ const onlyMeasureName = 1 === dimensions.length && dimensions.find((item)=>item.id === MeasureName);
6809
+ const uniqueDimIds = unique(dimensions.map((d)=>d.id));
6810
+ encoding.angle = uniqueDimIds.slice(0, 1);
6811
+ encoding.color = uniqueDimIds.slice(onlyMeasureName ? 0 : 1);
6812
+ encoding.detail = uniqueDimIds.slice(onlyMeasureName ? 0 : 1);
6813
+ encoding.tooltip = uniqueDimIds;
6814
+ encoding.label = [];
6815
+ encoding.row = [];
6816
+ encoding.column = [];
6817
+ };
6818
+ const rose_generateMeasureEncoding = (measures, encoding)=>{
6819
+ encoding.tooltip = measures.map((item)=>item.id);
6820
+ encoding.radius = unique(measures.filter((item)=>'radius' === item.encoding || !item.encoding).map((item)=>item.id));
6821
+ const color = unique(measures.filter((item)=>'color' === item.encoding).map((item)=>item.id));
6822
+ if (color.length > 0) encoding.color = color;
6823
+ };
6824
+ const rose_generateDimensionEncoding = (dimensions, encoding)=>{
6825
+ encoding.angle = unique(dimensions.filter((item)=>'angle' === item.encoding).map((item)=>item.id));
6826
+ encoding.color = unique(dimensions.filter((item)=>'color' === item.encoding).map((item)=>item.id));
6827
+ encoding.detail = unique(dimensions.filter((item)=>'detail' === item.encoding).map((item)=>item.id));
6828
+ if (0 === encoding.angle.length) encoding.angle = [
6829
+ dimensions[0].id
6830
+ ];
6831
+ if (0 === encoding.color.length) encoding.color = dimensions.filter((item)=>!encoding.angle?.includes(item.id)).map((item)=>item.id);
6832
+ if (0 === encoding.detail.length) encoding.detail = dimensions.filter((item)=>!encoding.angle?.includes(item.id)).map((item)=>item.id);
6833
+ };
6722
6834
  const roseAdvancedPipeline = [
6723
6835
  initAdvancedVSeed_initAdvancedVSeed,
6836
+ encodingForRose,
6724
6837
  buildMeasures,
6725
6838
  autoDimensions_autoDimensions,
6726
- encodingForRose,
6727
6839
  pivotAdapter([
6728
6840
  reshapeWithEncoding
6729
6841
  ], [
@@ -6750,18 +6862,6 @@ const initRose = (spec, context)=>{
6750
6862
  result.innerRadius = 0;
6751
6863
  const hasNegativeValue = dataset.flat().find((d)=>d[foldInfo.measureValue] < 0);
6752
6864
  if (hasNegativeValue) result.innerRadius = 0.05;
6753
- result.rose = {
6754
- style: {
6755
- stroke: '#ffffff',
6756
- lineWidth: 1
6757
- },
6758
- state: {
6759
- hover: {
6760
- lineWidth: 1,
6761
- fillOpacity: 0.6
6762
- }
6763
- }
6764
- };
6765
6865
  result.region = [
6766
6866
  {
6767
6867
  clip: true
@@ -6770,7 +6870,7 @@ const initRose = (spec, context)=>{
6770
6870
  result.animation = true;
6771
6871
  return result;
6772
6872
  };
6773
- const radiusAxis = (spec, context)=>{
6873
+ const angleAxis = (spec, context)=>{
6774
6874
  const result = {
6775
6875
  ...spec
6776
6876
  };
@@ -6782,26 +6882,37 @@ const radiusAxis = (spec, context)=>{
6782
6882
  const showAxis = !(is0D || is1M1D);
6783
6883
  if (!result.axes) result.axes = [];
6784
6884
  result.axes.push({
6785
- orient: 'radius',
6885
+ orient: 'angle',
6786
6886
  visible: showAxis,
6787
6887
  zero: true,
6788
6888
  nice: !!showAxis,
6889
+ paddingInner: showAxis ? [
6890
+ 0.15,
6891
+ 0.1
6892
+ ] : [
6893
+ 0,
6894
+ 0
6895
+ ],
6896
+ paddingOuter: showAxis ? [
6897
+ 0.075,
6898
+ 0.1
6899
+ ] : [
6900
+ 0,
6901
+ 0
6902
+ ],
6789
6903
  grid: {
6790
6904
  visible: showAxis
6791
6905
  },
6792
- tick: {
6793
- visible: showAxis
6794
- },
6795
- label: {
6906
+ domainLine: {
6796
6907
  visible: showAxis
6797
6908
  },
6798
- domainLine: {
6909
+ tick: {
6799
6910
  visible: showAxis
6800
6911
  }
6801
6912
  });
6802
6913
  return result;
6803
6914
  };
6804
- const angleAxis = (spec, context)=>{
6915
+ const radiusAxis = (spec, context)=>{
6805
6916
  const result = {
6806
6917
  ...spec
6807
6918
  };
@@ -6813,50 +6924,79 @@ const angleAxis = (spec, context)=>{
6813
6924
  const showAxis = !(is0D || is1M1D);
6814
6925
  if (!result.axes) result.axes = [];
6815
6926
  result.axes.push({
6816
- orient: 'angle',
6927
+ orient: 'radius',
6817
6928
  visible: showAxis,
6818
6929
  zero: true,
6819
6930
  nice: !!showAxis,
6820
- paddingInner: showAxis ? [
6821
- 0.15,
6822
- 0.1
6823
- ] : [
6824
- 0,
6825
- 0
6826
- ],
6827
- paddingOuter: showAxis ? [
6828
- 0.075,
6829
- 0.1
6830
- ] : [
6831
- 0,
6832
- 0
6833
- ],
6834
6931
  grid: {
6835
6932
  visible: showAxis
6836
6933
  },
6837
- domainLine: {
6934
+ tick: {
6838
6935
  visible: showAxis
6839
6936
  },
6840
- tick: {
6937
+ label: {
6938
+ visible: showAxis
6939
+ },
6940
+ domainLine: {
6841
6941
  visible: showAxis
6842
6942
  }
6843
6943
  });
6844
6944
  return result;
6845
6945
  };
6946
+ const colorRoseStyleFill = (stylePipe)=>(spec, context)=>{
6947
+ const result = stylePipe(spec, context);
6948
+ const { advancedVSeed } = context;
6949
+ const { datasetReshapeInfo } = advancedVSeed;
6950
+ const { unfoldInfo } = datasetReshapeInfo[0];
6951
+ if (isLinearColor(advancedVSeed)) {
6952
+ if (result?.rose?.style) result.rose.style.fill = {
6953
+ field: unfoldInfo.encodingColor,
6954
+ scale: 'color'
6955
+ };
6956
+ }
6957
+ return result;
6958
+ };
6959
+ const roseStyle = (spec, context)=>{
6960
+ const { advancedVSeed } = context;
6961
+ const { dataset } = advancedVSeed;
6962
+ const showStroke = dataset.length <= 30;
6963
+ const result = {
6964
+ ...spec,
6965
+ rose: {
6966
+ style: {}
6967
+ }
6968
+ };
6969
+ return {
6970
+ ...result,
6971
+ rose: {
6972
+ style: {
6973
+ stroke: '#ffffff',
6974
+ lineWidth: showStroke ? 1 : 0
6975
+ },
6976
+ state: {
6977
+ hover: {
6978
+ lineWidth: 1,
6979
+ fillOpacity: 0.6
6980
+ }
6981
+ }
6982
+ }
6983
+ };
6984
+ };
6846
6985
  const rose = [
6847
6986
  initRose,
6848
6987
  stackCornerRadius_stackCornerRadius,
6849
6988
  stackInverse,
6850
- color_color,
6989
+ colorAdapter(color_color, linearColor),
6851
6990
  background_backgroundColor,
6852
6991
  datasetXY,
6853
6992
  progressive,
6854
- radiusAxis,
6855
6993
  angleAxis,
6856
- label_label,
6857
- tooltip_tooltip,
6994
+ radiusAxis,
6858
6995
  verticalCrosshairRect,
6859
- discreteLegend
6996
+ colorRoseStyleFill(roseStyle),
6997
+ colorAdapter(discreteLegend, colorLegend),
6998
+ label_label,
6999
+ tooltip_tooltip
6860
7000
  ];
6861
7001
  const pivotRose = [
6862
7002
  initPivot,
@@ -6867,19 +7007,20 @@ const pivotRose = [
6867
7007
  initRose,
6868
7008
  stackCornerRadius_stackCornerRadius,
6869
7009
  stackInverse,
6870
- color_color,
7010
+ colorAdapter(color_color, linearColor),
6871
7011
  background_backgroundColor,
6872
7012
  datasetXY,
6873
7013
  progressive,
6874
7014
  radiusAxis,
6875
7015
  angleAxis,
7016
+ verticalCrosshairRect,
7017
+ colorRoseStyleFill(roseStyle),
6876
7018
  label_label,
6877
- tooltip_tooltip,
6878
- verticalCrosshairRect
7019
+ tooltip_tooltip
6879
7020
  ]),
6880
7021
  pivotRowDimensions,
6881
7022
  pivotColumnDimensions,
6882
- pivotDiscreteLegend
7023
+ colorAdapter(pivotDiscreteLegend, pivotColorLegend)
6883
7024
  ];
6884
7025
  const roseSpecPipeline = [
6885
7026
  pivotAdapter_pivotAdapter(rose, pivotRose)
@@ -6890,9 +7031,9 @@ const registerRose = ()=>{
6890
7031
  };
6891
7032
  const roseParallelAdvancedPipeline = [
6892
7033
  initAdvancedVSeed_initAdvancedVSeed,
7034
+ encodingForRose,
6893
7035
  buildMeasures,
6894
7036
  autoDimensions_autoDimensions,
6895
- encodingForRose,
6896
7037
  pivotAdapter([
6897
7038
  reshapeWithEncoding
6898
7039
  ], [
@@ -6948,15 +7089,16 @@ const initRoseParallel = (spec, context)=>{
6948
7089
  const roseParallel = [
6949
7090
  initRoseParallel,
6950
7091
  stackCornerRadius_stackCornerRadius,
6951
- color_color,
7092
+ colorAdapter(color_color, linearColor),
6952
7093
  background_backgroundColor,
6953
7094
  datasetXY,
6954
7095
  progressive,
6955
7096
  radiusAxis,
6956
7097
  angleAxis,
7098
+ colorRoseStyleFill(roseStyle),
7099
+ colorAdapter(discreteLegend, colorLegend),
6957
7100
  label_label,
6958
7101
  tooltip_tooltip,
6959
- discreteLegend,
6960
7102
  verticalCrosshairRect,
6961
7103
  annotationPoint_annotationPoint,
6962
7104
  annotationVerticalLine_annotationVerticalLine,
@@ -6971,15 +7113,16 @@ const pivotRoseParallel = [
6971
7113
  pivotIndicators_pivotIndicators([
6972
7114
  initRoseParallel,
6973
7115
  stackCornerRadius_stackCornerRadius,
6974
- color_color,
7116
+ colorAdapter(color_color, linearColor),
6975
7117
  background_backgroundColor,
6976
7118
  datasetXY,
6977
7119
  progressive,
6978
7120
  radiusAxis,
6979
7121
  angleAxis,
7122
+ verticalCrosshairRect,
7123
+ colorRoseStyleFill(roseStyle),
6980
7124
  label_label,
6981
7125
  tooltip_tooltip,
6982
- verticalCrosshairRect,
6983
7126
  annotationPoint_annotationPoint,
6984
7127
  annotationVerticalLine_annotationVerticalLine,
6985
7128
  annotationHorizontalLine_annotationHorizontalLine,
@@ -6987,7 +7130,7 @@ const pivotRoseParallel = [
6987
7130
  ]),
6988
7131
  pivotRowDimensions,
6989
7132
  pivotColumnDimensions,
6990
- pivotDiscreteLegend
7133
+ colorAdapter(pivotDiscreteLegend, pivotColorLegend)
6991
7134
  ];
6992
7135
  const roseParallelSpecPipeline = [
6993
7136
  pivotAdapter_pivotAdapter(roseParallel, pivotRoseParallel)
@@ -6998,50 +7141,55 @@ const registerRoseParallel = ()=>{
6998
7141
  };
6999
7142
  const encodingForRadar = (advancedVSeed, context)=>{
7000
7143
  const { vseed } = context;
7001
- const { dimensions } = advancedVSeed;
7002
- if (!dimensions) return advancedVSeed;
7003
- const encoding = vseed.encoding;
7004
- if (encoding) {
7005
- const angle = encoding.angle || [
7006
- dimensions[0].id
7007
- ];
7008
- const color = encoding.color || [
7009
- (dimensions[1] || dimensions[0]).id
7010
- ];
7011
- const detail = encoding.detail || [];
7012
- const mergedDetail = 0 === detail.length ? unique([
7013
- ...color,
7014
- ...detail
7015
- ]) : detail;
7016
- return {
7017
- ...advancedVSeed,
7018
- encoding: {
7019
- ...encoding,
7020
- angle,
7021
- color,
7022
- detail: mergedDetail
7023
- }
7024
- };
7025
- }
7026
- const mergedEncoding = {
7027
- angle: dimensions.slice(0, 1).map((item)=>item.id),
7028
- color: dimensions.slice(1).map((item)=>item.id),
7029
- detail: dimensions.slice(1).map((item)=>item.id),
7030
- tooltip: dimensions.map((item)=>item.id),
7031
- label: [],
7032
- row: [],
7033
- column: []
7034
- };
7144
+ const { measures: vseedMeasures = [] } = vseed;
7145
+ const measures = vseedMeasures.length ? findAllMeasures(vseedMeasures) : getBasicMeasures(vseed);
7146
+ const dimensions = getBasicDimensions(vseed);
7147
+ const hasDimensionEncoding = dimensions.some((item)=>item.encoding);
7148
+ const hasMeasureEncoding = measures.some((item)=>item.encoding);
7149
+ const encoding = {};
7150
+ if (hasDimensionEncoding) radar_generateDimensionEncoding(dimensions, encoding);
7151
+ else radar_generateDefaultDimensionEncoding(dimensions, encoding);
7152
+ if (hasMeasureEncoding) radar_generateMeasureEncoding(measures, encoding);
7153
+ else radar_generateDefaultMeasureEncoding(measures, encoding);
7035
7154
  return {
7036
7155
  ...advancedVSeed,
7037
- encoding: mergedEncoding
7038
- };
7156
+ encoding
7157
+ };
7158
+ };
7159
+ const radar_generateDefaultMeasureEncoding = (measures, encoding)=>{
7160
+ encoding.tooltip = unique(measures.map((item)=>item.id));
7161
+ encoding.radius = unique(measures.filter((item)=>'radius' === item.encoding || !item.encoding).map((item)=>item.id));
7162
+ };
7163
+ const radar_generateDefaultDimensionEncoding = (dimensions, encoding)=>{
7164
+ const uniqueDimIds = unique(dimensions.map((d)=>d.id));
7165
+ encoding.angle = uniqueDimIds.slice(0, 1);
7166
+ encoding.color = uniqueDimIds.slice(1);
7167
+ encoding.tooltip = uniqueDimIds;
7168
+ encoding.detail = [];
7169
+ encoding.label = [];
7170
+ encoding.row = [];
7171
+ encoding.column = [];
7172
+ };
7173
+ const radar_generateMeasureEncoding = (measures, encoding)=>{
7174
+ encoding.tooltip = measures.map((item)=>item.id);
7175
+ encoding.radius = unique(measures.filter((item)=>'radius' === item.encoding || !item.encoding).map((item)=>item.id));
7176
+ const color = unique(measures.filter((item)=>'color' === item.encoding).map((item)=>item.id));
7177
+ if (color.length > 0) encoding.color = color;
7178
+ };
7179
+ const radar_generateDimensionEncoding = (dimensions, encoding)=>{
7180
+ encoding.angle = unique(dimensions.filter((item)=>'angle' === item.encoding).map((item)=>item.id));
7181
+ encoding.color = unique(dimensions.filter((item)=>'color' === item.encoding).map((item)=>item.id));
7182
+ encoding.detail = [];
7183
+ if (0 === encoding.angle.length) encoding.angle = [
7184
+ dimensions[0].id
7185
+ ];
7186
+ if (0 === encoding.color.length) encoding.color = dimensions.filter((item)=>!encoding.angle?.includes(item.id)).map((item)=>item.id);
7039
7187
  };
7040
7188
  const radarAdvancedPipeline = [
7041
7189
  initAdvancedVSeed_initAdvancedVSeed,
7190
+ encodingForRadar,
7042
7191
  buildMeasures,
7043
7192
  autoDimensions_autoDimensions,
7044
- encodingForRadar,
7045
7193
  pivotAdapter([
7046
7194
  reshapeWithEncoding
7047
7195
  ], [
@@ -7177,33 +7325,51 @@ const registerRadar = ()=>{
7177
7325
  };
7178
7326
  const encodingForFunnel = (advancedVSeed, context)=>{
7179
7327
  const { vseed } = context;
7180
- const { dimensions } = advancedVSeed;
7181
- if (!dimensions) return advancedVSeed;
7182
- const encoding = vseed.encoding;
7183
- if (encoding) return {
7184
- ...advancedVSeed,
7185
- encoding: {
7186
- ...encoding
7187
- }
7188
- };
7189
- const mergedEncoding = {
7190
- color: dimensions.slice(0).map((item)=>item.id),
7191
- detail: dimensions.slice(0).map((item)=>item.id),
7192
- tooltip: dimensions.map((item)=>item.id),
7193
- label: [],
7194
- row: [],
7195
- column: []
7196
- };
7328
+ const { measures: vseedMeasures = [] } = vseed;
7329
+ const measures = vseedMeasures.length ? findAllMeasures(vseedMeasures) : getBasicMeasures(vseed);
7330
+ const dimensions = getBasicDimensions(vseed);
7331
+ const hasDimensionEncoding = dimensions.some((item)=>item.encoding);
7332
+ const hasMeasureEncoding = measures.some((item)=>item.encoding);
7333
+ const encoding = {};
7334
+ if (hasDimensionEncoding) funnel_generateDimensionEncoding(dimensions, encoding);
7335
+ else funnel_generateDefaultDimensionEncoding(dimensions, encoding);
7336
+ if (hasMeasureEncoding) funnel_generateMeasureEncoding(measures, encoding);
7337
+ else funnel_generateDefaultMeasureEncoding(measures, encoding);
7197
7338
  return {
7198
7339
  ...advancedVSeed,
7199
- encoding: mergedEncoding
7200
- };
7340
+ encoding
7341
+ };
7342
+ };
7343
+ const funnel_generateDefaultMeasureEncoding = (measures, encoding)=>{
7344
+ encoding.tooltip = unique(measures.map((item)=>item.id));
7345
+ encoding.size = unique(measures.filter((item)=>'size' === item.encoding || !item.encoding).map((item)=>item.id));
7346
+ };
7347
+ const funnel_generateDefaultDimensionEncoding = (dimensions, encoding)=>{
7348
+ const uniqueDimIds = unique(dimensions.map((d)=>d.id));
7349
+ encoding.color = uniqueDimIds.slice(0);
7350
+ encoding.detail = uniqueDimIds.slice(0);
7351
+ encoding.tooltip = uniqueDimIds;
7352
+ encoding.label = [];
7353
+ encoding.row = [];
7354
+ encoding.column = [];
7355
+ };
7356
+ const funnel_generateMeasureEncoding = (measures, encoding)=>{
7357
+ encoding.tooltip = measures.map((item)=>item.id);
7358
+ encoding.size = unique(measures.filter((item)=>'size' === item.encoding || !item.encoding).map((item)=>item.id));
7359
+ const color = unique(measures.filter((item)=>'color' === item.encoding).map((item)=>item.id));
7360
+ if (color.length > 0) encoding.color = color;
7361
+ };
7362
+ const funnel_generateDimensionEncoding = (dimensions, encoding)=>{
7363
+ encoding.color = unique(dimensions.filter((item)=>'color' === item.encoding).map((item)=>item.id));
7364
+ encoding.detail = unique(dimensions.filter((item)=>'detail' === item.encoding).map((item)=>item.id));
7365
+ if (0 === encoding.color.length) encoding.color = dimensions.map((item)=>item.id);
7366
+ if (0 === encoding.detail.length) encoding.detail = dimensions.map((item)=>item.id);
7201
7367
  };
7202
7368
  const funnelAdvancedPipeline = [
7203
7369
  initAdvancedVSeed_initAdvancedVSeed,
7370
+ encodingForFunnel,
7204
7371
  buildMeasures,
7205
7372
  autoDimensions_autoDimensions,
7206
- encodingForFunnel,
7207
7373
  pivotAdapter([
7208
7374
  reshapeWithEncoding
7209
7375
  ], [
@@ -7233,34 +7399,55 @@ const initFunnel = (spec, context)=>{
7233
7399
  clip: true
7234
7400
  }
7235
7401
  ];
7236
- result.funnel = {
7237
- style: {
7238
- cornerRadius: 4,
7239
- fill: {
7240
- field: unfoldInfo.encodingColorId,
7241
- scale: 'color'
7242
- }
7243
- },
7244
- state: {
7245
- hover: {
7246
- fillOpacity: 0.6
7247
- }
7248
- }
7249
- };
7250
7402
  result.transformLabel = {
7251
7403
  visible: true
7252
7404
  };
7253
7405
  result.animation = true;
7254
7406
  return result;
7255
7407
  };
7408
+ const colorFunnelStyleFill = (stylePipe)=>(spec, context)=>{
7409
+ const result = stylePipe(spec, context);
7410
+ const { advancedVSeed } = context;
7411
+ const { datasetReshapeInfo } = advancedVSeed;
7412
+ const { unfoldInfo } = datasetReshapeInfo[0];
7413
+ if (isLinearColor(advancedVSeed)) {
7414
+ if (result?.funnel?.style) result.funnel.style.fill = {
7415
+ field: unfoldInfo.encodingColor,
7416
+ scale: 'color'
7417
+ };
7418
+ }
7419
+ return result;
7420
+ };
7421
+ const funnelStyle = (spec)=>{
7422
+ const result = {
7423
+ ...spec,
7424
+ funnel: {
7425
+ style: {}
7426
+ }
7427
+ };
7428
+ return {
7429
+ ...result,
7430
+ funnel: {
7431
+ style: {
7432
+ cornerRadius: 4
7433
+ },
7434
+ state: {
7435
+ hover: {
7436
+ fillOpacity: 0.6
7437
+ }
7438
+ }
7439
+ }
7440
+ };
7441
+ };
7256
7442
  const funnel = [
7257
7443
  initFunnel,
7258
7444
  background_backgroundColor,
7259
7445
  datasetXY,
7260
- color_color,
7446
+ colorAdapter(color_color, linearColor),
7261
7447
  label_label,
7448
+ colorAdapter(discreteLegend, colorLegend),
7449
+ colorFunnelStyleFill(funnelStyle),
7262
7450
  tooltip_tooltip,
7263
- discreteLegend,
7264
7451
  annotationPoint_annotationPoint,
7265
7452
  annotationVerticalLine_annotationVerticalLine,
7266
7453
  annotationHorizontalLine_annotationHorizontalLine,
@@ -7275,17 +7462,18 @@ const pivotFunnel = [
7275
7462
  initFunnel,
7276
7463
  background_backgroundColor,
7277
7464
  datasetXY,
7278
- color_color,
7465
+ colorAdapter(color_color, linearColor),
7279
7466
  label_label,
7280
7467
  tooltip_tooltip,
7281
- discreteLegend,
7468
+ colorFunnelStyleFill(funnelStyle),
7282
7469
  annotationPoint_annotationPoint,
7283
7470
  annotationVerticalLine_annotationVerticalLine,
7284
7471
  annotationHorizontalLine_annotationHorizontalLine,
7285
7472
  annotationArea_annotationArea
7286
7473
  ]),
7287
7474
  pivotRowDimensions,
7288
- pivotColumnDimensions
7475
+ pivotColumnDimensions,
7476
+ colorAdapter(pivotDiscreteLegend, pivotColorLegend)
7289
7477
  ];
7290
7478
  const funnelSpecPipeline = [
7291
7479
  pivotAdapter_pivotAdapter(funnel, pivotFunnel)
@@ -7296,45 +7484,61 @@ const registerFunnel = ()=>{
7296
7484
  };
7297
7485
  const encodingForHeatmap = (advancedVSeed, context)=>{
7298
7486
  const { vseed } = context;
7299
- const { dimensions } = advancedVSeed;
7300
- if (!dimensions) return advancedVSeed;
7301
- const encoding = vseed.encoding;
7302
- if (encoding) {
7303
- const x = encoding.x || [
7304
- dimensions[0].id
7305
- ];
7306
- const y = encoding.y || [
7307
- (dimensions[1] || dimensions[0]).id
7308
- ];
7309
- return {
7310
- ...advancedVSeed,
7311
- encoding: {
7312
- x,
7313
- y,
7314
- ...encoding
7315
- }
7316
- };
7317
- }
7318
- const onlyMeasureName = 1 === dimensions.length && dimensions.find((item)=>item.id === MeasureName);
7319
- const mergedEncoding = {
7320
- x: dimensions.slice(0, 1).map((item)=>item.id),
7321
- y: dimensions.slice(onlyMeasureName ? 0 : 1).map((item)=>item.id),
7322
- color: dimensions.slice(0).map((item)=>item.id),
7323
- tooltip: dimensions.map((item)=>item.id),
7324
- label: [],
7325
- row: [],
7326
- column: []
7327
- };
7487
+ const { measures: vseedMeasures = [] } = vseed;
7488
+ const measures = vseedMeasures.length ? findAllMeasures(vseedMeasures) : getBasicMeasures(vseed);
7489
+ const dimensions = getBasicDimensions(vseed);
7490
+ const hasDimensionEncoding = dimensions.some((item)=>item.encoding);
7491
+ const hasMeasureEncoding = measures.some((item)=>item.encoding);
7492
+ const encoding = {};
7493
+ if (hasDimensionEncoding) heatmap_generateDimensionEncoding(dimensions, encoding);
7494
+ else heatmap_generateDefaultDimensionEncoding(dimensions, encoding);
7495
+ if (hasMeasureEncoding) heatmap_generateMeasureEncoding(measures, encoding);
7496
+ else heatmap_generateDefaultMeasureEncoding(measures, encoding);
7328
7497
  return {
7329
7498
  ...advancedVSeed,
7330
- encoding: mergedEncoding
7499
+ encoding
7331
7500
  };
7332
7501
  };
7502
+ const heatmap_generateDefaultMeasureEncoding = (measures, encoding)=>{
7503
+ encoding.tooltip = unique(measures.map((item)=>item.id));
7504
+ encoding.color = unique(measures.filter((item)=>'color' === item.encoding || !item.encoding).map((item)=>item.id));
7505
+ };
7506
+ const heatmap_generateDefaultDimensionEncoding = (dimensions, encoding)=>{
7507
+ const onlyMeasureName = 1 === dimensions.length && dimensions.find((item)=>item.id === MeasureName);
7508
+ const uniqueDimIds = unique(dimensions.map((d)=>d.id));
7509
+ encoding.x = uniqueDimIds.slice(0, 1);
7510
+ encoding.y = uniqueDimIds.slice(onlyMeasureName ? 0 : 1);
7511
+ encoding.color = uniqueDimIds.slice(onlyMeasureName ? 0 : 1);
7512
+ encoding.detail = uniqueDimIds.slice(onlyMeasureName ? 0 : 1);
7513
+ encoding.tooltip = uniqueDimIds;
7514
+ encoding.label = [];
7515
+ encoding.row = [];
7516
+ encoding.column = [];
7517
+ };
7518
+ const heatmap_generateMeasureEncoding = (measures, encoding)=>{
7519
+ encoding.tooltip = measures.map((item)=>item.id);
7520
+ const color = unique(measures.filter((item)=>'color' === item.encoding).map((item)=>item.id));
7521
+ if (color.length > 0) encoding.color = color;
7522
+ return encoding;
7523
+ };
7524
+ const heatmap_generateDimensionEncoding = (dimensions, encoding)=>{
7525
+ encoding.x = unique(dimensions.filter((item)=>'xAxis' === item.encoding).map((item)=>item.id));
7526
+ encoding.y = unique(dimensions.filter((item)=>'yAxis' === item.encoding).map((item)=>item.id));
7527
+ encoding.color = unique(dimensions.filter((item)=>'color' === item.encoding).map((item)=>item.id));
7528
+ encoding.detail = unique(dimensions.filter((item)=>'detail' === item.encoding).map((item)=>item.id));
7529
+ if (0 === encoding.x.length) encoding.x = [
7530
+ dimensions[0].id
7531
+ ];
7532
+ if (0 === encoding.y.length) if (dimensions.length > 1) encoding.y = dimensions.slice(1).map((item)=>item.id);
7533
+ else encoding.y = dimensions.slice(0).map((item)=>item.id);
7534
+ if (0 === encoding.color.length) encoding.color = dimensions.filter((item)=>!encoding.x?.includes(item.id)).map((item)=>item.id);
7535
+ if (0 === encoding.detail.length) encoding.detail = dimensions.filter((item)=>!encoding.x?.includes(item.id)).map((item)=>item.id);
7536
+ };
7333
7537
  const heatmapAdvancedPipeline = [
7334
7538
  initAdvancedVSeed_initAdvancedVSeed,
7539
+ encodingForHeatmap,
7335
7540
  buildMeasures,
7336
7541
  autoDimensions_autoDimensions,
7337
- encodingForHeatmap,
7338
7542
  pivotAdapter([
7339
7543
  reshapeWithEncoding
7340
7544
  ], [
@@ -7356,6 +7560,37 @@ const labelColorInversion = (spec)=>{
7356
7560
  };
7357
7561
  return result;
7358
7562
  };
7563
+ const colorCellStyleFill = (stylePipe)=>(spec, context)=>{
7564
+ const result = stylePipe(spec, context);
7565
+ const { advancedVSeed } = context;
7566
+ const { datasetReshapeInfo } = advancedVSeed;
7567
+ const { unfoldInfo } = datasetReshapeInfo[0];
7568
+ if (isLinearColor(advancedVSeed)) {
7569
+ if (result?.cell?.style) result.cell.style.fill = {
7570
+ field: unfoldInfo.encodingColor,
7571
+ scale: 'color'
7572
+ };
7573
+ }
7574
+ return result;
7575
+ };
7576
+ const cellStyle = (spec)=>{
7577
+ const result = {
7578
+ ...spec,
7579
+ cell: {
7580
+ style: {}
7581
+ }
7582
+ };
7583
+ return {
7584
+ ...result,
7585
+ cell: {
7586
+ style: {
7587
+ shape: 'rect',
7588
+ stroke: '#ffffff',
7589
+ lineWidth: 1
7590
+ }
7591
+ }
7592
+ };
7593
+ };
7359
7594
  const initHeatmap = (spec, context)=>{
7360
7595
  const result = {
7361
7596
  ...spec
@@ -7370,13 +7605,6 @@ const initHeatmap = (spec, context)=>{
7370
7605
  result.seriesField = unfoldInfo.encodingColorId;
7371
7606
  result.valueField = foldInfo.measureValue;
7372
7607
  result.padding = 0;
7373
- result.cell = {
7374
- style: {
7375
- shape: 'rect',
7376
- stroke: '#ffffff',
7377
- lineWidth: 1
7378
- }
7379
- };
7380
7608
  result.axes = [
7381
7609
  {
7382
7610
  type: 'band',
@@ -7401,14 +7629,12 @@ const heatmap = [
7401
7629
  initHeatmap,
7402
7630
  background_backgroundColor,
7403
7631
  datasetXY,
7404
- color_color,
7632
+ colorAdapter(color_color, linearColor),
7405
7633
  label_label,
7406
7634
  labelColorInversion,
7407
- discreteLegend,
7635
+ colorAdapter(discreteLegend, colorLegend),
7636
+ colorCellStyleFill(cellStyle),
7408
7637
  tooltip_tooltip,
7409
- pointStyle_pointStyle,
7410
- pointStateDimensionHover,
7411
- lineStyle_lineStyle,
7412
7638
  annotationPoint_annotationPoint,
7413
7639
  annotationVerticalLine_annotationVerticalLine,
7414
7640
  annotationHorizontalLine_annotationHorizontalLine,
@@ -7423,21 +7649,20 @@ const pivotHeatmap = [
7423
7649
  initHeatmap,
7424
7650
  background_backgroundColor,
7425
7651
  datasetXY,
7426
- color_color,
7652
+ colorAdapter(color_color, linearColor),
7427
7653
  label_label,
7428
7654
  labelColorInversion,
7429
7655
  discreteLegend,
7430
7656
  tooltip_tooltip,
7431
- pointStyle_pointStyle,
7432
- pointStateDimensionHover,
7433
- lineStyle_lineStyle,
7657
+ colorCellStyleFill(cellStyle),
7434
7658
  annotationPoint_annotationPoint,
7435
7659
  annotationVerticalLine_annotationVerticalLine,
7436
7660
  annotationHorizontalLine_annotationHorizontalLine,
7437
7661
  annotationArea_annotationArea
7438
7662
  ]),
7439
7663
  pivotRowDimensions,
7440
- pivotColumnDimensions
7664
+ pivotColumnDimensions,
7665
+ colorAdapter(pivotDiscreteLegend, pivotColorLegend)
7441
7666
  ];
7442
7667
  const heatmapSpecPipeline = [
7443
7668
  pivotAdapter_pivotAdapter(heatmap, pivotHeatmap)
@@ -8154,7 +8379,18 @@ const zDimension = z.object({
8154
8379
  'dimension',
8155
8380
  'rowDimension',
8156
8381
  'columnDimension'
8157
- ]).default('dimension')
8382
+ ]).default('dimension'),
8383
+ encoding: z["enum"]([
8384
+ 'xAxis',
8385
+ 'yAxis',
8386
+ 'angle',
8387
+ 'color',
8388
+ 'detail',
8389
+ 'tooltip',
8390
+ 'label',
8391
+ 'row',
8392
+ 'column'
8393
+ ]).optional()
8158
8394
  });
8159
8395
  const zDimensionGroup = z.object({
8160
8396
  id: z.string(),