UNPKG

@gpa-gemstone/react-graph

Version:
203 lines 24.4 kB
"use strict"; // ****************************************************************************************************** // Legend.tsx - Gbtc // // Copyright © 2021, Grid Protection Alliance. All Rights Reserved. // // Licensed to the Grid Protection Alliance (GPA) under one or more contributor license agreements. See // the NOTICE file distributed with this work for additional information regarding copyright ownership. // The GPA licenses this file to you under the MIT License (MIT), the "License"; you may not use this // file except in compliance with the License. You may obtain a copy of the License at: // // http://opensource.org/licenses/MIT // // Unless agreed to in writing, the subject software distributed under the License is distributed on an // "AS-IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. Refer to the // License for the specific language governing permissions and limitations. // // Code Modification History: // ---------------------------------------------------------------------------------------------------- // 03/19/2021 - C. lackner // Generated original version of source code. // // ****************************************************************************************************** var __read = (this && this.__read) || function (o, n) { var m = typeof Symbol === "function" && o[Symbol.iterator]; if (!m) return o; var i = m.call(o), r, ar = [], e; try { while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); } catch (error) { e = { error: error }; } finally { try { if (r && !r.done && (m = i["return"])) m.call(i); } finally { if (e) throw e.error; } } return ar; }; var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { if (ar || !(i in from)) { if (!ar) ar = Array.prototype.slice.call(from, 0, i); ar[i] = from[i]; } } return to.concat(ar || Array.prototype.slice.call(from)); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.fontFamily = void 0; var React = require("react"); var _ = require("lodash"); var GraphContext_1 = require("./GraphContext"); var LegendContext_1 = require("./LegendContext"); var helper_functions_1 = require("@gpa-gemstone/helper-functions"); var LineLegend_1 = require("./LineLegend"); var HeatLegend_1 = require("./HeatLegend"); var itemHeight = 25; var itemsWhenBottom = 3; // line legend consts (font family needs to be monospaced) exports.fontFamily = "Courier New"; var nonTextualWidth = 25; var cssStyle = "margin: auto auto auto 0px; display: inline-block; font-weight: 400; font-family: ".concat(exports.fontFamily, ";"); // heat legend consts var heatWidth = 50; function Legend(props) { var graphContext = React.useContext(GraphContext_1.GraphContext); var massEnableRef = React.useRef(function (_) { }); var _a = __read(React.useMemo(function () { var newNLegends = __spreadArray([], __read(graphContext.Data.current.values()), false).reduce(function (s, c) { var _a, _b, _c, _d, _e; if (c.legend === undefined) return s; if (props.HideDisabled && !((_c = (_b = (_a = c.legend) === null || _a === void 0 ? void 0 : _a.props) === null || _b === void 0 ? void 0 : _b.enabled) !== null && _c !== void 0 ? _c : true)) return s; if (((_d = c.legend) === null || _d === void 0 ? void 0 : _d.type) === LineLegend_1.default) s.sm = s.sm + 1; else if (((_e = c.legend) === null || _e === void 0 ? void 0 : _e.type) === HeatLegend_1.default) s.lg = s.lg + 1; else { s.sm = s.sm + 1; console.warn("Unknown legend element found. Please check legend component or children to legend."); } return s; }, { sm: 0, lg: 0 }); return [newNLegends.sm, newNLegends.lg]; }, [graphContext.DataGuid, props.HideDisabled]), 2), nLegendsSm = _a[0], nLegendsLg = _a[1]; var leftPad = props.location === 'bottom' ? 39 : 0; var width = props.location === 'bottom' ? props.graphWidth : props.width; var height = props.location === 'right' ? props.graphHeight : props.height; var smHeight = props.location === 'bottom' ? itemHeight : Math.max(height / (Math.max(nLegendsSm + nLegendsLg, 1)), itemHeight); var lgHeight = smHeight * (props.location === 'bottom' ? 2 : 1); var requiredHeight = Math.ceil(nLegendsSm / (props.location === 'bottom' ? itemsWhenBottom : 1)) * smHeight + nLegendsLg * lgHeight; var scrollBarSpace = (requiredHeight > height ? (0, helper_functions_1.GetScrollbarWidth)() : 0); var smWidth = ((width - leftPad) / (props.location === 'bottom' ? itemsWhenBottom : 1)) - scrollBarSpace; var lgWidth = width - leftPad - scrollBarSpace; var _b = __read(React.useMemo(function () { var _a, _b; var smallestFont = 1; var isMultiLine = false; var lgWidthNeeded = 0; var smWidthNeeded = 0; var legendArray = __spreadArray([], __read(graphContext.Data.current.values()), false).map(function (dataSeries) { return dataSeries === null || dataSeries === void 0 ? void 0 : dataSeries.legend; }); var setNeeded = function (size, width) { if (size === 'lg' && width > lgWidthNeeded) lgWidthNeeded = width; else if (size === 'sm' && width > smWidthNeeded) smWidthNeeded = width; }; // Handle line array var findSizing = function (label) { var newFontSize = 1; var textHeight = (0, helper_functions_1.GetTextHeight)(exports.fontFamily, "".concat(newFontSize, "em"), label, "".concat(cssStyle), "".concat(smWidth - nonTextualWidth, "px")); var textWidth = (0, helper_functions_1.GetTextWidth)(exports.fontFamily, "".concat(newFontSize, "em"), label, "".concat(cssStyle), "".concat(textHeight, "px")); // LineLegend is considered a "small" element if (textWidth > smWidthNeeded) smWidthNeeded = textWidth; var useML = false; while (newFontSize > 0.4 && (textWidth > smWidth - nonTextualWidth || textHeight > smHeight)) { newFontSize -= 0.05; textWidth = (0, helper_functions_1.GetTextWidth)(exports.fontFamily, "".concat(newFontSize, "em"), label, "".concat(cssStyle), "".concat(smHeight, "px"), "".concat(useML ? 'normal' : undefined), "".concat(smWidth - nonTextualWidth, "px")); textHeight = (0, helper_functions_1.GetTextHeight)(exports.fontFamily, "".concat(newFontSize, "em"), label, "".concat(cssStyle), "".concat(smWidth - nonTextualWidth, "px"), "".concat(useML ? 'normal' : undefined)); useML = false; // Consider special case when width is limiting but height is available if (textWidth >= (smWidth - nonTextualWidth) && textHeight < smHeight) { useML = true; textHeight = (0, helper_functions_1.GetTextHeight)(exports.fontFamily, "".concat(newFontSize, "em"), label, "".concat(cssStyle), "".concat(smWidth - nonTextualWidth, "px"), "".concat(useML ? 'normal' : undefined)); textWidth = (0, helper_functions_1.GetTextWidth)(exports.fontFamily, "".concat(newFontSize, "em"), label, "".concat(cssStyle), "".concat(smHeight, "px"), "".concat(useML ? 'normal' : undefined), "".concat(smWidth - nonTextualWidth, "px")); } } if (newFontSize < smallestFont) { smallestFont = newFontSize; isMultiLine = useML; } }; var lineLegendArray = _.orderBy(legendArray.filter(function (legend) { var _a, _b; return (!props.HideDisabled || ((_b = (_a = legend === null || legend === void 0 ? void 0 : legend.props) === null || _a === void 0 ? void 0 : _a.enabled) !== null && _b !== void 0 ? _b : false)) && (legend === null || legend === void 0 ? void 0 : legend.type) === LineLegend_1.default; }), function (item) { var _a, _b, _c; return (_c = (_b = (_a = item === null || item === void 0 ? void 0 : item.props) === null || _a === void 0 ? void 0 : _a.label) === null || _b === void 0 ? void 0 : _b.length) !== null && _c !== void 0 ? _c : 0; }, ['desc']); if (lineLegendArray.length > 0) findSizing((_b = (_a = lineLegendArray[0]) === null || _a === void 0 ? void 0 : _a.props) === null || _b === void 0 ? void 0 : _b.label); // Find if we have a heat legend var heatIndex = legendArray.findIndex(function (legend) { var _a, _b; return (props.HideDisabled && !((_b = (_a = legend === null || legend === void 0 ? void 0 : legend.props) === null || _a === void 0 ? void 0 : _a.enabled) !== null && _b !== void 0 ? _b : false)) && (legend === null || legend === void 0 ? void 0 : legend.type) === HeatLegend_1.default; }); // HeatLegend is considered a "large" element if (heatIndex >= 0) setNeeded('lg', 50); if (heatIndex >= 0 && heatWidth > lgWidthNeeded) lgWidthNeeded = heatWidth; var smTotal = (smWidthNeeded + scrollBarSpace) * (props.location === 'bottom' ? itemsWhenBottom : 1) + leftPad; var lgTotal = lgWidthNeeded + leftPad + scrollBarSpace; return [smallestFont, isMultiLine, Math.max(smTotal, lgTotal)]; }, [graphContext.DataGuid, props.HideDisabled, lgWidth, smWidth, smHeight, lgHeight, leftPad, props.location, scrollBarSpace]), 3), smallestFontSize = _b[0], useMultiLine = _b[1], requiredWidth = _b[2]; var legendContextValue = React.useMemo(function () { return { SmWidth: smWidth, LgWidth: lgWidth, SmHeight: smHeight, LgHeight: lgHeight, SmallestFontSize: smallestFontSize, UseMultiLine: useMultiLine, SendMassEnable: massEnableRef }; }, [smallestFontSize, smHeight, lgHeight, smWidth, smHeight, useMultiLine]); React.useEffect(function () { if (props.RequestLegendHeight !== undefined && requiredHeight !== height) props.RequestLegendHeight(requiredHeight); }, [requiredHeight, height]); React.useEffect(function () { if (props.RequestLegendWidth !== undefined && requiredWidth !== width) props.RequestLegendWidth(requiredWidth); }, [requiredWidth, width]); React.useEffect(function () { massEnableRef.current = function (triggerId) { var isMassDisable = __spreadArray([], __read(graphContext.Data.current.values()), false).some(function (dataSeries) { var _a, _b, _c, _d; return (((_b = (_a = dataSeries === null || dataSeries === void 0 ? void 0 : dataSeries.legend) === null || _a === void 0 ? void 0 : _a.props) === null || _b === void 0 ? void 0 : _b.enabled) && (((_d = (_c = dataSeries === null || dataSeries === void 0 ? void 0 : dataSeries.legend) === null || _c === void 0 ? void 0 : _c.props) === null || _d === void 0 ? void 0 : _d.id) !== triggerId)); }); props.SendMassCommand({ requester: triggerId, command: isMassDisable ? "disable-others" : "enable-all" }); }; }, [graphContext.DataGuid, props.SendMassCommand]); return (React.createElement(LegendContext_1.LegendContext.Provider, { value: legendContextValue }, React.createElement("div", { style: { height: height, width: width, paddingLeft: "".concat(leftPad, "px"), position: (props.location === 'bottom' ? 'absolute' : 'relative'), float: props.location, display: 'flex', flexWrap: 'wrap', bottom: 0, overflowY: requiredHeight > height ? 'scroll' : 'hidden', overflowX: requiredHeight > height ? 'visible' : 'hidden', cursor: 'default' } }, __spreadArray([], __read(graphContext.Data.current.values()), false).map(function (series, index) { var _a, _b; return (series.legend !== undefined && (!props.HideDisabled || ((_a = series.legend.props.enabled) !== null && _a !== void 0 ? _a : true)) ? React.createElement("div", { key: index, "data-html2canvas-ignore": !((_b = series.legend.props.enabled) !== null && _b !== void 0 ? _b : true) }, series.legend) : null); })))); } exports.default = React.memo(Legend); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTGVnZW5kLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0xlZ2VuZC50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHlHQUF5RztBQUN6RyxxQkFBcUI7QUFDckIsRUFBRTtBQUNGLHFFQUFxRTtBQUNyRSxFQUFFO0FBQ0Ysd0dBQXdHO0FBQ3hHLHdHQUF3RztBQUN4RyxzR0FBc0c7QUFDdEcsd0ZBQXdGO0FBQ3hGLEVBQUU7QUFDRiwwQ0FBMEM7QUFDMUMsRUFBRTtBQUNGLHdHQUF3RztBQUN4Ryx3R0FBd0c7QUFDeEcsNEVBQTRFO0FBQzVFLEVBQUU7QUFDRiw4QkFBOEI7QUFDOUIsd0dBQXdHO0FBQ3hHLDJCQUEyQjtBQUMzQixtREFBbUQ7QUFDbkQsRUFBRTtBQUNGLHlHQUF5Rzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUV6Ryw2QkFBK0I7QUFDL0IsMEJBQTRCO0FBQzVCLCtDQUE4QztBQUM5QyxpREFBZ0U7QUFDaEUsbUVBQWdHO0FBQ2hHLDJDQUFzQztBQUN0QywyQ0FBc0M7QUFjdEMsSUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFDO0FBQ3RCLElBQU0sZUFBZSxHQUFHLENBQUMsQ0FBQztBQUUxQiwwREFBMEQ7QUFDN0MsUUFBQSxVQUFVLEdBQUcsYUFBYSxDQUFBO0FBQ3ZDLElBQU0sZUFBZSxHQUFHLEVBQUUsQ0FBQztBQUMzQixJQUFNLFFBQVEsR0FBRyw0RkFBcUYsa0JBQVUsTUFBRyxDQUFDO0FBRXBILHFCQUFxQjtBQUNyQixJQUFNLFNBQVMsR0FBRyxFQUFFLENBQUM7QUFFckIsU0FBUyxNQUFNLENBQUMsS0FBYTtJQUMzQixJQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDLDJCQUFZLENBQUMsQ0FBQztJQUNwRCxJQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQUMsQ0FBUyxJQUFzQixDQUFDLENBQUMsQ0FBQztJQUVoRSxJQUFBLEtBQUEsT0FBMkIsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUM3QyxJQUFNLFdBQVcsR0FBRyx5QkFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsVUFBRSxNQUFNLENBQUMsVUFBQyxDQUFDLEVBQUUsQ0FBQzs7WUFDdEUsSUFBSSxDQUFDLENBQUMsTUFBTSxLQUFLLFNBQVM7Z0JBQUUsT0FBTyxDQUFDLENBQUM7WUFDckMsSUFBSSxLQUFLLENBQUMsWUFBWSxJQUFJLENBQUMsQ0FBQyxNQUFBLE1BQUEsTUFBQSxDQUFDLENBQUMsTUFBTSwwQ0FBRSxLQUFLLDBDQUFFLE9BQWtCLG1DQUFJLElBQUksQ0FBQztnQkFBRSxPQUFPLENBQUMsQ0FBQztZQUNuRixJQUFJLENBQUEsTUFBQyxDQUFDLENBQUMsTUFBa0MsMENBQUUsSUFBSSxNQUFLLG9CQUFVO2dCQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7aUJBQzNFLElBQUksQ0FBQSxNQUFDLENBQUMsQ0FBQyxNQUFrQywwQ0FBRSxJQUFJLE1BQUssb0JBQVU7Z0JBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztpQkFDaEYsQ0FBQztnQkFDSixDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUNoQixPQUFPLENBQUMsSUFBSSxDQUFDLG9GQUFvRixDQUFDLENBQUE7WUFDcEcsQ0FBQztZQUNELE9BQU8sQ0FBQyxDQUFDO1FBQ1gsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNyQixPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRSxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDMUMsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsSUFBQSxFQWJ4QyxVQUFVLFFBQUEsRUFBRSxVQUFVLFFBYWtCLENBQUM7SUFFaEQsSUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JELElBQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO0lBQzNFLElBQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxRQUFRLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBRTdFLElBQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEdBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDakksSUFBTSxRQUFRLEdBQUcsUUFBUSxHQUFHLENBQUMsS0FBSyxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEUsSUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsR0FBRyxVQUFVLEdBQUcsUUFBUSxDQUFDO0lBQ3JJLElBQU0sY0FBYyxHQUFHLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBQSxvQ0FBaUIsR0FBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJ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