UNPKG

@awsui/components-react

Version:

AWS UI is a collection of [React](https://reactjs.org/) components that help create intuitive, responsive, and accessible user experiences for web applications. It is developed by Amazon Web Services (AWS). This work is available under the terms of the [A

93 lines (92 loc) 6.53 kB
import { __assign, __rest } from "tslib"; import React, { useCallback, useMemo, useState } from 'react'; import clsx from 'clsx'; import { scaleOrdinal } from 'd3-scale'; import { getBaseProps } from '../internal/base-component'; import { useTelemetry } from '../internal/hooks/use-telemetry'; import { useContainerQuery } from '../internal/hooks/container-queries'; import { useControllable } from '../internal/hooks/use-controllable'; import { categoryPalette } from '../internal/styles/colors'; import { fireNonCancelableEvent } from '../internal/events'; import { parseCssVariable } from '../internal/utils/dom'; import Legend from '../internal/components/chart-legend'; import Filter from '../internal/components/chart-filter'; import SpaceBetween from '../space-between'; import Box from '../box'; import InternalPieChart from './pie-chart'; import styles from './styles.css.js'; var PieChart = function PieChart(_a) { var _b; var _c = _a.variant, variant = _c === void 0 ? 'pie' : _c, _d = _a.size, size = _d === void 0 ? 'medium' : _d, _e = _a.hideLegend, hideLegend = _e === void 0 ? false : _e, _f = _a.hideFilter, hideFilter = _f === void 0 ? false : _f, _g = _a.statusType, statusType = _g === void 0 ? 'finished' : _g, _h = _a.data, externalData = _h === void 0 ? [] : _h, i18nStrings = _a.i18nStrings, controlledHighlightedSegment = _a.highlightedSegment, controlledVisibleSegments = _a.visibleSegments, onHighlightChange = _a.onHighlightChange, onFilterChange = _a.onFilterChange, additionalFilters = _a.additionalFilters, legendTitle = _a.legendTitle, _j = _a.detailPopoverSize, detailPopoverSize = _j === void 0 ? 'medium' : _j, props = __rest(_a, ["variant", "size", "hideLegend", "hideFilter", "statusType", "data", "i18nStrings", "highlightedSegment", "visibleSegments", "onHighlightChange", "onFilterChange", "additionalFilters", "legendTitle", "detailPopoverSize"]); useTelemetry('PieChart'); var baseProps = getBaseProps(props); var isEmpty = !externalData || externalData.length === 0; var containerAttr = __assign(__assign({}, baseProps), { className: clsx(baseProps.className, styles.root) }); var _k = useContainerQuery(function (rect, prevWidth) { return prevWidth !== rect.width ? rect.width : prevWidth; }), containerWidth = _k[0], ref = _k[1]; var data = useMemo(function () { var colors = scaleOrdinal(externalData.map(function (_, i) { return i; }), categoryPalette); return externalData.map(function (datum, i) { return ({ index: i, color: parseCssVariable(datum.color || colors(i)), datum: datum }); }); }, [externalData]); var _l = useControllable(controlledHighlightedSegment, onHighlightChange, null, { componentName: 'PieChart', controlledProp: 'highlightedSegment', changeHandler: 'onHighlightChange' }), highlightedSegment = _l[0], setHighlightedSegment = _l[1]; var _m = useControllable(controlledVisibleSegments, onFilterChange, externalData, { componentName: 'PieChart', controlledProp: 'visibleSegments', changeHandler: 'onFilterChange' }), visibleSegments = _m[0], setVisibleSegments = _m[1]; var _o = useState(null), pinnedSegment = _o[0], setPinnedSegment = _o[1]; var actualHighlightedSegment = highlightedSegment || null; var visibleData = useMemo(function () { return data.filter(function (d) { return (visibleSegments === null || visibleSegments === void 0 ? void 0 : visibleSegments.indexOf(d.datum)) !== -1; }); }, [ data, visibleSegments ]); var filterItems = data === null || data === void 0 ? void 0 : data.map(function (data) { return ({ label: data.datum.title, color: data.color, type: 'rectangle', datum: data.datum }); }); var legendItems = filterItems.filter(function (d) { return (visibleSegments === null || visibleSegments === void 0 ? void 0 : visibleSegments.indexOf(d.datum)) !== -1; }); var highlightedLegendItem = useMemo(function () { if (!highlightedSegment) { return null; } var matches = legendItems.filter(function (item) { return item.datum === highlightedSegment; }); return matches[0] || null; }, [legendItems, highlightedSegment]); var filterChange = useCallback(function (selectedSeries) { setVisibleSegments(selectedSeries); fireNonCancelableEvent(onFilterChange, { visibleSegments: selectedSeries }); }, [setVisibleSegments, onFilterChange]); var onLegendHighlightChange = useCallback(function (segment) { if (pinnedSegment !== null) { return; } setHighlightedSegment(segment); fireNonCancelableEvent(onHighlightChange, { highlightedSegment: segment }); }, [pinnedSegment, setHighlightedSegment, onHighlightChange]); return (React.createElement("div", __assign({}, containerAttr, { ref: ref }), statusType === 'finished' && !isEmpty && (React.createElement(Box, { className: styles['filter-container'], margin: { bottom: 'l' } }, React.createElement(SpaceBetween, { size: "l", direction: "horizontal", className: clsx((_b = {}, _b[styles['has-default-filter']] = !hideFilter, _b)) }, !hideFilter && (React.createElement(Filter, { series: filterItems, onChange: filterChange, selectedSeries: visibleSegments, i18nStrings: i18nStrings })), additionalFilters))), React.createElement(InternalPieChart, __assign({}, props, { variant: variant, size: size, data: externalData, visibleData: visibleData, width: containerWidth || 0, statusType: statusType, hideLegend: hideLegend, hideFilter: hideFilter, additionalFilters: additionalFilters, i18nStrings: i18nStrings, onHighlightChange: onHighlightChange, highlightedSegment: actualHighlightedSegment, setHighlightedSegment: setHighlightedSegment, pinnedSegment: pinnedSegment, setPinnedSegment: setPinnedSegment, detailPopoverSize: detailPopoverSize })), !hideLegend && !isEmpty && statusType === 'finished' && (React.createElement(Box, { margin: { top: 'm' } }, React.createElement(Legend, { series: legendItems, highlightedSeries: highlightedLegendItem, legendTitle: legendTitle, ariaLabel: i18nStrings === null || i18nStrings === void 0 ? void 0 : i18nStrings.legendAriaLabel, onHighlightChange: onLegendHighlightChange }))))); }; export default PieChart;