@gpa-gemstone/react-graph 1.0.74 → 1.0.75

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gpa-gemstone/react-graph",
3
- "version": "1.0.74",
3
+ "version": "1.0.75",
4
4
  "description": "Interactive UI Components for GPA products",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",
@@ -45,8 +45,8 @@
45
45
  "typescript": "5.5.3"
46
46
  },
47
47
  "dependencies": {
48
- "@gpa-gemstone/gpa-symbols": "0.0.51",
49
- "@gpa-gemstone/helper-functions": "0.0.41",
48
+ "@gpa-gemstone/gpa-symbols": "0.0.52",
49
+ "@gpa-gemstone/helper-functions": "0.0.42",
50
50
  "html2canvas": "^1.4.1",
51
51
  "lodash": "^4.17.21",
52
52
  "moment": "^2.29.4",
package/lib/Oval.d.ts DELETED
@@ -1,64 +0,0 @@
1
- import { IActionFunctions, AxisIdentifier } from './GraphContext';
2
- export interface IProps {
3
- /**
4
- * Data for the oval and circles:
5
- * [x1, x2, y]
6
- * - x1: The x-coordinate of the left edge of the oval.
7
- * - x2: The x-coordinate of the right edge of the oval.
8
- * - y: The y-coordinate of the center of the oval.
9
- */
10
- Data: [number, number, number];
11
- /**
12
- * Fill color of the oval.
13
- * @type {string}
14
- */
15
- Color: string;
16
- /**
17
- * Color of text in oval.
18
- * @type {string}
19
- */
20
- TextColor?: string;
21
- /**
22
- * The vertical radius of the oval.
23
- * @type {number}
24
- */
25
- Radius: number;
26
- /**
27
- * Stroke color of the oval and circles.
28
- * @optional
29
- * @type {string}
30
- */
31
- BorderColor?: string;
32
- /**
33
- * Stroke thickness of the oval and circles.
34
- * @optional
35
- * @type {number}
36
- */
37
- BorderThickness?: number;
38
- /**
39
- * Optional text to display inside the oval.
40
- * @optional
41
- * @type {string}
42
- */
43
- Text?: string;
44
- /**
45
- * Opacity of the oval and circles.
46
- * @optional
47
- * @type {number}
48
- */
49
- Opacity?: number;
50
- /**
51
- * Axis identifier used for vertical positioning.
52
- * @optional
53
- * @type {AxisIdentifier}
54
- */
55
- Axis?: AxisIdentifier;
56
- /**
57
- * Callback function to handle click events on the oval. Provides action functions to update domains.
58
- * @optional
59
- * @type {(actions: IActionFunctions) => void}
60
- */
61
- OnClick?: (x: number, y: number, actions: IActionFunctions) => void;
62
- }
63
- declare const Oval: (props: IProps) => JSX.Element | null;
64
- export default Oval;
package/lib/Oval.js DELETED
@@ -1,132 +0,0 @@
1
- "use strict";
2
- // ******************************************************************************************************
3
- // Oval.tsx - Gbtc
4
- //
5
- // Copyright © 2024, Grid Protection Alliance. All Rights Reserved.
6
- //
7
- // Licensed to the Grid Protection Alliance (GPA) under one or more contributor license agreements. See
8
- // the NOTICE file distributed with this work for additional information regarding copyright ownership.
9
- // The GPA licenses this file to you under the MIT License (MIT), the "License"; you may not use this
10
- // file except in compliance with the License. You may obtain a copy of the License at:
11
- //
12
- // http://opensource.org/licenses/MIT
13
- //
14
- // Unless agreed to in writing, the subject software distributed under the License is distributed on an
15
- // "AS-IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. Refer to the
16
- // License for the specific language governing permissions and limitations.
17
- //
18
- // Code Modification History:
19
- // ----------------------------------------------------------------------------------------------------
20
- // 09/03/2024 - Preston Crawford
21
- // Generated original version of source code.
22
- //
23
- // ******************************************************************************************************
24
- var __read = (this && this.__read) || function (o, n) {
25
- var m = typeof Symbol === "function" && o[Symbol.iterator];
26
- if (!m) return o;
27
- var i = m.call(o), r, ar = [], e;
28
- try {
29
- while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
30
- }
31
- catch (error) { e = { error: error }; }
32
- finally {
33
- try {
34
- if (r && !r.done && (m = i["return"])) m.call(i);
35
- }
36
- finally { if (e) throw e.error; }
37
- }
38
- return ar;
39
- };
40
- Object.defineProperty(exports, "__esModule", { value: true });
41
- var helper_functions_1 = require("@gpa-gemstone/helper-functions");
42
- var React = require("react");
43
- var GraphContext_1 = require("./GraphContext");
44
- var Oval = function (props) {
45
- var _a;
46
- var context = React.useContext(GraphContext_1.GraphContext);
47
- var _b = __read(React.useState(""), 2), guid = _b[0], setGuid = _b[1];
48
- var _c = __read(React.useState(1), 2), textSize = _c[0], setTextSize = _c[1];
49
- // Update data series information in the graph context based on circle properties
50
- React.useEffect(function () {
51
- if (guid === "")
52
- return;
53
- context.UpdateData(guid, {
54
- axis: props.Axis,
55
- legend: undefined,
56
- getMax: function (t) { return (t[0] < props.Data[0] && t[1] > props.Data[1] ? props.Data[2] : undefined); },
57
- getMin: function (t) { return (t[0] < props.Data[0] && t[1] > props.Data[1] ? props.Data[2] : undefined); },
58
- });
59
- }, [props.Axis, props.Data]);
60
- // Add a new data series on component mount / removing on unmount
61
- React.useEffect(function () {
62
- var id = context.AddData({
63
- axis: props.Axis,
64
- legend: undefined,
65
- getMax: function (t) { return (t[0] < props.Data[0] && t[1] > props.Data[1] ? props.Data[2] : undefined); },
66
- getMin: function (t) { return (t[0] < props.Data[0] && t[1] > props.Data[1] ? props.Data[2] : undefined); },
67
- });
68
- setGuid(id);
69
- return function () {
70
- context.RemoveData(id);
71
- };
72
- }, []);
73
- // Adjust text size within the oval to ensure it fits
74
- React.useEffect(function () {
75
- if (props.Text === undefined)
76
- return;
77
- var fontFamily = "Segoe UI";
78
- var fontSizeUnit = "em";
79
- var ovalWidth = Math.abs(context.XTransformation(props.Data[1]) - context.XTransformation(props.Data[0])) + (2 * props.Radius);
80
- var ovalHeight = 2 * props.Radius;
81
- var minSize = 0.05;
82
- var maxSize = 5;
83
- var bestSize = maxSize;
84
- var calculateTextSize = function (size) {
85
- var dX = (0, helper_functions_1.GetTextWidth)(fontFamily, size + fontSizeUnit, props.Text);
86
- var dY = (0, helper_functions_1.GetTextHeight)(fontFamily, size + fontSizeUnit, props.Text);
87
- return { dX: dX, dY: dY };
88
- };
89
- while (maxSize - minSize > 0.01) {
90
- var midSize = (maxSize + minSize) / 2;
91
- var _a = calculateTextSize(midSize), dX = _a.dX, dY = _a.dY;
92
- if (dX <= ovalWidth && dY <= ovalHeight) {
93
- bestSize = midSize;
94
- minSize = midSize; // Try larger
95
- }
96
- else
97
- maxSize = midSize; // Try smaller
98
- }
99
- setTextSize(bestSize);
100
- }, [props.Text, props.Radius, context.XTransformation, props.Data]);
101
- // Set up a click handler if provided in props
102
- React.useEffect(function () {
103
- if (guid === "" || props.OnClick === undefined)
104
- return;
105
- context.UpdateSelect(guid, { onClick: onClick });
106
- }, [props.OnClick, context.UpdateFlag]);
107
- // Handle click events on the oval
108
- function onClick(xClick, yClick) {
109
- if (props.OnClick === undefined)
110
- return;
111
- // Calculate positions and determine if the click was within the oval bounds
112
- var axis = GraphContext_1.AxisMap.get(props.Axis);
113
- var xClickTransformed = context.XTransformation(xClick);
114
- var yClickTransformed = context.YTransformation(yClick, axis);
115
- var x1Transformed = context.XTransformation(props.Data[0]) - props.Radius;
116
- var x2Transformed = context.XTransformation(props.Data[1]) + props.Radius;
117
- var yTransformed = context.YTransformation(props.Data[2], axis);
118
- var isWithinHorizontalBounds = xClickTransformed >= x1Transformed && xClickTransformed <= x2Transformed;
119
- var isWithinVerticalBounds = yClickTransformed >= yTransformed - props.Radius && yClickTransformed <= yTransformed + props.Radius;
120
- if (isWithinHorizontalBounds && isWithinVerticalBounds)
121
- props.OnClick(xClick, yClick, { setYDomain: context.SetYDomain, setTDomain: context.SetXDomain });
122
- }
123
- // Render null if coordinates are not valid, otherwise render the circle / text
124
- if (!isFinite(context.XTransformation((props.Data[0], props.Data[1]) / 2)) || !isFinite(context.YTransformation(props.Data[2], GraphContext_1.AxisMap.get(props.Axis))))
125
- return null;
126
- return (React.createElement("g", null,
127
- React.createElement("rect", { x: context.XTransformation(props.Data[0]) - props.Radius, y: context.YTransformation(props.Data[2], GraphContext_1.AxisMap.get(props.Axis)) - props.Radius, width: Math.abs(context.XTransformation(props.Data[1]) - context.XTransformation(props.Data[0])) + (2 * props.Radius), height: 2 * props.Radius, rx: props.Radius, ry: props.Radius, fill: props.Color, opacity: props.Opacity, stroke: props.BorderColor, strokeWidth: props.BorderThickness, onClick: function (e) { return onClick(e.clientX, e.clientY); } }),
128
- props.Text !== undefined ?
129
- 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.Data[2], GraphContext_1.AxisMap.get(props.Axis)), x: (context.XTransformation(props.Data[0]) + context.XTransformation(props.Data[1])) / 2 }, props.Text) : null));
130
- };
131
- exports.default = Oval;
132
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3ZhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9PdmFsLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEseUdBQXlHO0FBQ3pHLG1CQUFtQjtBQUNuQixFQUFFO0FBQ0YscUVBQXFFO0FBQ3JFLEVBQUU7QUFDRix3R0FBd0c7QUFDeEcsd0dBQXdHO0FBQ3hHLHNHQUFzRztBQUN0Ryx3RkFBd0Y7QUFDeEYsRUFBRTtBQUNGLDBDQUEwQztBQUMxQyxFQUFFO0FBQ0Ysd0dBQXdHO0FBQ3hHLHdHQUF3RztBQUN4Ryw0RUFBNEU7QUFDNUUsRUFBRTtBQUNGLDhCQUE4QjtBQUM5Qix3R0FBd0c7QUFDeEcsaUNBQWlDO0FBQ2pDLG1EQUFtRDtBQUNuRCxFQUFFO0FBQ0YseUdBQXlHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHekcsbUVBQTZFO0FBQzdFLDZCQUErQjtBQUMvQiwrQ0FBaUg7QUFzRWpILElBQU0sSUFBSSxHQUFHLFVBQUMsS0FBYTs7SUFDdkIsSUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQywyQkFBWSxDQUFDLENBQUM7SUFFekMsSUFBQSxLQUFBLE9BQWtCLEtBQUssQ0FBQyxRQUFRLENBQVMsRUFBRSxDQUFDLElBQUEsRUFBM0MsSUFBSSxRQUFBLEVBQUUsT0FBTyxRQUE4QixDQUFDO0lBQzdDLElBQUEsS0FBQSxPQUEwQixLQUFLLENBQUMsUUFBUSxDQUFTLENBQUMsQ0FBQyxJQUFBLEVBQWxELFFBQVEsUUFBQSxFQUFFLFdBQVcsUUFBNkIsQ0FBQztJQUUxRCxpRkFBaUY7SUFDakYsS0FBSyxDQUFDLFNBQVMsQ0FBQztRQUNaLElBQUksSUFBSSxLQUFLLEVBQUU7WUFDWCxPQUFPO1FBRVgsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUU7WUFDckIsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO1lBQ2hCLE1BQU0sRUFBRSxTQUFTO1lBQ2pCLE1BQU0sRUFBRSxVQUFDLENBQUMsSUFBSyxPQUFBLENB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