UNPKG

@gpa-gemstone/react-graph

Version:
165 lines 18.4 kB
"use strict"; // ****************************************************************************************************** // Pill.tsx - Gbtc // // Copyright © 2024, 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: // ---------------------------------------------------------------------------------------------------- // 09/03/2024 - Preston Crawford // 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 }); var helper_functions_1 = require("@gpa-gemstone/helper-functions"); var React = require("react"); var GraphContext_1 = require("./GraphContext"); var Pill = function (props) { var _a; var context = React.useContext(GraphContext_1.GraphContext); var _b = __read(React.useState(""), 2), guid = _b[0], setGuid = _b[1]; var _c = __read(React.useState(1), 2), textSize = _c[0], setTextSize = _c[1]; var pxHeight = React.useMemo(function () { var axis = GraphContext_1.AxisMap.get(props.Axis); var y0px = context.YTransformation(props.YData[0], axis); var y1px = context.YTransformation(props.YData[1], axis); return Math.abs(y1px - y0px); }, [context.YTransformation, props.YData, props.Axis, context.UpdateFlag]); var pxWidth = React.useMemo(function () { return Math.abs(context.XTransformation(props.XData[1]) - context.XTransformation(props.XData[0])); }, [context.XTransformation, props.XData, context.UpdateFlag]); var radius = React.useMemo(function () { return Math.min(pxHeight / 2, pxWidth / 2, props.RadiusPX); }, [pxHeight, pxWidth, props.RadiusPX]); var getMax = React.useCallback(function (tDomain) { var _a = __read(tDomain, 2), t0 = _a[0], t1 = _a[1]; var _b = __read(props.XData, 2), x1 = _b[0], x2 = _b[1]; if (t1 >= x1 && t0 <= x2) return Math.max(props.YData[0], props.YData[1]); return undefined; }, [props.XData, props.YData]); var getMin = React.useCallback(function (tDomain) { var _a = __read(tDomain, 2), t0 = _a[0], t1 = _a[1]; var _b = __read(props.XData, 2), x1 = _b[0], x2 = _b[1]; if (t1 >= x1 && t0 <= x2) return Math.min(props.YData[0], props.YData[1]); return undefined; }, [props.XData, props.YData]); // Update data series information in the graph context based on circle properties React.useEffect(function () { if (guid === "") return; context.UpdateData(guid, { axis: props.Axis, legend: undefined, getMax: getMax, getMin: getMin, }); }, [props.Axis, getMax, getMin, guid]); // Add a new data series on component mount / removing on unmount React.useEffect(function () { var id = context.AddData({ axis: props.Axis, legend: undefined, getMax: getMax, getMin: getMin }); setGuid(id); return function () { context.RemoveData(id); }; }, []); // Adjust text size within the pill to ensure it fits React.useEffect(function () { if (props.Text === undefined) return; var fontFamily = "Segoe UI"; var fontSizeUnit = "em"; var minSize = 0.05; var maxSize = 5; var bestSize = minSize; var calculateTextSize = function (size) { var dX = (0, helper_functions_1.GetTextWidth)(fontFamily, size + fontSizeUnit, props.Text); var dY = (0, helper_functions_1.GetTextHeight)(fontFamily, size + fontSizeUnit, props.Text); return { dX: dX, dY: dY }; }; while (maxSize - minSize > 0.01) { var midSize = (maxSize + minSize) / 2; var _a = calculateTextSize(midSize), dX = _a.dX, dY = _a.dY; if (dX <= pxWidth && dY <= pxHeight) { bestSize = midSize; minSize = midSize; // Try larger } else maxSize = midSize; // Try smaller } setTextSize(bestSize); }, [props.Text, pxHeight, pxWidth, context.UpdateFlag]); // Set up a click handler if provided in props React.useEffect(function () { if (guid === "" || props.OnClick === undefined) return; context.UpdateSelect(guid, { onClick: onClick }); }, [props.OnClick, context.UpdateFlag]); // Handle click events on the pill var onClick = React.useCallback(function (xClick, yClick) { if (props.OnClick === undefined) return; // Calculate positions and determine if the click was within the pill bounds var _a = __read(props.XData, 2), x1 = _a[0], x2 = _a[1]; var _b = __read(props.YData, 2), y1 = _b[0], y2 = _b[1]; var isWithinHorizontalBounds = xClick >= x1 && xClick <= x2; var isWithinVerticalBounds = yClick >= y1 && yClick <= y2; if (isWithinHorizontalBounds && isWithinVerticalBounds) props.OnClick(xClick, yClick, { setYDomain: context.SetYDomain, setTDomain: context.SetXDomain }); }, [props.OnClick, props.Axis, props.XData, props.YData, context.XTransformation, context.YTransformation, context.SetXDomain, context.SetYDomain]); var textXPosition = React.useMemo(function () { var xLeft = context.XTransformation(props.XData[0]); var xRight = context.XTransformation(props.XData[1]); var xCenter = (xLeft + xRight) / 2; if (props.TextPlacement == null || props.TextPlacement === 'center') return xCenter; if (props.TextPlacement === 'left') return xLeft; if (props.TextPlacement === 'right') return xRight; return xCenter; }, [context.XTransformation, props.XData, props.TextPlacement, context.UpdateFlag]); // Render null if coordinates are not valid, otherwise render the pill / text if (!isFinite(context.XTransformation((props.XData[0] + props.XData[1]) / 2)) || !isFinite(context.YTransformation(props.YData[0], GraphContext_1.AxisMap.get(props.Axis))) || !isFinite(context.YTransformation(props.YData[1], GraphContext_1.AxisMap.get(props.Axis)))) return null; return (React.createElement("g", null, React.createElement("rect", { x: context.XTransformation(props.XData[0]), width: pxWidth, y: context.YTransformation(props.YData[1], GraphContext_1.AxisMap.get(props.Axis)), height: pxHeight, rx: radius, ry: radius, fill: props.Color, opacity: props.Opacity, stroke: props.BorderColor, strokeWidth: props.BorderThickness, onClick: function (e) { return onClick(e.clientX, e.clientY); } }), props.Text !== undefined ? React.createElement("g", { clipPath: "url(#oval-clip-".concat(guid, ")") }, React.createElement("text", { fill: (_a = props.TextColor) !== null && _a !== void 0 ? _a : 'currentColor', style: { fontSize: textSize + 'em', textAnchor: 'middle', dominantBaseline: 'middle' }, y: (context.YTransformation(props.YData[0], GraphContext_1.AxisMap.get(props.Axis)) + context.YTransformation(props.YData[1], GraphContext_1.AxisMap.get(props.Axis))) / 2, x: textXPosition }, props.Text)) : null)); }; exports.default = Pill; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGlsbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9QaWxsLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEseUdBQXlHO0FBQ3pHLG1CQUFtQjtBQUNuQixFQUFFO0FBQ0YscUVBQXFFO0FBQ3JFLEVBQUU7QUFDRix3R0FBd0c7QUFDeEcsd0dBQXdHO0FBQ3hHLHNHQUFzRztBQUN0Ryx3RkFBd0Y7QUFDeEYsRUFBRTtBQUNGLDBDQUEwQztBQUMxQyxFQUFFO0FBQ0Ysd0dBQXdHO0FBQ3hHLHdHQUF3RztBQUN4Ryw0RUFBNEU7QUFDNUUsRUFBRTtBQUNGLDhCQUE4QjtBQUM5Qix3R0FBd0c7QUFDeEcsaUNBQWlDO0FBQ2pDLG1EQUFtRDtBQUNuRCxFQUFFO0FBQ0YseUdBQXlHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHekcsbUVBQTZFO0FBQzdFLDZCQUErQjtBQUMvQiwrQ0FBaUg7QUFnRmpILElBQU0sSUFBSSxHQUFHLFVBQUMsS0FBYTs7SUFDdkIsSUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQywyQkFBWSxDQUFDLENBQUM7SUFFekMsSUFBQSxLQUFBLE9BQWtCLEtBQUssQ0FBQyxRQUFRLENBQVMsRUFBRSxDQUFDLElBQUEsRUFBM0MsSUFBSSxRQUFBLEVBQUUsT0FBTyxRQUE4QixDQUFDO0lBQzdDLElBQUEsS0FBQSxPQUEwQixLQUFLLENBQUMsUUFBUSxDQUFTLENBQUMsQ0FBQyxJQUFBLEVBQWxELFFBQVEsUUFBQSxFQUFFLFdBQVcsUUFBNkIsQ0FBQztJQUUxRCxJQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO1FBQzNCLElBQU0sSUFBSSxHQUFHLHNCQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQyxJQUFNLElBQUksR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7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