@fluentui/react-charts 0.0.0-nightly-20250822-0407.1 → 0.0.0-nightly-20250825-0406.1
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 +15 -15
- package/dist/index.d.ts +5 -1
- package/lib/components/CommonComponents/CartesianChart.js +8 -7
- package/lib/components/CommonComponents/CartesianChart.js.map +1 -1
- package/lib/components/DeclarativeChart/DeclarativeChart.js +32 -16
- package/lib/components/DeclarativeChart/DeclarativeChart.js.map +1 -1
- package/lib/components/DeclarativeChart/PlotlySchemaAdapter.js +148 -134
- package/lib/components/DeclarativeChart/PlotlySchemaAdapter.js.map +1 -1
- package/lib/components/DonutChart/DonutChart.js +6 -1
- package/lib/components/DonutChart/DonutChart.js.map +1 -1
- package/lib/components/DonutChart/DonutChart.types.js.map +1 -1
- package/lib/components/DonutChart/useDonutChartStyles.styles.js +21 -4
- package/lib/components/DonutChart/useDonutChartStyles.styles.js.map +1 -1
- package/lib/components/DonutChart/useDonutChartStyles.styles.raw.js +16 -3
- package/lib/components/DonutChart/useDonutChartStyles.styles.raw.js.map +1 -1
- package/lib-commonjs/components/CommonComponents/CartesianChart.js +8 -7
- package/lib-commonjs/components/CommonComponents/CartesianChart.js.map +1 -1
- package/lib-commonjs/components/DeclarativeChart/DeclarativeChart.js +31 -15
- package/lib-commonjs/components/DeclarativeChart/DeclarativeChart.js.map +1 -1
- package/lib-commonjs/components/DeclarativeChart/PlotlySchemaAdapter.js +157 -134
- package/lib-commonjs/components/DeclarativeChart/PlotlySchemaAdapter.js.map +1 -1
- package/lib-commonjs/components/DonutChart/DonutChart.js +6 -1
- package/lib-commonjs/components/DonutChart/DonutChart.js.map +1 -1
- package/lib-commonjs/components/DonutChart/DonutChart.types.js.map +1 -1
- package/lib-commonjs/components/DonutChart/useDonutChartStyles.styles.js +32 -4
- package/lib-commonjs/components/DonutChart/useDonutChartStyles.styles.js.map +1 -1
- package/lib-commonjs/components/DonutChart/useDonutChartStyles.styles.raw.js +16 -3
- package/lib-commonjs/components/DonutChart/useDonutChartStyles.styles.raw.js.map +1 -1
- package/package.json +12 -12
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/CommonComponents/CartesianChart.tsx"],"sourcesContent":["import * as React from 'react';\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport { ModifiedCartesianChartProps } from '../../index';\nimport { useCartesianChartStyles } from './useCartesianChartStyles.styles';\nimport { select as d3Select } from 'd3-selection';\nimport {\n createNumericXAxis,\n createStringXAxis,\n IAxisData,\n createDateXAxis,\n IMargins,\n XAxisTypes,\n YAxisType,\n createWrapOfXLabels,\n rotateXAxisLabels,\n calculateLongestLabelWidth,\n createYAxisLabels,\n ChartTypes,\n wrapContent,\n useRtl,\n truncateString,\n tooltipOfAxislabels,\n getSecureProps,\n DEFAULT_WRAP_WIDTH,\n} from '../../utilities/index';\nimport { useId } from '@fluentui/react-utilities';\nimport type { JSXElement } from '@fluentui/react-utilities';\nimport { SVGTooltipText } from '../../utilities/SVGTooltipText';\nimport { ChartPopover } from './ChartPopover';\nimport { useFocusableGroup, useArrowNavigationGroup } from '@fluentui/react-tabster';\n\n/**\n * Cartesian Chart component\n * {@docCategory CartesianChart}\n */\nexport const CartesianChart: React.FunctionComponent<ModifiedCartesianChartProps> = React.forwardRef<\n HTMLDivElement,\n ModifiedCartesianChartProps\n>((props, forwardedRef) => {\n const chartContainer = React.useRef<HTMLDivElement>();\n let legendContainer: HTMLDivElement;\n const minLegendContainerHeight: number = 40;\n const xAxisElement = React.useRef<SVGSVGElement>();\n const yAxisElement = React.useRef<SVGSVGElement>();\n const yAxisElementSecondary = React.useRef<SVGSVGElement>();\n let margins: IMargins;\n const idForGraph: string = 'chart_';\n let _reqID: number;\n const _useRtl: boolean = useRtl();\n let _tickValues: (string | number)[];\n const titleMargin: number = 8;\n const _isFirstRender = React.useRef<boolean>(true);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let _xScale: any;\n let isIntegralDataset: boolean = true;\n let _tooltipId: string = useId('tooltip_');\n /* Used for when WrapXAxisLabels props appeared.\n * To display the total word (space separated words), Need to have more space than usual.\n * This height will get total height need to disaply total word.\n * These value need to be removed from actual svg height/graph height.\n * Defalut value is 0. And this values calculted when 'wrapXAxisLables' or 'showXAxisLablesTooltip' is true.\n */\n let _removalValueForTextTuncate: number = 0;\n\n const [containerWidth, setContainerWidth] = React.useState<number>(0);\n const [containerHeight, setContainerHeight] = React.useState<number>(0);\n const [startFromX, setStartFromX] = React.useState<number>(0);\n const [prevProps, setPrevProps] = React.useState<ModifiedCartesianChartProps | null>(null);\n\n const chartTypesWithStringYAxis = [\n ChartTypes.HorizontalBarChartWithAxis,\n ChartTypes.HeatMapChart,\n ChartTypes.VerticalStackedBarChart,\n ChartTypes.GanttChart,\n ];\n /**\n * In RTL mode, Only graph will be rendered left/right. We need to provide left and right margins manually.\n * So that, in RTL, left margins becomes right margins and viceversa.\n * As graph needs to be drawn perfecty, these values consider as default values.\n * Same margins using for all other cartesian charts. Can be accessible through 'getMargins' call back method.\n */\n // eslint-disable-next-line prefer-const\n margins = {\n top: props.margins?.top ?? 20,\n bottom: props.margins?.bottom ?? 35,\n right: _useRtl ? props.margins?.left ?? 40 : props.margins?.right ?? props?.secondaryYScaleOptions ? 40 : 20,\n left: _useRtl ? (props.margins?.right ?? props?.secondaryYScaleOptions ? 40 : 20) : props.margins?.left ?? 40,\n };\n const TITLE_MARGIN = 20;\n if (props.xAxisTitle !== undefined && props.xAxisTitle !== '') {\n margins.bottom! = props.margins?.bottom ?? margins.bottom! + TITLE_MARGIN;\n }\n if (props.yAxisTitle !== undefined && props.yAxisTitle !== '') {\n margins.left! = _useRtl\n ? props.margins?.right ?? props?.secondaryYAxistitle\n ? margins.right! + 2 * TITLE_MARGIN\n : margins.right! + TITLE_MARGIN\n : props.margins?.left ?? margins.left! + TITLE_MARGIN;\n margins.right! = _useRtl\n ? props.margins?.left ?? margins.left! + TITLE_MARGIN\n : props.margins?.right ?? props?.secondaryYAxistitle\n ? margins.right! + 2 * TITLE_MARGIN\n : margins.right! + TITLE_MARGIN;\n }\n if (props.xAxisAnnotation !== undefined && props.xAxisAnnotation !== '') {\n margins.top! = props.margins?.top ?? margins.top! + TITLE_MARGIN;\n }\n if (\n props.yAxisAnnotation !== undefined &&\n props.yAxisAnnotation !== '' &&\n (props.secondaryYAxistitle === undefined || props.secondaryYAxistitle === '')\n ) {\n if (_useRtl) {\n margins.left! = props.margins?.right ?? margins.right! + TITLE_MARGIN;\n } else {\n margins.right! = props.margins?.right ?? margins.right! + TITLE_MARGIN;\n }\n }\n\n const classes = useCartesianChartStyles(props);\n const focusAttributes = useFocusableGroup();\n const arrowAttributes = useArrowNavigationGroup({ axis: 'horizontal' });\n // ComponentdidMount and Componentwillunmount logic\n React.useEffect(() => {\n _fitParentContainer();\n if (props !== null) {\n setPrevProps(props);\n }\n if (\n chartTypesWithStringYAxis.includes(props.chartType) &&\n props.showYAxisLables &&\n yAxisElement &&\n props.yAxisType === YAxisType.StringAxis\n ) {\n const maxYAxisLabelLength = calculateMaxYAxisLabelLength(classes.yAxis!);\n if (startFromX !== maxYAxisLabelLength) {\n setStartFromX(maxYAxisLabelLength);\n }\n } else if (startFromX !== 0) {\n setStartFromX(0);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n isIntegralDataset = !props.points.some((point: { y: number }) => point.y % 1 !== 0);\n return () => {\n cancelAnimationFrame(_reqID);\n };\n }, [props]);\n\n // ComponentDidUpdate logic\n React.useEffect(() => {\n if (prevProps) {\n if (prevProps.height !== props.height || prevProps.width !== props.width) {\n _fitParentContainer();\n }\n }\n if (\n chartTypesWithStringYAxis.includes(props.chartType) &&\n props.showYAxisLables &&\n yAxisElement &&\n props.yAxisType === YAxisType.StringAxis\n ) {\n const maxYAxisLabelLength = calculateMaxYAxisLabelLength(classes.yAxis!);\n if (startFromX !== maxYAxisLabelLength) {\n setStartFromX(maxYAxisLabelLength);\n }\n } else if (startFromX !== 0) {\n setStartFromX(0);\n }\n if (prevProps !== null && prevProps.points !== props.points) {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n isIntegralDataset = !props.points.some((point: { y: number }) => point.y % 1 !== 0);\n }\n }, [props, prevProps]);\n\n React.useImperativeHandle(\n props.componentRef,\n () => ({\n chartContainer: chartContainer.current ?? null,\n }),\n [],\n );\n\n /**\n * Dedicated function to return the Callout JSX Element , which can further be used to only call this when\n * only the calloutprops and charthover props changes.\n * @param calloutProps\n * @param chartHoverProps\n * @returns\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function _generateCallout(calloutProps: any): JSXElement {\n return <ChartPopover {...calloutProps} />;\n }\n\n function calculateMaxYAxisLabelLength(className: string): number {\n const formatTickLabel = (str: string) => {\n if (props.showYAxisLablesTooltip) {\n return truncateString(str, props.noOfCharsToTruncate || 4);\n }\n\n return str;\n };\n return calculateLongestLabelWidth(\n props.stringDatasetForYAxisDomain!.map(label => formatTickLabel(label)),\n `.${className} text`,\n );\n }\n\n const {\n calloutProps,\n points,\n chartType,\n svgProps,\n culture,\n dateLocalizeOptions,\n timeFormatLocale,\n customDateTimeFormatter,\n } = props;\n if (props.parentRef) {\n _fitParentContainer();\n }\n const margin = { ...margins };\n // Note: This check is unnecessary since startFromX is only set for charts with string y-axis.\n if (chartTypesWithStringYAxis.includes(props.chartType)) {\n if (!_useRtl) {\n margin.left! += startFromX;\n } else {\n margin.right! += startFromX;\n }\n }\n // Callback for margins to the chart\n props.getmargins && props.getmargins(margin);\n\n let callout: JSXElement | null = null;\n\n let children = null;\n if ((props.enableFirstRenderOptimization && chartContainer.current) || !props.enableFirstRenderOptimization) {\n _isFirstRender.current = false;\n const XAxisParams = {\n domainNRangeValues: props.getDomainNRangeValues(\n points,\n props.getDomainMargins ? props.getDomainMargins(containerWidth) : margins,\n containerWidth,\n chartType,\n _useRtl,\n props.xAxisType,\n props.barwidth!,\n props.tickValues!,\n // This is only used for Horizontal Bar Chart with Axis for y as string axis\n startFromX,\n ),\n // FIXME: In XAxisParams, containerHeight is used by HBWA to generate vertical gridlines.\n // Since the x-axis in HBWA is numeric, it typically doesn't require transformation.\n // However, if transformation props are enabled, the updated _removalValueForTextTuncate\n // will only be available in the next render, as it's set after the axis is created.\n // Solution: Delay the creation of gridlines until after the transformation has been applied,\n // or precompute the required height for transformed labels (_removalValueForTextTuncate).\n containerHeight: containerHeight - _removalValueForTextTuncate,\n margins: margins,\n xAxisElement: xAxisElement.current!,\n showRoundOffXTickValues: props.showRoundOffXTickValues ?? true,\n xAxisCount: props.xAxisTickCount,\n xAxistickSize: props.xAxistickSize,\n tickPadding: props.tickPadding || props.showXAxisLablesTooltip ? 5 : 10,\n xAxisPadding: props.xAxisPadding,\n xAxisInnerPadding: props.xAxisInnerPadding,\n xAxisOuterPadding: props.xAxisOuterPadding,\n containerWidth: containerWidth,\n hideTickOverlap: props.rotateXAxisLables ? false : props.hideTickOverlap,\n calcMaxLabelWidth: _calcMaxLabelWidthWithTransform,\n };\n\n /**\n * These scales used for 2 purposes.\n * 1. To create x and y axis\n * 2. To draw the graph.\n * For area/line chart using same scales. For other charts, creating their own scales to draw the graph.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let xScale: any;\n let tickValues: (string | number)[];\n switch (props.xAxisType!) {\n case XAxisTypes.NumericAxis:\n ({ xScale, tickValues } = createNumericXAxis(XAxisParams, props.tickParams!, props.chartType, culture));\n break;\n case XAxisTypes.DateAxis:\n ({ xScale, tickValues } = createDateXAxis(\n XAxisParams,\n props.tickParams!,\n culture,\n dateLocalizeOptions,\n timeFormatLocale,\n customDateTimeFormatter,\n props.useUTC,\n props.chartType,\n ));\n break;\n case XAxisTypes.StringAxis:\n ({ xScale, tickValues } = createStringXAxis(\n XAxisParams,\n props.tickParams!,\n props.datasetForXAxisDomain!,\n culture,\n ));\n break;\n default:\n ({ xScale, tickValues } = createNumericXAxis(XAxisParams, props.tickParams!, props.chartType, culture));\n }\n _xScale = xScale;\n _tickValues = tickValues;\n\n _transformXAxisLabels();\n\n const YAxisParams = {\n margins: props.getYDomainMargins ? props.getYDomainMargins(containerHeight) : margins,\n containerWidth: containerWidth,\n containerHeight: containerHeight - _removalValueForTextTuncate,\n yAxisElement: yAxisElement.current!,\n yAxisTickFormat: props.yAxisTickFormat!,\n yAxisTickCount: props.yAxisTickCount!,\n yMinValue: props.yMinValue || 0,\n yMaxValue: props.yMaxValue || 0,\n tickPadding: 10,\n maxOfYVal: props.maxOfYVal,\n yMinMaxValues: props.getMinMaxOfYAxis(points, props.yAxisType),\n // please note these padding default values must be consistent in here\n // and the parent chart(HBWA/Vertical etc..) for more details refer example\n // http://using-d3js.com/04_07_ordinal_scales.html\n yAxisPadding: props.yAxisPadding || 0,\n };\n /**\n * These scales used for 2 purposes.\n * 1. To create x and y axis\n * 2. To draw the graph.\n * For area/line chart using same scales. For other charts, creating their own scales to draw the graph.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let yScalePrimary: any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let yScaleSecondary: any;\n const axisData: IAxisData = { yAxisDomainValues: [] };\n if (props.yAxisType && props.yAxisType === YAxisType.StringAxis) {\n yScalePrimary = props.createStringYAxis(\n YAxisParams,\n props.stringDatasetForYAxisDomain!,\n _useRtl,\n props.barwidth,\n props.chartType,\n );\n } else {\n // TODO: Since the scale domain values are now computed independently for both the primary and\n // secondary y-axes, the yMinValue and yMaxValue props are no longer necessary for accurately\n // rendering the secondary y-axis. Therefore, rather than checking the secondaryYScaleOptions\n // prop to determine whether to create a secondary y-axis, it's more appropriate to check if any\n // data points are assigned to use the secondary y-scale.\n if (props?.secondaryYScaleOptions) {\n const YAxisParamsSecondary = {\n margins: margins,\n containerWidth: containerWidth,\n containerHeight: containerHeight - _removalValueForTextTuncate!,\n yAxisElement: yAxisElementSecondary.current,\n yAxisTickFormat: props.yAxisTickFormat!,\n yAxisTickCount: props.yAxisTickCount!,\n yMinValue: props.secondaryYScaleOptions?.yMinValue || 0,\n yMaxValue: props.secondaryYScaleOptions?.yMaxValue ?? 100,\n tickPadding: 10,\n yMinMaxValues: props.getMinMaxOfYAxis(points, props.yAxisType, true),\n yAxisPadding: props.yAxisPadding,\n };\n\n yScaleSecondary = props.createYAxis(\n YAxisParamsSecondary,\n _useRtl,\n axisData,\n isIntegralDataset,\n chartType,\n true,\n props.roundedTicks!,\n );\n }\n yScalePrimary = props.createYAxis(\n YAxisParams,\n _useRtl,\n axisData,\n isIntegralDataset,\n chartType,\n false,\n props.roundedTicks!,\n );\n }\n\n if (chartTypesWithStringYAxis.includes(props.chartType) && props.yAxisType === YAxisType.StringAxis) {\n // Removing un wanted tooltip div from DOM, when prop not provided, for proper cleanup\n // of unwanted DOM elements, to prevent flacky behaviour in tooltips , that might occur\n // in creating tooltips when tooltips are enabled( as we try to recreate a tspan with _tooltipId)\n if (!props.showYAxisLablesTooltip) {\n try {\n document.getElementById(_tooltipId) && document.getElementById(_tooltipId)!.remove();\n //eslint-disable-next-line no-empty\n } catch (e) {}\n }\n // Used to display tooltip at y axis labels.\n if (props.showYAxisLablesTooltip) {\n // To create y axis tick values by if specified truncating the rest of the text\n // and showing elipsis or showing the whole string,\n yScalePrimary &&\n // Note: This function should be invoked within the showYAxisLablesTooltip check,\n // as its sole purpose is to truncate labels that exceed the noOfCharsToTruncate limit.\n createYAxisLabels(\n yAxisElement.current!,\n yScalePrimary,\n props.noOfCharsToTruncate || 4,\n props.showYAxisLablesTooltip || false,\n _useRtl,\n );\n const _yAxisElement = d3Select(yAxisElement.current!).call(yScalePrimary);\n try {\n document.getElementById(_tooltipId) && document.getElementById(_tooltipId)!.remove();\n //eslint-disable-next-line no-empty\n } catch (e) {}\n const ytooltipProps = {\n tooltipCls: classes.tooltip!,\n id: _tooltipId,\n axis: _yAxisElement,\n };\n _yAxisElement && tooltipOfAxislabels(ytooltipProps);\n }\n }\n\n // Call back to the chart.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const _getData = (xScale: any, yScalePrimary: any, yScaleSecondary: any) => {\n props.getGraphData &&\n props.getGraphData(\n xScale,\n yScalePrimary,\n containerHeight - _removalValueForTextTuncate!,\n containerWidth,\n xAxisElement.current,\n yAxisElement.current,\n yScaleSecondary,\n );\n };\n\n props.getAxisData && props.getAxisData(axisData);\n // Callback function for chart, returns axis\n _getData(xScale, yScalePrimary, yScaleSecondary);\n\n children = props.children({\n xScale,\n yScalePrimary,\n yScaleSecondary,\n containerHeight,\n containerWidth,\n });\n\n if (!props.hideTooltip && calloutProps!.isPopoverOpen) {\n callout = _generateCallout(calloutProps);\n }\n }\n const svgDimensions = {\n width: containerWidth,\n height: containerHeight,\n };\n\n const xAxisTitleMaximumAllowedWidth = svgDimensions.width - margins.left! - margins.right! - startFromX!;\n const yAxisTitleMaximumAllowedHeight =\n svgDimensions.height - margins.bottom! - margins.top! - _removalValueForTextTuncate! - titleMargin;\n /**\n * When screen resizes, along with screen, chart also auto adjusted.\n * This method used to adjust height and width of the charts.\n */\n function _fitParentContainer(): void {\n //_reqID = requestAnimationFrame(() => {\n let legendContainerHeight;\n if (props.hideLegend) {\n // If there is no legend, need not to allocate some space from total chart space.\n legendContainerHeight = 0;\n } else {\n const legendContainerComputedStyles = legendContainer && getComputedStyle(legendContainer);\n legendContainerHeight =\n ((legendContainer && legendContainer.getBoundingClientRect().height) || minLegendContainerHeight) +\n parseFloat((legendContainerComputedStyles && legendContainerComputedStyles.marginTop) || '0') +\n parseFloat((legendContainerComputedStyles && legendContainerComputedStyles.marginBottom) || '0');\n }\n if (props.parentRef || chartContainer.current) {\n const container = props.parentRef ? props.parentRef : chartContainer.current!;\n const currentContainerWidth =\n props.reflowProps?.mode === 'min-width' && !_isFirstRender.current\n ? Math.max(container.getBoundingClientRect().width, _calculateChartMinWidth())\n : container.getBoundingClientRect().width;\n const currentContainerHeight =\n container.getBoundingClientRect().height > legendContainerHeight\n ? container.getBoundingClientRect().height\n : 350;\n const shouldResize =\n containerWidth !== currentContainerWidth || containerHeight !== currentContainerHeight - legendContainerHeight;\n if (shouldResize) {\n setContainerWidth(currentContainerWidth);\n setContainerHeight(currentContainerHeight - legendContainerHeight);\n }\n }\n //});\n }\n\n function _onChartLeave(): void {\n props.onChartMouseLeave && props.onChartMouseLeave();\n }\n\n function _calculateChartMinWidth(): number {\n // Adding 10px for padding on both sides\n const labelWidth = _calcMaxLabelWidthWithTransform(_tickValues) + 10;\n\n let minChartWidth = margins.left! + margins.right! + labelWidth * (_tickValues.length - 1);\n\n if (\n [ChartTypes.GroupedVerticalBarChart, ChartTypes.VerticalBarChart, ChartTypes.VerticalStackedBarChart].includes(\n props.chartType,\n )\n ) {\n const minDomainMargin = 8;\n minChartWidth += minDomainMargin * 2;\n }\n\n return minChartWidth;\n }\n\n function _calcMaxLabelWidthWithTransform(x: (string | number)[]) {\n // Case: rotated labels\n if (!props.wrapXAxisLables && props.rotateXAxisLables && props.xAxisType! === XAxisTypes.StringAxis) {\n const longestLabelWidth = calculateLongestLabelWidth(x, `.${classes.xAxis} text`);\n return Math.ceil(longestLabelWidth * Math.cos(Math.PI / 4));\n }\n\n // Case: truncated labels\n if (props.showXAxisLablesTooltip) {\n const tickValues = x.map(val => {\n const numChars = props.noOfCharsToTruncate || 4;\n return val.toString().length > numChars ? `${val.toString().slice(0, numChars)}...` : val;\n });\n\n const longestLabelWidth = calculateLongestLabelWidth(tickValues, `.${classes.xAxis} text`);\n return Math.ceil(longestLabelWidth);\n }\n\n // Case: wrapped labels\n if (props.wrapXAxisLables) {\n // FIXME: Calculate the max width of lines instead of words. This requires applying\n // the wrapping transformation earlier to obtain the actual rendered lines.\n const words: string[] = [];\n x.forEach((val: string) => {\n words.push(...val.toString().split(/\\s+/));\n });\n\n // This approach works well in most cases, since overflow typically occurs only when\n // a single word exceeds the specified width — otherwise, the text will wrap as expected.\n const longestLabelWidth = calculateLongestLabelWidth(words, `.${classes.xAxis} text`);\n return Math.max(Math.ceil(longestLabelWidth), DEFAULT_WRAP_WIDTH);\n }\n\n // Default case\n const longestLabelWidth = calculateLongestLabelWidth(x, `.${classes.xAxis} text`);\n return Math.ceil(longestLabelWidth);\n }\n\n function _transformXAxisLabels() {\n _removalValueForTextTuncate = 0;\n\n /*\n * To enable wrapping of x axis tick values or to display complete x axis tick values,\n * we need to calculate how much space it needed to render the text.\n * No need to re-calculate every time the chart renders and same time need to get an update. So using setState.\n * Required space will be calculated first time chart rendering and if any width/height of chart updated.\n * */\n if (props.wrapXAxisLables || props.showXAxisLablesTooltip) {\n let maxXAxisLabelWidth: number | undefined;\n if (props.xAxisType === XAxisTypes.StringAxis) {\n if ((props.datasetForXAxisDomain?.length || 0) > 1) {\n maxXAxisLabelWidth = _xScale.step();\n } else {\n maxXAxisLabelWidth = containerWidth;\n }\n }\n\n const wrapLabelProps = {\n node: xAxisElement.current!,\n xAxis: _xScale,\n showXAxisLablesTooltip: props.showXAxisLablesTooltip || false,\n noOfCharsToTruncate: props.noOfCharsToTruncate || 4,\n width: maxXAxisLabelWidth,\n };\n _removalValueForTextTuncate = createWrapOfXLabels(wrapLabelProps) ?? 0;\n }\n\n if (!props.wrapXAxisLables && props.rotateXAxisLables && props.xAxisType! === XAxisTypes.StringAxis) {\n const rotateLabelProps = {\n node: xAxisElement.current!,\n xAxis: _xScale,\n };\n const rotatedHeight = rotateXAxisLabels(rotateLabelProps) ?? 0;\n // margins.bottom is used as padding here\n _removalValueForTextTuncate = rotatedHeight + margins.bottom!;\n }\n }\n\n /**\n * We have use the {@link defaultTabbableElement } to fix\n * the Focus not landing on chart while tabbing, instead goes to legend.\n * This issue is observed in Area, line chart after performance optimization done in the PR {@link https://github.com/microsoft/fluentui/pull/27721 }\n * This issue is observed in Bar charts after the changes done by FocusZone team in the PR: {@link https://github.com/microsoft/fluentui/pull/24175 }\n * The issue in Bar Charts(VB and VSB) is due to a {@link FocusZone } update where previously an event listener was\n * attached on keydown to the window, so that whenever the tab key is pressed all outer FocusZone's\n * tab-indexes are updated (an outer FocusZone is a FocusZone that is not within another one).\n * But now after the above PR : they are attaching the\n * listeners to the FocusZone elements instead of the window. So in the first render cycle in Bar charts\n * bars are not created as in the first render cycle the size of the chart container is not known( or is 0)\n * which creates bars of height 0 so instead we do not create any bars and instead return empty fragments.\n *\n * We have tried 2 Approaches to fix the issue:\n * 1. Using the {@link elementRef} property of FocusZone where we dispatch event for tab keydown\n * after the second render cycle which triggers an update of the tab index in FocusZone.\n * But this is a hacky solution and not a proper fix and also elementRef is deprecated.\n * 2. Using the default tabbable element to fix the issue.\n */\n\n return (\n <div\n id={idForGraph}\n className={classes.root}\n role={'presentation'}\n ref={(rootElem: HTMLDivElement) => (chartContainer.current = rootElem)}\n onMouseLeave={_onChartLeave}\n >\n <div className={classes.chartWrapper} {...focusAttributes} {...arrowAttributes}>\n {_isFirstRender.current}\n <svg\n width={svgDimensions.width}\n height={svgDimensions.height}\n aria-label={props.chartTitle}\n style={{ display: 'block' }}\n className={classes.chart}\n {...getSecureProps(svgProps)}\n >\n <g\n ref={(e: SVGSVGElement | null) => {\n xAxisElement.current = e!;\n }}\n id={`xAxisGElement${idForGraph}`}\n // To add wrap of x axis lables feature, need to remove word height from svg height.\n transform={`translate(0, ${svgDimensions.height - margins.bottom! - _removalValueForTextTuncate!})`}\n className={classes.xAxis}\n />\n {props.xAxisTitle !== undefined && props.xAxisTitle !== '' && (\n <SVGTooltipText\n content={props.xAxisTitle}\n textProps={{\n x: margins.left! + startFromX + xAxisTitleMaximumAllowedWidth / 2,\n y: svgDimensions.height - titleMargin,\n className: classes.axisTitle!,\n textAnchor: 'middle',\n }}\n maxWidth={xAxisTitleMaximumAllowedWidth}\n wrapContent={wrapContent}\n showBackground={true}\n className={classes.svgTooltip}\n />\n )}\n {props.xAxisAnnotation !== undefined && props.xAxisAnnotation !== '' && (\n <SVGTooltipText\n content={props.xAxisAnnotation}\n textProps={{\n x: margins.left! + startFromX + xAxisTitleMaximumAllowedWidth / 2,\n y: titleMargin + 3,\n className: classes.axisAnnotation!,\n textAnchor: 'middle',\n 'aria-hidden': true,\n }}\n maxWidth={xAxisTitleMaximumAllowedWidth}\n wrapContent={wrapContent}\n showBackground={true}\n className={classes.svgTooltip}\n />\n )}\n <g\n ref={(e: SVGSVGElement | null) => {\n yAxisElement.current = e!;\n }}\n id={`yAxisGElement${idForGraph}`}\n transform={`translate(${\n _useRtl ? svgDimensions.width - margins.right! - startFromX : margins.left! + startFromX\n }, 0)`}\n className={classes.yAxis}\n />\n {props.secondaryYScaleOptions && (\n <g>\n <g\n ref={(e: SVGSVGElement | null) => {\n yAxisElementSecondary.current = e!;\n }}\n id={`yAxisGElementSecondary${idForGraph}`}\n transform={`translate(${\n _useRtl ? margins.left! + startFromX : svgDimensions.width - margins.right! - startFromX\n }, 0)`}\n className={classes.yAxis}\n />\n {props.secondaryYAxistitle !== undefined && props.secondaryYAxistitle !== '' && (\n <SVGTooltipText\n content={props.secondaryYAxistitle}\n textProps={{\n x: (yAxisTitleMaximumAllowedHeight - margins.bottom!) / 2 + _removalValueForTextTuncate!,\n y: _useRtl ? startFromX - titleMargin : svgDimensions.width - margins.right!,\n textAnchor: 'middle',\n transform: `translate(${\n _useRtl ? margins.right! / 2 - titleMargin : margins.right! / 2 + titleMargin\n },\n ${svgDimensions.height - margins.bottom! - margins.top! - titleMargin})rotate(-90)`,\n className: classes.axisTitle!,\n }}\n maxWidth={yAxisTitleMaximumAllowedHeight}\n wrapContent={wrapContent}\n showBackground={true}\n className={classes.svgTooltip}\n />\n )}\n </g>\n )}\n {children}\n {props.yAxisTitle !== undefined && props.yAxisTitle !== '' && (\n <SVGTooltipText\n content={props.yAxisTitle}\n textProps={{\n x: (yAxisTitleMaximumAllowedHeight - margins.bottom!) / 2 + _removalValueForTextTuncate!,\n y: _useRtl ? svgDimensions.width - margins.right! / 2 + titleMargin : margins.left! / 2 - titleMargin,\n textAnchor: 'middle',\n transform: `translate(0,\n ${svgDimensions.height - margins.bottom! - margins.top! - titleMargin})rotate(-90)`,\n className: classes.axisTitle!,\n }}\n maxWidth={yAxisTitleMaximumAllowedHeight}\n wrapContent={wrapContent}\n showBackground={true}\n className={classes.svgTooltip}\n />\n )}\n {props.yAxisAnnotation !== undefined &&\n props.yAxisAnnotation !== '' &&\n (props.secondaryYAxistitle === undefined || props.secondaryYAxistitle === '') && (\n <SVGTooltipText\n content={props.yAxisAnnotation}\n textProps={{\n x: (yAxisTitleMaximumAllowedHeight - margins.bottom!) / 2 + _removalValueForTextTuncate!,\n y: _useRtl ? startFromX - titleMargin : svgDimensions.width - margins.right!,\n textAnchor: 'middle',\n transform: `translate(${\n _useRtl ? margins.right! / 2 - titleMargin : margins.right! / 2 + titleMargin\n },\n ${svgDimensions.height - margins.bottom! - margins.top! - titleMargin})rotate(-90)`,\n className: classes.axisAnnotation!,\n 'aria-hidden': true,\n }}\n maxWidth={yAxisTitleMaximumAllowedHeight}\n wrapContent={wrapContent}\n showBackground={true}\n className={classes.svgTooltip}\n />\n )}\n </svg>\n </div>\n\n {!props.hideLegend && (\n <div ref={(e: HTMLDivElement) => (legendContainer = e)} className={classes.legendContainer}>\n {props.legendBars}\n </div>\n )}\n {/** The callout is used for narration, so keep it mounted on the DOM */}\n {callout && <React.Suspense fallback={<div>Loading...</div>}>{callout}</React.Suspense>}\n </div>\n );\n});\nCartesianChart.displayName = 'CartesianChart';\nCartesianChart.defaultProps = {\n hideTickOverlap: true,\n};\n"],"names":["React","useCartesianChartStyles","select","d3Select","createNumericXAxis","createStringXAxis","createDateXAxis","XAxisTypes","YAxisType","createWrapOfXLabels","rotateXAxisLabels","calculateLongestLabelWidth","createYAxisLabels","ChartTypes","wrapContent","useRtl","truncateString","tooltipOfAxislabels","getSecureProps","DEFAULT_WRAP_WIDTH","useId","SVGTooltipText","ChartPopover","useFocusableGroup","useArrowNavigationGroup","CartesianChart","forwardRef","props","forwardedRef","chartContainer","useRef","legendContainer","minLegendContainerHeight","xAxisElement","yAxisElement","yAxisElementSecondary","margins","idForGraph","_reqID","_useRtl","_tickValues","titleMargin","_isFirstRender","_xScale","isIntegralDataset","_tooltipId","_removalValueForTextTuncate","containerWidth","setContainerWidth","useState","containerHeight","setContainerHeight","startFromX","setStartFromX","prevProps","setPrevProps","chartTypesWithStringYAxis","HorizontalBarChartWithAxis","HeatMapChart","VerticalStackedBarChart","GanttChart","top","bottom","right","left","secondaryYScaleOptions","TITLE_MARGIN","xAxisTitle","undefined","yAxisTitle","secondaryYAxistitle","xAxisAnnotation","yAxisAnnotation","classes","focusAttributes","arrowAttributes","axis","useEffect","_fitParentContainer","includes","chartType","showYAxisLables","yAxisType","StringAxis","maxYAxisLabelLength","calculateMaxYAxisLabelLength","yAxis","points","some","point","y","cancelAnimationFrame","height","width","useImperativeHandle","componentRef","current","_generateCallout","calloutProps","className","formatTickLabel","str","showYAxisLablesTooltip","noOfCharsToTruncate","stringDatasetForYAxisDomain","map","label","svgProps","culture","dateLocalizeOptions","timeFormatLocale","customDateTimeFormatter","parentRef","margin","getmargins","callout","children","enableFirstRenderOptimization","XAxisParams","domainNRangeValues","getDomainNRangeValues","getDomainMargins","xAxisType","barwidth","tickValues","showRoundOffXTickValues","xAxisCount","xAxisTickCount","xAxistickSize","tickPadding","showXAxisLablesTooltip","xAxisPadding","xAxisInnerPadding","xAxisOuterPadding","hideTickOverlap","rotateXAxisLables","calcMaxLabelWidth","_calcMaxLabelWidthWithTransform","xScale","NumericAxis","tickParams","DateAxis","useUTC","datasetForXAxisDomain","_transformXAxisLabels","YAxisParams","getYDomainMargins","yAxisTickFormat","yAxisTickCount","yMinValue","yMaxValue","maxOfYVal","yMinMaxValues","getMinMaxOfYAxis","yAxisPadding","yScalePrimary","yScaleSecondary","axisData","yAxisDomainValues","createStringYAxis","YAxisParamsSecondary","createYAxis","roundedTicks","document","getElementById","remove","e","_yAxisElement","call","ytooltipProps","tooltipCls","tooltip","id","_getData","getGraphData","getAxisData","hideTooltip","isPopoverOpen","svgDimensions","xAxisTitleMaximumAllowedWidth","yAxisTitleMaximumAllowedHeight","legendContainerHeight","hideLegend","legendContainerComputedStyles","getComputedStyle","getBoundingClientRect","parseFloat","marginTop","marginBottom","container","currentContainerWidth","reflowProps","mode","Math","max","_calculateChartMinWidth","currentContainerHeight","shouldResize","_onChartLeave","onChartMouseLeave","labelWidth","minChartWidth","length","GroupedVerticalBarChart","VerticalBarChart","minDomainMargin","x","wrapXAxisLables","longestLabelWidth","xAxis","ceil","cos","PI","val","numChars","toString","slice","words","forEach","push","split","maxXAxisLabelWidth","step","wrapLabelProps","node","rotateLabelProps","rotatedHeight","div","root","role","ref","rootElem","onMouseLeave","chartWrapper","svg","aria-label","chartTitle","style","display","chart","g","transform","content","textProps","axisTitle","textAnchor","maxWidth","showBackground","svgTooltip","axisAnnotation","legendBars","Suspense","fallback","displayName","defaultProps"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../src/components/CommonComponents/CartesianChart.tsx"],"sourcesContent":["import * as React from 'react';\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport { ModifiedCartesianChartProps } from '../../index';\nimport { useCartesianChartStyles } from './useCartesianChartStyles.styles';\nimport { select as d3Select } from 'd3-selection';\nimport {\n createNumericXAxis,\n createStringXAxis,\n IAxisData,\n createDateXAxis,\n IMargins,\n XAxisTypes,\n YAxisType,\n createWrapOfXLabels,\n rotateXAxisLabels,\n calculateLongestLabelWidth,\n createYAxisLabels,\n ChartTypes,\n wrapContent,\n useRtl,\n truncateString,\n tooltipOfAxislabels,\n getSecureProps,\n DEFAULT_WRAP_WIDTH,\n} from '../../utilities/index';\nimport { useId } from '@fluentui/react-utilities';\nimport type { JSXElement } from '@fluentui/react-utilities';\nimport { SVGTooltipText } from '../../utilities/SVGTooltipText';\nimport { ChartPopover } from './ChartPopover';\nimport { useFocusableGroup, useArrowNavigationGroup } from '@fluentui/react-tabster';\n\n/**\n * Cartesian Chart component\n * {@docCategory CartesianChart}\n */\nexport const CartesianChart: React.FunctionComponent<ModifiedCartesianChartProps> = React.forwardRef<\n HTMLDivElement,\n ModifiedCartesianChartProps\n>((props, forwardedRef) => {\n const chartContainer = React.useRef<HTMLDivElement>();\n let legendContainer: HTMLDivElement;\n const minLegendContainerHeight: number = 40;\n const xAxisElement = React.useRef<SVGSVGElement>();\n const yAxisElement = React.useRef<SVGSVGElement>();\n const yAxisElementSecondary = React.useRef<SVGSVGElement>();\n let margins: IMargins;\n const idForGraph: string = 'chart_';\n let _reqID: number;\n const _useRtl: boolean = useRtl();\n let _tickValues: (string | number)[];\n const titleMargin: number = 8;\n const _isFirstRender = React.useRef<boolean>(true);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let _xScale: any;\n let isIntegralDataset: boolean = true;\n let _tooltipId: string = useId('tooltip_');\n /* Used for when WrapXAxisLabels props appeared.\n * To display the total word (space separated words), Need to have more space than usual.\n * This height will get total height need to disaply total word.\n * These value need to be removed from actual svg height/graph height.\n * Defalut value is 0. And this values calculted when 'wrapXAxisLables' or 'showXAxisLablesTooltip' is true.\n */\n let _removalValueForTextTuncate: number = 0;\n\n const [containerWidth, setContainerWidth] = React.useState<number>(0);\n const [containerHeight, setContainerHeight] = React.useState<number>(0);\n const [startFromX, setStartFromX] = React.useState<number>(0);\n const [prevProps, setPrevProps] = React.useState<ModifiedCartesianChartProps | null>(null);\n\n const chartTypesWithStringYAxis = [\n ChartTypes.HorizontalBarChartWithAxis,\n ChartTypes.HeatMapChart,\n ChartTypes.VerticalStackedBarChart,\n ChartTypes.GanttChart,\n ];\n /**\n * In RTL mode, Only graph will be rendered left/right. We need to provide left and right margins manually.\n * So that, in RTL, left margins becomes right margins and viceversa.\n * As graph needs to be drawn perfecty, these values consider as default values.\n * Same margins using for all other cartesian charts. Can be accessible through 'getMargins' call back method.\n */\n // eslint-disable-next-line prefer-const\n margins = {\n top: props.margins?.top ?? 20,\n bottom: props.margins?.bottom ?? 35,\n right: _useRtl ? props.margins?.left ?? 40 : props.margins?.right ?? props?.secondaryYScaleOptions ? 40 : 20,\n left: _useRtl ? (props.margins?.right ?? props?.secondaryYScaleOptions ? 40 : 20) : props.margins?.left ?? 40,\n };\n const TITLE_MARGIN_HORIZONTAL = 24;\n const TITLE_MARGIN_VERTICAL = 20;\n if (props.xAxisTitle !== undefined && props.xAxisTitle !== '') {\n margins.bottom! = props.margins?.bottom ?? margins.bottom! + TITLE_MARGIN_VERTICAL;\n }\n if (props.yAxisTitle !== undefined && props.yAxisTitle !== '') {\n margins.left! = _useRtl\n ? props.margins?.right ?? props?.secondaryYAxistitle\n ? margins.right! + 2 * TITLE_MARGIN_HORIZONTAL\n : margins.right! + TITLE_MARGIN_HORIZONTAL\n : props.margins?.left ?? margins.left! + TITLE_MARGIN_HORIZONTAL;\n margins.right! = _useRtl\n ? props.margins?.left ?? margins.left! + TITLE_MARGIN_HORIZONTAL\n : props.margins?.right ?? props?.secondaryYAxistitle\n ? margins.right! + 2 * TITLE_MARGIN_HORIZONTAL\n : margins.right! + TITLE_MARGIN_HORIZONTAL;\n }\n if (props.xAxisAnnotation !== undefined && props.xAxisAnnotation !== '') {\n margins.top! = props.margins?.top ?? margins.top! + TITLE_MARGIN_VERTICAL;\n }\n if (\n props.yAxisAnnotation !== undefined &&\n props.yAxisAnnotation !== '' &&\n (props.secondaryYAxistitle === undefined || props.secondaryYAxistitle === '')\n ) {\n if (_useRtl) {\n margins.left! = props.margins?.right ?? margins.right! + TITLE_MARGIN_HORIZONTAL;\n } else {\n margins.right! = props.margins?.right ?? margins.right! + TITLE_MARGIN_HORIZONTAL;\n }\n }\n\n const classes = useCartesianChartStyles(props);\n const focusAttributes = useFocusableGroup();\n const arrowAttributes = useArrowNavigationGroup({ axis: 'horizontal' });\n // ComponentdidMount and Componentwillunmount logic\n React.useEffect(() => {\n _fitParentContainer();\n if (props !== null) {\n setPrevProps(props);\n }\n if (\n chartTypesWithStringYAxis.includes(props.chartType) &&\n props.showYAxisLables &&\n yAxisElement &&\n props.yAxisType === YAxisType.StringAxis\n ) {\n const maxYAxisLabelLength = calculateMaxYAxisLabelLength(classes.yAxis!);\n if (startFromX !== maxYAxisLabelLength) {\n setStartFromX(maxYAxisLabelLength);\n }\n } else if (startFromX !== 0) {\n setStartFromX(0);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n isIntegralDataset = !props.points.some((point: { y: number }) => point.y % 1 !== 0);\n return () => {\n cancelAnimationFrame(_reqID);\n };\n }, [props]);\n\n // ComponentDidUpdate logic\n React.useEffect(() => {\n if (prevProps) {\n if (prevProps.height !== props.height || prevProps.width !== props.width) {\n _fitParentContainer();\n }\n }\n if (\n chartTypesWithStringYAxis.includes(props.chartType) &&\n props.showYAxisLables &&\n yAxisElement &&\n props.yAxisType === YAxisType.StringAxis\n ) {\n const maxYAxisLabelLength = calculateMaxYAxisLabelLength(classes.yAxis!);\n if (startFromX !== maxYAxisLabelLength) {\n setStartFromX(maxYAxisLabelLength);\n }\n } else if (startFromX !== 0) {\n setStartFromX(0);\n }\n if (prevProps !== null && prevProps.points !== props.points) {\n // eslint-disable-next-line react-hooks/exhaustive-deps\n isIntegralDataset = !props.points.some((point: { y: number }) => point.y % 1 !== 0);\n }\n }, [props, prevProps]);\n\n React.useImperativeHandle(\n props.componentRef,\n () => ({\n chartContainer: chartContainer.current ?? null,\n }),\n [],\n );\n\n /**\n * Dedicated function to return the Callout JSX Element , which can further be used to only call this when\n * only the calloutprops and charthover props changes.\n * @param calloutProps\n * @param chartHoverProps\n * @returns\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function _generateCallout(calloutProps: any): JSXElement {\n return <ChartPopover {...calloutProps} />;\n }\n\n function calculateMaxYAxisLabelLength(className: string): number {\n const formatTickLabel = (str: string) => {\n if (props.showYAxisLablesTooltip) {\n return truncateString(str, props.noOfCharsToTruncate || 4);\n }\n\n return str;\n };\n return calculateLongestLabelWidth(\n props.stringDatasetForYAxisDomain!.map(label => formatTickLabel(label)),\n `.${className} text`,\n );\n }\n\n const {\n calloutProps,\n points,\n chartType,\n svgProps,\n culture,\n dateLocalizeOptions,\n timeFormatLocale,\n customDateTimeFormatter,\n } = props;\n if (props.parentRef) {\n _fitParentContainer();\n }\n const margin = { ...margins };\n // Note: This check is unnecessary since startFromX is only set for charts with string y-axis.\n if (chartTypesWithStringYAxis.includes(props.chartType)) {\n if (!_useRtl) {\n margin.left! += startFromX;\n } else {\n margin.right! += startFromX;\n }\n }\n // Callback for margins to the chart\n props.getmargins && props.getmargins(margin);\n\n let callout: JSXElement | null = null;\n\n let children = null;\n if ((props.enableFirstRenderOptimization && chartContainer.current) || !props.enableFirstRenderOptimization) {\n _isFirstRender.current = false;\n const XAxisParams = {\n domainNRangeValues: props.getDomainNRangeValues(\n points,\n props.getDomainMargins ? props.getDomainMargins(containerWidth) : margins,\n containerWidth,\n chartType,\n _useRtl,\n props.xAxisType,\n props.barwidth!,\n props.tickValues!,\n // This is only used for Horizontal Bar Chart with Axis for y as string axis\n startFromX,\n ),\n // FIXME: In XAxisParams, containerHeight is used by HBWA to generate vertical gridlines.\n // Since the x-axis in HBWA is numeric, it typically doesn't require transformation.\n // However, if transformation props are enabled, the updated _removalValueForTextTuncate\n // will only be available in the next render, as it's set after the axis is created.\n // Solution: Delay the creation of gridlines until after the transformation has been applied,\n // or precompute the required height for transformed labels (_removalValueForTextTuncate).\n containerHeight: containerHeight - _removalValueForTextTuncate,\n margins: margins,\n xAxisElement: xAxisElement.current!,\n showRoundOffXTickValues: props.showRoundOffXTickValues ?? true,\n xAxisCount: props.xAxisTickCount,\n xAxistickSize: props.xAxistickSize,\n tickPadding: props.tickPadding || props.showXAxisLablesTooltip ? 5 : 10,\n xAxisPadding: props.xAxisPadding,\n xAxisInnerPadding: props.xAxisInnerPadding,\n xAxisOuterPadding: props.xAxisOuterPadding,\n containerWidth: containerWidth,\n hideTickOverlap: props.rotateXAxisLables ? false : props.hideTickOverlap,\n calcMaxLabelWidth: _calcMaxLabelWidthWithTransform,\n };\n\n /**\n * These scales used for 2 purposes.\n * 1. To create x and y axis\n * 2. To draw the graph.\n * For area/line chart using same scales. For other charts, creating their own scales to draw the graph.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let xScale: any;\n let tickValues: (string | number)[];\n switch (props.xAxisType!) {\n case XAxisTypes.NumericAxis:\n ({ xScale, tickValues } = createNumericXAxis(XAxisParams, props.tickParams!, props.chartType, culture));\n break;\n case XAxisTypes.DateAxis:\n ({ xScale, tickValues } = createDateXAxis(\n XAxisParams,\n props.tickParams!,\n culture,\n dateLocalizeOptions,\n timeFormatLocale,\n customDateTimeFormatter,\n props.useUTC,\n props.chartType,\n ));\n break;\n case XAxisTypes.StringAxis:\n ({ xScale, tickValues } = createStringXAxis(\n XAxisParams,\n props.tickParams!,\n props.datasetForXAxisDomain!,\n culture,\n ));\n break;\n default:\n ({ xScale, tickValues } = createNumericXAxis(XAxisParams, props.tickParams!, props.chartType, culture));\n }\n _xScale = xScale;\n _tickValues = tickValues;\n\n _transformXAxisLabels();\n\n const YAxisParams = {\n margins: props.getYDomainMargins ? props.getYDomainMargins(containerHeight) : margins,\n containerWidth: containerWidth,\n containerHeight: containerHeight - _removalValueForTextTuncate,\n yAxisElement: yAxisElement.current!,\n yAxisTickFormat: props.yAxisTickFormat!,\n yAxisTickCount: props.yAxisTickCount!,\n yMinValue: props.yMinValue || 0,\n yMaxValue: props.yMaxValue || 0,\n tickPadding: 10,\n maxOfYVal: props.maxOfYVal,\n yMinMaxValues: props.getMinMaxOfYAxis(points, props.yAxisType),\n // please note these padding default values must be consistent in here\n // and the parent chart(HBWA/Vertical etc..) for more details refer example\n // http://using-d3js.com/04_07_ordinal_scales.html\n yAxisPadding: props.yAxisPadding || 0,\n };\n /**\n * These scales used for 2 purposes.\n * 1. To create x and y axis\n * 2. To draw the graph.\n * For area/line chart using same scales. For other charts, creating their own scales to draw the graph.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let yScalePrimary: any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let yScaleSecondary: any;\n const axisData: IAxisData = { yAxisDomainValues: [] };\n if (props.yAxisType && props.yAxisType === YAxisType.StringAxis) {\n yScalePrimary = props.createStringYAxis(\n YAxisParams,\n props.stringDatasetForYAxisDomain!,\n _useRtl,\n props.barwidth,\n props.chartType,\n );\n } else {\n // TODO: Since the scale domain values are now computed independently for both the primary and\n // secondary y-axes, the yMinValue and yMaxValue props are no longer necessary for accurately\n // rendering the secondary y-axis. Therefore, rather than checking the secondaryYScaleOptions\n // prop to determine whether to create a secondary y-axis, it's more appropriate to check if any\n // data points are assigned to use the secondary y-scale.\n if (props?.secondaryYScaleOptions) {\n const YAxisParamsSecondary = {\n margins: margins,\n containerWidth: containerWidth,\n containerHeight: containerHeight - _removalValueForTextTuncate!,\n yAxisElement: yAxisElementSecondary.current,\n yAxisTickFormat: props.yAxisTickFormat!,\n yAxisTickCount: props.yAxisTickCount!,\n yMinValue: props.secondaryYScaleOptions?.yMinValue || 0,\n yMaxValue: props.secondaryYScaleOptions?.yMaxValue ?? 100,\n tickPadding: 10,\n yMinMaxValues: props.getMinMaxOfYAxis(points, props.yAxisType, true),\n yAxisPadding: props.yAxisPadding,\n };\n\n yScaleSecondary = props.createYAxis(\n YAxisParamsSecondary,\n _useRtl,\n axisData,\n isIntegralDataset,\n chartType,\n true,\n props.roundedTicks!,\n );\n }\n yScalePrimary = props.createYAxis(\n YAxisParams,\n _useRtl,\n axisData,\n isIntegralDataset,\n chartType,\n false,\n props.roundedTicks!,\n );\n }\n\n if (chartTypesWithStringYAxis.includes(props.chartType) && props.yAxisType === YAxisType.StringAxis) {\n // Removing un wanted tooltip div from DOM, when prop not provided, for proper cleanup\n // of unwanted DOM elements, to prevent flacky behaviour in tooltips , that might occur\n // in creating tooltips when tooltips are enabled( as we try to recreate a tspan with _tooltipId)\n if (!props.showYAxisLablesTooltip) {\n try {\n document.getElementById(_tooltipId) && document.getElementById(_tooltipId)!.remove();\n //eslint-disable-next-line no-empty\n } catch (e) {}\n }\n // Used to display tooltip at y axis labels.\n if (props.showYAxisLablesTooltip) {\n // To create y axis tick values by if specified truncating the rest of the text\n // and showing elipsis or showing the whole string,\n yScalePrimary &&\n // Note: This function should be invoked within the showYAxisLablesTooltip check,\n // as its sole purpose is to truncate labels that exceed the noOfCharsToTruncate limit.\n createYAxisLabels(\n yAxisElement.current!,\n yScalePrimary,\n props.noOfCharsToTruncate || 4,\n props.showYAxisLablesTooltip || false,\n _useRtl,\n );\n const _yAxisElement = d3Select(yAxisElement.current!).call(yScalePrimary);\n try {\n document.getElementById(_tooltipId) && document.getElementById(_tooltipId)!.remove();\n //eslint-disable-next-line no-empty\n } catch (e) {}\n const ytooltipProps = {\n tooltipCls: classes.tooltip!,\n id: _tooltipId,\n axis: _yAxisElement,\n };\n _yAxisElement && tooltipOfAxislabels(ytooltipProps);\n }\n }\n\n // Call back to the chart.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const _getData = (xScale: any, yScalePrimary: any, yScaleSecondary: any) => {\n props.getGraphData &&\n props.getGraphData(\n xScale,\n yScalePrimary,\n containerHeight - _removalValueForTextTuncate!,\n containerWidth,\n xAxisElement.current,\n yAxisElement.current,\n yScaleSecondary,\n );\n };\n\n props.getAxisData && props.getAxisData(axisData);\n // Callback function for chart, returns axis\n _getData(xScale, yScalePrimary, yScaleSecondary);\n\n children = props.children({\n xScale,\n yScalePrimary,\n yScaleSecondary,\n containerHeight,\n containerWidth,\n });\n\n if (!props.hideTooltip && calloutProps!.isPopoverOpen) {\n callout = _generateCallout(calloutProps);\n }\n }\n const svgDimensions = {\n width: containerWidth,\n height: containerHeight,\n };\n\n const xAxisTitleMaximumAllowedWidth = svgDimensions.width - margins.left! - margins.right! - startFromX!;\n const yAxisTitleMaximumAllowedHeight =\n svgDimensions.height - margins.bottom! - margins.top! - _removalValueForTextTuncate! - titleMargin;\n /**\n * When screen resizes, along with screen, chart also auto adjusted.\n * This method used to adjust height and width of the charts.\n */\n function _fitParentContainer(): void {\n //_reqID = requestAnimationFrame(() => {\n let legendContainerHeight;\n if (props.hideLegend) {\n // If there is no legend, need not to allocate some space from total chart space.\n legendContainerHeight = 0;\n } else {\n const legendContainerComputedStyles = legendContainer && getComputedStyle(legendContainer);\n legendContainerHeight =\n ((legendContainer && legendContainer.getBoundingClientRect().height) || minLegendContainerHeight) +\n parseFloat((legendContainerComputedStyles && legendContainerComputedStyles.marginTop) || '0') +\n parseFloat((legendContainerComputedStyles && legendContainerComputedStyles.marginBottom) || '0');\n }\n if (props.parentRef || chartContainer.current) {\n const container = props.parentRef ? props.parentRef : chartContainer.current!;\n const currentContainerWidth =\n props.reflowProps?.mode === 'min-width' && !_isFirstRender.current\n ? Math.max(container.getBoundingClientRect().width, _calculateChartMinWidth())\n : container.getBoundingClientRect().width;\n const currentContainerHeight =\n container.getBoundingClientRect().height > legendContainerHeight\n ? container.getBoundingClientRect().height\n : 350;\n const shouldResize =\n containerWidth !== currentContainerWidth || containerHeight !== currentContainerHeight - legendContainerHeight;\n if (shouldResize) {\n setContainerWidth(currentContainerWidth);\n setContainerHeight(currentContainerHeight - legendContainerHeight);\n }\n }\n //});\n }\n\n function _onChartLeave(): void {\n props.onChartMouseLeave && props.onChartMouseLeave();\n }\n\n function _calculateChartMinWidth(): number {\n // Adding 10px for padding on both sides\n const labelWidth = _calcMaxLabelWidthWithTransform(_tickValues) + 10;\n\n let minChartWidth = margins.left! + margins.right! + labelWidth * (_tickValues.length - 1);\n\n if (\n [ChartTypes.GroupedVerticalBarChart, ChartTypes.VerticalBarChart, ChartTypes.VerticalStackedBarChart].includes(\n props.chartType,\n )\n ) {\n const minDomainMargin = 8;\n minChartWidth += minDomainMargin * 2;\n }\n\n return minChartWidth;\n }\n\n function _calcMaxLabelWidthWithTransform(x: (string | number)[]) {\n // Case: rotated labels\n if (!props.wrapXAxisLables && props.rotateXAxisLables && props.xAxisType! === XAxisTypes.StringAxis) {\n const longestLabelWidth = calculateLongestLabelWidth(x, `.${classes.xAxis} text`);\n return Math.ceil(longestLabelWidth * Math.cos(Math.PI / 4));\n }\n\n // Case: truncated labels\n if (props.showXAxisLablesTooltip) {\n const tickValues = x.map(val => {\n const numChars = props.noOfCharsToTruncate || 4;\n return val.toString().length > numChars ? `${val.toString().slice(0, numChars)}...` : val;\n });\n\n const longestLabelWidth = calculateLongestLabelWidth(tickValues, `.${classes.xAxis} text`);\n return Math.ceil(longestLabelWidth);\n }\n\n // Case: wrapped labels\n if (props.wrapXAxisLables) {\n // FIXME: Calculate the max width of lines instead of words. This requires applying\n // the wrapping transformation earlier to obtain the actual rendered lines.\n const words: string[] = [];\n x.forEach((val: string) => {\n words.push(...val.toString().split(/\\s+/));\n });\n\n // This approach works well in most cases, since overflow typically occurs only when\n // a single word exceeds the specified width — otherwise, the text will wrap as expected.\n const longestLabelWidth = calculateLongestLabelWidth(words, `.${classes.xAxis} text`);\n return Math.max(Math.ceil(longestLabelWidth), DEFAULT_WRAP_WIDTH);\n }\n\n // Default case\n const longestLabelWidth = calculateLongestLabelWidth(x, `.${classes.xAxis} text`);\n return Math.ceil(longestLabelWidth);\n }\n\n function _transformXAxisLabels() {\n _removalValueForTextTuncate = 0;\n\n /*\n * To enable wrapping of x axis tick values or to display complete x axis tick values,\n * we need to calculate how much space it needed to render the text.\n * No need to re-calculate every time the chart renders and same time need to get an update. So using setState.\n * Required space will be calculated first time chart rendering and if any width/height of chart updated.\n * */\n if (props.wrapXAxisLables || props.showXAxisLablesTooltip) {\n let maxXAxisLabelWidth: number | undefined;\n if (props.xAxisType === XAxisTypes.StringAxis) {\n if ((props.datasetForXAxisDomain?.length || 0) > 1) {\n maxXAxisLabelWidth = _xScale.step();\n } else {\n maxXAxisLabelWidth = containerWidth;\n }\n }\n\n const wrapLabelProps = {\n node: xAxisElement.current!,\n xAxis: _xScale,\n showXAxisLablesTooltip: props.showXAxisLablesTooltip || false,\n noOfCharsToTruncate: props.noOfCharsToTruncate || 4,\n width: maxXAxisLabelWidth,\n };\n _removalValueForTextTuncate = createWrapOfXLabels(wrapLabelProps) ?? 0;\n }\n\n if (!props.wrapXAxisLables && props.rotateXAxisLables && props.xAxisType! === XAxisTypes.StringAxis) {\n const rotateLabelProps = {\n node: xAxisElement.current!,\n xAxis: _xScale,\n };\n const rotatedHeight = rotateXAxisLabels(rotateLabelProps) ?? 0;\n // margins.bottom is used as padding here\n _removalValueForTextTuncate = rotatedHeight + margins.bottom!;\n }\n }\n\n /**\n * We have use the {@link defaultTabbableElement } to fix\n * the Focus not landing on chart while tabbing, instead goes to legend.\n * This issue is observed in Area, line chart after performance optimization done in the PR {@link https://github.com/microsoft/fluentui/pull/27721 }\n * This issue is observed in Bar charts after the changes done by FocusZone team in the PR: {@link https://github.com/microsoft/fluentui/pull/24175 }\n * The issue in Bar Charts(VB and VSB) is due to a {@link FocusZone } update where previously an event listener was\n * attached on keydown to the window, so that whenever the tab key is pressed all outer FocusZone's\n * tab-indexes are updated (an outer FocusZone is a FocusZone that is not within another one).\n * But now after the above PR : they are attaching the\n * listeners to the FocusZone elements instead of the window. So in the first render cycle in Bar charts\n * bars are not created as in the first render cycle the size of the chart container is not known( or is 0)\n * which creates bars of height 0 so instead we do not create any bars and instead return empty fragments.\n *\n * We have tried 2 Approaches to fix the issue:\n * 1. Using the {@link elementRef} property of FocusZone where we dispatch event for tab keydown\n * after the second render cycle which triggers an update of the tab index in FocusZone.\n * But this is a hacky solution and not a proper fix and also elementRef is deprecated.\n * 2. Using the default tabbable element to fix the issue.\n */\n\n return (\n <div\n id={idForGraph}\n className={classes.root}\n role={'presentation'}\n ref={(rootElem: HTMLDivElement) => (chartContainer.current = rootElem)}\n onMouseLeave={_onChartLeave}\n >\n <div className={classes.chartWrapper} {...focusAttributes} {...arrowAttributes}>\n {_isFirstRender.current}\n <svg\n width={svgDimensions.width}\n height={svgDimensions.height}\n aria-label={props.chartTitle}\n style={{ display: 'block' }}\n className={classes.chart}\n {...getSecureProps(svgProps)}\n >\n <g\n ref={(e: SVGSVGElement | null) => {\n xAxisElement.current = e!;\n }}\n id={`xAxisGElement${idForGraph}`}\n // To add wrap of x axis lables feature, need to remove word height from svg height.\n transform={`translate(0, ${svgDimensions.height - margins.bottom! - _removalValueForTextTuncate!})`}\n className={classes.xAxis}\n />\n {props.xAxisTitle !== undefined && props.xAxisTitle !== '' && (\n <SVGTooltipText\n content={props.xAxisTitle}\n textProps={{\n x: margins.left! + startFromX + xAxisTitleMaximumAllowedWidth / 2,\n y: svgDimensions.height - titleMargin,\n className: classes.axisTitle!,\n textAnchor: 'middle',\n }}\n maxWidth={xAxisTitleMaximumAllowedWidth}\n wrapContent={wrapContent}\n showBackground={true}\n className={classes.svgTooltip}\n />\n )}\n {props.xAxisAnnotation !== undefined && props.xAxisAnnotation !== '' && (\n <SVGTooltipText\n content={props.xAxisAnnotation}\n textProps={{\n x: margins.left! + startFromX + xAxisTitleMaximumAllowedWidth / 2,\n y: titleMargin + 3,\n className: classes.axisAnnotation!,\n textAnchor: 'middle',\n 'aria-hidden': true,\n }}\n maxWidth={xAxisTitleMaximumAllowedWidth}\n wrapContent={wrapContent}\n showBackground={true}\n className={classes.svgTooltip}\n />\n )}\n <g\n ref={(e: SVGSVGElement | null) => {\n yAxisElement.current = e!;\n }}\n id={`yAxisGElement${idForGraph}`}\n transform={`translate(${\n _useRtl ? svgDimensions.width - margins.right! - startFromX : margins.left! + startFromX\n }, 0)`}\n className={classes.yAxis}\n />\n {props.secondaryYScaleOptions && (\n <g>\n <g\n ref={(e: SVGSVGElement | null) => {\n yAxisElementSecondary.current = e!;\n }}\n id={`yAxisGElementSecondary${idForGraph}`}\n transform={`translate(${\n _useRtl ? margins.left! + startFromX : svgDimensions.width - margins.right! - startFromX\n }, 0)`}\n className={classes.yAxis}\n />\n {props.secondaryYAxistitle !== undefined && props.secondaryYAxistitle !== '' && (\n <SVGTooltipText\n content={props.secondaryYAxistitle}\n textProps={{\n x: (yAxisTitleMaximumAllowedHeight - margins.bottom!) / 2 + _removalValueForTextTuncate!,\n y: _useRtl ? startFromX - titleMargin : svgDimensions.width - margins.right!,\n textAnchor: 'middle',\n transform: `translate(${\n _useRtl ? margins.right! / 2 - titleMargin : margins.right! / 2 + titleMargin\n },\n ${svgDimensions.height - margins.bottom! - margins.top! - titleMargin})rotate(-90)`,\n className: classes.axisTitle!,\n }}\n maxWidth={yAxisTitleMaximumAllowedHeight}\n wrapContent={wrapContent}\n showBackground={true}\n className={classes.svgTooltip}\n />\n )}\n </g>\n )}\n {children}\n {props.yAxisTitle !== undefined && props.yAxisTitle !== '' && (\n <SVGTooltipText\n content={props.yAxisTitle}\n textProps={{\n x: (yAxisTitleMaximumAllowedHeight - margins.bottom!) / 2 + _removalValueForTextTuncate!,\n y: _useRtl ? svgDimensions.width - margins.right! / 2 + titleMargin : margins.left! / 2 - titleMargin,\n textAnchor: 'middle',\n transform: `translate(0,\n ${svgDimensions.height - margins.bottom! - margins.top! - titleMargin})rotate(-90)`,\n className: classes.axisTitle!,\n }}\n maxWidth={yAxisTitleMaximumAllowedHeight}\n wrapContent={wrapContent}\n showBackground={true}\n className={classes.svgTooltip}\n />\n )}\n {props.yAxisAnnotation !== undefined &&\n props.yAxisAnnotation !== '' &&\n (props.secondaryYAxistitle === undefined || props.secondaryYAxistitle === '') && (\n <SVGTooltipText\n content={props.yAxisAnnotation}\n textProps={{\n x: (yAxisTitleMaximumAllowedHeight - margins.bottom!) / 2 + _removalValueForTextTuncate!,\n y: _useRtl ? startFromX - titleMargin : svgDimensions.width - margins.right!,\n textAnchor: 'middle',\n transform: `translate(${\n _useRtl ? margins.right! / 2 - titleMargin : margins.right! / 2 + titleMargin\n },\n ${svgDimensions.height - margins.bottom! - margins.top! - titleMargin})rotate(-90)`,\n className: classes.axisAnnotation!,\n 'aria-hidden': true,\n }}\n maxWidth={yAxisTitleMaximumAllowedHeight}\n wrapContent={wrapContent}\n showBackground={true}\n className={classes.svgTooltip}\n />\n )}\n </svg>\n </div>\n\n {!props.hideLegend && (\n <div ref={(e: HTMLDivElement) => (legendContainer = e)} className={classes.legendContainer}>\n {props.legendBars}\n </div>\n )}\n {/** The callout is used for narration, so keep it mounted on the DOM */}\n {callout && <React.Suspense fallback={<div>Loading...</div>}>{callout}</React.Suspense>}\n </div>\n );\n});\nCartesianChart.displayName = 'CartesianChart';\nCartesianChart.defaultProps = {\n hideTickOverlap: true,\n};\n"],"names":["React","useCartesianChartStyles","select","d3Select","createNumericXAxis","createStringXAxis","createDateXAxis","XAxisTypes","YAxisType","createWrapOfXLabels","rotateXAxisLabels","calculateLongestLabelWidth","createYAxisLabels","ChartTypes","wrapContent","useRtl","truncateString","tooltipOfAxislabels","getSecureProps","DEFAULT_WRAP_WIDTH","useId","SVGTooltipText","ChartPopover","useFocusableGroup","useArrowNavigationGroup","CartesianChart","forwardRef","props","forwardedRef","chartContainer","useRef","legendContainer","minLegendContainerHeight","xAxisElement","yAxisElement","yAxisElementSecondary","margins","idForGraph","_reqID","_useRtl","_tickValues","titleMargin","_isFirstRender","_xScale","isIntegralDataset","_tooltipId","_removalValueForTextTuncate","containerWidth","setContainerWidth","useState","containerHeight","setContainerHeight","startFromX","setStartFromX","prevProps","setPrevProps","chartTypesWithStringYAxis","HorizontalBarChartWithAxis","HeatMapChart","VerticalStackedBarChart","GanttChart","top","bottom","right","left","secondaryYScaleOptions","TITLE_MARGIN_HORIZONTAL","TITLE_MARGIN_VERTICAL","xAxisTitle","undefined","yAxisTitle","secondaryYAxistitle","xAxisAnnotation","yAxisAnnotation","classes","focusAttributes","arrowAttributes","axis","useEffect","_fitParentContainer","includes","chartType","showYAxisLables","yAxisType","StringAxis","maxYAxisLabelLength","calculateMaxYAxisLabelLength","yAxis","points","some","point","y","cancelAnimationFrame","height","width","useImperativeHandle","componentRef","current","_generateCallout","calloutProps","className","formatTickLabel","str","showYAxisLablesTooltip","noOfCharsToTruncate","stringDatasetForYAxisDomain","map","label","svgProps","culture","dateLocalizeOptions","timeFormatLocale","customDateTimeFormatter","parentRef","margin","getmargins","callout","children","enableFirstRenderOptimization","XAxisParams","domainNRangeValues","getDomainNRangeValues","getDomainMargins","xAxisType","barwidth","tickValues","showRoundOffXTickValues","xAxisCount","xAxisTickCount","xAxistickSize","tickPadding","showXAxisLablesTooltip","xAxisPadding","xAxisInnerPadding","xAxisOuterPadding","hideTickOverlap","rotateXAxisLables","calcMaxLabelWidth","_calcMaxLabelWidthWithTransform","xScale","NumericAxis","tickParams","DateAxis","useUTC","datasetForXAxisDomain","_transformXAxisLabels","YAxisParams","getYDomainMargins","yAxisTickFormat","yAxisTickCount","yMinValue","yMaxValue","maxOfYVal","yMinMaxValues","getMinMaxOfYAxis","yAxisPadding","yScalePrimary","yScaleSecondary","axisData","yAxisDomainValues","createStringYAxis","YAxisParamsSecondary","createYAxis","roundedTicks","document","getElementById","remove","e","_yAxisElement","call","ytooltipProps","tooltipCls","tooltip","id","_getData","getGraphData","getAxisData","hideTooltip","isPopoverOpen","svgDimensions","xAxisTitleMaximumAllowedWidth","yAxisTitleMaximumAllowedHeight","legendContainerHeight","hideLegend","legendContainerComputedStyles","getComputedStyle","getBoundingClientRect","parseFloat","marginTop","marginBottom","container","currentContainerWidth","reflowProps","mode","Math","max","_calculateChartMinWidth","currentContainerHeight","shouldResize","_onChartLeave","onChartMouseLeave","labelWidth","minChartWidth","length","GroupedVerticalBarChart","VerticalBarChart","minDomainMargin","x","wrapXAxisLables","longestLabelWidth","xAxis","ceil","cos","PI","val","numChars","toString","slice","words","forEach","push","split","maxXAxisLabelWidth","step","wrapLabelProps","node","rotateLabelProps","rotatedHeight","div","root","role","ref","rootElem","onMouseLeave","chartWrapper","svg","aria-label","chartTitle","style","display","chart","g","transform","content","textProps","axisTitle","textAnchor","maxWidth","showBackground","svgTooltip","axisAnnotation","legendBars","Suspense","fallback","displayName","defaultProps"],"mappings":"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"}
|
|
@@ -165,10 +165,10 @@ const DeclarativeChart = /*#__PURE__*/ _react.forwardRef((props, forwardedRef)=>
|
|
|
165
165
|
...plotlyInput,
|
|
166
166
|
data: chart.validTracesInfo.map((trace)=>plotlyInput.data[trace.index])
|
|
167
167
|
};
|
|
168
|
-
const validTracesFilteredIndex = chart.validTracesInfo.map((trace, index)=>
|
|
168
|
+
const validTracesFilteredIndex = chart.validTracesInfo.map((trace, index)=>({
|
|
169
169
|
index,
|
|
170
|
-
trace.type
|
|
171
|
-
|
|
170
|
+
type: trace.type
|
|
171
|
+
}));
|
|
172
172
|
let { selectedLegends } = plotlySchema;
|
|
173
173
|
const colorMap = useColorMapping();
|
|
174
174
|
const isDarkTheme = useIsDarkTheme();
|
|
@@ -240,23 +240,39 @@ const DeclarativeChart = /*#__PURE__*/ _react.forwardRef((props, forwardedRef)=>
|
|
|
240
240
|
const cartesianProjection = (0, _PlotlySchemaAdapter.projectPolarToCartesian)(plotlyInputWithValidData);
|
|
241
241
|
plotlyInputWithValidData.data = cartesianProjection.data;
|
|
242
242
|
validTracesFilteredIndex.forEach((trace, index)=>{
|
|
243
|
-
if (trace
|
|
244
|
-
validTracesFilteredIndex[index]
|
|
243
|
+
if (trace.type === 'scatterpolar') {
|
|
244
|
+
validTracesFilteredIndex[index].type = 'line'; // Change type to line for rendering
|
|
245
245
|
}
|
|
246
246
|
});
|
|
247
247
|
}
|
|
248
248
|
const groupedTraces = {};
|
|
249
|
+
let nonCartesianTraceCount = 0;
|
|
249
250
|
plotlyInputWithValidData.data.forEach((trace, index)=>{
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
251
|
+
let traceKey = '';
|
|
252
|
+
if ((0, _PlotlySchemaAdapter.isNonPlotType)(chart.validTracesInfo[index].type)) {
|
|
253
|
+
traceKey = `${_PlotlySchemaAdapter.NON_PLOT_KEY_PREFIX}${nonCartesianTraceCount + 1}`;
|
|
254
|
+
nonCartesianTraceCount++;
|
|
255
|
+
} else {
|
|
256
|
+
var _trace_xaxis;
|
|
257
|
+
traceKey = (_trace_xaxis = trace.xaxis) !== null && _trace_xaxis !== void 0 ? _trace_xaxis : DEFAULT_XAXIS;
|
|
258
|
+
}
|
|
259
|
+
if (!groupedTraces[traceKey]) {
|
|
260
|
+
groupedTraces[traceKey] = [];
|
|
254
261
|
}
|
|
255
|
-
groupedTraces[
|
|
262
|
+
groupedTraces[traceKey].push(index);
|
|
256
263
|
});
|
|
257
264
|
isMultiPlot.current = Object.keys(groupedTraces).length > 1;
|
|
258
|
-
const gridProperties = (0, _PlotlySchemaAdapter.getGridProperties)(plotlyInputWithValidData
|
|
259
|
-
|
|
265
|
+
const gridProperties = (0, _PlotlySchemaAdapter.getGridProperties)(plotlyInputWithValidData, isMultiPlot.current, chart.validTracesInfo);
|
|
266
|
+
// Render only one plot if the grid properties cannot determine positioning of multiple plots.
|
|
267
|
+
if (isMultiPlot.current && gridProperties.templateRows === _PlotlySchemaAdapter.SINGLE_REPEAT && gridProperties.templateColumns === _PlotlySchemaAdapter.SINGLE_REPEAT) {
|
|
268
|
+
Object.keys(groupedTraces).forEach((key, index)=>{
|
|
269
|
+
if (index > 0) {
|
|
270
|
+
delete groupedTraces[key];
|
|
271
|
+
}
|
|
272
|
+
});
|
|
273
|
+
isMultiPlot.current = false;
|
|
274
|
+
}
|
|
275
|
+
const allupLegendsProps = (0, _PlotlySchemaAdapter.getAllupLegendsProps)(plotlyInputWithValidData, colorMap, props.colorwayType, chart.validTracesInfo, isDarkTheme);
|
|
260
276
|
// map through the grouped traces and render the appropriate chart
|
|
261
277
|
return /*#__PURE__*/ _react.createElement(_react.Fragment, null, /*#__PURE__*/ _react.createElement("div", {
|
|
262
278
|
style: {
|
|
@@ -269,9 +285,9 @@ const DeclarativeChart = /*#__PURE__*/ _react.forwardRef((props, forwardedRef)=>
|
|
|
269
285
|
...plotlyInputWithValidData,
|
|
270
286
|
data: index.map((idx)=>plotlyInputWithValidData.data[idx])
|
|
271
287
|
};
|
|
272
|
-
const filteredTracesInfo = validTracesFilteredIndex.filter((trace)=>index.includes(trace
|
|
273
|
-
let chartType = validTracesFilteredIndex.some((trace)=>trace
|
|
274
|
-
if (validTracesFilteredIndex.some((trace)=>trace
|
|
288
|
+
const filteredTracesInfo = validTracesFilteredIndex.filter((trace)=>index.includes(trace.index));
|
|
289
|
+
let chartType = validTracesFilteredIndex.some((trace)=>trace.type === FALLBACK_TYPE) || chart.type === FALLBACK_TYPE ? FALLBACK_TYPE : filteredTracesInfo[0].type;
|
|
290
|
+
if (validTracesFilteredIndex.some((trace)=>trace.type === 'line') && validTracesFilteredIndex.some((trace)=>trace.type === 'scatter')) {
|
|
275
291
|
chartType = 'line';
|
|
276
292
|
}
|
|
277
293
|
const chartEntry = chartMap[chartType];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/DeclarativeChart/DeclarativeChart.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\nimport * as React from 'react';\nimport type { PlotData, PlotlySchema, OutputChartType } from '@fluentui/chart-utilities';\nimport {\n decodeBase64Fields,\n isArrayOrTypedArray,\n isMonthArray,\n mapFluentChart,\n sanitizeJson,\n} from '@fluentui/chart-utilities';\nimport type { GridProperties } from './PlotlySchemaAdapter';\nimport { tokens } from '@fluentui/react-theme';\nimport { ThemeContext_unstable as V9ThemeContext } from '@fluentui/react-shared-contexts';\nimport { Theme, webLightTheme } from '@fluentui/tokens';\nimport * as d3Color from 'd3-color';\n\nimport {\n correctYearMonth,\n getGridProperties,\n transformPlotlyJsonToDonutProps,\n transformPlotlyJsonToVSBCProps,\n transformPlotlyJsonToAreaChartProps,\n transformPlotlyJsonToLineChartProps,\n transformPlotlyJsonToHorizontalBarWithAxisProps,\n transformPlotlyJsonToHeatmapProps,\n transformPlotlyJsonToSankeyProps,\n transformPlotlyJsonToGaugeProps,\n transformPlotlyJsonToGVBCProps,\n transformPlotlyJsonToVBCProps,\n transformPlotlyJsonToChartTableProps,\n transformPlotlyJsonToScatterChartProps,\n projectPolarToCartesian,\n getAllupLegendsProps,\n} from './PlotlySchemaAdapter';\nimport type { ColorwayType } from './PlotlyColorAdapter';\nimport { DonutChart } from '../DonutChart/index';\nimport { VerticalStackedBarChart } from '../VerticalStackedBarChart/index';\nimport { LineChart } from '../LineChart/index';\nimport { HorizontalBarChartWithAxis } from '../HorizontalBarChartWithAxis/index';\nimport { AreaChart } from '../AreaChart/index';\nimport { HeatMapChart } from '../HeatMapChart/index';\nimport { SankeyChart } from '../SankeyChart/SankeyChart';\nimport { GaugeChart } from '../GaugeChart/index';\nimport { GroupedVerticalBarChart } from '../GroupedVerticalBarChart/index';\nimport { VerticalBarChart } from '../VerticalBarChart/index';\nimport { Chart, ImageExportOptions } from '../../types/index';\nimport { ScatterChart } from '../ScatterChart/index';\n\nimport { withResponsiveContainer } from '../ResponsiveContainer/withResponsiveContainer';\nimport { ChartTable } from '../ChartTable/index';\nimport { LegendsProps, Legends } from '../Legends/index';\nimport { JSXElement } from '@fluentui/react-utilities/src/index';\n\nconst ResponsiveDonutChart = withResponsiveContainer(DonutChart);\nconst ResponsiveVerticalStackedBarChart = withResponsiveContainer(VerticalStackedBarChart);\nconst ResponsiveLineChart = withResponsiveContainer(LineChart);\nconst ResponsiveHorizontalBarChartWithAxis = withResponsiveContainer(HorizontalBarChartWithAxis);\nconst ResponsiveAreaChart = withResponsiveContainer(AreaChart);\nconst ResponsiveHeatMapChart = withResponsiveContainer(HeatMapChart);\nconst ResponsiveSankeyChart = withResponsiveContainer(SankeyChart);\nconst ResponsiveGaugeChart = withResponsiveContainer(GaugeChart);\nconst ResponsiveGroupedVerticalBarChart = withResponsiveContainer(GroupedVerticalBarChart);\nconst ResponsiveVerticalBarChart = withResponsiveContainer(VerticalBarChart);\nconst ResponsiveScatterChart = withResponsiveContainer(ScatterChart);\nconst ResponsiveChartTable = withResponsiveContainer(ChartTable);\n\n// Default x-axis key for grouping traces. Also applicable for PieData and SankeyData where x-axis is not defined.\nconst DEFAULT_XAXIS = 'x';\nconst FALLBACK_TYPE = 'fallback';\n\n/**\n * DeclarativeChart schema.\n * {@docCategory DeclarativeChart}\n */\nexport interface Schema {\n /**\n * Plotly schema represented as JSON object\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n plotlySchema: any;\n}\n\n/**\n * DeclarativeChart props.\n * {@docCategory DeclarativeChart}\n */\nexport interface DeclarativeChartProps extends React.RefAttributes<HTMLDivElement> {\n /**\n * The schema representing the chart data, layout and configuration\n */\n chartSchema: Schema;\n\n /**\n * Callback when an event occurs\n */\n onSchemaChange?: (eventData: Schema) => void;\n\n /**\n * Optional callback to access the IDeclarativeChart interface. Use this instead of ref for accessing\n * the public methods and properties of the component.\n */\n componentRef?: React.RefObject<IDeclarativeChart>;\n\n /**\n * Optional prop to specify the colorway type of the chart.\n * - 'default': Use Fluent UI color palette aligning with plotly colorway.\n * - 'builtin': Use Fluent UI colorway.\n * - 'others': Reserved for future colorways.\n * @default 'default'\n */\n colorwayType?: ColorwayType;\n}\n\n/**\n * {@docCategory DeclarativeChart}\n */\nexport interface IDeclarativeChart {\n exportAsImage: (opts?: ImageExportOptions) => Promise<string>;\n}\n\nconst useColorMapping = () => {\n const colorMap = React.useRef(new Map<string, string>());\n return colorMap;\n};\n\nfunction renderChart<TProps>(\n Renderer: React.ComponentType<TProps>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n transformer: (...args: any[]) => TProps,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n transformerArgs: any[],\n commonProps: Partial<TProps>,\n cellRow: number,\n cellColumn: number,\n): JSXElement {\n const chartProps = transformer(...transformerArgs);\n return (\n <div\n key={`${cellRow}_${cellColumn}`}\n style={{\n gridRowStart: cellRow,\n gridRowEnd: cellRow + 1,\n gridColumnStart: cellColumn,\n gridColumnEnd: cellColumn + 1,\n }}\n >\n <Renderer {...chartProps} {...commonProps} />\n </div>\n );\n}\n\ntype PreTransformHooks = {\n preTransformCondition?: (plotlySchema: PlotlySchema) => boolean;\n preTransformOperation?: (plotlySchema: PlotlySchema) => PlotlySchema;\n};\n\nconst LineAreaPreTransformOp = (plotlyInput: PlotlySchema) => {\n const xValues = (plotlyInput.data[0] as PlotData).x;\n const isXMonth = isMonthArray(xValues);\n let renderData = plotlyInput.data;\n if (isXMonth) {\n renderData = plotlyInput.data.map((dataPoint: PlotData) => ({\n ...dataPoint,\n x: correctYearMonth(dataPoint.x),\n }));\n }\n return { data: renderData, layout: plotlyInput.layout };\n};\n\ntype ChartTypeMap = {\n donut: {\n transformer: typeof transformPlotlyJsonToDonutProps;\n renderer: typeof ResponsiveDonutChart;\n } & PreTransformHooks;\n sankey: {\n transformer: typeof transformPlotlyJsonToSankeyProps;\n renderer: typeof ResponsiveSankeyChart;\n } & PreTransformHooks;\n table: {\n transformer: typeof transformPlotlyJsonToChartTableProps;\n renderer: typeof ResponsiveChartTable;\n } & PreTransformHooks;\n horizontalbar: {\n transformer: typeof transformPlotlyJsonToHorizontalBarWithAxisProps;\n renderer: typeof ResponsiveHorizontalBarChartWithAxis;\n } & PreTransformHooks;\n groupedverticalbar: {\n transformer: typeof transformPlotlyJsonToGVBCProps;\n renderer: typeof ResponsiveGroupedVerticalBarChart;\n } & PreTransformHooks;\n verticalstackedbar: {\n transformer: typeof transformPlotlyJsonToVSBCProps;\n renderer: typeof ResponsiveVerticalStackedBarChart;\n } & PreTransformHooks;\n heatmap: {\n transformer: typeof transformPlotlyJsonToHeatmapProps;\n renderer: typeof ResponsiveHeatMapChart;\n } & PreTransformHooks;\n gauge: {\n transformer: typeof transformPlotlyJsonToGaugeProps;\n renderer: typeof ResponsiveGaugeChart;\n } & PreTransformHooks;\n verticalbar: {\n transformer: typeof transformPlotlyJsonToVBCProps;\n renderer: typeof ResponsiveVerticalBarChart;\n } & PreTransformHooks;\n area: {\n transformer: typeof transformPlotlyJsonToAreaChartProps;\n renderer: typeof ResponsiveAreaChart;\n } & PreTransformHooks;\n line: {\n transformer: typeof transformPlotlyJsonToLineChartProps;\n renderer: typeof ResponsiveLineChart;\n } & PreTransformHooks;\n scatter: {\n transformer: typeof transformPlotlyJsonToScatterChartProps;\n renderer: typeof ResponsiveScatterChart;\n } & PreTransformHooks;\n fallback: {\n transformer: typeof transformPlotlyJsonToVSBCProps;\n renderer: typeof ResponsiveVerticalStackedBarChart;\n } & PreTransformHooks;\n};\n\nconst chartMap: ChartTypeMap = {\n // PieData category charts\n donut: {\n transformer: transformPlotlyJsonToDonutProps,\n renderer: ResponsiveDonutChart,\n },\n // SankeyData category charts\n sankey: {\n transformer: transformPlotlyJsonToSankeyProps,\n renderer: ResponsiveSankeyChart,\n },\n // TableData category charts\n table: {\n transformer: transformPlotlyJsonToChartTableProps,\n renderer: ResponsiveChartTable,\n },\n // PlotData category charts\n horizontalbar: {\n transformer: transformPlotlyJsonToHorizontalBarWithAxisProps,\n renderer: ResponsiveHorizontalBarChartWithAxis,\n },\n groupedverticalbar: {\n transformer: transformPlotlyJsonToGVBCProps,\n renderer: ResponsiveGroupedVerticalBarChart,\n },\n verticalstackedbar: {\n transformer: transformPlotlyJsonToVSBCProps,\n renderer: ResponsiveVerticalStackedBarChart,\n },\n heatmap: {\n transformer: transformPlotlyJsonToHeatmapProps,\n renderer: ResponsiveHeatMapChart,\n },\n gauge: {\n transformer: transformPlotlyJsonToGaugeProps,\n renderer: ResponsiveGaugeChart,\n },\n verticalbar: {\n transformer: transformPlotlyJsonToVBCProps,\n renderer: ResponsiveVerticalBarChart,\n },\n area: {\n transformer: transformPlotlyJsonToAreaChartProps,\n renderer: ResponsiveAreaChart,\n preTransformOperation: LineAreaPreTransformOp,\n },\n line: {\n transformer: transformPlotlyJsonToLineChartProps,\n renderer: ResponsiveLineChart,\n preTransformOperation: LineAreaPreTransformOp,\n },\n scatter: {\n transformer: transformPlotlyJsonToScatterChartProps,\n renderer: ResponsiveScatterChart,\n preTransformOperation: LineAreaPreTransformOp,\n },\n fallback: {\n transformer: transformPlotlyJsonToVSBCProps,\n renderer: ResponsiveVerticalStackedBarChart,\n },\n};\n\nconst useIsDarkTheme = (): boolean => {\n const parentV9Theme = React.useContext(V9ThemeContext) as Theme;\n const v9Theme: Theme = parentV9Theme ? parentV9Theme : webLightTheme;\n\n // Get background and foreground colors\n const backgroundColor = d3Color.hsl(v9Theme.colorNeutralBackground1);\n const foregroundColor = d3Color.hsl(v9Theme.colorNeutralForeground1);\n\n const isDarkTheme = backgroundColor.l < foregroundColor.l;\n\n return isDarkTheme;\n};\n\n/**\n * DeclarativeChart component.\n * {@docCategory DeclarativeChart}\n */\nexport const DeclarativeChart: React.FunctionComponent<DeclarativeChartProps> = React.forwardRef<\n HTMLDivElement,\n DeclarativeChartProps\n>((props, forwardedRef) => {\n const { plotlySchema } = sanitizeJson(props.chartSchema);\n const chart: OutputChartType = mapFluentChart(plotlySchema);\n if (!chart.isValid) {\n throw new Error(`Invalid chart schema: ${chart.errorMessage}`);\n }\n let plotlyInput = plotlySchema as PlotlySchema;\n try {\n plotlyInput = decodeBase64Fields(plotlyInput);\n } catch (error) {\n throw new Error(`Failed to decode plotly schema: ${error}`);\n }\n const plotlyInputWithValidData: PlotlySchema = {\n ...plotlyInput,\n data: chart.validTracesInfo!.map(trace => plotlyInput.data[trace.index]),\n };\n\n const validTracesFilteredIndex: [number, string][] = chart.validTracesInfo!.map((trace, index) => [\n index,\n trace.type,\n ]);\n\n let { selectedLegends } = plotlySchema;\n const colorMap = useColorMapping();\n const isDarkTheme = useIsDarkTheme();\n const chartRef = React.useRef<Chart>(null);\n const isMultiPlot = React.useRef(false);\n\n if (!isArrayOrTypedArray(selectedLegends)) {\n selectedLegends = [];\n }\n\n const [activeLegends, setActiveLegends] = React.useState<string[]>(selectedLegends);\n const onActiveLegendsChange = (keys: string[]) => {\n setActiveLegends(keys);\n if (props.onSchemaChange) {\n props.onSchemaChange({ plotlySchema: { plotlyInput, selectedLegends: keys } });\n }\n };\n\n React.useEffect(() => {\n // eslint-disable-next-line @typescript-eslint/no-shadow\n const { plotlySchema } = sanitizeJson(props.chartSchema);\n // eslint-disable-next-line @typescript-eslint/no-shadow\n const { selectedLegends } = plotlySchema;\n setActiveLegends(selectedLegends ?? []);\n }, [props.chartSchema]);\n\n const multiSelectLegendProps = {\n canSelectMultipleLegends: true,\n onChange: onActiveLegendsChange,\n selectedLegends: activeLegends,\n };\n\n const commonProps = {\n legendProps: multiSelectLegendProps,\n componentRef: chartRef,\n };\n\n function createLegends(legendProps: LegendsProps): JSXElement {\n // eslint-disable-next-line react/jsx-no-bind\n return <Legends {...legendProps} selectedLegends={activeLegends} onChange={onActiveLegendsChange} />;\n }\n\n // TODO\n const exportAsImage = React.useCallback((opts?: ImageExportOptions): Promise<string> => {\n return new Promise((resolve, reject) => {\n if (isMultiPlot.current) {\n return reject(Error('Exporting multi plot charts as image is not supported'));\n }\n if (!chartRef.current || typeof chartRef.current.toImage !== 'function') {\n return reject(Error('Chart cannot be exported as image'));\n }\n\n chartRef.current\n .toImage({\n background: tokens.colorNeutralBackground1,\n scale: 5,\n ...opts,\n })\n .then(resolve)\n .catch(reject);\n });\n }, []);\n\n React.useImperativeHandle(\n props.componentRef,\n () => ({\n exportAsImage,\n }),\n [exportAsImage],\n );\n\n if (chart.type === 'scatterpolar') {\n const cartesianProjection = projectPolarToCartesian(plotlyInputWithValidData);\n plotlyInputWithValidData.data = cartesianProjection.data;\n validTracesFilteredIndex.forEach((trace, index) => {\n if (trace[1] === 'scatterpolar') {\n validTracesFilteredIndex[index][1] = 'line'; // Change type to line for rendering\n }\n });\n }\n const groupedTraces: Record<string, number[]> = {};\n plotlyInputWithValidData.data.forEach((trace: Partial<PlotData>, index) => {\n const xAxisKey = trace.xaxis ?? DEFAULT_XAXIS;\n if (!groupedTraces[xAxisKey]) {\n groupedTraces[xAxisKey] = [];\n }\n groupedTraces[xAxisKey].push(index);\n });\n\n isMultiPlot.current = Object.keys(groupedTraces).length > 1;\n const gridProperties: GridProperties = getGridProperties(plotlyInputWithValidData.layout, isMultiPlot.current);\n\n const allupLegendsProps = getAllupLegendsProps(plotlyInputWithValidData, colorMap, props.colorwayType, isDarkTheme);\n\n type ChartType = keyof ChartTypeMap;\n // map through the grouped traces and render the appropriate chart\n return (\n <>\n <div\n style={{\n display: 'grid',\n gridTemplateRows: gridProperties.templateRows,\n gridTemplateColumns: gridProperties.templateColumns,\n }}\n >\n {Object.entries(groupedTraces).map(([xAxisKey, index]) => {\n const plotlyInputForGroup: PlotlySchema = {\n ...plotlyInputWithValidData,\n data: index.map(idx => plotlyInputWithValidData.data[idx]),\n };\n\n const filteredTracesInfo = validTracesFilteredIndex.filter(trace => index.includes(trace[0]));\n let chartType =\n validTracesFilteredIndex.some(trace => trace[1] === FALLBACK_TYPE) || chart.type === FALLBACK_TYPE\n ? FALLBACK_TYPE\n : filteredTracesInfo[0][1];\n\n if (\n validTracesFilteredIndex.some(trace => trace[1] === 'line') &&\n validTracesFilteredIndex.some(trace => trace[1] === 'scatter')\n ) {\n chartType = 'line';\n }\n\n const chartEntry = chartMap[chartType as ChartType];\n if (chartEntry) {\n const { transformer, renderer, preTransformCondition, preTransformOperation } = chartEntry;\n if (preTransformCondition === undefined || preTransformCondition(plotlyInputForGroup)) {\n const transformedInput = preTransformOperation\n ? preTransformOperation(plotlyInputForGroup)\n : plotlyInputForGroup;\n const cellProperties = gridProperties.layout[xAxisKey];\n\n return renderChart<ReturnType<typeof transformer>>(\n renderer,\n transformer,\n [transformedInput, isMultiPlot.current, colorMap, props.colorwayType, isDarkTheme],\n {\n ...commonProps,\n xAxisAnnotation: cellProperties?.xAnnotation,\n yAxisAnnotation: cellProperties?.yAnnotation,\n },\n cellProperties?.row ?? 1,\n cellProperties?.column ?? 1,\n );\n }\n return <></>;\n } else {\n throw new Error(`Unsupported chart type :${plotlyInputForGroup.data[0]?.type}`);\n }\n })}\n </div>\n {isMultiPlot.current && createLegends(allupLegendsProps)}\n </>\n );\n});\nDeclarativeChart.displayName = 'DeclarativeChart';\nDeclarativeChart.defaultProps = {\n colorwayType: 'default',\n};\n"],"names":["React","decodeBase64Fields","isArrayOrTypedArray","isMonthArray","mapFluentChart","sanitizeJson","tokens","ThemeContext_unstable","V9ThemeContext","webLightTheme","d3Color","correctYearMonth","getGridProperties","transformPlotlyJsonToDonutProps","transformPlotlyJsonToVSBCProps","transformPlotlyJsonToAreaChartProps","transformPlotlyJsonToLineChartProps","transformPlotlyJsonToHorizontalBarWithAxisProps","transformPlotlyJsonToHeatmapProps","transformPlotlyJsonToSankeyProps","transformPlotlyJsonToGaugeProps","transformPlotlyJsonToGVBCProps","transformPlotlyJsonToVBCProps","transformPlotlyJsonToChartTableProps","transformPlotlyJsonToScatterChartProps","projectPolarToCartesian","getAllupLegendsProps","DonutChart","VerticalStackedBarChart","LineChart","HorizontalBarChartWithAxis","AreaChart","HeatMapChart","SankeyChart","GaugeChart","GroupedVerticalBarChart","VerticalBarChart","ScatterChart","withResponsiveContainer","ChartTable","Legends","ResponsiveDonutChart","ResponsiveVerticalStackedBarChart","ResponsiveLineChart","ResponsiveHorizontalBarChartWithAxis","ResponsiveAreaChart","ResponsiveHeatMapChart","ResponsiveSankeyChart","ResponsiveGaugeChart","ResponsiveGroupedVerticalBarChart","ResponsiveVerticalBarChart","ResponsiveScatterChart","ResponsiveChartTable","DEFAULT_XAXIS","FALLBACK_TYPE","useColorMapping","colorMap","useRef","Map","renderChart","Renderer","transformer","transformerArgs","commonProps","cellRow","cellColumn","chartProps","div","key","style","gridRowStart","gridRowEnd","gridColumnStart","gridColumnEnd","LineAreaPreTransformOp","plotlyInput","xValues","data","x","isXMonth","renderData","map","dataPoint","layout","chartMap","donut","renderer","sankey","table","horizontalbar","groupedverticalbar","verticalstackedbar","heatmap","gauge","verticalbar","area","preTransformOperation","line","scatter","fallback","useIsDarkTheme","parentV9Theme","useContext","v9Theme","backgroundColor","hsl","colorNeutralBackground1","foregroundColor","colorNeutralForeground1","isDarkTheme","l","DeclarativeChart","forwardRef","props","forwardedRef","plotlySchema","chartSchema","chart","isValid","Error","errorMessage","error","plotlyInputWithValidData","validTracesInfo","trace","index","validTracesFilteredIndex","type","selectedLegends","chartRef","isMultiPlot","activeLegends","setActiveLegends","useState","onActiveLegendsChange","keys","onSchemaChange","useEffect","multiSelectLegendProps","canSelectMultipleLegends","onChange","legendProps","componentRef","createLegends","exportAsImage","useCallback","opts","Promise","resolve","reject","current","toImage","background","scale","then","catch","useImperativeHandle","cartesianProjection","forEach","groupedTraces","xAxisKey","xaxis","push","Object","length","gridProperties","allupLegendsProps","colorwayType","display","gridTemplateRows","templateRows","gridTemplateColumns","templateColumns","entries","plotlyInputForGroup","idx","filteredTracesInfo","filter","includes","chartType","some","chartEntry","preTransformCondition","undefined","transformedInput","cellProperties","xAxisAnnotation","xAnnotation","yAxisAnnotation","yAnnotation","row","column","displayName","defaultProps"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../src/components/DeclarativeChart/DeclarativeChart.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/naming-convention */\nimport * as React from 'react';\nimport type { Data, PlotData, PlotlySchema, OutputChartType, TraceInfo } from '@fluentui/chart-utilities';\nimport {\n decodeBase64Fields,\n isArrayOrTypedArray,\n isMonthArray,\n mapFluentChart,\n sanitizeJson,\n} from '@fluentui/chart-utilities';\nimport type { GridProperties } from './PlotlySchemaAdapter';\nimport { tokens } from '@fluentui/react-theme';\nimport { ThemeContext_unstable as V9ThemeContext } from '@fluentui/react-shared-contexts';\nimport { Theme, webLightTheme } from '@fluentui/tokens';\nimport * as d3Color from 'd3-color';\n\nimport {\n correctYearMonth,\n getGridProperties,\n isNonPlotType,\n transformPlotlyJsonToDonutProps,\n transformPlotlyJsonToVSBCProps,\n transformPlotlyJsonToAreaChartProps,\n transformPlotlyJsonToLineChartProps,\n transformPlotlyJsonToHorizontalBarWithAxisProps,\n transformPlotlyJsonToHeatmapProps,\n transformPlotlyJsonToSankeyProps,\n transformPlotlyJsonToGaugeProps,\n transformPlotlyJsonToGVBCProps,\n transformPlotlyJsonToVBCProps,\n transformPlotlyJsonToChartTableProps,\n transformPlotlyJsonToScatterChartProps,\n projectPolarToCartesian,\n getAllupLegendsProps,\n NON_PLOT_KEY_PREFIX,\n SINGLE_REPEAT,\n} from './PlotlySchemaAdapter';\nimport type { ColorwayType } from './PlotlyColorAdapter';\nimport { DonutChart } from '../DonutChart/index';\nimport { VerticalStackedBarChart } from '../VerticalStackedBarChart/index';\nimport { LineChart } from '../LineChart/index';\nimport { HorizontalBarChartWithAxis } from '../HorizontalBarChartWithAxis/index';\nimport { AreaChart } from '../AreaChart/index';\nimport { HeatMapChart } from '../HeatMapChart/index';\nimport { SankeyChart } from '../SankeyChart/SankeyChart';\nimport { GaugeChart } from '../GaugeChart/index';\nimport { GroupedVerticalBarChart } from '../GroupedVerticalBarChart/index';\nimport { VerticalBarChart } from '../VerticalBarChart/index';\nimport { Chart, ImageExportOptions } from '../../types/index';\nimport { ScatterChart } from '../ScatterChart/index';\n\nimport { withResponsiveContainer } from '../ResponsiveContainer/withResponsiveContainer';\nimport { ChartTable } from '../ChartTable/index';\nimport { LegendsProps, Legends } from '../Legends/index';\nimport { JSXElement } from '@fluentui/react-utilities/src/index';\n\nconst ResponsiveDonutChart = withResponsiveContainer(DonutChart);\nconst ResponsiveVerticalStackedBarChart = withResponsiveContainer(VerticalStackedBarChart);\nconst ResponsiveLineChart = withResponsiveContainer(LineChart);\nconst ResponsiveHorizontalBarChartWithAxis = withResponsiveContainer(HorizontalBarChartWithAxis);\nconst ResponsiveAreaChart = withResponsiveContainer(AreaChart);\nconst ResponsiveHeatMapChart = withResponsiveContainer(HeatMapChart);\nconst ResponsiveSankeyChart = withResponsiveContainer(SankeyChart);\nconst ResponsiveGaugeChart = withResponsiveContainer(GaugeChart);\nconst ResponsiveGroupedVerticalBarChart = withResponsiveContainer(GroupedVerticalBarChart);\nconst ResponsiveVerticalBarChart = withResponsiveContainer(VerticalBarChart);\nconst ResponsiveScatterChart = withResponsiveContainer(ScatterChart);\nconst ResponsiveChartTable = withResponsiveContainer(ChartTable);\n\n// Default x-axis key for grouping traces. Also applicable for PieData and SankeyData where x-axis is not defined.\nconst DEFAULT_XAXIS = 'x';\nconst FALLBACK_TYPE = 'fallback';\n\n/**\n * DeclarativeChart schema.\n * {@docCategory DeclarativeChart}\n */\nexport interface Schema {\n /**\n * Plotly schema represented as JSON object\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n plotlySchema: any;\n}\n\n/**\n * DeclarativeChart props.\n * {@docCategory DeclarativeChart}\n */\nexport interface DeclarativeChartProps extends React.RefAttributes<HTMLDivElement> {\n /**\n * The schema representing the chart data, layout and configuration\n */\n chartSchema: Schema;\n\n /**\n * Callback when an event occurs\n */\n onSchemaChange?: (eventData: Schema) => void;\n\n /**\n * Optional callback to access the IDeclarativeChart interface. Use this instead of ref for accessing\n * the public methods and properties of the component.\n */\n componentRef?: React.RefObject<IDeclarativeChart>;\n\n /**\n * Optional prop to specify the colorway type of the chart.\n * - 'default': Use Fluent UI color palette aligning with plotly colorway.\n * - 'builtin': Use Fluent UI colorway.\n * - 'others': Reserved for future colorways.\n * @default 'default'\n */\n colorwayType?: ColorwayType;\n}\n\n/**\n * {@docCategory DeclarativeChart}\n */\nexport interface IDeclarativeChart {\n exportAsImage: (opts?: ImageExportOptions) => Promise<string>;\n}\n\nconst useColorMapping = () => {\n const colorMap = React.useRef(new Map<string, string>());\n return colorMap;\n};\n\nfunction renderChart<TProps>(\n Renderer: React.ComponentType<TProps>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n transformer: (...args: any[]) => TProps,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n transformerArgs: any[],\n commonProps: Partial<TProps>,\n cellRow: number,\n cellColumn: number,\n): JSXElement {\n const chartProps = transformer(...transformerArgs);\n return (\n <div\n key={`${cellRow}_${cellColumn}`}\n style={{\n gridRowStart: cellRow,\n gridRowEnd: cellRow + 1,\n gridColumnStart: cellColumn,\n gridColumnEnd: cellColumn + 1,\n }}\n >\n <Renderer {...chartProps} {...commonProps} />\n </div>\n );\n}\n\ntype PreTransformHooks = {\n preTransformCondition?: (plotlySchema: PlotlySchema) => boolean;\n preTransformOperation?: (plotlySchema: PlotlySchema) => PlotlySchema;\n};\n\nconst LineAreaPreTransformOp = (plotlyInput: PlotlySchema) => {\n const xValues = (plotlyInput.data[0] as PlotData).x;\n const isXMonth = isMonthArray(xValues);\n let renderData = plotlyInput.data;\n if (isXMonth) {\n renderData = plotlyInput.data.map((dataPoint: PlotData) => ({\n ...dataPoint,\n x: correctYearMonth(dataPoint.x),\n }));\n }\n return { data: renderData, layout: plotlyInput.layout };\n};\n\ntype ChartTypeMap = {\n donut: {\n transformer: typeof transformPlotlyJsonToDonutProps;\n renderer: typeof ResponsiveDonutChart;\n } & PreTransformHooks;\n sankey: {\n transformer: typeof transformPlotlyJsonToSankeyProps;\n renderer: typeof ResponsiveSankeyChart;\n } & PreTransformHooks;\n table: {\n transformer: typeof transformPlotlyJsonToChartTableProps;\n renderer: typeof ResponsiveChartTable;\n } & PreTransformHooks;\n horizontalbar: {\n transformer: typeof transformPlotlyJsonToHorizontalBarWithAxisProps;\n renderer: typeof ResponsiveHorizontalBarChartWithAxis;\n } & PreTransformHooks;\n groupedverticalbar: {\n transformer: typeof transformPlotlyJsonToGVBCProps;\n renderer: typeof ResponsiveGroupedVerticalBarChart;\n } & PreTransformHooks;\n verticalstackedbar: {\n transformer: typeof transformPlotlyJsonToVSBCProps;\n renderer: typeof ResponsiveVerticalStackedBarChart;\n } & PreTransformHooks;\n heatmap: {\n transformer: typeof transformPlotlyJsonToHeatmapProps;\n renderer: typeof ResponsiveHeatMapChart;\n } & PreTransformHooks;\n gauge: {\n transformer: typeof transformPlotlyJsonToGaugeProps;\n renderer: typeof ResponsiveGaugeChart;\n } & PreTransformHooks;\n verticalbar: {\n transformer: typeof transformPlotlyJsonToVBCProps;\n renderer: typeof ResponsiveVerticalBarChart;\n } & PreTransformHooks;\n area: {\n transformer: typeof transformPlotlyJsonToAreaChartProps;\n renderer: typeof ResponsiveAreaChart;\n } & PreTransformHooks;\n line: {\n transformer: typeof transformPlotlyJsonToLineChartProps;\n renderer: typeof ResponsiveLineChart;\n } & PreTransformHooks;\n scatter: {\n transformer: typeof transformPlotlyJsonToScatterChartProps;\n renderer: typeof ResponsiveScatterChart;\n } & PreTransformHooks;\n fallback: {\n transformer: typeof transformPlotlyJsonToVSBCProps;\n renderer: typeof ResponsiveVerticalStackedBarChart;\n } & PreTransformHooks;\n};\n\nconst chartMap: ChartTypeMap = {\n // PieData category charts\n donut: {\n transformer: transformPlotlyJsonToDonutProps,\n renderer: ResponsiveDonutChart,\n },\n // SankeyData category charts\n sankey: {\n transformer: transformPlotlyJsonToSankeyProps,\n renderer: ResponsiveSankeyChart,\n },\n // TableData category charts\n table: {\n transformer: transformPlotlyJsonToChartTableProps,\n renderer: ResponsiveChartTable,\n },\n // PlotData category charts\n horizontalbar: {\n transformer: transformPlotlyJsonToHorizontalBarWithAxisProps,\n renderer: ResponsiveHorizontalBarChartWithAxis,\n },\n groupedverticalbar: {\n transformer: transformPlotlyJsonToGVBCProps,\n renderer: ResponsiveGroupedVerticalBarChart,\n },\n verticalstackedbar: {\n transformer: transformPlotlyJsonToVSBCProps,\n renderer: ResponsiveVerticalStackedBarChart,\n },\n heatmap: {\n transformer: transformPlotlyJsonToHeatmapProps,\n renderer: ResponsiveHeatMapChart,\n },\n gauge: {\n transformer: transformPlotlyJsonToGaugeProps,\n renderer: ResponsiveGaugeChart,\n },\n verticalbar: {\n transformer: transformPlotlyJsonToVBCProps,\n renderer: ResponsiveVerticalBarChart,\n },\n area: {\n transformer: transformPlotlyJsonToAreaChartProps,\n renderer: ResponsiveAreaChart,\n preTransformOperation: LineAreaPreTransformOp,\n },\n line: {\n transformer: transformPlotlyJsonToLineChartProps,\n renderer: ResponsiveLineChart,\n preTransformOperation: LineAreaPreTransformOp,\n },\n scatter: {\n transformer: transformPlotlyJsonToScatterChartProps,\n renderer: ResponsiveScatterChart,\n preTransformOperation: LineAreaPreTransformOp,\n },\n fallback: {\n transformer: transformPlotlyJsonToVSBCProps,\n renderer: ResponsiveVerticalStackedBarChart,\n },\n};\n\nconst useIsDarkTheme = (): boolean => {\n const parentV9Theme = React.useContext(V9ThemeContext) as Theme;\n const v9Theme: Theme = parentV9Theme ? parentV9Theme : webLightTheme;\n\n // Get background and foreground colors\n const backgroundColor = d3Color.hsl(v9Theme.colorNeutralBackground1);\n const foregroundColor = d3Color.hsl(v9Theme.colorNeutralForeground1);\n\n const isDarkTheme = backgroundColor.l < foregroundColor.l;\n\n return isDarkTheme;\n};\n\n/**\n * DeclarativeChart component.\n * {@docCategory DeclarativeChart}\n */\nexport const DeclarativeChart: React.FunctionComponent<DeclarativeChartProps> = React.forwardRef<\n HTMLDivElement,\n DeclarativeChartProps\n>((props, forwardedRef) => {\n const { plotlySchema } = sanitizeJson(props.chartSchema);\n const chart: OutputChartType = mapFluentChart(plotlySchema);\n if (!chart.isValid) {\n throw new Error(`Invalid chart schema: ${chart.errorMessage}`);\n }\n let plotlyInput = plotlySchema as PlotlySchema;\n try {\n plotlyInput = decodeBase64Fields(plotlyInput);\n } catch (error) {\n throw new Error(`Failed to decode plotly schema: ${error}`);\n }\n const plotlyInputWithValidData: PlotlySchema = {\n ...plotlyInput,\n data: chart.validTracesInfo!.map(trace => plotlyInput.data[trace.index]),\n };\n\n const validTracesFilteredIndex: TraceInfo[] = chart.validTracesInfo!.map((trace, index) => ({\n index,\n type: trace.type,\n }));\n\n let { selectedLegends } = plotlySchema;\n const colorMap = useColorMapping();\n const isDarkTheme = useIsDarkTheme();\n const chartRef = React.useRef<Chart>(null);\n const isMultiPlot = React.useRef(false);\n\n if (!isArrayOrTypedArray(selectedLegends)) {\n selectedLegends = [];\n }\n\n const [activeLegends, setActiveLegends] = React.useState<string[]>(selectedLegends);\n const onActiveLegendsChange = (keys: string[]) => {\n setActiveLegends(keys);\n if (props.onSchemaChange) {\n props.onSchemaChange({ plotlySchema: { plotlyInput, selectedLegends: keys } });\n }\n };\n\n React.useEffect(() => {\n // eslint-disable-next-line @typescript-eslint/no-shadow\n const { plotlySchema } = sanitizeJson(props.chartSchema);\n // eslint-disable-next-line @typescript-eslint/no-shadow\n const { selectedLegends } = plotlySchema;\n setActiveLegends(selectedLegends ?? []);\n }, [props.chartSchema]);\n\n const multiSelectLegendProps = {\n canSelectMultipleLegends: true,\n onChange: onActiveLegendsChange,\n selectedLegends: activeLegends,\n };\n\n const commonProps = {\n legendProps: multiSelectLegendProps,\n componentRef: chartRef,\n };\n\n function createLegends(legendProps: LegendsProps): JSXElement {\n // eslint-disable-next-line react/jsx-no-bind\n return <Legends {...legendProps} selectedLegends={activeLegends} onChange={onActiveLegendsChange} />;\n }\n\n // TODO\n const exportAsImage = React.useCallback((opts?: ImageExportOptions): Promise<string> => {\n return new Promise((resolve, reject) => {\n if (isMultiPlot.current) {\n return reject(Error('Exporting multi plot charts as image is not supported'));\n }\n if (!chartRef.current || typeof chartRef.current.toImage !== 'function') {\n return reject(Error('Chart cannot be exported as image'));\n }\n\n chartRef.current\n .toImage({\n background: tokens.colorNeutralBackground1,\n scale: 5,\n ...opts,\n })\n .then(resolve)\n .catch(reject);\n });\n }, []);\n\n React.useImperativeHandle(\n props.componentRef,\n () => ({\n exportAsImage,\n }),\n [exportAsImage],\n );\n\n if (chart.type === 'scatterpolar') {\n const cartesianProjection = projectPolarToCartesian(plotlyInputWithValidData);\n plotlyInputWithValidData.data = cartesianProjection.data;\n validTracesFilteredIndex.forEach((trace, index) => {\n if (trace.type === 'scatterpolar') {\n validTracesFilteredIndex[index].type = 'line'; // Change type to line for rendering\n }\n });\n }\n const groupedTraces: Record<string, number[]> = {};\n let nonCartesianTraceCount = 0;\n plotlyInputWithValidData.data.forEach((trace: Data, index: number) => {\n let traceKey = '';\n if (isNonPlotType(chart.validTracesInfo![index].type)) {\n traceKey = `${NON_PLOT_KEY_PREFIX}${nonCartesianTraceCount + 1}`;\n nonCartesianTraceCount++;\n } else {\n traceKey = (trace as PlotData).xaxis ?? DEFAULT_XAXIS;\n }\n if (!groupedTraces[traceKey]) {\n groupedTraces[traceKey] = [];\n }\n groupedTraces[traceKey].push(index);\n });\n\n isMultiPlot.current = Object.keys(groupedTraces).length > 1;\n const gridProperties: GridProperties = getGridProperties(\n plotlyInputWithValidData,\n isMultiPlot.current,\n chart.validTracesInfo!,\n );\n\n // Render only one plot if the grid properties cannot determine positioning of multiple plots.\n if (\n isMultiPlot.current &&\n gridProperties.templateRows === SINGLE_REPEAT &&\n gridProperties.templateColumns === SINGLE_REPEAT\n ) {\n Object.keys(groupedTraces).forEach((key, index) => {\n if (index > 0) {\n delete groupedTraces[key];\n }\n });\n isMultiPlot.current = false;\n }\n\n const allupLegendsProps = getAllupLegendsProps(\n plotlyInputWithValidData,\n colorMap,\n props.colorwayType,\n chart.validTracesInfo!,\n isDarkTheme,\n );\n\n type ChartType = keyof ChartTypeMap;\n // map through the grouped traces and render the appropriate chart\n return (\n <>\n <div\n style={{\n display: 'grid',\n gridTemplateRows: gridProperties.templateRows,\n gridTemplateColumns: gridProperties.templateColumns,\n }}\n >\n {Object.entries(groupedTraces).map(([xAxisKey, index]) => {\n const plotlyInputForGroup: PlotlySchema = {\n ...plotlyInputWithValidData,\n data: index.map(idx => plotlyInputWithValidData.data[idx]),\n };\n\n const filteredTracesInfo = validTracesFilteredIndex.filter(trace => index.includes(trace.index));\n let chartType =\n validTracesFilteredIndex.some(trace => trace.type === FALLBACK_TYPE) || chart.type === FALLBACK_TYPE\n ? FALLBACK_TYPE\n : filteredTracesInfo[0].type;\n\n if (\n validTracesFilteredIndex.some(trace => trace.type === 'line') &&\n validTracesFilteredIndex.some(trace => trace.type === 'scatter')\n ) {\n chartType = 'line';\n }\n\n const chartEntry = chartMap[chartType as ChartType];\n if (chartEntry) {\n const { transformer, renderer, preTransformCondition, preTransformOperation } = chartEntry;\n if (preTransformCondition === undefined || preTransformCondition(plotlyInputForGroup)) {\n const transformedInput = preTransformOperation\n ? preTransformOperation(plotlyInputForGroup)\n : plotlyInputForGroup;\n const cellProperties = gridProperties.layout[xAxisKey];\n\n return renderChart<ReturnType<typeof transformer>>(\n renderer,\n transformer,\n [transformedInput, isMultiPlot.current, colorMap, props.colorwayType, isDarkTheme],\n {\n ...commonProps,\n xAxisAnnotation: cellProperties?.xAnnotation,\n yAxisAnnotation: cellProperties?.yAnnotation,\n },\n cellProperties?.row ?? 1,\n cellProperties?.column ?? 1,\n );\n }\n return <></>;\n } else {\n throw new Error(`Unsupported chart type :${plotlyInputForGroup.data[0]?.type}`);\n }\n })}\n </div>\n {isMultiPlot.current && createLegends(allupLegendsProps)}\n </>\n );\n});\nDeclarativeChart.displayName = 'DeclarativeChart';\nDeclarativeChart.defaultProps = {\n colorwayType: 'default',\n};\n"],"names":["React","decodeBase64Fields","isArrayOrTypedArray","isMonthArray","mapFluentChart","sanitizeJson","tokens","ThemeContext_unstable","V9ThemeContext","webLightTheme","d3Color","correctYearMonth","getGridProperties","isNonPlotType","transformPlotlyJsonToDonutProps","transformPlotlyJsonToVSBCProps","transformPlotlyJsonToAreaChartProps","transformPlotlyJsonToLineChartProps","transformPlotlyJsonToHorizontalBarWithAxisProps","transformPlotlyJsonToHeatmapProps","transformPlotlyJsonToSankeyProps","transformPlotlyJsonToGaugeProps","transformPlotlyJsonToGVBCProps","transformPlotlyJsonToVBCProps","transformPlotlyJsonToChartTableProps","transformPlotlyJsonToScatterChartProps","projectPolarToCartesian","getAllupLegendsProps","NON_PLOT_KEY_PREFIX","SINGLE_REPEAT","DonutChart","VerticalStackedBarChart","LineChart","HorizontalBarChartWithAxis","AreaChart","HeatMapChart","SankeyChart","GaugeChart","GroupedVerticalBarChart","VerticalBarChart","ScatterChart","withResponsiveContainer","ChartTable","Legends","ResponsiveDonutChart","ResponsiveVerticalStackedBarChart","ResponsiveLineChart","ResponsiveHorizontalBarChartWithAxis","ResponsiveAreaChart","ResponsiveHeatMapChart","ResponsiveSankeyChart","ResponsiveGaugeChart","ResponsiveGroupedVerticalBarChart","ResponsiveVerticalBarChart","ResponsiveScatterChart","ResponsiveChartTable","DEFAULT_XAXIS","FALLBACK_TYPE","useColorMapping","colorMap","useRef","Map","renderChart","Renderer","transformer","transformerArgs","commonProps","cellRow","cellColumn","chartProps","div","key","style","gridRowStart","gridRowEnd","gridColumnStart","gridColumnEnd","LineAreaPreTransformOp","plotlyInput","xValues","data","x","isXMonth","renderData","map","dataPoint","layout","chartMap","donut","renderer","sankey","table","horizontalbar","groupedverticalbar","verticalstackedbar","heatmap","gauge","verticalbar","area","preTransformOperation","line","scatter","fallback","useIsDarkTheme","parentV9Theme","useContext","v9Theme","backgroundColor","hsl","colorNeutralBackground1","foregroundColor","colorNeutralForeground1","isDarkTheme","l","DeclarativeChart","forwardRef","props","forwardedRef","plotlySchema","chartSchema","chart","isValid","Error","errorMessage","error","plotlyInputWithValidData","validTracesInfo","trace","index","validTracesFilteredIndex","type","selectedLegends","chartRef","isMultiPlot","activeLegends","setActiveLegends","useState","onActiveLegendsChange","keys","onSchemaChange","useEffect","multiSelectLegendProps","canSelectMultipleLegends","onChange","legendProps","componentRef","createLegends","exportAsImage","useCallback","opts","Promise","resolve","reject","current","toImage","background","scale","then","catch","useImperativeHandle","cartesianProjection","forEach","groupedTraces","nonCartesianTraceCount","traceKey","xaxis","push","Object","length","gridProperties","templateRows","templateColumns","allupLegendsProps","colorwayType","display","gridTemplateRows","gridTemplateColumns","entries","xAxisKey","plotlyInputForGroup","idx","filteredTracesInfo","filter","includes","chartType","some","chartEntry","preTransformCondition","undefined","transformedInput","cellProperties","xAxisAnnotation","xAnnotation","yAxisAnnotation","yAnnotation","row","column","displayName","defaultProps"],"mappings":"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"}
|