@fluentui/react-charts 9.3.12 → 9.3.14
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.
- package/CHANGELOG.md +25 -2
- package/dist/index.d.ts +859 -0
- package/lib/VegaDeclarativeChart.js +1 -0
- package/lib/VegaDeclarativeChart.js.map +1 -0
- package/lib/components/LineChart/LineChart.js +47 -7
- package/lib/components/LineChart/LineChart.js.map +1 -1
- package/lib/components/ScatterChart/ScatterChart.js +12 -12
- package/lib/components/ScatterChart/ScatterChart.js.map +1 -1
- package/lib/components/VegaDeclarativeChart/VegaDeclarativeChart.js +405 -0
- package/lib/components/VegaDeclarativeChart/VegaDeclarativeChart.js.map +1 -0
- package/lib/components/VegaDeclarativeChart/VegaDeclarativeChartHooks.js +20 -0
- package/lib/components/VegaDeclarativeChart/VegaDeclarativeChartHooks.js.map +1 -0
- package/lib/components/VegaDeclarativeChart/VegaLiteColorAdapter.js +415 -0
- package/lib/components/VegaDeclarativeChart/VegaLiteColorAdapter.js.map +1 -0
- package/lib/components/VegaDeclarativeChart/VegaLiteExpressionEvaluator.js +537 -0
- package/lib/components/VegaDeclarativeChart/VegaLiteExpressionEvaluator.js.map +1 -0
- package/lib/components/VegaDeclarativeChart/VegaLiteSchemaAdapter.js +3279 -0
- package/lib/components/VegaDeclarativeChart/VegaLiteSchemaAdapter.js.map +1 -0
- package/lib/components/VegaDeclarativeChart/VegaLiteTypes.js +28 -0
- package/lib/components/VegaDeclarativeChart/VegaLiteTypes.js.map +1 -0
- package/lib/components/VegaDeclarativeChart/index.js +1 -0
- package/lib/components/VegaDeclarativeChart/index.js.map +1 -0
- package/lib/components/VerticalStackedBarChart/VerticalStackedBarChart.js +5 -2
- package/lib/components/VerticalStackedBarChart/VerticalStackedBarChart.js.map +1 -1
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -1
- package/lib/utilities/utilities.js +41 -0
- package/lib/utilities/utilities.js.map +1 -1
- package/lib-commonjs/VegaDeclarativeChart.js +6 -0
- package/lib-commonjs/VegaDeclarativeChart.js.map +1 -0
- package/lib-commonjs/components/LineChart/LineChart.js +46 -6
- package/lib-commonjs/components/LineChart/LineChart.js.map +1 -1
- package/lib-commonjs/components/ScatterChart/ScatterChart.js +11 -11
- package/lib-commonjs/components/ScatterChart/ScatterChart.js.map +1 -1
- package/lib-commonjs/components/VegaDeclarativeChart/VegaDeclarativeChart.js +274 -0
- package/lib-commonjs/components/VegaDeclarativeChart/VegaDeclarativeChart.js.map +1 -0
- package/lib-commonjs/components/VegaDeclarativeChart/VegaDeclarativeChartHooks.js +35 -0
- package/lib-commonjs/components/VegaDeclarativeChart/VegaDeclarativeChartHooks.js.map +1 -0
- package/lib-commonjs/components/VegaDeclarativeChart/VegaLiteColorAdapter.js +412 -0
- package/lib-commonjs/components/VegaDeclarativeChart/VegaLiteColorAdapter.js.map +1 -0
- package/lib-commonjs/components/VegaDeclarativeChart/VegaLiteExpressionEvaluator.js +533 -0
- package/lib-commonjs/components/VegaDeclarativeChart/VegaLiteExpressionEvaluator.js.map +1 -0
- package/lib-commonjs/components/VegaDeclarativeChart/VegaLiteSchemaAdapter.js +3214 -0
- package/lib-commonjs/components/VegaDeclarativeChart/VegaLiteSchemaAdapter.js.map +1 -0
- package/lib-commonjs/components/VegaDeclarativeChart/VegaLiteTypes.js +31 -0
- package/lib-commonjs/components/VegaDeclarativeChart/VegaLiteTypes.js.map +1 -0
- package/lib-commonjs/components/VegaDeclarativeChart/index.js +6 -0
- package/lib-commonjs/components/VegaDeclarativeChart/index.js.map +1 -0
- package/lib-commonjs/components/VerticalStackedBarChart/VerticalStackedBarChart.js +4 -1
- package/lib-commonjs/components/VerticalStackedBarChart/VerticalStackedBarChart.js.map +1 -1
- package/lib-commonjs/index.js +1 -0
- package/lib-commonjs/index.js.map +1 -1
- package/lib-commonjs/utilities/utilities.js +33 -0
- package/lib-commonjs/utilities/utilities.js.map +1 -1
- package/package.json +3 -3
|
@@ -299,16 +299,16 @@ const ScatterChart = /*#__PURE__*/ _react.forwardRef((props, forwardedRef)=>{
|
|
|
299
299
|
const seriesId = `${_seriesId}_${i}_${j}`;
|
|
300
300
|
const circleId = `${_circleId}_${i}_${j}`;
|
|
301
301
|
const pointMarkerSize = _points[i].data[j].markerSize;
|
|
302
|
-
const
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
}
|
|
302
|
+
const circleRadius = (0, _index1.calculateMarkerRadius)({
|
|
303
|
+
pointMarkerSize,
|
|
304
|
+
minMarkerSize,
|
|
305
|
+
maxMarkerSize,
|
|
306
|
+
extraMaxPixels,
|
|
307
|
+
isContinuousXY,
|
|
308
|
+
isActive: activePoint === circleId,
|
|
309
|
+
defaultRadius: 4,
|
|
310
|
+
activeRadius: 6
|
|
311
|
+
});
|
|
312
312
|
const isLegendSelected = _legendHighlighted(legendVal) || _noLegendHighlighted() || isSelectedLegend;
|
|
313
313
|
const currentPointHidden = _points[i].hideNonActiveDots && activePoint !== circleId;
|
|
314
314
|
const text = _points === null || _points === void 0 ? void 0 : (_points_i_data_j = _points[i].data[j]) === null || _points_i_data_j === void 0 ? void 0 : _points_i_data_j.text;
|
|
@@ -316,7 +316,7 @@ const ScatterChart = /*#__PURE__*/ _react.forwardRef((props, forwardedRef)=>{
|
|
|
316
316
|
pointsForSeries.push(/*#__PURE__*/ _react.createElement(_react.Fragment, null, /*#__PURE__*/ _react.createElement("circle", {
|
|
317
317
|
id: circleId,
|
|
318
318
|
key: circleId,
|
|
319
|
-
r:
|
|
319
|
+
r: circleRadius,
|
|
320
320
|
cx: xPoint + _xBandwidth,
|
|
321
321
|
cy: yPoint,
|
|
322
322
|
"data-is-focusable": isLegendSelected,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/ScatterChart/ScatterChart.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { ScatterChartProps } from './ScatterChart.types';\nimport { useScatterChartStyles } from './useScatterChartStyles.styles';\nimport { Axis as D3Axis } from 'd3-axis';\nimport { select as d3Select } from 'd3-selection';\nimport { Legend, Legends } from '../Legends/index';\nimport { max as d3Max, min as d3Min } from 'd3-array';\nimport { useId } from '@fluentui/react-utilities';\nimport type { JSXElement } from '@fluentui/react-utilities';\nimport {\n areArraysEqual,\n createNumericYAxis,\n createStringYAxis,\n getDomainPaddingForMarkers,\n domainRangeOfXStringAxis,\n findNumericMinMaxOfY,\n IDomainNRange,\n YAxisType,\n isTextMode,\n isScatterPolarSeries,\n isPlottable,\n getRangeForScatterMarkerSize,\n domainRangeOfDateForAreaLineScatterVerticalBarCharts,\n domainRangeOfNumericForAreaLineScatterCharts,\n sortAxisCategories,\n findCalloutPoints,\n} from '../../utilities/index';\nimport {\n AccessibilityProps,\n CartesianChart,\n ChildProps,\n CustomizedCalloutData,\n Margins,\n RefArrayData,\n ScatterChartDataPoint,\n ScatterChartPoints,\n YValueHover,\n} from '../../index';\nimport { tokens } from '@fluentui/react-theme';\nimport {\n calloutData,\n ChartTypes,\n XAxisTypes,\n getTypeOfAxis,\n getNextColor,\n getColorFromToken,\n} from '../../utilities/index';\nimport { LineChartPoints } from '../../types/DataPoint';\nimport { renderScatterPolarCategoryLabels } from '../../utilities/scatterpolar-utils';\nimport { formatDateToLocaleString } from '@fluentui/chart-utilities';\nimport { useImageExport } from '../../utilities/hooks';\n\ntype NumericAxis = D3Axis<number | { valueOf(): number }>;\n\ntype ScatterChartDataWithIndex = ScatterChartPoints & { index: number };\n\n// Create a ScatterChart variant which uses these default styles and this styled subcomponent.\n/**\n * ScatterChart component\n * {@docCategory ScatterChart}\n */\nexport const ScatterChart: React.FunctionComponent<ScatterChartProps> = React.forwardRef<\n HTMLDivElement,\n ScatterChartProps\n>((props, forwardedRef) => {\n const _circleId: string = useId('circle');\n const _seriesId: string = useId('seriesID');\n const _verticalLine: string = useId('verticalLine');\n const _firstRenderOptimization = true;\n const _emptyChartId: string = useId('_ScatterChart_empty');\n let _points: ScatterChartDataWithIndex[] = _injectIndexPropertyInScatterChartData(props.data.scatterChartData);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let _xAxisScale: any = '';\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let _yAxisScale: any = '';\n let _uniqueCallOutID: string | null = '';\n let _refArray: RefArrayData[] = [];\n let margins: Margins;\n let renderSeries: JSXElement[];\n let _xAxisLabels: string[] = [];\n let xAxisCalloutAccessibilityData: AccessibilityProps = {};\n let _xBandwidth = 0;\n const { cartesianChartRef, legendsRef: _legendsRef } = useImageExport(props.componentRef, props.hideLegend);\n const classes = useScatterChartStyles(props);\n\n const [hoverXValue, setHoverXValue] = React.useState<string | number>('');\n const [activeLegend, setActiveLegend] = React.useState<string>('');\n const [yValueHover, setYValueHover] = React.useState<YValueHover[]>([]);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const [selectedLegendPoints, setSelectedLegendPoints] = React.useState<any[]>([]);\n const [isSelectedLegend, setIsSelectedLegend] = React.useState<boolean>(false);\n const [activePoint, setActivePoint] = React.useState<string>('');\n const [stackCalloutProps, setStackCalloutProps] = React.useState<CustomizedCalloutData>();\n const [dataPointCalloutProps, setDataPointCalloutProps] = React.useState<CustomizedCalloutData>();\n const [clickPosition, setClickPosition] = React.useState({ x: 0, y: 0 });\n const [isPopoverOpen, setPopoverOpen] = React.useState(false);\n const [selectedLegends, setSelectedLegends] = React.useState<string[]>(props.legendProps?.selectedLegends || []);\n const prevSelectedLegendsRef = React.useRef<string[] | undefined>(undefined);\n const _isTextMode = React.useRef(false);\n const _isScatterPolarRef = React.useRef(false);\n\n React.useEffect(() => {\n if (\n prevSelectedLegendsRef.current &&\n !areArraysEqual(prevSelectedLegendsRef.current, props.legendProps?.selectedLegends)\n ) {\n setSelectedLegends(props.legendProps?.selectedLegends || []);\n }\n prevSelectedLegendsRef.current = props.legendProps?.selectedLegends;\n }, [props.legendProps?.selectedLegends]);\n\n const _xAxisType: XAxisTypes =\n props.data.scatterChartData! &&\n props.data.scatterChartData!.length > 0 &&\n props.data.scatterChartData![0].data &&\n props.data.scatterChartData![0].data.length > 0\n ? (getTypeOfAxis(props.data.scatterChartData![0].data[0].x, true) as XAxisTypes)\n : XAxisTypes.StringAxis;\n\n // Detect y axis type (numeric or string)\n const _yAxisType: YAxisType =\n props.data.scatterChartData &&\n props.data.scatterChartData.length > 0 &&\n props.data.scatterChartData[0].data &&\n props.data.scatterChartData[0].data.length > 0\n ? typeof props.data.scatterChartData[0].data[0].y === 'string'\n ? YAxisType.StringAxis\n : YAxisType.NumericAxis\n : YAxisType.NumericAxis;\n\n const pointsRef = React.useRef<ScatterChartDataWithIndex[] | []>([]);\n const calloutPointsRef = React.useRef<Record<string, YValueHover[]>>({});\n React.useEffect(() => {\n /** note that height and width are not used to resize or set as dimesions of the chart,\n * fitParentContainer is responisble for setting the height and width or resizing of the svg/chart\n */\n\n if (_points !== _injectIndexPropertyInScatterChartData(props.data.scatterChartData) || props.data !== _points) {\n pointsRef.current = _injectIndexPropertyInScatterChartData(props.data.scatterChartData);\n calloutPointsRef.current = calloutData(pointsRef.current);\n }\n }, [props.height, props.width, props.data, _points]);\n\n function _injectIndexPropertyInScatterChartData(\n scatterChartData?: ScatterChartPoints[],\n ): ScatterChartDataWithIndex[] | [] {\n return scatterChartData\n ? scatterChartData.map((item: ScatterChartPoints, index: number) => {\n let color: string;\n if (typeof item.color === 'undefined') {\n color = getNextColor(index, 0);\n } else {\n color = getColorFromToken(item.color);\n }\n return {\n ...item,\n index: -1,\n color,\n };\n })\n : [];\n }\n\n function updatePosition(newX: number, newY: number) {\n const threshold = 1; // Set a threshold for movement\n const { x, y } = clickPosition;\n // Calculate the distance moved\n const distance = Math.sqrt(Math.pow(newX - x, 2) + Math.pow(newY - y, 2));\n // Update the position only if the distance moved is greater than the threshold\n if (distance > threshold) {\n setClickPosition({ x: newX, y: newY });\n setPopoverOpen(true);\n }\n }\n\n function _getNumericMinMaxOfY(\n points: ScatterChartPoints[],\n yAxisType?: YAxisType,\n ): { startValue: number; endValue: number } {\n const { startValue, endValue } = findNumericMinMaxOfY(points, yAxisType);\n const yPadding = getDomainPaddingForMarkers(startValue, endValue, props.yScaleType);\n\n return {\n startValue: startValue - yPadding.start,\n endValue: endValue + yPadding.end,\n };\n }\n\n function _getDomainNRangeValues(\n points: any,\n margins: Margins,\n width: number,\n chartType: ChartTypes,\n isRTL: boolean,\n xAxisType: XAxisTypes,\n barWidth: number,\n tickValues: Date[] | number[] | undefined,\n ) {\n let domainNRangeValue: IDomainNRange;\n if (xAxisType === XAxisTypes.NumericAxis) {\n domainNRangeValue = domainRangeOfNumericForAreaLineScatterCharts(\n points,\n margins,\n width,\n isRTL,\n props.xScaleType,\n true,\n props.xMinValue,\n props.xMaxValue,\n );\n } else if (xAxisType === XAxisTypes.DateAxis) {\n domainNRangeValue = domainRangeOfDateForAreaLineScatterVerticalBarCharts(\n points,\n margins,\n width,\n isRTL,\n tickValues! as Date[],\n chartType,\n );\n } else {\n domainNRangeValue = domainRangeOfXStringAxis(margins, width, isRTL);\n }\n return domainNRangeValue;\n }\n\n function _getMargins(_margins: Margins) {\n margins = _margins;\n }\n\n function _initializeScatterChartData(\n xScale: NumericAxis,\n yScale: NumericAxis,\n containerHeight: number,\n containerWidth: number,\n xElement: SVGElement | null,\n ) {\n _xAxisScale = xScale;\n _yAxisScale = yScale;\n _isTextMode.current = isTextMode(_points);\n _isScatterPolarRef.current = isScatterPolarSeries(_points);\n renderSeries = _createPlot(xElement!, containerHeight!);\n }\n\n function _onHoverCardHide() {\n setSelectedLegendPoints([]);\n setIsSelectedLegend(false);\n }\n\n function _createLegends(data: ScatterChartDataWithIndex[]): JSXElement {\n const { legendProps } = props;\n const isLegendMultiSelectEnabled = !!(legendProps && !!legendProps.canSelectMultipleLegends);\n const mapLegendToPoints: Record<string, ScatterChartDataWithIndex[]> = {};\n data.forEach((point: ScatterChartDataWithIndex) => {\n if (point.legend) {\n if (!mapLegendToPoints[point.legend]) {\n mapLegendToPoints[point.legend] = [];\n }\n mapLegendToPoints[point.legend].push(point);\n }\n });\n const legendDataItems: Legend[] = Object.entries(mapLegendToPoints).map(([legendTitle, points]) => {\n const representativePoint = points[0];\n // mapping data to the format Legends component needs\n const legend: Legend = {\n title: legendTitle,\n color: representativePoint.color!,\n onMouseOutAction: () => {\n setActiveLegend('');\n },\n hoverAction: () => {\n _handleChartMouseLeave();\n setActiveLegend(legendTitle);\n },\n ...(representativePoint.legendShape && {\n shape: representativePoint.legendShape,\n }),\n };\n return legend;\n });\n\n return (\n <Legends\n legends={[...legendDataItems]}\n enabledWrapLines={props.enabledLegendsWrapLines}\n overflowText={props.legendsOverflowText}\n {...(isLegendMultiSelectEnabled && { onLegendHoverCardLeave: _onHoverCardHide })}\n {...props.legendProps}\n selectedLegends={selectedLegends}\n onChange={_onLegendSelectionChange}\n legendRef={_legendsRef}\n />\n );\n }\n\n function _getOrderedYAxisLabels() {\n const shouldOrderYAxisLabelsByCategoryOrder =\n _yAxisType === YAxisType.StringAxis && props.yAxisCategoryOrder !== 'default';\n if (!shouldOrderYAxisLabelsByCategoryOrder) {\n // Collect all unique string y values from all data points in all series, in reverse order\n const yLabelsSet = new Set<string>();\n for (let i = _points.length - 1; i >= 0; i--) {\n const point = _points[i];\n if (point.data && Array.isArray(point.data)) {\n for (const d of point.data) {\n if (typeof d.y === 'string') {\n yLabelsSet.add(d.y);\n }\n }\n }\n }\n return Array.from(yLabelsSet);\n }\n\n return sortAxisCategories(_mapCategoryToValues(), props.yAxisCategoryOrder);\n }\n\n function _mapCategoryToValues() {\n const categoryToValues: Record<string, number[]> = {};\n _points.forEach(point => {\n if (point.data && Array.isArray(point.data)) {\n point.data.forEach(d => {\n if (typeof d.y === 'string') {\n if (!categoryToValues[d.y]) {\n categoryToValues[d.y] = [];\n }\n if (typeof d.x === 'number') {\n categoryToValues[d.y].push(d.x);\n }\n }\n });\n }\n });\n return categoryToValues;\n }\n\n function _onLegendSelectionChange(\n legendsSelected: string[],\n event: React.MouseEvent<HTMLButtonElement>,\n currentLegend?: Legend,\n ): void {\n if (props.legendProps?.canSelectMultipleLegends) {\n setSelectedLegends(legendsSelected);\n } else {\n setSelectedLegends(legendsSelected.slice(-1));\n }\n\n if (props.legendProps?.onChange) {\n props.legendProps.onChange(legendsSelected, event, currentLegend);\n }\n }\n\n function _getPointFill(seriesColor: string, pointId: string, pointIndex: number, isLastPoint: boolean) {\n if (activePoint === pointId) {\n return tokens.colorNeutralBackground1;\n } else {\n return seriesColor;\n }\n }\n\n function _createPlot(xElement: SVGElement, containerHeight: number): JSXElement[] {\n const series: JSXElement[] = [];\n if (isSelectedLegend) {\n _points = selectedLegendPoints;\n } else {\n _points = _injectIndexPropertyInScatterChartData(props.data.scatterChartData);\n }\n\n if (_xAxisType === XAxisTypes.StringAxis) {\n _xBandwidth = _xAxisScale.bandwidth() / 2;\n }\n\n const minMarkerSize =\n d3Min(_points, (point: ScatterChartPoints) => {\n return d3Min(point.data as ScatterChartDataPoint[], (item: ScatterChartDataPoint) => {\n return item.markerSize as number;\n });\n }) ?? 0;\n const maxMarkerSize =\n d3Max(_points, (point: ScatterChartPoints) => {\n return d3Max(point.data as ScatterChartDataPoint[], (item: ScatterChartDataPoint) => {\n return item.markerSize as number;\n });\n }) ?? 0;\n const isContinuousXY = _xAxisType !== XAxisTypes.StringAxis && _yAxisType !== YAxisType.StringAxis;\n const extraMaxPixels = isContinuousXY\n ? getRangeForScatterMarkerSize({\n data: _points,\n xScale: _xAxisScale,\n yScalePrimary: _yAxisScale,\n xScaleType: props.xScaleType,\n yScaleType: props.yScaleType,\n })\n : 0;\n\n for (let i = _points.length - 1; i >= 0; i--) {\n const pointsForSeries: JSXElement[] = [];\n\n const legendVal: string = _points[i].legend;\n const seriesColor: string = _points[i].color!;\n const verticaLineHeight = containerHeight - margins.bottom! + 6;\n\n for (let j = 0; j < _points[i].data.length; j++) {\n const { x, y, xAxisCalloutData, xAxisCalloutAccessibilityData } = _points?.[i]?.data[j];\n const xPoint = _xAxisScale?.(x);\n // Use string y axis scale if needed\n const yPoint =\n _yAxisType === YAxisType.StringAxis\n ? _yAxisScale?.(y) + (_yAxisScale?.bandwidth ? _yAxisScale.bandwidth() / 2 : 0)\n : _yAxisScale?.(y);\n if (!isPlottable(xPoint, yPoint)) {\n continue;\n }\n const seriesId = `${_seriesId}_${i}_${j}`;\n const circleId = `${_circleId}_${i}_${j}`;\n const pointMarkerSize = (_points[i].data[j] as ScatterChartDataPoint).markerSize;\n const minPixel = 4;\n const maxPixel = 16;\n let circleRadius = activePoint === circleId ? 6 : 4;\n\n if (pointMarkerSize) {\n if (isContinuousXY && maxMarkerSize !== 0) {\n circleRadius = (pointMarkerSize * extraMaxPixels) / maxMarkerSize;\n } else if (!isContinuousXY && maxMarkerSize !== minMarkerSize) {\n circleRadius =\n minPixel + ((pointMarkerSize - minMarkerSize) / (maxMarkerSize - minMarkerSize)) * (maxPixel - minPixel);\n }\n }\n\n const isLegendSelected: boolean = _legendHighlighted(legendVal) || _noLegendHighlighted() || isSelectedLegend;\n\n const currentPointHidden = _points[i].hideNonActiveDots && activePoint !== circleId;\n const text = _points?.[i].data[j]?.text;\n if (!_isTextMode.current) {\n pointsForSeries.push(\n <>\n <circle\n id={circleId}\n key={circleId}\n r={Math.max(circleRadius, 4)}\n cx={xPoint + _xBandwidth}\n cy={yPoint}\n data-is-focusable={isLegendSelected}\n onMouseOver={(event: React.MouseEvent<SVGElement>) =>\n _handleHover(\n x,\n y,\n verticaLineHeight,\n xAxisCalloutData,\n circleId,\n xAxisCalloutAccessibilityData,\n event,\n )\n }\n onMouseMove={(event: React.MouseEvent<SVGElement>) =>\n _handleHover(\n x,\n y,\n verticaLineHeight,\n xAxisCalloutData,\n circleId,\n xAxisCalloutAccessibilityData,\n event,\n )\n }\n onMouseOut={_handleMouseOut}\n onFocus={event =>\n _handleFocus(event, seriesId, x, xAxisCalloutData, circleId, xAxisCalloutAccessibilityData)\n }\n onBlur={_handleMouseOut}\n {..._getClickHandler(_points[i].data[j].onDataPointClick)}\n opacity={isLegendSelected && !currentPointHidden ? 1 : 0.1}\n fill={_getPointFill(seriesColor, circleId, j, false)}\n stroke={seriesColor}\n role=\"img\"\n aria-label={_getAriaLabel(i, j)}\n tabIndex={isLegendSelected ? 0 : undefined}\n />\n ,\n {text && (\n <text\n key={`${circleId}-label`}\n x={xPoint + _xBandwidth}\n y={yPoint + Math.max(circleRadius + 12, 16)}\n className={classes.markerLabel}\n >\n {text}\n </text>\n )}\n </>,\n );\n }\n }\n\n if (_isScatterPolarRef.current) {\n pointsForSeries.push(\n ...renderScatterPolarCategoryLabels({\n xAxisScale: _xAxisScale,\n yAxisScale: _yAxisScale,\n className: classes.markerLabel || '',\n lineOptions: (_points?.[i] as Partial<LineChartPoints>)?.lineOptions,\n }),\n );\n }\n\n series.push(\n <g\n key={`series_${i}`}\n role=\"region\"\n aria-label={`${legendVal}, series ${i + 1} of ${_points.length} with ${_points[i].data.length} data points.`}\n >\n {pointsForSeries}\n </g>,\n );\n }\n return series;\n }\n\n function _handleFocus(\n event: React.FocusEvent<SVGCircleElement, Element>,\n seriesId: string,\n x: number | Date | string,\n xAxisCalloutData: string | undefined,\n circleId: string,\n xAxisCalloutAccessibilityData?: AccessibilityProps,\n ) {\n let cx = 0;\n let cy = 0;\n\n const targetRect = (event.target as SVGCircleElement).getBoundingClientRect();\n cx = targetRect.left + targetRect.width / 2;\n cy = targetRect.top + targetRect.height / 2;\n updatePosition(cx, cy);\n _uniqueCallOutID = circleId;\n const formattedData = x instanceof Date ? formatDateToLocaleString(x, props.culture, props.useUTC as boolean) : x;\n const found = findCalloutPoints(calloutPointsRef.current, x) as CustomizedCalloutData | undefined;\n // if no points need to be called out then don't show vertical line and callout card\n\n if (found) {\n d3Select(`#${_verticalLine}`)\n .attr('transform', () => `translate(${_xAxisScale(x) + _xBandwidth}, 0)`)\n .attr('visibility', 'visibility');\n _refArray.forEach((obj: RefArrayData) => {\n if (obj.index === seriesId) {\n setPopoverOpen(true);\n xAxisCalloutData ? setHoverXValue(xAxisCalloutData) : setHoverXValue('' + formattedData);\n setYValueHover(found.values);\n setStackCalloutProps(found!);\n setDataPointCalloutProps(found!);\n setActivePoint(circleId);\n }\n });\n } else {\n setActivePoint(circleId);\n }\n }\n\n function _handleHover(\n x: number | Date | string,\n y: number,\n lineHeight: number,\n xAxisCalloutData: string | undefined,\n circleId: string,\n xAxisCalloutAccessibilityData: AccessibilityProps | undefined,\n mouseEvent: React.MouseEvent<SVGElement>,\n ) {\n mouseEvent?.persist();\n const formattedData = x instanceof Date ? formatDateToLocaleString(x, props.culture, props.useUTC as boolean) : x;\n const found = findCalloutPoints(calloutPointsRef.current, x) as CustomizedCalloutData | undefined;\n // if no points need to be called out then don't show vertical line and callout card\n\n if (found) {\n d3Select(`#${_verticalLine}`)\n .attr('transform', () => `translate(${_xAxisScale(x) + _xBandwidth}, ${_yAxisScale(y)})`)\n .attr('visibility', 'visibility')\n .attr('y2', `${lineHeight - _yAxisScale(y)}`);\n\n if (_uniqueCallOutID !== circleId) {\n _uniqueCallOutID = circleId;\n updatePosition(mouseEvent.clientX, mouseEvent.clientY);\n xAxisCalloutData ? setHoverXValue(xAxisCalloutData) : setHoverXValue('' + formattedData);\n setYValueHover(found.values);\n setStackCalloutProps(found!);\n setDataPointCalloutProps(found!);\n setActivePoint(circleId);\n }\n } else {\n setActivePoint(circleId);\n }\n }\n\n /**\n * Screen readers announce an element as clickable if the onClick attribute is set.\n * This function sets the attribute only when a click event handler is provided.*/\n\n function _getClickHandler(func?: () => void): { onClick?: () => void } {\n if (func) {\n return {\n onClick: func,\n };\n }\n\n return {};\n }\n\n function _handleMouseOut() {\n d3Select(`#${_verticalLine}`).attr('visibility', 'hidden');\n }\n\n function _handleChartMouseLeave() {\n _uniqueCallOutID = null;\n setActivePoint('');\n if (isPopoverOpen) {\n setPopoverOpen(false);\n }\n }\n\n function _getCustomizedCallout() {\n return props.onRenderCalloutPerStack\n ? props.onRenderCalloutPerStack(stackCalloutProps)\n : props.onRenderCalloutPerDataPoint\n ? props.onRenderCalloutPerDataPoint(dataPointCalloutProps)\n : null;\n }\n\n /**\n * This function checks if the given legend is highlighted or not.\n * A legend can be highlighted in 2 ways:\n * 1. selection: if the user clicks on it\n * 2. hovering: if there is no selected legend and the user hovers over it*/\n\n function _legendHighlighted(legend: string): boolean {\n return _getHighlightedLegend().includes(legend);\n }\n\n /**\n * This function checks if none of the legends is selected or hovered.*/\n\n function _noLegendHighlighted(): boolean {\n return _getHighlightedLegend().length === 0;\n }\n\n function _getHighlightedLegend(): string[] {\n return selectedLegends.length > 0 ? selectedLegends : activeLegend ? [activeLegend] : [];\n }\n\n function _getAriaLabel(seriesIndex: number, pointIndex: number): string {\n const series = _points[seriesIndex];\n const point = series.data[pointIndex];\n const formattedDate =\n point.x instanceof Date ? formatDateToLocaleString(point.x, props.culture, props.useUTC as boolean) : point.x;\n const xValue = point.xAxisCalloutData || formattedDate;\n const legend = series.legend;\n const yValue = point.yAxisCalloutData || point.y;\n return point.callOutAccessibilityData?.ariaLabel || `${xValue}. ${legend}, ${yValue}.`;\n }\n\n function _isChartEmpty(): boolean {\n return !(\n props.data &&\n props.data.scatterChartData &&\n props.data.scatterChartData.length > 0 &&\n props.data.scatterChartData.filter((item: ScatterChartPoints) => item.data.length).length > 0\n );\n }\n\n const { legendProps, tickValues, tickFormat } = props;\n _points = _injectIndexPropertyInScatterChartData(props.data.scatterChartData);\n\n let points = _points as ScatterChartPoints[];\n if (legendProps && !!legendProps.canSelectMultipleLegends) {\n points = selectedLegendPoints.length >= 1 ? selectedLegendPoints : _points;\n calloutPointsRef.current = calloutData(points);\n }\n\n let legendBars = null;\n // reduce computation cost by only creating legendBars\n // if when hideLegend is false.\n // NOTE: they are rendered only when hideLegend is false in CartesianChart.\n if (!props.hideLegend && !_isTextMode.current) {\n legendBars = _createLegends(_points!); // ToDo: Memoize legends to improve performance.\n }\n const calloutProps = {\n YValueHover: yValueHover,\n hoverXValue,\n descriptionMessage:\n props.getCalloutDescriptionMessage && stackCalloutProps\n ? props.getCalloutDescriptionMessage(stackCalloutProps)\n : undefined,\n 'data-is-focusable': true,\n xAxisCalloutAccessibilityData,\n ...props.calloutProps,\n clickPosition,\n isPopoverOpen,\n isCalloutForStack: true,\n culture: props.culture,\n isCartesian: true,\n customCallout: {\n customizedCallout: _getCustomizedCallout() !== null ? _getCustomizedCallout()! : undefined,\n customCalloutProps: props.calloutPropsPerDataPoint\n ? props.calloutPropsPerDataPoint(dataPointCalloutProps!)\n : undefined,\n },\n };\n const tickParams = {\n tickValues,\n tickFormat,\n };\n\n const xAxisLabels: string[] = _points\n .map((point: ScatterChartDataWithIndex) => point.data.map((dp: ScatterChartDataPoint) => dp.x as string))\n .flat();\n\n _xAxisLabels = [...new Set(xAxisLabels)];\n\n // Compute unique y axis labels for string y axis\n const _yAxisLabels: string[] = _getOrderedYAxisLabels();\n\n return !_isChartEmpty() ? (\n <CartesianChart\n {...props}\n chartTitle={props.data.chartTitle}\n points={points}\n chartType={ChartTypes.ScatterChart}\n calloutProps={calloutProps}\n tickParams={tickParams}\n legendBars={legendBars}\n getmargins={_getMargins}\n getGraphData={_initializeScatterChartData}\n xAxisType={_xAxisType}\n yAxisType={_yAxisType}\n // Pass stringDatasetForYAxisDomain only if y axis is string\n {...(_yAxisType === YAxisType.StringAxis ? { stringDatasetForYAxisDomain: _yAxisLabels } : {})}\n getMinMaxOfYAxis={_getNumericMinMaxOfY}\n getDomainNRangeValues={_getDomainNRangeValues}\n createYAxis={createNumericYAxis}\n createStringYAxis={createStringYAxis}\n onChartMouseLeave={_handleChartMouseLeave}\n enableFirstRenderOptimization={_firstRenderOptimization}\n datasetForXAxisDomain={_xAxisLabels}\n componentRef={cartesianChartRef}\n {...(_isScatterPolarRef.current ? { yMaxValue: 1, yMinValue: -1 } : {})}\n /* eslint-disable react/jsx-no-bind */\n // eslint-disable-next-line react/no-children-prop\n children={(props: ChildProps) => {\n _xAxisScale = props.xScale!;\n _yAxisScale = props.yScalePrimary!;\n return (\n <>\n <g>\n <line\n x1={0}\n y1={0}\n x2={0}\n y2={props.containerHeight}\n stroke={'#323130'}\n id={_verticalLine}\n visibility={'hidden'}\n strokeDasharray={'5,5'}\n />\n <g>{renderSeries}</g>\n </g>\n </>\n );\n }}\n />\n ) : (\n <div id={_emptyChartId} role={'alert'} style={{ opacity: '0' }} aria-label={'Graph has no data to display'} />\n );\n});\nScatterChart.displayName = 'ScatterChart';\n"],"names":["React","useScatterChartStyles","select","d3Select","Legends","max","d3Max","min","d3Min","useId","areArraysEqual","createNumericYAxis","createStringYAxis","getDomainPaddingForMarkers","domainRangeOfXStringAxis","findNumericMinMaxOfY","YAxisType","isTextMode","isScatterPolarSeries","isPlottable","getRangeForScatterMarkerSize","domainRangeOfDateForAreaLineScatterVerticalBarCharts","domainRangeOfNumericForAreaLineScatterCharts","sortAxisCategories","findCalloutPoints","CartesianChart","tokens","calloutData","ChartTypes","XAxisTypes","getTypeOfAxis","getNextColor","getColorFromToken","renderScatterPolarCategoryLabels","formatDateToLocaleString","useImageExport","ScatterChart","forwardRef","props","forwardedRef","_circleId","_seriesId","_verticalLine","_firstRenderOptimization","_emptyChartId","_points","_injectIndexPropertyInScatterChartData","data","scatterChartData","_xAxisScale","_yAxisScale","_uniqueCallOutID","_refArray","margins","renderSeries","_xAxisLabels","xAxisCalloutAccessibilityData","_xBandwidth","cartesianChartRef","legendsRef","_legendsRef","componentRef","hideLegend","classes","hoverXValue","setHoverXValue","useState","activeLegend","setActiveLegend","yValueHover","setYValueHover","selectedLegendPoints","setSelectedLegendPoints","isSelectedLegend","setIsSelectedLegend","activePoint","setActivePoint","stackCalloutProps","setStackCalloutProps","dataPointCalloutProps","setDataPointCalloutProps","clickPosition","setClickPosition","x","y","isPopoverOpen","setPopoverOpen","selectedLegends","setSelectedLegends","legendProps","prevSelectedLegendsRef","useRef","undefined","_isTextMode","_isScatterPolarRef","useEffect","current","_xAxisType","length","StringAxis","_yAxisType","NumericAxis","pointsRef","calloutPointsRef","height","width","map","item","index","color","updatePosition","newX","newY","threshold","distance","Math","sqrt","pow","_getNumericMinMaxOfY","points","yAxisType","startValue","endValue","yPadding","yScaleType","start","end","_getDomainNRangeValues","chartType","isRTL","xAxisType","barWidth","tickValues","domainNRangeValue","xScaleType","xMinValue","xMaxValue","DateAxis","_getMargins","_margins","_initializeScatterChartData","xScale","yScale","containerHeight","containerWidth","xElement","_createPlot","_onHoverCardHide","_createLegends","isLegendMultiSelectEnabled","canSelectMultipleLegends","mapLegendToPoints","forEach","point","legend","push","legendDataItems","Object","entries","legendTitle","representativePoint","title","onMouseOutAction","hoverAction","_handleChartMouseLeave","legendShape","shape","legends","enabledWrapLines","enabledLegendsWrapLines","overflowText","legendsOverflowText","onLegendHoverCardLeave","onChange","_onLegendSelectionChange","legendRef","_getOrderedYAxisLabels","shouldOrderYAxisLabelsByCategoryOrder","yAxisCategoryOrder","yLabelsSet","Set","i","Array","isArray","d","add","from","_mapCategoryToValues","categoryToValues","legendsSelected","event","currentLegend","slice","_getPointFill","seriesColor","pointId","pointIndex","isLastPoint","colorNeutralBackground1","series","bandwidth","minMarkerSize","markerSize","maxMarkerSize","isContinuousXY","extraMaxPixels","yScalePrimary","pointsForSeries","legendVal","verticaLineHeight","bottom","j","xAxisCalloutData","xPoint","yPoint","seriesId","circleId","pointMarkerSize","minPixel","maxPixel","circleRadius","isLegendSelected","_legendHighlighted","_noLegendHighlighted","currentPointHidden","hideNonActiveDots","text","circle","id","key","r","cx","cy","data-is-focusable","onMouseOver","_handleHover","onMouseMove","onMouseOut","_handleMouseOut","onFocus","_handleFocus","onBlur","_getClickHandler","onDataPointClick","opacity","fill","stroke","role","aria-label","_getAriaLabel","tabIndex","className","markerLabel","xAxisScale","yAxisScale","lineOptions","g","targetRect","target","getBoundingClientRect","left","top","formattedData","Date","culture","useUTC","found","attr","obj","values","lineHeight","mouseEvent","persist","clientX","clientY","func","onClick","_getCustomizedCallout","onRenderCalloutPerStack","onRenderCalloutPerDataPoint","_getHighlightedLegend","includes","seriesIndex","formattedDate","xValue","yValue","yAxisCalloutData","callOutAccessibilityData","ariaLabel","_isChartEmpty","filter","tickFormat","legendBars","calloutProps","YValueHover","descriptionMessage","getCalloutDescriptionMessage","isCalloutForStack","isCartesian","customCallout","customizedCallout","customCalloutProps","calloutPropsPerDataPoint","tickParams","xAxisLabels","dp","flat","_yAxisLabels","chartTitle","getmargins","getGraphData","stringDatasetForYAxisDomain","getMinMaxOfYAxis","getDomainNRangeValues","createYAxis","onChartMouseLeave","enableFirstRenderOptimization","datasetForXAxisDomain","yMaxValue","yMinValue","children","line","x1","y1","x2","y2","visibility","strokeDasharray","div","style","displayName"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../src/components/ScatterChart/ScatterChart.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { ScatterChartProps } from './ScatterChart.types';\nimport { useScatterChartStyles } from './useScatterChartStyles.styles';\nimport { Axis as D3Axis } from 'd3-axis';\nimport { select as d3Select } from 'd3-selection';\nimport { Legend, Legends } from '../Legends/index';\nimport { max as d3Max, min as d3Min } from 'd3-array';\nimport { useId } from '@fluentui/react-utilities';\nimport type { JSXElement } from '@fluentui/react-utilities';\nimport {\n areArraysEqual,\n createNumericYAxis,\n createStringYAxis,\n getDomainPaddingForMarkers,\n domainRangeOfXStringAxis,\n findNumericMinMaxOfY,\n IDomainNRange,\n YAxisType,\n isTextMode,\n isScatterPolarSeries,\n isPlottable,\n getRangeForScatterMarkerSize,\n calculateMarkerRadius,\n domainRangeOfDateForAreaLineScatterVerticalBarCharts,\n domainRangeOfNumericForAreaLineScatterCharts,\n sortAxisCategories,\n findCalloutPoints,\n} from '../../utilities/index';\nimport {\n AccessibilityProps,\n CartesianChart,\n ChildProps,\n CustomizedCalloutData,\n Margins,\n RefArrayData,\n ScatterChartDataPoint,\n ScatterChartPoints,\n YValueHover,\n} from '../../index';\nimport { tokens } from '@fluentui/react-theme';\nimport {\n calloutData,\n ChartTypes,\n XAxisTypes,\n getTypeOfAxis,\n getNextColor,\n getColorFromToken,\n} from '../../utilities/index';\nimport { LineChartPoints } from '../../types/DataPoint';\nimport { renderScatterPolarCategoryLabels } from '../../utilities/scatterpolar-utils';\nimport { formatDateToLocaleString } from '@fluentui/chart-utilities';\nimport { useImageExport } from '../../utilities/hooks';\n\ntype NumericAxis = D3Axis<number | { valueOf(): number }>;\n\ntype ScatterChartDataWithIndex = ScatterChartPoints & { index: number };\n\n// Create a ScatterChart variant which uses these default styles and this styled subcomponent.\n/**\n * ScatterChart component\n * {@docCategory ScatterChart}\n */\nexport const ScatterChart: React.FunctionComponent<ScatterChartProps> = React.forwardRef<\n HTMLDivElement,\n ScatterChartProps\n>((props, forwardedRef) => {\n const _circleId: string = useId('circle');\n const _seriesId: string = useId('seriesID');\n const _verticalLine: string = useId('verticalLine');\n const _firstRenderOptimization = true;\n const _emptyChartId: string = useId('_ScatterChart_empty');\n let _points: ScatterChartDataWithIndex[] = _injectIndexPropertyInScatterChartData(props.data.scatterChartData);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let _xAxisScale: any = '';\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let _yAxisScale: any = '';\n let _uniqueCallOutID: string | null = '';\n let _refArray: RefArrayData[] = [];\n let margins: Margins;\n let renderSeries: JSXElement[];\n let _xAxisLabels: string[] = [];\n let xAxisCalloutAccessibilityData: AccessibilityProps = {};\n let _xBandwidth = 0;\n const { cartesianChartRef, legendsRef: _legendsRef } = useImageExport(props.componentRef, props.hideLegend);\n const classes = useScatterChartStyles(props);\n\n const [hoverXValue, setHoverXValue] = React.useState<string | number>('');\n const [activeLegend, setActiveLegend] = React.useState<string>('');\n const [yValueHover, setYValueHover] = React.useState<YValueHover[]>([]);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const [selectedLegendPoints, setSelectedLegendPoints] = React.useState<any[]>([]);\n const [isSelectedLegend, setIsSelectedLegend] = React.useState<boolean>(false);\n const [activePoint, setActivePoint] = React.useState<string>('');\n const [stackCalloutProps, setStackCalloutProps] = React.useState<CustomizedCalloutData>();\n const [dataPointCalloutProps, setDataPointCalloutProps] = React.useState<CustomizedCalloutData>();\n const [clickPosition, setClickPosition] = React.useState({ x: 0, y: 0 });\n const [isPopoverOpen, setPopoverOpen] = React.useState(false);\n const [selectedLegends, setSelectedLegends] = React.useState<string[]>(props.legendProps?.selectedLegends || []);\n const prevSelectedLegendsRef = React.useRef<string[] | undefined>(undefined);\n const _isTextMode = React.useRef(false);\n const _isScatterPolarRef = React.useRef(false);\n\n React.useEffect(() => {\n if (\n prevSelectedLegendsRef.current &&\n !areArraysEqual(prevSelectedLegendsRef.current, props.legendProps?.selectedLegends)\n ) {\n setSelectedLegends(props.legendProps?.selectedLegends || []);\n }\n prevSelectedLegendsRef.current = props.legendProps?.selectedLegends;\n }, [props.legendProps?.selectedLegends]);\n\n const _xAxisType: XAxisTypes =\n props.data.scatterChartData! &&\n props.data.scatterChartData!.length > 0 &&\n props.data.scatterChartData![0].data &&\n props.data.scatterChartData![0].data.length > 0\n ? (getTypeOfAxis(props.data.scatterChartData![0].data[0].x, true) as XAxisTypes)\n : XAxisTypes.StringAxis;\n\n // Detect y axis type (numeric or string)\n const _yAxisType: YAxisType =\n props.data.scatterChartData &&\n props.data.scatterChartData.length > 0 &&\n props.data.scatterChartData[0].data &&\n props.data.scatterChartData[0].data.length > 0\n ? typeof props.data.scatterChartData[0].data[0].y === 'string'\n ? YAxisType.StringAxis\n : YAxisType.NumericAxis\n : YAxisType.NumericAxis;\n\n const pointsRef = React.useRef<ScatterChartDataWithIndex[] | []>([]);\n const calloutPointsRef = React.useRef<Record<string, YValueHover[]>>({});\n React.useEffect(() => {\n /** note that height and width are not used to resize or set as dimesions of the chart,\n * fitParentContainer is responisble for setting the height and width or resizing of the svg/chart\n */\n\n if (_points !== _injectIndexPropertyInScatterChartData(props.data.scatterChartData) || props.data !== _points) {\n pointsRef.current = _injectIndexPropertyInScatterChartData(props.data.scatterChartData);\n calloutPointsRef.current = calloutData(pointsRef.current);\n }\n }, [props.height, props.width, props.data, _points]);\n\n function _injectIndexPropertyInScatterChartData(\n scatterChartData?: ScatterChartPoints[],\n ): ScatterChartDataWithIndex[] | [] {\n return scatterChartData\n ? scatterChartData.map((item: ScatterChartPoints, index: number) => {\n let color: string;\n if (typeof item.color === 'undefined') {\n color = getNextColor(index, 0);\n } else {\n color = getColorFromToken(item.color);\n }\n return {\n ...item,\n index: -1,\n color,\n };\n })\n : [];\n }\n\n function updatePosition(newX: number, newY: number) {\n const threshold = 1; // Set a threshold for movement\n const { x, y } = clickPosition;\n // Calculate the distance moved\n const distance = Math.sqrt(Math.pow(newX - x, 2) + Math.pow(newY - y, 2));\n // Update the position only if the distance moved is greater than the threshold\n if (distance > threshold) {\n setClickPosition({ x: newX, y: newY });\n setPopoverOpen(true);\n }\n }\n\n function _getNumericMinMaxOfY(\n points: ScatterChartPoints[],\n yAxisType?: YAxisType,\n ): { startValue: number; endValue: number } {\n const { startValue, endValue } = findNumericMinMaxOfY(points, yAxisType);\n const yPadding = getDomainPaddingForMarkers(startValue, endValue, props.yScaleType);\n\n return {\n startValue: startValue - yPadding.start,\n endValue: endValue + yPadding.end,\n };\n }\n\n function _getDomainNRangeValues(\n points: any,\n margins: Margins,\n width: number,\n chartType: ChartTypes,\n isRTL: boolean,\n xAxisType: XAxisTypes,\n barWidth: number,\n tickValues: Date[] | number[] | undefined,\n ) {\n let domainNRangeValue: IDomainNRange;\n if (xAxisType === XAxisTypes.NumericAxis) {\n domainNRangeValue = domainRangeOfNumericForAreaLineScatterCharts(\n points,\n margins,\n width,\n isRTL,\n props.xScaleType,\n true,\n props.xMinValue,\n props.xMaxValue,\n );\n } else if (xAxisType === XAxisTypes.DateAxis) {\n domainNRangeValue = domainRangeOfDateForAreaLineScatterVerticalBarCharts(\n points,\n margins,\n width,\n isRTL,\n tickValues! as Date[],\n chartType,\n );\n } else {\n domainNRangeValue = domainRangeOfXStringAxis(margins, width, isRTL);\n }\n return domainNRangeValue;\n }\n\n function _getMargins(_margins: Margins) {\n margins = _margins;\n }\n\n function _initializeScatterChartData(\n xScale: NumericAxis,\n yScale: NumericAxis,\n containerHeight: number,\n containerWidth: number,\n xElement: SVGElement | null,\n ) {\n _xAxisScale = xScale;\n _yAxisScale = yScale;\n _isTextMode.current = isTextMode(_points);\n _isScatterPolarRef.current = isScatterPolarSeries(_points);\n renderSeries = _createPlot(xElement!, containerHeight!);\n }\n\n function _onHoverCardHide() {\n setSelectedLegendPoints([]);\n setIsSelectedLegend(false);\n }\n\n function _createLegends(data: ScatterChartDataWithIndex[]): JSXElement {\n const { legendProps } = props;\n const isLegendMultiSelectEnabled = !!(legendProps && !!legendProps.canSelectMultipleLegends);\n const mapLegendToPoints: Record<string, ScatterChartDataWithIndex[]> = {};\n data.forEach((point: ScatterChartDataWithIndex) => {\n if (point.legend) {\n if (!mapLegendToPoints[point.legend]) {\n mapLegendToPoints[point.legend] = [];\n }\n mapLegendToPoints[point.legend].push(point);\n }\n });\n const legendDataItems: Legend[] = Object.entries(mapLegendToPoints).map(([legendTitle, points]) => {\n const representativePoint = points[0];\n // mapping data to the format Legends component needs\n const legend: Legend = {\n title: legendTitle,\n color: representativePoint.color!,\n onMouseOutAction: () => {\n setActiveLegend('');\n },\n hoverAction: () => {\n _handleChartMouseLeave();\n setActiveLegend(legendTitle);\n },\n ...(representativePoint.legendShape && {\n shape: representativePoint.legendShape,\n }),\n };\n return legend;\n });\n\n return (\n <Legends\n legends={[...legendDataItems]}\n enabledWrapLines={props.enabledLegendsWrapLines}\n overflowText={props.legendsOverflowText}\n {...(isLegendMultiSelectEnabled && { onLegendHoverCardLeave: _onHoverCardHide })}\n {...props.legendProps}\n selectedLegends={selectedLegends}\n onChange={_onLegendSelectionChange}\n legendRef={_legendsRef}\n />\n );\n }\n\n function _getOrderedYAxisLabels() {\n const shouldOrderYAxisLabelsByCategoryOrder =\n _yAxisType === YAxisType.StringAxis && props.yAxisCategoryOrder !== 'default';\n if (!shouldOrderYAxisLabelsByCategoryOrder) {\n // Collect all unique string y values from all data points in all series, in reverse order\n const yLabelsSet = new Set<string>();\n for (let i = _points.length - 1; i >= 0; i--) {\n const point = _points[i];\n if (point.data && Array.isArray(point.data)) {\n for (const d of point.data) {\n if (typeof d.y === 'string') {\n yLabelsSet.add(d.y);\n }\n }\n }\n }\n return Array.from(yLabelsSet);\n }\n\n return sortAxisCategories(_mapCategoryToValues(), props.yAxisCategoryOrder);\n }\n\n function _mapCategoryToValues() {\n const categoryToValues: Record<string, number[]> = {};\n _points.forEach(point => {\n if (point.data && Array.isArray(point.data)) {\n point.data.forEach(d => {\n if (typeof d.y === 'string') {\n if (!categoryToValues[d.y]) {\n categoryToValues[d.y] = [];\n }\n if (typeof d.x === 'number') {\n categoryToValues[d.y].push(d.x);\n }\n }\n });\n }\n });\n return categoryToValues;\n }\n\n function _onLegendSelectionChange(\n legendsSelected: string[],\n event: React.MouseEvent<HTMLButtonElement>,\n currentLegend?: Legend,\n ): void {\n if (props.legendProps?.canSelectMultipleLegends) {\n setSelectedLegends(legendsSelected);\n } else {\n setSelectedLegends(legendsSelected.slice(-1));\n }\n\n if (props.legendProps?.onChange) {\n props.legendProps.onChange(legendsSelected, event, currentLegend);\n }\n }\n\n function _getPointFill(seriesColor: string, pointId: string, pointIndex: number, isLastPoint: boolean) {\n if (activePoint === pointId) {\n return tokens.colorNeutralBackground1;\n } else {\n return seriesColor;\n }\n }\n\n function _createPlot(xElement: SVGElement, containerHeight: number): JSXElement[] {\n const series: JSXElement[] = [];\n if (isSelectedLegend) {\n _points = selectedLegendPoints;\n } else {\n _points = _injectIndexPropertyInScatterChartData(props.data.scatterChartData);\n }\n\n if (_xAxisType === XAxisTypes.StringAxis) {\n _xBandwidth = _xAxisScale.bandwidth() / 2;\n }\n\n const minMarkerSize =\n d3Min(_points, (point: ScatterChartPoints) => {\n return d3Min(point.data as ScatterChartDataPoint[], (item: ScatterChartDataPoint) => {\n return item.markerSize as number;\n });\n }) ?? 0;\n const maxMarkerSize =\n d3Max(_points, (point: ScatterChartPoints) => {\n return d3Max(point.data as ScatterChartDataPoint[], (item: ScatterChartDataPoint) => {\n return item.markerSize as number;\n });\n }) ?? 0;\n const isContinuousXY = _xAxisType !== XAxisTypes.StringAxis && _yAxisType !== YAxisType.StringAxis;\n const extraMaxPixels = isContinuousXY\n ? getRangeForScatterMarkerSize({\n data: _points,\n xScale: _xAxisScale,\n yScalePrimary: _yAxisScale,\n xScaleType: props.xScaleType,\n yScaleType: props.yScaleType,\n })\n : 0;\n\n for (let i = _points.length - 1; i >= 0; i--) {\n const pointsForSeries: JSXElement[] = [];\n\n const legendVal: string = _points[i].legend;\n const seriesColor: string = _points[i].color!;\n const verticaLineHeight = containerHeight - margins.bottom! + 6;\n\n for (let j = 0; j < _points[i].data.length; j++) {\n const { x, y, xAxisCalloutData, xAxisCalloutAccessibilityData } = _points?.[i]?.data[j];\n const xPoint = _xAxisScale?.(x);\n // Use string y axis scale if needed\n const yPoint =\n _yAxisType === YAxisType.StringAxis\n ? _yAxisScale?.(y) + (_yAxisScale?.bandwidth ? _yAxisScale.bandwidth() / 2 : 0)\n : _yAxisScale?.(y);\n if (!isPlottable(xPoint, yPoint)) {\n continue;\n }\n const seriesId = `${_seriesId}_${i}_${j}`;\n const circleId = `${_circleId}_${i}_${j}`;\n const pointMarkerSize = (_points[i].data[j] as ScatterChartDataPoint).markerSize;\n const circleRadius = calculateMarkerRadius({\n pointMarkerSize,\n minMarkerSize,\n maxMarkerSize,\n extraMaxPixels,\n isContinuousXY,\n isActive: activePoint === circleId,\n defaultRadius: 4,\n activeRadius: 6,\n });\n\n const isLegendSelected: boolean = _legendHighlighted(legendVal) || _noLegendHighlighted() || isSelectedLegend;\n\n const currentPointHidden = _points[i].hideNonActiveDots && activePoint !== circleId;\n const text = _points?.[i].data[j]?.text;\n if (!_isTextMode.current) {\n pointsForSeries.push(\n <>\n <circle\n id={circleId}\n key={circleId}\n r={circleRadius}\n cx={xPoint + _xBandwidth}\n cy={yPoint}\n data-is-focusable={isLegendSelected}\n onMouseOver={(event: React.MouseEvent<SVGElement>) =>\n _handleHover(\n x,\n y,\n verticaLineHeight,\n xAxisCalloutData,\n circleId,\n xAxisCalloutAccessibilityData,\n event,\n )\n }\n onMouseMove={(event: React.MouseEvent<SVGElement>) =>\n _handleHover(\n x,\n y,\n verticaLineHeight,\n xAxisCalloutData,\n circleId,\n xAxisCalloutAccessibilityData,\n event,\n )\n }\n onMouseOut={_handleMouseOut}\n onFocus={event =>\n _handleFocus(event, seriesId, x, xAxisCalloutData, circleId, xAxisCalloutAccessibilityData)\n }\n onBlur={_handleMouseOut}\n {..._getClickHandler(_points[i].data[j].onDataPointClick)}\n opacity={isLegendSelected && !currentPointHidden ? 1 : 0.1}\n fill={_getPointFill(seriesColor, circleId, j, false)}\n stroke={seriesColor}\n role=\"img\"\n aria-label={_getAriaLabel(i, j)}\n tabIndex={isLegendSelected ? 0 : undefined}\n />\n ,\n {text && (\n <text\n key={`${circleId}-label`}\n x={xPoint + _xBandwidth}\n y={yPoint + Math.max(circleRadius + 12, 16)}\n className={classes.markerLabel}\n >\n {text}\n </text>\n )}\n </>,\n );\n }\n }\n\n if (_isScatterPolarRef.current) {\n pointsForSeries.push(\n ...renderScatterPolarCategoryLabels({\n xAxisScale: _xAxisScale,\n yAxisScale: _yAxisScale,\n className: classes.markerLabel || '',\n lineOptions: (_points?.[i] as Partial<LineChartPoints>)?.lineOptions,\n }),\n );\n }\n\n series.push(\n <g\n key={`series_${i}`}\n role=\"region\"\n aria-label={`${legendVal}, series ${i + 1} of ${_points.length} with ${_points[i].data.length} data points.`}\n >\n {pointsForSeries}\n </g>,\n );\n }\n return series;\n }\n\n function _handleFocus(\n event: React.FocusEvent<SVGCircleElement, Element>,\n seriesId: string,\n x: number | Date | string,\n xAxisCalloutData: string | undefined,\n circleId: string,\n xAxisCalloutAccessibilityData?: AccessibilityProps,\n ) {\n let cx = 0;\n let cy = 0;\n\n const targetRect = (event.target as SVGCircleElement).getBoundingClientRect();\n cx = targetRect.left + targetRect.width / 2;\n cy = targetRect.top + targetRect.height / 2;\n updatePosition(cx, cy);\n _uniqueCallOutID = circleId;\n const formattedData = x instanceof Date ? formatDateToLocaleString(x, props.culture, props.useUTC as boolean) : x;\n const found = findCalloutPoints(calloutPointsRef.current, x) as CustomizedCalloutData | undefined;\n // if no points need to be called out then don't show vertical line and callout card\n\n if (found) {\n d3Select(`#${_verticalLine}`)\n .attr('transform', () => `translate(${_xAxisScale(x) + _xBandwidth}, 0)`)\n .attr('visibility', 'visibility');\n _refArray.forEach((obj: RefArrayData) => {\n if (obj.index === seriesId) {\n setPopoverOpen(true);\n xAxisCalloutData ? setHoverXValue(xAxisCalloutData) : setHoverXValue('' + formattedData);\n setYValueHover(found.values);\n setStackCalloutProps(found!);\n setDataPointCalloutProps(found!);\n setActivePoint(circleId);\n }\n });\n } else {\n setActivePoint(circleId);\n }\n }\n\n function _handleHover(\n x: number | Date | string,\n y: number,\n lineHeight: number,\n xAxisCalloutData: string | undefined,\n circleId: string,\n xAxisCalloutAccessibilityData: AccessibilityProps | undefined,\n mouseEvent: React.MouseEvent<SVGElement>,\n ) {\n mouseEvent?.persist();\n const formattedData = x instanceof Date ? formatDateToLocaleString(x, props.culture, props.useUTC as boolean) : x;\n const found = findCalloutPoints(calloutPointsRef.current, x) as CustomizedCalloutData | undefined;\n // if no points need to be called out then don't show vertical line and callout card\n\n if (found) {\n d3Select(`#${_verticalLine}`)\n .attr('transform', () => `translate(${_xAxisScale(x) + _xBandwidth}, ${_yAxisScale(y)})`)\n .attr('visibility', 'visibility')\n .attr('y2', `${lineHeight - _yAxisScale(y)}`);\n\n if (_uniqueCallOutID !== circleId) {\n _uniqueCallOutID = circleId;\n updatePosition(mouseEvent.clientX, mouseEvent.clientY);\n xAxisCalloutData ? setHoverXValue(xAxisCalloutData) : setHoverXValue('' + formattedData);\n setYValueHover(found.values);\n setStackCalloutProps(found!);\n setDataPointCalloutProps(found!);\n setActivePoint(circleId);\n }\n } else {\n setActivePoint(circleId);\n }\n }\n\n /**\n * Screen readers announce an element as clickable if the onClick attribute is set.\n * This function sets the attribute only when a click event handler is provided.*/\n\n function _getClickHandler(func?: () => void): { onClick?: () => void } {\n if (func) {\n return {\n onClick: func,\n };\n }\n\n return {};\n }\n\n function _handleMouseOut() {\n d3Select(`#${_verticalLine}`).attr('visibility', 'hidden');\n }\n\n function _handleChartMouseLeave() {\n _uniqueCallOutID = null;\n setActivePoint('');\n if (isPopoverOpen) {\n setPopoverOpen(false);\n }\n }\n\n function _getCustomizedCallout() {\n return props.onRenderCalloutPerStack\n ? props.onRenderCalloutPerStack(stackCalloutProps)\n : props.onRenderCalloutPerDataPoint\n ? props.onRenderCalloutPerDataPoint(dataPointCalloutProps)\n : null;\n }\n\n /**\n * This function checks if the given legend is highlighted or not.\n * A legend can be highlighted in 2 ways:\n * 1. selection: if the user clicks on it\n * 2. hovering: if there is no selected legend and the user hovers over it*/\n\n function _legendHighlighted(legend: string): boolean {\n return _getHighlightedLegend().includes(legend);\n }\n\n /**\n * This function checks if none of the legends is selected or hovered.*/\n\n function _noLegendHighlighted(): boolean {\n return _getHighlightedLegend().length === 0;\n }\n\n function _getHighlightedLegend(): string[] {\n return selectedLegends.length > 0 ? selectedLegends : activeLegend ? [activeLegend] : [];\n }\n\n function _getAriaLabel(seriesIndex: number, pointIndex: number): string {\n const series = _points[seriesIndex];\n const point = series.data[pointIndex];\n const formattedDate =\n point.x instanceof Date ? formatDateToLocaleString(point.x, props.culture, props.useUTC as boolean) : point.x;\n const xValue = point.xAxisCalloutData || formattedDate;\n const legend = series.legend;\n const yValue = point.yAxisCalloutData || point.y;\n return point.callOutAccessibilityData?.ariaLabel || `${xValue}. ${legend}, ${yValue}.`;\n }\n\n function _isChartEmpty(): boolean {\n return !(\n props.data &&\n props.data.scatterChartData &&\n props.data.scatterChartData.length > 0 &&\n props.data.scatterChartData.filter((item: ScatterChartPoints) => item.data.length).length > 0\n );\n }\n\n const { legendProps, tickValues, tickFormat } = props;\n _points = _injectIndexPropertyInScatterChartData(props.data.scatterChartData);\n\n let points = _points as ScatterChartPoints[];\n if (legendProps && !!legendProps.canSelectMultipleLegends) {\n points = selectedLegendPoints.length >= 1 ? selectedLegendPoints : _points;\n calloutPointsRef.current = calloutData(points);\n }\n\n let legendBars = null;\n // reduce computation cost by only creating legendBars\n // if when hideLegend is false.\n // NOTE: they are rendered only when hideLegend is false in CartesianChart.\n if (!props.hideLegend && !_isTextMode.current) {\n legendBars = _createLegends(_points!); // ToDo: Memoize legends to improve performance.\n }\n const calloutProps = {\n YValueHover: yValueHover,\n hoverXValue,\n descriptionMessage:\n props.getCalloutDescriptionMessage && stackCalloutProps\n ? props.getCalloutDescriptionMessage(stackCalloutProps)\n : undefined,\n 'data-is-focusable': true,\n xAxisCalloutAccessibilityData,\n ...props.calloutProps,\n clickPosition,\n isPopoverOpen,\n isCalloutForStack: true,\n culture: props.culture,\n isCartesian: true,\n customCallout: {\n customizedCallout: _getCustomizedCallout() !== null ? _getCustomizedCallout()! : undefined,\n customCalloutProps: props.calloutPropsPerDataPoint\n ? props.calloutPropsPerDataPoint(dataPointCalloutProps!)\n : undefined,\n },\n };\n const tickParams = {\n tickValues,\n tickFormat,\n };\n\n const xAxisLabels: string[] = _points\n .map((point: ScatterChartDataWithIndex) => point.data.map((dp: ScatterChartDataPoint) => dp.x as string))\n .flat();\n\n _xAxisLabels = [...new Set(xAxisLabels)];\n\n // Compute unique y axis labels for string y axis\n const _yAxisLabels: string[] = _getOrderedYAxisLabels();\n\n return !_isChartEmpty() ? (\n <CartesianChart\n {...props}\n chartTitle={props.data.chartTitle}\n points={points}\n chartType={ChartTypes.ScatterChart}\n calloutProps={calloutProps}\n tickParams={tickParams}\n legendBars={legendBars}\n getmargins={_getMargins}\n getGraphData={_initializeScatterChartData}\n xAxisType={_xAxisType}\n yAxisType={_yAxisType}\n // Pass stringDatasetForYAxisDomain only if y axis is string\n {...(_yAxisType === YAxisType.StringAxis ? { stringDatasetForYAxisDomain: _yAxisLabels } : {})}\n getMinMaxOfYAxis={_getNumericMinMaxOfY}\n getDomainNRangeValues={_getDomainNRangeValues}\n createYAxis={createNumericYAxis}\n createStringYAxis={createStringYAxis}\n onChartMouseLeave={_handleChartMouseLeave}\n enableFirstRenderOptimization={_firstRenderOptimization}\n datasetForXAxisDomain={_xAxisLabels}\n componentRef={cartesianChartRef}\n {...(_isScatterPolarRef.current ? { yMaxValue: 1, yMinValue: -1 } : {})}\n /* eslint-disable react/jsx-no-bind */\n // eslint-disable-next-line react/no-children-prop\n children={(props: ChildProps) => {\n _xAxisScale = props.xScale!;\n _yAxisScale = props.yScalePrimary!;\n return (\n <>\n <g>\n <line\n x1={0}\n y1={0}\n x2={0}\n y2={props.containerHeight}\n stroke={'#323130'}\n id={_verticalLine}\n visibility={'hidden'}\n strokeDasharray={'5,5'}\n />\n <g>{renderSeries}</g>\n </g>\n </>\n );\n }}\n />\n ) : (\n <div id={_emptyChartId} role={'alert'} style={{ opacity: '0' }} aria-label={'Graph has no data to display'} />\n );\n});\nScatterChart.displayName = 'ScatterChart';\n"],"names":["React","useScatterChartStyles","select","d3Select","Legends","max","d3Max","min","d3Min","useId","areArraysEqual","createNumericYAxis","createStringYAxis","getDomainPaddingForMarkers","domainRangeOfXStringAxis","findNumericMinMaxOfY","YAxisType","isTextMode","isScatterPolarSeries","isPlottable","getRangeForScatterMarkerSize","calculateMarkerRadius","domainRangeOfDateForAreaLineScatterVerticalBarCharts","domainRangeOfNumericForAreaLineScatterCharts","sortAxisCategories","findCalloutPoints","CartesianChart","tokens","calloutData","ChartTypes","XAxisTypes","getTypeOfAxis","getNextColor","getColorFromToken","renderScatterPolarCategoryLabels","formatDateToLocaleString","useImageExport","ScatterChart","forwardRef","props","forwardedRef","_circleId","_seriesId","_verticalLine","_firstRenderOptimization","_emptyChartId","_points","_injectIndexPropertyInScatterChartData","data","scatterChartData","_xAxisScale","_yAxisScale","_uniqueCallOutID","_refArray","margins","renderSeries","_xAxisLabels","xAxisCalloutAccessibilityData","_xBandwidth","cartesianChartRef","legendsRef","_legendsRef","componentRef","hideLegend","classes","hoverXValue","setHoverXValue","useState","activeLegend","setActiveLegend","yValueHover","setYValueHover","selectedLegendPoints","setSelectedLegendPoints","isSelectedLegend","setIsSelectedLegend","activePoint","setActivePoint","stackCalloutProps","setStackCalloutProps","dataPointCalloutProps","setDataPointCalloutProps","clickPosition","setClickPosition","x","y","isPopoverOpen","setPopoverOpen","selectedLegends","setSelectedLegends","legendProps","prevSelectedLegendsRef","useRef","undefined","_isTextMode","_isScatterPolarRef","useEffect","current","_xAxisType","length","StringAxis","_yAxisType","NumericAxis","pointsRef","calloutPointsRef","height","width","map","item","index","color","updatePosition","newX","newY","threshold","distance","Math","sqrt","pow","_getNumericMinMaxOfY","points","yAxisType","startValue","endValue","yPadding","yScaleType","start","end","_getDomainNRangeValues","chartType","isRTL","xAxisType","barWidth","tickValues","domainNRangeValue","xScaleType","xMinValue","xMaxValue","DateAxis","_getMargins","_margins","_initializeScatterChartData","xScale","yScale","containerHeight","containerWidth","xElement","_createPlot","_onHoverCardHide","_createLegends","isLegendMultiSelectEnabled","canSelectMultipleLegends","mapLegendToPoints","forEach","point","legend","push","legendDataItems","Object","entries","legendTitle","representativePoint","title","onMouseOutAction","hoverAction","_handleChartMouseLeave","legendShape","shape","legends","enabledWrapLines","enabledLegendsWrapLines","overflowText","legendsOverflowText","onLegendHoverCardLeave","onChange","_onLegendSelectionChange","legendRef","_getOrderedYAxisLabels","shouldOrderYAxisLabelsByCategoryOrder","yAxisCategoryOrder","yLabelsSet","Set","i","Array","isArray","d","add","from","_mapCategoryToValues","categoryToValues","legendsSelected","event","currentLegend","slice","_getPointFill","seriesColor","pointId","pointIndex","isLastPoint","colorNeutralBackground1","series","bandwidth","minMarkerSize","markerSize","maxMarkerSize","isContinuousXY","extraMaxPixels","yScalePrimary","pointsForSeries","legendVal","verticaLineHeight","bottom","j","xAxisCalloutData","xPoint","yPoint","seriesId","circleId","pointMarkerSize","circleRadius","isActive","defaultRadius","activeRadius","isLegendSelected","_legendHighlighted","_noLegendHighlighted","currentPointHidden","hideNonActiveDots","text","circle","id","key","r","cx","cy","data-is-focusable","onMouseOver","_handleHover","onMouseMove","onMouseOut","_handleMouseOut","onFocus","_handleFocus","onBlur","_getClickHandler","onDataPointClick","opacity","fill","stroke","role","aria-label","_getAriaLabel","tabIndex","className","markerLabel","xAxisScale","yAxisScale","lineOptions","g","targetRect","target","getBoundingClientRect","left","top","formattedData","Date","culture","useUTC","found","attr","obj","values","lineHeight","mouseEvent","persist","clientX","clientY","func","onClick","_getCustomizedCallout","onRenderCalloutPerStack","onRenderCalloutPerDataPoint","_getHighlightedLegend","includes","seriesIndex","formattedDate","xValue","yValue","yAxisCalloutData","callOutAccessibilityData","ariaLabel","_isChartEmpty","filter","tickFormat","legendBars","calloutProps","YValueHover","descriptionMessage","getCalloutDescriptionMessage","isCalloutForStack","isCartesian","customCallout","customizedCallout","customCalloutProps","calloutPropsPerDataPoint","tickParams","xAxisLabels","dp","flat","_yAxisLabels","chartTitle","getmargins","getGraphData","stringDatasetForYAxisDomain","getMinMaxOfYAxis","getDomainNRangeValues","createYAxis","onChartMouseLeave","enableFirstRenderOptimization","datasetForXAxisDomain","yMaxValue","yMinValue","children","line","x1","y1","x2","y2","visibility","strokeDasharray","div","style","displayName"],"mappings":"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"}
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
Object.defineProperty(exports, "VegaDeclarativeChart", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: function() {
|
|
9
|
+
return VegaDeclarativeChart;
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
const _interop_require_wildcard = require("@swc/helpers/_/_interop_require_wildcard");
|
|
13
|
+
const _react = /*#__PURE__*/ _interop_require_wildcard._(require("react"));
|
|
14
|
+
const _VegaLiteSchemaAdapter = require("./VegaLiteSchemaAdapter");
|
|
15
|
+
const _index = require("../Legends/index");
|
|
16
|
+
const _withResponsiveContainer = require("../ResponsiveContainer/withResponsiveContainer");
|
|
17
|
+
const _index1 = require("../LineChart/index");
|
|
18
|
+
const _index2 = require("../VerticalBarChart/index");
|
|
19
|
+
const _index3 = require("../VerticalStackedBarChart/index");
|
|
20
|
+
const _index4 = require("../GroupedVerticalBarChart/index");
|
|
21
|
+
const _index5 = require("../HorizontalBarChartWithAxis/index");
|
|
22
|
+
const _index6 = require("../AreaChart/index");
|
|
23
|
+
const _index7 = require("../ScatterChart/index");
|
|
24
|
+
const _index8 = require("../DonutChart/index");
|
|
25
|
+
const _index9 = require("../HeatMapChart/index");
|
|
26
|
+
const _index10 = require("../PolarChart/index");
|
|
27
|
+
const _VegaDeclarativeChartHooks = require("./VegaDeclarativeChartHooks");
|
|
28
|
+
/**
|
|
29
|
+
* Maximum allowed nesting depth for incoming JSON specs.
|
|
30
|
+
* Matches the Plotly adapter's MAX_DEPTH to prevent stack overflow / memory exhaustion.
|
|
31
|
+
*/ const MAX_DEPTH = 15;
|
|
32
|
+
/**
|
|
33
|
+
* Validates that a JSON value does not exceed the maximum nesting depth.
|
|
34
|
+
* Throws if the depth limit is exceeded (same behavior as Plotly's sanitizeJson).
|
|
35
|
+
*/ function validateJsonDepth(value, depth = 0) {
|
|
36
|
+
if (depth > MAX_DEPTH) {
|
|
37
|
+
throw new Error('VegaDeclarativeChart: Maximum JSON depth exceeded');
|
|
38
|
+
}
|
|
39
|
+
if (value !== null && typeof value === 'object') {
|
|
40
|
+
for (const key of Object.keys(value)){
|
|
41
|
+
validateJsonDepth(value[key], depth + 1);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Check if spec is a horizontal concatenation
|
|
47
|
+
*/ function isHConcatSpec(spec) {
|
|
48
|
+
return !!spec.hconcat && Array.isArray(spec.hconcat) && spec.hconcat.length > 0;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Check if spec is a vertical concatenation
|
|
52
|
+
*/ function isVConcatSpec(spec) {
|
|
53
|
+
return !!spec.vconcat && Array.isArray(spec.vconcat) && spec.vconcat.length > 0;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Get grid properties for concat specs
|
|
57
|
+
*/ function getVegaConcatGridProperties(spec) {
|
|
58
|
+
if (isHConcatSpec(spec)) {
|
|
59
|
+
return {
|
|
60
|
+
templateRows: 'auto',
|
|
61
|
+
templateColumns: `repeat(${spec.hconcat.length}, 1fr)`,
|
|
62
|
+
isHorizontal: true,
|
|
63
|
+
specs: spec.hconcat
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
if (isVConcatSpec(spec)) {
|
|
67
|
+
return {
|
|
68
|
+
templateRows: `repeat(${spec.vconcat.length}, auto)`,
|
|
69
|
+
templateColumns: '1fr',
|
|
70
|
+
isHorizontal: false,
|
|
71
|
+
specs: spec.vconcat
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
return {
|
|
75
|
+
templateRows: '1fr',
|
|
76
|
+
templateColumns: '1fr',
|
|
77
|
+
isHorizontal: false,
|
|
78
|
+
specs: [
|
|
79
|
+
spec
|
|
80
|
+
]
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
const ResponsiveLineChart = (0, _withResponsiveContainer.withResponsiveContainer)(_index1.LineChart);
|
|
84
|
+
const ResponsiveVerticalBarChart = (0, _withResponsiveContainer.withResponsiveContainer)(_index2.VerticalBarChart);
|
|
85
|
+
const ResponsiveVerticalStackedBarChart = (0, _withResponsiveContainer.withResponsiveContainer)(_index3.VerticalStackedBarChart);
|
|
86
|
+
const ResponsiveGroupedVerticalBarChart = (0, _withResponsiveContainer.withResponsiveContainer)(_index4.GroupedVerticalBarChart);
|
|
87
|
+
const ResponsiveHorizontalBarChartWithAxis = (0, _withResponsiveContainer.withResponsiveContainer)(_index5.HorizontalBarChartWithAxis);
|
|
88
|
+
const ResponsiveAreaChart = (0, _withResponsiveContainer.withResponsiveContainer)(_index6.AreaChart);
|
|
89
|
+
const ResponsiveScatterChart = (0, _withResponsiveContainer.withResponsiveContainer)(_index7.ScatterChart);
|
|
90
|
+
const ResponsiveDonutChart = (0, _withResponsiveContainer.withResponsiveContainer)(_index8.DonutChart);
|
|
91
|
+
const ResponsiveHeatMapChart = (0, _withResponsiveContainer.withResponsiveContainer)(_index9.HeatMapChart);
|
|
92
|
+
const ResponsivePolarChart = (0, _withResponsiveContainer.withResponsiveContainer)(_index10.PolarChart);
|
|
93
|
+
const vegaChartMap = {
|
|
94
|
+
line: {
|
|
95
|
+
transformer: _VegaLiteSchemaAdapter.transformVegaLiteToLineChartProps,
|
|
96
|
+
renderer: ResponsiveLineChart
|
|
97
|
+
},
|
|
98
|
+
bar: {
|
|
99
|
+
transformer: _VegaLiteSchemaAdapter.transformVegaLiteToVerticalBarChartProps,
|
|
100
|
+
renderer: ResponsiveVerticalBarChart
|
|
101
|
+
},
|
|
102
|
+
'stacked-bar': {
|
|
103
|
+
transformer: _VegaLiteSchemaAdapter.transformVegaLiteToVerticalStackedBarChartProps,
|
|
104
|
+
renderer: ResponsiveVerticalStackedBarChart
|
|
105
|
+
},
|
|
106
|
+
'grouped-bar': {
|
|
107
|
+
transformer: _VegaLiteSchemaAdapter.transformVegaLiteToGroupedVerticalBarChartProps,
|
|
108
|
+
renderer: ResponsiveGroupedVerticalBarChart
|
|
109
|
+
},
|
|
110
|
+
'horizontal-bar': {
|
|
111
|
+
transformer: _VegaLiteSchemaAdapter.transformVegaLiteToHorizontalBarChartProps,
|
|
112
|
+
renderer: ResponsiveHorizontalBarChartWithAxis
|
|
113
|
+
},
|
|
114
|
+
area: {
|
|
115
|
+
transformer: _VegaLiteSchemaAdapter.transformVegaLiteToAreaChartProps,
|
|
116
|
+
renderer: ResponsiveAreaChart
|
|
117
|
+
},
|
|
118
|
+
scatter: {
|
|
119
|
+
transformer: _VegaLiteSchemaAdapter.transformVegaLiteToScatterChartProps,
|
|
120
|
+
renderer: ResponsiveScatterChart
|
|
121
|
+
},
|
|
122
|
+
donut: {
|
|
123
|
+
transformer: _VegaLiteSchemaAdapter.transformVegaLiteToDonutChartProps,
|
|
124
|
+
renderer: ResponsiveDonutChart
|
|
125
|
+
},
|
|
126
|
+
heatmap: {
|
|
127
|
+
transformer: _VegaLiteSchemaAdapter.transformVegaLiteToHeatMapChartProps,
|
|
128
|
+
renderer: ResponsiveHeatMapChart
|
|
129
|
+
},
|
|
130
|
+
histogram: {
|
|
131
|
+
transformer: _VegaLiteSchemaAdapter.transformVegaLiteToHistogramProps,
|
|
132
|
+
renderer: ResponsiveVerticalBarChart
|
|
133
|
+
},
|
|
134
|
+
polar: {
|
|
135
|
+
transformer: _VegaLiteSchemaAdapter.transformVegaLiteToPolarChartProps,
|
|
136
|
+
renderer: ResponsivePolarChart
|
|
137
|
+
}
|
|
138
|
+
};
|
|
139
|
+
/**
|
|
140
|
+
* Renders a single Vega-Lite chart spec
|
|
141
|
+
*/ function renderSingleChart(spec, colorMap, isDarkTheme, interactiveCommonProps) {
|
|
142
|
+
const chartType = (0, _VegaLiteSchemaAdapter.getChartType)(spec);
|
|
143
|
+
const chartConfig = vegaChartMap[chartType.type];
|
|
144
|
+
if (!chartConfig) {
|
|
145
|
+
throw new Error(`VegaDeclarativeChart: Unsupported chart type '${chartType.type}'`);
|
|
146
|
+
}
|
|
147
|
+
const { transformer, renderer: ChartRenderer } = chartConfig;
|
|
148
|
+
const chartProps = transformer(spec, colorMap, isDarkTheme);
|
|
149
|
+
// For hconcat/vconcat sub-charts, hide per-chart legends (shared legend rendered separately)
|
|
150
|
+
if (spec._hideLegend) {
|
|
151
|
+
chartProps.hideLegend = true;
|
|
152
|
+
}
|
|
153
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
154
|
+
return /*#__PURE__*/ _react.createElement(ChartRenderer, {
|
|
155
|
+
...chartProps,
|
|
156
|
+
...interactiveCommonProps
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
const VegaDeclarativeChart = /*#__PURE__*/ _react.forwardRef((props, forwardedRef)=>{
|
|
160
|
+
const { vegaLiteSpec, selectedLegends = [] } = props.chartSchema;
|
|
161
|
+
if (!vegaLiteSpec) {
|
|
162
|
+
throw new Error('VegaDeclarativeChart: vegaLiteSpec is required in chartSchema');
|
|
163
|
+
}
|
|
164
|
+
// Guard against excessively deep JSON specs that could cause stack overflow / memory exhaustion
|
|
165
|
+
validateJsonDepth(vegaLiteSpec);
|
|
166
|
+
const colorMap = (0, _VegaDeclarativeChartHooks.useColorMapping)();
|
|
167
|
+
const isDarkTheme = (0, _VegaDeclarativeChartHooks.useIsDarkTheme)();
|
|
168
|
+
const chartRef = _react.useRef(null);
|
|
169
|
+
const [activeLegends, setActiveLegends] = _react.useState(selectedLegends);
|
|
170
|
+
const onActiveLegendsChange = (keys)=>{
|
|
171
|
+
setActiveLegends(keys);
|
|
172
|
+
if (props.onSchemaChange) {
|
|
173
|
+
props.onSchemaChange({
|
|
174
|
+
vegaLiteSpec,
|
|
175
|
+
selectedLegends: keys
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
_react.useEffect(()=>{
|
|
180
|
+
var _props_chartSchema_selectedLegends;
|
|
181
|
+
setActiveLegends((_props_chartSchema_selectedLegends = props.chartSchema.selectedLegends) !== null && _props_chartSchema_selectedLegends !== void 0 ? _props_chartSchema_selectedLegends : []);
|
|
182
|
+
}, [
|
|
183
|
+
props.chartSchema.selectedLegends
|
|
184
|
+
]);
|
|
185
|
+
const multiSelectLegendProps = {
|
|
186
|
+
canSelectMultipleLegends: true,
|
|
187
|
+
onChange: onActiveLegendsChange,
|
|
188
|
+
selectedLegends: activeLegends
|
|
189
|
+
};
|
|
190
|
+
const interactiveCommonProps = {
|
|
191
|
+
componentRef: chartRef,
|
|
192
|
+
legendProps: multiSelectLegendProps
|
|
193
|
+
};
|
|
194
|
+
try {
|
|
195
|
+
// Check if this is a concat spec (multiple charts side-by-side or stacked)
|
|
196
|
+
if (isHConcatSpec(vegaLiteSpec) || isVConcatSpec(vegaLiteSpec)) {
|
|
197
|
+
const gridProps = getVegaConcatGridProperties(vegaLiteSpec);
|
|
198
|
+
// Build shared legend from the first sub-chart's color encoding
|
|
199
|
+
const firstSubSpec = {
|
|
200
|
+
...gridProps.specs[0],
|
|
201
|
+
data: gridProps.specs[0].data || vegaLiteSpec.data,
|
|
202
|
+
encoding: {
|
|
203
|
+
...vegaLiteSpec.encoding || {},
|
|
204
|
+
...gridProps.specs[0].encoding || {}
|
|
205
|
+
}
|
|
206
|
+
};
|
|
207
|
+
const sharedLegendProps = (0, _VegaLiteSchemaAdapter.getVegaLiteLegendsProps)(firstSubSpec, colorMap, isDarkTheme);
|
|
208
|
+
return /*#__PURE__*/ _react.createElement("div", {
|
|
209
|
+
ref: forwardedRef,
|
|
210
|
+
className: props.className,
|
|
211
|
+
style: props.style
|
|
212
|
+
}, /*#__PURE__*/ _react.createElement("div", {
|
|
213
|
+
style: {
|
|
214
|
+
display: 'grid',
|
|
215
|
+
gridTemplateRows: gridProps.templateRows,
|
|
216
|
+
gridTemplateColumns: gridProps.templateColumns,
|
|
217
|
+
gap: '16px'
|
|
218
|
+
}
|
|
219
|
+
}, gridProps.specs.map((subSpec, index)=>{
|
|
220
|
+
// Compute default height for sub-charts
|
|
221
|
+
const defaultSubHeight = typeof vegaLiteSpec.height === 'number' ? vegaLiteSpec.height : typeof subSpec.height === 'number' ? subSpec.height : 300;
|
|
222
|
+
const mergedSpec = {
|
|
223
|
+
...subSpec,
|
|
224
|
+
data: subSpec.data || vegaLiteSpec.data,
|
|
225
|
+
encoding: {
|
|
226
|
+
...vegaLiteSpec.encoding || {},
|
|
227
|
+
...subSpec.encoding || {}
|
|
228
|
+
},
|
|
229
|
+
height: typeof subSpec.height === 'number' ? subSpec.height : defaultSubHeight,
|
|
230
|
+
// Hide legends on ALL sub-charts — shared legend is rendered below
|
|
231
|
+
_hideLegend: true
|
|
232
|
+
};
|
|
233
|
+
const cellRow = gridProps.isHorizontal ? 1 : index + 1;
|
|
234
|
+
const cellColumn = gridProps.isHorizontal ? index + 1 : 1;
|
|
235
|
+
return /*#__PURE__*/ _react.createElement("div", {
|
|
236
|
+
key: `chart_${index}`,
|
|
237
|
+
style: {
|
|
238
|
+
gridRowStart: cellRow,
|
|
239
|
+
gridRowEnd: cellRow + 1,
|
|
240
|
+
gridColumnStart: cellColumn,
|
|
241
|
+
gridColumnEnd: cellColumn + 1,
|
|
242
|
+
minWidth: 0
|
|
243
|
+
}
|
|
244
|
+
}, renderSingleChart(mergedSpec, colorMap, isDarkTheme, interactiveCommonProps));
|
|
245
|
+
})), sharedLegendProps.legends.length > 0 && /*#__PURE__*/ _react.createElement(_index.Legends, {
|
|
246
|
+
...sharedLegendProps,
|
|
247
|
+
...multiSelectLegendProps
|
|
248
|
+
}));
|
|
249
|
+
}
|
|
250
|
+
// Check if this is a layered spec (composite chart)
|
|
251
|
+
if (vegaLiteSpec.layer && vegaLiteSpec.layer.length > 1) {
|
|
252
|
+
// Check if it's a supported bar+line combo
|
|
253
|
+
const marks = vegaLiteSpec.layer.map((layer)=>(0, _VegaLiteSchemaAdapter.getMarkType)(layer.mark));
|
|
254
|
+
const hasBar = marks.includes('bar');
|
|
255
|
+
const hasLine = marks.includes('line') || marks.includes('point');
|
|
256
|
+
const isBarLineCombo = hasBar && hasLine;
|
|
257
|
+
// Only warn for unsupported layered specs
|
|
258
|
+
if (!isBarLineCombo) {
|
|
259
|
+
// Layered specifications with multiple chart types are not fully supported.
|
|
260
|
+
// Only the first layer will be rendered.
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
// Render single chart
|
|
264
|
+
const chartComponent = renderSingleChart(vegaLiteSpec, colorMap, isDarkTheme, interactiveCommonProps);
|
|
265
|
+
return /*#__PURE__*/ _react.createElement("div", {
|
|
266
|
+
ref: forwardedRef,
|
|
267
|
+
className: props.className,
|
|
268
|
+
style: props.style
|
|
269
|
+
}, chartComponent);
|
|
270
|
+
} catch (error) {
|
|
271
|
+
throw new Error(`Failed to transform Vega-Lite spec: ${error}`);
|
|
272
|
+
}
|
|
273
|
+
});
|
|
274
|
+
VegaDeclarativeChart.displayName = 'VegaDeclarativeChart';
|