@visactor/vseed 0.1.4 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/dist/builder/builder/builder.d.ts +2 -2
  2. package/dist/index.cjs +851 -703
  3. package/dist/index.cjs.map +1 -1
  4. package/dist/index.js +851 -703
  5. package/dist/index.js.map +1 -1
  6. package/dist/pipeline/advanced/chart/pipes/{init/autoDimensions.d.ts → default/defaultDimensions.d.ts} +1 -1
  7. package/dist/pipeline/advanced/chart/pipes/default/defaultMeasureName.d.ts +2 -0
  8. package/dist/pipeline/advanced/chart/pipes/default/defaultMeasures.d.ts +5 -0
  9. package/dist/pipeline/advanced/chart/pipes/default/index.d.ts +3 -0
  10. package/dist/pipeline/advanced/chart/pipes/encoding/column.d.ts +19 -0
  11. package/dist/pipeline/advanced/chart/pipes/encoding/line.d.ts +17 -0
  12. package/dist/pipeline/advanced/chart/pipes/index.d.ts +1 -0
  13. package/dist/pipeline/advanced/chart/pipes/init/index.d.ts +0 -2
  14. package/dist/pipeline/advanced/chart/pipes/measures/utils.d.ts +3 -18
  15. package/dist/pipeline/advanced/table/pipes/reshape/index.d.ts +1 -0
  16. package/dist/pipeline/advanced/table/pipes/reshape/reshapePivotTable.d.ts +2 -0
  17. package/dist/pipeline/spec/chart/pipes/color/colorCellStyleFill.d.ts +2 -0
  18. package/dist/pipeline/spec/chart/pipes/color/colorFunnelStyleFill.d.ts +2 -0
  19. package/dist/pipeline/spec/chart/pipes/color/colorPieStyleFill.d.ts +2 -0
  20. package/dist/pipeline/spec/chart/pipes/color/colorRoseStyleFill.d.ts +2 -0
  21. package/dist/pipeline/spec/chart/pipes/color/index.d.ts +4 -0
  22. package/dist/pipeline/spec/chart/pipes/markStyle/cellStyle.d.ts +2 -0
  23. package/dist/pipeline/spec/chart/pipes/markStyle/funnelStyle.d.ts +2 -0
  24. package/dist/pipeline/spec/chart/pipes/markStyle/index.d.ts +5 -1
  25. package/dist/pipeline/spec/chart/pipes/markStyle/pieStyle.d.ts +2 -0
  26. package/dist/pipeline/spec/chart/pipes/markStyle/roseStyle.d.ts +2 -0
  27. package/dist/types/advancedVSeed.d.ts +2 -0
  28. package/dist/types/chartType/area/area.d.ts +20 -3
  29. package/dist/types/chartType/area/zArea.d.ts +2 -0
  30. package/dist/types/chartType/areaPercent/areaPercent.d.ts +16 -0
  31. package/dist/types/chartType/areaPercent/zAreaPercent.d.ts +2 -0
  32. package/dist/types/chartType/bar/zBar.d.ts +2 -0
  33. package/dist/types/chartType/barParallel/zBarParallel.d.ts +2 -0
  34. package/dist/types/chartType/barPercent/zBarPercent.d.ts +2 -0
  35. package/dist/types/chartType/column/column.d.ts +17 -1
  36. package/dist/types/chartType/column/zColumn.d.ts +2 -0
  37. package/dist/types/chartType/columnParallel/columnParallel.d.ts +17 -0
  38. package/dist/types/chartType/columnParallel/zColumnParallel.d.ts +2 -0
  39. package/dist/types/chartType/columnPercent/columnPercent.d.ts +17 -1
  40. package/dist/types/chartType/columnPercent/zColumnPercent.d.ts +2 -0
  41. package/dist/types/chartType/donut/zDonut.d.ts +2 -0
  42. package/dist/types/chartType/dualAxis/zDualAxis.d.ts +10 -0
  43. package/dist/types/chartType/funnel/zFunnel.d.ts +2 -0
  44. package/dist/types/chartType/heatmap/zHeatmap.d.ts +2 -0
  45. package/dist/types/chartType/line/line.d.ts +16 -0
  46. package/dist/types/chartType/line/zLine.d.ts +2 -0
  47. package/dist/types/chartType/pie/zPie.d.ts +2 -0
  48. package/dist/types/chartType/pivotTable/zPivotTable.d.ts +2 -0
  49. package/dist/types/chartType/radar/zRadar.d.ts +2 -0
  50. package/dist/types/chartType/rose/zRose.d.ts +2 -0
  51. package/dist/types/chartType/roseParallel/zRoseParallel.d.ts +2 -0
  52. package/dist/types/chartType/scatter/zScatter.d.ts +10 -0
  53. package/dist/types/chartType/table/zTable.d.ts +2 -0
  54. package/dist/types/properties/measures/measures.d.ts +3 -1
  55. package/dist/types/properties/measures/zDualMeasures.d.ts +16 -0
  56. package/dist/types/properties/measures/zMeasures.d.ts +6 -0
  57. package/dist/types/properties/measures/zScatterMeasures.d.ts +16 -0
  58. package/dist/types/zVseed.d.ts +56 -0
  59. package/dist/umd/index.js +872 -724
  60. package/dist/umd/index.js.map +1 -1
  61. package/package.json +1 -1
  62. package/dist/pipeline/advanced/chart/pipes/init/utils.d.ts +0 -2
package/dist/index.js CHANGED
@@ -190,7 +190,8 @@ const autoMeasures = (advancedVSeed, context)=>{
190
190
  void 0
191
191
  ].includes(key)).map((measure)=>({
192
192
  id: measure,
193
- alias: measure
193
+ alias: measure,
194
+ encoding: 'column'
194
195
  }));
195
196
  return result;
196
197
  };
@@ -274,7 +275,7 @@ const autoDimensions = (advancedVSeed, context)=>{
274
275
  ].includes(key) && !measures.some((measure)=>measure.id === key)).map((dim)=>({
275
276
  id: dim,
276
277
  alias: dim,
277
- location: 'dimension'
278
+ encoding: 'column'
278
279
  }));
279
280
  return result;
280
281
  };
@@ -709,10 +710,27 @@ const autoPivotMeasures = (advancedVSeed, context)=>{
709
710
  void 0
710
711
  ].includes(key)).map((measure)=>({
711
712
  id: measure,
712
- alias: measure
713
+ alias: measure,
714
+ encoding: 'detail'
713
715
  }));
714
716
  return result;
715
717
  };
718
+ const ORIGINAL_DATA = '__OriginalData__';
719
+ const Separator = '-';
720
+ const FoldMeasureName = '__MeaName__';
721
+ const FoldMeasureId = '__MeaId__';
722
+ const FoldMeasureValue = '__MeaValue__';
723
+ const MeasureName = FoldMeasureName;
724
+ const FoldPrimaryMeasureValue = '__MeaPrimaryValue__';
725
+ const FoldSecondaryMeasureValue = '__MeaSecondaryValue__';
726
+ const FoldXMeasureValue = '__MeaXValue__';
727
+ const FoldYMeasureValue = '__MeaYValue__';
728
+ const XEncoding = '__Dim_X__';
729
+ const YEncoding = '__Dim_Y__';
730
+ const AngleEncoding = '__Dim_Angle__';
731
+ const DetailEncoding = '__Dim_Detail__';
732
+ const ColorEncoding = '__Dim_Color__';
733
+ const ColorIdEncoding = '__Dim_ColorId__';
716
734
  const findAllDimensions = (dimensions = [])=>{
717
735
  if (!dimensions) return [];
718
736
  const result = [];
@@ -729,15 +747,21 @@ const autoPivotDimensions = (advancedVSeed, context)=>{
729
747
  const { vseed } = context;
730
748
  const { dimensions, dataset } = vseed;
731
749
  const measures = findAllMeasures(advancedVSeed.measures);
750
+ const MeaName = {
751
+ id: MeasureName,
752
+ alias: intl.i18n`指标名称`
753
+ };
732
754
  if (!dataset) throw new Error('dataset is required');
733
755
  if (0 === dataset.length) return result;
734
756
  if (dimensions) {
735
757
  const newDimensions = findAllDimensions(dimensions);
758
+ if (!newDimensions.some((dim)=>dim.id === MeasureName)) newDimensions.push(MeaName);
736
759
  result.dimensions = newDimensions.map((item, index)=>{
760
+ if ('row' === item.encoding || 'column' === item.encoding) return item;
737
761
  if ('rowDimension' === item.location || 'columnDimension' === item.location) return item;
738
762
  return {
739
763
  ...item,
740
- location: index % 2 === 0 ? 'columnDimension' : 'rowDimension'
764
+ encoding: index % 2 === 0 ? 'column' : 'row'
741
765
  };
742
766
  });
743
767
  return result;
@@ -747,15 +771,19 @@ const autoPivotDimensions = (advancedVSeed, context)=>{
747
771
  ...prev,
748
772
  ...cur
749
773
  }), {});
750
- let i = 0;
751
- result.dimensions = Object.keys(sample).filter((key)=>top100dataset.some((item)=>'string' == typeof item[key]) && ![
774
+ const newDimensions = Object.keys(sample).filter((key)=>top100dataset.some((item)=>'string' == typeof item[key]) && ![
752
775
  '',
753
776
  null,
754
777
  void 0
755
- ].includes(key) && !measures.some((measure)=>measure.id === key)).map((dim)=>({
778
+ ].includes(key) && !measures.some((measure)=>measure.id === key));
779
+ result.dimensions = newDimensions.map((dim)=>({
756
780
  id: dim,
757
- alias: dim,
758
- location: i++ % 2 === 0 ? 'columnDimension' : 'rowDimension'
781
+ alias: dim
782
+ }));
783
+ result.dimensions.push(MeaName);
784
+ result.dimensions = result.dimensions.map((dim, index)=>({
785
+ ...dim,
786
+ encoding: index % 2 === 0 ? 'column' : 'row'
759
787
  }));
760
788
  return result;
761
789
  };
@@ -786,11 +814,89 @@ const pivotTableConfig = (advancedVSeed, context)=>{
786
814
  };
787
815
  return result;
788
816
  };
817
+ const foldMeasures = (dataset, measures, options)=>{
818
+ const { measureId, measureName, measureValue, colorMeasureId } = options || {};
819
+ const foldInfo = {
820
+ measureId,
821
+ measureName,
822
+ measureValue,
823
+ colorRange: [
824
+ 0,
825
+ 1
826
+ ],
827
+ measureRange: [
828
+ 0,
829
+ 1
830
+ ],
831
+ foldMap: {}
832
+ };
833
+ const result = new Array(dataset.length * measures.length);
834
+ let index = 0;
835
+ const ids = measures.map((d)=>d.id);
836
+ for(let i = 0; i < dataset.length; i++)for(let j = 0; j < measures.length; j++){
837
+ const datum = omit({
838
+ ...dataset[i]
839
+ }, ids);
840
+ datum[ORIGINAL_DATA] = dataset[i];
841
+ const measure = measures[j];
842
+ const { id, alias } = measure;
843
+ datum[id] = dataset[i][id];
844
+ datum[measureId] = id;
845
+ datum[measureName] = alias || id;
846
+ datum[measureValue] = dataset[i][id];
847
+ if (colorMeasureId) {
848
+ const value = datum[ORIGINAL_DATA][colorMeasureId];
849
+ datum[ColorEncoding] = value;
850
+ datum[ColorIdEncoding] = colorMeasureId;
851
+ foldInfo.colorRange = [
852
+ Math.min(foldInfo.colorRange[0] || 1 / 0, Number(value)),
853
+ Math.max(foldInfo.colorRange[1] || -1 / 0, Number(value))
854
+ ];
855
+ }
856
+ foldInfo.measureRange = [
857
+ Math.min(foldInfo.measureRange[0] || 1 / 0, Number(datum[id])),
858
+ Math.max(foldInfo.measureRange[1] || -1 / 0, Number(datum[id]))
859
+ ];
860
+ foldInfo.foldMap[id] = alias;
861
+ result[index++] = datum;
862
+ }
863
+ return {
864
+ dataset: result,
865
+ foldInfo
866
+ };
867
+ };
868
+ const reshapePivotTable = (advancedVSeed, context)=>{
869
+ const result = {
870
+ ...advancedVSeed
871
+ };
872
+ const { vseed } = context;
873
+ const { dataset, chartType } = vseed;
874
+ const { dimensions, measures } = advancedVSeed;
875
+ const { dataset: newDatasets, foldInfo } = foldMeasures(dataset, findAllMeasures(measures), {
876
+ measureId: FoldMeasureId,
877
+ measureName: FoldMeasureName,
878
+ measureValue: FoldMeasureValue
879
+ });
880
+ const datasetReshapeInfo = [
881
+ {
882
+ id: String(chartType),
883
+ index: 0,
884
+ foldInfo
885
+ }
886
+ ];
887
+ return {
888
+ ...result,
889
+ dataset: newDatasets,
890
+ datasetReshapeInfo: datasetReshapeInfo,
891
+ dimensions,
892
+ measures
893
+ };
894
+ };
789
895
  const pivotTableAdvancedPipeline = [
790
896
  initAdvancedVSeed,
791
897
  autoPivotMeasures,
792
898
  autoPivotDimensions,
793
- records_records,
899
+ reshapePivotTable,
794
900
  pivotTableConfig,
795
901
  theme_theme
796
902
  ];
@@ -837,7 +943,7 @@ const initPivotTable = (spec, context)=>{
837
943
  const pivotColumns = (spec, context)=>{
838
944
  const { advancedVSeed } = context;
839
945
  const dimensions = advancedVSeed.dimensions;
840
- const columns = dimensions.filter((item)=>'columnDimension' === item['location']);
946
+ const columns = dimensions.filter((item)=>'columnDimension' === item['location'] || 'column' === item['encoding']);
841
947
  return {
842
948
  ...spec,
843
949
  columns: columns.map((item)=>({
@@ -850,7 +956,7 @@ const pivotColumns = (spec, context)=>{
850
956
  const pivotRows = (spec, context)=>{
851
957
  const { advancedVSeed } = context;
852
958
  const dimensions = advancedVSeed.dimensions;
853
- const rows = dimensions.filter((item)=>'rowDimension' === item['location']);
959
+ const rows = dimensions.filter((item)=>'rowDimension' === item['location'] || 'row' === item['encoding']);
854
960
  return {
855
961
  ...spec,
856
962
  rows: rows.map((item)=>({
@@ -862,25 +968,31 @@ const pivotRows = (spec, context)=>{
862
968
  };
863
969
  const pivotIndicators = (spec, context)=>{
864
970
  const { advancedVSeed } = context;
865
- const { locale } = advancedVSeed;
866
- const measures = advancedVSeed.measures;
971
+ const { locale, measures, datasetReshapeInfo } = advancedVSeed;
972
+ const { foldInfo } = datasetReshapeInfo[0];
867
973
  return {
868
974
  ...spec,
869
975
  indicatorsAsCol: true,
870
976
  indicatorTitle: intl.i18n`指标名称`,
871
- indicators: measures.map((item)=>{
872
- if (isMeasure(item)) return {
977
+ hideIndicatorName: true,
978
+ indicators: [
979
+ {
873
980
  cellType: 'text',
874
- indicatorKey: item.id,
875
- title: item.alias || item.id,
981
+ indicatorKey: foldInfo.measureValue,
982
+ title: 'indicator',
876
983
  width: 'auto',
877
- format: pivotIndicators_fieldFormat(item, locale)
878
- };
879
- return {};
880
- })
984
+ format: pivotIndicators_fieldFormat(measures, foldInfo, locale)
985
+ }
986
+ ]
881
987
  };
882
988
  };
883
- const pivotIndicators_fieldFormat = (node, locale)=>(value)=>{
989
+ const pivotIndicators_fieldFormat = (measures, foldInfo, locale)=>(value, col, row, table)=>{
990
+ if (!isNumber(col) || !isNumber(row) || !table) return value;
991
+ const datum = table.getCellOriginRecord(col, row);
992
+ const { measureId: foldMeasureId } = foldInfo;
993
+ const measureId = datum[0][foldMeasureId];
994
+ const node = findMeasureById(measures, measureId);
995
+ if (!node) return value;
884
996
  const { format = {}, autoFormat = true } = node;
885
997
  if (!external_remeda_isEmpty(format)) {
886
998
  const formatter = createFormatter(format);
@@ -1036,95 +1148,81 @@ const initAdvancedVSeed_initAdvancedVSeed = (advancedVSeed, context)=>{
1036
1148
  locale: locale || 'zh-CN'
1037
1149
  };
1038
1150
  };
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
- encoding: 'detail'
1151
+ const defaultMeasures_defaultMeasures = (advancedVSeed, context)=>{
1152
+ const { vseed } = context;
1153
+ const { measures, dataset } = vseed;
1154
+ if (measures && measures.length > 0) return {
1155
+ ...advancedVSeed,
1156
+ measures
1061
1157
  };
1062
1158
  if (!dataset) throw new Error('dataset is required');
1063
- if (0 === dataset.length) return [];
1064
- if (dimensions) {
1065
- const basicDimensions = dimensions.map((dim)=>({
1066
- location: 'dimension',
1067
- ...dim
1068
- }));
1069
- if (basicDimensions.some((dim)=>dim.id === MeasureName)) return basicDimensions;
1070
- basicDimensions.push(MeaName);
1071
- return basicDimensions;
1072
- }
1159
+ if (0 === dataset.length) return {
1160
+ ...advancedVSeed,
1161
+ measures: []
1162
+ };
1073
1163
  const top100dataset = dataset.slice(0, 100);
1074
1164
  const sample = top100dataset.reduce((prev, cur)=>({
1075
1165
  ...prev,
1076
1166
  ...cur
1077
1167
  }), {});
1078
- const basicDimensions = Object.keys(sample).filter((key)=>top100dataset.some((item)=>'string' == typeof item[key]) && ![
1168
+ const defaultMeasures = Object.keys(sample).filter((key)=>top100dataset.some((item)=>'number' == typeof item[key]) && ![
1079
1169
  '',
1080
1170
  null,
1081
1171
  void 0
1082
- ].includes(key)).map((dim)=>({
1083
- id: dim,
1084
- alias: dim,
1085
- location: 'dimension'
1172
+ ].includes(key)).map((measure)=>({
1173
+ id: measure,
1174
+ alias: measure
1086
1175
  }));
1087
- basicDimensions.push(MeaName);
1088
- return basicDimensions;
1089
- };
1090
- const getBasicMeasures = (vseed)=>{
1091
- const { dataset, measures } = vseed;
1092
- if (!measures || 0 === measures.length) return generateMeasuresByDataset(dataset);
1093
- return measures;
1176
+ return {
1177
+ ...advancedVSeed,
1178
+ measures: defaultMeasures
1179
+ };
1094
1180
  };
1095
- const generateMeasuresByDataset = (dataset)=>{
1181
+ const defaultDimensions = (advancedVSeed, context)=>{
1182
+ const result = {
1183
+ ...advancedVSeed
1184
+ };
1185
+ const { vseed } = context;
1186
+ const { dimensions, dataset } = vseed;
1187
+ if (dimensions && dimensions.length > 0) return {
1188
+ ...result,
1189
+ dimensions
1190
+ };
1096
1191
  if (!dataset) throw new Error('dataset is required');
1097
- if (0 === dataset.length) return [];
1192
+ if (0 === dataset.length) return result;
1193
+ const measures = findAllMeasures(advancedVSeed.measures);
1098
1194
  const top100dataset = dataset.slice(0, 100);
1099
1195
  const sample = top100dataset.reduce((prev, cur)=>({
1100
1196
  ...prev,
1101
1197
  ...cur
1102
1198
  }), {});
1103
- const basicMeasures = Object.keys(sample).filter((key)=>top100dataset.some((item)=>'number' == typeof item[key]) && ![
1199
+ const newDimensions = Object.keys(sample).filter((key)=>top100dataset.some((item)=>'string' == typeof item[key]) && ![
1104
1200
  '',
1105
1201
  null,
1106
1202
  void 0
1107
- ].includes(key)).map((measure)=>({
1108
- id: measure,
1109
- alias: measure
1203
+ ].includes(key) && !measures.some((measure)=>measure.id === key)).map((dim)=>({
1204
+ id: dim,
1205
+ alias: dim
1110
1206
  }));
1111
- return basicMeasures;
1112
- };
1113
- const isMeasureTreeWithChildren = (vseed)=>{
1114
- const { measures } = vseed;
1115
- if (!measures) return false;
1116
- return measures.some((measure)=>'children' in measure);
1207
+ return {
1208
+ ...result,
1209
+ dimensions: newDimensions
1210
+ };
1117
1211
  };
1118
- const isMeasureTreeWithParentId = (vseed)=>{
1119
- const { measures } = vseed;
1120
- if (!measures) return false;
1121
- return measures.some((measure)=>'parentId' in measure);
1212
+ const defaultMeasureName = (advancedVSeed)=>{
1213
+ const result = {
1214
+ ...advancedVSeed
1215
+ };
1216
+ const MeaName = {
1217
+ id: MeasureName,
1218
+ alias: intl.i18n`指标名称`
1219
+ };
1220
+ if (!result.dimensions?.some((dim)=>dim.id === MeasureName)) result.dimensions?.push(MeaName);
1221
+ return result;
1122
1222
  };
1123
- const encodingForLine = (advancedVSeed, context)=>{
1124
- const { vseed } = context;
1125
- const { measures: vseedMeasures = [] } = vseed;
1126
- const measures = vseedMeasures.length ? findAllMeasures(vseedMeasures) : getBasicMeasures(vseed);
1127
- const dimensions = getBasicDimensions(vseed);
1223
+ const encodingForLine = (advancedVSeed)=>{
1224
+ const { measures: vseedMeasures = [], dimensions = [] } = advancedVSeed;
1225
+ const measures = findAllMeasures(vseedMeasures);
1128
1226
  const hasDimensionEncoding = dimensions.some((item)=>item.encoding);
1129
1227
  const hasMeasureEncoding = measures.some((item)=>item.encoding);
1130
1228
  const encoding = {};
@@ -1137,36 +1235,46 @@ const encodingForLine = (advancedVSeed, context)=>{
1137
1235
  encoding
1138
1236
  };
1139
1237
  };
1140
- const generateDefaultMeasureEncoding = (measures, encoding)=>{
1141
- encoding.tooltip = unique(measures.map((item)=>item.id));
1142
- encoding.y = unique(measures.filter((item)=>'yAxis' === item.encoding || !item.encoding).map((item)=>item.id));
1143
- };
1144
1238
  const generateDefaultDimensionEncoding = (dimensions, encoding)=>{
1145
- const onlyMeasureName = 1 === dimensions.length && dimensions.find((item)=>item.id === MeasureName);
1146
1239
  const uniqueDimIds = unique(dimensions.map((d)=>d.id));
1147
1240
  encoding.x = uniqueDimIds.slice(0, 1);
1148
- encoding.color = uniqueDimIds.slice(onlyMeasureName ? 0 : 1);
1149
- encoding.detail = uniqueDimIds.slice(onlyMeasureName ? 0 : 1);
1241
+ encoding.color = uniqueDimIds.slice(1);
1150
1242
  encoding.tooltip = uniqueDimIds;
1243
+ encoding.detail = [];
1151
1244
  encoding.label = [];
1152
1245
  encoding.row = [];
1153
1246
  encoding.column = [];
1154
1247
  };
1155
- const generateMeasureEncoding = (measures, encoding)=>{
1156
- encoding.tooltip = measures.map((item)=>item.id);
1157
- encoding.y = unique(measures.filter((item)=>'yAxis' === item.encoding || !item.encoding).map((item)=>item.id));
1158
- const color = unique(measures.filter((item)=>'color' === item.encoding).map((item)=>item.id));
1159
- if (color.length > 0) encoding.color = color;
1160
- };
1161
1248
  const generateDimensionEncoding = (dimensions, encoding)=>{
1162
- encoding.x = unique(dimensions.filter((item)=>'xAxis' === item.encoding || !item.encoding).map((item)=>item.id));
1249
+ encoding.x = unique(dimensions.filter((item)=>'xAxis' === item.encoding).map((item)=>item.id));
1163
1250
  encoding.color = unique(dimensions.filter((item)=>'color' === item.encoding).map((item)=>item.id));
1164
1251
  encoding.detail = unique(dimensions.filter((item)=>'detail' === item.encoding).map((item)=>item.id));
1165
1252
  if (0 === encoding.x.length) encoding.x = [
1166
1253
  dimensions[0].id
1167
1254
  ];
1168
- if (0 === encoding.color.length) encoding.color = dimensions.filter((item)=>!encoding.x?.includes(item.id)).map((item)=>item.id);
1169
- if (0 === encoding.detail.length) encoding.detail = dimensions.filter((item)=>!encoding.x?.includes(item.id)).map((item)=>item.id);
1255
+ if (0 === encoding.color.length) encoding.color = [
1256
+ MeasureName
1257
+ ];
1258
+ };
1259
+ const generateDefaultMeasureEncoding = (measures, encoding)=>{
1260
+ encoding.tooltip = unique(measures.map((item)=>item.id));
1261
+ encoding.y = unique(measures.filter((item)=>'yAxis' === item.encoding || !item.encoding).map((item)=>item.id));
1262
+ };
1263
+ const generateMeasureEncoding = (measures, encoding)=>{
1264
+ encoding.tooltip = measures.map((item)=>item.id);
1265
+ encoding.y = unique(measures.filter((item)=>'yAxis' === item.encoding || !item.encoding).map((item)=>item.id));
1266
+ const color = unique(measures.filter((item)=>'color' === item.encoding).map((item)=>item.id));
1267
+ if (color.length > 0) encoding.color = color;
1268
+ };
1269
+ const isMeasureTreeWithChildren = (vseed)=>{
1270
+ const { measures } = vseed;
1271
+ if (!measures) return false;
1272
+ return measures.some((measure)=>'children' in measure);
1273
+ };
1274
+ const isMeasureTreeWithParentId = (vseed)=>{
1275
+ const { measures } = vseed;
1276
+ if (!measures) return false;
1277
+ return measures.some((measure)=>'parentId' in measure);
1170
1278
  };
1171
1279
  const measureDepth = (measures = [])=>{
1172
1280
  if (!measures) return 0;
@@ -1226,9 +1334,7 @@ const buildMeasures = (advancedVSeed, context)=>{
1226
1334
  advancedVSeed.measures = generateMeasuresByParentId(vseed.measures);
1227
1335
  return advancedVSeed;
1228
1336
  }
1229
- const basicMeasures = getBasicMeasures(vseed);
1230
- if (isPivotChart(vseed)) advancedVSeed.measures = basicMeasuresToMeasureTree(basicMeasures);
1231
- else advancedVSeed.measures = basicMeasures;
1337
+ if (isPivotChart(vseed)) advancedVSeed.measures = basicMeasuresToMeasureTree(advancedVSeed.measures);
1232
1338
  return advancedVSeed;
1233
1339
  };
1234
1340
  const generateMeasuresByParentId = (measures)=>{
@@ -1259,102 +1365,12 @@ const basicMeasuresToMeasureTree = (measures)=>{
1259
1365
  }
1260
1366
  ];
1261
1367
  };
1262
- const autoDimensions_autoDimensions = (advancedVSeed, context)=>{
1263
- const result = {
1264
- ...advancedVSeed
1265
- };
1266
- const { vseed } = context;
1267
- const { dimensions, dataset } = vseed;
1268
- const measures = findAllMeasures(advancedVSeed.measures);
1269
- const MeaName = {
1270
- id: MeasureName,
1271
- alias: intl.i18n`指标名称`
1272
- };
1273
- if (!dataset) throw new Error('dataset is required');
1274
- if (0 === dataset.length) return result;
1275
- if (dimensions) {
1276
- result.dimensions = dimensions.map((dim)=>({
1277
- location: 'dimension',
1278
- ...dim
1279
- }));
1280
- if (result.dimensions.some((dim)=>dim.id === MeasureName)) return result;
1281
- result.dimensions.push(MeaName);
1282
- return result;
1283
- }
1284
- const top100dataset = dataset.slice(0, 100);
1285
- const sample = top100dataset.reduce((prev, cur)=>({
1286
- ...prev,
1287
- ...cur
1288
- }), {});
1289
- result.dimensions = Object.keys(sample).filter((key)=>top100dataset.some((item)=>'string' == typeof item[key]) && ![
1290
- '',
1291
- null,
1292
- void 0
1293
- ].includes(key) && !measures.some((measure)=>measure.id === key)).map((dim)=>({
1294
- id: dim,
1295
- alias: dim,
1296
- location: 'dimension'
1297
- }));
1298
- result.dimensions.push(MeaName);
1299
- return result;
1300
- };
1301
1368
  const pivotAdapter = (pipeline, pivotPipeline)=>(advancedVSeed, context)=>{
1302
1369
  const { vseed } = context;
1303
1370
  const usePivotChart = isPivotChart(vseed);
1304
1371
  if (usePivotChart) return execPipeline(pivotPipeline, context, advancedVSeed);
1305
1372
  return execPipeline(pipeline, context, advancedVSeed);
1306
1373
  };
1307
- const foldMeasures = (dataset, measures, options)=>{
1308
- const { measureId, measureName, measureValue, colorMeasureId } = options || {};
1309
- const foldInfo = {
1310
- measureId,
1311
- measureName,
1312
- measureValue,
1313
- colorRange: [
1314
- 0,
1315
- 1
1316
- ],
1317
- measureRange: [
1318
- 0,
1319
- 1
1320
- ],
1321
- foldMap: {}
1322
- };
1323
- const result = new Array(dataset.length * measures.length);
1324
- let index = 0;
1325
- const ids = measures.map((d)=>d.id);
1326
- for(let i = 0; i < dataset.length; i++)for(let j = 0; j < measures.length; j++){
1327
- const datum = omit({
1328
- ...dataset[i]
1329
- }, ids);
1330
- datum[ORIGINAL_DATA] = dataset[i];
1331
- const measure = measures[j];
1332
- const { id, alias } = measure;
1333
- datum[id] = dataset[i][id];
1334
- datum[measureId] = id;
1335
- datum[measureName] = alias || id;
1336
- datum[measureValue] = dataset[i][id];
1337
- if (colorMeasureId) {
1338
- const value = datum[ORIGINAL_DATA][colorMeasureId];
1339
- datum[ColorEncoding] = value;
1340
- datum[ColorIdEncoding] = colorMeasureId;
1341
- foldInfo.colorRange = [
1342
- Math.min(foldInfo.colorRange[0] || 1 / 0, Number(value)),
1343
- Math.max(foldInfo.colorRange[1] || -1 / 0, Number(value))
1344
- ];
1345
- }
1346
- foldInfo.measureRange = [
1347
- Math.min(foldInfo.measureRange[0] || 1 / 0, Number(datum[id])),
1348
- Math.max(foldInfo.measureRange[1] || -1 / 0, Number(datum[id]))
1349
- ];
1350
- foldInfo.foldMap[id] = alias;
1351
- result[index++] = datum;
1352
- }
1353
- return {
1354
- dataset: result,
1355
- foldInfo
1356
- };
1357
- };
1358
1374
  const unfoldDimensions = (dataset, dimensions, encoding, options)=>{
1359
1375
  const { foldMeasureId, separator, colorItemAsId } = options;
1360
1376
  const unfoldInfo = {
@@ -1449,7 +1465,9 @@ const reshapeWithEncoding = (advancedVSeed, context)=>{
1449
1465
  const { dimensions, measures, encoding } = advancedVSeed;
1450
1466
  if (!measures || !dimensions || !dataset || !encoding) return result;
1451
1467
  if (0 === measures.length) throw new Error('measures can not be empty');
1468
+ const hasEncoding = (vseed.dimensions || []).some((item)=>item.encoding);
1452
1469
  const { dataset: newDatasets, foldInfo, unfoldInfo } = dataReshapeByEncoding(dataset, uniqueBy(dimensions, (item)=>item.id), uniqueBy(findAllMeasures(measures), (item)=>item.id), encoding, {
1470
+ colorItemAsId: hasEncoding,
1453
1471
  colorMeasureId: getColorMeasureId(advancedVSeed)
1454
1472
  });
1455
1473
  return {
@@ -1480,6 +1498,7 @@ const pivotReshapeWithEncoding = (advancedVSeed, context)=>{
1480
1498
  if (measures) measures.forEach((measure)=>{
1481
1499
  if (measure.children && measure.children.length > 0) measureGroups.push(measure);
1482
1500
  });
1501
+ const hasEncoding = (vseed.dimensions || []).some((item)=>item.encoding);
1483
1502
  const datasets = [];
1484
1503
  const datasetReshapeInfo = [];
1485
1504
  measureGroups.forEach((measureGroup, index)=>{
@@ -1487,6 +1506,7 @@ const pivotReshapeWithEncoding = (advancedVSeed, context)=>{
1487
1506
  if (!measures) return;
1488
1507
  const groupId = measureGroup.id;
1489
1508
  const { dataset: newSubDataset, foldInfo, unfoldInfo } = dataReshapeByEncoding(dataset, uniqueBy(dimensions, (item)=>item.id), uniqueBy(measures, (item)=>item.id), encoding, {
1509
+ colorItemAsId: hasEncoding,
1490
1510
  foldMeasureValue: `${FoldMeasureValue}${groupId}`,
1491
1511
  colorMeasureId: getColorMeasureId(advancedVSeed)
1492
1512
  });
@@ -1695,9 +1715,11 @@ const annotation_annotation = (advancedVSeed, context)=>{
1695
1715
  };
1696
1716
  const lineAdvancedPipeline = [
1697
1717
  initAdvancedVSeed_initAdvancedVSeed,
1718
+ defaultMeasures_defaultMeasures,
1719
+ defaultDimensions,
1720
+ defaultMeasureName,
1698
1721
  encodingForLine,
1699
1722
  buildMeasures,
1700
- autoDimensions_autoDimensions,
1701
1723
  pivotAdapter([
1702
1724
  reshapeWithEncoding
1703
1725
  ], [
@@ -2044,129 +2066,18 @@ const yLinear = (spec, context)=>{
2044
2066
  domainLine: {
2045
2067
  visible: line?.visible,
2046
2068
  style: {
2047
- lineWidth: line?.lineWidth,
2048
- stroke: line?.lineColor
2049
- }
2050
- },
2051
- innerOffset: {
2052
- top: LINEAR_AXIS_INNER_OFFSET_TOP
2053
- }
2054
- };
2055
- result.axes = [
2056
- ...result.axes,
2057
- linearAxis
2058
- ];
2059
- return result;
2060
- };
2061
- const label_label = (spec, context)=>{
2062
- const result = {
2063
- ...spec
2064
- };
2065
- const { advancedVSeed } = context;
2066
- const { measures, datasetReshapeInfo, locale } = advancedVSeed;
2067
- const { chartType } = advancedVSeed;
2068
- const baseConfig = advancedVSeed.config[chartType];
2069
- if (!baseConfig || !baseConfig.label) return result;
2070
- const { measureId, measureValue } = datasetReshapeInfo[0].foldInfo;
2071
- const { label } = baseConfig;
2072
- const { enable } = label;
2073
- result.label = {
2074
- visible: enable,
2075
- formatMethod: (value, datum)=>{
2076
- const result = [];
2077
- const formatValue = (value)=>{
2078
- const id = datum[measureId];
2079
- const measure = findMeasureById(measures, id);
2080
- if (!measure) return value;
2081
- const { format = {}, autoFormat = true } = measure;
2082
- if (!external_remeda_isEmpty(format)) {
2083
- const formatter = createFormatter(format);
2084
- return formatter(value);
2085
- }
2086
- if (autoFormat) return autoFormatter(value, locale);
2087
- return String(value);
2088
- };
2089
- result.push(formatValue(datum[measureValue]));
2090
- return result.join(' ');
2091
- }
2092
- };
2093
- return result;
2094
- };
2095
- const tooltip_tooltip = (spec, context)=>{
2096
- const result = {
2097
- ...spec
2098
- };
2099
- const { advancedVSeed } = context;
2100
- const { measures, datasetReshapeInfo, chartType, locale, dimensions } = advancedVSeed;
2101
- const baseConfig = advancedVSeed.config[chartType];
2102
- const { tooltip = {
2103
- enable: true
2104
- } } = baseConfig;
2105
- const { enable } = tooltip;
2106
- const { measureId, measureValue, measureName } = datasetReshapeInfo[0].foldInfo;
2107
- const { encodingColor: colorName } = datasetReshapeInfo[0].unfoldInfo;
2108
- result.tooltip = {
2109
- visible: enable,
2110
- mark: {
2111
- title: {
2112
- visible: true
2113
- },
2114
- content: [
2115
- ...dimensions.map((item)=>({
2116
- visible: true,
2117
- hasShape: true,
2118
- shapeType: 'rectRound',
2119
- key: (datum)=>{
2120
- if (item.alias || item.id) return item.alias || item.id;
2121
- return datum && datum[item.id];
2122
- },
2123
- value: (datum)=>datum && datum[item.id]
2124
- })),
2125
- {
2126
- visible: true,
2127
- hasShape: true,
2128
- key: (datum)=>datum && datum[measureName || colorName] || '',
2129
- value: (datum)=>{
2130
- if (!datum) return '';
2131
- const value = datum[measureValue];
2132
- const id = datum[measureId];
2133
- const measure = findMeasureById(measures, id);
2134
- if (!measure) return String(value);
2135
- const { format = {}, autoFormat = true } = measure;
2136
- if (!external_remeda_isEmpty(format)) {
2137
- const formatter = createFormatter(format);
2138
- return formatter(value);
2139
- }
2140
- if (autoFormat) return autoFormatter(value, locale);
2141
- return String(value);
2142
- }
2143
- }
2144
- ]
2069
+ lineWidth: line?.lineWidth,
2070
+ stroke: line?.lineColor
2071
+ }
2145
2072
  },
2146
- dimension: {
2147
- content: [
2148
- {
2149
- visible: true,
2150
- key: (datum)=>datum && datum[colorName] || '',
2151
- value: (datum)=>{
2152
- if (!datum) return '';
2153
- const value = datum[measureValue];
2154
- const id = datum[measureId];
2155
- const measure = findMeasureById(measures, id);
2156
- if (!measure) return String(value);
2157
- const { format = {}, autoFormat = true } = measure;
2158
- if (!external_remeda_isEmpty(format)) {
2159
- const formatter = createFormatter(format);
2160
- return formatter(value);
2161
- }
2162
- if (autoFormat) return autoFormatter(value, locale);
2163
- return String(value);
2164
- },
2165
- shapeType: 'rectRound'
2166
- }
2167
- ]
2073
+ innerOffset: {
2074
+ top: LINEAR_AXIS_INNER_OFFSET_TOP
2168
2075
  }
2169
2076
  };
2077
+ result.axes = [
2078
+ ...result.axes,
2079
+ linearAxis
2080
+ ];
2170
2081
  return result;
2171
2082
  };
2172
2083
  const verticalCrosshairLine = (spec, context)=>{
@@ -2677,6 +2588,117 @@ const lineStyle_lineStyle = (spec, context)=>{
2677
2588
  }
2678
2589
  };
2679
2590
  };
2591
+ const label_label = (spec, context)=>{
2592
+ const result = {
2593
+ ...spec
2594
+ };
2595
+ const { advancedVSeed } = context;
2596
+ const { measures, datasetReshapeInfo, locale } = advancedVSeed;
2597
+ const { chartType } = advancedVSeed;
2598
+ const baseConfig = advancedVSeed.config[chartType];
2599
+ if (!baseConfig || !baseConfig.label) return result;
2600
+ const { measureId, measureValue } = datasetReshapeInfo[0].foldInfo;
2601
+ const { label } = baseConfig;
2602
+ const { enable } = label;
2603
+ result.label = {
2604
+ visible: enable,
2605
+ formatMethod: (value, datum)=>{
2606
+ const result = [];
2607
+ const formatValue = (value)=>{
2608
+ const id = datum[measureId];
2609
+ const measure = findMeasureById(measures, id);
2610
+ if (!measure) return value;
2611
+ const { format = {}, autoFormat = true } = measure;
2612
+ if (!external_remeda_isEmpty(format)) {
2613
+ const formatter = createFormatter(format);
2614
+ return formatter(value);
2615
+ }
2616
+ if (autoFormat) return autoFormatter(value, locale);
2617
+ return String(value);
2618
+ };
2619
+ result.push(formatValue(datum[measureValue]));
2620
+ return result.join(' ');
2621
+ }
2622
+ };
2623
+ return result;
2624
+ };
2625
+ const tooltip_tooltip = (spec, context)=>{
2626
+ const result = {
2627
+ ...spec
2628
+ };
2629
+ const { advancedVSeed } = context;
2630
+ const { measures, datasetReshapeInfo, chartType, locale, dimensions } = advancedVSeed;
2631
+ const baseConfig = advancedVSeed.config[chartType];
2632
+ const { tooltip = {
2633
+ enable: true
2634
+ } } = baseConfig;
2635
+ const { enable } = tooltip;
2636
+ const { measureId, measureValue, measureName } = datasetReshapeInfo[0].foldInfo;
2637
+ const { encodingColor: colorName } = datasetReshapeInfo[0].unfoldInfo;
2638
+ result.tooltip = {
2639
+ visible: enable,
2640
+ mark: {
2641
+ title: {
2642
+ visible: true
2643
+ },
2644
+ content: [
2645
+ ...dimensions.map((item)=>({
2646
+ visible: true,
2647
+ hasShape: true,
2648
+ shapeType: 'rectRound',
2649
+ key: (datum)=>{
2650
+ if (item.alias || item.id) return item.alias || item.id;
2651
+ return datum && datum[item.id];
2652
+ },
2653
+ value: (datum)=>datum && datum[item.id]
2654
+ })),
2655
+ {
2656
+ visible: true,
2657
+ hasShape: true,
2658
+ key: (datum)=>datum && datum[measureName || colorName] || '',
2659
+ value: (datum)=>{
2660
+ if (!datum) return '';
2661
+ const value = datum[measureValue];
2662
+ const id = datum[measureId];
2663
+ const measure = findMeasureById(measures, id);
2664
+ if (!measure) return String(value);
2665
+ const { format = {}, autoFormat = true } = measure;
2666
+ if (!external_remeda_isEmpty(format)) {
2667
+ const formatter = createFormatter(format);
2668
+ return formatter(value);
2669
+ }
2670
+ if (autoFormat) return autoFormatter(value, locale);
2671
+ return String(value);
2672
+ }
2673
+ }
2674
+ ]
2675
+ },
2676
+ dimension: {
2677
+ content: [
2678
+ {
2679
+ visible: true,
2680
+ key: (datum)=>datum && datum[colorName] || '',
2681
+ value: (datum)=>{
2682
+ if (!datum) return '';
2683
+ const value = datum[measureValue];
2684
+ const id = datum[measureId];
2685
+ const measure = findMeasureById(measures, id);
2686
+ if (!measure) return String(value);
2687
+ const { format = {}, autoFormat = true } = measure;
2688
+ if (!external_remeda_isEmpty(format)) {
2689
+ const formatter = createFormatter(format);
2690
+ return formatter(value);
2691
+ }
2692
+ if (autoFormat) return autoFormatter(value, locale);
2693
+ return String(value);
2694
+ },
2695
+ shapeType: 'rectRound'
2696
+ }
2697
+ ]
2698
+ }
2699
+ };
2700
+ return result;
2701
+ };
2680
2702
  const isSubset = (sub, obj)=>Object.entries(sub).every(([key, value])=>{
2681
2703
  if ('string' == typeof value) return obj[key] === value;
2682
2704
  if ('number' == typeof value) return obj[key] === value;
@@ -3293,7 +3315,7 @@ const pivotRowDimensions = (spec, context)=>{
3293
3315
  const { advancedVSeed } = context;
3294
3316
  const dimensions = advancedVSeed.dimensions;
3295
3317
  if (!dimensions) return result;
3296
- const rowDimensions = dimensions.filter((dim)=>'rowDimension' === dim.location);
3318
+ const rowDimensions = dimensions.filter((dim)=>'rowDimension' === dim.location || 'row' === dim.encoding);
3297
3319
  const rows = rowDimensions.map((dim)=>({
3298
3320
  dimensionKey: dim.id,
3299
3321
  title: dim.alias || dim.id
@@ -3310,17 +3332,132 @@ const pivotColumnDimensions = (spec, context)=>{
3310
3332
  const { advancedVSeed } = context;
3311
3333
  const dimensions = advancedVSeed.dimensions;
3312
3334
  if (!dimensions) return result;
3313
- const columnDimensions = dimensions.filter((dim)=>'columnDimension' === dim.location);
3335
+ const columnDimensions = dimensions.filter((dim)=>'columnDimension' === dim.location || 'column' === dim.encoding);
3314
3336
  const columns = columnDimensions.map((dim)=>({
3315
3337
  dimensionKey: dim.id,
3316
3338
  title: dim.alias || dim.id
3317
3339
  }));
3318
3340
  return {
3319
3341
  ...result,
3320
- columns: columns
3342
+ columns: columns
3343
+ };
3344
+ };
3345
+ const pivotDiscreteLegend = (spec, context)=>{
3346
+ const result = {
3347
+ ...spec
3348
+ };
3349
+ const { advancedVSeed } = context;
3350
+ const { chartType } = advancedVSeed;
3351
+ const baseConfig = advancedVSeed.config[chartType];
3352
+ if (!baseConfig || !baseConfig.legend) return result;
3353
+ const { datasetReshapeInfo } = advancedVSeed;
3354
+ const colorItems = unique(datasetReshapeInfo.flatMap((d)=>d.unfoldInfo.colorItems));
3355
+ const colorIdMap = datasetReshapeInfo.reduce((prev, cur)=>({
3356
+ ...prev,
3357
+ ...cur.unfoldInfo.colorIdMap
3358
+ }), {});
3359
+ const { legend, color } = baseConfig;
3360
+ const { colorScheme, colorMapping } = color;
3361
+ const colorSpecified = createSpecifiedForColorMapping(colorMapping, colorIdMap, colorItems);
3362
+ const { enable, position = 'bottom', labelFontColor, labelFontSize = 12, labelFontWeight = 400, maxSize = 1, border, shapeType = 'rectRound' } = legend || {};
3363
+ const orient = [
3364
+ 'bottom',
3365
+ 'bottomLeft',
3366
+ 'bottomRight',
3367
+ 'bl',
3368
+ 'br'
3369
+ ].includes(position) ? 'bottom' : [
3370
+ 'top',
3371
+ 'topLeft',
3372
+ 'topRight',
3373
+ 'tl',
3374
+ 'tr'
3375
+ ].includes(position) ? 'top' : [
3376
+ 'left',
3377
+ 'leftTop',
3378
+ 'leftBottom',
3379
+ 'lt',
3380
+ 'lb'
3381
+ ].includes(position) ? 'left' : 'right';
3382
+ const legendPosition = [
3383
+ 'topLeft',
3384
+ 'bottomLeft',
3385
+ 'leftTop',
3386
+ 'rightTop',
3387
+ 'lt',
3388
+ 'rt',
3389
+ 'tl',
3390
+ 'bl'
3391
+ ].includes(position) ? 'start' : [
3392
+ 'topRight',
3393
+ 'bottomRight',
3394
+ 'leftBottom',
3395
+ 'rightBottom',
3396
+ 'lb',
3397
+ 'rb',
3398
+ 'rt',
3399
+ 'br'
3400
+ ].includes(position) ? 'end' : 'middle';
3401
+ const legends = {
3402
+ visible: enable,
3403
+ type: 'discrete',
3404
+ orient,
3405
+ position: legendPosition,
3406
+ maxCol: Math.max(1, maxSize),
3407
+ maxRow: Math.max(1, maxSize),
3408
+ data: colorItems.map((d, index)=>{
3409
+ const color = colorSpecified?.[d] ?? colorScheme?.[index % colorScheme.length];
3410
+ return {
3411
+ label: d,
3412
+ shape: {
3413
+ outerBorder: border ? {
3414
+ stroke: color,
3415
+ distance: 3,
3416
+ lineWidth: 1
3417
+ } : void 0,
3418
+ fill: color
3419
+ }
3420
+ };
3421
+ }),
3422
+ item: {
3423
+ focus: true,
3424
+ maxWidth: '30%',
3425
+ focusIconStyle: {
3426
+ size: labelFontSize + 2,
3427
+ fill: labelFontColor,
3428
+ fontWeight: labelFontWeight
3429
+ },
3430
+ shape: {
3431
+ space: border ? 6 : 4,
3432
+ style: {
3433
+ symbolType: shapeType,
3434
+ size: border ? 8 : 10
3435
+ }
3436
+ },
3437
+ label: {
3438
+ formatMethod: (value)=>colorIdMap[value] ?? value,
3439
+ style: {
3440
+ fontSize: labelFontSize,
3441
+ fill: labelFontColor,
3442
+ fontWeight: labelFontWeight
3443
+ }
3444
+ },
3445
+ background: {
3446
+ state: {
3447
+ selectedHover: {
3448
+ fill: labelFontColor,
3449
+ fillOpacity: 0.05
3450
+ }
3451
+ }
3452
+ }
3453
+ }
3454
+ };
3455
+ return {
3456
+ ...result,
3457
+ legends
3321
3458
  };
3322
3459
  };
3323
- const pivotDiscreteLegend = (spec, context)=>{
3460
+ const pivotColorLegend = (spec, context)=>{
3324
3461
  const result = {
3325
3462
  ...spec
3326
3463
  };
@@ -3329,15 +3466,11 @@ const pivotDiscreteLegend = (spec, context)=>{
3329
3466
  const baseConfig = advancedVSeed.config[chartType];
3330
3467
  if (!baseConfig || !baseConfig.legend) return result;
3331
3468
  const { datasetReshapeInfo } = advancedVSeed;
3332
- const colorItems = unique(datasetReshapeInfo.flatMap((d)=>d.unfoldInfo.colorItems));
3333
- const colorIdMap = datasetReshapeInfo.reduce((prev, cur)=>({
3334
- ...prev,
3335
- ...cur.unfoldInfo.colorIdMap
3336
- }), {});
3469
+ const max = Math.max(...datasetReshapeInfo.map((d)=>d.foldInfo.colorRange[1]));
3470
+ const min = Math.min(...datasetReshapeInfo.map((d)=>d.foldInfo.colorRange[0]));
3337
3471
  const { legend, color } = baseConfig;
3338
- const { colorScheme, colorMapping } = color;
3339
- const colorSpecified = createSpecifiedForColorMapping(colorMapping, colorIdMap, colorItems);
3340
- const { enable, position = 'bottom', labelFontColor, labelFontSize = 12, labelFontWeight = 400, maxSize = 1, border, shapeType = 'rectRound' } = legend || {};
3472
+ const { colorScheme, linearColorScheme } = color;
3473
+ const { enable, position = 'bottom', labelFontColor, labelFontSize = 12, labelFontWeight = 400 } = legend || {};
3341
3474
  const orient = [
3342
3475
  'bottom',
3343
3476
  'bottomLeft',
@@ -3378,55 +3511,31 @@ const pivotDiscreteLegend = (spec, context)=>{
3378
3511
  ].includes(position) ? 'end' : 'middle';
3379
3512
  const legends = {
3380
3513
  visible: enable,
3381
- type: 'discrete',
3514
+ type: 'color',
3382
3515
  orient,
3383
3516
  position: legendPosition,
3384
- maxCol: Math.max(1, maxSize),
3385
- maxRow: Math.max(1, maxSize),
3386
- data: colorItems.map((d, index)=>{
3387
- const color = colorSpecified?.[d] ?? colorScheme?.[index % colorScheme.length];
3388
- return {
3389
- label: d,
3390
- shape: {
3391
- outerBorder: border ? {
3392
- stroke: color,
3393
- distance: 3,
3394
- lineWidth: 1
3395
- } : void 0,
3396
- fill: color
3397
- }
3398
- };
3399
- }),
3400
- item: {
3401
- focus: true,
3402
- maxWidth: '30%',
3403
- focusIconStyle: {
3404
- size: labelFontSize + 2,
3517
+ colors: linearColorScheme || colorScheme || [],
3518
+ value: [
3519
+ min,
3520
+ max
3521
+ ],
3522
+ min: min,
3523
+ max: max,
3524
+ maxWidth: '30%',
3525
+ startText: {
3526
+ visible: true,
3527
+ style: {
3405
3528
  fill: labelFontColor,
3529
+ fontSize: labelFontSize,
3530
+ fontWeight: labelFontWeight
3531
+ }
3532
+ },
3533
+ endText: {
3534
+ visible: true,
3535
+ style: {
3536
+ fill: labelFontColor,
3537
+ fontSize: labelFontSize,
3406
3538
  fontWeight: labelFontWeight
3407
- },
3408
- shape: {
3409
- space: border ? 6 : 4,
3410
- style: {
3411
- symbolType: shapeType,
3412
- size: border ? 8 : 10
3413
- }
3414
- },
3415
- label: {
3416
- formatMethod: (value)=>colorIdMap[value] ?? value,
3417
- style: {
3418
- fontSize: labelFontSize,
3419
- fill: labelFontColor,
3420
- fontWeight: labelFontWeight
3421
- }
3422
- },
3423
- background: {
3424
- state: {
3425
- selectedHover: {
3426
- fill: labelFontColor,
3427
- fillOpacity: 0.05
3428
- }
3429
- }
3430
3539
  }
3431
3540
  }
3432
3541
  };
@@ -3449,13 +3558,13 @@ const line_line = [
3449
3558
  progressive,
3450
3559
  xBand,
3451
3560
  yLinear,
3452
- label_label,
3453
- tooltip_tooltip,
3454
3561
  verticalCrosshairLine,
3455
3562
  colorAdapter(discreteLegend, colorLegend),
3456
3563
  colorPointStyleFill(pointStyle_pointStyle),
3457
3564
  pointStateDimensionHover,
3458
3565
  colorLineStyleFill(lineStyle_lineStyle),
3566
+ label_label,
3567
+ tooltip_tooltip,
3459
3568
  annotationPoint_annotationPoint,
3460
3569
  annotationVerticalLine_annotationVerticalLine,
3461
3570
  annotationHorizontalLine_annotationHorizontalLine,
@@ -3468,18 +3577,18 @@ const pivotLine = [
3468
3577
  datasetPivot,
3469
3578
  pivotIndicators_pivotIndicators([
3470
3579
  initLine,
3471
- color_color,
3580
+ colorAdapter(color_color, linearColor),
3472
3581
  background_backgroundColor,
3473
3582
  datasetXY,
3474
3583
  progressive,
3475
3584
  xBand,
3476
3585
  yLinear,
3477
- label_label,
3478
- tooltip_tooltip,
3479
3586
  verticalCrosshairLine,
3480
- pointStyle_pointStyle,
3587
+ colorPointStyleFill(pointStyle_pointStyle),
3481
3588
  pointStateDimensionHover,
3482
- lineStyle_lineStyle,
3589
+ colorLineStyleFill(lineStyle_lineStyle),
3590
+ label_label,
3591
+ tooltip_tooltip,
3483
3592
  annotationPoint_annotationPoint,
3484
3593
  annotationVerticalLine_annotationVerticalLine,
3485
3594
  annotationHorizontalLine_annotationHorizontalLine,
@@ -3487,7 +3596,7 @@ const pivotLine = [
3487
3596
  ]),
3488
3597
  pivotRowDimensions,
3489
3598
  pivotColumnDimensions,
3490
- pivotDiscreteLegend
3599
+ colorAdapter(pivotDiscreteLegend, pivotColorLegend)
3491
3600
  ];
3492
3601
  const lineSpecPipeline = [
3493
3602
  pivotAdapter_pivotAdapter(line_line, pivotLine)
@@ -3496,11 +3605,9 @@ const registerLine = ()=>{
3496
3605
  Builder._advancedPipelineMap.line = lineAdvancedPipeline;
3497
3606
  Builder._specPipelineMap.line = lineSpecPipeline;
3498
3607
  };
3499
- const encodingForColumn = (advancedVSeed, context)=>{
3500
- const { vseed } = context;
3501
- const { measures: vseedMeasures = [] } = vseed;
3502
- const measures = vseedMeasures.length ? findAllMeasures(vseedMeasures) : getBasicMeasures(vseed);
3503
- const dimensions = getBasicDimensions(vseed);
3608
+ const encodingForColumn = (advancedVSeed)=>{
3609
+ const { measures: vseedMeasures = [], dimensions = [] } = advancedVSeed;
3610
+ const measures = findAllMeasures(vseedMeasures);
3504
3611
  const hasDimensionEncoding = dimensions.some((item)=>item.encoding);
3505
3612
  const hasMeasureEncoding = measures.some((item)=>item.encoding);
3506
3613
  const encoding = {};
@@ -3513,10 +3620,6 @@ const encodingForColumn = (advancedVSeed, context)=>{
3513
3620
  encoding
3514
3621
  };
3515
3622
  };
3516
- const column_generateDefaultMeasureEncoding = (measures, encoding)=>{
3517
- encoding.tooltip = unique(measures.map((item)=>item.id));
3518
- encoding.y = unique(measures.filter((item)=>'yAxis' === item.encoding || !item.encoding).map((item)=>item.id));
3519
- };
3520
3623
  const column_generateDefaultDimensionEncoding = (dimensions, encoding)=>{
3521
3624
  const onlyMeasureName = 1 === dimensions.length && dimensions.find((item)=>item.id === MeasureName);
3522
3625
  const uniqueDimIds = unique(dimensions.map((d)=>d.id));
@@ -3528,28 +3631,35 @@ const column_generateDefaultDimensionEncoding = (dimensions, encoding)=>{
3528
3631
  encoding.row = [];
3529
3632
  encoding.column = [];
3530
3633
  };
3531
- const column_generateMeasureEncoding = (measures, encoding)=>{
3532
- encoding.tooltip = measures.map((item)=>item.id);
3533
- encoding.y = unique(measures.filter((item)=>'yAxis' === item.encoding || !item.encoding).map((item)=>item.id));
3534
- const color = unique(measures.filter((item)=>'color' === item.encoding).map((item)=>item.id));
3535
- if (color.length > 0) encoding.color = color;
3536
- return encoding;
3537
- };
3538
3634
  const column_generateDimensionEncoding = (dimensions, encoding)=>{
3539
- encoding.x = unique(dimensions.filter((item)=>'xAxis' === item.encoding || !item.encoding).map((item)=>item.id));
3635
+ encoding.x = unique(dimensions.filter((item)=>'xAxis' === item.encoding).map((item)=>item.id));
3540
3636
  encoding.color = unique(dimensions.filter((item)=>'color' === item.encoding).map((item)=>item.id));
3541
3637
  encoding.detail = unique(dimensions.filter((item)=>'detail' === item.encoding).map((item)=>item.id));
3542
3638
  if (0 === encoding.x.length) encoding.x = [
3543
3639
  dimensions[0].id
3544
3640
  ];
3545
- if (0 === encoding.color.length) encoding.color = dimensions.filter((item)=>!encoding.x?.includes(item.id)).map((item)=>item.id);
3546
- if (0 === encoding.detail.length) encoding.detail = dimensions.filter((item)=>!encoding.x?.includes(item.id)).map((item)=>item.id);
3641
+ if (0 === encoding.color.length) encoding.color = [
3642
+ MeasureName
3643
+ ];
3644
+ };
3645
+ const column_generateDefaultMeasureEncoding = (measures, encoding)=>{
3646
+ encoding.tooltip = unique(measures.map((item)=>item.id));
3647
+ encoding.y = unique(measures.filter((item)=>'yAxis' === item.encoding || !item.encoding).map((item)=>item.id));
3648
+ };
3649
+ const column_generateMeasureEncoding = (measures, encoding)=>{
3650
+ encoding.tooltip = measures.map((item)=>item.id);
3651
+ encoding.y = unique(measures.filter((item)=>'yAxis' === item.encoding || !item.encoding).map((item)=>item.id));
3652
+ const color = unique(measures.filter((item)=>'color' === item.encoding).map((item)=>item.id));
3653
+ if (color.length > 0) encoding.color = color;
3654
+ return encoding;
3547
3655
  };
3548
3656
  const columnAdvancedPipeline = [
3549
3657
  initAdvancedVSeed_initAdvancedVSeed,
3658
+ defaultMeasures_defaultMeasures,
3659
+ defaultDimensions,
3660
+ defaultMeasureName,
3550
3661
  encodingForColumn,
3551
3662
  buildMeasures,
3552
- autoDimensions_autoDimensions,
3553
3663
  pivotAdapter([
3554
3664
  reshapeWithEncoding
3555
3665
  ], [
@@ -3852,93 +3962,6 @@ const annotationAreaBand = (spec, context)=>{
3852
3962
  markArea: markArea
3853
3963
  };
3854
3964
  };
3855
- const pivotColorLegend = (spec, context)=>{
3856
- const result = {
3857
- ...spec
3858
- };
3859
- const { advancedVSeed } = context;
3860
- const { chartType } = advancedVSeed;
3861
- const baseConfig = advancedVSeed.config[chartType];
3862
- if (!baseConfig || !baseConfig.legend) return result;
3863
- const { datasetReshapeInfo } = advancedVSeed;
3864
- const max = Math.max(...datasetReshapeInfo.map((d)=>d.foldInfo.colorRange[1]));
3865
- const min = Math.min(...datasetReshapeInfo.map((d)=>d.foldInfo.colorRange[0]));
3866
- const { legend, color } = baseConfig;
3867
- const { colorScheme, linearColorScheme } = color;
3868
- const { enable, position = 'bottom', labelFontColor, labelFontSize = 12, labelFontWeight = 400 } = legend || {};
3869
- const orient = [
3870
- 'bottom',
3871
- 'bottomLeft',
3872
- 'bottomRight',
3873
- 'bl',
3874
- 'br'
3875
- ].includes(position) ? 'bottom' : [
3876
- 'top',
3877
- 'topLeft',
3878
- 'topRight',
3879
- 'tl',
3880
- 'tr'
3881
- ].includes(position) ? 'top' : [
3882
- 'left',
3883
- 'leftTop',
3884
- 'leftBottom',
3885
- 'lt',
3886
- 'lb'
3887
- ].includes(position) ? 'left' : 'right';
3888
- const legendPosition = [
3889
- 'topLeft',
3890
- 'bottomLeft',
3891
- 'leftTop',
3892
- 'rightTop',
3893
- 'lt',
3894
- 'rt',
3895
- 'tl',
3896
- 'bl'
3897
- ].includes(position) ? 'start' : [
3898
- 'topRight',
3899
- 'bottomRight',
3900
- 'leftBottom',
3901
- 'rightBottom',
3902
- 'lb',
3903
- 'rb',
3904
- 'rt',
3905
- 'br'
3906
- ].includes(position) ? 'end' : 'middle';
3907
- const legends = {
3908
- visible: enable,
3909
- type: 'color',
3910
- orient,
3911
- position: legendPosition,
3912
- colors: linearColorScheme || colorScheme || [],
3913
- value: [
3914
- min,
3915
- max
3916
- ],
3917
- min: min,
3918
- max: max,
3919
- maxWidth: '30%',
3920
- startText: {
3921
- visible: true,
3922
- style: {
3923
- fill: labelFontColor,
3924
- fontSize: labelFontSize,
3925
- fontWeight: labelFontWeight
3926
- }
3927
- },
3928
- endText: {
3929
- visible: true,
3930
- style: {
3931
- fill: labelFontColor,
3932
- fontSize: labelFontSize,
3933
- fontWeight: labelFontWeight
3934
- }
3935
- }
3936
- };
3937
- return {
3938
- ...result,
3939
- legends
3940
- };
3941
- };
3942
3965
  const column = [
3943
3966
  initColumn,
3944
3967
  stackCornerRadius_stackCornerRadius,
@@ -3996,9 +4019,11 @@ const registerColumn = ()=>{
3996
4019
  };
3997
4020
  const columnParallelAdvancedPipeline = [
3998
4021
  initAdvancedVSeed_initAdvancedVSeed,
4022
+ defaultMeasures_defaultMeasures,
4023
+ defaultDimensions,
4024
+ defaultMeasureName,
3999
4025
  encodingForColumn,
4000
4026
  buildMeasures,
4001
- autoDimensions_autoDimensions,
4002
4027
  pivotAdapter([
4003
4028
  reshapeWithEncoding
4004
4029
  ], [
@@ -4093,9 +4118,11 @@ const registerColumnParallel = ()=>{
4093
4118
  };
4094
4119
  const columnPercentAdvancedPipeline = [
4095
4120
  initAdvancedVSeed_initAdvancedVSeed,
4121
+ defaultMeasures_defaultMeasures,
4122
+ defaultDimensions,
4123
+ defaultMeasureName,
4096
4124
  encodingForColumn,
4097
4125
  buildMeasures,
4098
- autoDimensions_autoDimensions,
4099
4126
  pivotAdapter([
4100
4127
  reshapeWithEncoding
4101
4128
  ], [
@@ -4172,11 +4199,9 @@ const registerColumnPercent = ()=>{
4172
4199
  Builder._advancedPipelineMap.columnPercent = columnPercentAdvancedPipeline;
4173
4200
  Builder._specPipelineMap.columnPercent = columnPercentSpecPipeline;
4174
4201
  };
4175
- const encodingForBar = (advancedVSeed, context)=>{
4176
- const { vseed } = context;
4177
- const { measures: vseedMeasures = [] } = vseed;
4178
- const measures = vseedMeasures.length ? findAllMeasures(vseedMeasures) : getBasicMeasures(vseed);
4179
- const dimensions = getBasicDimensions(vseed);
4202
+ const encodingForBar = (advancedVSeed)=>{
4203
+ const { measures: vseedMeasures = [], dimensions = [] } = advancedVSeed;
4204
+ const measures = findAllMeasures(vseedMeasures);
4180
4205
  const hasDimensionEncoding = dimensions.some((item)=>item.encoding);
4181
4206
  const hasMeasureEncoding = measures.some((item)=>item.encoding);
4182
4207
  const encoding = {};
@@ -4212,13 +4237,15 @@ const bar_generateMeasureEncoding = (measures, encoding)=>{
4212
4237
  return encoding;
4213
4238
  };
4214
4239
  const bar_generateDimensionEncoding = (dimensions, encoding)=>{
4215
- encoding.y = unique(dimensions.filter((item)=>'yAxis' === item.encoding || !item.encoding).map((item)=>item.id));
4240
+ encoding.y = unique(dimensions.filter((item)=>'yAxis' === item.encoding).map((item)=>item.id));
4216
4241
  encoding.color = unique(dimensions.filter((item)=>'color' === item.encoding).map((item)=>item.id));
4217
4242
  encoding.detail = unique(dimensions.filter((item)=>'detail' === item.encoding).map((item)=>item.id));
4218
4243
  if (0 === encoding.y.length) encoding.y = [
4219
4244
  dimensions[0].id
4220
4245
  ];
4221
- if (0 === encoding.color.length) encoding.color = dimensions.filter((item)=>!encoding.y?.includes(item.id)).map((item)=>item.id);
4246
+ if (0 === encoding.color.length) encoding.color = [
4247
+ MeasureName
4248
+ ];
4222
4249
  if (0 === encoding.detail.length) encoding.detail = dimensions.filter((item)=>!encoding.y?.includes(item.id)).map((item)=>item.id);
4223
4250
  };
4224
4251
  const sortYBandAxis = (advancedVSeed, context)=>{
@@ -4239,9 +4266,11 @@ const sortYBandAxis = (advancedVSeed, context)=>{
4239
4266
  };
4240
4267
  const barAdvancedPipeline = [
4241
4268
  initAdvancedVSeed_initAdvancedVSeed,
4269
+ defaultMeasures_defaultMeasures,
4270
+ defaultDimensions,
4271
+ defaultMeasureName,
4242
4272
  encodingForBar,
4243
4273
  buildMeasures,
4244
- autoDimensions_autoDimensions,
4245
4274
  pivotAdapter([
4246
4275
  reshapeWithEncoding
4247
4276
  ], [
@@ -4592,9 +4621,11 @@ const registerBar = ()=>{
4592
4621
  };
4593
4622
  const barParallelAdvancedPipeline = [
4594
4623
  initAdvancedVSeed_initAdvancedVSeed,
4595
- buildMeasures,
4596
- autoDimensions_autoDimensions,
4624
+ defaultMeasures_defaultMeasures,
4625
+ defaultDimensions,
4626
+ defaultMeasureName,
4597
4627
  encodingForBar,
4628
+ buildMeasures,
4598
4629
  pivotAdapter([
4599
4630
  reshapeWithEncoding
4600
4631
  ], [
@@ -4688,9 +4719,11 @@ const registerBarParallel = ()=>{
4688
4719
  };
4689
4720
  const barPercentAdvancedPipeline = [
4690
4721
  initAdvancedVSeed_initAdvancedVSeed,
4691
- buildMeasures,
4692
- autoDimensions_autoDimensions,
4722
+ defaultMeasures_defaultMeasures,
4723
+ defaultDimensions,
4724
+ defaultMeasureName,
4693
4725
  encodingForBar,
4726
+ buildMeasures,
4694
4727
  pivotAdapter([
4695
4728
  reshapeWithEncoding
4696
4729
  ], [
@@ -4759,9 +4792,11 @@ const registerBarPercent = ()=>{
4759
4792
  };
4760
4793
  const areaAdvancedPipeline = [
4761
4794
  initAdvancedVSeed_initAdvancedVSeed,
4762
- encodingForColumn,
4795
+ defaultMeasures_defaultMeasures,
4796
+ defaultDimensions,
4797
+ defaultMeasureName,
4798
+ encodingForLine,
4763
4799
  buildMeasures,
4764
- autoDimensions_autoDimensions,
4765
4800
  pivotAdapter([
4766
4801
  reshapeWithEncoding
4767
4802
  ], [
@@ -4917,9 +4952,11 @@ const registerArea = ()=>{
4917
4952
  };
4918
4953
  const areaPercentAdvancedPipeline = [
4919
4954
  initAdvancedVSeed_initAdvancedVSeed,
4920
- encodingForColumn,
4955
+ defaultMeasures_defaultMeasures,
4956
+ defaultDimensions,
4957
+ defaultMeasureName,
4958
+ encodingForLine,
4921
4959
  buildMeasures,
4922
- autoDimensions_autoDimensions,
4923
4960
  pivotAdapter([
4924
4961
  reshapeWithEncoding
4925
4962
  ], [
@@ -4993,11 +5030,9 @@ const registerAreaPercent = ()=>{
4993
5030
  Builder._advancedPipelineMap.areaPercent = areaPercentAdvancedPipeline;
4994
5031
  Builder._specPipelineMap.areaPercent = areaPercentSpecPipeline;
4995
5032
  };
4996
- const encodingForScatter = (advancedVSeed, context)=>{
4997
- const { vseed } = context;
4998
- const { measures: vseedMeasures = [] } = vseed;
4999
- const measures = vseedMeasures.length ? findAllMeasures(vseedMeasures) : getBasicMeasures(vseed);
5000
- const dimensions = getBasicDimensions(vseed);
5033
+ const encodingForScatter = (advancedVSeed)=>{
5034
+ const { measures: vseedMeasures = [], dimensions = [] } = advancedVSeed;
5035
+ const measures = findAllMeasures(vseedMeasures);
5001
5036
  const hasDimensionEncoding = dimensions.some((item)=>item.encoding);
5002
5037
  const hasMeasureEncoding = measures.some((item)=>item.encoding);
5003
5038
  const encoding = {};
@@ -5033,7 +5068,9 @@ const scatter_generateMeasureEncoding = (measures, encoding)=>{
5033
5068
  const scatter_generateDimensionEncoding = (dimensions, encoding)=>{
5034
5069
  encoding.color = unique(dimensions.filter((item)=>'color' === item.encoding).map((item)=>item.id));
5035
5070
  encoding.detail = unique(dimensions.filter((item)=>'detail' === item.encoding).map((item)=>item.id));
5036
- if (0 === encoding.color.length) encoding.color = dimensions.filter((item)=>!encoding.x?.includes(item.id)).map((item)=>item.id);
5071
+ if (0 === encoding.color.length) encoding.color = [
5072
+ MeasureName
5073
+ ];
5037
5074
  if (0 === encoding.detail.length) encoding.detail = dimensions.filter((item)=>!encoding.x?.includes(item.id)).map((item)=>item.id);
5038
5075
  };
5039
5076
  const buildMeasuresForScatter = (advancedVSeed, context)=>{
@@ -5046,8 +5083,7 @@ const buildMeasuresForScatter = (advancedVSeed, context)=>{
5046
5083
  advancedVSeed.measures = buildMeasuresForScatter_generateMeasuresByParentId(vseed.measures);
5047
5084
  return advancedVSeed;
5048
5085
  }
5049
- const basicMeasures = getBasicMeasures(vseed);
5050
- const scatterMeasures = vseed.scatterMeasures ? vseed.scatterMeasures : basicMeasuresToScatterMeasures(basicMeasures);
5086
+ const scatterMeasures = vseed.scatterMeasures ? vseed.scatterMeasures : basicMeasuresToScatterMeasures(advancedVSeed.measures || []);
5051
5087
  advancedVSeed.measures = scatterMeasuresToMeasureTree(scatterMeasures);
5052
5088
  return advancedVSeed;
5053
5089
  };
@@ -5266,9 +5302,11 @@ const pivotReshapeWithScatterEncoding = (advancedVSeed, context)=>{
5266
5302
  };
5267
5303
  const scatterAdvancedPipeline = [
5268
5304
  initAdvancedVSeed_initAdvancedVSeed,
5305
+ defaultMeasures_defaultMeasures,
5306
+ defaultDimensions,
5307
+ defaultMeasureName,
5269
5308
  encodingForScatter,
5270
5309
  buildMeasuresForScatter,
5271
- autoDimensions_autoDimensions,
5272
5310
  pivotAdapter([
5273
5311
  reshapeWithScatterEncoding
5274
5312
  ], [
@@ -5404,7 +5442,7 @@ const pivotScatter = [
5404
5442
  ]),
5405
5443
  pivotRowDimensions,
5406
5444
  pivotColumnDimensions,
5407
- pivotDiscreteLegend
5445
+ colorAdapter(pivotDiscreteLegend, pivotColorLegend)
5408
5446
  ];
5409
5447
  const scatterSpecPipeline = [
5410
5448
  pivotAdapter_pivotAdapter(scatter, pivotScatter)
@@ -5413,11 +5451,9 @@ const registerScatter = ()=>{
5413
5451
  Builder._advancedPipelineMap.scatter = scatterAdvancedPipeline;
5414
5452
  Builder._specPipelineMap.scatter = scatterSpecPipeline;
5415
5453
  };
5416
- const encodingForDualAxis = (advancedVSeed, context)=>{
5417
- const { vseed } = context;
5418
- const { measures: vseedMeasures = [] } = vseed;
5419
- const measures = vseedMeasures.length ? findAllMeasures(vseedMeasures) : getBasicMeasures(vseed);
5420
- const dimensions = getBasicDimensions(vseed);
5454
+ const encodingForDualAxis = (advancedVSeed)=>{
5455
+ const { measures: vseedMeasures = [], dimensions = [] } = advancedVSeed;
5456
+ const measures = findAllMeasures(vseedMeasures);
5421
5457
  const hasDimensionEncoding = dimensions.some((item)=>item.encoding);
5422
5458
  const hasMeasureEncoding = measures.some((item)=>item.encoding);
5423
5459
  const encoding = {};
@@ -5453,13 +5489,15 @@ const dualAxis_generateMeasureEncoding = (measures, encoding)=>{
5453
5489
  return encoding;
5454
5490
  };
5455
5491
  const dualAxis_generateDimensionEncoding = (dimensions, encoding)=>{
5456
- encoding.x = unique(dimensions.filter((item)=>'xAxis' === item.encoding || !item.encoding).map((item)=>item.id));
5492
+ encoding.x = unique(dimensions.filter((item)=>'xAxis' === item.encoding).map((item)=>item.id));
5457
5493
  encoding.color = unique(dimensions.filter((item)=>'color' === item.encoding).map((item)=>item.id));
5458
5494
  encoding.detail = unique(dimensions.filter((item)=>'detail' === item.encoding).map((item)=>item.id));
5459
5495
  if (0 === encoding.x.length) encoding.x = [
5460
5496
  dimensions[0].id
5461
5497
  ];
5462
- if (0 === encoding.color.length) encoding.color = dimensions.filter((item)=>!encoding.x?.includes(item.id)).map((item)=>item.id);
5498
+ if (0 === encoding.color.length) encoding.color = [
5499
+ MeasureName
5500
+ ];
5463
5501
  if (0 === encoding.detail.length) encoding.detail = dimensions.filter((item)=>!encoding.x?.includes(item.id)).map((item)=>item.id);
5464
5502
  };
5465
5503
  const buildMeasuresForDualAxis = (advancedVSeed, context)=>{
@@ -5472,8 +5510,7 @@ const buildMeasuresForDualAxis = (advancedVSeed, context)=>{
5472
5510
  advancedVSeed.measures = buildMeasuresForDualAxis_generateMeasuresByParentId(vseed.measures);
5473
5511
  return advancedVSeed;
5474
5512
  }
5475
- const basicMeasures = getBasicMeasures(vseed);
5476
- const dualMeasures = vseed.dualMeasures ? vseed.dualMeasures : basicMeasuresToDualMeasures(basicMeasures);
5513
+ const dualMeasures = vseed.dualMeasures ? vseed.dualMeasures : basicMeasuresToDualMeasures(advancedVSeed.measures || []);
5477
5514
  advancedVSeed.measures = dualMeasuresToMeasureTree(dualMeasures);
5478
5515
  return advancedVSeed;
5479
5516
  };
@@ -5577,8 +5614,10 @@ const reshapeWithDualEncoding = (advancedVSeed, context)=>{
5577
5614
  const datasets = [];
5578
5615
  const primaryMeasures = measures[0];
5579
5616
  const secondaryMeasures = measures[1] || [];
5617
+ const hasEncoding = (vseed.dimensions || []).some((item)=>item.encoding);
5580
5618
  if (primaryMeasures && primaryMeasures.children) {
5581
5619
  const { dataset: newDataset, foldInfo, unfoldInfo } = dataReshapeByEncoding(dataset, dimensions, primaryMeasures.children, encoding, {
5620
+ colorItemAsId: hasEncoding,
5582
5621
  foldMeasureValue: FoldPrimaryMeasureValue,
5583
5622
  colorMeasureId: getColorMeasureId(advancedVSeed)
5584
5623
  });
@@ -5625,6 +5664,7 @@ const pivotReshapeWithDualEncoding = (advancedVSeed, context)=>{
5625
5664
  const { dataset } = vseed;
5626
5665
  const { dimensions, measures, encoding, chartType } = advancedVSeed;
5627
5666
  if (!measures || !dimensions || !dataset || !encoding) return result;
5667
+ const hasEncoding = (vseed.dimensions || []).some((item)=>item.encoding);
5628
5668
  const datasetList = [];
5629
5669
  const datasetReshapeInfo = [];
5630
5670
  const measureGroups = [];
@@ -5643,6 +5683,7 @@ const pivotReshapeWithDualEncoding = (advancedVSeed, context)=>{
5643
5683
  const secondaryMeasures = measures[1] || [];
5644
5684
  if (primaryMeasures && primaryMeasures.children) {
5645
5685
  const { dataset: newDataset, foldInfo, unfoldInfo } = dataReshapeByEncoding(dataset, dimensions, primaryMeasures.children, encoding, {
5686
+ colorItemAsId: hasEncoding,
5646
5687
  foldMeasureValue: `${FoldPrimaryMeasureValue}${index}`,
5647
5688
  colorMeasureId: getColorMeasureId(advancedVSeed)
5648
5689
  });
@@ -5711,9 +5752,11 @@ const dualAxisConfig = (advancedVSeed, context)=>{
5711
5752
  };
5712
5753
  const dualAxisAdvancedPipeline = [
5713
5754
  initAdvancedVSeed_initAdvancedVSeed,
5755
+ defaultMeasures_defaultMeasures,
5756
+ defaultDimensions,
5757
+ defaultMeasureName,
5714
5758
  encodingForDualAxis,
5715
5759
  buildMeasuresForDualAxis,
5716
- autoDimensions_autoDimensions,
5717
5760
  pivotAdapter([
5718
5761
  reshapeWithDualEncoding
5719
5762
  ], [
@@ -6546,11 +6589,9 @@ const registerDualAxis = ()=>{
6546
6589
  Builder._advancedPipelineMap.dualAxis = dualAxisAdvancedPipeline;
6547
6590
  Builder._specPipelineMap.dualAxis = dualAxisSpecPipeline;
6548
6591
  };
6549
- const encodingForPie = (advancedVSeed, context)=>{
6550
- const { vseed } = context;
6551
- const { measures: vseedMeasures = [] } = vseed;
6552
- const measures = vseedMeasures.length ? findAllMeasures(vseedMeasures) : getBasicMeasures(vseed);
6553
- const dimensions = getBasicDimensions(vseed);
6592
+ const encodingForPie = (advancedVSeed)=>{
6593
+ const { measures: vseedMeasures = [], dimensions = [] } = advancedVSeed;
6594
+ const measures = findAllMeasures(vseedMeasures);
6554
6595
  const hasDimensionEncoding = dimensions.some((item)=>item.encoding);
6555
6596
  const hasMeasureEncoding = measures.some((item)=>item.encoding);
6556
6597
  const encoding = {};
@@ -6585,14 +6626,18 @@ const pie_generateMeasureEncoding = (measures, encoding)=>{
6585
6626
  const pie_generateDimensionEncoding = (dimensions, encoding)=>{
6586
6627
  encoding.color = unique(dimensions.filter((item)=>'color' === item.encoding).map((item)=>item.id));
6587
6628
  encoding.detail = unique(dimensions.filter((item)=>'detail' === item.encoding).map((item)=>item.id));
6588
- if (0 === encoding.color.length) encoding.color = dimensions.map((item)=>item.id);
6629
+ if (0 === encoding.color.length) encoding.color = [
6630
+ MeasureName
6631
+ ];
6589
6632
  if (0 === encoding.detail.length) encoding.detail = dimensions.map((item)=>item.id);
6590
6633
  };
6591
6634
  const pieAdvancedPipeline = [
6592
6635
  initAdvancedVSeed_initAdvancedVSeed,
6636
+ defaultMeasures_defaultMeasures,
6637
+ defaultDimensions,
6638
+ defaultMeasureName,
6593
6639
  encodingForPie,
6594
6640
  buildMeasures,
6595
- autoDimensions_autoDimensions,
6596
6641
  pivotAdapter([
6597
6642
  reshapeWithEncoding
6598
6643
  ], [
@@ -6607,44 +6652,70 @@ const initPie = (spec, context)=>{
6607
6652
  ...spec
6608
6653
  };
6609
6654
  const { advancedVSeed } = context;
6610
- const { datasetReshapeInfo, dataset } = advancedVSeed;
6655
+ const { datasetReshapeInfo } = advancedVSeed;
6611
6656
  const { unfoldInfo, foldInfo } = datasetReshapeInfo[0];
6657
+ result.type = 'pie';
6658
+ result.outerRadius = 0.8;
6659
+ result.innerRadius = 0;
6660
+ result.valueField = foldInfo.measureValue;
6661
+ result.categoryField = unfoldInfo.encodingColorId;
6662
+ result.padding = 0;
6663
+ result.region = [
6664
+ {
6665
+ clip: true
6666
+ }
6667
+ ];
6668
+ result.animation = true;
6669
+ return result;
6670
+ };
6671
+ const colorPieStyleFill = (stylePipe)=>(spec, context)=>{
6672
+ const result = stylePipe(spec, context);
6673
+ const { advancedVSeed } = context;
6674
+ const { datasetReshapeInfo } = advancedVSeed;
6675
+ const { unfoldInfo } = datasetReshapeInfo[0];
6676
+ if (isLinearColor(advancedVSeed)) {
6677
+ if (result?.pie?.style) result.pie.style.fill = {
6678
+ field: unfoldInfo.encodingColor,
6679
+ scale: 'color'
6680
+ };
6681
+ }
6682
+ return result;
6683
+ };
6684
+ const pieStyle = (spec, context)=>{
6685
+ const { advancedVSeed } = context;
6686
+ const { dataset } = advancedVSeed;
6612
6687
  const showStroke = dataset.length <= 30;
6613
- result.type = 'pie';
6614
- result.outerRadius = 0.8;
6615
- result.innerRadius = 0;
6616
- result.valueField = foldInfo.measureValue;
6617
- result.categoryField = unfoldInfo.encodingColorId;
6618
- result.padding = 0;
6619
- result.region = [
6620
- {
6621
- clip: true
6688
+ const result = {
6689
+ ...spec,
6690
+ pie: {
6691
+ style: {}
6622
6692
  }
6623
- ];
6624
- result.pie = {
6625
- style: {
6626
- stroke: '#ffffff',
6627
- lineWidth: showStroke ? 1 : 0,
6628
- centerOffset: 0
6629
- },
6630
- state: {
6631
- hover: {
6632
- outerRadius: 1.1 * result.outerRadius
6693
+ };
6694
+ return {
6695
+ ...result,
6696
+ pie: {
6697
+ style: {
6698
+ stroke: '#ffffff',
6699
+ lineWidth: showStroke ? 1 : 0
6700
+ },
6701
+ state: {
6702
+ hover: {
6703
+ outerRadius: 1.1 * result.outerRadius
6704
+ }
6633
6705
  }
6634
6706
  }
6635
6707
  };
6636
- result.animation = true;
6637
- return result;
6638
6708
  };
6639
6709
  const pie = [
6640
6710
  initPie,
6641
- color_color,
6711
+ colorAdapter(color_color, linearColor),
6642
6712
  background_backgroundColor,
6643
6713
  datasetXY,
6644
6714
  progressive,
6715
+ colorPieStyleFill(pieStyle),
6716
+ colorAdapter(discreteLegend, colorLegend),
6645
6717
  label_label,
6646
6718
  tooltip_tooltip,
6647
- discreteLegend,
6648
6719
  annotationPoint_annotationPoint,
6649
6720
  annotationVerticalLine_annotationVerticalLine,
6650
6721
  annotationHorizontalLine_annotationHorizontalLine,
@@ -6657,10 +6728,11 @@ const pivotPie = [
6657
6728
  datasetPivot,
6658
6729
  pivotIndicators_pivotIndicators([
6659
6730
  initPie,
6660
- color_color,
6731
+ colorAdapter(color_color, linearColor),
6661
6732
  background_backgroundColor,
6662
6733
  datasetXY,
6663
6734
  progressive,
6735
+ colorPieStyleFill(pieStyle),
6664
6736
  label_label,
6665
6737
  tooltip_tooltip,
6666
6738
  annotationPoint_annotationPoint,
@@ -6670,7 +6742,7 @@ const pivotPie = [
6670
6742
  ]),
6671
6743
  pivotRowDimensions,
6672
6744
  pivotColumnDimensions,
6673
- pivotDiscreteLegend
6745
+ colorAdapter(pivotDiscreteLegend, pivotColorLegend)
6674
6746
  ];
6675
6747
  const pieSpecPipeline = [
6676
6748
  pivotAdapter_pivotAdapter(pie, pivotPie)
@@ -6681,8 +6753,10 @@ const registerPie = ()=>{
6681
6753
  };
6682
6754
  const donutAdvancedPipeline = [
6683
6755
  initAdvancedVSeed_initAdvancedVSeed,
6756
+ defaultMeasures_defaultMeasures,
6757
+ defaultDimensions,
6758
+ defaultMeasureName,
6684
6759
  buildMeasures,
6685
- autoDimensions_autoDimensions,
6686
6760
  encodingForPie,
6687
6761
  pivotAdapter([
6688
6762
  reshapeWithEncoding
@@ -6698,9 +6772,8 @@ const initDonut = (spec, context)=>{
6698
6772
  ...spec
6699
6773
  };
6700
6774
  const { advancedVSeed } = context;
6701
- const { datasetReshapeInfo, dataset } = advancedVSeed;
6775
+ const { datasetReshapeInfo } = advancedVSeed;
6702
6776
  const { foldInfo, unfoldInfo } = datasetReshapeInfo[0];
6703
- const showStroke = dataset.length <= 30;
6704
6777
  result.type = 'pie';
6705
6778
  result.outerRadius = 0.8;
6706
6779
  result.innerRadius = 0.8 * result.outerRadius;
@@ -6712,29 +6785,19 @@ const initDonut = (spec, context)=>{
6712
6785
  clip: true
6713
6786
  }
6714
6787
  ];
6715
- result.pie = {
6716
- style: {
6717
- stroke: '#ffffff',
6718
- lineWidth: showStroke ? 1 : 0
6719
- },
6720
- state: {
6721
- hover: {
6722
- outerRadius: 1.1 * result.outerRadius
6723
- }
6724
- }
6725
- };
6726
6788
  result.animation = true;
6727
6789
  return result;
6728
6790
  };
6729
6791
  const donut = [
6730
6792
  initDonut,
6731
- color_color,
6793
+ colorAdapter(color_color, linearColor),
6732
6794
  background_backgroundColor,
6733
6795
  datasetXY,
6734
6796
  progressive,
6735
6797
  label_label,
6798
+ colorPieStyleFill(pieStyle),
6799
+ colorAdapter(discreteLegend, colorLegend),
6736
6800
  tooltip_tooltip,
6737
- discreteLegend,
6738
6801
  annotationPoint_annotationPoint,
6739
6802
  annotationVerticalLine_annotationVerticalLine,
6740
6803
  annotationHorizontalLine_annotationHorizontalLine,
@@ -6747,11 +6810,12 @@ const pivotDonut = [
6747
6810
  datasetPivot,
6748
6811
  pivotIndicators_pivotIndicators([
6749
6812
  initDonut,
6750
- color_color,
6813
+ colorAdapter(color_color, linearColor),
6751
6814
  background_backgroundColor,
6752
6815
  datasetXY,
6753
6816
  progressive,
6754
6817
  label_label,
6818
+ colorPieStyleFill(pieStyle),
6755
6819
  tooltip_tooltip,
6756
6820
  annotationPoint_annotationPoint,
6757
6821
  annotationVerticalLine_annotationVerticalLine,
@@ -6760,7 +6824,7 @@ const pivotDonut = [
6760
6824
  ]),
6761
6825
  pivotRowDimensions,
6762
6826
  pivotColumnDimensions,
6763
- pivotDiscreteLegend
6827
+ colorAdapter(pivotDiscreteLegend, pivotColorLegend)
6764
6828
  ];
6765
6829
  const donutSpecPipeline = [
6766
6830
  pivotAdapter_pivotAdapter(donut, pivotDonut)
@@ -6769,11 +6833,9 @@ const registerDonut = ()=>{
6769
6833
  Builder._advancedPipelineMap.donut = donutAdvancedPipeline;
6770
6834
  Builder._specPipelineMap.donut = donutSpecPipeline;
6771
6835
  };
6772
- const encodingForRose = (advancedVSeed, context)=>{
6773
- const { vseed } = context;
6774
- const { measures: vseedMeasures = [] } = vseed;
6775
- const measures = vseedMeasures.length ? findAllMeasures(vseedMeasures) : getBasicMeasures(vseed);
6776
- const dimensions = getBasicDimensions(vseed);
6836
+ const encodingForRose = (advancedVSeed)=>{
6837
+ const { measures: vseedMeasures = [], dimensions = [] } = advancedVSeed;
6838
+ const measures = findAllMeasures(vseedMeasures);
6777
6839
  const hasDimensionEncoding = dimensions.some((item)=>item.encoding);
6778
6840
  const hasMeasureEncoding = measures.some((item)=>item.encoding);
6779
6841
  const encoding = {};
@@ -6808,20 +6870,24 @@ const rose_generateMeasureEncoding = (measures, encoding)=>{
6808
6870
  if (color.length > 0) encoding.color = color;
6809
6871
  };
6810
6872
  const rose_generateDimensionEncoding = (dimensions, encoding)=>{
6811
- encoding.angle = unique(dimensions.filter((item)=>'angle' === item.encoding || !item.encoding).map((item)=>item.id));
6873
+ encoding.angle = unique(dimensions.filter((item)=>'angle' === item.encoding).map((item)=>item.id));
6812
6874
  encoding.color = unique(dimensions.filter((item)=>'color' === item.encoding).map((item)=>item.id));
6813
6875
  encoding.detail = unique(dimensions.filter((item)=>'detail' === item.encoding).map((item)=>item.id));
6814
6876
  if (0 === encoding.angle.length) encoding.angle = [
6815
6877
  dimensions[0].id
6816
6878
  ];
6817
- if (0 === encoding.color.length) encoding.color = dimensions.filter((item)=>!encoding.angle?.includes(item.id)).map((item)=>item.id);
6879
+ if (0 === encoding.color.length) encoding.color = [
6880
+ MeasureName
6881
+ ];
6818
6882
  if (0 === encoding.detail.length) encoding.detail = dimensions.filter((item)=>!encoding.angle?.includes(item.id)).map((item)=>item.id);
6819
6883
  };
6820
6884
  const roseAdvancedPipeline = [
6821
6885
  initAdvancedVSeed_initAdvancedVSeed,
6886
+ defaultMeasures_defaultMeasures,
6887
+ defaultDimensions,
6888
+ defaultMeasureName,
6822
6889
  encodingForRose,
6823
6890
  buildMeasures,
6824
- autoDimensions_autoDimensions,
6825
6891
  pivotAdapter([
6826
6892
  reshapeWithEncoding
6827
6893
  ], [
@@ -6848,18 +6914,6 @@ const initRose = (spec, context)=>{
6848
6914
  result.innerRadius = 0;
6849
6915
  const hasNegativeValue = dataset.flat().find((d)=>d[foldInfo.measureValue] < 0);
6850
6916
  if (hasNegativeValue) result.innerRadius = 0.05;
6851
- result.rose = {
6852
- style: {
6853
- stroke: '#ffffff',
6854
- lineWidth: 1
6855
- },
6856
- state: {
6857
- hover: {
6858
- lineWidth: 1,
6859
- fillOpacity: 0.6
6860
- }
6861
- }
6862
- };
6863
6917
  result.region = [
6864
6918
  {
6865
6919
  clip: true
@@ -6868,7 +6922,7 @@ const initRose = (spec, context)=>{
6868
6922
  result.animation = true;
6869
6923
  return result;
6870
6924
  };
6871
- const radiusAxis = (spec, context)=>{
6925
+ const angleAxis = (spec, context)=>{
6872
6926
  const result = {
6873
6927
  ...spec
6874
6928
  };
@@ -6880,26 +6934,37 @@ const radiusAxis = (spec, context)=>{
6880
6934
  const showAxis = !(is0D || is1M1D);
6881
6935
  if (!result.axes) result.axes = [];
6882
6936
  result.axes.push({
6883
- orient: 'radius',
6937
+ orient: 'angle',
6884
6938
  visible: showAxis,
6885
6939
  zero: true,
6886
6940
  nice: !!showAxis,
6941
+ paddingInner: showAxis ? [
6942
+ 0.15,
6943
+ 0.1
6944
+ ] : [
6945
+ 0,
6946
+ 0
6947
+ ],
6948
+ paddingOuter: showAxis ? [
6949
+ 0.075,
6950
+ 0.1
6951
+ ] : [
6952
+ 0,
6953
+ 0
6954
+ ],
6887
6955
  grid: {
6888
6956
  visible: showAxis
6889
6957
  },
6890
- tick: {
6891
- visible: showAxis
6892
- },
6893
- label: {
6958
+ domainLine: {
6894
6959
  visible: showAxis
6895
6960
  },
6896
- domainLine: {
6961
+ tick: {
6897
6962
  visible: showAxis
6898
6963
  }
6899
6964
  });
6900
6965
  return result;
6901
6966
  };
6902
- const angleAxis = (spec, context)=>{
6967
+ const radiusAxis = (spec, context)=>{
6903
6968
  const result = {
6904
6969
  ...spec
6905
6970
  };
@@ -6911,50 +6976,79 @@ const angleAxis = (spec, context)=>{
6911
6976
  const showAxis = !(is0D || is1M1D);
6912
6977
  if (!result.axes) result.axes = [];
6913
6978
  result.axes.push({
6914
- orient: 'angle',
6979
+ orient: 'radius',
6915
6980
  visible: showAxis,
6916
6981
  zero: true,
6917
6982
  nice: !!showAxis,
6918
- paddingInner: showAxis ? [
6919
- 0.15,
6920
- 0.1
6921
- ] : [
6922
- 0,
6923
- 0
6924
- ],
6925
- paddingOuter: showAxis ? [
6926
- 0.075,
6927
- 0.1
6928
- ] : [
6929
- 0,
6930
- 0
6931
- ],
6932
6983
  grid: {
6933
6984
  visible: showAxis
6934
6985
  },
6935
- domainLine: {
6986
+ tick: {
6936
6987
  visible: showAxis
6937
6988
  },
6938
- tick: {
6989
+ label: {
6990
+ visible: showAxis
6991
+ },
6992
+ domainLine: {
6939
6993
  visible: showAxis
6940
6994
  }
6941
6995
  });
6942
6996
  return result;
6943
6997
  };
6998
+ const colorRoseStyleFill = (stylePipe)=>(spec, context)=>{
6999
+ const result = stylePipe(spec, context);
7000
+ const { advancedVSeed } = context;
7001
+ const { datasetReshapeInfo } = advancedVSeed;
7002
+ const { unfoldInfo } = datasetReshapeInfo[0];
7003
+ if (isLinearColor(advancedVSeed)) {
7004
+ if (result?.rose?.style) result.rose.style.fill = {
7005
+ field: unfoldInfo.encodingColor,
7006
+ scale: 'color'
7007
+ };
7008
+ }
7009
+ return result;
7010
+ };
7011
+ const roseStyle = (spec, context)=>{
7012
+ const { advancedVSeed } = context;
7013
+ const { dataset } = advancedVSeed;
7014
+ const showStroke = dataset.length <= 30;
7015
+ const result = {
7016
+ ...spec,
7017
+ rose: {
7018
+ style: {}
7019
+ }
7020
+ };
7021
+ return {
7022
+ ...result,
7023
+ rose: {
7024
+ style: {
7025
+ stroke: '#ffffff',
7026
+ lineWidth: showStroke ? 1 : 0
7027
+ },
7028
+ state: {
7029
+ hover: {
7030
+ lineWidth: 1,
7031
+ fillOpacity: 0.6
7032
+ }
7033
+ }
7034
+ }
7035
+ };
7036
+ };
6944
7037
  const rose = [
6945
7038
  initRose,
6946
7039
  stackCornerRadius_stackCornerRadius,
6947
7040
  stackInverse,
6948
- color_color,
7041
+ colorAdapter(color_color, linearColor),
6949
7042
  background_backgroundColor,
6950
7043
  datasetXY,
6951
7044
  progressive,
6952
- radiusAxis,
6953
7045
  angleAxis,
6954
- label_label,
6955
- tooltip_tooltip,
7046
+ radiusAxis,
6956
7047
  verticalCrosshairRect,
6957
- discreteLegend
7048
+ colorRoseStyleFill(roseStyle),
7049
+ colorAdapter(discreteLegend, colorLegend),
7050
+ label_label,
7051
+ tooltip_tooltip
6958
7052
  ];
6959
7053
  const pivotRose = [
6960
7054
  initPivot,
@@ -6965,19 +7059,20 @@ const pivotRose = [
6965
7059
  initRose,
6966
7060
  stackCornerRadius_stackCornerRadius,
6967
7061
  stackInverse,
6968
- color_color,
7062
+ colorAdapter(color_color, linearColor),
6969
7063
  background_backgroundColor,
6970
7064
  datasetXY,
6971
7065
  progressive,
6972
7066
  radiusAxis,
6973
7067
  angleAxis,
7068
+ verticalCrosshairRect,
7069
+ colorRoseStyleFill(roseStyle),
6974
7070
  label_label,
6975
- tooltip_tooltip,
6976
- verticalCrosshairRect
7071
+ tooltip_tooltip
6977
7072
  ]),
6978
7073
  pivotRowDimensions,
6979
7074
  pivotColumnDimensions,
6980
- pivotDiscreteLegend
7075
+ colorAdapter(pivotDiscreteLegend, pivotColorLegend)
6981
7076
  ];
6982
7077
  const roseSpecPipeline = [
6983
7078
  pivotAdapter_pivotAdapter(rose, pivotRose)
@@ -6988,9 +7083,11 @@ const registerRose = ()=>{
6988
7083
  };
6989
7084
  const roseParallelAdvancedPipeline = [
6990
7085
  initAdvancedVSeed_initAdvancedVSeed,
7086
+ defaultMeasures_defaultMeasures,
7087
+ defaultDimensions,
7088
+ defaultMeasureName,
6991
7089
  encodingForRose,
6992
7090
  buildMeasures,
6993
- autoDimensions_autoDimensions,
6994
7091
  pivotAdapter([
6995
7092
  reshapeWithEncoding
6996
7093
  ], [
@@ -7046,15 +7143,16 @@ const initRoseParallel = (spec, context)=>{
7046
7143
  const roseParallel = [
7047
7144
  initRoseParallel,
7048
7145
  stackCornerRadius_stackCornerRadius,
7049
- color_color,
7146
+ colorAdapter(color_color, linearColor),
7050
7147
  background_backgroundColor,
7051
7148
  datasetXY,
7052
7149
  progressive,
7053
7150
  radiusAxis,
7054
7151
  angleAxis,
7152
+ colorRoseStyleFill(roseStyle),
7153
+ colorAdapter(discreteLegend, colorLegend),
7055
7154
  label_label,
7056
7155
  tooltip_tooltip,
7057
- discreteLegend,
7058
7156
  verticalCrosshairRect,
7059
7157
  annotationPoint_annotationPoint,
7060
7158
  annotationVerticalLine_annotationVerticalLine,
@@ -7069,15 +7167,16 @@ const pivotRoseParallel = [
7069
7167
  pivotIndicators_pivotIndicators([
7070
7168
  initRoseParallel,
7071
7169
  stackCornerRadius_stackCornerRadius,
7072
- color_color,
7170
+ colorAdapter(color_color, linearColor),
7073
7171
  background_backgroundColor,
7074
7172
  datasetXY,
7075
7173
  progressive,
7076
7174
  radiusAxis,
7077
7175
  angleAxis,
7176
+ verticalCrosshairRect,
7177
+ colorRoseStyleFill(roseStyle),
7078
7178
  label_label,
7079
7179
  tooltip_tooltip,
7080
- verticalCrosshairRect,
7081
7180
  annotationPoint_annotationPoint,
7082
7181
  annotationVerticalLine_annotationVerticalLine,
7083
7182
  annotationHorizontalLine_annotationHorizontalLine,
@@ -7085,7 +7184,7 @@ const pivotRoseParallel = [
7085
7184
  ]),
7086
7185
  pivotRowDimensions,
7087
7186
  pivotColumnDimensions,
7088
- pivotDiscreteLegend
7187
+ colorAdapter(pivotDiscreteLegend, pivotColorLegend)
7089
7188
  ];
7090
7189
  const roseParallelSpecPipeline = [
7091
7190
  pivotAdapter_pivotAdapter(roseParallel, pivotRoseParallel)
@@ -7094,11 +7193,9 @@ const registerRoseParallel = ()=>{
7094
7193
  Builder._advancedPipelineMap.roseParallel = roseParallelAdvancedPipeline;
7095
7194
  Builder._specPipelineMap.roseParallel = roseParallelSpecPipeline;
7096
7195
  };
7097
- const encodingForRadar = (advancedVSeed, context)=>{
7098
- const { vseed } = context;
7099
- const { measures: vseedMeasures = [] } = vseed;
7100
- const measures = vseedMeasures.length ? findAllMeasures(vseedMeasures) : getBasicMeasures(vseed);
7101
- const dimensions = getBasicDimensions(vseed);
7196
+ const encodingForRadar = (advancedVSeed)=>{
7197
+ const { measures: vseedMeasures = [], dimensions = [] } = advancedVSeed;
7198
+ const measures = findAllMeasures(vseedMeasures);
7102
7199
  const hasDimensionEncoding = dimensions.some((item)=>item.encoding);
7103
7200
  const hasMeasureEncoding = measures.some((item)=>item.encoding);
7104
7201
  const encoding = {};
@@ -7116,12 +7213,11 @@ const radar_generateDefaultMeasureEncoding = (measures, encoding)=>{
7116
7213
  encoding.radius = unique(measures.filter((item)=>'radius' === item.encoding || !item.encoding).map((item)=>item.id));
7117
7214
  };
7118
7215
  const radar_generateDefaultDimensionEncoding = (dimensions, encoding)=>{
7119
- const onlyMeasureName = 1 === dimensions.length && dimensions.find((item)=>item.id === MeasureName);
7120
7216
  const uniqueDimIds = unique(dimensions.map((d)=>d.id));
7121
7217
  encoding.angle = uniqueDimIds.slice(0, 1);
7122
- encoding.color = uniqueDimIds.slice(onlyMeasureName ? 0 : 1);
7123
- encoding.detail = uniqueDimIds.slice(onlyMeasureName ? 0 : 1);
7218
+ encoding.color = uniqueDimIds.slice(1);
7124
7219
  encoding.tooltip = uniqueDimIds;
7220
+ encoding.detail = [];
7125
7221
  encoding.label = [];
7126
7222
  encoding.row = [];
7127
7223
  encoding.column = [];
@@ -7133,20 +7229,23 @@ const radar_generateMeasureEncoding = (measures, encoding)=>{
7133
7229
  if (color.length > 0) encoding.color = color;
7134
7230
  };
7135
7231
  const radar_generateDimensionEncoding = (dimensions, encoding)=>{
7136
- encoding.angle = unique(dimensions.filter((item)=>'angle' === item.encoding || !item.encoding).map((item)=>item.id));
7232
+ encoding.angle = unique(dimensions.filter((item)=>'angle' === item.encoding).map((item)=>item.id));
7137
7233
  encoding.color = unique(dimensions.filter((item)=>'color' === item.encoding).map((item)=>item.id));
7138
- encoding.detail = unique(dimensions.filter((item)=>'detail' === item.encoding).map((item)=>item.id));
7234
+ encoding.detail = [];
7139
7235
  if (0 === encoding.angle.length) encoding.angle = [
7140
7236
  dimensions[0].id
7141
7237
  ];
7142
- if (0 === encoding.color.length) encoding.color = dimensions.filter((item)=>!encoding.angle?.includes(item.id)).map((item)=>item.id);
7143
- if (0 === encoding.detail.length) encoding.detail = dimensions.filter((item)=>!encoding.angle?.includes(item.id)).map((item)=>item.id);
7238
+ if (0 === encoding.color.length) encoding.color = [
7239
+ MeasureName
7240
+ ];
7144
7241
  };
7145
7242
  const radarAdvancedPipeline = [
7146
7243
  initAdvancedVSeed_initAdvancedVSeed,
7244
+ defaultMeasures_defaultMeasures,
7245
+ defaultDimensions,
7246
+ defaultMeasureName,
7147
7247
  encodingForRadar,
7148
7248
  buildMeasures,
7149
- autoDimensions_autoDimensions,
7150
7249
  pivotAdapter([
7151
7250
  reshapeWithEncoding
7152
7251
  ], [
@@ -7280,11 +7379,9 @@ const registerRadar = ()=>{
7280
7379
  Builder._advancedPipelineMap.radar = radarAdvancedPipeline;
7281
7380
  Builder._specPipelineMap.radar = radarSpecPipeline;
7282
7381
  };
7283
- const encodingForFunnel = (advancedVSeed, context)=>{
7284
- const { vseed } = context;
7285
- const { measures: vseedMeasures = [] } = vseed;
7286
- const measures = vseedMeasures.length ? findAllMeasures(vseedMeasures) : getBasicMeasures(vseed);
7287
- const dimensions = getBasicDimensions(vseed);
7382
+ const encodingForFunnel = (advancedVSeed)=>{
7383
+ const { measures: vseedMeasures = [], dimensions = [] } = advancedVSeed;
7384
+ const measures = findAllMeasures(vseedMeasures);
7288
7385
  const hasDimensionEncoding = dimensions.some((item)=>item.encoding);
7289
7386
  const hasMeasureEncoding = measures.some((item)=>item.encoding);
7290
7387
  const encoding = {};
@@ -7319,14 +7416,18 @@ const funnel_generateMeasureEncoding = (measures, encoding)=>{
7319
7416
  const funnel_generateDimensionEncoding = (dimensions, encoding)=>{
7320
7417
  encoding.color = unique(dimensions.filter((item)=>'color' === item.encoding).map((item)=>item.id));
7321
7418
  encoding.detail = unique(dimensions.filter((item)=>'detail' === item.encoding).map((item)=>item.id));
7322
- if (0 === encoding.color.length) encoding.color = dimensions.map((item)=>item.id);
7419
+ if (0 === encoding.color.length) encoding.color = [
7420
+ MeasureName
7421
+ ];
7323
7422
  if (0 === encoding.detail.length) encoding.detail = dimensions.map((item)=>item.id);
7324
7423
  };
7325
7424
  const funnelAdvancedPipeline = [
7326
7425
  initAdvancedVSeed_initAdvancedVSeed,
7426
+ defaultMeasures_defaultMeasures,
7427
+ defaultDimensions,
7428
+ defaultMeasureName,
7327
7429
  encodingForFunnel,
7328
7430
  buildMeasures,
7329
- autoDimensions_autoDimensions,
7330
7431
  pivotAdapter([
7331
7432
  reshapeWithEncoding
7332
7433
  ], [
@@ -7356,34 +7457,55 @@ const initFunnel = (spec, context)=>{
7356
7457
  clip: true
7357
7458
  }
7358
7459
  ];
7359
- result.funnel = {
7360
- style: {
7361
- cornerRadius: 4,
7362
- fill: {
7363
- field: unfoldInfo.encodingColorId,
7364
- scale: 'color'
7365
- }
7366
- },
7367
- state: {
7368
- hover: {
7369
- fillOpacity: 0.6
7370
- }
7371
- }
7372
- };
7373
7460
  result.transformLabel = {
7374
7461
  visible: true
7375
7462
  };
7376
7463
  result.animation = true;
7377
7464
  return result;
7378
7465
  };
7466
+ const colorFunnelStyleFill = (stylePipe)=>(spec, context)=>{
7467
+ const result = stylePipe(spec, context);
7468
+ const { advancedVSeed } = context;
7469
+ const { datasetReshapeInfo } = advancedVSeed;
7470
+ const { unfoldInfo } = datasetReshapeInfo[0];
7471
+ if (isLinearColor(advancedVSeed)) {
7472
+ if (result?.funnel?.style) result.funnel.style.fill = {
7473
+ field: unfoldInfo.encodingColor,
7474
+ scale: 'color'
7475
+ };
7476
+ }
7477
+ return result;
7478
+ };
7479
+ const funnelStyle = (spec)=>{
7480
+ const result = {
7481
+ ...spec,
7482
+ funnel: {
7483
+ style: {}
7484
+ }
7485
+ };
7486
+ return {
7487
+ ...result,
7488
+ funnel: {
7489
+ style: {
7490
+ cornerRadius: 4
7491
+ },
7492
+ state: {
7493
+ hover: {
7494
+ fillOpacity: 0.6
7495
+ }
7496
+ }
7497
+ }
7498
+ };
7499
+ };
7379
7500
  const funnel = [
7380
7501
  initFunnel,
7381
7502
  background_backgroundColor,
7382
7503
  datasetXY,
7383
- color_color,
7504
+ colorAdapter(color_color, linearColor),
7384
7505
  label_label,
7506
+ colorAdapter(discreteLegend, colorLegend),
7507
+ colorFunnelStyleFill(funnelStyle),
7385
7508
  tooltip_tooltip,
7386
- discreteLegend,
7387
7509
  annotationPoint_annotationPoint,
7388
7510
  annotationVerticalLine_annotationVerticalLine,
7389
7511
  annotationHorizontalLine_annotationHorizontalLine,
@@ -7398,17 +7520,18 @@ const pivotFunnel = [
7398
7520
  initFunnel,
7399
7521
  background_backgroundColor,
7400
7522
  datasetXY,
7401
- color_color,
7523
+ colorAdapter(color_color, linearColor),
7402
7524
  label_label,
7403
7525
  tooltip_tooltip,
7404
- discreteLegend,
7526
+ colorFunnelStyleFill(funnelStyle),
7405
7527
  annotationPoint_annotationPoint,
7406
7528
  annotationVerticalLine_annotationVerticalLine,
7407
7529
  annotationHorizontalLine_annotationHorizontalLine,
7408
7530
  annotationArea_annotationArea
7409
7531
  ]),
7410
7532
  pivotRowDimensions,
7411
- pivotColumnDimensions
7533
+ pivotColumnDimensions,
7534
+ colorAdapter(pivotDiscreteLegend, pivotColorLegend)
7412
7535
  ];
7413
7536
  const funnelSpecPipeline = [
7414
7537
  pivotAdapter_pivotAdapter(funnel, pivotFunnel)
@@ -7417,11 +7540,9 @@ const registerFunnel = ()=>{
7417
7540
  Builder._advancedPipelineMap.funnel = funnelAdvancedPipeline;
7418
7541
  Builder._specPipelineMap.funnel = funnelSpecPipeline;
7419
7542
  };
7420
- const encodingForHeatmap = (advancedVSeed, context)=>{
7421
- const { vseed } = context;
7422
- const { measures: vseedMeasures = [] } = vseed;
7423
- const measures = vseedMeasures.length ? findAllMeasures(vseedMeasures) : getBasicMeasures(vseed);
7424
- const dimensions = getBasicDimensions(vseed);
7543
+ const encodingForHeatmap = (advancedVSeed)=>{
7544
+ const { measures: vseedMeasures = [], dimensions = [] } = advancedVSeed;
7545
+ const measures = findAllMeasures(vseedMeasures);
7425
7546
  const hasDimensionEncoding = dimensions.some((item)=>item.encoding);
7426
7547
  const hasMeasureEncoding = measures.some((item)=>item.encoding);
7427
7548
  const encoding = {};
@@ -7466,14 +7587,18 @@ const heatmap_generateDimensionEncoding = (dimensions, encoding)=>{
7466
7587
  ];
7467
7588
  if (0 === encoding.y.length) if (dimensions.length > 1) encoding.y = dimensions.slice(1).map((item)=>item.id);
7468
7589
  else encoding.y = dimensions.slice(0).map((item)=>item.id);
7469
- if (0 === encoding.color.length) encoding.color = dimensions.filter((item)=>!encoding.x?.includes(item.id)).map((item)=>item.id);
7590
+ if (0 === encoding.color.length) encoding.color = [
7591
+ MeasureName
7592
+ ];
7470
7593
  if (0 === encoding.detail.length) encoding.detail = dimensions.filter((item)=>!encoding.x?.includes(item.id)).map((item)=>item.id);
7471
7594
  };
7472
7595
  const heatmapAdvancedPipeline = [
7473
7596
  initAdvancedVSeed_initAdvancedVSeed,
7597
+ defaultMeasures_defaultMeasures,
7598
+ defaultDimensions,
7599
+ defaultMeasureName,
7474
7600
  encodingForHeatmap,
7475
7601
  buildMeasures,
7476
- autoDimensions_autoDimensions,
7477
7602
  pivotAdapter([
7478
7603
  reshapeWithEncoding
7479
7604
  ], [
@@ -7495,6 +7620,37 @@ const labelColorInversion = (spec)=>{
7495
7620
  };
7496
7621
  return result;
7497
7622
  };
7623
+ const colorCellStyleFill = (stylePipe)=>(spec, context)=>{
7624
+ const result = stylePipe(spec, context);
7625
+ const { advancedVSeed } = context;
7626
+ const { datasetReshapeInfo } = advancedVSeed;
7627
+ const { unfoldInfo } = datasetReshapeInfo[0];
7628
+ if (isLinearColor(advancedVSeed)) {
7629
+ if (result?.cell?.style) result.cell.style.fill = {
7630
+ field: unfoldInfo.encodingColor,
7631
+ scale: 'color'
7632
+ };
7633
+ }
7634
+ return result;
7635
+ };
7636
+ const cellStyle = (spec)=>{
7637
+ const result = {
7638
+ ...spec,
7639
+ cell: {
7640
+ style: {}
7641
+ }
7642
+ };
7643
+ return {
7644
+ ...result,
7645
+ cell: {
7646
+ style: {
7647
+ shape: 'rect',
7648
+ stroke: '#ffffff',
7649
+ lineWidth: 1
7650
+ }
7651
+ }
7652
+ };
7653
+ };
7498
7654
  const initHeatmap = (spec, context)=>{
7499
7655
  const result = {
7500
7656
  ...spec
@@ -7509,13 +7665,6 @@ const initHeatmap = (spec, context)=>{
7509
7665
  result.seriesField = unfoldInfo.encodingColorId;
7510
7666
  result.valueField = foldInfo.measureValue;
7511
7667
  result.padding = 0;
7512
- result.cell = {
7513
- style: {
7514
- shape: 'rect',
7515
- stroke: '#ffffff',
7516
- lineWidth: 1
7517
- }
7518
- };
7519
7668
  result.axes = [
7520
7669
  {
7521
7670
  type: 'band',
@@ -7540,14 +7689,12 @@ const heatmap = [
7540
7689
  initHeatmap,
7541
7690
  background_backgroundColor,
7542
7691
  datasetXY,
7543
- color_color,
7692
+ colorAdapter(color_color, linearColor),
7544
7693
  label_label,
7545
7694
  labelColorInversion,
7546
- discreteLegend,
7695
+ colorAdapter(discreteLegend, colorLegend),
7696
+ colorCellStyleFill(cellStyle),
7547
7697
  tooltip_tooltip,
7548
- pointStyle_pointStyle,
7549
- pointStateDimensionHover,
7550
- lineStyle_lineStyle,
7551
7698
  annotationPoint_annotationPoint,
7552
7699
  annotationVerticalLine_annotationVerticalLine,
7553
7700
  annotationHorizontalLine_annotationHorizontalLine,
@@ -7562,21 +7709,20 @@ const pivotHeatmap = [
7562
7709
  initHeatmap,
7563
7710
  background_backgroundColor,
7564
7711
  datasetXY,
7565
- color_color,
7712
+ colorAdapter(color_color, linearColor),
7566
7713
  label_label,
7567
7714
  labelColorInversion,
7568
7715
  discreteLegend,
7569
7716
  tooltip_tooltip,
7570
- pointStyle_pointStyle,
7571
- pointStateDimensionHover,
7572
- lineStyle_lineStyle,
7717
+ colorCellStyleFill(cellStyle),
7573
7718
  annotationPoint_annotationPoint,
7574
7719
  annotationVerticalLine_annotationVerticalLine,
7575
7720
  annotationHorizontalLine_annotationHorizontalLine,
7576
7721
  annotationArea_annotationArea
7577
7722
  ]),
7578
7723
  pivotRowDimensions,
7579
- pivotColumnDimensions
7724
+ pivotColumnDimensions,
7725
+ colorAdapter(pivotDiscreteLegend, pivotColorLegend)
7580
7726
  ];
7581
7727
  const heatmapSpecPipeline = [
7582
7728
  pivotAdapter_pivotAdapter(heatmap, pivotHeatmap)
@@ -8360,7 +8506,9 @@ const zMeasure = z.object({
8360
8506
  'size',
8361
8507
  'color',
8362
8508
  'label',
8363
- 'tooltip'
8509
+ 'tooltip',
8510
+ 'detail',
8511
+ 'column'
8364
8512
  ]).optional(),
8365
8513
  parentId: z.string().optional()
8366
8514
  });