@visactor/vseed 0.4.6 → 0.4.7

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 (125) hide show
  1. package/dist/cjs/index.cjs +2 -2
  2. package/dist/cjs/index.cjs.map +1 -1
  3. package/dist/esm/builder/builder/prepare.js +87 -153
  4. package/dist/esm/builder/builder/prepare.js.map +1 -1
  5. package/dist/esm/dataSelector/selector.d.ts +2 -2
  6. package/dist/esm/dataSelector/selector.js.map +1 -1
  7. package/dist/esm/i18n/i18nData.js +28 -0
  8. package/dist/esm/i18n/i18nData.js.map +1 -1
  9. package/dist/esm/pipeline/advanced/chart/pipes/default/defaultMeasures.js.map +1 -1
  10. package/dist/esm/pipeline/advanced/table/pipes/config/pivotTableConfig.js +2 -1
  11. package/dist/esm/pipeline/advanced/table/pipes/config/pivotTableConfig.js.map +1 -1
  12. package/dist/esm/pipeline/advanced/table/pipes/default/defaultMeasures.js.map +1 -1
  13. package/dist/esm/pipeline/spec/chart/pipes/label/label.js +6 -2
  14. package/dist/esm/pipeline/spec/chart/pipes/label/label.js.map +1 -1
  15. package/dist/esm/pipeline/spec/table/pipeline/table.js +2 -1
  16. package/dist/esm/pipeline/spec/table/pipeline/table.js.map +1 -1
  17. package/dist/esm/pipeline/spec/table/pipes/columns/columnsAggregation.d.ts +8 -0
  18. package/dist/esm/pipeline/spec/table/pipes/columns/columnsAggregation.js +76 -0
  19. package/dist/esm/pipeline/spec/table/pipes/columns/columnsAggregation.js.map +1 -0
  20. package/dist/esm/pipeline/spec/table/pipes/columns/dimensionsToColumns.js +1 -27
  21. package/dist/esm/pipeline/spec/table/pipes/columns/dimensionsToColumns.js.map +1 -1
  22. package/dist/esm/pipeline/spec/table/pipes/columns/index.d.ts +1 -0
  23. package/dist/esm/pipeline/spec/table/pipes/columns/index.js +1 -0
  24. package/dist/esm/pipeline/spec/table/pipes/columns/measuresToColumns.js +1 -27
  25. package/dist/esm/pipeline/spec/table/pipes/columns/measuresToColumns.js.map +1 -1
  26. package/dist/esm/pipeline/spec/table/pipes/columns/pivotColumns.js +12 -2
  27. package/dist/esm/pipeline/spec/table/pipes/columns/pivotColumns.js.map +1 -1
  28. package/dist/esm/pipeline/spec/table/pipes/columns/utils.d.ts +15 -0
  29. package/dist/esm/pipeline/spec/table/pipes/columns/utils.js +35 -0
  30. package/dist/esm/pipeline/spec/table/pipes/columns/utils.js.map +1 -0
  31. package/dist/esm/pipeline/spec/table/pipes/indicators/pivotDataConfig.js +39 -4
  32. package/dist/esm/pipeline/spec/table/pipes/indicators/pivotDataConfig.js.map +1 -1
  33. package/dist/esm/types/advancedVSeed.d.ts +2 -1
  34. package/dist/esm/types/advancedVSeed.js +3 -2
  35. package/dist/esm/types/advancedVSeed.js.map +1 -1
  36. package/dist/esm/types/chartType/area/zArea.d.ts +113 -8
  37. package/dist/esm/types/chartType/areaPercent/zAreaPercent.d.ts +113 -8
  38. package/dist/esm/types/chartType/bar/zBar.d.ts +97 -4
  39. package/dist/esm/types/chartType/barParallel/zBarParallel.d.ts +97 -4
  40. package/dist/esm/types/chartType/barPercent/zBarPercent.d.ts +97 -4
  41. package/dist/esm/types/chartType/boxPlot/zBoxPlot.d.ts +89 -2
  42. package/dist/esm/types/chartType/circlePacking/zCirclePacking.d.ts +81 -0
  43. package/dist/esm/types/chartType/column/zColumn.d.ts +97 -4
  44. package/dist/esm/types/chartType/columnParallel/zColumnParallel.d.ts +97 -4
  45. package/dist/esm/types/chartType/columnPercent/zColumnPercent.d.ts +97 -4
  46. package/dist/esm/types/chartType/donut/zDonut.d.ts +81 -0
  47. package/dist/esm/types/chartType/dualAxis/zDualAxis.d.ts +121 -10
  48. package/dist/esm/types/chartType/funnel/zFunnel.d.ts +81 -0
  49. package/dist/esm/types/chartType/heatmap/zHeatmap.d.ts +81 -0
  50. package/dist/esm/types/chartType/histogram/zHistogram.d.ts +97 -4
  51. package/dist/esm/types/chartType/line/zLine.d.ts +105 -6
  52. package/dist/esm/types/chartType/pie/zPie.d.ts +81 -0
  53. package/dist/esm/types/chartType/pivotTable/pivotTable.d.ts +6 -1
  54. package/dist/esm/types/chartType/pivotTable/zPivotTable.d.ts +12 -0
  55. package/dist/esm/types/chartType/pivotTable/zPivotTable.js +2 -1
  56. package/dist/esm/types/chartType/pivotTable/zPivotTable.js.map +1 -1
  57. package/dist/esm/types/chartType/raceBar/zRaceBar.d.ts +97 -4
  58. package/dist/esm/types/chartType/raceColumn/zRaceColumn.d.ts +97 -4
  59. package/dist/esm/types/chartType/raceDonut/zRaceDonut.d.ts +81 -0
  60. package/dist/esm/types/chartType/raceLine/zRaceLine.d.ts +105 -6
  61. package/dist/esm/types/chartType/racePie/zRacePie.d.ts +81 -0
  62. package/dist/esm/types/chartType/raceScatter/zRaceScatter.d.ts +97 -4
  63. package/dist/esm/types/chartType/radar/zRadar.d.ts +81 -0
  64. package/dist/esm/types/chartType/rose/zRose.d.ts +81 -0
  65. package/dist/esm/types/chartType/roseParallel/zRoseParallel.d.ts +81 -0
  66. package/dist/esm/types/chartType/scatter/zScatter.d.ts +97 -4
  67. package/dist/esm/types/chartType/sunburst/zSunburst.d.ts +81 -0
  68. package/dist/esm/types/chartType/table/table.d.ts +11 -1
  69. package/dist/esm/types/chartType/table/zTable.d.ts +7 -0
  70. package/dist/esm/types/chartType/table/zTable.js +2 -1
  71. package/dist/esm/types/chartType/table/zTable.js.map +1 -1
  72. package/dist/esm/types/chartType/treeMap/zTreeMap.d.ts +81 -0
  73. package/dist/esm/types/dataSelector/selector.d.ts +53 -29
  74. package/dist/esm/types/dataSelector/selector.js +1 -1
  75. package/dist/esm/types/dataSelector/selector.js.map +1 -1
  76. package/dist/esm/types/properties/aggregation/aggregation.d.ts +9 -0
  77. package/dist/esm/types/properties/aggregation/aggregation.js +0 -0
  78. package/dist/esm/types/properties/aggregation/index.d.ts +2 -0
  79. package/dist/esm/types/properties/aggregation/index.js +2 -0
  80. package/dist/esm/types/properties/aggregation/zAggregation.d.ts +8 -0
  81. package/dist/esm/types/properties/aggregation/zAggregation.js +11 -0
  82. package/dist/esm/types/properties/aggregation/zAggregation.js.map +1 -0
  83. package/dist/esm/types/properties/annotation/annotation.d.ts +8 -2
  84. package/dist/esm/types/properties/annotation/zAnnotationPoint.d.ts +4 -1
  85. package/dist/esm/types/properties/config/annotation/zAnnotation.d.ts +8 -2
  86. package/dist/esm/types/properties/config/area.d.ts +170 -2
  87. package/dist/esm/types/properties/config/bar.d.ts +255 -3
  88. package/dist/esm/types/properties/config/boxplot.d.ts +85 -1
  89. package/dist/esm/types/properties/config/circlePacking.d.ts +81 -0
  90. package/dist/esm/types/properties/config/column.d.ts +255 -3
  91. package/dist/esm/types/properties/config/config.d.ts +2425 -19
  92. package/dist/esm/types/properties/config/dualAxis.d.ts +85 -1
  93. package/dist/esm/types/properties/config/funnel.d.ts +81 -0
  94. package/dist/esm/types/properties/config/heatmap.d.ts +81 -0
  95. package/dist/esm/types/properties/config/histogram.d.ts +85 -1
  96. package/dist/esm/types/properties/config/label/label.d.ts +18 -1
  97. package/dist/esm/types/properties/config/label/zLabel.d.ts +81 -0
  98. package/dist/esm/types/properties/config/label/zLabel.js +3 -2
  99. package/dist/esm/types/properties/config/label/zLabel.js.map +1 -1
  100. package/dist/esm/types/properties/config/label/zPieLabel.d.ts +81 -0
  101. package/dist/esm/types/properties/config/line.d.ts +85 -1
  102. package/dist/esm/types/properties/config/pie.d.ts +243 -0
  103. package/dist/esm/types/properties/config/race.d.ts +510 -6
  104. package/dist/esm/types/properties/config/rose.d.ts +162 -0
  105. package/dist/esm/types/properties/config/scatter.d.ts +85 -1
  106. package/dist/esm/types/properties/config/sunburst.d.ts +81 -0
  107. package/dist/esm/types/properties/config/treeMap.d.ts +81 -0
  108. package/dist/esm/types/properties/index.d.ts +2 -0
  109. package/dist/esm/types/properties/index.js +2 -0
  110. package/dist/esm/types/properties/markStyle/barStyle.d.ts +4 -1
  111. package/dist/esm/types/properties/markStyle/lineStyle.d.ts +4 -1
  112. package/dist/esm/types/properties/markStyle/markStyle.d.ts +32 -8
  113. package/dist/esm/types/properties/markStyle/pointStyle.d.ts +4 -1
  114. package/dist/esm/types/properties/markStyle/zAreaStyle.d.ts +4 -1
  115. package/dist/esm/types/properties/theme/customTheme.d.ts +4850 -38
  116. package/dist/esm/types/properties/totals/index.d.ts +2 -0
  117. package/dist/esm/types/properties/totals/index.js +2 -0
  118. package/dist/esm/types/properties/totals/totals.d.ts +34 -0
  119. package/dist/esm/types/properties/totals/totals.js +0 -0
  120. package/dist/esm/types/properties/totals/zTotals.d.ts +18 -0
  121. package/dist/esm/types/properties/totals/zTotals.js +13 -0
  122. package/dist/esm/types/properties/totals/zTotals.js.map +1 -0
  123. package/dist/umd/index.js +291 -211
  124. package/dist/umd/index.js.map +1 -1
  125. package/package.json +1 -1
@@ -1,81 +1,92 @@
1
1
  import { InnerRowIndex } from "../../dataReshape/index.js";
2
2
  import { executeDynamicFilter, isDynamicFilter } from "../../dataSelector/selector.js";
3
+ const dynamicFilterConfig = {
4
+ table: [
5
+ 'bodyCellStyle'
6
+ ],
7
+ pivotTable: [
8
+ 'bodyCellStyle'
9
+ ],
10
+ bar: [
11
+ 'barStyle',
12
+ 'annotationPoint',
13
+ 'annotationVerticalLine',
14
+ 'label'
15
+ ],
16
+ barParallel: [
17
+ 'barStyle',
18
+ 'annotationPoint',
19
+ 'annotationVerticalLine',
20
+ 'label'
21
+ ],
22
+ barPercent: [
23
+ 'barStyle',
24
+ 'annotationPoint',
25
+ 'annotationVerticalLine',
26
+ 'label'
27
+ ],
28
+ column: [
29
+ 'barStyle',
30
+ 'annotationPoint',
31
+ 'annotationHorizontalLine',
32
+ 'label'
33
+ ],
34
+ columnParallel: [
35
+ 'barStyle',
36
+ 'annotationPoint',
37
+ 'annotationHorizontalLine',
38
+ 'label'
39
+ ],
40
+ columnPercent: [
41
+ 'barStyle',
42
+ 'annotationPoint',
43
+ 'annotationHorizontalLine',
44
+ 'label'
45
+ ],
46
+ line: [
47
+ 'lineStyle',
48
+ 'pointStyle',
49
+ 'annotationPoint',
50
+ 'annotationHorizontalLine',
51
+ 'label'
52
+ ],
53
+ area: [
54
+ 'lineStyle',
55
+ 'pointStyle',
56
+ 'annotationPoint',
57
+ 'annotationHorizontalLine',
58
+ 'label'
59
+ ],
60
+ areaPercent: [
61
+ 'lineStyle',
62
+ 'pointStyle',
63
+ 'annotationPoint',
64
+ 'annotationHorizontalLine',
65
+ 'label'
66
+ ],
67
+ dualAxis: [
68
+ 'barStyle',
69
+ 'lineStyle',
70
+ 'pointStyle',
71
+ 'annotationPoint',
72
+ 'annotationHorizontalLine',
73
+ 'label'
74
+ ],
75
+ scatter: [
76
+ 'pointStyle',
77
+ 'annotationPoint',
78
+ 'annotationHorizontalLine',
79
+ 'annotationVerticalLine',
80
+ 'label'
81
+ ],
82
+ histogram: [
83
+ 'annotationHorizontalLine'
84
+ ],
85
+ boxPlot: [
86
+ 'annotationHorizontalLine'
87
+ ]
88
+ };
3
89
  const generateDynamicFilterKeyPaths = ()=>{
4
- const dynamicFilterConfig = {
5
- table: [
6
- 'bodyCellStyle'
7
- ],
8
- pivotTable: [
9
- 'bodyCellStyle'
10
- ],
11
- bar: [
12
- 'barStyle',
13
- 'annotationPoint',
14
- 'annotationVerticalLine'
15
- ],
16
- barParallel: [
17
- 'barStyle',
18
- 'annotationPoint',
19
- 'annotationVerticalLine'
20
- ],
21
- barPercent: [
22
- 'barStyle',
23
- 'annotationPoint',
24
- 'annotationVerticalLine'
25
- ],
26
- column: [
27
- 'barStyle',
28
- 'annotationPoint',
29
- 'annotationHorizontalLine'
30
- ],
31
- columnParallel: [
32
- 'barStyle',
33
- 'annotationPoint',
34
- 'annotationHorizontalLine'
35
- ],
36
- columnPercent: [
37
- 'barStyle',
38
- 'annotationPoint',
39
- 'annotationHorizontalLine'
40
- ],
41
- line: [
42
- 'lineStyle',
43
- 'pointStyle',
44
- 'annotationPoint',
45
- 'annotationHorizontalLine'
46
- ],
47
- area: [
48
- 'lineStyle',
49
- 'pointStyle',
50
- 'annotationPoint',
51
- 'annotationHorizontalLine'
52
- ],
53
- areaPercent: [
54
- 'lineStyle',
55
- 'pointStyle',
56
- 'annotationPoint',
57
- 'annotationHorizontalLine'
58
- ],
59
- dualAxis: [
60
- 'barStyle',
61
- 'lineStyle',
62
- 'pointStyle',
63
- 'annotationPoint',
64
- 'annotationHorizontalLine'
65
- ],
66
- scatter: [
67
- 'pointStyle',
68
- 'annotationPoint',
69
- 'annotationHorizontalLine',
70
- 'annotationVerticalLine'
71
- ],
72
- histogram: [
73
- 'annotationHorizontalLine'
74
- ],
75
- boxPlot: [
76
- 'annotationHorizontalLine'
77
- ]
78
- };
79
90
  const result = {};
80
91
  for (const [chartType, baseKeyPaths] of Object.entries(dynamicFilterConfig))result[chartType] = baseKeyPaths.flatMap((basePath)=>[
81
92
  `${basePath}[].dynamicFilter`,
@@ -84,84 +95,7 @@ const generateDynamicFilterKeyPaths = ()=>{
84
95
  return result;
85
96
  };
86
97
  const dynamicFilterKeyPathsByChartType = generateDynamicFilterKeyPaths();
87
- const getBasePathsForDeepClone = (chartType)=>{
88
- const config = {
89
- table: [
90
- 'bodyCellStyle'
91
- ],
92
- pivotTable: [
93
- 'bodyCellStyle'
94
- ],
95
- bar: [
96
- 'barStyle',
97
- 'annotationPoint',
98
- 'annotationVerticalLine'
99
- ],
100
- barParallel: [
101
- 'barStyle',
102
- 'annotationPoint',
103
- 'annotationVerticalLine'
104
- ],
105
- barPercent: [
106
- 'barStyle',
107
- 'annotationPoint',
108
- 'annotationVerticalLine'
109
- ],
110
- column: [
111
- 'barStyle',
112
- 'annotationPoint',
113
- 'annotationHorizontalLine'
114
- ],
115
- columnParallel: [
116
- 'barStyle',
117
- 'annotationPoint',
118
- 'annotationHorizontalLine'
119
- ],
120
- columnPercent: [
121
- 'barStyle',
122
- 'annotationPoint',
123
- 'annotationHorizontalLine'
124
- ],
125
- line: [
126
- 'lineStyle',
127
- 'pointStyle',
128
- 'annotationPoint',
129
- 'annotationHorizontalLine'
130
- ],
131
- area: [
132
- 'lineStyle',
133
- 'pointStyle',
134
- 'annotationPoint',
135
- 'annotationHorizontalLine'
136
- ],
137
- areaPercent: [
138
- 'lineStyle',
139
- 'pointStyle',
140
- 'annotationPoint',
141
- 'annotationHorizontalLine'
142
- ],
143
- dualAxis: [
144
- 'barStyle',
145
- 'lineStyle',
146
- 'pointStyle',
147
- 'annotationPoint',
148
- 'annotationHorizontalLine'
149
- ],
150
- scatter: [
151
- 'pointStyle',
152
- 'annotationPoint',
153
- 'annotationHorizontalLine',
154
- 'annotationVerticalLine'
155
- ],
156
- histogram: [
157
- 'annotationHorizontalLine'
158
- ],
159
- boxPlot: [
160
- 'annotationHorizontalLine'
161
- ]
162
- };
163
- return config[chartType] ?? [];
164
- };
98
+ const getBasePathsForDeepClone = (chartType)=>dynamicFilterConfig[chartType] ?? [];
165
99
  const parseKeyPath = (path)=>path.split('.').map((segment)=>{
166
100
  if (segment.endsWith('[]')) return {
167
101
  key: segment.slice(0, -2),
@@ -1 +1 @@
1
- {"version":3,"file":"builder/builder/prepare.js","sources":["webpack://@visactor/vseed/./src/builder/builder/prepare.ts"],"sourcesContent":["import type { ChartType } from 'src/types'\nimport { InnerRowIndex } from 'src/dataReshape'\nimport type { Builder } from './builder'\nimport { executeDynamicFilter, isDynamicFilter } from 'src/dataSelector/selector'\nimport type { DynamicFilter } from 'src/dataSelector/selector'\nimport type { ChartDynamicFilterRes, TableDynamicFilterRes } from 'src/types/dataSelector'\n\n/**\n * 生成完整的 keyPath 配置\n * 对每个基路径生成数组和非数组两种形式\n */\nconst generateDynamicFilterKeyPaths = (): Partial<Record<ChartType, string[]>> => {\n /**\n * 动态筛选器基础配置 - 配置每个图表类型中可能包含动态筛选器的字段\n * 生成时会自动添加 [] 和非 [] 两种形式\n */\n const dynamicFilterConfig: Partial<Record<ChartType, string[]>> = {\n table: ['bodyCellStyle'],\n pivotTable: ['bodyCellStyle'],\n bar: ['barStyle', 'annotationPoint', 'annotationVerticalLine'],\n barParallel: ['barStyle', 'annotationPoint', 'annotationVerticalLine'],\n barPercent: ['barStyle', 'annotationPoint', 'annotationVerticalLine'],\n column: ['barStyle', 'annotationPoint', 'annotationHorizontalLine'],\n columnParallel: ['barStyle', 'annotationPoint', 'annotationHorizontalLine'],\n columnPercent: ['barStyle', 'annotationPoint', 'annotationHorizontalLine'],\n line: ['lineStyle', 'pointStyle', 'annotationPoint', 'annotationHorizontalLine'],\n area: ['lineStyle', 'pointStyle', 'annotationPoint', 'annotationHorizontalLine'],\n areaPercent: ['lineStyle', 'pointStyle', 'annotationPoint', 'annotationHorizontalLine'],\n dualAxis: ['barStyle', 'lineStyle', 'pointStyle', 'annotationPoint', 'annotationHorizontalLine'],\n scatter: ['pointStyle', 'annotationPoint', 'annotationHorizontalLine', 'annotationVerticalLine'],\n histogram: ['annotationHorizontalLine'],\n boxPlot: ['annotationHorizontalLine'],\n }\n\n const result: Partial<Record<ChartType, string[]>> = {}\n for (const [chartType, baseKeyPaths] of Object.entries(dynamicFilterConfig)) {\n result[chartType as ChartType] = baseKeyPaths.flatMap((basePath) => [\n `${basePath}[].dynamicFilter`,\n `${basePath}.dynamicFilter`,\n ])\n }\n return result\n}\n\nconst dynamicFilterKeyPathsByChartType = generateDynamicFilterKeyPaths()\n\n/**\n * 提取图表类型对应的基础路径(用于深拷贝)\n */\nconst getBasePathsForDeepClone = (chartType: ChartType): string[] => {\n const config: Partial<Record<ChartType, string[]>> = {\n table: ['bodyCellStyle'],\n pivotTable: ['bodyCellStyle'],\n bar: ['barStyle', 'annotationPoint', 'annotationVerticalLine'],\n barParallel: ['barStyle', 'annotationPoint', 'annotationVerticalLine'],\n barPercent: ['barStyle', 'annotationPoint', 'annotationVerticalLine'],\n column: ['barStyle', 'annotationPoint', 'annotationHorizontalLine'],\n columnParallel: ['barStyle', 'annotationPoint', 'annotationHorizontalLine'],\n columnPercent: ['barStyle', 'annotationPoint', 'annotationHorizontalLine'],\n line: ['lineStyle', 'pointStyle', 'annotationPoint', 'annotationHorizontalLine'],\n area: ['lineStyle', 'pointStyle', 'annotationPoint', 'annotationHorizontalLine'],\n areaPercent: ['lineStyle', 'pointStyle', 'annotationPoint', 'annotationHorizontalLine'],\n dualAxis: ['barStyle', 'lineStyle', 'pointStyle', 'annotationPoint', 'annotationHorizontalLine'],\n scatter: ['pointStyle', 'annotationPoint', 'annotationHorizontalLine', 'annotationVerticalLine'],\n histogram: ['annotationHorizontalLine'],\n boxPlot: ['annotationHorizontalLine'],\n }\n\n return config[chartType] ?? []\n}\n\nconst parseKeyPath = (path: string) => {\n return path.split('.').map((segment) => {\n if (segment.endsWith('[]')) {\n return { key: segment.slice(0, -2), isArray: true }\n }\n return { key: segment, isArray: false }\n })\n}\n\nconst getValuesByKeyPath = (target: unknown, path: string): unknown[] => {\n const segments = parseKeyPath(path)\n let current: unknown[] = [target]\n\n for (const segment of segments) {\n const next: unknown[] = []\n for (const node of current) {\n if (!node || typeof node !== 'object') continue\n const value = (node as Record<string, unknown>)[segment.key]\n if (segment.isArray) {\n if (Array.isArray(value)) {\n next.push(...value)\n }\n } else if (value !== undefined) {\n next.push(value)\n }\n }\n current = next\n }\n\n return current\n}\n\nconst collectDynamicFiltersByKeyPaths = (target: unknown, chartType: ChartType): DynamicFilter[] => {\n const paths = dynamicFilterKeyPathsByChartType[chartType] ?? []\n if (!paths.length) return []\n\n return paths\n .flatMap((path) => getValuesByKeyPath(target, path))\n .filter((value): value is DynamicFilter => isDynamicFilter(value) && !!value?.code)\n}\n/**\n * 执行所有 dynamicFilter 的 code,将结果直接写入 filter.result\n */\nconst executeDynamicFiltersAndInject = async (filters: DynamicFilter[], dataset: any[]): Promise<void> => {\n if (!filters.length || !dataset.length) return\n\n await Promise.all(\n filters.map(async (filter) => {\n const { success, data, error } = await executeDynamicFilter(filter, dataset)\n filter.result = {\n success,\n error,\n data: data as TableDynamicFilterRes[] | ChartDynamicFilterRes[],\n }\n }),\n )\n}\n\n/**\n * 针对性深拷贝 vseed 中包含 dynamicFilter 的路径\n * @description 只深拷贝需要修改的路径,避免完全深拷贝的性能开销\n */\nconst deepCloneDynamicFilterPaths = (vseed: any, chartType: ChartType): any => {\n const basePaths = getBasePathsForDeepClone(chartType)\n if (!basePaths.length) return { ...vseed }\n\n const clonedVseed = { ...vseed }\n\n for (const basePath of basePaths) {\n if (!(basePath in clonedVseed)) continue\n\n const value = clonedVseed[basePath]\n\n // 如果是数组,深拷贝数组及其元素\n if (Array.isArray(value)) {\n clonedVseed[basePath] = value.map((item) => {\n if (!item || typeof item !== 'object') return item\n\n const clonedItem = { ...item }\n\n // 如果有 dynamicFilter,深拷贝它\n if (clonedItem.dynamicFilter && typeof clonedItem.dynamicFilter === 'object') {\n clonedItem.dynamicFilter = { ...clonedItem.dynamicFilter }\n }\n\n return clonedItem\n })\n }\n // 如果是对象\n else if (value && typeof value === 'object') {\n clonedVseed[basePath] = { ...value }\n\n // 如果有 dynamicFilter,深拷贝它\n if (clonedVseed[basePath].dynamicFilter && typeof clonedVseed[basePath].dynamicFilter === 'object') {\n clonedVseed[basePath].dynamicFilter = { ...clonedVseed[basePath].dynamicFilter }\n }\n }\n }\n\n return clonedVseed\n}\n\n/**\n * 准备阶段 - 执行动态过滤器代码\n * @description 在 build() 之前调用,用于:\n * 1. 检查是否存在需要执行的 dynamicFilter (有 code 字段)\n * 2. 创建 vseed 的副本,给 dataset 添加 __row_index\n * 3. 收集所有 dynamicFilter 并执行 code\n * 4. 将结果直接写入 dynamicFilter.result\n * 5. 更新 builder.vseed 为处理后的副本\n * @returns Promise<void>\n */\nexport const prepare = async (builder: Builder): Promise<void> => {\n // 幂等性:如果已经准备过,直接返回\n if (builder.isPrepared || !builder.vseed || !builder.vseed?.chartType || !builder.vseed.dataset) {\n return\n }\n\n // 1. 收集原始 vseed 中的所有 dynamicFilter\n const filters = collectDynamicFiltersByKeyPaths(builder.vseed, builder.vseed.chartType)\n if (!filters.length) {\n // 标记为已准备(虽然实际没做什么)\n builder.isPrepared = true\n return\n }\n\n // 2. 针对性深拷贝 vseed(只拷贝包含 dynamicFilter 的路径)\n const clonedVseed = deepCloneDynamicFilterPaths(builder.vseed, builder.vseed.chartType)\n\n // 3. 创建带 __row_index 的 dataset\n const originalDataset = clonedVseed.dataset as any[]\n let datasetWithIndex = originalDataset\n\n // 如果还没有注入 __row_index,创建新的副本\n if (!originalDataset[0] || !(InnerRowIndex in originalDataset[0])) {\n datasetWithIndex = originalDataset.map((item, index) => ({\n ...item,\n [InnerRowIndex]: index,\n }))\n }\n\n // 4. 更新 builder.vseed,使用深拷贝后的 vseed 和带 __row_index 的 dataset\n builder.vseed = {\n ...clonedVseed,\n dataset: datasetWithIndex,\n }\n\n // 5. 重新收集 dynamicFilter(从新的 vseed 中)\n const clonedFilters = collectDynamicFiltersByKeyPaths(builder.vseed, builder.vseed.chartType)\n\n // 6. 执行所有 dynamicFilter 的 code,结果直接写入 filter.result\n try {\n await executeDynamicFiltersAndInject(clonedFilters, datasetWithIndex)\n } catch (e) {\n throw new Error(`Failed to execute dynamic filters: ${(e as Error).message}`)\n }\n\n // 7. 标记为已准备\n builder.isPrepared = true\n}\n"],"names":["generateDynamicFilterKeyPaths","dynamicFilterConfig","result","chartType","baseKeyPaths","Object","basePath","dynamicFilterKeyPathsByChartType","getBasePathsForDeepClone","config","parseKeyPath","path","segment","getValuesByKeyPath","target","segments","current","next","node","value","Array","undefined","collectDynamicFiltersByKeyPaths","paths","isDynamicFilter","executeDynamicFiltersAndInject","filters","dataset","Promise","filter","success","data","error","executeDynamicFilter","deepCloneDynamicFilterPaths","vseed","basePaths","clonedVseed","item","clonedItem","prepare","builder","originalDataset","datasetWithIndex","InnerRowIndex","index","clonedFilters","e","Error"],"mappings":";;AAWA,MAAMA,gCAAgC;IAKpC,MAAMC,sBAA4D;QAChE,OAAO;YAAC;SAAgB;QACxB,YAAY;YAAC;SAAgB;QAC7B,KAAK;YAAC;YAAY;YAAmB;SAAyB;QAC9D,aAAa;YAAC;YAAY;YAAmB;SAAyB;QACtE,YAAY;YAAC;YAAY;YAAmB;SAAyB;QACrE,QAAQ;YAAC;YAAY;YAAmB;SAA2B;QACnE,gBAAgB;YAAC;YAAY;YAAmB;SAA2B;QAC3E,eAAe;YAAC;YAAY;YAAmB;SAA2B;QAC1E,MAAM;YAAC;YAAa;YAAc;YAAmB;SAA2B;QAChF,MAAM;YAAC;YAAa;YAAc;YAAmB;SAA2B;QAChF,aAAa;YAAC;YAAa;YAAc;YAAmB;SAA2B;QACvF,UAAU;YAAC;YAAY;YAAa;YAAc;YAAmB;SAA2B;QAChG,SAAS;YAAC;YAAc;YAAmB;YAA4B;SAAyB;QAChG,WAAW;YAAC;SAA2B;QACvC,SAAS;YAAC;SAA2B;IACvC;IAEA,MAAMC,SAA+C,CAAC;IACtD,KAAK,MAAM,CAACC,WAAWC,aAAa,IAAIC,OAAO,OAAO,CAACJ,qBACrDC,MAAM,CAACC,UAAuB,GAAGC,aAAa,OAAO,CAAC,CAACE,WAAa;YAClE,GAAGA,SAAS,gBAAgB,CAAC;YAC7B,GAAGA,SAAS,cAAc,CAAC;SAC5B;IAEH,OAAOJ;AACT;AAEA,MAAMK,mCAAmCP;AAKzC,MAAMQ,2BAA2B,CAACL;IAChC,MAAMM,SAA+C;QACnD,OAAO;YAAC;SAAgB;QACxB,YAAY;YAAC;SAAgB;QAC7B,KAAK;YAAC;YAAY;YAAmB;SAAyB;QAC9D,aAAa;YAAC;YAAY;YAAmB;SAAyB;QACtE,YAAY;YAAC;YAAY;YAAmB;SAAyB;QACrE,QAAQ;YAAC;YAAY;YAAmB;SAA2B;QACnE,gBAAgB;YAAC;YAAY;YAAmB;SAA2B;QAC3E,eAAe;YAAC;YAAY;YAAmB;SAA2B;QAC1E,MAAM;YAAC;YAAa;YAAc;YAAmB;SAA2B;QAChF,MAAM;YAAC;YAAa;YAAc;YAAmB;SAA2B;QAChF,aAAa;YAAC;YAAa;YAAc;YAAmB;SAA2B;QACvF,UAAU;YAAC;YAAY;YAAa;YAAc;YAAmB;SAA2B;QAChG,SAAS;YAAC;YAAc;YAAmB;YAA4B;SAAyB;QAChG,WAAW;YAAC;SAA2B;QACvC,SAAS;YAAC;SAA2B;IACvC;IAEA,OAAOA,MAAM,CAACN,UAAU,IAAI,EAAE;AAChC;AAEA,MAAMO,eAAe,CAACC,OACbA,KAAK,KAAK,CAAC,KAAK,GAAG,CAAC,CAACC;QAC1B,IAAIA,QAAQ,QAAQ,CAAC,OACnB,OAAO;YAAE,KAAKA,QAAQ,KAAK,CAAC,GAAG;YAAK,SAAS;QAAK;QAEpD,OAAO;YAAE,KAAKA;YAAS,SAAS;QAAM;IACxC;AAGF,MAAMC,qBAAqB,CAACC,QAAiBH;IAC3C,MAAMI,WAAWL,aAAaC;IAC9B,IAAIK,UAAqB;QAACF;KAAO;IAEjC,KAAK,MAAMF,WAAWG,SAAU;QAC9B,MAAME,OAAkB,EAAE;QAC1B,KAAK,MAAMC,QAAQF,QAAS;YAC1B,IAAI,CAACE,QAAQ,AAAgB,YAAhB,OAAOA,MAAmB;YACvC,MAAMC,QAASD,IAAgC,CAACN,QAAQ,GAAG,CAAC;YAC5D,IAAIA,QAAQ,OAAO,EACjB;gBAAA,IAAIQ,MAAM,OAAO,CAACD,QAChBF,KAAK,IAAI,IAAIE;YACf,OACK,IAAIA,AAAUE,WAAVF,OACTF,KAAK,IAAI,CAACE;QAEd;QACAH,UAAUC;IACZ;IAEA,OAAOD;AACT;AAEA,MAAMM,kCAAkC,CAACR,QAAiBX;IACxD,MAAMoB,QAAQhB,gCAAgC,CAACJ,UAAU,IAAI,EAAE;IAC/D,IAAI,CAACoB,MAAM,MAAM,EAAE,OAAO,EAAE;IAE5B,OAAOA,MACJ,OAAO,CAAC,CAACZ,OAASE,mBAAmBC,QAAQH,OAC7C,MAAM,CAAC,CAACQ,QAAkCK,gBAAgBL,UAAU,CAAC,CAACA,OAAO;AAClF;AAIA,MAAMM,iCAAiC,OAAOC,SAA0BC;IACtE,IAAI,CAACD,QAAQ,MAAM,IAAI,CAACC,QAAQ,MAAM,EAAE;IAExC,MAAMC,QAAQ,GAAG,CACfF,QAAQ,GAAG,CAAC,OAAOG;QACjB,MAAM,EAAEC,OAAO,EAAEC,IAAI,EAAEC,KAAK,EAAE,GAAG,MAAMC,qBAAqBJ,QAAQF;QACpEE,OAAO,MAAM,GAAG;YACdC;YACAE;YACA,MAAMD;QACR;IACF;AAEJ;AAMA,MAAMG,8BAA8B,CAACC,OAAYhC;IAC/C,MAAMiC,YAAY5B,yBAAyBL;IAC3C,IAAI,CAACiC,UAAU,MAAM,EAAE,OAAO;QAAE,GAAGD,KAAK;IAAC;IAEzC,MAAME,cAAc;QAAE,GAAGF,KAAK;IAAC;IAE/B,KAAK,MAAM7B,YAAY8B,UAAW;QAChC,IAAI,CAAE9B,CAAAA,YAAY+B,WAAU,GAAI;QAEhC,MAAMlB,QAAQkB,WAAW,CAAC/B,SAAS;QAGnC,IAAIc,MAAM,OAAO,CAACD,QAChBkB,WAAW,CAAC/B,SAAS,GAAGa,MAAM,GAAG,CAAC,CAACmB;YACjC,IAAI,CAACA,QAAQ,AAAgB,YAAhB,OAAOA,MAAmB,OAAOA;YAE9C,MAAMC,aAAa;gBAAE,GAAGD,IAAI;YAAC;YAG7B,IAAIC,WAAW,aAAa,IAAI,AAAoC,YAApC,OAAOA,WAAW,aAAa,EAC7DA,WAAW,aAAa,GAAG;gBAAE,GAAGA,WAAW,aAAa;YAAC;YAG3D,OAAOA;QACT;aAGG,IAAIpB,SAAS,AAAiB,YAAjB,OAAOA,OAAoB;YAC3CkB,WAAW,CAAC/B,SAAS,GAAG;gBAAE,GAAGa,KAAK;YAAC;YAGnC,IAAIkB,WAAW,CAAC/B,SAAS,CAAC,aAAa,IAAI,AAA+C,YAA/C,OAAO+B,WAAW,CAAC/B,SAAS,CAAC,aAAa,EACnF+B,WAAW,CAAC/B,SAAS,CAAC,aAAa,GAAG;gBAAE,GAAG+B,WAAW,CAAC/B,SAAS,CAAC,aAAa;YAAC;QAEnF;IACF;IAEA,OAAO+B;AACT;AAYO,MAAMG,UAAU,OAAOC;IAE5B,IAAIA,QAAQ,UAAU,IAAI,CAACA,QAAQ,KAAK,IAAI,CAACA,QAAQ,KAAK,EAAE,aAAa,CAACA,QAAQ,KAAK,CAAC,OAAO,EAC7F;IAIF,MAAMf,UAAUJ,gCAAgCmB,QAAQ,KAAK,EAAEA,QAAQ,KAAK,CAAC,SAAS;IACtF,IAAI,CAACf,QAAQ,MAAM,EAAE;QAEnBe,QAAQ,UAAU,GAAG;QACrB;IACF;IAGA,MAAMJ,cAAcH,4BAA4BO,QAAQ,KAAK,EAAEA,QAAQ,KAAK,CAAC,SAAS;IAGtF,MAAMC,kBAAkBL,YAAY,OAAO;IAC3C,IAAIM,mBAAmBD;IAGvB,IAAI,CAACA,eAAe,CAAC,EAAE,IAAI,CAAEE,CAAAA,iBAAiBF,eAAe,CAAC,EAAC,GAC7DC,mBAAmBD,gBAAgB,GAAG,CAAC,CAACJ,MAAMO,QAAW;YACvD,GAAGP,IAAI;YACP,CAACM,cAAc,EAAEC;QACnB;IAIFJ,QAAQ,KAAK,GAAG;QACd,GAAGJ,WAAW;QACd,SAASM;IACX;IAGA,MAAMG,gBAAgBxB,gCAAgCmB,QAAQ,KAAK,EAAEA,QAAQ,KAAK,CAAC,SAAS;IAG5F,IAAI;QACF,MAAMhB,+BAA+BqB,eAAeH;IACtD,EAAE,OAAOI,GAAG;QACV,MAAM,IAAIC,MAAM,CAAC,mCAAmC,EAAGD,EAAY,OAAO,EAAE;IAC9E;IAGAN,QAAQ,UAAU,GAAG;AACvB"}
1
+ {"version":3,"file":"builder/builder/prepare.js","sources":["webpack://@visactor/vseed/./src/builder/builder/prepare.ts"],"sourcesContent":["import type { ChartType } from 'src/types'\nimport { InnerRowIndex } from 'src/dataReshape'\nimport type { Builder } from './builder'\nimport { executeDynamicFilter, isDynamicFilter } from 'src/dataSelector/selector'\nimport type { DynamicFilter } from 'src/dataSelector/selector'\n\n/** 支持动态过滤的keyPath 白名单 */\nconst dynamicFilterConfig: Partial<Record<ChartType, string[]>> = {\n table: ['bodyCellStyle'],\n pivotTable: ['bodyCellStyle'],\n bar: ['barStyle', 'annotationPoint', 'annotationVerticalLine', 'label'],\n barParallel: ['barStyle', 'annotationPoint', 'annotationVerticalLine', 'label'],\n barPercent: ['barStyle', 'annotationPoint', 'annotationVerticalLine', 'label'],\n column: ['barStyle', 'annotationPoint', 'annotationHorizontalLine', 'label'],\n columnParallel: ['barStyle', 'annotationPoint', 'annotationHorizontalLine', 'label'],\n columnPercent: ['barStyle', 'annotationPoint', 'annotationHorizontalLine', 'label'],\n line: ['lineStyle', 'pointStyle', 'annotationPoint', 'annotationHorizontalLine', 'label'],\n area: ['lineStyle', 'pointStyle', 'annotationPoint', 'annotationHorizontalLine', 'label'],\n areaPercent: ['lineStyle', 'pointStyle', 'annotationPoint', 'annotationHorizontalLine', 'label'],\n dualAxis: ['barStyle', 'lineStyle', 'pointStyle', 'annotationPoint', 'annotationHorizontalLine', 'label'],\n scatter: ['pointStyle', 'annotationPoint', 'annotationHorizontalLine', 'annotationVerticalLine', 'label'],\n histogram: ['annotationHorizontalLine'],\n boxPlot: ['annotationHorizontalLine'],\n}\n\n/**\n * 生成完整的 keyPath 配置\n * 对每个基路径生成数组和非数组两种形式\n */\nconst generateDynamicFilterKeyPaths = (): Partial<Record<ChartType, string[]>> => {\n const result: Partial<Record<ChartType, string[]>> = {}\n for (const [chartType, baseKeyPaths] of Object.entries(dynamicFilterConfig)) {\n result[chartType as ChartType] = baseKeyPaths.flatMap((basePath) => [\n `${basePath}[].dynamicFilter`,\n `${basePath}.dynamicFilter`,\n ])\n }\n return result\n}\n\nconst dynamicFilterKeyPathsByChartType = generateDynamicFilterKeyPaths()\n\n/**\n * 提取图表类型对应的基础路径(用于深拷贝)\n */\nconst getBasePathsForDeepClone = (chartType: ChartType): string[] => {\n return dynamicFilterConfig[chartType] ?? []\n}\n\nconst parseKeyPath = (path: string) => {\n return path.split('.').map((segment) => {\n if (segment.endsWith('[]')) {\n return { key: segment.slice(0, -2), isArray: true }\n }\n return { key: segment, isArray: false }\n })\n}\n\nconst getValuesByKeyPath = (target: unknown, path: string): unknown[] => {\n const segments = parseKeyPath(path)\n let current: unknown[] = [target]\n\n for (const segment of segments) {\n const next: unknown[] = []\n for (const node of current) {\n if (!node || typeof node !== 'object') continue\n const value = (node as Record<string, unknown>)[segment.key]\n if (segment.isArray) {\n if (Array.isArray(value)) {\n next.push(...value)\n }\n } else if (value !== undefined) {\n next.push(value)\n }\n }\n current = next\n }\n\n return current\n}\n\nconst collectDynamicFiltersByKeyPaths = (target: unknown, chartType: ChartType): DynamicFilter[] => {\n const paths = dynamicFilterKeyPathsByChartType[chartType] ?? []\n if (!paths.length) return []\n\n return paths\n .flatMap((path) => getValuesByKeyPath(target, path))\n .filter((value): value is DynamicFilter => isDynamicFilter(value) && !!value?.code)\n}\n/**\n * 执行所有 dynamicFilter 的 code,将结果直接写入 filter.result\n */\nconst executeDynamicFiltersAndInject = async (filters: DynamicFilter[], dataset: any[]): Promise<void> => {\n if (!filters.length || !dataset.length) return\n\n await Promise.all(\n filters.map(async (filter) => {\n const { success, data, error } = await executeDynamicFilter(filter, dataset)\n filter.result = {\n success,\n error,\n data: data as any,\n }\n }),\n )\n}\n\n/**\n * 针对性深拷贝 vseed 中包含 dynamicFilter 的路径\n * @description 只深拷贝需要修改的路径,避免完全深拷贝的性能开销\n */\nconst deepCloneDynamicFilterPaths = (vseed: any, chartType: ChartType): any => {\n const basePaths = getBasePathsForDeepClone(chartType)\n if (!basePaths.length) return { ...vseed }\n\n const clonedVseed = { ...vseed }\n\n for (const basePath of basePaths) {\n if (!(basePath in clonedVseed)) continue\n\n const value = clonedVseed[basePath]\n\n // 如果是数组,深拷贝数组及其元素\n if (Array.isArray(value)) {\n clonedVseed[basePath] = value.map((item) => {\n if (!item || typeof item !== 'object') return item\n\n const clonedItem = { ...item }\n\n // 如果有 dynamicFilter,深拷贝它\n if (clonedItem.dynamicFilter && typeof clonedItem.dynamicFilter === 'object') {\n clonedItem.dynamicFilter = { ...clonedItem.dynamicFilter }\n }\n\n return clonedItem\n })\n }\n // 如果是对象\n else if (value && typeof value === 'object') {\n clonedVseed[basePath] = { ...value }\n\n // 如果有 dynamicFilter,深拷贝它\n if (clonedVseed[basePath].dynamicFilter && typeof clonedVseed[basePath].dynamicFilter === 'object') {\n clonedVseed[basePath].dynamicFilter = { ...clonedVseed[basePath].dynamicFilter }\n }\n }\n }\n\n return clonedVseed\n}\n\n/**\n * 准备阶段 - 执行动态过滤器代码\n * @description 在 build() 之前调用,用于:\n * 1. 检查是否存在需要执行的 dynamicFilter (有 code 字段)\n * 2. 创建 vseed 的副本,给 dataset 添加 __row_index\n * 3. 收集所有 dynamicFilter 并执行 code\n * 4. 将结果直接写入 dynamicFilter.result\n * 5. 更新 builder.vseed 为处理后的副本\n * @returns Promise<void>\n */\nexport const prepare = async (builder: Builder): Promise<void> => {\n // 幂等性:如果已经准备过,直接返回\n if (builder.isPrepared || !builder.vseed || !builder.vseed?.chartType || !builder.vseed.dataset) {\n return\n }\n\n // 1. 收集原始 vseed 中的所有 dynamicFilter\n const filters = collectDynamicFiltersByKeyPaths(builder.vseed, builder.vseed.chartType)\n if (!filters.length) {\n // 标记为已准备(虽然实际没做什么)\n builder.isPrepared = true\n return\n }\n\n // 2. 针对性深拷贝 vseed(只拷贝包含 dynamicFilter 的路径)\n const clonedVseed = deepCloneDynamicFilterPaths(builder.vseed, builder.vseed.chartType)\n\n // 3. 创建带 __row_index 的 dataset\n const originalDataset = clonedVseed.dataset as any[]\n let datasetWithIndex = originalDataset\n\n // 如果还没有注入 __row_index,创建新的副本\n if (!originalDataset[0] || !(InnerRowIndex in originalDataset[0])) {\n datasetWithIndex = originalDataset.map((item, index) => ({\n ...item,\n [InnerRowIndex]: index,\n }))\n }\n\n // 4. 更新 builder.vseed,使用深拷贝后的 vseed 和带 __row_index 的 dataset\n builder.vseed = {\n ...clonedVseed,\n dataset: datasetWithIndex,\n }\n\n // 5. 重新收集 dynamicFilter(从新的 vseed 中)\n const clonedFilters = collectDynamicFiltersByKeyPaths(builder.vseed, builder.vseed.chartType)\n\n // 6. 执行所有 dynamicFilter 的 code,结果直接写入 filter.result\n try {\n await executeDynamicFiltersAndInject(clonedFilters, datasetWithIndex)\n } catch (e) {\n throw new Error(`Failed to execute dynamic filters: ${(e as Error).message}`)\n }\n\n // 7. 标记为已准备\n builder.isPrepared = true\n}\n"],"names":["dynamicFilterConfig","generateDynamicFilterKeyPaths","result","chartType","baseKeyPaths","Object","basePath","dynamicFilterKeyPathsByChartType","getBasePathsForDeepClone","parseKeyPath","path","segment","getValuesByKeyPath","target","segments","current","next","node","value","Array","undefined","collectDynamicFiltersByKeyPaths","paths","isDynamicFilter","executeDynamicFiltersAndInject","filters","dataset","Promise","filter","success","data","error","executeDynamicFilter","deepCloneDynamicFilterPaths","vseed","basePaths","clonedVseed","item","clonedItem","prepare","builder","originalDataset","datasetWithIndex","InnerRowIndex","index","clonedFilters","e","Error"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import type { Datum } from '../types';
2
- import type { ChartDynamicFilter, ChartDynamicFilterRes, DimensionSelector, MeasureSelector, PartialDatumSelector, Selector, Selectors, TableDynamicFilterRes, TableDynamicFilter, ValueSelector, ValueDynamicFilter } from '../types/dataSelector';
2
+ import type { ChartDynamicFilter, PartialDatumRes, DimensionSelector, MeasureSelector, PartialDatumSelector, Selector, Selectors, RowWithFieldRes, TableDynamicFilter, ValueSelector, ValueDynamicFilter } from '../types/dataSelector';
3
3
  export type DynamicFilter = TableDynamicFilter | ChartDynamicFilter | ValueDynamicFilter;
4
- export type DynamicFilterResult = TableDynamicFilterRes[] | ChartDynamicFilterRes[] | number | string;
4
+ export type DynamicFilterResult = RowWithFieldRes[] | PartialDatumRes[] | number | string;
5
5
  export declare const selector: (vchartDatum: Datum, selector: Selector | Selectors | undefined | null, selectorMode?: "And" | "Or") => boolean;
6
6
  export declare const isValueSelector: (selector: Selector) => selector is ValueSelector;
7
7
  export declare const isPartialDatumSelector: (selector: Selector) => selector is PartialDatumSelector;
@@ -1 +1 @@
1
- {"version":3,"file":"dataSelector/selector.js","sources":["webpack://@visactor/vseed/./src/dataSelector/selector.ts"],"sourcesContent":["import type { Datum } from 'src/types'\nimport type {\n ChartDynamicFilter,\n ChartDynamicFilterRes,\n DimensionSelector,\n MeasureSelector,\n PartialDatumSelector,\n Selector,\n Selectors,\n TableDynamicFilterRes,\n TableDynamicFilter,\n ValueSelector,\n ValueDynamicFilter,\n} from '../types/dataSelector'\nimport { omit } from 'remeda'\nimport { executeFilterCode } from 'src/pipeline/utils/sandbox'\nimport { InnerRowIndex } from 'src/dataReshape'\n\nexport type DynamicFilter = TableDynamicFilter | ChartDynamicFilter | ValueDynamicFilter\nexport type DynamicFilterResult = TableDynamicFilterRes[] | ChartDynamicFilterRes[] | number | string\n\n/**\n * 判断两个数字是否“近似相等”\n */\nfunction nearlyEqual(a: number, b: number, epsilon = 1e-8) {\n // NaN 直接不相等\n if (Number.isNaN(a) || Number.isNaN(b)) return false\n // 引用同一个数 或 完全相等\n if (a === b) return true\n const diff = Math.abs(a - b)\n return diff <= epsilon\n}\n\nexport const selector = (\n vchartDatum: Datum,\n selector: Selector | Selectors | undefined | null,\n selectorMode: 'And' | 'Or' = 'And',\n) => {\n // 无有效选择器, 则认为全部匹配成功\n if (!selector) {\n return true\n }\n\n // 过滤掉 vchart 相关字段\n const vchartKeys = Object.keys(vchartDatum).filter((k) => k.toLocaleLowerCase().startsWith('__vchart'))\n const datum = omit(vchartDatum, vchartKeys) as Datum\n\n // 统一处理选择器为数组\n const selectors = (Array.isArray(selector) ? selector : [selector]) as Selectors\n\n return selectors[selectorMode === 'And' ? 'every' : 'some']((selector) => {\n // 1. 字符串或数字\n if (isValueSelector(selector)) {\n return selectByValue(selector, datum)\n }\n\n // 2. 指标选择器\n else if (isMeasureSelector(selector)) {\n return selectByMeasure(selector, datum)\n }\n // 3. 维度选择器\n else if (isDimensionSelector(selector)) {\n return selectByDmension(selector, datum)\n }\n // 4. 部分数据对象选择器\n else if (isPartialDatumSelector(selector)) {\n return selectByPartial(selector, datum)\n }\n\n return false\n })\n}\n\nexport const isValueSelector = (selector: Selector): selector is ValueSelector => {\n return typeof selector === 'string' || typeof selector === 'number'\n}\n\nexport const isPartialDatumSelector = (selector: Selector): selector is PartialDatumSelector => {\n return typeof selector === 'object' && selector !== null\n}\n\nexport const isMeasureSelector = (selector: Selector): selector is MeasureSelector => {\n return (\n typeof selector === 'object' &&\n selector !== null &&\n 'field' in selector &&\n ('operator' in selector || 'op' in selector) &&\n 'value' in selector &&\n (['=', '==', '!=', '>', '<', '>=', '<=', 'between'].includes(selector.operator as string) ||\n ['=', '==', '!=', '>', '<', '>=', '<=', 'between'].includes(selector.op as string))\n )\n}\n\nexport const isDimensionSelector = (selector: Selector): selector is DimensionSelector => {\n return (\n typeof selector === 'object' &&\n selector !== null &&\n 'field' in selector &&\n ('operator' in selector || 'op' in selector) &&\n 'value' in selector &&\n (['in', 'not in'].includes(selector.operator as string) || ['in', 'not in'].includes(selector.op as string))\n )\n}\n\nexport const selectByMeasure = (selector: MeasureSelector, datum: Datum) => {\n const op = selector.operator || selector.op\n const selectorValueArr = Array.isArray(selector.value) ? selector.value : [selector.value]\n\n switch (op) {\n case '=':\n if (\n String(datum[selector.field]) === String(selectorValueArr[0]) ||\n nearlyEqual(Number(datum[selector.field]), Number(selectorValueArr[0]))\n ) {\n return true\n }\n break\n case '==':\n if (datum[selector.field] === selectorValueArr[0]) {\n return true\n }\n break\n case '!=':\n if (datum[selector.field] !== selectorValueArr[0]) {\n return true\n }\n break\n case '>':\n if (\n datum[selector.field] > selectorValueArr[0] &&\n !nearlyEqual(Number(datum[selector.field]), Number(selectorValueArr[0]))\n ) {\n return true\n }\n break\n case '<':\n if (\n datum[selector.field] < selectorValueArr[0] &&\n !nearlyEqual(Number(datum[selector.field]), Number(selectorValueArr[0]))\n ) {\n return true\n }\n break\n case '>=':\n if (\n datum[selector.field] >= selectorValueArr[0] ||\n nearlyEqual(Number(datum[selector.field]), Number(selectorValueArr[0]))\n ) {\n return true\n }\n break\n case '<=':\n if (\n datum[selector.field] <= selectorValueArr[0] ||\n nearlyEqual(Number(datum[selector.field]), Number(selectorValueArr[0]))\n ) {\n return true\n }\n break\n case 'between':\n if (\n Array.isArray(selector.value) &&\n (datum[selector.field] >= selectorValueArr[0] ||\n nearlyEqual(Number(datum[selector.field]), Number(selectorValueArr[0]))) &&\n (datum[selector.field] <= selectorValueArr[1] ||\n nearlyEqual(Number(datum[selector.field]), Number(selectorValueArr[1])))\n ) {\n return true\n }\n break\n }\n return false\n}\n\nexport const selectByDmension = (selector: DimensionSelector, datum: Datum) => {\n const op = selector.operator || selector.op\n const selectorValueArr = Array.isArray(selector.value) ? selector.value : [selector.value]\n switch (op) {\n case 'in':\n if (selectorValueArr.includes(datum[selector.field] as string | number)) {\n return true\n }\n break\n case 'not in':\n if (!selectorValueArr.includes(datum[selector.field] as string | number)) {\n return true\n }\n break\n }\n\n return false\n}\n\nexport const selectByPartial = (selector: PartialDatumSelector, datum: Datum) => {\n return Object.keys(selector).every((key) => datum[key] === selector[key])\n}\n\nexport const selectByValue = (selector: ValueSelector, datum: Datum) => {\n return Object.values(datum).some((v) => v === selector)\n}\n\nconst matchesCellSelector = (cell: Datum, filterRes: TableDynamicFilterRes) => {\n if (filterRes[InnerRowIndex] !== cell[InnerRowIndex]) return false\n return filterRes.field === '*' || Object.keys(cell).includes(filterRes.field)\n}\n\nconst matchesDatum = (target: Datum, candidate: Datum) => {\n return Object.keys(candidate).every((key) => target[key] === candidate[key])\n}\n\n/**\n * 公共方法:检查是否为动态过滤器结构\n */\nconst isDynamicFilterLike = (selector: any, expectedTypes: string[]): boolean => {\n return (\n typeof selector === 'object' &&\n selector !== null &&\n 'type' in selector &&\n expectedTypes.includes(selector.type) &&\n 'code' in selector &&\n typeof selector.code === 'string'\n )\n}\n\n/**\n * 识别是否为row-with-field动态过滤器\n */\nexport const isRowWithFieldDynamicFilter = (selector: any): selector is TableDynamicFilter => {\n return isDynamicFilterLike(selector, ['row-with-field'])\n}\n\n/**\n * 识别是否为数值动态过滤器(用于标注线等场景)\n */\nexport const isValueDynamicFilter = (selector: any): selector is ValueDynamicFilter => {\n return isDynamicFilterLike(selector, ['value'])\n}\n\n/**\n * 识别是否为动态过滤器(通用判断,包含所有类型的动态过滤器)\n */\nexport const isDynamicFilter = (selector: any): selector is DynamicFilter => {\n return isDynamicFilterLike(selector, ['row-with-field', 'value'])\n}\n\n/**\n * 验证动态过滤器执行结果的类型兼容性\n * @description\n * 在主线程中对 Worker 返回值进行类型特定的验证\n * - TableDynamicFilter: 必须返回包含 __row_index 和 field 的对象数组\n * - ChartDynamicFilter: 必须返回任意对象数组\n * - ValueDynamicFilter: 必须返回 number | string\n *\n * @param result Worker 返回的原始结果\n * @param filter 动态过滤器配置\n * @returns 验证是否通过\n * @throws 当验证失败时抛出 TypeError\n */\nconst validateFilterResult = (result: any, filter: DynamicFilter): void => {\n // ValueDynamicFilter:必须返回 number | string\n if (isValueDynamicFilter(filter)) {\n if (typeof result !== 'number' && typeof result !== 'string') {\n throw new TypeError(\n `ValueDynamicFilter must return a number or string, but got: ${typeof result}. ` + `Code: \"${filter.code}\"`,\n )\n }\n return\n }\n\n // TableDynamicFilter 和 ChartDynamicFilter:必须返回对象数组\n if (!Array.isArray(result)) {\n throw new TypeError(\n `${isRowWithFieldDynamicFilter(filter) ? 'TableDynamicFilter' : 'ChartDynamicFilter'} must return an array, ` +\n `but got: ${typeof result}. Code: \"${filter.code}\"`,\n )\n }\n\n // TableDynamicFilter:检查数组元素结构\n if (isRowWithFieldDynamicFilter(filter)) {\n for (let i = 0; i < result.length; i++) {\n const item = result[i]\n if (typeof item !== 'object' || item === null) {\n throw new TypeError(`TableDynamicFilter array element at index ${i} must be an object, got: ${typeof item}`)\n }\n if (!(InnerRowIndex in item) && '__row_index' in item === false) {\n throw new TypeError(\n `TableDynamicFilter array element at index ${i} must contain __row_index or InnerRowIndex field`,\n )\n }\n if (!('field' in item)) {\n throw new TypeError(`TableDynamicFilter array element at index ${i} must contain 'field' field`)\n }\n }\n }\n}\n\n/**\n * 执行动态过滤器代码,获取匹配结果\n * @description\n * 阶段1:执行阶段 - 一次性执行 dynamicFilter.code,获取所有匹配结果\n * - TableDynamicFilter → CellSelector[]\n * - ChartDynamicFilter → PartialDatumSelector[]\n * - ValueDynamicFilter → number | string\n *\n * @param filter 动态过滤器配置\n * @param allData 完整数据集\n * @returns 执行结果数组或标量值\n */\nexport const executeDynamicFilter = async (\n filter: DynamicFilter,\n allData: Datum[],\n): Promise<{ success: boolean; data: DynamicFilterResult; error?: string }> => {\n try {\n const { success, data, error } = await executeFilterCode({\n code: filter.code,\n data: allData,\n })\n\n if (!success) {\n // eslint-disable-next-line no-console\n console.warn('[vseed] Dynamic filter execution failed:', error)\n return {\n success: false,\n data: isRowWithFieldDynamicFilter(filter) ? [] : '',\n error,\n }\n }\n\n // 主线程验证:根据过滤器类型进行特定检查\n try {\n validateFilterResult(data, filter)\n } catch (validationError) {\n // eslint-disable-next-line no-console\n console.error('[vseed] Dynamic filter result validation failed:', validationError)\n return {\n success: false,\n data: isRowWithFieldDynamicFilter(filter) ? [] : '',\n error: validationError instanceof Error ? validationError.message : String(validationError),\n }\n }\n\n return {\n success,\n data: data as DynamicFilterResult,\n }\n } catch (error) {\n // 捕获所有可能的异常:\n // - Worker 不支持\n // - Worker 池初始化/获取失败\n // - validateCodeSafety 验证失败\n // - 数据验证失败\n const errorMessage = error instanceof Error ? error.message : String(error)\n // eslint-disable-next-line no-console\n console.error('[vseed] Dynamic filter execution threw exception:', errorMessage)\n\n return {\n success: false,\n data: isRowWithFieldDynamicFilter(filter) ? [] : '',\n error: errorMessage,\n }\n }\n}\n\n/**\n * 匹配动态过滤器结果\n * @description\n * 阶段2:匹配阶段 - 判断当前 datum/cell 是否在执行结果中\n * - 使用 OR 策略:结果数组中任一项匹配即返回 true\n * - 表格场景:检查 { row, field } 是否在 CellSelector[] 中\n * - 图表场景:检查 datum 的维度值是否匹配 PartialDatumSelector[] 中任一项\n * - 数值场景:不适用(ValueDynamicFilter返回标量值,不用于匹配)\n *\n * @param result 动态过滤器执行结果(CellSelector[] 或 PartialDatumSelector[],不包括 ValueDynamicFilter)\n * @param datum 当前数据项\n * @param selectorType 选择器类型(用于区分表格和图表动态过滤器)\n * @returns 是否匹配(OR 策略)\n */\nexport const matchDynamicFilterResult = (\n result: DynamicFilterResult,\n datum: Datum,\n selectorType: 'table' | 'chart' = 'table',\n): boolean => {\n // ValueDynamicFilter 不应该通过这个函数处理\n if (typeof result === 'number' || typeof result === 'string') {\n throw new Error('matchDynamicFilterResult does not support ValueDynamicFilter results')\n }\n\n if (selectorType === 'table') {\n return result.some((item) => {\n return matchesCellSelector(datum, item as TableDynamicFilterRes)\n })\n }\n return result.some((item) => {\n return matchesDatum(datum, item as PartialDatumSelector)\n })\n}\n\n/**\n * 带有动态过滤器支持的选择器\n * @description\n * 处理流程(两阶段设计):\n *\n * 阶段1 - 执行(Execute):\n * - 在 prepare() 阶段执行,结果写入 dynamicFilter.result\n * - TableDynamicFilter → CellSelector[]\n * - ChartDynamicFilter → PartialDatumSelector[]\n * - ValueDynamicFilter → number | string(用于读取,不用于匹配)\n *\n * 阶段2 - 匹配(Match):\n * - 读取 dynamicFilter.result\n * - 使用 OR 策略:结果数组中任一项匹配即返回 true\n * - 表格:判断 { row, field } 是否在 CellSelector[] 中\n * - 图表:判断 datum 是否匹配 PartialDatumSelector[] 中任一项\n * - 数值:不用于匹配,直接返回 false(数值过滤器在主要用于标注线值,不用于行列选择)\n *\n * @param vchartDatum 单个数据项\n * @param selectorConfig 选择器配置(可包含 DynamicFilter)\n * @param defaultSelector 传统选择器(仅在 DynamicFilter 无结果且有 fallback 时使用)\n * @returns 该数据项是否符合选择条件\n */\nexport const selectorWithDynamicFilter = (\n vchartDatum: Datum,\n selectorConfig: DynamicFilter,\n defaultSelector?: Selector | Selector[] | null,\n): boolean => {\n // 无有效选择器, 则认为全部匹配成功\n if (!selectorConfig) {\n return true\n }\n\n // ValueDynamicFilter 不用于选择,直接返回 false\n if (isValueDynamicFilter(selectorConfig)) {\n if (selectorConfig.fallback) {\n const fallbackSelector = Array.isArray(selectorConfig.fallback)\n ? selectorConfig.fallback\n : [selectorConfig.fallback]\n return selector(vchartDatum, fallbackSelector)\n }\n return defaultSelector ? selector(vchartDatum, defaultSelector) : false\n }\n\n const selectorType = isRowWithFieldDynamicFilter(selectorConfig) ? 'table' : 'chart'\n\n // 优先使用预先执行的结果\n if (selectorConfig.result?.success && selectorConfig.result.data) {\n return matchDynamicFilterResult(selectorConfig.result.data, vchartDatum, selectorType)\n }\n\n if (selectorConfig.fallback) {\n // 如果有 fallback,使用传统 selector 进行匹配\n const fallbackSelector = Array.isArray(selectorConfig.fallback)\n ? selectorConfig.fallback\n : [selectorConfig.fallback]\n return selector(vchartDatum, fallbackSelector)\n }\n\n // 没有结果也没有 fallback,返回 false\n return defaultSelector ? selector(vchartDatum, defaultSelector) : false\n}\n"],"names":["nearlyEqual","a","b","epsilon","Number","diff","Math","selector","vchartDatum","selectorMode","vchartKeys","Object","k","datum","omit","selectors","Array","isValueSelector","selectByValue","isMeasureSelector","selectByMeasure","isDimensionSelector","selectByDmension","isPartialDatumSelector","selectByPartial","op","selectorValueArr","String","key","v","matchesCellSelector","cell","filterRes","InnerRowIndex","matchesDatum","target","candidate","isDynamicFilterLike","expectedTypes","isRowWithFieldDynamicFilter","isValueDynamicFilter","isDynamicFilter","validateFilterResult","result","filter","TypeError","i","item","executeDynamicFilter","allData","success","data","error","executeFilterCode","console","validationError","Error","errorMessage","matchDynamicFilterResult","selectorType","selectorWithDynamicFilter","selectorConfig","defaultSelector","fallbackSelector"],"mappings":"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"}
1
+ {"version":3,"file":"dataSelector/selector.js","sources":["webpack://@visactor/vseed/./src/dataSelector/selector.ts"],"sourcesContent":["import type { Datum } from 'src/types'\nimport type {\n ChartDynamicFilter,\n PartialDatumRes,\n DimensionSelector,\n MeasureSelector,\n PartialDatumSelector,\n Selector,\n Selectors,\n RowWithFieldRes,\n TableDynamicFilter,\n ValueSelector,\n ValueDynamicFilter,\n} from '../types/dataSelector'\nimport { omit } from 'remeda'\nimport { executeFilterCode } from 'src/pipeline/utils/sandbox'\nimport { InnerRowIndex } from 'src/dataReshape'\n\nexport type DynamicFilter = TableDynamicFilter | ChartDynamicFilter | ValueDynamicFilter\nexport type DynamicFilterResult = RowWithFieldRes[] | PartialDatumRes[] | number | string\n\n/**\n * 判断两个数字是否“近似相等”\n */\nfunction nearlyEqual(a: number, b: number, epsilon = 1e-8) {\n // NaN 直接不相等\n if (Number.isNaN(a) || Number.isNaN(b)) return false\n // 引用同一个数 或 完全相等\n if (a === b) return true\n const diff = Math.abs(a - b)\n return diff <= epsilon\n}\n\nexport const selector = (\n vchartDatum: Datum,\n selector: Selector | Selectors | undefined | null,\n selectorMode: 'And' | 'Or' = 'And',\n) => {\n // 无有效选择器, 则认为全部匹配成功\n if (!selector) {\n return true\n }\n\n // 过滤掉 vchart 相关字段\n const vchartKeys = Object.keys(vchartDatum).filter((k) => k.toLocaleLowerCase().startsWith('__vchart'))\n const datum = omit(vchartDatum, vchartKeys) as Datum\n\n // 统一处理选择器为数组\n const selectors = (Array.isArray(selector) ? selector : [selector]) as Selectors\n\n return selectors[selectorMode === 'And' ? 'every' : 'some']((selector) => {\n // 1. 字符串或数字\n if (isValueSelector(selector)) {\n return selectByValue(selector, datum)\n }\n\n // 2. 指标选择器\n else if (isMeasureSelector(selector)) {\n return selectByMeasure(selector, datum)\n }\n // 3. 维度选择器\n else if (isDimensionSelector(selector)) {\n return selectByDmension(selector, datum)\n }\n // 4. 部分数据对象选择器\n else if (isPartialDatumSelector(selector)) {\n return selectByPartial(selector, datum)\n }\n\n return false\n })\n}\n\nexport const isValueSelector = (selector: Selector): selector is ValueSelector => {\n return typeof selector === 'string' || typeof selector === 'number'\n}\n\nexport const isPartialDatumSelector = (selector: Selector): selector is PartialDatumSelector => {\n return typeof selector === 'object' && selector !== null\n}\n\nexport const isMeasureSelector = (selector: Selector): selector is MeasureSelector => {\n return (\n typeof selector === 'object' &&\n selector !== null &&\n 'field' in selector &&\n ('operator' in selector || 'op' in selector) &&\n 'value' in selector &&\n (['=', '==', '!=', '>', '<', '>=', '<=', 'between'].includes(selector.operator as string) ||\n ['=', '==', '!=', '>', '<', '>=', '<=', 'between'].includes(selector.op as string))\n )\n}\n\nexport const isDimensionSelector = (selector: Selector): selector is DimensionSelector => {\n return (\n typeof selector === 'object' &&\n selector !== null &&\n 'field' in selector &&\n ('operator' in selector || 'op' in selector) &&\n 'value' in selector &&\n (['in', 'not in'].includes(selector.operator as string) || ['in', 'not in'].includes(selector.op as string))\n )\n}\n\nexport const selectByMeasure = (selector: MeasureSelector, datum: Datum) => {\n const op = selector.operator || selector.op\n const selectorValueArr = Array.isArray(selector.value) ? selector.value : [selector.value]\n\n switch (op) {\n case '=':\n if (\n String(datum[selector.field]) === String(selectorValueArr[0]) ||\n nearlyEqual(Number(datum[selector.field]), Number(selectorValueArr[0]))\n ) {\n return true\n }\n break\n case '==':\n if (datum[selector.field] === selectorValueArr[0]) {\n return true\n }\n break\n case '!=':\n if (datum[selector.field] !== selectorValueArr[0]) {\n return true\n }\n break\n case '>':\n if (\n datum[selector.field] > selectorValueArr[0] &&\n !nearlyEqual(Number(datum[selector.field]), Number(selectorValueArr[0]))\n ) {\n return true\n }\n break\n case '<':\n if (\n datum[selector.field] < selectorValueArr[0] &&\n !nearlyEqual(Number(datum[selector.field]), Number(selectorValueArr[0]))\n ) {\n return true\n }\n break\n case '>=':\n if (\n datum[selector.field] >= selectorValueArr[0] ||\n nearlyEqual(Number(datum[selector.field]), Number(selectorValueArr[0]))\n ) {\n return true\n }\n break\n case '<=':\n if (\n datum[selector.field] <= selectorValueArr[0] ||\n nearlyEqual(Number(datum[selector.field]), Number(selectorValueArr[0]))\n ) {\n return true\n }\n break\n case 'between':\n if (\n Array.isArray(selector.value) &&\n (datum[selector.field] >= selectorValueArr[0] ||\n nearlyEqual(Number(datum[selector.field]), Number(selectorValueArr[0]))) &&\n (datum[selector.field] <= selectorValueArr[1] ||\n nearlyEqual(Number(datum[selector.field]), Number(selectorValueArr[1])))\n ) {\n return true\n }\n break\n }\n return false\n}\n\nexport const selectByDmension = (selector: DimensionSelector, datum: Datum) => {\n const op = selector.operator || selector.op\n const selectorValueArr = Array.isArray(selector.value) ? selector.value : [selector.value]\n switch (op) {\n case 'in':\n if (selectorValueArr.includes(datum[selector.field] as string | number)) {\n return true\n }\n break\n case 'not in':\n if (!selectorValueArr.includes(datum[selector.field] as string | number)) {\n return true\n }\n break\n }\n\n return false\n}\n\nexport const selectByPartial = (selector: PartialDatumSelector, datum: Datum) => {\n return Object.keys(selector).every((key) => datum[key] === selector[key])\n}\n\nexport const selectByValue = (selector: ValueSelector, datum: Datum) => {\n return Object.values(datum).some((v) => v === selector)\n}\n\nconst matchesCellSelector = (cell: Datum, filterRes: RowWithFieldRes) => {\n if (filterRes[InnerRowIndex] !== cell[InnerRowIndex]) return false\n return filterRes.field === '*' || Object.keys(cell).includes(filterRes.field)\n}\n\nconst matchesDatum = (target: Datum, candidate: Datum) => {\n return Object.keys(candidate).every((key) => target[key] === candidate[key])\n}\n\n/**\n * 公共方法:检查是否为动态过滤器结构\n */\nconst isDynamicFilterLike = (selector: any, expectedTypes: string[]): boolean => {\n return (\n typeof selector === 'object' &&\n selector !== null &&\n 'type' in selector &&\n expectedTypes.includes(selector.type) &&\n 'code' in selector &&\n typeof selector.code === 'string'\n )\n}\n\n/**\n * 识别是否为row-with-field动态过滤器\n */\nexport const isRowWithFieldDynamicFilter = (selector: any): selector is TableDynamicFilter => {\n return isDynamicFilterLike(selector, ['row-with-field'])\n}\n\n/**\n * 识别是否为数值动态过滤器(用于标注线等场景)\n */\nexport const isValueDynamicFilter = (selector: any): selector is ValueDynamicFilter => {\n return isDynamicFilterLike(selector, ['value'])\n}\n\n/**\n * 识别是否为动态过滤器(通用判断,包含所有类型的动态过滤器)\n */\nexport const isDynamicFilter = (selector: any): selector is DynamicFilter => {\n return isDynamicFilterLike(selector, ['row-with-field', 'value'])\n}\n\n/**\n * 验证动态过滤器执行结果的类型兼容性\n * @description\n * 在主线程中对 Worker 返回值进行类型特定的验证\n * - TableDynamicFilter: 必须返回包含 __row_index 和 field 的对象数组\n * - ChartDynamicFilter: 必须返回任意对象数组\n * - ValueDynamicFilter: 必须返回 number | string\n *\n * @param result Worker 返回的原始结果\n * @param filter 动态过滤器配置\n * @returns 验证是否通过\n * @throws 当验证失败时抛出 TypeError\n */\nconst validateFilterResult = (result: any, filter: DynamicFilter): void => {\n // ValueDynamicFilter:必须返回 number | string\n if (isValueDynamicFilter(filter)) {\n if (typeof result !== 'number' && typeof result !== 'string') {\n throw new TypeError(\n `ValueDynamicFilter must return a number or string, but got: ${typeof result}. ` + `Code: \"${filter.code}\"`,\n )\n }\n return\n }\n\n // TableDynamicFilter 和 ChartDynamicFilter:必须返回对象数组\n if (!Array.isArray(result)) {\n throw new TypeError(\n `${isRowWithFieldDynamicFilter(filter) ? 'TableDynamicFilter' : 'ChartDynamicFilter'} must return an array, ` +\n `but got: ${typeof result}. Code: \"${filter.code}\"`,\n )\n }\n\n // TableDynamicFilter:检查数组元素结构\n if (isRowWithFieldDynamicFilter(filter)) {\n for (let i = 0; i < result.length; i++) {\n const item = result[i]\n if (typeof item !== 'object' || item === null) {\n throw new TypeError(`TableDynamicFilter array element at index ${i} must be an object, got: ${typeof item}`)\n }\n if (!(InnerRowIndex in item) && '__row_index' in item === false) {\n throw new TypeError(\n `TableDynamicFilter array element at index ${i} must contain __row_index or InnerRowIndex field`,\n )\n }\n if (!('field' in item)) {\n throw new TypeError(`TableDynamicFilter array element at index ${i} must contain 'field' field`)\n }\n }\n }\n}\n\n/**\n * 执行动态过滤器代码,获取匹配结果\n * @description\n * 阶段1:执行阶段 - 一次性执行 dynamicFilter.code,获取所有匹配结果\n * - TableDynamicFilter → CellSelector[]\n * - ChartDynamicFilter → PartialDatumSelector[]\n * - ValueDynamicFilter → number | string\n *\n * @param filter 动态过滤器配置\n * @param allData 完整数据集\n * @returns 执行结果数组或标量值\n */\nexport const executeDynamicFilter = async (\n filter: DynamicFilter,\n allData: Datum[],\n): Promise<{ success: boolean; data: DynamicFilterResult; error?: string }> => {\n try {\n const { success, data, error } = await executeFilterCode({\n code: filter.code,\n data: allData,\n })\n\n if (!success) {\n // eslint-disable-next-line no-console\n console.warn('[vseed] Dynamic filter execution failed:', error)\n return {\n success: false,\n data: isRowWithFieldDynamicFilter(filter) ? [] : '',\n error,\n }\n }\n\n // 主线程验证:根据过滤器类型进行特定检查\n try {\n validateFilterResult(data, filter)\n } catch (validationError) {\n // eslint-disable-next-line no-console\n console.error('[vseed] Dynamic filter result validation failed:', validationError)\n return {\n success: false,\n data: isRowWithFieldDynamicFilter(filter) ? [] : '',\n error: validationError instanceof Error ? validationError.message : String(validationError),\n }\n }\n\n return {\n success,\n data: data as DynamicFilterResult,\n }\n } catch (error) {\n // 捕获所有可能的异常:\n // - Worker 不支持\n // - Worker 池初始化/获取失败\n // - validateCodeSafety 验证失败\n // - 数据验证失败\n const errorMessage = error instanceof Error ? error.message : String(error)\n // eslint-disable-next-line no-console\n console.error('[vseed] Dynamic filter execution threw exception:', errorMessage)\n\n return {\n success: false,\n data: isRowWithFieldDynamicFilter(filter) ? [] : '',\n error: errorMessage,\n }\n }\n}\n\n/**\n * 匹配动态过滤器结果\n * @description\n * 阶段2:匹配阶段 - 判断当前 datum/cell 是否在执行结果中\n * - 使用 OR 策略:结果数组中任一项匹配即返回 true\n * - 表格场景:检查 { row, field } 是否在 CellSelector[] 中\n * - 图表场景:检查 datum 的维度值是否匹配 PartialDatumSelector[] 中任一项\n * - 数值场景:不适用(ValueDynamicFilter返回标量值,不用于匹配)\n *\n * @param result 动态过滤器执行结果(CellSelector[] 或 PartialDatumSelector[],不包括 ValueDynamicFilter)\n * @param datum 当前数据项\n * @param selectorType 选择器类型(用于区分表格和图表动态过滤器)\n * @returns 是否匹配(OR 策略)\n */\nexport const matchDynamicFilterResult = (\n result: DynamicFilterResult,\n datum: Datum,\n selectorType: 'table' | 'chart' = 'table',\n): boolean => {\n // ValueDynamicFilter 不应该通过这个函数处理\n if (typeof result === 'number' || typeof result === 'string') {\n throw new Error('matchDynamicFilterResult does not support ValueDynamicFilter results')\n }\n\n if (selectorType === 'table') {\n return result.some((item) => {\n return matchesCellSelector(datum, item as RowWithFieldRes)\n })\n }\n return result.some((item) => {\n return matchesDatum(datum, item as PartialDatumSelector)\n })\n}\n\n/**\n * 带有动态过滤器支持的选择器\n * @description\n * 处理流程(两阶段设计):\n *\n * 阶段1 - 执行(Execute):\n * - 在 prepare() 阶段执行,结果写入 dynamicFilter.result\n * - TableDynamicFilter → CellSelector[]\n * - ChartDynamicFilter → PartialDatumSelector[]\n * - ValueDynamicFilter → number | string(用于读取,不用于匹配)\n *\n * 阶段2 - 匹配(Match):\n * - 读取 dynamicFilter.result\n * - 使用 OR 策略:结果数组中任一项匹配即返回 true\n * - 表格:判断 { row, field } 是否在 CellSelector[] 中\n * - 图表:判断 datum 是否匹配 PartialDatumSelector[] 中任一项\n * - 数值:不用于匹配,直接返回 false(数值过滤器在主要用于标注线值,不用于行列选择)\n *\n * @param vchartDatum 单个数据项\n * @param selectorConfig 选择器配置(可包含 DynamicFilter)\n * @param defaultSelector 传统选择器(仅在 DynamicFilter 无结果且有 fallback 时使用)\n * @returns 该数据项是否符合选择条件\n */\nexport const selectorWithDynamicFilter = (\n vchartDatum: Datum,\n selectorConfig: DynamicFilter,\n defaultSelector?: Selector | Selector[] | null,\n): boolean => {\n // 无有效选择器, 则认为全部匹配成功\n if (!selectorConfig) {\n return true\n }\n\n // ValueDynamicFilter 不用于选择,直接返回 false\n if (isValueDynamicFilter(selectorConfig)) {\n if (selectorConfig.fallback) {\n const fallbackSelector = Array.isArray(selectorConfig.fallback)\n ? selectorConfig.fallback\n : [selectorConfig.fallback]\n return selector(vchartDatum, fallbackSelector)\n }\n return defaultSelector ? selector(vchartDatum, defaultSelector) : false\n }\n\n const selectorType = isRowWithFieldDynamicFilter(selectorConfig) ? 'table' : 'chart'\n\n // 优先使用预先执行的结果\n if (selectorConfig.result?.success && selectorConfig.result.data) {\n return matchDynamicFilterResult(selectorConfig.result.data, vchartDatum, selectorType)\n }\n\n if (selectorConfig.fallback) {\n // 如果有 fallback,使用传统 selector 进行匹配\n const fallbackSelector = Array.isArray(selectorConfig.fallback)\n ? selectorConfig.fallback\n : [selectorConfig.fallback]\n return selector(vchartDatum, fallbackSelector)\n }\n\n // 没有结果也没有 fallback,返回 false\n return defaultSelector ? selector(vchartDatum, defaultSelector) : false\n}\n"],"names":["nearlyEqual","a","b","epsilon","Number","diff","Math","selector","vchartDatum","selectorMode","vchartKeys","Object","k","datum","omit","selectors","Array","isValueSelector","selectByValue","isMeasureSelector","selectByMeasure","isDimensionSelector","selectByDmension","isPartialDatumSelector","selectByPartial","op","selectorValueArr","String","key","v","matchesCellSelector","cell","filterRes","InnerRowIndex","matchesDatum","target","candidate","isDynamicFilterLike","expectedTypes","isRowWithFieldDynamicFilter","isValueDynamicFilter","isDynamicFilter","validateFilterResult","result","filter","TypeError","i","item","executeDynamicFilter","allData","success","data","error","executeFilterCode","console","validationError","Error","errorMessage","matchDynamicFilterResult","selectorType","selectorWithDynamicFilter","selectorConfig","defaultSelector","fallbackSelector"],"mappings":"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"}
@@ -34,6 +34,34 @@ const translateMap = {
34
34
  下边界: {
35
35
  'en-US': 'Lower Whisker',
36
36
  'zh-CN': '下边界'
37
+ },
38
+ 总计: {
39
+ 'en-US': 'Total',
40
+ 'zh-CN': '总计'
41
+ },
42
+ 小计: {
43
+ 'en-US': 'Sub Total',
44
+ 'zh-CN': '小计'
45
+ },
46
+ 合计: {
47
+ 'en-US': 'Total',
48
+ 'zh-CN': '合计'
49
+ },
50
+ 平均: {
51
+ 'en-US': 'Average',
52
+ 'zh-CN': '平均'
53
+ },
54
+ 最大值: {
55
+ 'en-US': 'Max',
56
+ 'zh-CN': '最大值'
57
+ },
58
+ 最小值: {
59
+ 'en-US': 'Min',
60
+ 'zh-CN': '最小值'
61
+ },
62
+ 计数: {
63
+ 'en-US': 'Count',
64
+ 'zh-CN': '计数'
37
65
  }
38
66
  };
39
67
  export { translateMap };
@@ -1 +1 @@
1
- {"version":3,"file":"i18n/i18nData.js","sources":["webpack://@visactor/vseed/./src/i18n/i18nData.ts"],"sourcesContent":["import type { TranslateRecordType } from '../types'\n\nexport const translateMap: TranslateRecordType = {\n 指标名称: {\n 'en-US': 'MeasureName',\n 'zh-CN': '指标名称',\n },\n 指标Id: {\n 'en-US': 'MeasureId',\n 'zh-CN': '指标Id',\n },\n 指标值: {\n 'en-US': 'MeasureValue',\n 'zh-CN': '指标值',\n },\n 异常点: {\n 'en-US': 'Outlier',\n 'zh-CN': '异常点',\n },\n 上边界: {\n 'en-US': 'Upper Whisker',\n 'zh-CN': '上边界',\n },\n 上四分位数: {\n 'en-US': 'Q3',\n 'zh-CN': '75分位数',\n },\n 中位数: {\n 'en-US': 'Q2',\n 'zh-CN': '中位数',\n },\n 下四分位数: {\n 'en-US': 'Q1',\n 'zh-CN': '25分位数',\n },\n 下边界: {\n 'en-US': 'Lower Whisker',\n 'zh-CN': '下边界',\n },\n}\n"],"names":["translateMap"],"mappings":"AAEO,MAAMA,eAAoC;IAC/C,MAAM;QACJ,SAAS;QACT,SAAS;IACX;IACA,MAAM;QACJ,SAAS;QACT,SAAS;IACX;IACA,KAAK;QACH,SAAS;QACT,SAAS;IACX;IACA,KAAK;QACH,SAAS;QACT,SAAS;IACX;IACA,KAAK;QACH,SAAS;QACT,SAAS;IACX;IACA,OAAO;QACL,SAAS;QACT,SAAS;IACX;IACA,KAAK;QACH,SAAS;QACT,SAAS;IACX;IACA,OAAO;QACL,SAAS;QACT,SAAS;IACX;IACA,KAAK;QACH,SAAS;QACT,SAAS;IACX;AACF"}
1
+ {"version":3,"file":"i18n/i18nData.js","sources":["webpack://@visactor/vseed/./src/i18n/i18nData.ts"],"sourcesContent":["import type { TranslateRecordType } from '../types'\n\nexport const translateMap: TranslateRecordType = {\n 指标名称: {\n 'en-US': 'MeasureName',\n 'zh-CN': '指标名称',\n },\n 指标Id: {\n 'en-US': 'MeasureId',\n 'zh-CN': '指标Id',\n },\n 指标值: {\n 'en-US': 'MeasureValue',\n 'zh-CN': '指标值',\n },\n 异常点: {\n 'en-US': 'Outlier',\n 'zh-CN': '异常点',\n },\n 上边界: {\n 'en-US': 'Upper Whisker',\n 'zh-CN': '上边界',\n },\n 上四分位数: {\n 'en-US': 'Q3',\n 'zh-CN': '75分位数',\n },\n 中位数: {\n 'en-US': 'Q2',\n 'zh-CN': '中位数',\n },\n 下四分位数: {\n 'en-US': 'Q1',\n 'zh-CN': '25分位数',\n },\n 下边界: {\n 'en-US': 'Lower Whisker',\n 'zh-CN': '下边界',\n },\n 总计: {\n 'en-US': 'Total',\n 'zh-CN': '总计',\n },\n 小计: {\n 'en-US': 'Sub Total',\n 'zh-CN': '小计',\n },\n 合计: {\n 'en-US': 'Total',\n 'zh-CN': '合计',\n },\n 平均: {\n 'en-US': 'Average',\n 'zh-CN': '平均',\n },\n 最大值: {\n 'en-US': 'Max',\n 'zh-CN': '最大值',\n },\n 最小值: {\n 'en-US': 'Min',\n 'zh-CN': '最小值',\n },\n 计数: {\n 'en-US': 'Count',\n 'zh-CN': '计数',\n },\n}\n"],"names":["translateMap"],"mappings":"AAEO,MAAMA,eAAoC;IAC/C,MAAM;QACJ,SAAS;QACT,SAAS;IACX;IACA,MAAM;QACJ,SAAS;QACT,SAAS;IACX;IACA,KAAK;QACH,SAAS;QACT,SAAS;IACX;IACA,KAAK;QACH,SAAS;QACT,SAAS;IACX;IACA,KAAK;QACH,SAAS;QACT,SAAS;IACX;IACA,OAAO;QACL,SAAS;QACT,SAAS;IACX;IACA,KAAK;QACH,SAAS;QACT,SAAS;IACX;IACA,OAAO;QACL,SAAS;QACT,SAAS;IACX;IACA,KAAK;QACH,SAAS;QACT,SAAS;IACX;IACA,IAAI;QACF,SAAS;QACT,SAAS;IACX;IACA,IAAI;QACF,SAAS;QACT,SAAS;IACX;IACA,IAAI;QACF,SAAS;QACT,SAAS;IACX;IACA,IAAI;QACF,SAAS;QACT,SAAS;IACX;IACA,KAAK;QACH,SAAS;QACT,SAAS;IACX;IACA,KAAK;QACH,SAAS;QACT,SAAS;IACX;IACA,IAAI;QACF,SAAS;QACT,SAAS;IACX;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline/advanced/chart/pipes/default/defaultMeasures.js","sources":["webpack://@visactor/vseed/./src/pipeline/advanced/chart/pipes/default/defaultMeasures.ts"],"sourcesContent":["import { clone } from 'remeda'\nimport { InnerRowIndex } from 'src/dataReshape'\nimport type { AdvancedPipe, Datum, Measure } from 'src/types'\n/**\n * @description 如果用户没有配置 measures, 则基于 dataset 构建默认的 measures\n */\nexport const defaultMeasures: AdvancedPipe = (advancedVSeed, context) => {\n const { vseed } = context\n const { measures, dataset } = vseed\n\n if (measures && measures.length > 0) {\n const clonedMeasures = clone(measures)\n\n clonedMeasures.forEach((m: Measure) => {\n m.alias = m.alias ?? m.id\n })\n\n return {\n ...advancedVSeed,\n measures: clonedMeasures,\n }\n }\n\n const top100dataset = dataset.slice(0, 100)\n const sample = top100dataset.reduce<Datum>((prev, cur) => {\n return { ...prev, ...cur }\n }, {})\n const defaultMeasures = Object.keys(sample)\n .filter((key) => {\n return (\n key !== InnerRowIndex &&\n top100dataset.some((item) => typeof item[key] === 'number') &&\n !['', null, undefined].includes(key)\n )\n })\n .map((measure) => ({\n id: measure,\n alias: measure,\n }))\n\n return {\n ...advancedVSeed,\n measures: defaultMeasures,\n }\n}\n"],"names":["defaultMeasures","advancedVSeed","context","vseed","measures","dataset","clonedMeasures","clone","m","top100dataset","sample","prev","cur","Object","key","InnerRowIndex","item","undefined","measure"],"mappings":";;AAMO,MAAMA,kCAAgC,CAACC,eAAeC;IAC3D,MAAM,EAAEC,KAAK,EAAE,GAAGD;IAClB,MAAM,EAAEE,QAAQ,EAAEC,OAAO,EAAE,GAAGF;IAE9B,IAAIC,YAAYA,SAAS,MAAM,GAAG,GAAG;QACnC,MAAME,iBAAiBC,MAAMH;QAE7BE,eAAe,OAAO,CAAC,CAACE;YACtBA,EAAE,KAAK,GAAGA,EAAE,KAAK,IAAIA,EAAE,EAAE;QAC3B;QAEA,OAAO;YACL,GAAGP,aAAa;YAChB,UAAUK;QACZ;IACF;IAEA,MAAMG,gBAAgBJ,QAAQ,KAAK,CAAC,GAAG;IACvC,MAAMK,SAASD,cAAc,MAAM,CAAQ,CAACE,MAAMC,MACzC;YAAE,GAAGD,IAAI;YAAE,GAAGC,GAAG;QAAC,IACxB,CAAC;IACJ,MAAMZ,kBAAkBa,OAAO,IAAI,CAACH,QACjC,MAAM,CAAC,CAACI,MAELA,QAAQC,iBACRN,cAAc,IAAI,CAAC,CAACO,OAAS,AAAqB,YAArB,OAAOA,IAAI,CAACF,IAAI,KAC7C,CAAC;YAAC;YAAI;YAAMG;SAAU,CAAC,QAAQ,CAACH,MAGnC,GAAG,CAAC,CAACI,UAAa;YACjB,IAAIA;YACJ,OAAOA;QACT;IAEF,OAAO;QACL,GAAGjB,aAAa;QAChB,UAAUD;IACZ;AACF"}
1
+ {"version":3,"file":"pipeline/advanced/chart/pipes/default/defaultMeasures.js","sources":["webpack://@visactor/vseed/./src/pipeline/advanced/chart/pipes/default/defaultMeasures.ts"],"sourcesContent":["import { clone } from 'remeda'\nimport { InnerRowIndex } from 'src/dataReshape'\nimport type { AdvancedPipe, Datum, Measure } from 'src/types'\n/**\n * @description 如果用户没有配置 measures, 则基于 dataset 构建默认的 measures\n */\nexport const defaultMeasures: AdvancedPipe = (advancedVSeed, context) => {\n const { vseed } = context\n const { measures, dataset } = vseed\n\n if (measures && measures.length > 0) {\n const clonedMeasures = clone(measures)\n\n clonedMeasures.forEach((m: Measure) => {\n m.alias = m.alias ?? m.id\n })\n\n return {\n ...advancedVSeed,\n measures: clonedMeasures,\n }\n }\n\n const top100dataset = dataset.slice(0, 100)\n const sample = top100dataset.reduce<Datum>((prev, cur) => {\n return { ...prev, ...cur }\n }, {})\n const defaultMeasures = Object.keys(sample)\n .filter((key) => {\n // InnerRowIndex 是prepare阶段 内部注入的行索引字段,不应该作为 measure\n return (\n key !== InnerRowIndex &&\n top100dataset.some((item) => typeof item[key] === 'number') &&\n !['', null, undefined].includes(key)\n )\n })\n .map((measure) => ({\n id: measure,\n alias: measure,\n }))\n\n return {\n ...advancedVSeed,\n measures: defaultMeasures,\n }\n}\n"],"names":["defaultMeasures","advancedVSeed","context","vseed","measures","dataset","clonedMeasures","clone","m","top100dataset","sample","prev","cur","Object","key","InnerRowIndex","item","undefined","measure"],"mappings":";;AAMO,MAAMA,kCAAgC,CAACC,eAAeC;IAC3D,MAAM,EAAEC,KAAK,EAAE,GAAGD;IAClB,MAAM,EAAEE,QAAQ,EAAEC,OAAO,EAAE,GAAGF;IAE9B,IAAIC,YAAYA,SAAS,MAAM,GAAG,GAAG;QACnC,MAAME,iBAAiBC,MAAMH;QAE7BE,eAAe,OAAO,CAAC,CAACE;YACtBA,EAAE,KAAK,GAAGA,EAAE,KAAK,IAAIA,EAAE,EAAE;QAC3B;QAEA,OAAO;YACL,GAAGP,aAAa;YAChB,UAAUK;QACZ;IACF;IAEA,MAAMG,gBAAgBJ,QAAQ,KAAK,CAAC,GAAG;IACvC,MAAMK,SAASD,cAAc,MAAM,CAAQ,CAACE,MAAMC,MACzC;YAAE,GAAGD,IAAI;YAAE,GAAGC,GAAG;QAAC,IACxB,CAAC;IACJ,MAAMZ,kBAAkBa,OAAO,IAAI,CAACH,QACjC,MAAM,CAAC,CAACI,MAGLA,QAAQC,iBACRN,cAAc,IAAI,CAAC,CAACO,OAAS,AAAqB,YAArB,OAAOA,IAAI,CAACF,IAAI,KAC7C,CAAC;YAAC;YAAI;YAAMG;SAAU,CAAC,QAAQ,CAACH,MAGnC,GAAG,CAAC,CAACI,UAAa;YACjB,IAAIA;YACJ,OAAOA;QACT;IAEF,OAAO;QACL,GAAGjB,aAAa;QAChB,UAAUD;IACZ;AACF"}
@@ -16,7 +16,8 @@ const pivotTableConfig = (advancedVSeed, context)=>{
16
16
  'hoverHeaderBackgroundColor',
17
17
  'hoverHeaderInlineBackgroundColor',
18
18
  'selectedBorderColor',
19
- 'selectedBackgroundColor'
19
+ 'selectedBackgroundColor',
20
+ 'totals'
20
21
  ]);
21
22
  result.config = {
22
23
  ...result.config || {},
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline/advanced/table/pipes/config/pivotTableConfig.js","sources":["webpack://@visactor/vseed/./src/pipeline/advanced/table/pipes/config/pivotTableConfig.ts"],"sourcesContent":["import { pick } from 'remeda'\nimport type { AdvancedPipe, Config } from 'src/types'\n\nexport const pivotTableConfig: AdvancedPipe = (advancedVSeed, context) => {\n const { vseed } = context\n const { chartType } = vseed\n const result = {\n ...advancedVSeed,\n }\n\n const config = pick(vseed, [\n 'backgroundColor',\n 'bodyFontSize',\n 'bodyFontColor',\n 'bodyBackgroundColor',\n 'headerFontSize',\n 'headerFontColor',\n 'headerBackgroundColor',\n 'hoverHeaderBackgroundColor',\n 'hoverHeaderInlineBackgroundColor',\n 'selectedBorderColor',\n 'selectedBackgroundColor',\n ]) as Config['table']\n\n result.config = {\n ...(result.config || {}),\n [chartType]: {\n ...config,\n },\n }\n\n return result\n}\n"],"names":["pivotTableConfig","advancedVSeed","context","vseed","chartType","result","config","pick"],"mappings":";AAGO,MAAMA,mBAAiC,CAACC,eAAeC;IAC5D,MAAM,EAAEC,KAAK,EAAE,GAAGD;IAClB,MAAM,EAAEE,SAAS,EAAE,GAAGD;IACtB,MAAME,SAAS;QACb,GAAGJ,aAAa;IAClB;IAEA,MAAMK,SAASC,KAAKJ,OAAO;QACzB;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;KACD;IAEDE,OAAO,MAAM,GAAG;QACd,GAAIA,OAAO,MAAM,IAAI,CAAC,CAAC;QACvB,CAACD,UAAU,EAAE;YACX,GAAGE,MAAM;QACX;IACF;IAEA,OAAOD;AACT"}
1
+ {"version":3,"file":"pipeline/advanced/table/pipes/config/pivotTableConfig.js","sources":["webpack://@visactor/vseed/./src/pipeline/advanced/table/pipes/config/pivotTableConfig.ts"],"sourcesContent":["import { pick } from 'remeda'\nimport type { AdvancedPipe, Config } from 'src/types'\n\nexport const pivotTableConfig: AdvancedPipe = (advancedVSeed, context) => {\n const { vseed } = context\n const { chartType } = vseed\n const result = {\n ...advancedVSeed,\n }\n\n const config = pick(vseed, [\n 'backgroundColor',\n 'bodyFontSize',\n 'bodyFontColor',\n 'bodyBackgroundColor',\n 'headerFontSize',\n 'headerFontColor',\n 'headerBackgroundColor',\n 'hoverHeaderBackgroundColor',\n 'hoverHeaderInlineBackgroundColor',\n 'selectedBorderColor',\n 'selectedBackgroundColor',\n 'totals',\n ]) as Config['table']\n\n result.config = {\n ...(result.config || {}),\n [chartType]: {\n ...config,\n },\n }\n\n return result\n}\n"],"names":["pivotTableConfig","advancedVSeed","context","vseed","chartType","result","config","pick"],"mappings":";AAGO,MAAMA,mBAAiC,CAACC,eAAeC;IAC5D,MAAM,EAAEC,KAAK,EAAE,GAAGD;IAClB,MAAM,EAAEE,SAAS,EAAE,GAAGD;IACtB,MAAME,SAAS;QACb,GAAGJ,aAAa;IAClB;IAEA,MAAMK,SAASC,KAAKJ,OAAO;QACzB;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;KACD;IAEDE,OAAO,MAAM,GAAG;QACd,GAAIA,OAAO,MAAM,IAAI,CAAC,CAAC;QACvB,CAACD,UAAU,EAAE;YACX,GAAGE,MAAM;QACX;IACF;IAEA,OAAOD;AACT"}
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline/advanced/table/pipes/default/defaultMeasures.js","sources":["webpack://@visactor/vseed/./src/pipeline/advanced/table/pipes/default/defaultMeasures.ts"],"sourcesContent":["import { clone } from 'remeda'\nimport { InnerRowIndex } from 'src/dataReshape'\nimport { isMeasure, preorderTraverse } from 'src/pipeline/utils'\nimport type { AdvancedPipe, Datum, Measure } from 'src/types'\n\n/**\n * @description 如果用户没有配置 measures, 则基于 dataset 构建默认的 measures\n */\nexport const defaultMeasures: AdvancedPipe = (advancedVSeed, context) => {\n const { vseed } = context\n const { measures, dataset } = vseed\n\n if (measures && measures.length > 0) {\n const clonedMeasures = clone(measures)\n preorderTraverse<Measure>(clonedMeasures as unknown as Measure[], (node) => {\n if (isMeasure(node)) {\n node.alias = node.alias || node.id\n }\n return false\n })\n return {\n ...advancedVSeed,\n measureTree: clonedMeasures,\n }\n }\n\n const top100dataset = dataset.slice(0, 100)\n const sample = top100dataset.reduce<Datum>((prev, cur) => {\n return { ...prev, ...cur }\n }, {})\n const defaultMeasures = Object.keys(sample)\n .filter((key) => {\n return (\n key !== InnerRowIndex &&\n top100dataset.some((item) => typeof item[key] === 'number') &&\n !['', null, undefined].includes(key)\n )\n })\n .map((measure) => ({\n id: measure,\n alias: measure,\n }))\n\n return {\n ...advancedVSeed,\n measureTree: defaultMeasures,\n }\n}\n"],"names":["defaultMeasures","advancedVSeed","context","vseed","measures","dataset","clonedMeasures","clone","preorderTraverse","node","isMeasure","top100dataset","sample","prev","cur","Object","key","InnerRowIndex","item","undefined","measure"],"mappings":";;;AAQO,MAAMA,kCAAgC,CAACC,eAAeC;IAC3D,MAAM,EAAEC,KAAK,EAAE,GAAGD;IAClB,MAAM,EAAEE,QAAQ,EAAEC,OAAO,EAAE,GAAGF;IAE9B,IAAIC,YAAYA,SAAS,MAAM,GAAG,GAAG;QACnC,MAAME,iBAAiBC,MAAMH;QAC7BI,iBAA0BF,gBAAwC,CAACG;YACjE,IAAIC,UAAUD,OACZA,KAAK,KAAK,GAAGA,KAAK,KAAK,IAAIA,KAAK,EAAE;YAEpC,OAAO;QACT;QACA,OAAO;YACL,GAAGR,aAAa;YAChB,aAAaK;QACf;IACF;IAEA,MAAMK,gBAAgBN,QAAQ,KAAK,CAAC,GAAG;IACvC,MAAMO,SAASD,cAAc,MAAM,CAAQ,CAACE,MAAMC,MACzC;YAAE,GAAGD,IAAI;YAAE,GAAGC,GAAG;QAAC,IACxB,CAAC;IACJ,MAAMd,kBAAkBe,OAAO,IAAI,CAACH,QACjC,MAAM,CAAC,CAACI,MAELA,QAAQC,iBACRN,cAAc,IAAI,CAAC,CAACO,OAAS,AAAqB,YAArB,OAAOA,IAAI,CAACF,IAAI,KAC7C,CAAC;YAAC;YAAI;YAAMG;SAAU,CAAC,QAAQ,CAACH,MAGnC,GAAG,CAAC,CAACI,UAAa;YACjB,IAAIA;YACJ,OAAOA;QACT;IAEF,OAAO;QACL,GAAGnB,aAAa;QAChB,aAAaD;IACf;AACF"}
1
+ {"version":3,"file":"pipeline/advanced/table/pipes/default/defaultMeasures.js","sources":["webpack://@visactor/vseed/./src/pipeline/advanced/table/pipes/default/defaultMeasures.ts"],"sourcesContent":["import { clone } from 'remeda'\nimport { InnerRowIndex } from 'src/dataReshape'\nimport { isMeasure, preorderTraverse } from 'src/pipeline/utils'\nimport type { AdvancedPipe, Datum, Measure } from 'src/types'\n\n/**\n * @description 如果用户没有配置 measures, 则基于 dataset 构建默认的 measures\n */\nexport const defaultMeasures: AdvancedPipe = (advancedVSeed, context) => {\n const { vseed } = context\n const { measures, dataset } = vseed\n\n if (measures && measures.length > 0) {\n const clonedMeasures = clone(measures)\n preorderTraverse<Measure>(clonedMeasures as unknown as Measure[], (node) => {\n if (isMeasure(node)) {\n node.alias = node.alias || node.id\n }\n return false\n })\n return {\n ...advancedVSeed,\n measureTree: clonedMeasures,\n }\n }\n\n const top100dataset = dataset.slice(0, 100)\n const sample = top100dataset.reduce<Datum>((prev, cur) => {\n return { ...prev, ...cur }\n }, {})\n const defaultMeasures = Object.keys(sample)\n .filter((key) => {\n // InnerRowIndex 是prepare阶段 内部注入的行索引字段,不应该作为 measure\n return (\n key !== InnerRowIndex &&\n top100dataset.some((item) => typeof item[key] === 'number') &&\n !['', null, undefined].includes(key)\n )\n })\n .map((measure) => ({\n id: measure,\n alias: measure,\n }))\n\n return {\n ...advancedVSeed,\n measureTree: defaultMeasures,\n }\n}\n"],"names":["defaultMeasures","advancedVSeed","context","vseed","measures","dataset","clonedMeasures","clone","preorderTraverse","node","isMeasure","top100dataset","sample","prev","cur","Object","key","InnerRowIndex","item","undefined","measure"],"mappings":";;;AAQO,MAAMA,kCAAgC,CAACC,eAAeC;IAC3D,MAAM,EAAEC,KAAK,EAAE,GAAGD;IAClB,MAAM,EAAEE,QAAQ,EAAEC,OAAO,EAAE,GAAGF;IAE9B,IAAIC,YAAYA,SAAS,MAAM,GAAG,GAAG;QACnC,MAAME,iBAAiBC,MAAMH;QAC7BI,iBAA0BF,gBAAwC,CAACG;YACjE,IAAIC,UAAUD,OACZA,KAAK,KAAK,GAAGA,KAAK,KAAK,IAAIA,KAAK,EAAE;YAEpC,OAAO;QACT;QACA,OAAO;YACL,GAAGR,aAAa;YAChB,aAAaK;QACf;IACF;IAEA,MAAMK,gBAAgBN,QAAQ,KAAK,CAAC,GAAG;IACvC,MAAMO,SAASD,cAAc,MAAM,CAAQ,CAACE,MAAMC,MACzC;YAAE,GAAGD,IAAI;YAAE,GAAGC,GAAG;QAAC,IACxB,CAAC;IACJ,MAAMd,kBAAkBe,OAAO,IAAI,CAACH,QACjC,MAAM,CAAC,CAACI,MAGLA,QAAQC,iBACRN,cAAc,IAAI,CAAC,CAACO,OAAS,AAAqB,YAArB,OAAOA,IAAI,CAACF,IAAI,KAC7C,CAAC;YAAC;YAAI;YAAMG;SAAU,CAAC,QAAQ,CAACH,MAGnC,GAAG,CAAC,CAACI,UAAa;YACjB,IAAIA;YACJ,OAAOA;QACT;IAEF,OAAO;QACL,GAAGnB,aAAa;QAChB,aAAaD;IACf;AACF"}
@@ -1,6 +1,6 @@
1
1
  import { DATUM_HIDE_KEY, createFormatter, createFormatterByMeasure, findMeasureById } from "../../../../utils/index.js";
2
2
  import { isNumber, merge, uniqueBy } from "remeda";
3
- import { selector } from "../../../../../dataSelector/index.js";
3
+ import { selector, selectorWithDynamicFilter } from "../../../../../dataSelector/index.js";
4
4
  import { MeasureId } from "../../../../../dataReshape/constant.js";
5
5
  const label_label = (spec, context)=>{
6
6
  const result = {
@@ -45,7 +45,11 @@ const buildLabel = (label, vseedMeasures = [], vseedDimensions = [], advancedVSe
45
45
  const percentFormatter = createFormatter(percentFormat);
46
46
  const result = {
47
47
  visible: enable,
48
- dataFilter: (data)=>data.filter((entry)=>entry.data?.[DATUM_HIDE_KEY] !== true && selector(entry.data, label.selector, 'Or')),
48
+ dataFilter: (data)=>data.filter((entry)=>{
49
+ if (entry.data?.[DATUM_HIDE_KEY]) return false;
50
+ const shouldApply = label.dynamicFilter ? selectorWithDynamicFilter(entry.data, label.dynamicFilter, label.selector) : selector(entry.data, label.selector, 'Or');
51
+ return shouldApply;
52
+ }),
49
53
  formatMethod: (_, datum)=>{
50
54
  const result = [];
51
55
  const dimLabels = labelDims.map((item)=>{