@gpa-gemstone/react-graph
Version:
Interactive UI Components for GPA products
229 lines • 26.6 kB
JavaScript
;
// ******************************************************************************************************
// ValueAxis.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;
};
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 ValueAxis(props) {
var context = React.useContext(GraphContext_1.GraphContext);
var _a = __read(React.useState([]), 2), ticks = _a[0], setTicks = _a[1];
var _b = __read(React.useState(1), 2), tickFontSize = _b[0], setTickFontSize = _b[1];
var _c = __read(React.useState(0), 2), labelHeight = _c[0], setLabelHeight = _c[1];
var _d = __read(React.useState(1), 2), labelFontSize = _d[0], setLabelFontSize = _d[1];
var _e = __read(React.useState(0), 2), hAxis = _e[0], setHAxis = _e[1];
var _f = __read(React.useState(1), 2), nDigits = _f[0], setNdigits = _f[1];
var _g = __read(React.useState(1), 2), factor = _g[0], setFactor = _g[1];
//Effect to set the ticks
React.useEffect(function () {
var axis = GraphContext_1.AxisMap.get(props.axis);
var dY = context.YDomain[axis][1] - context.YDomain[axis][0];
if (!isFinite(dY) || isNaN(dY)) {
setTicks([]);
return;
}
var newTicks;
if (dY === 0) {
newTicks = [context.YDomain[axis][0]];
}
else {
var exp = 0;
while ((dY * Math.pow(10, exp)) < 1) {
exp = exp + 1;
}
while ((dY * Math.pow(10, exp)) > 10) {
exp = exp - 1;
}
var scale = 1.0 / Math.pow(10, exp);
if (dY * Math.pow(10, exp) < 6 && dY * Math.pow(10, exp) >= 2.5)
scale = 0.5 / Math.pow(10, exp);
if (dY * Math.pow(10, exp) < 2.5 && dY * Math.pow(10, exp) >= 1.2)
scale = 0.2 / Math.pow(10, exp);
if (dY * Math.pow(10, exp) < 1.2)
scale = 0.1 / Math.pow(10, exp);
var offset = Math.floor(context.YDomain[axis][0] / scale) * scale;
newTicks = [offset + scale];
while (newTicks[newTicks.length - 1] < (context.YDomain[axis][1] - scale))
newTicks.push(newTicks[newTicks.length - 1] + scale);
}
setTicks(newTicks);
}, [context.YDomain, props.useFactor, props.axis, props.height]);
React.useEffect(function () {
if (ticks.length === 0)
return;
// Use first tick as they should all be same height
var sampleLabel = (ticks[0] * factor).toFixed(nDigits);
var availableHeightPerTick = props.height / ticks.length;
var newFontSize = 1;
var sampleHeight = (0, helper_functions_1.GetTextHeight)('Segoe UI', newFontSize + 'em', sampleLabel);
// Decrease font size until we fit, down to a mini of 0.5em.
while (sampleHeight > availableHeightPerTick && newFontSize > 0.5) {
newFontSize = newFontSize - 0.05;
sampleHeight = (0, helper_functions_1.GetTextHeight)('Segoe UI', newFontSize + 'em', sampleLabel);
}
setTickFontSize(newFontSize);
}, [ticks, factor, nDigits, props.height]);
//Effect to set the factor
React.useEffect(function () {
if (!props.useFactor) {
setFactor(1);
return;
}
var axis = GraphContext_1.AxisMap.get(props.axis);
var dY = context.YDomain[axis][1] - context.YDomain[axis][0];
var expF = 0;
var Ymax = Math.max(Math.abs(context.YDomain[axis][0]), Math.abs(context.YDomain[axis][1]));
while ((Ymax * Math.pow(10, expF)) < 1) {
expF = expF + 1;
}
while ((Ymax * Math.pow(10, expF)) > 10) {
expF = expF - 1;
}
expF = Math.sign(expF) * (Math.floor(Math.abs(expF) / 3)) * 3;
// adjust to avoid same value on axis scenario
if (dY * Math.pow(10, expF) < 0.1 && dY !== 0)
expF = expF + 3;
setFactor(Math.pow(10, expF));
}, [context.YDomain, props.useFactor, props.axis]);
//Effect to set nDigitss
React.useEffect(function () {
var axis = GraphContext_1.AxisMap.get(props.axis);
var dY = context.YDomain[axis][1] - context.YDomain[axis][0];
dY = dY * factor;
if (dY === 0)
dY = Math.abs(context.YDomain[axis][0] * factor);
if (dY >= 15)
setNdigits(0);
if (dY < 15 && dY >= 1.5)
setNdigits(1);
if (dY < 1.5 && dY >= 0.15)
setNdigits(2);
if (dY < 0.15)
setNdigits(3);
if (dY < 0.015)
setNdigits(4);
if (dY < 0.0015)
setNdigits(5);
if (dY === 0)
setNdigits(2);
}, [factor, context.YDomain, props.axis]);
React.useEffect(function () {
var h = 0;
if (factor !== 1)
h = (0, helper_functions_1.GetTextHeight)("Segoe UI", '1em', 'x' + (1 / factor).toString());
if (h !== props.hFactor)
props.setHeightFactor(h);
}, [factor, props.hFactor, props.setHeightFactor]);
React.useEffect(function () {
if (props.label === undefined) {
setLabelHeight(0);
return;
}
var h = (0, helper_functions_1.GetTextHeight)("Segoe UI", labelFontSize + 'em', props.label) + 4;
setLabelHeight(h);
}, [props.label, props.height, props.offsetTop, props.offsetBottom, labelFontSize]);
React.useEffect(function () {
var dY = Math.max.apply(Math, __spreadArray([], __read(ticks.map(function (t) { return (0, helper_functions_1.GetTextWidth)("Segoe UI", '1em', (t * factor).toFixed(nDigits)); })), false));
dY = (isFinite(dY) ? dY : 0) + 8;
if (dY !== hAxis)
setHAxis(dY);
}, [ticks, nDigits]);
React.useEffect(function () {
if (props.hAxis !== hAxis + labelHeight)
props.setWidthAxis(hAxis + labelHeight);
}, [hAxis, labelHeight, props.hAxis]);
// use effect resets us in case this becomes unmounted
React.useEffect(function () {
return function () { return props.setWidthAxis(0); };
}, []);
React.useEffect(function () {
if (props.label === undefined)
return;
var h = (0, helper_functions_1.GetTextWidth)("Segoe UI", '1em', props.label);
var size = 1;
while (h > props.height && size > 0.1) {
size = size - 0.1;
h = (0, helper_functions_1.GetTextWidth)("Segoe UI", size + 'em', props.label);
}
if (labelFontSize !== size)
setLabelFontSize(size);
}, [props.label, props.height]);
var leftPosition = React.useMemo(function () {
if (props.axis === undefined || props.axis === 'left')
return props.offsetLeft;
else
return props.width - props.offsetRight;
}, [props.offsetLeft, props.offsetRight, props.width, props.axis]);
var tickDirection = React.useMemo(function () {
if (props.axis === undefined || props.axis === 'left')
return -1;
else
return 1;
}, [props.axis]);
return (React.createElement("g", null,
React.createElement("path", { stroke: 'currentColor', style: { strokeWidth: 1, transition: 'd 0.5s' }, d: "M ".concat(leftPosition, " ").concat(props.height - props.offsetBottom + 8, " V ").concat(props.offsetTop) }),
React.createElement("path", { stroke: 'currentColor', style: { strokeWidth: 1, transition: 'd 0.5s' }, d: "M ".concat(leftPosition, " ").concat(props.offsetTop, " h ").concat(tickDirection * 8) }),
ticks.map(function (tick, i) {
var _a;
return React.createElement("path", { key: i, stroke: ((props.axis === undefined || props.axis === 'left') ? 'lightgrey' : 'darkgrey'), strokeOpacity: ((_a = props.showGrid) !== null && _a !== void 0 ? _a : false) ? '0.8' : '0.0', style: { strokeWidth: 1, transition: 'd 0.5s' }, d: "M ".concat(props.offsetLeft, " ").concat(context.YTransformation(tick, GraphContext_1.AxisMap.get(props.axis)), " h ").concat(props.width - props.offsetLeft - props.offsetRight) });
}),
ticks.map(function (tick, i) {
return React.createElement("path", { key: i, stroke: 'currentColor', style: { strokeWidth: 1, transition: 'd 1s' }, d: "M ".concat(leftPosition, " ").concat(context.YTransformation(tick, GraphContext_1.AxisMap.get(props.axis)), " h ").concat(tickDirection * 6) });
}),
ticks.map(function (tick, i) {
return React.createElement("text", { fill: 'currentColor', key: i, style: { fontSize: "".concat(tickFontSize, "em"), textAnchor: (props.axis === undefined || props.axis === 'left') ? 'end' : 'start', transition: 'x 0.5s, y 0.5s' }, dominantBaseline: 'middle', x: leftPosition + tickDirection * 8, y: context.YTransformation(tick, GraphContext_1.AxisMap.get(props.axis)) }, (tick * factor).toFixed(nDigits));
}),
props.label !== undefined ?
React.createElement("text", { fill: 'currentColor', style: { fontSize: labelFontSize + 'em', textAnchor: 'middle' }, dominantBaseline: 'text-bottom', transform: "rotate(".concat(tickDirection * 90, ",").concat(leftPosition + tickDirection * (hAxis + 4), ",").concat((props.offsetTop - props.offsetBottom + props.height) / 2.0, ")"), x: leftPosition + tickDirection * (hAxis + 4), y: (props.offsetTop - props.offsetBottom + props.height) / 2.0 }, props.label) : null,
factor !== 1 ?
React.createElement("text", { fill: 'currentColor', style: { fontSize: '1em' }, x: leftPosition, y: props.offsetTop - 5 },
"x",
1 / factor) : null));
}
exports.default = React.memo(ValueAxis);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiWVZhbHVlQXhpcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ZVmFsdWVBeGlzLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUMseUdBQXlHO0FBQzFHLHdCQUF3QjtBQUN4QixFQUFFO0FBQ0YscUVBQXFFO0FBQ3JFLEVBQUU7QUFDRix3R0FBd0c7QUFDeEcsd0dBQXdHO0FBQ3hHLHNHQUFzRztBQUN0Ryx3RkFBd0Y7QUFDeEYsRUFBRTtBQUNGLDBDQUEwQztBQUMxQyxFQUFFO0FBQ0Ysd0dBQXdHO0FBQ3hHLHdHQUF3RztBQUN4Ryw0RUFBNEU7QUFDNUUsRUFBRTtBQUNGLDhCQUE4QjtBQUM5Qix3R0FBd0c7QUFDeEcsMkJBQTJCO0FBQzNCLG1EQUFtRDtBQUNuRCxFQUFFO0FBQ0YseUdBQXlHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFekcsNkJBQStCO0FBQy9CLCtDQUFzRTtBQUN0RSxtRUFBNkU7QUFtQjdFLFNBQVMsU0FBUyxDQUFDLEtBQWE7SUFDOUIsSUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQywyQkFBWSxDQUFDLENBQUE7SUFDeEMsSUFBQSxLQUFBLE9BQW9CLEtBQUssQ0FBQyxRQUFRLENBQVcsRUFBRSxDQUFDLElBQUEsRUFBL0MsS0FBSyxRQUFBLEVBQUUsUUFBUSxRQUFnQyxDQUFDO0lBQ2pELElBQUEsS0FBQSxPQUFrQyxLQUFLLENBQUMsUUFBUSxDQUFTLENBQUMsQ0FBQyxJQUFBLEVBQTFELFlBQVksUUFBQSxFQUFFLGVBQWUsUUFBNkIsQ0FBQztJQUU1RCxJQUFBLEtBQUEsT0FBZ0MsS0FBSyxDQUFDLFFBQVEsQ0FBUyxDQUFDLENBQUMsSUFBQSxFQUF4RCxXQUFXLFFBQUEsRUFBRSxjQUFjLFFBQTZCLENBQUM7SUFDMUQsSUFBQSxLQUFBLE9BQW9DLEtBQUssQ0FBQyxRQUFRLENBQVMsQ0FBQyxDQUFDLElBQUEsRUFBNUQsYUFBYSxRQUFBLEVBQUUsZ0JBQWdCLFFBQTZC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