@gpa-gemstone/react-graph
Version:
Interactive UI Components for GPA products
187 lines • 19.6 kB
JavaScript
;
// ******************************************************************************************************
// Line.tsx - Gbtc
//
// Copyright © 2020, 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/18/2021 - C Lackner
// Generated original version of source code.
//
// ******************************************************************************************************
var __assign = (this && this.__assign) || function () {
__assign = Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
return __assign.apply(this, arguments);
};
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 __values = (this && this.__values) || function(o) {
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
if (m) return m.call(o);
if (o && typeof o.length === "number") return {
next: function () {
if (o && i >= o.length) o = void 0;
return { value: o && o[i++], done: !o };
}
};
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.InternalLine = void 0;
var React = require("react");
var GraphContext_1 = require("./GraphContext");
var moment = require("moment");
var PointNode_1 = require("./PointNode");
var DataLegend_1 = require("./DataLegend");
exports.InternalLine = React.forwardRef(function (props, ref) {
var _a;
/*
Single Line with ability to turn off and on.
*/
var _b = __read(React.useState(""), 2), guid = _b[0], setGuid = _b[1];
var _c = __read(React.useState([NaN, NaN]), 2), highlight = _c[0], setHighlight = _c[1];
var _d = __read(React.useState(true), 2), enabled = _d[0], setEnabled = _d[1];
var _e = __read(React.useState(null), 2), data = _e[0], setData = _e[1];
var context = React.useContext(GraphContext_1.GraphContext);
var showPoints = React.useMemo(function () { var _a, _b, _c; return ((_a = props.showPoints) !== null && _a !== void 0 ? _a : false) || (((_b = props.autoShowPoints) !== null && _b !== void 0 ? _b : true) && ((_c = data === null || data === void 0 ? void 0 : data.GetCount(context.XDomain[0], context.XDomain[1])) !== null && _c !== void 0 ? _c : 1000) <= 100); }, [props.showPoints, props.autoShowPoints, data, context.XDomain]);
var points = React.useMemo(function () { var _a; return (_a = data === null || data === void 0 ? void 0 : data.GetData(context.XDomain[0], context.XDomain[1], true)) !== null && _a !== void 0 ? _a : []; }, [context.XDomain, data]);
React.useImperativeHandle(ref, function () { return data; }, [data]);
var createLegend = React.useCallback(function () {
var _a;
if (props.legend === undefined || guid === "")
return undefined;
var txt = props.legend;
if (((_a = props.highlightHover) !== null && _a !== void 0 ? _a : false) && !isNaN(highlight[0]) && !isNaN(highlight[1]))
txt = txt + " (".concat(moment.utc(highlight[0]).format('MM/DD/YY hh:mm:ss'), ": ").concat(highlight[1].toPrecision(6), ")");
return React.createElement(DataLegend_1.default, { id: guid, label: txt, color: props.color, legendSymbol: props.lineStyle, setEnabled: setEnabled, enabled: enabled, hasNoData: data == null });
}, [props.color, props.lineStyle, enabled, data, props.legend, guid]);
var createContextData = React.useCallback(function () {
return {
legend: createLegend(),
axis: props.axis,
enabled: enabled,
getMax: function (t) { return (data == null || !enabled ? -Infinity : data.GetLimits(t[0], t[1])[1]); },
getMin: function (t) { return (data == null || !enabled ? Infinity : data.GetLimits(t[0], t[1])[0]); },
getPoints: function (t, n) { return (data == null || !enabled ? NaN : data.GetPoints(t, n !== null && n !== void 0 ? n : 1)); }
};
}, [props.axis, enabled, data, createLegend, props.reRender]);
React.useEffect(function () {
if (guid === "")
return;
context.UpdateData(guid, createContextData());
}, [createContextData]);
React.useEffect(function () {
if (data == null || props.data == null || props.data.length === 0 || isNaN(context.XHover))
setHighlight([NaN, NaN]);
else {
try {
var point = data.GetPoint(context.XHover);
if (point != null) {
setHighlight(point);
if (props.onHover != null)
props.onHover(point[0], point[1]);
}
}
catch (_a) {
setHighlight([NaN, NaN]);
}
}
}, [data, context.XHover]);
React.useEffect(function () {
if (context.MassEnableCommand.command === "enable-all")
setEnabled(true);
else if (context.MassEnableCommand.command === "disable-others")
setEnabled(guid === context.MassEnableCommand.requester);
}, [context.MassEnableCommand]);
React.useEffect(function () {
if (props.data == null)
setData(null);
else
setData(new PointNode_1.PointNode(props.data));
}, [props.data]);
React.useEffect(function () {
if (guid === "")
return;
context.SetLegend(guid, createLegend());
}, [highlight, enabled]);
React.useEffect(function () {
var id = context.AddData(createContextData());
setGuid(id);
return function () { context.RemoveData(id); };
}, []);
var generateData = React.useCallback(function (pointsToDraw) {
var e_1, _a;
if (pointsToDraw.length === 0)
return "";
var result = "M ";
var parts = [];
try {
for (var pointsToDraw_1 = __values(pointsToDraw), pointsToDraw_1_1 = pointsToDraw_1.next(); !pointsToDraw_1_1.done; pointsToDraw_1_1 = pointsToDraw_1.next()) {
var _b = __read(pointsToDraw_1_1.value, 2), xVal = _b[0], yVal = _b[1];
if (isNaN(xVal) || isNaN(yVal))
continue;
var x = context.XTransformation(xVal);
var y = context.YTransformation(yVal, GraphContext_1.AxisMap.get(props.axis));
parts.push("".concat(x, ",").concat(y));
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (pointsToDraw_1_1 && !pointsToDraw_1_1.done && (_a = pointsToDraw_1.return)) _a.call(pointsToDraw_1);
}
finally { if (e_1) throw e_1.error; }
}
result += parts.join(" L ");
return result;
}, [context.XTransformation, context.YTransformation, props.axis]);
return (enabled ?
React.createElement("g", null,
React.createElement("path", { d: generateData(points), style: { fill: 'none', strokeWidth: props.width === undefined ? 3 : props.width, stroke: props.color }, strokeDasharray: GraphContext_1.LineMap.get(props.lineStyle) }),
showPoints && data != null ?
points.map(function (pt, i) {
if (isNaN(pt[0]) || isNaN(pt[1]))
return null;
return (React.createElement("circle", { key: i, r: 3, cx: context.XTransformation(pt[0]), cy: context.YTransformation(pt[1], GraphContext_1.AxisMap.get(props.axis)), fill: props.color, stroke: 'currentColor', style: { opacity: 0.8 /*, transition: 'cx 0.5s,cy 0.5s'*/ } }));
})
: null,
((_a = props.highlightHover) !== null && _a !== void 0 ? _a : false) && !isNaN(highlight[0]) && !isNaN(highlight[1]) ?
React.createElement("circle", { r: 5, cx: context.XTransformation(highlight[0]), cy: context.YTransformation(highlight[1], GraphContext_1.AxisMap.get(props.axis)), fill: props.color, stroke: 'currentColor', style: { opacity: 0.8 /*, transition: 'cx 0.5s,cy 0.5s'*/ } })
: null) : null);
});
var Line = function (props) { return React.createElement(exports.InternalLine, __assign({}, props)); };
exports.default = Line;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTGluZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9MaW5lLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEseUdBQXlHO0FBQ3pHLG1CQUFtQjtBQUNuQixFQUFFO0FBQ0YscUVBQXFFO0FBQ3JFLEVBQUU7QUFDRix3R0FBd0c7QUFDeEcsd0dBQXdHO0FBQ3hHLHNHQUFzRztBQUN0Ryx3RkFBd0Y7QUFDeEYsRUFBRTtBQUNGLDBDQUEwQztBQUMxQyxFQUFFO0FBQ0Ysd0dBQXdHO0FBQ3hHLHdHQUF3RztBQUN4Ryw0RUFBNEU7QUFDNUUsRUFBRTtBQUNGLDhCQUE4QjtBQUM5Qix3R0FBd0c7QUFDeEcsMEJBQTBCO0FBQzFCLG1EQUFtRDtBQUNuRCxFQUFFO0FBQ0YseUdBQXlHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUV6Ryw2QkFBK0I7QUFDL0IsK0NBQXdHO0FBQ3hHLCtCQUFpQztBQUNqQyx5Q0FBd0M7QUFDeEMsMkNBQXNDO0FBbUJ6QixRQUFBLFlBQVksR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFrQyxVQUFDLEtBQUssRUFBRSxHQUFHOztJQUNyRjs7TUFFRTtJQUNJLElBQUEsS0FBQSxPQUFrQixLQUFLLENBQUMsUUFBUSxDQUFTLEVBQUUsQ0FBQyxJQUFBLEVBQTNDLElBQUksUUFBQSxFQUFFLE9BQU8sUUFBOEIsQ0FBQztJQUM3QyxJQUFBLEtBQUEsT0FBNEIsS0FBSyxDQUFDLFFBQVEsQ0FBbUIsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsSUFBQSxFQUF2RSxTQUFTLFFBQUEsRUFBRSxZQUFZLFFBQWdELENBQUM7SUFDekUsSUFBQSxLQUFBLE9BQXdCLEtBQUssQ0FBQyxRQUFRLENBQVUsSUFBSSxDQUFDLElBQUEsRUFBcEQsT0FBTyxRQUFBLEVBQUUsVUFBVSxRQUFpQyxDQUFDO0lBQ3RELElBQUEsS0FBQSxPQUFrQixLQUFLLENBQUMsUUFBUSxDQUFtQixJQUFJLENB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