/* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ import React, { useMemo, useRef, useState } from "react"; import { useColors } from "../hooks"; import TickFormatter from "../services/TickFormatter"; import MarkdownRender from "./MarkdownRender"; import DataTable from "./DataTable"; import { ColumnMetadata, NumberDataType } from "../models"; import ShareButton from "./ShareButton"; import PieChart from "@cloudscape-design/components/pie-chart"; import { useTranslation } from "react-i18next"; type Props = { id: string; title: string; downloadTitle: string; summary: string; parts: Array; data?: Array; summaryBelow: boolean; significantDigitLabels: boolean; colors?: { primary: string | undefined; secondary: string | undefined; }; columnsMetadata: Array; hideDataLabels?: boolean; isPreview?: boolean; showMobilePreview?: boolean; computePercentages?: boolean; }; const PieChartWidget = (props: Props) => { const { t } = useTranslation(); const [xAxisLargestValue, setXAxisLargestValue] = useState(0); const pieParts = useRef>([]); let total = useRef(0); const { data, parts, showMobilePreview } = props; useMemo(() => { if (data && data.length > 0) { total.current = 0; let maxTick = -Infinity; for (let dataItem of data) { const value = dataItem[parts[1] as keyof object]; total.current += isNaN(value) ? 0 : Number(value); maxTick = Math.max(maxTick, value); } setXAxisLargestValue(maxTick); } }, [data, parts]); const colors = useColors( pieParts.current.length, props.colors?.primary, props.colors?.secondary, ); const displayedAmount = (value: number | string, columnMetadata: ColumnMetadata): string => { const displayedAmount = TickFormatter.format( Number(value), xAxisLargestValue, props.significantDigitLabels, "", "", columnMetadata, ); const computedPercentage = Math.round((Number(value) / total.current) * 100 * 100) / 100; const displayedPercentage = TickFormatter.format( computedPercentage, xAxisLargestValue, false, NumberDataType.Percentage, "", ); return props.computePercentages ? `${displayedAmount} (${displayedPercentage})` : displayedAmount; }; const dataSeries = (data: object[]): any[] => { const result = data.map((dataItem, index) => { const key = dataItem[parts[0] as keyof object]; const value = dataItem[parts[1] as keyof object]; return { title: key, value: value, color: colors[index], }; }); return result; }; const displayDataValue = (dataItem: any): string => { // Check if there is metadata for this column let columnMetadata; if (parts && parts.length > 1 && props.columnsMetadata) { columnMetadata = props.columnsMetadata.find((cm) => cm.columnName === parts[1]); } return displayedAmount(dataItem.value, columnMetadata); }; return (
{props.title && (

{props.title}

)} {!props.summaryBelow && ( )} {data && data.length > 0 && (
{ if (props.hideDataLabels) { return ""; } return displayDataValue(datum); }} detailPopoverContent={(datum) => { return [ { key: datum.title, value: displayDataValue(datum), }, ]; }} i18nStrings={{ detailPopoverDismissAriaLabel: t( "ChartAriaLabels.DetailPopoverDismissAriaLabel", ), legendAriaLabel: t("ChartAriaLabels.LegendAriaLabel"), chartAriaRoleDescription: props.summary, }} ariaDescription={props.summary} ariaLabel={props.title} size="large" hideFilter hideTitles={props.hideDataLabels} />
)}
{props.summaryBelow && (
)}
); }; export default PieChartWidget;