@gpa-gemstone/react-graph
Version:
Interactive UI Components for GPA products
129 lines • 14.9 kB
JavaScript
;
// ******************************************************************************************************
// XValueAxis.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:
// ----------------------------------------------------------------------------------------------------
// 10/22/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;
};
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 });
var React = require("react");
var GraphContext_1 = require("./GraphContext");
var helper_functions_1 = require("@gpa-gemstone/helper-functions");
function XValueAxis(props) {
var _a, _b, _c, _d;
var context = React.useContext(GraphContext_1.GraphContext);
var _e = __read(React.useState([]), 2), tick = _e[0], setTick = _e[1];
var _f = __read(React.useState(0), 2), hLabel = _f[0], setHlabel = _f[1];
var _g = __read(React.useState(0), 2), hAxis = _g[0], setHAxis = _g[1];
var _h = __read(React.useState(props.label), 2), title = _h[0], setTitle = _h[1];
var _j = __read(React.useState(0), 2), decimalPlaces = _j[0], setDecimalPlaces = _j[1];
// Adjust space for X Axis labels
React.useEffect(function () {
setHlabel(title != null ? (0, helper_functions_1.GetTextHeight)('Segoe UI', '1em', title) : 0);
}, [title]);
// Adjust axis title
React.useEffect(function () {
var _a;
setTitle((_a = props.label) !== null && _a !== void 0 ? _a : '');
}, [props.label]);
//Calculate ticks
React.useEffect(function () {
var deltaX = context.XDomain[1] - context.XDomain[0];
if (deltaX === 0)
return;
var _a = calculateTickInterval(context.XDomain[0], context.XDomain[1]), tickInterval = _a.tickInterval, decimalPlaces = _a.decimalPlaces;
var startTick = Math.ceil(context.XDomain[0] / tickInterval) * tickInterval;
var endTick = context.XDomain[1];
var newTicks = [];
for (var t = startTick; t <= endTick; t += tickInterval) {
newTicks.push(t);
}
setTick(newTicks);
setDecimalPlaces(decimalPlaces);
}, [context.XDomain]);
//Adjust spacing for tick labels
React.useEffect(function () {
var maxLabelHeight = Math.max.apply(Math, __spreadArray([], __read(tick.map(function (t) { return (0, helper_functions_1.GetTextHeight)('Segoe UI', '1em', formatNumber(t, decimalPlaces)); })), false));
var dX = (isFinite(maxLabelHeight) ? maxLabelHeight : 0) + 12;
setHAxis(dX);
}, [tick, decimalPlaces]);
//Adjust axis height
React.useEffect(function () {
if (hAxis + hLabel !== props.heightAxis)
props.setHeight(hAxis + hLabel);
}, [hAxis, hLabel, props.heightAxis]);
return (React.createElement("g", null,
React.createElement("path", { stroke: "currentColor", style: { strokeWidth: 1 }, d: "M ".concat(props.offsetLeft - (((_a = props.showLeftMostTick) !== null && _a !== void 0 ? _a : true) ? 0 : 8), " ").concat(props.height - props.offsetBottom, " H ").concat(props.width - props.offsetRight + (((_b = props.showRightMostTick) !== null && _b !== void 0 ? _b : true) ? 0 : 8)) }),
((_c = props.showLeftMostTick) !== null && _c !== void 0 ? _c : true) ? (React.createElement("path", { stroke: "currentColor", style: { strokeWidth: 1 }, d: "M ".concat(props.offsetLeft, " ").concat(props.height - props.offsetBottom, " v 8") })) : null,
((_d = props.showRightMostTick) !== null && _d !== void 0 ? _d : true) ? (React.createElement("path", { stroke: "currentColor", style: { strokeWidth: 1 }, d: "M ".concat(props.width - props.offsetRight, " ").concat(props.height - props.offsetBottom, " v 8") })) : null,
(React.createElement(React.Fragment, null,
tick.map(function (l, i) { return (React.createElement("path", { key: i, stroke: "currentColor", style: { strokeWidth: 1, transition: 'd 0.5s' }, d: "M ".concat(context.XTransformation(l), " ").concat(props.height - props.offsetBottom + 6, " v -6") })); }),
tick.map(function (l, i) { return (React.createElement("text", { fill: "currentColor", key: i, style: { fontSize: '1em', textAnchor: 'middle', dominantBaseline: 'hanging', transition: 'x 0.5s, y 0.5s', }, y: props.height - props.offsetBottom + 8, x: context.XTransformation(l) }, formatNumber(l, decimalPlaces))); }))),
title != null ? (React.createElement("text", { fill: "currentColor", style: { fontSize: '1em', textAnchor: 'middle', dominantBaseline: 'middle' }, x: props.offsetLeft + (props.width - props.offsetLeft - props.offsetRight) / 2, y: props.height - props.offsetBottom + hAxis }, title)) : null));
}
//helper functions
var formatNumber = function (value, decimalPlaces) {
return value.toFixed(decimalPlaces);
};
var calculateTickInterval = function (min, max) {
var range = max - min;
var desiredTicks = 7;
var rawTickInterval = range / desiredTicks;
var exponent = Math.floor(Math.log10(rawTickInterval));
var fraction = rawTickInterval / Math.pow(10, exponent);
var niceFraction;
if (fraction <= 1)
niceFraction = 1;
else if (fraction <= 2)
niceFraction = 2;
else if (fraction <= 5)
niceFraction = 5;
else
niceFraction = 10;
var tickInterval = niceFraction * Math.pow(10, exponent);
var decimalPlaces = Math.max(0, -Math.floor(Math.log10(tickInterval)));
return { tickInterval: tickInterval, decimalPlaces: decimalPlaces };
};
exports.default = React.memo(XValueAxis);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiWFZhbHVlQXhpcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9YVmFsdWVBeGlzLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEseUdBQXlHO0FBQ3pHLHlCQUF5QjtBQUN6QixFQUFFO0FBQ0YscUVBQXFFO0FBQ3JFLEVBQUU7QUFDRix3R0FBd0c7QUFDeEcsd0dBQXdHO0FBQ3hHLHNHQUFzRztBQUN0Ryx3RkFBd0Y7QUFDeEYsRUFBRTtBQUNGLDBDQUEwQztBQUMxQyxFQUFFO0FBQ0Ysd0dBQXdHO0FBQ3hHLHdHQUF3RztBQUN4Ryw0RUFBNEU7QUFDNUUsRUFBRTtBQUNGLDhCQUE4QjtBQUM5Qix3R0FBd0c7QUFDeEcsaUNBQWlDO0FBQ2pDLG1EQUFtRDtBQUNuRCxFQUFFO0FBQ0YseUdBQXlHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFekcsNkJBQStCO0FBQy9CLCtDQUE4QztBQUM5QyxtRUFBK0Q7QUFlL0QsU0FBUyxVQUFVLENBQUMsS0FBYTs7SUFDN0IsSUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQywyQkFBWSxDQUFDLENBQUM7SUFDekMsSUFBQSxLQUFBLE9BQWtCLEtBQUssQ0FBQyxRQUFRLENBQVcsRUFBRSxDQUFDLElBQUEsRUFBN0MsSUFBSSxRQUFBLEVBQUUsT0FBTyxRQUFnQyxDQUFDO0lBQy9DLElBQUEsS0FBQSxPQUFzQixLQUFLLENBQUMsUUFBUSxDQUFTLENBQUMsQ0FBQyxJQUFBLEVBQTlDLE1BQU0sUUFBQSxFQUFFLFNBQVMsUUFBNkIsQ0FBQztJQUNoRCxJQUFBLEtBQUEsT0FBb0IsS0FBSyxDQUFDLFFBQVEsQ0FBUyxDQUFDLENBQUMsSUFBQSxFQUE1QyxLQUFLLFFBQUEsRUFBRSxRQUFRLFFBQTZCLENBQUM7SUFDOUMsSUFBQSxLQUFBLE9BQW9CLEtBQUssQ0FBQyxRQUFRLENBQXFCLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBQSxFQUFsRSxLQUFLLFFBQUEsRUFBRSxR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