@gpa-gemstone/react-graph
Version:
Interactive UI Components for GPA products
191 lines • 23.4 kB
JavaScript
;
// ******************************************************************************************************
// ContextlessLegend.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;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Legend = exports.fontFamily = void 0;
var React = require("react");
var _ = require("lodash");
var LegendContext_1 = require("./LegendContext");
var helper_functions_1 = require("@gpa-gemstone/helper-functions");
var DataLegend_1 = require("./DataLegend");
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;
exports.Legend = React.memo(function (props) {
var massEnableRef = React.useRef(function (_) { });
var _a = __read(React.useMemo(function () {
var newNLegends = props.LegendElements.reduce(function (s, c) {
var _a, _b, _c;
if (c === undefined)
return s;
if (((_a = props.HideDisabled) !== null && _a !== void 0 ? _a : false) && !((_c = (_b = c === null || c === void 0 ? void 0 : c.props) === null || _b === void 0 ? void 0 : _b.enabled) !== null && _c !== void 0 ? _c : true))
return s;
if ((c === null || c === void 0 ? void 0 : c.type) === DataLegend_1.default)
s.sm = s.sm + 1;
else if ((c === null || c === void 0 ? void 0 : c.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];
}, [props.LegendElements, props.HideDisabled]), 2), nLegendsSm = _a[0], nLegendsLg = _a[1];
var leftPad = props.orientation === 'horizontal' ? 39 : 0;
var smHeight = props.orientation === 'horizontal' ? itemHeight : Math.max(props.height / (Math.max(nLegendsSm + nLegendsLg, 1)), itemHeight);
var lgHeight = smHeight * (props.orientation === 'horizontal' ? 2 : 1);
var requiredHeight = Math.ceil(nLegendsSm / (props.orientation === 'horizontal' ? itemsWhenBottom : 1)) * smHeight + nLegendsLg * lgHeight;
var scrollBarSpace = (requiredHeight > props.height ? (0, helper_functions_1.GetScrollbarWidth)() : 0);
var smWidth = ((props.width - leftPad) / (props.orientation === 'horizontal' ? itemsWhenBottom : 1)) - scrollBarSpace;
var lgWidth = props.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 = props.LegendElements;
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"));
// DataLegend 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 dataLegendArray = _.orderBy(legendArray.filter(function (legend) {
var _a, _b, _c;
return (!((_a = props.HideDisabled) !== null && _a !== void 0 ? _a : false) || ((_c = (_b = legend === null || legend === void 0 ? void 0 : legend.props) === null || _b === void 0 ? void 0 : _b.enabled) !== null && _c !== void 0 ? _c : false)) &&
(legend === null || legend === void 0 ? void 0 : legend.type) === DataLegend_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 (dataLegendArray.length > 0)
findSizing((_b = (_a = dataLegendArray[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, _c;
return (((_a = props.HideDisabled) !== null && _a !== void 0 ? _a : false) && !((_c = (_b = legend === null || legend === void 0 ? void 0 : legend.props) === null || _b === void 0 ? void 0 : _b.enabled) !== null && _c !== void 0 ? _c : 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.orientation === 'horizontal' ? itemsWhenBottom : 1) + leftPad;
var lgTotal = lgWidthNeeded + leftPad + scrollBarSpace;
return [smallestFont, isMultiLine, Math.max(smTotal, lgTotal)];
}, [props.LegendElements, props.HideDisabled, lgWidth, smWidth, smHeight, lgHeight, leftPad, props.orientation, 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 !== props.height)
props.RequestLegendHeight(requiredHeight);
}, [requiredHeight, props.height]);
React.useEffect(function () {
if (props.RequestLegendWidth !== undefined && requiredWidth !== props.width)
props.RequestLegendWidth(requiredWidth);
}, [requiredWidth, props.width]);
React.useEffect(function () {
massEnableRef.current = function (triggerId) {
var isMassDisable = props.LegendElements.some(function (element) { var _a, _b; return (((_a = element === null || element === void 0 ? void 0 : element.props) === null || _a === void 0 ? void 0 : _a.enabled) && (((_b = element === null || element === void 0 ? void 0 : element.props) === null || _b === void 0 ? void 0 : _b.id) !== triggerId)); });
if (props.SendMassCommand != null)
props.SendMassCommand({ requester: triggerId, command: isMassDisable ? "disable-others" : "enable-all" });
};
}, [props.LegendElements, props.SendMassCommand]);
return (React.createElement(LegendContext_1.LegendContext.Provider, { value: legendContextValue },
React.createElement("div", { style: {
height: props.height,
width: props.width,
paddingLeft: "".concat(leftPad, "px"),
position: (props.orientation === 'horizontal' ? 'absolute' : 'relative'),
float: (props.orientation === 'horizontal' ? 'bottom' : 'right'),
display: 'flex',
flexWrap: 'wrap',
bottom: 0,
overflowY: requiredHeight > props.height ? 'scroll' : 'hidden',
overflowX: requiredHeight > props.height ? 'visible' : 'hidden',
cursor: 'default'
} }, props.LegendElements.map(function (element, index) {
var _a, _b, _c;
return (element !== undefined && (!((_a = props.HideDisabled) !== null && _a !== void 0 ? _a : false) || ((_b = element.props.enabled) !== null && _b !== void 0 ? _b : true)) ?
React.createElement("div", { key: index, "data-html2canvas-ignore": !((_c = element.props.enabled) !== null && _c !== void 0 ? _c : true) }, element) : null);
}))));
});
exports.default = exports.Legend;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTGVnZW5kLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL0xlZ2VuZC50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHlHQUF5RztBQUN6RyxnQ0FBZ0M7QUFDaEMsRUFBRTtBQUNGLHFFQUFxRTtBQUNyRSxFQUFFO0FBQ0Ysd0dBQXdHO0FBQ3hHLHdHQUF3RztBQUN4RyxzR0FBc0c7QUFDdEcsd0ZBQXdGO0FBQ3hGLEVBQUU7QUFDRiwwQ0FBMEM7QUFDMUMsRUFBRTtBQUNGLHdHQUF3RztBQUN4Ryx3R0FBd0c7QUFDeEcsNEVBQTRFO0FBQzVFLEVBQUU7QUFDRiw4QkFBOEI7QUFDOUIsd0dBQXdHO0FBQ3hHLDJCQUEyQjtBQUMzQixtREFBbUQ7QUFDbkQsRUFBRTtBQUNGLHlHQUF5Rzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUV6Ryw2QkFBK0I7QUFDL0IsMEJBQTRCO0FBQzVCLGlEQUFnRTtBQUNoRSxtRUFBZ0c7QUFDaEcsMkNBQXNDO0FBQ3RDLDJDQUFzQztBQWF0QyxJQUFNLFVBQVUsR0FBRyxFQUFFLENBQUM7QUFDdEIsSUFBTSxlQUFlLEdBQUcsQ0FBQyxDQUFDO0FBRTFCLDBEQUEwRDtBQUM3QyxRQUFBLFVBQVUsR0FBRyxhQUFhLENBQUE7QUFDdkMsSUFBTSxlQUFlLEdBQUcsRUFBRSxDQUFDO0FBQzNCLElBQU0sUUFBUSxHQUFHLDRGQUFxRixrQkFBVSxNQUFHLENBQUM7QUFFcEgscUJBQXFCO0FBQ3JCLElBQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQztBQUVSLFFBQUEsTUFBTSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBQyxLQUFhO0lBQzdDLElBQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBQyxDQUFTLElBQXNCLENBQUMsQ0FBQyxDQUFDO0lBRWhFLElBQUEsS0FBQSxPQUEyQixLQUFLLENBQUMsT0FBTyxDQUFDO1FBQzdDLElBQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUMsTUFB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