@neo4j-ndl/react-charts
Version:
React implementation of charts from Neo4j Design System
75 lines • 4.3 kB
JavaScript
;
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;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Legend = void 0;
const jsx_runtime_1 = require("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/>.
*/
const use_legend_interactions_1 = require("./hooks/use-legend-interactions");
const use_legend_visibility_1 = require("./hooks/use-legend-visibility");
const LegendItem_1 = require("./LegendItem");
const LegendLayout_1 = require("./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.
*/
const Legend = (_a) => {
var { className, series, isLayoutReady = true, onLayoutReady, htmlAttributes } = _a, restProps = __rest(_a, ["className", "series", "isLayoutReady", "onLayoutReady", "htmlAttributes"]);
const { renderedSelectedSeries } = (0, use_legend_interactions_1.useLegendSelection)({
series,
});
const { toggleHighlight } = (0, use_legend_interactions_1.useLegendHoverHighlight)({
selectedSeries: renderedSelectedSeries,
series,
});
const { toggleLegendVisibility } = (0, use_legend_visibility_1.useLegendVisibility)(renderedSelectedSeries);
const selectedSeriesLength = Object.values(renderedSelectedSeries).filter(Boolean).length;
const isAllSeriesVisible = selectedSeriesLength === series.length;
const hasMoreThanOneItem = series.length > 1;
return ((0, jsx_runtime_1.jsx)(LegendLayout_1.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 ((0, jsx_runtime_1.jsx)(LegendItem_1.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));
}) })));
};
exports.Legend = Legend;
//# sourceMappingURL=Legend.js.map