UNPKG

@neo4j-ndl/react-charts

Version:

React implementation of charts from Neo4j Design System

71 lines 4.03 kB
var __rest = (this && this.__rest) || function (s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; import { jsx as _jsx } from "react/jsx-runtime"; /** * * Copyright (c) "Neo4j" * Neo4j Sweden AB [http://neo4j.com] * * This file is part of Neo4j. * * Neo4j is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ import { useLegendHoverHighlight, useLegendSelection, } from './hooks/use-legend-interactions'; import { useLegendVisibility } from './hooks/use-legend-visibility'; import { LegendItem } from './LegendItem'; import { LegendLayout } from './LegendLayout'; /** * Renders the interactive chart legend and keeps legend state synchronized with * ECharts. * * The component owns the React-side selected-series state, mirrors it into the * shared ref consumed when rebuilding chart options, and wires item hover/click * interactions back to the ECharts instance. */ export const Legend = (_a) => { var { className, series, isLayoutReady = true, onLayoutReady, htmlAttributes } = _a, restProps = __rest(_a, ["className", "series", "isLayoutReady", "onLayoutReady", "htmlAttributes"]); const { renderedSelectedSeries } = useLegendSelection({ series, }); const { toggleHighlight } = useLegendHoverHighlight({ selectedSeries: renderedSelectedSeries, series, }); const { toggleLegendVisibility } = useLegendVisibility(renderedSelectedSeries); const selectedSeriesLength = Object.values(renderedSelectedSeries).filter(Boolean).length; const isAllSeriesVisible = selectedSeriesLength === series.length; const hasMoreThanOneItem = series.length > 1; return (_jsx(LegendLayout, Object.assign({ className: className, isLayoutReady: isLayoutReady, itemCount: series.length, onLayoutReady: onLayoutReady, htmlAttributes: htmlAttributes }, restProps, { children: series.map((currentSeries, index) => { var _a, _b, _c; return (_jsx(LegendItem, { name: currentSeries.name, color: currentSeries.color, hasButtons: hasMoreThanOneItem && currentSeries.name !== undefined, onLegendItemMouseEnter: () => toggleHighlight(currentSeries, true), onLegendItemMouseLeave: () => toggleHighlight(currentSeries, false), onLegendItemClick: () => { var _a; const isOnlyVisible = renderedSelectedSeries[(_a = currentSeries.name) !== null && _a !== void 0 ? _a : ''] && selectedSeriesLength === 1; toggleLegendVisibility(currentSeries.name, isAllSeriesVisible, isOnlyVisible); }, selected: !isAllSeriesVisible && renderedSelectedSeries[(_a = currentSeries.name) !== null && _a !== void 0 ? _a : ''], deSelected: currentSeries.name === undefined ? false : !renderedSelectedSeries[currentSeries.name], children: (_b = currentSeries.name) !== null && _b !== void 0 ? _b : `Series ${index}` }, (_c = currentSeries.name) !== null && _c !== void 0 ? _c : index)); }) }))); }; //# sourceMappingURL=Legend.js.map