@visactor/vseed 0.4.27 → 0.4.28

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 (36) hide show
  1. package/dist/cjs/index.cjs +2 -2
  2. package/dist/cjs/index.cjs.map +1 -1
  3. package/dist/esm/pipeline/spec/chart/pipes/annotation/annotationDifferenceLine.js +63 -10
  4. package/dist/esm/pipeline/spec/chart/pipes/annotation/annotationDifferenceLine.js.map +1 -1
  5. package/dist/esm/pipeline/spec/chart/pipes/annotation/annotationPointCommon.d.ts +1 -0
  6. package/dist/esm/pipeline/spec/chart/pipes/annotation/annotationPointCommon.js +8 -3
  7. package/dist/esm/pipeline/spec/chart/pipes/annotation/annotationPointCommon.js.map +1 -1
  8. package/dist/esm/pipeline/spec/chart/pipes/annotation/annotationPointOfDualAxis.js +3 -3
  9. package/dist/esm/pipeline/spec/chart/pipes/annotation/annotationPointOfDualAxis.js.map +1 -1
  10. package/dist/esm/types/chartType/area/zArea.d.ts +2 -0
  11. package/dist/esm/types/chartType/areaPercent/zAreaPercent.d.ts +2 -0
  12. package/dist/esm/types/chartType/bar/zBar.d.ts +2 -0
  13. package/dist/esm/types/chartType/barParallel/zBarParallel.d.ts +2 -0
  14. package/dist/esm/types/chartType/barPercent/zBarPercent.d.ts +2 -0
  15. package/dist/esm/types/chartType/boxPlot/zBoxPlot.d.ts +2 -0
  16. package/dist/esm/types/chartType/column/zColumn.d.ts +2 -0
  17. package/dist/esm/types/chartType/columnParallel/zColumnParallel.d.ts +2 -0
  18. package/dist/esm/types/chartType/columnPercent/zColumnPercent.d.ts +2 -0
  19. package/dist/esm/types/chartType/dualAxis/zDualAxis.d.ts +2 -0
  20. package/dist/esm/types/chartType/histogram/zHistogram.d.ts +2 -0
  21. package/dist/esm/types/chartType/line/zLine.d.ts +2 -0
  22. package/dist/esm/types/chartType/raceBar/zRaceBar.d.ts +2 -0
  23. package/dist/esm/types/chartType/raceColumn/zRaceColumn.d.ts +2 -0
  24. package/dist/esm/types/chartType/raceLine/zRaceLine.d.ts +2 -0
  25. package/dist/esm/types/chartType/raceScatter/zRaceScatter.d.ts +2 -0
  26. package/dist/esm/types/chartType/scatter/zScatter.d.ts +2 -0
  27. package/dist/esm/types/properties/annotation/annotation.d.ts +2 -0
  28. package/dist/esm/types/properties/annotation/annotationPoint.d.ts +4 -0
  29. package/dist/esm/types/properties/annotation/zAnnotationPoint.d.ts +1 -0
  30. package/dist/esm/types/properties/annotation/zAnnotationPoint.js +1 -0
  31. package/dist/esm/types/properties/annotation/zAnnotationPoint.js.map +1 -1
  32. package/dist/esm/types/properties/config/annotation/zAnnotation.js +1 -0
  33. package/dist/esm/types/properties/config/annotation/zAnnotation.js.map +1 -1
  34. package/dist/umd/index.js +78 -28
  35. package/dist/umd/index.js.map +1 -1
  36. package/package.json +2 -2
@@ -2,18 +2,19 @@ import { autoFormatter, createFormatter, findAllMeasures } from "../../../../uti
2
2
  import { isDimensionSelector, isFieldSelector, isMeasureSelector, isPartialDatumSelector } from "../../../../../dataSelector/index.js";
3
3
  import { isEmpty } from "remeda";
4
4
  import { ANNOTATION_Z_INDEX } from "../../../../utils/constant.js";
5
- import { buildDifferenceCoordinateDatum, buildDifferenceText, getDifferenceLineStackResolveMode, getRuntimeDifferenceValue, inferDifferenceBracketDirection, inferDifferenceConnectDirection, resolveDifferenceAnchor, usesDifferenceLineElementStackEnd } from "./annotationDifferenceLineCommon.js";
5
+ import { buildDifferenceCoordinateDatum, buildDifferenceText, getDifferenceLineStackResolveMode, getRuntimeDifferenceValue, resolveDifferenceAnchor, usesDifferenceLineElementStackEnd } from "./annotationDifferenceLineCommon.js";
6
6
  const DEFAULT_LINE_COLOR = '#BCC1CB';
7
7
  const DEFAULT_TEXT_COLOR = '#ffffff';
8
8
  const DEFAULT_TEXT_BACKGROUND_COLOR = '#BCC1CB';
9
9
  const DEFAULT_TEXT_FONT_SIZE = 12;
10
- const DEFAULT_EXPAND_DISTANCE = 24;
11
10
  const DEFAULT_LINE_WIDTH = 2;
12
11
  const DEFAULT_CORNER_RADIUS = 4;
13
12
  const DEFAULT_LABEL_PADDING = 4;
14
13
  const DEFAULT_END_SYMBOL_SIZE = 12;
15
14
  const DEFAULT_END_SYMBOL_REF_X = -4;
16
- const DEFAULT_BRACKET_EXPAND_DISTANCE = 80;
15
+ const DEFAULT_GUTTER_BASE_OFFSET = 20;
16
+ const DEFAULT_GUTTER_RIGHT_PADDING = 44;
17
+ const DEFAULT_GUTTER_TOP_PADDING = 36;
17
18
  const DEFAULT_BRACKET_LINE_DASH = [
18
19
  2,
19
20
  2
@@ -29,6 +30,54 @@ const toArray = (value)=>{
29
30
  value
30
31
  ];
31
32
  };
33
+ const normalizeRegionPadding = (padding)=>{
34
+ if ('number' == typeof padding) return {
35
+ top: padding,
36
+ right: padding,
37
+ bottom: padding,
38
+ left: padding
39
+ };
40
+ return {
41
+ top: padding?.top ?? 0,
42
+ right: padding?.right ?? 0,
43
+ bottom: padding?.bottom ?? 0,
44
+ left: padding?.left ?? 0
45
+ };
46
+ };
47
+ const mergeDifferenceLineRegionPadding = (spec, paddingPatch)=>{
48
+ const region = spec.region;
49
+ if (!Array.isArray(region) || 0 === region.length) return spec;
50
+ const mergedPadding = normalizeRegionPadding(region[0].padding);
51
+ if (void 0 !== paddingPatch.top) mergedPadding.top = Math.max(mergedPadding.top, paddingPatch.top);
52
+ if (void 0 !== paddingPatch.right) mergedPadding.right = Math.max(mergedPadding.right, paddingPatch.right);
53
+ if (void 0 !== paddingPatch.bottom) mergedPadding.bottom = Math.max(mergedPadding.bottom, paddingPatch.bottom);
54
+ if (void 0 !== paddingPatch.left) mergedPadding.left = Math.max(mergedPadding.left, paddingPatch.left);
55
+ return {
56
+ ...spec,
57
+ region: [
58
+ {
59
+ ...region[0],
60
+ padding: mergedPadding
61
+ },
62
+ ...region.slice(1)
63
+ ]
64
+ };
65
+ };
66
+ const buildFixedGutterExpandDistance = (isHorizontalChart)=>(_markerData, context)=>{
67
+ const region = context?.region;
68
+ const coordinatePoints = Array.isArray(context?.coordinatePoints) ? context.coordinatePoints : [];
69
+ if (!region || 0 === coordinatePoints.length) return 0;
70
+ const { x: regionStartX, y: regionStartY } = region.getLayoutStartPoint();
71
+ const { width } = region.getLayoutRect();
72
+ if (isHorizontalChart) {
73
+ const targetY = regionStartY - DEFAULT_GUTTER_BASE_OFFSET;
74
+ const minY = Math.min(...coordinatePoints.map((point)=>point.y));
75
+ return Math.max(0, minY - targetY);
76
+ }
77
+ const targetX = regionStartX + width + DEFAULT_GUTTER_BASE_OFFSET;
78
+ const maxX = Math.max(...coordinatePoints.map((point)=>point.x));
79
+ return Math.max(0, targetX - maxX);
80
+ };
32
81
  const getAxisFormatter = (spec)=>{
33
82
  const valueAxisOrient = 'horizontal' === spec.direction ? 'bottom' : 'left';
34
83
  const formatMethod = spec.axes?.find((axis)=>axis.orient === valueAxisOrient)?.label?.formatMethod;
@@ -96,6 +145,7 @@ const annotationDifferenceLine_annotationDifferenceLine = (spec, context)=>{
96
145
  const measureIds = measures.map((measure)=>measure.id);
97
146
  const axisFormatter = getAxisFormatter(chartSpec);
98
147
  const percentFormatter = createFormatter(DEFAULT_PERCENT_DIFFERENCE_FORMAT);
148
+ const isHorizontalChart = 'horizontal' === chartSpec.direction;
99
149
  const markLine = annotationDifferenceLineList.flatMap((annotationDifferenceLine, index)=>{
100
150
  try {
101
151
  assertDifferenceLineConfig(annotationDifferenceLine, getDifferenceLinePath(index, annotationDifferenceLineList.length));
@@ -119,11 +169,8 @@ const annotationDifferenceLine_annotationDifferenceLine = (spec, context)=>{
119
169
  if (start.mode !== end.mode) return [];
120
170
  const usesRuntimeStackEnd = useElementStackEnd || ('column' === vseed.chartType || 'bar' === vseed.chartType) && 'element' === start.mode && 'auto' === stackResolveMode;
121
171
  const useBracketStyle = isBracketChart || ('column' === vseed.chartType || 'bar' === vseed.chartType) && 'element' === start.mode && 'auto' === stackResolveMode;
122
- const isStackedBarElementBracket = 'bar' === vseed.chartType && 'element' === start.mode && 'auto' === stackResolveMode;
123
- const connectDirection = useBracketStyle ? isStackedBarElementBracket ? 'top' : inferDifferenceBracketDirection(start, end) : inferDifferenceConnectDirection(vseed, [
124
- start.value,
125
- end.value
126
- ]);
172
+ const connectDirection = isHorizontalChart ? 'top' : 'right';
173
+ const expandDistance = buildFixedGutterExpandDistance(isHorizontalChart);
127
174
  const lineColor = annotationDifferenceLine.lineColor ?? theme?.lineColor ?? DEFAULT_LINE_COLOR;
128
175
  const textColor = annotationDifferenceLine.textColor ?? theme?.textColor ?? DEFAULT_TEXT_COLOR;
129
176
  const textBackgroundColor = annotationDifferenceLine.textBackgroundColor ?? theme?.textBackgroundColor ?? DEFAULT_TEXT_BACKGROUND_COLOR;
@@ -195,7 +242,7 @@ const annotationDifferenceLine_annotationDifferenceLine = (spec, context)=>{
195
242
  autoRange: true,
196
243
  zIndex: ANNOTATION_Z_INDEX,
197
244
  connectDirection,
198
- expandDistance: useBracketStyle ? DEFAULT_BRACKET_EXPAND_DISTANCE : DEFAULT_EXPAND_DISTANCE,
245
+ expandDistance,
199
246
  coordinates: (seriesData, relativeSeries)=>{
200
247
  try {
201
248
  return [
@@ -268,13 +315,19 @@ const annotationDifferenceLine_annotationDifferenceLine = (spec, context)=>{
268
315
  }
269
316
  });
270
317
  const specMarkLine = chartSpec.markLine || [];
271
- return {
318
+ const nextSpec = {
272
319
  ...spec,
273
320
  markLine: [
274
321
  ...specMarkLine,
275
322
  ...markLine
276
323
  ]
277
324
  };
325
+ if (0 === markLine.length) return nextSpec;
326
+ return mergeDifferenceLineRegionPadding(nextSpec, isHorizontalChart ? {
327
+ top: DEFAULT_GUTTER_TOP_PADDING
328
+ } : {
329
+ right: DEFAULT_GUTTER_RIGHT_PADDING
330
+ });
278
331
  };
279
332
  export { annotationDifferenceLine_annotationDifferenceLine as annotationDifferenceLine };
280
333
 
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline/spec/chart/pipes/annotation/annotationDifferenceLine.js","sources":["../../../../../../../src/pipeline/spec/chart/pipes/annotation/annotationDifferenceLine.ts"],"sourcesContent":["import type { IAreaChartSpec, IBarChartSpec, ICartesianSeries, ILineChartSpec, IMarkLineSpec } from '@visactor/vchart'\nimport type { AnnotationDifferenceLine, Measure, VChartSpecPipe } from 'src/types'\nimport { createFormatter, findAllMeasures, autoFormatter } from '../../../../utils'\nimport {\n isDimensionSelector,\n isFieldSelector,\n isMeasureSelector,\n isPartialDatumSelector,\n} from '../../../../../dataSelector'\nimport { isEmpty } from 'remeda'\nimport { ANNOTATION_Z_INDEX } from '../../../../utils/constant'\nimport {\n buildDifferenceCoordinateDatum,\n buildDifferenceText,\n getDifferenceLineStackResolveMode,\n getRuntimeDifferenceValue,\n inferDifferenceBracketDirection,\n inferDifferenceConnectDirection,\n type ResolvedDifferenceAnchor,\n usesDifferenceLineElementStackEnd,\n resolveDifferenceAnchor,\n} from './annotationDifferenceLineCommon'\n\nconst DEFAULT_LINE_COLOR = '#BCC1CB'\nconst DEFAULT_TEXT_COLOR = '#ffffff'\nconst DEFAULT_TEXT_BACKGROUND_COLOR = '#BCC1CB'\nconst DEFAULT_TEXT_FONT_SIZE = 12\nconst DEFAULT_EXPAND_DISTANCE = 24\nconst DEFAULT_LINE_WIDTH = 2\nconst DEFAULT_CORNER_RADIUS = 4\nconst DEFAULT_LABEL_PADDING = 4\nconst DEFAULT_END_SYMBOL_SIZE = 12\nconst DEFAULT_END_SYMBOL_REF_X = -4\nconst DEFAULT_BRACKET_EXPAND_DISTANCE = 80\nconst DEFAULT_BRACKET_LINE_DASH: [number, number] = [2, 2]\nconst DEFAULT_PERCENT_DIFFERENCE_FORMAT = {\n type: 'percent' as const,\n fractionDigits: 2,\n}\n\nconst getDifferenceLinePath = (index: number, total: number) =>\n total === 1 ? 'annotationDifferenceLine' : `annotationDifferenceLine[${index}]`\n\nconst toArray = <T>(value: T | T[] | undefined | null): T[] => {\n if (Array.isArray(value)) {\n return value\n }\n\n return value === undefined || value === null ? [] : [value]\n}\n\nconst getAxisFormatter = (spec: IBarChartSpec | ILineChartSpec | IAreaChartSpec) => {\n const valueAxisOrient = spec.direction === 'horizontal' ? 'bottom' : 'left'\n const formatMethod = spec.axes?.find((axis) => axis.orient === valueAxisOrient)?.label?.formatMethod\n\n return typeof formatMethod === 'function'\n ? (value: number) => String(formatMethod(value as never) ?? value)\n : undefined\n}\n\nconst getExplicitMeasureFormat = (measure?: Measure) => {\n if (measure?.numFormat && !isEmpty(measure.numFormat)) {\n return measure.numFormat\n }\n\n if (measure?.format && !isEmpty(measure.format)) {\n return measure.format\n }\n\n return undefined\n}\n\nconst inferMeasureIdFromDatum = (anchor: ResolvedDifferenceAnchor, measureIds: string[]) => {\n const candidateValues = [anchor.matchedDatum, anchor.coordinateDatum]\n\n for (const datum of candidateValues) {\n if (!datum) {\n continue\n }\n\n const candidates = measureIds.filter((measureId) => Number(datum[measureId]) === anchor.value)\n\n if (candidates.length === 1) {\n return candidates[0]\n }\n }\n\n return undefined\n}\n\nconst inferMeasureIdFromSelector = (\n selectorValue: AnnotationDifferenceLine['start']['selector'],\n measureIdSet: Set<string>,\n) => {\n const matchedMeasureIds = new Set<string>()\n\n for (const currentSelector of toArray(selectorValue)) {\n if (isMeasureSelector(currentSelector)) {\n if (measureIdSet.has(currentSelector.field)) {\n matchedMeasureIds.add(currentSelector.field)\n }\n continue\n }\n\n if (isFieldSelector(currentSelector) || isDimensionSelector(currentSelector)) {\n continue\n }\n\n if (isPartialDatumSelector(currentSelector)) {\n Object.keys(currentSelector).forEach((field) => {\n if (measureIdSet.has(field)) {\n matchedMeasureIds.add(field)\n }\n })\n }\n }\n\n return matchedMeasureIds.size === 1 ? Array.from(matchedMeasureIds)[0] : undefined\n}\n\nconst resolveDifferenceMeasureId = (\n anchor: ResolvedDifferenceAnchor,\n selectorValue: AnnotationDifferenceLine['start']['selector'],\n measureIds: string[],\n) => {\n if (anchor.mode !== 'element') {\n return undefined\n }\n\n if (measureIds.length === 1) {\n return measureIds[0]\n }\n\n const measureIdSet = new Set(measureIds)\n return inferMeasureIdFromSelector(selectorValue, measureIdSet) ?? inferMeasureIdFromDatum(anchor, measureIds)\n}\n\nconst assertDifferenceLineConfig: (value: unknown, path: string) => asserts value is AnnotationDifferenceLine = (\n value,\n path,\n) => {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n throw new Error(`${path} must be an object`)\n }\n\n const start = (value as Record<string, unknown>).start\n if (typeof start !== 'object' || start === null || Array.isArray(start)) {\n throw new Error(`${path}.start is required`)\n }\n if ((start as Record<string, unknown>).selector == null) {\n throw new Error(`${path}.start.selector is required`)\n }\n\n const end = (value as Record<string, unknown>).end\n if (typeof end !== 'object' || end === null || Array.isArray(end)) {\n throw new Error(`${path}.end is required`)\n }\n if ((end as Record<string, unknown>).selector == null) {\n throw new Error(`${path}.end.selector is required`)\n }\n}\n\nexport const annotationDifferenceLine: VChartSpecPipe = (spec, context) => {\n const { advancedVSeed, vseed } = context\n const annotationDifferenceLine = advancedVSeed.annotation?.annotationDifferenceLine\n\n if (!annotationDifferenceLine) {\n return spec\n }\n\n const theme = advancedVSeed.config?.[vseed.chartType as 'column']?.annotation?.annotationDifferenceLine\n const annotationDifferenceLineList = Array.isArray(annotationDifferenceLine)\n ? annotationDifferenceLine\n : [annotationDifferenceLine]\n const dataset = advancedVSeed.dataset.flat()\n const chartSpec = spec as IBarChartSpec | ILineChartSpec | IAreaChartSpec\n const stackResolveMode = getDifferenceLineStackResolveMode(vseed, advancedVSeed)\n const useElementStackEnd = usesDifferenceLineElementStackEnd(vseed, advancedVSeed)\n const isBracketChart = vseed.chartType === 'line' || vseed.chartType === 'area'\n const measures = findAllMeasures(advancedVSeed.measures)\n const measureIds = measures.map((measure) => measure.id)\n const axisFormatter = getAxisFormatter(chartSpec)\n const percentFormatter = createFormatter(DEFAULT_PERCENT_DIFFERENCE_FORMAT)\n\n const markLine = annotationDifferenceLineList.flatMap((annotationDifferenceLine, index) => {\n try {\n assertDifferenceLineConfig(\n annotationDifferenceLine,\n getDifferenceLinePath(index, annotationDifferenceLineList.length),\n )\n\n const start = resolveDifferenceAnchor({\n dataset,\n selectorLabel: 'start',\n selectorValue: annotationDifferenceLine.start.selector,\n spec: chartSpec,\n stackResolveMode,\n allowSelectorFallback: !useElementStackEnd,\n })\n const end = resolveDifferenceAnchor({\n dataset,\n selectorLabel: 'end',\n selectorValue: annotationDifferenceLine.end.selector,\n spec: chartSpec,\n stackResolveMode,\n allowSelectorFallback: !useElementStackEnd,\n })\n\n if (!start || !end) {\n return []\n }\n\n if (start.mode !== end.mode) {\n return []\n }\n\n const usesRuntimeStackEnd =\n useElementStackEnd ||\n ((vseed.chartType === 'column' || vseed.chartType === 'bar') &&\n start.mode === 'element' &&\n stackResolveMode === 'auto')\n const useBracketStyle =\n isBracketChart ||\n ((vseed.chartType === 'column' || vseed.chartType === 'bar') &&\n start.mode === 'element' &&\n stackResolveMode === 'auto')\n const isStackedBarElementBracket =\n vseed.chartType === 'bar' && start.mode === 'element' && stackResolveMode === 'auto'\n const connectDirection = useBracketStyle\n ? isStackedBarElementBracket\n ? 'top'\n : inferDifferenceBracketDirection(start, end)\n : inferDifferenceConnectDirection(vseed, [start.value, end.value])\n\n const lineColor = annotationDifferenceLine.lineColor ?? theme?.lineColor ?? DEFAULT_LINE_COLOR\n const textColor = annotationDifferenceLine.textColor ?? theme?.textColor ?? DEFAULT_TEXT_COLOR\n const textBackgroundColor =\n annotationDifferenceLine.textBackgroundColor ?? theme?.textBackgroundColor ?? DEFAULT_TEXT_BACKGROUND_COLOR\n const textFontSize = annotationDifferenceLine.textFontSize ?? theme?.textFontSize ?? DEFAULT_TEXT_FONT_SIZE\n const differenceType = annotationDifferenceLine.differenceType ?? 'absolute'\n const startMeasureId = resolveDifferenceMeasureId(start, annotationDifferenceLine.start.selector, measureIds)\n const endMeasureId = resolveDifferenceMeasureId(end, annotationDifferenceLine.end.selector, measureIds)\n const sameMeasure = startMeasureId !== undefined && startMeasureId === endMeasureId\n const explicitMeasureFormat = sameMeasure\n ? getExplicitMeasureFormat(measures.find((measure) => measure.id === startMeasureId))\n : undefined\n const differenceFormatter =\n differenceType === 'percent'\n ? percentFormatter\n : explicitMeasureFormat\n ? createFormatter(explicitMeasureFormat)\n : (axisFormatter ?? autoFormatter)\n\n const label = usesRuntimeStackEnd\n ? {\n visible: true,\n position: 'middle',\n refY: 0,\n formatMethod: (_markData: any[], seriesData: any[]) => {\n try {\n return buildDifferenceText(\n getRuntimeDifferenceValue({\n anchor: start,\n seriesData,\n useElementStackEnd: usesRuntimeStackEnd,\n }),\n getRuntimeDifferenceValue({\n anchor: end,\n seriesData,\n useElementStackEnd: usesRuntimeStackEnd,\n }),\n differenceType,\n differenceFormatter,\n )\n } catch {\n return ''\n }\n },\n style: {\n fill: textColor,\n fontSize: textFontSize,\n },\n labelBackground: {\n visible: true,\n padding: DEFAULT_LABEL_PADDING,\n style: {\n fill: textBackgroundColor,\n fillOpacity: 1,\n stroke: lineColor,\n lineWidth: 1,\n cornerRadius: DEFAULT_CORNER_RADIUS,\n },\n },\n }\n : {\n visible: true,\n position: 'middle',\n refY: 0,\n text: buildDifferenceText(start.value, end.value, differenceType, differenceFormatter),\n style: {\n fill: textColor,\n fontSize: textFontSize,\n },\n labelBackground: {\n visible: true,\n padding: DEFAULT_LABEL_PADDING,\n style: {\n fill: textBackgroundColor,\n fillOpacity: 1,\n stroke: lineColor,\n lineWidth: 1,\n cornerRadius: DEFAULT_CORNER_RADIUS,\n },\n },\n }\n\n return [\n {\n type: 'type-step',\n autoRange: true,\n zIndex: ANNOTATION_Z_INDEX,\n connectDirection,\n expandDistance: useBracketStyle ? DEFAULT_BRACKET_EXPAND_DISTANCE : DEFAULT_EXPAND_DISTANCE,\n coordinates: (seriesData: any[], relativeSeries: ICartesianSeries) => {\n try {\n return [\n buildDifferenceCoordinateDatum({\n anchor: start,\n seriesData,\n relativeSeries,\n useElementStackEnd: usesRuntimeStackEnd,\n }),\n buildDifferenceCoordinateDatum({\n anchor: end,\n seriesData,\n relativeSeries,\n useElementStackEnd: usesRuntimeStackEnd,\n }),\n ]\n } catch {\n return []\n }\n },\n line: useBracketStyle\n ? {\n multiSegment: true,\n mainSegmentIndex: 1,\n style: [\n {\n visible: true,\n stroke: lineColor,\n lineWidth: DEFAULT_LINE_WIDTH,\n lineDash: DEFAULT_BRACKET_LINE_DASH,\n },\n {\n visible: true,\n stroke: lineColor,\n lineWidth: DEFAULT_LINE_WIDTH,\n },\n {\n visible: true,\n stroke: lineColor,\n lineWidth: DEFAULT_LINE_WIDTH,\n lineDash: DEFAULT_BRACKET_LINE_DASH,\n },\n ],\n }\n : {\n style: {\n visible: true,\n stroke: lineColor,\n lineWidth: DEFAULT_LINE_WIDTH,\n lineDash: [0],\n cornerRadius: DEFAULT_CORNER_RADIUS,\n },\n },\n label,\n startSymbol: {\n visible: false,\n },\n endSymbol: {\n visible: true,\n size: DEFAULT_END_SYMBOL_SIZE,\n refX: DEFAULT_END_SYMBOL_REF_X,\n style: {\n fill: lineColor,\n },\n },\n } as IMarkLineSpec,\n ]\n } catch {\n return []\n }\n })\n\n const specMarkLine = (chartSpec.markLine as IMarkLineSpec[]) || []\n\n return {\n ...spec,\n markLine: [...specMarkLine, ...markLine],\n }\n}\n"],"names":["DEFAULT_LINE_COLOR","DEFAULT_TEXT_COLOR","DEFAULT_TEXT_BACKGROUND_COLOR","DEFAULT_TEXT_FONT_SIZE","DEFAULT_EXPAND_DISTANCE","DEFAULT_LINE_WIDTH","DEFAULT_CORNER_RADIUS","DEFAULT_LABEL_PADDING","DEFAULT_END_SYMBOL_SIZE","DEFAULT_END_SYMBOL_REF_X","DEFAULT_BRACKET_EXPAND_DISTANCE","DEFAULT_BRACKET_LINE_DASH","DEFAULT_PERCENT_DIFFERENCE_FORMAT","getDifferenceLinePath","index","total","toArray","value","Array","getAxisFormatter","spec","valueAxisOrient","formatMethod","axis","String","undefined","getExplicitMeasureFormat","measure","isEmpty","inferMeasureIdFromDatum","anchor","measureIds","candidateValues","datum","candidates","measureId","Number","inferMeasureIdFromSelector","selectorValue","measureIdSet","matchedMeasureIds","Set","currentSelector","isMeasureSelector","isFieldSelector","isDimensionSelector","isPartialDatumSelector","Object","field","resolveDifferenceMeasureId","assertDifferenceLineConfig","path","Error","start","end","annotationDifferenceLine","context","advancedVSeed","vseed","theme","annotationDifferenceLineList","dataset","chartSpec","stackResolveMode","getDifferenceLineStackResolveMode","useElementStackEnd","usesDifferenceLineElementStackEnd","isBracketChart","measures","findAllMeasures","axisFormatter","percentFormatter","createFormatter","markLine","resolveDifferenceAnchor","usesRuntimeStackEnd","useBracketStyle","isStackedBarElementBracket","connectDirection","inferDifferenceBracketDirection","inferDifferenceConnectDirection","lineColor","textColor","textBackgroundColor","textFontSize","differenceType","startMeasureId","endMeasureId","sameMeasure","explicitMeasureFormat","differenceFormatter","autoFormatter","label","_markData","seriesData","buildDifferenceText","getRuntimeDifferenceValue","ANNOTATION_Z_INDEX","relativeSeries","buildDifferenceCoordinateDatum","specMarkLine"],"mappings":"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"}
1
+ {"version":3,"file":"pipeline/spec/chart/pipes/annotation/annotationDifferenceLine.js","sources":["../../../../../../../src/pipeline/spec/chart/pipes/annotation/annotationDifferenceLine.ts"],"sourcesContent":["import type { IAreaChartSpec, IBarChartSpec, ICartesianSeries, ILineChartSpec, IMarkLineSpec } from '@visactor/vchart'\nimport type { AnnotationDifferenceLine, Measure, RegionPadding, VChartSpecPipe } from 'src/types'\nimport { createFormatter, findAllMeasures, autoFormatter } from '../../../../utils'\nimport {\n isDimensionSelector,\n isFieldSelector,\n isMeasureSelector,\n isPartialDatumSelector,\n} from '../../../../../dataSelector'\nimport { isEmpty } from 'remeda'\nimport { ANNOTATION_Z_INDEX } from '../../../../utils/constant'\nimport {\n buildDifferenceCoordinateDatum,\n buildDifferenceText,\n getDifferenceLineStackResolveMode,\n getRuntimeDifferenceValue,\n type ResolvedDifferenceAnchor,\n usesDifferenceLineElementStackEnd,\n resolveDifferenceAnchor,\n} from './annotationDifferenceLineCommon'\n\nconst DEFAULT_LINE_COLOR = '#BCC1CB'\nconst DEFAULT_TEXT_COLOR = '#ffffff'\nconst DEFAULT_TEXT_BACKGROUND_COLOR = '#BCC1CB'\nconst DEFAULT_TEXT_FONT_SIZE = 12\nconst DEFAULT_LINE_WIDTH = 2\nconst DEFAULT_CORNER_RADIUS = 4\nconst DEFAULT_LABEL_PADDING = 4\nconst DEFAULT_END_SYMBOL_SIZE = 12\nconst DEFAULT_END_SYMBOL_REF_X = -4\nconst DEFAULT_GUTTER_BASE_OFFSET = 20\nconst DEFAULT_GUTTER_RIGHT_PADDING = 44\nconst DEFAULT_GUTTER_TOP_PADDING = 36\nconst DEFAULT_BRACKET_LINE_DASH: [number, number] = [2, 2]\nconst DEFAULT_PERCENT_DIFFERENCE_FORMAT = {\n type: 'percent' as const,\n fractionDigits: 2,\n}\n\ntype RegionPaddingObject = Required<Exclude<RegionPadding, number>>\n\nconst getDifferenceLinePath = (index: number, total: number) =>\n total === 1 ? 'annotationDifferenceLine' : `annotationDifferenceLine[${index}]`\n\nconst toArray = <T>(value: T | T[] | undefined | null): T[] => {\n if (Array.isArray(value)) {\n return value\n }\n\n return value === undefined || value === null ? [] : [value]\n}\n\nconst normalizeRegionPadding = (padding?: RegionPadding): RegionPaddingObject => {\n if (typeof padding === 'number') {\n return {\n top: padding,\n right: padding,\n bottom: padding,\n left: padding,\n }\n }\n\n return {\n top: padding?.top ?? 0,\n right: padding?.right ?? 0,\n bottom: padding?.bottom ?? 0,\n left: padding?.left ?? 0,\n }\n}\n\nconst mergeDifferenceLineRegionPadding = (\n spec: IBarChartSpec | ILineChartSpec | IAreaChartSpec,\n paddingPatch: Partial<RegionPaddingObject>,\n) => {\n const region = (spec as { region?: Array<Record<string, unknown>> }).region\n\n if (!Array.isArray(region) || region.length === 0) {\n return spec\n }\n\n const mergedPadding = normalizeRegionPadding(region[0].padding as RegionPadding | undefined)\n\n if (paddingPatch.top !== undefined) {\n mergedPadding.top = Math.max(mergedPadding.top, paddingPatch.top)\n }\n\n if (paddingPatch.right !== undefined) {\n mergedPadding.right = Math.max(mergedPadding.right, paddingPatch.right)\n }\n\n if (paddingPatch.bottom !== undefined) {\n mergedPadding.bottom = Math.max(mergedPadding.bottom, paddingPatch.bottom)\n }\n\n if (paddingPatch.left !== undefined) {\n mergedPadding.left = Math.max(mergedPadding.left, paddingPatch.left)\n }\n\n return {\n ...spec,\n region: [\n {\n ...region[0],\n padding: mergedPadding,\n },\n ...region.slice(1),\n ],\n }\n}\n\nconst buildFixedGutterExpandDistance = (isHorizontalChart: boolean) => {\n return (_markerData: unknown, context: any) => {\n const region = context?.region\n const coordinatePoints = Array.isArray(context?.coordinatePoints) ? context.coordinatePoints : []\n\n if (!region || coordinatePoints.length === 0) {\n return 0\n }\n\n const { x: regionStartX, y: regionStartY } = region.getLayoutStartPoint()\n const { width } = region.getLayoutRect()\n\n if (isHorizontalChart) {\n const targetY = regionStartY - DEFAULT_GUTTER_BASE_OFFSET\n const minY = Math.min(...coordinatePoints.map((point: { y: number }) => point.y))\n\n return Math.max(0, minY - targetY)\n }\n\n const targetX = regionStartX + width + DEFAULT_GUTTER_BASE_OFFSET\n const maxX = Math.max(...coordinatePoints.map((point: { x: number }) => point.x))\n\n return Math.max(0, targetX - maxX)\n }\n}\n\nconst getAxisFormatter = (spec: IBarChartSpec | ILineChartSpec | IAreaChartSpec) => {\n const valueAxisOrient = spec.direction === 'horizontal' ? 'bottom' : 'left'\n const formatMethod = spec.axes?.find((axis) => axis.orient === valueAxisOrient)?.label?.formatMethod\n\n return typeof formatMethod === 'function'\n ? (value: number) => String(formatMethod(value as never) ?? value)\n : undefined\n}\n\nconst getExplicitMeasureFormat = (measure?: Measure) => {\n if (measure?.numFormat && !isEmpty(measure.numFormat)) {\n return measure.numFormat\n }\n\n if (measure?.format && !isEmpty(measure.format)) {\n return measure.format\n }\n\n return undefined\n}\n\nconst inferMeasureIdFromDatum = (anchor: ResolvedDifferenceAnchor, measureIds: string[]) => {\n const candidateValues = [anchor.matchedDatum, anchor.coordinateDatum]\n\n for (const datum of candidateValues) {\n if (!datum) {\n continue\n }\n\n const candidates = measureIds.filter((measureId) => Number(datum[measureId]) === anchor.value)\n\n if (candidates.length === 1) {\n return candidates[0]\n }\n }\n\n return undefined\n}\n\nconst inferMeasureIdFromSelector = (\n selectorValue: AnnotationDifferenceLine['start']['selector'],\n measureIdSet: Set<string>,\n) => {\n const matchedMeasureIds = new Set<string>()\n\n for (const currentSelector of toArray(selectorValue)) {\n if (isMeasureSelector(currentSelector)) {\n if (measureIdSet.has(currentSelector.field)) {\n matchedMeasureIds.add(currentSelector.field)\n }\n continue\n }\n\n if (isFieldSelector(currentSelector) || isDimensionSelector(currentSelector)) {\n continue\n }\n\n if (isPartialDatumSelector(currentSelector)) {\n Object.keys(currentSelector).forEach((field) => {\n if (measureIdSet.has(field)) {\n matchedMeasureIds.add(field)\n }\n })\n }\n }\n\n return matchedMeasureIds.size === 1 ? Array.from(matchedMeasureIds)[0] : undefined\n}\n\nconst resolveDifferenceMeasureId = (\n anchor: ResolvedDifferenceAnchor,\n selectorValue: AnnotationDifferenceLine['start']['selector'],\n measureIds: string[],\n) => {\n if (anchor.mode !== 'element') {\n return undefined\n }\n\n if (measureIds.length === 1) {\n return measureIds[0]\n }\n\n const measureIdSet = new Set(measureIds)\n return inferMeasureIdFromSelector(selectorValue, measureIdSet) ?? inferMeasureIdFromDatum(anchor, measureIds)\n}\n\nconst assertDifferenceLineConfig: (value: unknown, path: string) => asserts value is AnnotationDifferenceLine = (\n value,\n path,\n) => {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n throw new Error(`${path} must be an object`)\n }\n\n const start = (value as Record<string, unknown>).start\n if (typeof start !== 'object' || start === null || Array.isArray(start)) {\n throw new Error(`${path}.start is required`)\n }\n if ((start as Record<string, unknown>).selector == null) {\n throw new Error(`${path}.start.selector is required`)\n }\n\n const end = (value as Record<string, unknown>).end\n if (typeof end !== 'object' || end === null || Array.isArray(end)) {\n throw new Error(`${path}.end is required`)\n }\n if ((end as Record<string, unknown>).selector == null) {\n throw new Error(`${path}.end.selector is required`)\n }\n}\n\nexport const annotationDifferenceLine: VChartSpecPipe = (spec, context) => {\n const { advancedVSeed, vseed } = context\n const annotationDifferenceLine = advancedVSeed.annotation?.annotationDifferenceLine\n\n if (!annotationDifferenceLine) {\n return spec\n }\n\n const theme = advancedVSeed.config?.[vseed.chartType as 'column']?.annotation?.annotationDifferenceLine\n const annotationDifferenceLineList = Array.isArray(annotationDifferenceLine)\n ? annotationDifferenceLine\n : [annotationDifferenceLine]\n const dataset = advancedVSeed.dataset.flat()\n const chartSpec = spec as IBarChartSpec | ILineChartSpec | IAreaChartSpec\n const stackResolveMode = getDifferenceLineStackResolveMode(vseed, advancedVSeed)\n const useElementStackEnd = usesDifferenceLineElementStackEnd(vseed, advancedVSeed)\n const isBracketChart = vseed.chartType === 'line' || vseed.chartType === 'area'\n const measures = findAllMeasures(advancedVSeed.measures)\n const measureIds = measures.map((measure) => measure.id)\n const axisFormatter = getAxisFormatter(chartSpec)\n const percentFormatter = createFormatter(DEFAULT_PERCENT_DIFFERENCE_FORMAT)\n const isHorizontalChart = chartSpec.direction === 'horizontal'\n\n const markLine = annotationDifferenceLineList.flatMap((annotationDifferenceLine, index) => {\n try {\n assertDifferenceLineConfig(\n annotationDifferenceLine,\n getDifferenceLinePath(index, annotationDifferenceLineList.length),\n )\n\n const start = resolveDifferenceAnchor({\n dataset,\n selectorLabel: 'start',\n selectorValue: annotationDifferenceLine.start.selector,\n spec: chartSpec,\n stackResolveMode,\n allowSelectorFallback: !useElementStackEnd,\n })\n const end = resolveDifferenceAnchor({\n dataset,\n selectorLabel: 'end',\n selectorValue: annotationDifferenceLine.end.selector,\n spec: chartSpec,\n stackResolveMode,\n allowSelectorFallback: !useElementStackEnd,\n })\n\n if (!start || !end) {\n return []\n }\n\n if (start.mode !== end.mode) {\n return []\n }\n\n const usesRuntimeStackEnd =\n useElementStackEnd ||\n ((vseed.chartType === 'column' || vseed.chartType === 'bar') &&\n start.mode === 'element' &&\n stackResolveMode === 'auto')\n const useBracketStyle =\n isBracketChart ||\n ((vseed.chartType === 'column' || vseed.chartType === 'bar') &&\n start.mode === 'element' &&\n stackResolveMode === 'auto')\n const connectDirection = isHorizontalChart ? 'top' : 'right'\n const expandDistance = buildFixedGutterExpandDistance(isHorizontalChart)\n\n const lineColor = annotationDifferenceLine.lineColor ?? theme?.lineColor ?? DEFAULT_LINE_COLOR\n const textColor = annotationDifferenceLine.textColor ?? theme?.textColor ?? DEFAULT_TEXT_COLOR\n const textBackgroundColor =\n annotationDifferenceLine.textBackgroundColor ?? theme?.textBackgroundColor ?? DEFAULT_TEXT_BACKGROUND_COLOR\n const textFontSize = annotationDifferenceLine.textFontSize ?? theme?.textFontSize ?? DEFAULT_TEXT_FONT_SIZE\n const differenceType = annotationDifferenceLine.differenceType ?? 'absolute'\n const startMeasureId = resolveDifferenceMeasureId(start, annotationDifferenceLine.start.selector, measureIds)\n const endMeasureId = resolveDifferenceMeasureId(end, annotationDifferenceLine.end.selector, measureIds)\n const sameMeasure = startMeasureId !== undefined && startMeasureId === endMeasureId\n const explicitMeasureFormat = sameMeasure\n ? getExplicitMeasureFormat(measures.find((measure) => measure.id === startMeasureId))\n : undefined\n const differenceFormatter =\n differenceType === 'percent'\n ? percentFormatter\n : explicitMeasureFormat\n ? createFormatter(explicitMeasureFormat)\n : (axisFormatter ?? autoFormatter)\n\n const label = usesRuntimeStackEnd\n ? {\n visible: true,\n position: 'middle',\n refY: 0,\n formatMethod: (_markData: any[], seriesData: any[]) => {\n try {\n return buildDifferenceText(\n getRuntimeDifferenceValue({\n anchor: start,\n seriesData,\n useElementStackEnd: usesRuntimeStackEnd,\n }),\n getRuntimeDifferenceValue({\n anchor: end,\n seriesData,\n useElementStackEnd: usesRuntimeStackEnd,\n }),\n differenceType,\n differenceFormatter,\n )\n } catch {\n return ''\n }\n },\n style: {\n fill: textColor,\n fontSize: textFontSize,\n },\n labelBackground: {\n visible: true,\n padding: DEFAULT_LABEL_PADDING,\n style: {\n fill: textBackgroundColor,\n fillOpacity: 1,\n stroke: lineColor,\n lineWidth: 1,\n cornerRadius: DEFAULT_CORNER_RADIUS,\n },\n },\n }\n : {\n visible: true,\n position: 'middle',\n refY: 0,\n text: buildDifferenceText(start.value, end.value, differenceType, differenceFormatter),\n style: {\n fill: textColor,\n fontSize: textFontSize,\n },\n labelBackground: {\n visible: true,\n padding: DEFAULT_LABEL_PADDING,\n style: {\n fill: textBackgroundColor,\n fillOpacity: 1,\n stroke: lineColor,\n lineWidth: 1,\n cornerRadius: DEFAULT_CORNER_RADIUS,\n },\n },\n }\n\n return [\n {\n type: 'type-step',\n autoRange: true,\n zIndex: ANNOTATION_Z_INDEX,\n connectDirection,\n expandDistance,\n coordinates: (seriesData: any[], relativeSeries: ICartesianSeries) => {\n try {\n return [\n buildDifferenceCoordinateDatum({\n anchor: start,\n seriesData,\n relativeSeries,\n useElementStackEnd: usesRuntimeStackEnd,\n }),\n buildDifferenceCoordinateDatum({\n anchor: end,\n seriesData,\n relativeSeries,\n useElementStackEnd: usesRuntimeStackEnd,\n }),\n ]\n } catch {\n return []\n }\n },\n line: useBracketStyle\n ? {\n multiSegment: true,\n mainSegmentIndex: 1,\n style: [\n {\n visible: true,\n stroke: lineColor,\n lineWidth: DEFAULT_LINE_WIDTH,\n lineDash: DEFAULT_BRACKET_LINE_DASH,\n },\n {\n visible: true,\n stroke: lineColor,\n lineWidth: DEFAULT_LINE_WIDTH,\n },\n {\n visible: true,\n stroke: lineColor,\n lineWidth: DEFAULT_LINE_WIDTH,\n lineDash: DEFAULT_BRACKET_LINE_DASH,\n },\n ],\n }\n : {\n style: {\n visible: true,\n stroke: lineColor,\n lineWidth: DEFAULT_LINE_WIDTH,\n lineDash: [0],\n cornerRadius: DEFAULT_CORNER_RADIUS,\n },\n },\n label,\n startSymbol: {\n visible: false,\n },\n endSymbol: {\n visible: true,\n size: DEFAULT_END_SYMBOL_SIZE,\n refX: DEFAULT_END_SYMBOL_REF_X,\n style: {\n fill: lineColor,\n },\n },\n } as IMarkLineSpec,\n ]\n } catch {\n return []\n }\n })\n\n const specMarkLine = (chartSpec.markLine as IMarkLineSpec[]) || []\n const nextSpec = {\n ...spec,\n markLine: [...specMarkLine, ...markLine],\n }\n\n if (markLine.length === 0) {\n return nextSpec\n }\n\n return mergeDifferenceLineRegionPadding(\n nextSpec as IBarChartSpec | ILineChartSpec | IAreaChartSpec,\n isHorizontalChart ? { top: DEFAULT_GUTTER_TOP_PADDING } : { right: DEFAULT_GUTTER_RIGHT_PADDING },\n )\n}\n"],"names":["DEFAULT_LINE_COLOR","DEFAULT_TEXT_COLOR","DEFAULT_TEXT_BACKGROUND_COLOR","DEFAULT_TEXT_FONT_SIZE","DEFAULT_LINE_WIDTH","DEFAULT_CORNER_RADIUS","DEFAULT_LABEL_PADDING","DEFAULT_END_SYMBOL_SIZE","DEFAULT_END_SYMBOL_REF_X","DEFAULT_GUTTER_BASE_OFFSET","DEFAULT_GUTTER_RIGHT_PADDING","DEFAULT_GUTTER_TOP_PADDING","DEFAULT_BRACKET_LINE_DASH","DEFAULT_PERCENT_DIFFERENCE_FORMAT","getDifferenceLinePath","index","total","toArray","value","Array","normalizeRegionPadding","padding","mergeDifferenceLineRegionPadding","spec","paddingPatch","region","mergedPadding","undefined","Math","buildFixedGutterExpandDistance","isHorizontalChart","_markerData","context","coordinatePoints","regionStartX","regionStartY","width","targetY","minY","point","targetX","maxX","getAxisFormatter","valueAxisOrient","formatMethod","axis","String","getExplicitMeasureFormat","measure","isEmpty","inferMeasureIdFromDatum","anchor","measureIds","candidateValues","datum","candidates","measureId","Number","inferMeasureIdFromSelector","selectorValue","measureIdSet","matchedMeasureIds","Set","currentSelector","isMeasureSelector","isFieldSelector","isDimensionSelector","isPartialDatumSelector","Object","field","resolveDifferenceMeasureId","assertDifferenceLineConfig","path","Error","start","end","annotationDifferenceLine","advancedVSeed","vseed","theme","annotationDifferenceLineList","dataset","chartSpec","stackResolveMode","getDifferenceLineStackResolveMode","useElementStackEnd","usesDifferenceLineElementStackEnd","isBracketChart","measures","findAllMeasures","axisFormatter","percentFormatter","createFormatter","markLine","resolveDifferenceAnchor","usesRuntimeStackEnd","useBracketStyle","connectDirection","expandDistance","lineColor","textColor","textBackgroundColor","textFontSize","differenceType","startMeasureId","endMeasureId","sameMeasure","explicitMeasureFormat","differenceFormatter","autoFormatter","label","_markData","seriesData","buildDifferenceText","getRuntimeDifferenceValue","ANNOTATION_Z_INDEX","relativeSeries","buildDifferenceCoordinateDatum","specMarkLine","nextSpec"],"mappings":"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"}
@@ -4,6 +4,7 @@ export declare const generateAnnotationPointPipe: (options: {
4
4
  findSelectedDatas?: (options: {
5
5
  dataset: Datum[];
6
6
  selector: Selector | Selectors | undefined | null;
7
+ measureId?: string | null;
7
8
  dynamicFilter?: ChartDynamicFilter;
8
9
  spec: ISpec;
9
10
  context: SpecPipelineContext;
@@ -1,11 +1,15 @@
1
1
  import { selector, selectorWithDynamicFilter } from "../../../../../dataSelector/index.js";
2
+ import { MeasureId } from "../../../../../dataReshape/constant.js";
2
3
  import { isSubset } from "./utils.js";
3
4
  import { ANNOTATION_Z_INDEX } from "../../../../utils/constant.js";
4
5
  import { isBarLikeChart } from "../../../../utils/chatType.js";
5
6
  const generateAnnotationPointPipe = (options)=>{
6
7
  const findSelectedDatas = options.findSelectedDatas ?? ((opts)=>{
7
- const { dataset, selector: s, dynamicFilter } = opts;
8
- return dataset.filter((datum)=>dynamicFilter ? selectorWithDynamicFilter(datum, dynamicFilter, s) : selector(datum, s));
8
+ const { dataset, selector: s, measureId, dynamicFilter } = opts;
9
+ return dataset.filter((datum)=>{
10
+ const isSelected = dynamicFilter ? selectorWithDynamicFilter(datum, dynamicFilter, s) : selector(datum, s);
11
+ return isSelected && (!measureId || datum[MeasureId] === measureId);
12
+ });
9
13
  });
10
14
  const generateMarkPoint = options.generateMarkPoint ?? ((datum)=>[
11
15
  {
@@ -43,11 +47,12 @@ const generateAnnotationPointPipe = (options)=>{
43
47
  textBaseline: 'top'
44
48
  };
45
49
  const markPoint = annotationPointList.flatMap((annotationPoint)=>{
46
- const { selector: selectorPoint, dynamicFilter, text = '', textColor = theme?.textColor ?? '#ffffff', textFontSize = theme?.textFontSize ?? 12, textFontWeight = theme?.textFontWeight ?? 400, textAlign = defaultStyle.textAlign, textBaseline = defaultStyle.textBaseline, textBackgroundBorderColor = theme?.textBackgroundBorderColor, textBackgroundBorderRadius = theme?.textBackgroundBorderRadius ?? 4, textBackgroundBorderWidth = theme?.textBackgroundBorderWidth ?? 1, textBackgroundColor = theme?.textBackgroundColor ?? '#212121', textBackgroundPadding = theme?.textBackgroundPadding ?? 2, textBackgroundVisible = theme?.textBackgroundVisible ?? true, offsetX = theme?.offsetX ?? 0, offsetY = theme?.offsetY ?? 0 } = annotationPoint;
50
+ const { selector: selectorPoint, measureId, dynamicFilter, text = '', textColor = theme?.textColor ?? '#ffffff', textFontSize = theme?.textFontSize ?? 12, textFontWeight = theme?.textFontWeight ?? 400, textAlign = defaultStyle.textAlign, textBaseline = defaultStyle.textBaseline, textBackgroundBorderColor = theme?.textBackgroundBorderColor, textBackgroundBorderRadius = theme?.textBackgroundBorderRadius ?? 4, textBackgroundBorderWidth = theme?.textBackgroundBorderWidth ?? 1, textBackgroundColor = theme?.textBackgroundColor ?? '#212121', textBackgroundPadding = theme?.textBackgroundPadding ?? 2, textBackgroundVisible = theme?.textBackgroundVisible ?? true, offsetX = theme?.offsetX ?? 0, offsetY = theme?.offsetY ?? 0 } = annotationPoint;
47
51
  const dataset = advancedVSeed.dataset.flat();
48
52
  const selectedData = selectorPoint || dynamicFilter ? findSelectedDatas({
49
53
  dataset,
50
54
  selector: selectorPoint,
55
+ measureId,
51
56
  dynamicFilter,
52
57
  spec,
53
58
  context
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline/spec/chart/pipes/annotation/annotationPointCommon.js","sources":["../../../../../../../src/pipeline/spec/chart/pipes/annotation/annotationPointCommon.ts"],"sourcesContent":["import type { ISpec, IMarkPointSpec } from '@visactor/vchart'\nimport { selector, selectorWithDynamicFilter } from '../../../../../dataSelector'\nimport type {\n ChartDynamicFilter,\n Datum,\n Selector,\n Selectors,\n SpecPipelineContext,\n VChartSpecPipe,\n VSeed,\n} from 'src/types'\nimport { isSubset } from './utils'\nimport { ANNOTATION_Z_INDEX } from '../../../../utils/constant'\nimport { isBarLikeChart } from 'src/pipeline/utils/chatType'\nexport const generateAnnotationPointPipe = (options: {\n findSelectedDatas?: (options: {\n dataset: Datum[]\n selector: Selector | Selectors | undefined | null\n dynamicFilter?: ChartDynamicFilter\n spec: ISpec\n context: SpecPipelineContext\n }) => Datum[]\n generateMarkPoint?: (datum: Datum, spec: ISpec, context: SpecPipelineContext) => IMarkPointSpec[] | undefined\n}) => {\n const findSelectedDatas =\n options.findSelectedDatas ??\n ((opts) => {\n const { dataset, selector: s, dynamicFilter } = opts\n return dataset.filter((datum) => {\n return dynamicFilter ? selectorWithDynamicFilter(datum, dynamicFilter, s) : selector(datum, s)\n })\n })\n const generateMarkPoint =\n options.generateMarkPoint ??\n ((datum: Datum) => {\n return [\n {\n coordinate: (data: Datum[], context) => {\n const targetDatum = data.find((item) => isSubset(datum, item))\n if (context.getStack() === true) {\n const stackedDatum = { ...datum, ...targetDatum }\n return {\n ...stackedDatum,\n [context.getStackValueField()]: stackedDatum['__VCHART_STACK_END'],\n }\n }\n\n return targetDatum\n },\n },\n ]\n })\n\n return ((spec: ISpec, context: SpecPipelineContext) => {\n const { advancedVSeed, vseed } = context\n const { annotation, config } = advancedVSeed\n\n if (!annotation || !annotation.annotationPoint) {\n return spec\n }\n\n const theme = config?.[vseed.chartType as 'column']?.annotation?.annotationPoint\n const { annotationPoint } = annotation\n const annotationPointList = Array.isArray(annotationPoint) ? annotationPoint : [annotationPoint]\n const isHorizontalBar = isBarLikeChart(advancedVSeed as VSeed)\n const defaultStyle = isHorizontalBar\n ? {\n textAlign: 'right',\n textBaseline: 'middle',\n }\n : {\n textAlign: 'center',\n textBaseline: 'top',\n }\n\n const markPoint = annotationPointList.flatMap((annotationPoint) => {\n const {\n selector: selectorPoint,\n dynamicFilter,\n text = '',\n textColor = theme?.textColor ?? '#ffffff',\n textFontSize = theme?.textFontSize ?? 12,\n textFontWeight = theme?.textFontWeight ?? 400,\n textAlign = defaultStyle.textAlign,\n textBaseline = defaultStyle.textBaseline,\n textBackgroundBorderColor = theme?.textBackgroundBorderColor,\n textBackgroundBorderRadius = theme?.textBackgroundBorderRadius ?? 4,\n textBackgroundBorderWidth = theme?.textBackgroundBorderWidth ?? 1,\n textBackgroundColor = theme?.textBackgroundColor ?? '#212121',\n textBackgroundPadding = theme?.textBackgroundPadding ?? 2,\n textBackgroundVisible = theme?.textBackgroundVisible ?? true,\n offsetX = theme?.offsetX ?? 0,\n offsetY = theme?.offsetY ?? 0,\n } = annotationPoint\n\n const dataset = advancedVSeed.dataset.flat()\n const selectedData =\n selectorPoint || dynamicFilter\n ? findSelectedDatas({\n dataset,\n selector: selectorPoint,\n dynamicFilter,\n spec,\n context,\n })\n : []\n const dx = -10 - (isHorizontalBar ? (textFontSize as number) : 0) // 由于vchart tag实现问题,需要设置这个强制偏移量\n const dy = isHorizontalBar ? 0 : (textFontSize as number)\n const markPointStyle = {\n zIndex: ANNOTATION_Z_INDEX,\n regionRelative: true,\n itemLine: {\n visible: false,\n },\n itemContent: {\n offsetY,\n offsetX,\n confine: true,\n text: {\n text: text,\n labelBackground: {\n visible: textBackgroundVisible,\n padding: textBackgroundPadding,\n style: {\n opacity: 0.95,\n cornerRadius: textBackgroundBorderRadius ?? 4,\n fill: textBackgroundColor,\n stroke: textBackgroundBorderColor,\n lineWidth: textBackgroundBorderWidth,\n dx,\n dy,\n },\n },\n },\n style: {\n opacity: 0.95,\n visible: true,\n textAlign: textAlign,\n textBaseline: textBaseline,\n fill: textColor,\n stroke: textBackgroundColor,\n lineWidth: 1,\n fontSize: textFontSize,\n fontWeight: textFontWeight,\n dx,\n dy,\n },\n },\n } as Partial<IMarkPointSpec>\n\n return selectedData.reduce((res: IMarkPointSpec[], datum) => {\n const marks = generateMarkPoint(datum, spec, context)\n\n if (marks && marks.length) {\n marks.forEach((mark) => {\n res.push({\n ...markPointStyle,\n ...mark,\n } as IMarkPointSpec)\n })\n }\n\n return res\n }, [])\n }) as unknown as IMarkPointSpec[]\n\n return {\n ...spec,\n markPoint,\n } as ISpec\n }) as VChartSpecPipe\n}\n"],"names":["generateAnnotationPointPipe","options","findSelectedDatas","opts","dataset","s","dynamicFilter","datum","selectorWithDynamicFilter","selector","generateMarkPoint","data","context","targetDatum","item","isSubset","stackedDatum","spec","advancedVSeed","vseed","annotation","config","theme","annotationPoint","annotationPointList","Array","isHorizontalBar","isBarLikeChart","defaultStyle","markPoint","selectorPoint","text","textColor","textFontSize","textFontWeight","textAlign","textBaseline","textBackgroundBorderColor","textBackgroundBorderRadius","textBackgroundBorderWidth","textBackgroundColor","textBackgroundPadding","textBackgroundVisible","offsetX","offsetY","selectedData","dx","dy","markPointStyle","ANNOTATION_Z_INDEX","res","marks","mark"],"mappings":"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"}
1
+ {"version":3,"file":"pipeline/spec/chart/pipes/annotation/annotationPointCommon.js","sources":["../../../../../../../src/pipeline/spec/chart/pipes/annotation/annotationPointCommon.ts"],"sourcesContent":["import type { ISpec, IMarkPointSpec } from '@visactor/vchart'\nimport { selector, selectorWithDynamicFilter } from '../../../../../dataSelector'\nimport { MeasureId } from 'src/dataReshape/constant'\nimport type {\n ChartDynamicFilter,\n Datum,\n Selector,\n Selectors,\n SpecPipelineContext,\n VChartSpecPipe,\n VSeed,\n} from 'src/types'\nimport { isSubset } from './utils'\nimport { ANNOTATION_Z_INDEX } from '../../../../utils/constant'\nimport { isBarLikeChart } from 'src/pipeline/utils/chatType'\nexport const generateAnnotationPointPipe = (options: {\n findSelectedDatas?: (options: {\n dataset: Datum[]\n selector: Selector | Selectors | undefined | null\n measureId?: string | null\n dynamicFilter?: ChartDynamicFilter\n spec: ISpec\n context: SpecPipelineContext\n }) => Datum[]\n generateMarkPoint?: (datum: Datum, spec: ISpec, context: SpecPipelineContext) => IMarkPointSpec[] | undefined\n}) => {\n const findSelectedDatas =\n options.findSelectedDatas ??\n ((opts) => {\n const { dataset, selector: s, measureId, dynamicFilter } = opts\n return dataset.filter((datum) => {\n const isSelected = dynamicFilter ? selectorWithDynamicFilter(datum, dynamicFilter, s) : selector(datum, s)\n return isSelected && (!measureId || datum[MeasureId] === measureId)\n })\n })\n const generateMarkPoint =\n options.generateMarkPoint ??\n ((datum: Datum) => {\n return [\n {\n coordinate: (data: Datum[], context) => {\n const targetDatum = data.find((item) => isSubset(datum, item))\n if (context.getStack() === true) {\n const stackedDatum = { ...datum, ...targetDatum }\n return {\n ...stackedDatum,\n [context.getStackValueField()]: stackedDatum['__VCHART_STACK_END'],\n }\n }\n\n return targetDatum\n },\n },\n ]\n })\n\n return ((spec: ISpec, context: SpecPipelineContext) => {\n const { advancedVSeed, vseed } = context\n const { annotation, config } = advancedVSeed\n\n if (!annotation || !annotation.annotationPoint) {\n return spec\n }\n\n const theme = config?.[vseed.chartType as 'column']?.annotation?.annotationPoint\n const { annotationPoint } = annotation\n const annotationPointList = Array.isArray(annotationPoint) ? annotationPoint : [annotationPoint]\n const isHorizontalBar = isBarLikeChart(advancedVSeed as VSeed)\n const defaultStyle = isHorizontalBar\n ? {\n textAlign: 'right',\n textBaseline: 'middle',\n }\n : {\n textAlign: 'center',\n textBaseline: 'top',\n }\n\n const markPoint = annotationPointList.flatMap((annotationPoint) => {\n const {\n selector: selectorPoint,\n measureId,\n dynamicFilter,\n text = '',\n textColor = theme?.textColor ?? '#ffffff',\n textFontSize = theme?.textFontSize ?? 12,\n textFontWeight = theme?.textFontWeight ?? 400,\n textAlign = defaultStyle.textAlign,\n textBaseline = defaultStyle.textBaseline,\n textBackgroundBorderColor = theme?.textBackgroundBorderColor,\n textBackgroundBorderRadius = theme?.textBackgroundBorderRadius ?? 4,\n textBackgroundBorderWidth = theme?.textBackgroundBorderWidth ?? 1,\n textBackgroundColor = theme?.textBackgroundColor ?? '#212121',\n textBackgroundPadding = theme?.textBackgroundPadding ?? 2,\n textBackgroundVisible = theme?.textBackgroundVisible ?? true,\n offsetX = theme?.offsetX ?? 0,\n offsetY = theme?.offsetY ?? 0,\n } = annotationPoint\n\n const dataset = advancedVSeed.dataset.flat()\n const selectedData =\n selectorPoint || dynamicFilter\n ? findSelectedDatas({\n dataset,\n selector: selectorPoint,\n measureId,\n dynamicFilter,\n spec,\n context,\n })\n : []\n const dx = -10 - (isHorizontalBar ? (textFontSize as number) : 0) // 由于vchart tag实现问题,需要设置这个强制偏移量\n const dy = isHorizontalBar ? 0 : (textFontSize as number)\n const markPointStyle = {\n zIndex: ANNOTATION_Z_INDEX,\n regionRelative: true,\n itemLine: {\n visible: false,\n },\n itemContent: {\n offsetY,\n offsetX,\n confine: true,\n text: {\n text: text,\n labelBackground: {\n visible: textBackgroundVisible,\n padding: textBackgroundPadding,\n style: {\n opacity: 0.95,\n cornerRadius: textBackgroundBorderRadius ?? 4,\n fill: textBackgroundColor,\n stroke: textBackgroundBorderColor,\n lineWidth: textBackgroundBorderWidth,\n dx,\n dy,\n },\n },\n },\n style: {\n opacity: 0.95,\n visible: true,\n textAlign: textAlign,\n textBaseline: textBaseline,\n fill: textColor,\n stroke: textBackgroundColor,\n lineWidth: 1,\n fontSize: textFontSize,\n fontWeight: textFontWeight,\n dx,\n dy,\n },\n },\n } as Partial<IMarkPointSpec>\n\n return selectedData.reduce((res: IMarkPointSpec[], datum) => {\n const marks = generateMarkPoint(datum, spec, context)\n\n if (marks && marks.length) {\n marks.forEach((mark) => {\n res.push({\n ...markPointStyle,\n ...mark,\n } as IMarkPointSpec)\n })\n }\n\n return res\n }, [])\n }) as unknown as IMarkPointSpec[]\n\n return {\n ...spec,\n markPoint,\n } as ISpec\n }) as VChartSpecPipe\n}\n"],"names":["generateAnnotationPointPipe","options","findSelectedDatas","opts","dataset","s","measureId","dynamicFilter","datum","isSelected","selectorWithDynamicFilter","selector","MeasureId","generateMarkPoint","data","context","targetDatum","item","isSubset","stackedDatum","spec","advancedVSeed","vseed","annotation","config","theme","annotationPoint","annotationPointList","Array","isHorizontalBar","isBarLikeChart","defaultStyle","markPoint","selectorPoint","text","textColor","textFontSize","textFontWeight","textAlign","textBaseline","textBackgroundBorderColor","textBackgroundBorderRadius","textBackgroundBorderWidth","textBackgroundColor","textBackgroundPadding","textBackgroundVisible","offsetX","offsetY","selectedData","dx","dy","markPointStyle","ANNOTATION_Z_INDEX","res","marks","mark"],"mappings":"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"}
@@ -1,18 +1,18 @@
1
1
  import { selector, selectorWithDynamicFilter } from "../../../../../dataSelector/index.js";
2
+ import { MeasureId } from "../../../../../dataReshape/constant.js";
2
3
  import { isSubset } from "./utils.js";
3
4
  import { flatReshapeMeasures } from "../../../../utils/index.js";
4
- import { MeasureId } from "../../../../../dataReshape/constant.js";
5
5
  import { pickWithout } from "@visactor/vutils";
6
6
  import { generateAnnotationPointPipe } from "./annotationPointCommon.js";
7
7
  const annotationPointOfDualAxis = generateAnnotationPointPipe({
8
8
  findSelectedDatas: (options)=>{
9
- const { dataset, selector: s, dynamicFilter, context } = options;
9
+ const { dataset, selector: s, measureId, dynamicFilter, context } = options;
10
10
  return dataset.reduce((res, d)=>{
11
11
  const { advancedVSeed } = context;
12
12
  const allMeasureIds = flatReshapeMeasures(advancedVSeed.reshapeMeasures ?? []).map((m)=>m.id);
13
13
  const pickedDatum = pickWithout(d, allMeasureIds.filter((id)=>id !== d[MeasureId]));
14
14
  const shouldSelect = dynamicFilter ? selectorWithDynamicFilter(pickedDatum, dynamicFilter, s) : selector(pickedDatum, s);
15
- if (shouldSelect) res.push(pickedDatum);
15
+ if (shouldSelect && (!measureId || pickedDatum[MeasureId] === measureId)) res.push(pickedDatum);
16
16
  return res;
17
17
  }, []);
18
18
  },
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline/spec/chart/pipes/annotation/annotationPointOfDualAxis.js","sources":["../../../../../../../src/pipeline/spec/chart/pipes/annotation/annotationPointOfDualAxis.ts"],"sourcesContent":["import type { IMarkPointSpec, ISpec } from '@visactor/vchart'\nimport { selector, selectorWithDynamicFilter } from '../../../../../dataSelector'\nimport type { Datum, SpecPipelineContext, VChartSpecPipe } from 'src/types'\nimport { isSubset } from './utils'\nimport { flatReshapeMeasures } from 'src/pipeline/utils'\nimport { MeasureId } from 'src/dataReshape/constant'\nimport { pickWithout } from '@visactor/vutils'\nimport { generateAnnotationPointPipe } from './annotationPointCommon'\n\nexport const annotationPointOfDualAxis: VChartSpecPipe = generateAnnotationPointPipe({\n findSelectedDatas: (options) => {\n const { dataset, selector: s, dynamicFilter, context } = options\n return dataset.reduce((res: Datum[], d: Datum) => {\n const { advancedVSeed } = context\n const allMeasureIds = flatReshapeMeasures(advancedVSeed.reshapeMeasures ?? []).map((m) => m.id)\n const pickedDatum = pickWithout(\n d,\n allMeasureIds.filter((id) => id !== d[MeasureId]),\n )\n\n const shouldSelect = dynamicFilter\n ? selectorWithDynamicFilter(pickedDatum, dynamicFilter, s)\n : selector(pickedDatum, s)\n\n if (shouldSelect) {\n res.push(pickedDatum)\n }\n\n return res\n }, [])\n },\n generateMarkPoint: (datum: Datum, spec: ISpec, context: SpecPipelineContext) => {\n const { advancedVSeed } = context\n const allMeasureIds = flatReshapeMeasures(advancedVSeed.reshapeMeasures ?? []).map((m) => m.id)\n return spec.series?.map((s: any, index: number) => {\n return {\n relativeSeriesIndex: index,\n coordinate: (data: Datum[]) => {\n return data.find((item) => {\n return isSubset(\n datum,\n item,\n allMeasureIds.filter((id) => id !== item[MeasureId]),\n )\n })\n },\n } as IMarkPointSpec\n })\n },\n})\n"],"names":["annotationPointOfDualAxis","generateAnnotationPointPipe","options","dataset","s","dynamicFilter","context","res","d","advancedVSeed","allMeasureIds","flatReshapeMeasures","m","pickedDatum","pickWithout","id","MeasureId","shouldSelect","selectorWithDynamicFilter","selector","datum","spec","index","data","item","isSubset"],"mappings":";;;;;;AASO,MAAMA,4BAA4CC,4BAA4B;IACnF,mBAAmB,CAACC;QAClB,MAAM,EAAEC,OAAO,EAAE,UAAUC,CAAC,EAAEC,aAAa,EAAEC,OAAO,EAAE,GAAGJ;QACzD,OAAOC,QAAQ,MAAM,CAAC,CAACI,KAAcC;YACnC,MAAM,EAAEC,aAAa,EAAE,GAAGH;YAC1B,MAAMI,gBAAgBC,oBAAoBF,cAAc,eAAe,IAAI,EAAE,EAAE,GAAG,CAAC,CAACG,IAAMA,EAAE,EAAE;YAC9F,MAAMC,cAAcC,YAClBN,GACAE,cAAc,MAAM,CAAC,CAACK,KAAOA,OAAOP,CAAC,CAACQ,UAAU;YAGlD,MAAMC,eAAeZ,gBACjBa,0BAA0BL,aAAaR,eAAeD,KACtDe,SAASN,aAAaT;YAE1B,IAAIa,cACFV,IAAI,IAAI,CAACM;YAGX,OAAON;QACT,GAAG,EAAE;IACP;IACA,mBAAmB,CAACa,OAAcC,MAAaf;QAC7C,MAAM,EAAEG,aAAa,EAAE,GAAGH;QAC1B,MAAMI,gBAAgBC,oBAAoBF,cAAc,eAAe,IAAI,EAAE,EAAE,GAAG,CAAC,CAACG,IAAMA,EAAE,EAAE;QAC9F,OAAOS,KAAK,MAAM,EAAE,IAAI,CAACjB,GAAQkB,QACxB;gBACL,qBAAqBA;gBACrB,YAAY,CAACC,OACJA,KAAK,IAAI,CAAC,CAACC,OACTC,SACLL,OACAI,MACAd,cAAc,MAAM,CAAC,CAACK,KAAOA,OAAOS,IAAI,CAACR,UAAU;YAI3D;IAEJ;AACF"}
1
+ {"version":3,"file":"pipeline/spec/chart/pipes/annotation/annotationPointOfDualAxis.js","sources":["../../../../../../../src/pipeline/spec/chart/pipes/annotation/annotationPointOfDualAxis.ts"],"sourcesContent":["import type { IMarkPointSpec, ISpec } from '@visactor/vchart'\nimport { selector, selectorWithDynamicFilter } from '../../../../../dataSelector'\nimport { MeasureId } from 'src/dataReshape/constant'\nimport type { Datum, SpecPipelineContext, VChartSpecPipe } from 'src/types'\nimport { isSubset } from './utils'\nimport { flatReshapeMeasures } from 'src/pipeline/utils'\nimport { pickWithout } from '@visactor/vutils'\nimport { generateAnnotationPointPipe } from './annotationPointCommon'\n\nexport const annotationPointOfDualAxis: VChartSpecPipe = generateAnnotationPointPipe({\n findSelectedDatas: (options) => {\n const { dataset, selector: s, measureId, dynamicFilter, context } = options\n return dataset.reduce((res: Datum[], d: Datum) => {\n const { advancedVSeed } = context\n const allMeasureIds = flatReshapeMeasures(advancedVSeed.reshapeMeasures ?? []).map((m) => m.id)\n const pickedDatum = pickWithout(\n d,\n allMeasureIds.filter((id) => id !== d[MeasureId]),\n )\n\n const shouldSelect = dynamicFilter\n ? selectorWithDynamicFilter(pickedDatum, dynamicFilter, s)\n : selector(pickedDatum, s)\n\n if (shouldSelect && (!measureId || pickedDatum[MeasureId] === measureId)) {\n res.push(pickedDatum)\n }\n\n return res\n }, [])\n },\n generateMarkPoint: (datum: Datum, spec: ISpec, context: SpecPipelineContext) => {\n const { advancedVSeed } = context\n const allMeasureIds = flatReshapeMeasures(advancedVSeed.reshapeMeasures ?? []).map((m) => m.id)\n return spec.series?.map((s: any, index: number) => {\n return {\n relativeSeriesIndex: index,\n coordinate: (data: Datum[]) => {\n return data.find((item) => {\n return isSubset(\n datum,\n item,\n allMeasureIds.filter((id) => id !== item[MeasureId]),\n )\n })\n },\n } as IMarkPointSpec\n })\n },\n})\n"],"names":["annotationPointOfDualAxis","generateAnnotationPointPipe","options","dataset","s","measureId","dynamicFilter","context","res","d","advancedVSeed","allMeasureIds","flatReshapeMeasures","m","pickedDatum","pickWithout","id","MeasureId","shouldSelect","selectorWithDynamicFilter","selector","datum","spec","index","data","item","isSubset"],"mappings":";;;;;;AASO,MAAMA,4BAA4CC,4BAA4B;IACnF,mBAAmB,CAACC;QAClB,MAAM,EAAEC,OAAO,EAAE,UAAUC,CAAC,EAAEC,SAAS,EAAEC,aAAa,EAAEC,OAAO,EAAE,GAAGL;QACpE,OAAOC,QAAQ,MAAM,CAAC,CAACK,KAAcC;YACnC,MAAM,EAAEC,aAAa,EAAE,GAAGH;YAC1B,MAAMI,gBAAgBC,oBAAoBF,cAAc,eAAe,IAAI,EAAE,EAAE,GAAG,CAAC,CAACG,IAAMA,EAAE,EAAE;YAC9F,MAAMC,cAAcC,YAClBN,GACAE,cAAc,MAAM,CAAC,CAACK,KAAOA,OAAOP,CAAC,CAACQ,UAAU;YAGlD,MAAMC,eAAeZ,gBACjBa,0BAA0BL,aAAaR,eAAeF,KACtDgB,SAASN,aAAaV;YAE1B,IAAIc,gBAAiB,EAACb,aAAaS,WAAW,CAACG,UAAU,KAAKZ,SAAQ,GACpEG,IAAI,IAAI,CAACM;YAGX,OAAON;QACT,GAAG,EAAE;IACP;IACA,mBAAmB,CAACa,OAAcC,MAAaf;QAC7C,MAAM,EAAEG,aAAa,EAAE,GAAGH;QAC1B,MAAMI,gBAAgBC,oBAAoBF,cAAc,eAAe,IAAI,EAAE,EAAE,GAAG,CAAC,CAACG,IAAMA,EAAE,EAAE;QAC9F,OAAOS,KAAK,MAAM,EAAE,IAAI,CAAClB,GAAQmB,QACxB;gBACL,qBAAqBA;gBACrB,YAAY,CAACC,OACJA,KAAK,IAAI,CAAC,CAACC,OACTC,SACLL,OACAI,MACAd,cAAc,MAAM,CAAC,CAACK,KAAOA,OAAOS,IAAI,CAACR,UAAU;YAI3D;IAEJ;AACF"}
@@ -1673,6 +1673,7 @@ export declare const zArea: z.ZodObject<{
1673
1673
  }>>>;
1674
1674
  value: z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>]>;
1675
1675
  }, z.core.$strip>, z.ZodRecord<z.ZodUnion<[z.ZodString, z.ZodNumber]>, z.ZodAny>]>>]>>>;
1676
+ measureId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1676
1677
  dynamicFilter: z.ZodOptional<z.ZodObject<{
1677
1678
  type: z.ZodLiteral<"row-with-field">;
1678
1679
  description: z.ZodOptional<z.ZodString>;
@@ -1854,6 +1855,7 @@ export declare const zArea: z.ZodObject<{
1854
1855
  }>>>;
1855
1856
  value: z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>]>;
1856
1857
  }, z.core.$strip>, z.ZodRecord<z.ZodUnion<[z.ZodString, z.ZodNumber]>, z.ZodAny>]>>]>>>;
1858
+ measureId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1857
1859
  dynamicFilter: z.ZodOptional<z.ZodObject<{
1858
1860
  type: z.ZodLiteral<"row-with-field">;
1859
1861
  description: z.ZodOptional<z.ZodString>;
@@ -1673,6 +1673,7 @@ export declare const zAreaPercent: z.ZodObject<{
1673
1673
  }>>>;
1674
1674
  value: z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>]>;
1675
1675
  }, z.core.$strip>, z.ZodRecord<z.ZodUnion<[z.ZodString, z.ZodNumber]>, z.ZodAny>]>>]>>>;
1676
+ measureId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1676
1677
  dynamicFilter: z.ZodOptional<z.ZodObject<{
1677
1678
  type: z.ZodLiteral<"row-with-field">;
1678
1679
  description: z.ZodOptional<z.ZodString>;
@@ -1854,6 +1855,7 @@ export declare const zAreaPercent: z.ZodObject<{
1854
1855
  }>>>;
1855
1856
  value: z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>]>;
1856
1857
  }, z.core.$strip>, z.ZodRecord<z.ZodUnion<[z.ZodString, z.ZodNumber]>, z.ZodAny>]>>]>>>;
1858
+ measureId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1857
1859
  dynamicFilter: z.ZodOptional<z.ZodObject<{
1858
1860
  type: z.ZodLiteral<"row-with-field">;
1859
1861
  description: z.ZodOptional<z.ZodString>;
@@ -1002,6 +1002,7 @@ export declare const zBar: z.ZodObject<{
1002
1002
  }>>>;
1003
1003
  value: z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>]>;
1004
1004
  }, z.core.$strip>, z.ZodRecord<z.ZodUnion<[z.ZodString, z.ZodNumber]>, z.ZodAny>]>>]>>>;
1005
+ measureId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1005
1006
  dynamicFilter: z.ZodOptional<z.ZodObject<{
1006
1007
  type: z.ZodLiteral<"row-with-field">;
1007
1008
  description: z.ZodOptional<z.ZodString>;
@@ -1183,6 +1184,7 @@ export declare const zBar: z.ZodObject<{
1183
1184
  }>>>;
1184
1185
  value: z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>]>;
1185
1186
  }, z.core.$strip>, z.ZodRecord<z.ZodUnion<[z.ZodString, z.ZodNumber]>, z.ZodAny>]>>]>>>;
1187
+ measureId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1186
1188
  dynamicFilter: z.ZodOptional<z.ZodObject<{
1187
1189
  type: z.ZodLiteral<"row-with-field">;
1188
1190
  description: z.ZodOptional<z.ZodString>;
@@ -999,6 +999,7 @@ export declare const zBarParallel: z.ZodObject<{
999
999
  }>>>;
1000
1000
  value: z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>]>;
1001
1001
  }, z.core.$strip>, z.ZodRecord<z.ZodUnion<[z.ZodString, z.ZodNumber]>, z.ZodAny>]>>]>>>;
1002
+ measureId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1002
1003
  dynamicFilter: z.ZodOptional<z.ZodObject<{
1003
1004
  type: z.ZodLiteral<"row-with-field">;
1004
1005
  description: z.ZodOptional<z.ZodString>;
@@ -1180,6 +1181,7 @@ export declare const zBarParallel: z.ZodObject<{
1180
1181
  }>>>;
1181
1182
  value: z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>]>;
1182
1183
  }, z.core.$strip>, z.ZodRecord<z.ZodUnion<[z.ZodString, z.ZodNumber]>, z.ZodAny>]>>]>>>;
1184
+ measureId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1183
1185
  dynamicFilter: z.ZodOptional<z.ZodObject<{
1184
1186
  type: z.ZodLiteral<"row-with-field">;
1185
1187
  description: z.ZodOptional<z.ZodString>;
@@ -1002,6 +1002,7 @@ export declare const zBarPercent: z.ZodObject<{
1002
1002
  }>>>;
1003
1003
  value: z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>]>;
1004
1004
  }, z.core.$strip>, z.ZodRecord<z.ZodUnion<[z.ZodString, z.ZodNumber]>, z.ZodAny>]>>]>>>;
1005
+ measureId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1005
1006
  dynamicFilter: z.ZodOptional<z.ZodObject<{
1006
1007
  type: z.ZodLiteral<"row-with-field">;
1007
1008
  description: z.ZodOptional<z.ZodString>;
@@ -1183,6 +1184,7 @@ export declare const zBarPercent: z.ZodObject<{
1183
1184
  }>>>;
1184
1185
  value: z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>]>;
1185
1186
  }, z.core.$strip>, z.ZodRecord<z.ZodUnion<[z.ZodString, z.ZodNumber]>, z.ZodAny>]>>]>>>;
1187
+ measureId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1186
1188
  dynamicFilter: z.ZodOptional<z.ZodObject<{
1187
1189
  type: z.ZodLiteral<"row-with-field">;
1188
1190
  description: z.ZodOptional<z.ZodString>;
@@ -1016,6 +1016,7 @@ export declare const zBoxPlot: z.ZodObject<{
1016
1016
  }>>>;
1017
1017
  value: z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>]>;
1018
1018
  }, z.core.$strip>, z.ZodRecord<z.ZodUnion<[z.ZodString, z.ZodNumber]>, z.ZodAny>]>>]>>>;
1019
+ measureId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1019
1020
  dynamicFilter: z.ZodOptional<z.ZodObject<{
1020
1021
  type: z.ZodLiteral<"row-with-field">;
1021
1022
  description: z.ZodOptional<z.ZodString>;
@@ -1197,6 +1198,7 @@ export declare const zBoxPlot: z.ZodObject<{
1197
1198
  }>>>;
1198
1199
  value: z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>]>;
1199
1200
  }, z.core.$strip>, z.ZodRecord<z.ZodUnion<[z.ZodString, z.ZodNumber]>, z.ZodAny>]>>]>>>;
1201
+ measureId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1200
1202
  dynamicFilter: z.ZodOptional<z.ZodObject<{
1201
1203
  type: z.ZodLiteral<"row-with-field">;
1202
1204
  description: z.ZodOptional<z.ZodString>;
@@ -1039,6 +1039,7 @@ export declare const zColumn: z.ZodObject<{
1039
1039
  }>>>;
1040
1040
  value: z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>]>;
1041
1041
  }, z.core.$strip>, z.ZodRecord<z.ZodUnion<[z.ZodString, z.ZodNumber]>, z.ZodAny>]>>]>>>;
1042
+ measureId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1042
1043
  dynamicFilter: z.ZodOptional<z.ZodObject<{
1043
1044
  type: z.ZodLiteral<"row-with-field">;
1044
1045
  description: z.ZodOptional<z.ZodString>;
@@ -1220,6 +1221,7 @@ export declare const zColumn: z.ZodObject<{
1220
1221
  }>>>;
1221
1222
  value: z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>]>;
1222
1223
  }, z.core.$strip>, z.ZodRecord<z.ZodUnion<[z.ZodString, z.ZodNumber]>, z.ZodAny>]>>]>>>;
1224
+ measureId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1223
1225
  dynamicFilter: z.ZodOptional<z.ZodObject<{
1224
1226
  type: z.ZodLiteral<"row-with-field">;
1225
1227
  description: z.ZodOptional<z.ZodString>;
@@ -1024,6 +1024,7 @@ export declare const zColumnParallel: z.ZodObject<{
1024
1024
  }>>>;
1025
1025
  value: z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>]>;
1026
1026
  }, z.core.$strip>, z.ZodRecord<z.ZodUnion<[z.ZodString, z.ZodNumber]>, z.ZodAny>]>>]>>>;
1027
+ measureId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1027
1028
  dynamicFilter: z.ZodOptional<z.ZodObject<{
1028
1029
  type: z.ZodLiteral<"row-with-field">;
1029
1030
  description: z.ZodOptional<z.ZodString>;
@@ -1205,6 +1206,7 @@ export declare const zColumnParallel: z.ZodObject<{
1205
1206
  }>>>;
1206
1207
  value: z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>]>;
1207
1208
  }, z.core.$strip>, z.ZodRecord<z.ZodUnion<[z.ZodString, z.ZodNumber]>, z.ZodAny>]>>]>>>;
1209
+ measureId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1208
1210
  dynamicFilter: z.ZodOptional<z.ZodObject<{
1209
1211
  type: z.ZodLiteral<"row-with-field">;
1210
1212
  description: z.ZodOptional<z.ZodString>;
@@ -1002,6 +1002,7 @@ export declare const zColumnPercent: z.ZodObject<{
1002
1002
  }>>>;
1003
1003
  value: z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>]>;
1004
1004
  }, z.core.$strip>, z.ZodRecord<z.ZodUnion<[z.ZodString, z.ZodNumber]>, z.ZodAny>]>>]>>>;
1005
+ measureId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1005
1006
  dynamicFilter: z.ZodOptional<z.ZodObject<{
1006
1007
  type: z.ZodLiteral<"row-with-field">;
1007
1008
  description: z.ZodOptional<z.ZodString>;
@@ -1183,6 +1184,7 @@ export declare const zColumnPercent: z.ZodObject<{
1183
1184
  }>>>;
1184
1185
  value: z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>]>;
1185
1186
  }, z.core.$strip>, z.ZodRecord<z.ZodUnion<[z.ZodString, z.ZodNumber]>, z.ZodAny>]>>]>>>;
1187
+ measureId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1186
1188
  dynamicFilter: z.ZodOptional<z.ZodObject<{
1187
1189
  type: z.ZodLiteral<"row-with-field">;
1188
1190
  description: z.ZodOptional<z.ZodString>;
@@ -2199,6 +2199,7 @@ export declare const zDualAxis: z.ZodObject<{
2199
2199
  }>>>;
2200
2200
  value: z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>]>;
2201
2201
  }, z.core.$strip>, z.ZodRecord<z.ZodUnion<[z.ZodString, z.ZodNumber]>, z.ZodAny>]>>]>>>;
2202
+ measureId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
2202
2203
  dynamicFilter: z.ZodOptional<z.ZodObject<{
2203
2204
  type: z.ZodLiteral<"row-with-field">;
2204
2205
  description: z.ZodOptional<z.ZodString>;
@@ -2380,6 +2381,7 @@ export declare const zDualAxis: z.ZodObject<{
2380
2381
  }>>>;
2381
2382
  value: z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>]>;
2382
2383
  }, z.core.$strip>, z.ZodRecord<z.ZodUnion<[z.ZodString, z.ZodNumber]>, z.ZodAny>]>>]>>>;
2384
+ measureId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
2383
2385
  dynamicFilter: z.ZodOptional<z.ZodObject<{
2384
2386
  type: z.ZodLiteral<"row-with-field">;
2385
2387
  description: z.ZodOptional<z.ZodString>;
@@ -1028,6 +1028,7 @@ export declare const zHistogram: z.ZodObject<{
1028
1028
  }>>>;
1029
1029
  value: z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>]>;
1030
1030
  }, z.core.$strip>, z.ZodRecord<z.ZodUnion<[z.ZodString, z.ZodNumber]>, z.ZodAny>]>>]>>>;
1031
+ measureId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1031
1032
  dynamicFilter: z.ZodOptional<z.ZodObject<{
1032
1033
  type: z.ZodLiteral<"row-with-field">;
1033
1034
  description: z.ZodOptional<z.ZodString>;
@@ -1209,6 +1210,7 @@ export declare const zHistogram: z.ZodObject<{
1209
1210
  }>>>;
1210
1211
  value: z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>]>;
1211
1212
  }, z.core.$strip>, z.ZodRecord<z.ZodUnion<[z.ZodString, z.ZodNumber]>, z.ZodAny>]>>]>>>;
1213
+ measureId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1212
1214
  dynamicFilter: z.ZodOptional<z.ZodObject<{
1213
1215
  type: z.ZodLiteral<"row-with-field">;
1214
1216
  description: z.ZodOptional<z.ZodString>;
@@ -1364,6 +1364,7 @@ export declare const zLine: z.ZodObject<{
1364
1364
  }>>>;
1365
1365
  value: z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>]>;
1366
1366
  }, z.core.$strip>, z.ZodRecord<z.ZodUnion<[z.ZodString, z.ZodNumber]>, z.ZodAny>]>>]>>>;
1367
+ measureId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1367
1368
  dynamicFilter: z.ZodOptional<z.ZodObject<{
1368
1369
  type: z.ZodLiteral<"row-with-field">;
1369
1370
  description: z.ZodOptional<z.ZodString>;
@@ -1545,6 +1546,7 @@ export declare const zLine: z.ZodObject<{
1545
1546
  }>>>;
1546
1547
  value: z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>]>;
1547
1548
  }, z.core.$strip>, z.ZodRecord<z.ZodUnion<[z.ZodString, z.ZodNumber]>, z.ZodAny>]>>]>>>;
1549
+ measureId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
1548
1550
  dynamicFilter: z.ZodOptional<z.ZodObject<{
1549
1551
  type: z.ZodLiteral<"row-with-field">;
1550
1552
  description: z.ZodOptional<z.ZodString>;