@gpa-gemstone/react-graph
Version:
Interactive UI Components for GPA products
203 lines • 24.4 kB
JavaScript
;
// ******************************************************************************************************
// 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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