@gpa-gemstone/react-graph
Version:
Interactive UI Components for GPA products
176 lines • 20.1 kB
JavaScript
;
// ******************************************************************************************************
// 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 useLegend_1 = require("./Hooks/useLegend");
var Pill = function (props) {
var _a, _b;
var context = React.useContext(GraphContext_1.GraphContext);
var _c = __read(React.useState(""), 2), guid = _c[0], setGuid = _c[1];
var _d = __read(React.useState(1), 2), textSize = _d[0], setTextSize = _d[1];
var _e = (0, useLegend_1.default)(props.Color, 'solid', guid, false, props.Legend), localEnabled = _e.enabled, createLegend = _e.createLegend;
var enabled = (_a = props.Enabled) !== null && _a !== void 0 ? _a : localEnabled;
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]);
// Function to get the maximum Y value within the pill's X range
var getMax = React.useCallback(function (tDomain) {
if (!enabled)
return Infinity;
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[0], props.XData[1], props.YData[0], props.YData[1], enabled]);
// Function to get the minimum Y value within the pill's X range
var getMin = React.useCallback(function (tDomain) {
if (!enabled)
return -Infinity;
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[0], props.XData[1], props.YData[0], props.YData[1], enabled]);
var createContextData = React.useCallback(function () {
{
return {
axis: props.Axis,
legend: createLegend(),
getMax: getMax,
getMin: getMin,
enabled: enabled,
getPoints: function () { return []; }
};
}
}, [props.Axis, getMax, getMin, createLegend]);
// Update data series information in the graph context based on circle properties
React.useEffect(function () {
if (guid === "")
return;
context.UpdateData(guid, createContextData());
}, [guid, createContextData]);
// Add a new data series on component mount / removing on unmount
React.useEffect(function () {
var id = context.AddData(createContextData());
setGuid(id);
return function () { return 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;
if (!enabled)
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: (_b = props.TextColor) !== null && _b !== void 0 ? _b : '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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGlsbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9QaWxsLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEseUdBQXlHO0FBQ3pHLG1CQUFtQjtBQUNuQixFQUFFO0FBQ0YscUVBQXFFO0FBQ3JFLEVBQUU7QUFDRix3R0FBd0c7QUFDeEcsd0dBQXdHO0FBQ3hHLHNHQUFzRztBQUN0Ryx3RkFBd0Y7QUFDeEYsRUFBRTtBQUNGLDBDQUEwQztBQUMxQyxFQUFFO0FBQ0Ysd0dBQXdHO0FBQ3hHLHdHQUF3RztBQUN4Ryw0RUFBNEU7QUFDNUUsRUFBRTtBQUNGLDhCQUE4QjtBQUM5Qix3R0FBd0c7QUFDeEcsaUNBQWlDO0FBQ2pDLG1EQUFtRDtBQUNuRCxFQUFFO0FBQ0YseUdBQXlHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHekcsbUVBQTZFO0FBQzdFLDZCQUErQjtBQUMvQiwrQ0FBaUg7QUFDakgsK0NBQTBDO0FBMEYxQyxJQUFNLElBQUksR0FBRyxVQUFDLEtBQWE7O0lBQ3ZCLElBQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsMkJBQVksQ0FBQyxDQUFDO0lBRXpDLElBQUEsS0FBQSxPQUFrQixLQUFLLENBQUMsUUFBUSxDQUFTLEVBQUUsQ0FBQyxJQUFBLEVBQTNDLElBQUksUUFBQSxFQUFFLE9BQU8sUUFBOEIsQ0FBQztJQUM3QyxJQUFBLEtBQUEsT0FBMEIsS0FBSyxDQUFDLFFBQVEsQ0FBUyxDQUFDLENBQUMsSUFBQSxFQUFsRCxRQUFRLFFBQUEsRUFBRSxXQUFXLFFBQTZCLENBQUM7SUFFcEQsSUFBQSxLQUF3QyxJQUFBLG1CQUFTLEVBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQXhGLFlBQVksYUFBQSxFQUFFLFlBQVksa0JBQThELENBQUM7SUFFekcsSUFBTSxPQUFPLEdBQUcsTUFBQSxLQUFLLENBQUMsT0FBTyxtQ0FB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