@gpa-gemstone/react-graph 1.0.50 → 1.0.52
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/lib/AggregatingCircles.d.ts +16 -17
- package/lib/AggregatingCircles.js +180 -173
- package/lib/Button.d.ts +7 -7
- package/lib/Button.js +33 -33
- package/lib/Circle.d.ts +19 -20
- package/lib/Circle.js +125 -118
- package/lib/GraphContext.d.ts +89 -89
- package/lib/GraphContext.js +140 -140
- package/lib/HeatLegend.d.ts +10 -11
- package/lib/HeatLegend.js +109 -106
- package/lib/HeatMapChart.d.ts +14 -15
- package/lib/HeatMapChart.js +119 -119
- package/lib/HorizontalMarker.d.ts +13 -14
- package/lib/HorizontalMarker.js +110 -110
- package/lib/Infobox.d.ts +17 -17
- package/lib/Infobox.js +180 -180
- package/lib/InteractiveButtons.d.ts +21 -21
- package/lib/InteractiveButtons.js +218 -218
- package/lib/Legend.d.ts +14 -14
- package/lib/Legend.js +117 -117
- package/lib/LegendContext.d.ts +14 -14
- package/lib/LegendContext.js +34 -34
- package/lib/Line.d.ts +14 -15
- package/lib/Line.js +144 -144
- package/lib/LineLegend.d.ts +11 -12
- package/lib/LineLegend.js +97 -97
- package/lib/LineWithThreshold.d.ts +12 -13
- package/lib/LineWithThreshold.js +144 -144
- package/lib/LogAxis.d.ts +20 -20
- package/lib/LogAxis.js +165 -165
- package/lib/Plot.d.ts +38 -37
- package/lib/Plot.js +802 -802
- package/lib/PointNode.d.ts +31 -31
- package/lib/PointNode.js +254 -254
- package/lib/SymbolicMarker.d.ts +17 -17
- package/lib/SymbolicMarker.js +119 -119
- package/lib/TimeAxis.d.ts +18 -18
- package/lib/TimeAxis.js +433 -433
- package/lib/ValueAxis.d.ts +21 -21
- package/lib/ValueAxis.js +196 -192
- package/lib/VerticalMarker.d.ts +14 -15
- package/lib/VerticalMarker.js +111 -111
- package/lib/index.d.ts +13 -13
- package/lib/index.js +27 -27
- package/package.json +4 -4
package/lib/Plot.js
CHANGED
|
@@ -1,802 +1,802 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
// ******************************************************************************************************
|
|
3
|
-
// Plot.tsx - Gbtc
|
|
4
|
-
//
|
|
5
|
-
// Copyright © 2020, 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
|
-
// 03/18/2021 - C Lackner
|
|
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
|
-
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
41
|
-
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
42
|
-
if (ar || !(i in from)) {
|
|
43
|
-
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
44
|
-
ar[i] = from[i];
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
return to.concat(ar || Array.prototype.slice.call(from));
|
|
48
|
-
};
|
|
49
|
-
var __values = (this && this.__values) || function(o) {
|
|
50
|
-
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
|
51
|
-
if (m) return m.call(o);
|
|
52
|
-
if (o && typeof o.length === "number") return {
|
|
53
|
-
next: function () {
|
|
54
|
-
if (o && i >= o.length) o = void 0;
|
|
55
|
-
return { value: o && o[i++], done: !o };
|
|
56
|
-
}
|
|
57
|
-
};
|
|
58
|
-
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
59
|
-
};
|
|
60
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
61
|
-
var React = require("react");
|
|
62
|
-
var _ = require("lodash");
|
|
63
|
-
var InteractiveButtons_1 = require("./InteractiveButtons");
|
|
64
|
-
var GraphContext_1 = require("./GraphContext");
|
|
65
|
-
var helper_functions_1 = require("@gpa-gemstone/helper-functions");
|
|
66
|
-
var lodash_1 = require("lodash");
|
|
67
|
-
var TimeAxis_1 = require("./TimeAxis");
|
|
68
|
-
var LogAxis_1 = require("./LogAxis");
|
|
69
|
-
var ValueAxis_1 = require("./ValueAxis");
|
|
70
|
-
var Legend_1 = require("./Legend");
|
|
71
|
-
var LineWithThreshold_1 = require("./LineWithThreshold");
|
|
72
|
-
var Line_1 = require("./Line");
|
|
73
|
-
var Button_1 = require("./Button");
|
|
74
|
-
var HorizontalMarker_1 = require("./HorizontalMarker");
|
|
75
|
-
var VerticalMarker_1 = require("./VerticalMarker");
|
|
76
|
-
var SymbolicMarker_1 = require("./SymbolicMarker");
|
|
77
|
-
var Circle_1 = require("./Circle");
|
|
78
|
-
var AggregatingCircles_1 = require("./AggregatingCircles");
|
|
79
|
-
var Infobox_1 = require("./Infobox");
|
|
80
|
-
var HeatMapChart_1 = require("./HeatMapChart");
|
|
81
|
-
var _html2canvas = require("html2canvas");
|
|
82
|
-
var html2canvas = _html2canvas;
|
|
83
|
-
var SvgStyle = {
|
|
84
|
-
fill: 'none',
|
|
85
|
-
userSelect: 'none',
|
|
86
|
-
WebkitTouchCallout: 'none',
|
|
87
|
-
WebkitUserSelect: 'none',
|
|
88
|
-
KhtmlUserSelect: 'none',
|
|
89
|
-
MozUserSelect: 'none',
|
|
90
|
-
msUserSelect: 'none',
|
|
91
|
-
pointerEvents: 'none',
|
|
92
|
-
};
|
|
93
|
-
var defaultLegendHeight = 50;
|
|
94
|
-
var defaultLegendWidth = 100;
|
|
95
|
-
var Plot = function (props) {
|
|
96
|
-
var _a, _b;
|
|
97
|
-
// Type correcting functions to convert props into something usable
|
|
98
|
-
var typeCorrect = React.useCallback(function (arg, arrayIndex) {
|
|
99
|
-
if (arg == null)
|
|
100
|
-
return undefined;
|
|
101
|
-
if (!(arg instanceof Object) || !Object.prototype.hasOwnProperty.call(arg, 'length'))
|
|
102
|
-
return (arrayIndex === 0 ? arg : undefined);
|
|
103
|
-
return arg[arrayIndex];
|
|
104
|
-
}, []);
|
|
105
|
-
var typeCorrectDomain = React.useCallback(function (arg) {
|
|
106
|
-
if (arg === undefined || arg.length === 0)
|
|
107
|
-
return [[0, 1], [0, 1]];
|
|
108
|
-
if (typeof (arg[0]) === 'number')
|
|
109
|
-
return [arg, [0, 1]];
|
|
110
|
-
return arg;
|
|
111
|
-
}, []);
|
|
112
|
-
/*
|
|
113
|
-
Actual plot that will handle Axis etc.
|
|
114
|
-
*/
|
|
115
|
-
var SVGref = React.useRef(null);
|
|
116
|
-
var handlers = React.useRef(new Map());
|
|
117
|
-
var wheelTimeout = React.useRef({ timeout: undefined, stopScroll: false });
|
|
118
|
-
var heightChange = React.useRef({ timeout: undefined, extraNeeded: 0, captureID: undefined });
|
|
119
|
-
var widthTimeout = React.useRef({ timeout: undefined, requesterMap: new Map() });
|
|
120
|
-
var guid = React.useMemo(function () { return (0, helper_functions_1.CreateGuid)(); }, []);
|
|
121
|
-
var data = React.useRef(new Map());
|
|
122
|
-
var
|
|
123
|
-
var
|
|
124
|
-
var
|
|
125
|
-
var
|
|
126
|
-
var
|
|
127
|
-
var
|
|
128
|
-
var
|
|
129
|
-
// ToDo: This is hardset to two because it's tied to display, 'left' and 'right'
|
|
130
|
-
var
|
|
131
|
-
var
|
|
132
|
-
var
|
|
133
|
-
var
|
|
134
|
-
var
|
|
135
|
-
var
|
|
136
|
-
var
|
|
137
|
-
var
|
|
138
|
-
var moveRequested = React.useRef(false);
|
|
139
|
-
var
|
|
140
|
-
var
|
|
141
|
-
var
|
|
142
|
-
var
|
|
143
|
-
var
|
|
144
|
-
var
|
|
145
|
-
var
|
|
146
|
-
var
|
|
147
|
-
var
|
|
148
|
-
// States for Props to avoid change notification on ref change
|
|
149
|
-
var
|
|
150
|
-
var
|
|
151
|
-
var
|
|
152
|
-
var
|
|
153
|
-
var
|
|
154
|
-
var
|
|
155
|
-
var
|
|
156
|
-
var
|
|
157
|
-
var applyToYDomain = React.useCallback(function (predicate) {
|
|
158
|
-
var newDomain = __spreadArray([], __read(yDomain), false);
|
|
159
|
-
var apply = false;
|
|
160
|
-
newDomain.forEach(function (d, i, a) {
|
|
161
|
-
// Note: Apply MUST be after predicate, or it short-circuits it
|
|
162
|
-
apply = predicate(d, i, a) || apply;
|
|
163
|
-
});
|
|
164
|
-
if (apply) {
|
|
165
|
-
setYdomain(newDomain);
|
|
166
|
-
}
|
|
167
|
-
}, [yDomain]);
|
|
168
|
-
// Effect to Reset the legend width/height
|
|
169
|
-
React.useEffect(function () {
|
|
170
|
-
if (props.legendHeight !== undefined)
|
|
171
|
-
setLegendHeight(props.legendHeight);
|
|
172
|
-
}, [props.legendHeight]);
|
|
173
|
-
React.useEffect(function () {
|
|
174
|
-
if (props.legendWidth !== undefined)
|
|
175
|
-
setLegendWidth(props.legendWidth);
|
|
176
|
-
}, [props.legendWidth]);
|
|
177
|
-
// Recompute height and width
|
|
178
|
-
React.useEffect(function () {
|
|
179
|
-
setSVGheight(props.height - (props.legend === 'bottom' ? legendHeight : 0));
|
|
180
|
-
}, [props.height, props.legend, legendHeight]);
|
|
181
|
-
React.useEffect(function () {
|
|
182
|
-
setSVGwidth(props.width - (props.legend === 'right' ? legendWidth : 0));
|
|
183
|
-
}, [props.width, props.legend, legendWidth]);
|
|
184
|
-
// enforce T limits
|
|
185
|
-
React.useEffect(function () {
|
|
186
|
-
if (props.Tmin !== undefined && tDomain[0] < props.Tmin)
|
|
187
|
-
setTdomain(function (t) { var _a; return ([(_a = props.Tmin) !== null && _a !== void 0 ? _a : 0, t[1]]); });
|
|
188
|
-
if (props.Tmax !== undefined && tDomain[1] > props.Tmax)
|
|
189
|
-
setTdomain(function (t) { var _a; return ([t[0], (_a = props.Tmax) !== null && _a !== void 0 ? _a : 0]); });
|
|
190
|
-
}, [tDomain]);
|
|
191
|
-
// enforce Y limits
|
|
192
|
-
React.useEffect(function () {
|
|
193
|
-
var mutateDomain = function (domain, axis, allDomains) {
|
|
194
|
-
var hasApplied = false;
|
|
195
|
-
// Need to type correct our arguements
|
|
196
|
-
var propMin = typeCorrect(props.Ymin, axis);
|
|
197
|
-
var propMax = typeCorrect(props.Ymax, axis);
|
|
198
|
-
if (propMin !== undefined && domain[0] < propMin) {
|
|
199
|
-
allDomains[axis] = [propMin, domain[1]];
|
|
200
|
-
hasApplied = true;
|
|
201
|
-
}
|
|
202
|
-
if (propMax !== undefined && domain[1] > propMax) {
|
|
203
|
-
allDomains[axis] = [domain[0], propMax];
|
|
204
|
-
hasApplied = true;
|
|
205
|
-
}
|
|
206
|
-
return hasApplied;
|
|
207
|
-
};
|
|
208
|
-
applyToYDomain(mutateDomain);
|
|
209
|
-
}, [yDomain]);
|
|
210
|
-
React.useEffect(function () {
|
|
211
|
-
if (!(0, lodash_1.isEqual)(defaultTdomain, props.defaultTdomain))
|
|
212
|
-
setDefaultTdomain(props.defaultTdomain);
|
|
213
|
-
}, [props.defaultTdomain]);
|
|
214
|
-
React.useEffect(function () {
|
|
215
|
-
if (!(0, lodash_1.isEqual)(defaultYdomain, props.defaultYdomain))
|
|
216
|
-
setDefaultYdomain(typeCorrectDomain(props.defaultYdomain));
|
|
217
|
-
}, [props.defaultYdomain]);
|
|
218
|
-
React.useEffect(function () {
|
|
219
|
-
setTdomain(defaultTdomain);
|
|
220
|
-
}, [defaultTdomain]);
|
|
221
|
-
React.useEffect(function () {
|
|
222
|
-
setYdomain(defaultYdomain);
|
|
223
|
-
}, [defaultYdomain]);
|
|
224
|
-
// Adjust top and bottom Offset
|
|
225
|
-
React.useEffect(function () {
|
|
226
|
-
var top = heightYFactor + 10;
|
|
227
|
-
var bottom = heightXLabel;
|
|
228
|
-
if (offsetTop !== top)
|
|
229
|
-
setOffsetTop(top);
|
|
230
|
-
if (offsetBottom !== bottom)
|
|
231
|
-
setOffsetBottom(bottom);
|
|
232
|
-
}, [heightXLabel, heightYFactor]);
|
|
233
|
-
// Adjust Left Offset
|
|
234
|
-
React.useEffect(function () {
|
|
235
|
-
var left = heightLeftYLabel + (props.menuLocation === 'left' ? (menueWidth + 2) : 10);
|
|
236
|
-
setOffsetLeft(left);
|
|
237
|
-
}, [heightLeftYLabel, props.menuLocation, menueWidth]);
|
|
238
|
-
// Adjust Right Offset
|
|
239
|
-
React.useEffect(function () {
|
|
240
|
-
var right = heightRightYLabel + ((props.menuLocation === 'right' || props.menuLocation === undefined) ? (menueWidth + 2) : 10);
|
|
241
|
-
setOffsetRight(right);
|
|
242
|
-
}, [heightRightYLabel, props.menuLocation, menueWidth]);
|
|
243
|
-
// Adjust Y domain defaults
|
|
244
|
-
React.useEffect(function () {
|
|
245
|
-
if (props.yDomain !== 'AutoValue' && props.yDomain !== 'HalfAutoValue')
|
|
246
|
-
return;
|
|
247
|
-
var dataReducerFunc = function (result, series, func, axis) {
|
|
248
|
-
// This part of the data may not belong to the axis we care about at the moment
|
|
249
|
-
var dataAxis = GraphContext_1.AxisMap.get(series.axis);
|
|
250
|
-
if (axis === dataAxis) {
|
|
251
|
-
var value = func([Number.MIN_SAFE_INTEGER, Number.MAX_SAFE_INTEGER]);
|
|
252
|
-
if (value !== undefined)
|
|
253
|
-
result.push(value);
|
|
254
|
-
}
|
|
255
|
-
return result;
|
|
256
|
-
};
|
|
257
|
-
var newDefaultDomain = defaultYdomain.map(function (yDomain, axis) {
|
|
258
|
-
var yMin = Math.min.apply(Math, __spreadArray([], __read(__spreadArray([], __read(data.current.values()), false).reduce(function (result, series) { return dataReducerFunc(result, series, series.getMin, axis); }, [])), false));
|
|
259
|
-
var yMax = Math.max.apply(Math, __spreadArray([], __read(__spreadArray([], __read(data.current.values()), false).reduce(function (result, series) { return dataReducerFunc(result, series, series.getMax, axis); }, [])), false));
|
|
260
|
-
if (!isNaN(yMin) && !isNaN(yMax) && isFinite(yMin) && isFinite(yMax)) {
|
|
261
|
-
if (props.yDomain === 'AutoValue')
|
|
262
|
-
return [yMin, yMax];
|
|
263
|
-
// If this condition is satisfied, it means our series is mostly positive range
|
|
264
|
-
else if (Math.abs(yMax) >= Math.abs(yMin))
|
|
265
|
-
return [0, yMax];
|
|
266
|
-
else
|
|
267
|
-
return [yMin, 0];
|
|
268
|
-
}
|
|
269
|
-
return [0, 1];
|
|
270
|
-
});
|
|
271
|
-
if (!_.isEqual(newDefaultDomain, defaultYdomain))
|
|
272
|
-
setDefaultYdomain(newDefaultDomain);
|
|
273
|
-
}, [dataGuid, props.yDomain]);
|
|
274
|
-
React.useEffect(function () {
|
|
275
|
-
var newHasData = Array(2);
|
|
276
|
-
var hasFunc = function (axis) { return __spreadArray([], __read(data.current.values()), false).some(function (series) { return GraphContext_1.AxisMap.get(axis) === GraphContext_1.AxisMap.get(series.axis); }); };
|
|
277
|
-
newHasData[0] = hasFunc('left');
|
|
278
|
-
newHasData[1] = hasFunc('right');
|
|
279
|
-
setYHasData(newHasData);
|
|
280
|
-
}, [dataGuid]);
|
|
281
|
-
// Adjust x axis
|
|
282
|
-
React.useEffect(function () {
|
|
283
|
-
var dT = tDomain[1] - tDomain[0];
|
|
284
|
-
var dTmin = tDomain[0];
|
|
285
|
-
if (dT === 0)
|
|
286
|
-
return;
|
|
287
|
-
if (props.XAxisType === 'log') {
|
|
288
|
-
dT = Math.log10(tDomain[1]) - Math.log10(tDomain[0]);
|
|
289
|
-
dTmin = Math.log10(tDomain[0]);
|
|
290
|
-
}
|
|
291
|
-
var scale = (svgWidth - offsetLeft - offsetRight) / dT;
|
|
292
|
-
setTscale(scale);
|
|
293
|
-
setToffset(offsetLeft - dTmin * scale);
|
|
294
|
-
}, [tDomain, offsetLeft, offsetRight, props.XAxisType, svgWidth]);
|
|
295
|
-
// Adjust y axis
|
|
296
|
-
React.useEffect(function () {
|
|
297
|
-
var e_1, _a;
|
|
298
|
-
var mutateFunction = function (scaleArray, offsetArray, axis) {
|
|
299
|
-
var dY = yDomain[axis][1] - yDomain[axis][0];
|
|
300
|
-
var scale = (svgHeight - offsetTop - offsetBottom) / (dY === 0 ? 0.00001 : dY);
|
|
301
|
-
scaleArray[axis] = -scale;
|
|
302
|
-
offsetArray[axis] = svgHeight - offsetBottom + yDomain[axis][0] * scale;
|
|
303
|
-
};
|
|
304
|
-
// Update every axis
|
|
305
|
-
var newScale = __spreadArray([], __read(yScale), false);
|
|
306
|
-
var newOffset = __spreadArray([], __read(yOffset), false);
|
|
307
|
-
try {
|
|
308
|
-
for (var _b = __values(GraphContext_1.AxisMap.values()), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
309
|
-
var axis = _c.value;
|
|
310
|
-
mutateFunction(newScale, newOffset, axis);
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
314
|
-
finally {
|
|
315
|
-
try {
|
|
316
|
-
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
317
|
-
}
|
|
318
|
-
finally { if (e_1) throw e_1.error; }
|
|
319
|
-
}
|
|
320
|
-
setYscale(newScale);
|
|
321
|
-
setYoffset(newOffset);
|
|
322
|
-
}, [yDomain, offsetTop, offsetBottom, svgHeight]);
|
|
323
|
-
React.useEffect(function () { setUpdateFlag(function (x) { return x + 1; }); }, [tScale, tOffset, yScale, yOffset]);
|
|
324
|
-
// Change mouse cursor
|
|
325
|
-
React.useEffect(function () {
|
|
326
|
-
var newCursor;
|
|
327
|
-
if (props.cursorOverride == null) {
|
|
328
|
-
switch (selectedMode) {
|
|
329
|
-
case 'pan':
|
|
330
|
-
newCursor = 'grab';
|
|
331
|
-
break;
|
|
332
|
-
case 'select':
|
|
333
|
-
newCursor = 'pointer';
|
|
334
|
-
break;
|
|
335
|
-
default:
|
|
336
|
-
newCursor = 'crosshair';
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
else
|
|
340
|
-
newCursor = props.cursorOverride;
|
|
341
|
-
setMouseStyle(newCursor);
|
|
342
|
-
}, [selectedMode, props.cursorOverride]);
|
|
343
|
-
// Stop scrolling while zooming
|
|
344
|
-
React.useEffect(function () {
|
|
345
|
-
var cancelWheel = function (e) { if (wheelTimeout.current.stopScroll)
|
|
346
|
-
e.preventDefault(); };
|
|
347
|
-
document.body.addEventListener('wheel', cancelWheel, { passive: false });
|
|
348
|
-
return function () { return document.body.removeEventListener('wheel', cancelWheel); };
|
|
349
|
-
}, []);
|
|
350
|
-
// Execute Plot Capture and leave photo mode
|
|
351
|
-
React.useEffect(function () {
|
|
352
|
-
// ToDo: We can clean this up some and improve performance using html2canvas options (but the biggest hurdle is the legend, which we don't have a lot of options for...)
|
|
353
|
-
if (!photoReady)
|
|
354
|
-
return;
|
|
355
|
-
// we can't immediately complete the request, since some layout things may still be changing...
|
|
356
|
-
clearTimeout(heightChange.current.timeout);
|
|
357
|
-
// timeout to set if we don't see any more changes within 0.05 seconds
|
|
358
|
-
heightChange.current.timeout = setTimeout(function () {
|
|
359
|
-
var _a;
|
|
360
|
-
var id = (_a = heightChange.current.captureID) !== null && _a !== void 0 ? _a : guid;
|
|
361
|
-
var element = document.getElementById(id);
|
|
362
|
-
if (element == null) {
|
|
363
|
-
console.error("Could not find document element with id "
|
|
364
|
-
}
|
|
365
|
-
else {
|
|
366
|
-
html2canvas(element).then(function (canvas) {
|
|
367
|
-
document.body.appendChild(canvas);
|
|
368
|
-
var imageData = canvas.toDataURL("image/png").replace(/^data:image\/png/, "data:application/octet-stream");
|
|
369
|
-
var anchorElement = document.createElement("a");
|
|
370
|
-
anchorElement.href = imageData;
|
|
371
|
-
anchorElement.download = id
|
|
372
|
-
document.body.appendChild(anchorElement);
|
|
373
|
-
anchorElement.click();
|
|
374
|
-
// Removing children created/cleanup
|
|
375
|
-
window.URL.revokeObjectURL(imageData);
|
|
376
|
-
document.body.removeChild(anchorElement);
|
|
377
|
-
document.body.removeChild(canvas);
|
|
378
|
-
});
|
|
379
|
-
}
|
|
380
|
-
setPhotoReady(false);
|
|
381
|
-
if (props.onCaptureComplete !== undefined)
|
|
382
|
-
props.onCaptureComplete();
|
|
383
|
-
}, 50);
|
|
384
|
-
});
|
|
385
|
-
// requests new legend height/width upto a defined maximum set by props
|
|
386
|
-
var requestLegendHeightChange = React.useCallback(function (newHeight) {
|
|
387
|
-
var _a;
|
|
388
|
-
var heightLimit = props.legend !== 'bottom' ? svgHeight : ((_a = props.legendHeight) !== null && _a !== void 0 ? _a : defaultLegendHeight);
|
|
389
|
-
if (!photoReady)
|
|
390
|
-
heightChange.current.extraNeeded = Math.max(newHeight - heightLimit, 0);
|
|
391
|
-
if (props.legend !== 'bottom')
|
|
392
|
-
return;
|
|
393
|
-
var limitedHeight = Math.min(newHeight, heightLimit);
|
|
394
|
-
if (legendHeight !== limitedHeight)
|
|
395
|
-
setLegendHeight(limitedHeight);
|
|
396
|
-
}, [props.legendHeight, setLegendHeight, legendHeight, props.legend, photoReady]);
|
|
397
|
-
var requestLegendWidthChange = React.useCallback(function (newWidth, requesterID) {
|
|
398
|
-
var _a;
|
|
399
|
-
if (newWidth < 0) {
|
|
400
|
-
widthTimeout.current.requesterMap.delete(requesterID);
|
|
401
|
-
return;
|
|
402
|
-
}
|
|
403
|
-
if (props.legend !== 'right')
|
|
404
|
-
return;
|
|
405
|
-
var limitedWidth = Math.min(newWidth, (_a = props.legendWidth) !== null && _a !== void 0 ? _a : defaultLegendWidth);
|
|
406
|
-
// we can't immediately complete the request, since there are multiple legend items trying to adjust this at a time sometimes
|
|
407
|
-
clearTimeout(widthTimeout.current.timeout);
|
|
408
|
-
widthTimeout.current.requesterMap.set(requesterID, limitedWidth);
|
|
409
|
-
// timeout to set if we don't see any more requests within 0.05 seconds
|
|
410
|
-
widthTimeout.current.timeout = setTimeout(function () {
|
|
411
|
-
var largestRequested = Math.max.apply(Math, __spreadArray([], __read(widthTimeout.current.requesterMap.values()), false));
|
|
412
|
-
if (legendWidth !== largestRequested)
|
|
413
|
-
setLegendWidth(largestRequested);
|
|
414
|
-
}, 50);
|
|
415
|
-
}, [props.legendWidth, setLegendWidth, legendWidth, props.legend]);
|
|
416
|
-
// transforms from pixels into x value. result passed into onClick function
|
|
417
|
-
var xInvTransform = React.useCallback(function (p) {
|
|
418
|
-
var xT = (p - tOffset) / tScale;
|
|
419
|
-
if (props.XAxisType === 'log')
|
|
420
|
-
xT = Math.pow(10, (p - tOffset) / tScale);
|
|
421
|
-
return xT;
|
|
422
|
-
}, [tOffset, tScale, props.XAxisType]);
|
|
423
|
-
// transforms from pixels into y value. result passed into onClick function
|
|
424
|
-
var yInvTransform = React.useCallback(function (p, a) {
|
|
425
|
-
var axis = (typeof (a) !== 'number') ? GraphContext_1.AxisMap.get(a) : a;
|
|
426
|
-
return (p - yOffset[axis]) / yScale[axis];
|
|
427
|
-
}, [yOffset, yScale]);
|
|
428
|
-
var Reset = React.useCallback(function () {
|
|
429
|
-
setTdomain(defaultTdomain);
|
|
430
|
-
setYdomain(defaultYdomain);
|
|
431
|
-
}, [defaultYdomain, defaultTdomain]);
|
|
432
|
-
// new X transformation from x value into Pixels
|
|
433
|
-
var xTransform = React.useCallback(function (value) {
|
|
434
|
-
var xT = value * tScale + tOffset;
|
|
435
|
-
if (props.XAxisType === 'log') {
|
|
436
|
-
var v = (value === 0 ? tDomain[0] * 0.01 : value);
|
|
437
|
-
xT = Math.log10(v) * tScale + tOffset;
|
|
438
|
-
}
|
|
439
|
-
return xT;
|
|
440
|
-
}, [tScale, tOffset, props.XAxisType, tDomain]);
|
|
441
|
-
// new Y transformation from y value into Pixels
|
|
442
|
-
var yTransform = React.useCallback(function (value, a) {
|
|
443
|
-
var axis = (typeof (a) !== 'number') ? GraphContext_1.AxisMap.get(a) : a;
|
|
444
|
-
return value * yScale[axis] + yOffset[axis];
|
|
445
|
-
}, [yScale, yOffset]);
|
|
446
|
-
// applies offset and contraints to x Pixel value to get something that is plotable
|
|
447
|
-
var xApplyOffset = React.useCallback(function (value) {
|
|
448
|
-
if (value >= 0)
|
|
449
|
-
return Math.min(value + offsetLeft, svgWidth - offsetRight);
|
|
450
|
-
else
|
|
451
|
-
return Math.max(offsetLeft, svgWidth - offsetRight + value);
|
|
452
|
-
}, [offsetLeft, offsetRight, svgWidth]);
|
|
453
|
-
// applies offset and contraints to y Pixel value to get something that is plotable
|
|
454
|
-
var yApplyOffset = React.useCallback(function (value) {
|
|
455
|
-
if (value >= 0)
|
|
456
|
-
return Math.min(value + offsetTop, svgHeight - offsetBottom);
|
|
457
|
-
else
|
|
458
|
-
return Math.max(offsetTop, svgHeight - offsetBottom + value);
|
|
459
|
-
}, [offsetTop, offsetBottom, svgHeight]);
|
|
460
|
-
var setData = React.useCallback(function (key, d) {
|
|
461
|
-
setDataGuid((0, helper_functions_1.CreateGuid)());
|
|
462
|
-
if (d != null)
|
|
463
|
-
data.current.set(key, d);
|
|
464
|
-
else
|
|
465
|
-
data.current.delete(key);
|
|
466
|
-
}, []);
|
|
467
|
-
var addData = React.useCallback(function (d) {
|
|
468
|
-
var key = (0, helper_functions_1.CreateGuid)();
|
|
469
|
-
setData(key, d);
|
|
470
|
-
return key;
|
|
471
|
-
}, []);
|
|
472
|
-
var setLegend = React.useCallback(function (key, legend) {
|
|
473
|
-
var series = data.current.get(key);
|
|
474
|
-
if (series === undefined)
|
|
475
|
-
return;
|
|
476
|
-
series.legend = legend;
|
|
477
|
-
data.current.set(key, series);
|
|
478
|
-
}, []);
|
|
479
|
-
function snapMouseToClosestSeries(pixelPt) {
|
|
480
|
-
var xVal = xInvTransform(pixelPt.x);
|
|
481
|
-
var findClosestPoint = function (result, series) {
|
|
482
|
-
var pointArray = series.getPoints(xVal, 7);
|
|
483
|
-
if (pointArray === undefined)
|
|
484
|
-
return result;
|
|
485
|
-
var ptArrayResult = pointArray.reduce(function (result, pt) {
|
|
486
|
-
var point = [xTransform(pt[0]), yTransform(pt[1], GraphContext_1.AxisMap.get(series.axis))];
|
|
487
|
-
var newDistSq = Math.pow((point[0] - pixelPt.x), 2) + Math.pow((point[1] - pixelPt.y), 2);
|
|
488
|
-
if (result.distSq === undefined || newDistSq < result.distSq)
|
|
489
|
-
return { pt: { x: point[0], y: point[1] }, distSq: newDistSq };
|
|
490
|
-
return result;
|
|
491
|
-
}, { pt: { x: 0, y: 0 }, distSq: undefined });
|
|
492
|
-
if (ptArrayResult.distSq !== undefined && (result.distSq === undefined || ptArrayResult.distSq < result.distSq))
|
|
493
|
-
return ptArrayResult;
|
|
494
|
-
return result;
|
|
495
|
-
};
|
|
496
|
-
return __spreadArray([], __read(data.current.values()), false).reduce(function (result, series) { return findClosestPoint(result, series); }, { pt: { x: 0, y: 0 }, distSq: undefined }).pt;
|
|
497
|
-
}
|
|
498
|
-
var registerSelect = React.useCallback(function (handler) {
|
|
499
|
-
var key = (0, helper_functions_1.CreateGuid)();
|
|
500
|
-
handlers.current.set(key, handler);
|
|
501
|
-
return key;
|
|
502
|
-
}, []);
|
|
503
|
-
var removeSelect = React.useCallback(function (key) {
|
|
504
|
-
handlers.current.delete(key);
|
|
505
|
-
}, []);
|
|
506
|
-
var updateSelect = React.useCallback(function (key, handler) {
|
|
507
|
-
handlers.current.set(key, handler);
|
|
508
|
-
}, []);
|
|
509
|
-
var setSelection = React.useCallback(function (s) {
|
|
510
|
-
if (s === "reset")
|
|
511
|
-
Reset();
|
|
512
|
-
else if (s === "download") {
|
|
513
|
-
if (props.onDataInspect !== undefined)
|
|
514
|
-
props.onDataInspect(tDomain);
|
|
515
|
-
}
|
|
516
|
-
else if (s === "capture") {
|
|
517
|
-
setPhotoReady(true);
|
|
518
|
-
if (props.onCapture !== undefined)
|
|
519
|
-
heightChange.current.captureID = props.onCapture(heightChange.current.extraNeeded);
|
|
520
|
-
}
|
|
521
|
-
else
|
|
522
|
-
setSelectedMode(s);
|
|
523
|
-
}, [tDomain, Reset, props.onDataInspect]);
|
|
524
|
-
var getConstrainedYDomain = React.useCallback(function (newTDomain) {
|
|
525
|
-
var dataReducerFunc = function (result, series, func, axis) {
|
|
526
|
-
// This part of the data may not belong to the axis we care about at the moment
|
|
527
|
-
var dataAxis = GraphContext_1.AxisMap.get(series.axis);
|
|
528
|
-
if (axis === dataAxis) {
|
|
529
|
-
var value = func(newTDomain);
|
|
530
|
-
if (value !== undefined)
|
|
531
|
-
result.push(value);
|
|
532
|
-
}
|
|
533
|
-
return result;
|
|
534
|
-
};
|
|
535
|
-
return yDomain.map(function (oldDomain, axis) {
|
|
536
|
-
var yMin = Math.min.apply(Math, __spreadArray([], __read(__spreadArray([], __read(data.current.values()), false).reduce(function (result, series) { return dataReducerFunc(result, series, series.getMin, axis); }, [])), false));
|
|
537
|
-
var yMax = Math.max.apply(Math, __spreadArray([], __read(__spreadArray([], __read(data.current.values()), false).reduce(function (result, series) { return dataReducerFunc(result, series, series.getMax, axis); }, [])), false));
|
|
538
|
-
if (!isNaN(yMin) && !isNaN(yMax) && isFinite(yMin) && isFinite(yMax))
|
|
539
|
-
return [yMin, yMax];
|
|
540
|
-
return yDomain[axis];
|
|
541
|
-
});
|
|
542
|
-
}, [dataGuid, yDomain]);
|
|
543
|
-
function handleMouseWheel(evt) {
|
|
544
|
-
var _a;
|
|
545
|
-
if (props.zoom !== undefined && !props.zoom)
|
|
546
|
-
return;
|
|
547
|
-
if (!selectedMode.includes('zoom'))
|
|
548
|
-
return;
|
|
549
|
-
if (!mouseIn)
|
|
550
|
-
return;
|
|
551
|
-
// while wheel is moving, do not release the lock
|
|
552
|
-
clearTimeout(wheelTimeout.current.timeout);
|
|
553
|
-
wheelTimeout.current.stopScroll = true;
|
|
554
|
-
// flag indicating to lock page scrolling
|
|
555
|
-
wheelTimeout.current.timeout = setTimeout(function () {
|
|
556
|
-
wheelTimeout.current.stopScroll = false;
|
|
557
|
-
}, 200);
|
|
558
|
-
var multiplier = 1.25;
|
|
559
|
-
// event.deltaY positive is wheel down or out and negative is wheel up or in
|
|
560
|
-
if (evt.deltaY < 0)
|
|
561
|
-
multiplier = 0.75;
|
|
562
|
-
if (selectedMode !== 'zoom-horizontal') {
|
|
563
|
-
var x0 = xTransform(tDomain[0]);
|
|
564
|
-
var x1 = xTransform(tDomain[1]);
|
|
565
|
-
if (mousePosition[0] < offsetLeft)
|
|
566
|
-
x1 = multiplier * (x1 - x0) + x0;
|
|
567
|
-
else if (mousePosition[0] > (svgWidth - offsetRight))
|
|
568
|
-
x0 = x1 - multiplier * (x1 - x0);
|
|
569
|
-
else {
|
|
570
|
-
var Xcenter = mousePosition[0];
|
|
571
|
-
x0 = Xcenter - (Xcenter - x0) * multiplier;
|
|
572
|
-
x1 = Xcenter + (x1 - Xcenter) * multiplier;
|
|
573
|
-
}
|
|
574
|
-
if ((x1 - x0) > 10) {
|
|
575
|
-
var newTDomain = void 0;
|
|
576
|
-
if ((_a = props.limitZoom) !== null && _a !== void 0 ? _a : false)
|
|
577
|
-
newTDomain = [Math.max(defaultTdomain[0], xInvTransform(x0)), Math.min(defaultTdomain[1], xInvTransform(x1))];
|
|
578
|
-
else
|
|
579
|
-
newTDomain = [xInvTransform(x0), xInvTransform(x1)];
|
|
580
|
-
if (selectedMode === 'zoom-vertical') {
|
|
581
|
-
var newYDomain = getConstrainedYDomain(newTDomain);
|
|
582
|
-
if (!_.isEqual(newYDomain, yDomain))
|
|
583
|
-
setYdomain(newYDomain);
|
|
584
|
-
}
|
|
585
|
-
setTdomain(newTDomain);
|
|
586
|
-
}
|
|
587
|
-
}
|
|
588
|
-
if (selectedMode !== 'zoom-vertical') {
|
|
589
|
-
var newYDomain = yDomain.map(function (domain, axis, allDomains) {
|
|
590
|
-
var _a;
|
|
591
|
-
var y0 = yTransform(domain[0], axis);
|
|
592
|
-
var y1 = yTransform(domain[1], axis);
|
|
593
|
-
if (mousePosition[1] < offsetTop)
|
|
594
|
-
y1 = multiplier * (y1 - y0) + y0;
|
|
595
|
-
else if (mousePosition[1] > (svgHeight - offsetBottom))
|
|
596
|
-
y0 = y1 - multiplier * (y1 - y0);
|
|
597
|
-
else {
|
|
598
|
-
var Ycenter = mousePosition[1];
|
|
599
|
-
y0 = Ycenter - (Ycenter - y0) * multiplier;
|
|
600
|
-
y1 = Ycenter + (y1 - Ycenter) * multiplier;
|
|
601
|
-
}
|
|
602
|
-
if (Math.abs(y1 - y0) > 10) {
|
|
603
|
-
if ((_a = props.limitZoom) !== null && _a !== void 0 ? _a : false)
|
|
604
|
-
return [Math.max(defaultYdomain[axis][0], yInvTransform(y0, axis)), Math.min(defaultYdomain[axis][1], yInvTransform(y1, axis))];
|
|
605
|
-
return [yInvTransform(y0, axis), yInvTransform(y1, axis)];
|
|
606
|
-
}
|
|
607
|
-
return domain;
|
|
608
|
-
});
|
|
609
|
-
if (!_.isEqual(newYDomain, yDomain)) {
|
|
610
|
-
// todo: added contraint to t domain when mode is zoom-horizontal
|
|
611
|
-
setYdomain(newYDomain);
|
|
612
|
-
}
|
|
613
|
-
}
|
|
614
|
-
}
|
|
615
|
-
function handleMouseMove(evt) {
|
|
616
|
-
if (!moveRequested.current)
|
|
617
|
-
requestAnimationFrame(function () { return mouseMoveEvent(evt); });
|
|
618
|
-
moveRequested.current = true;
|
|
619
|
-
}
|
|
620
|
-
function mouseMoveEvent(evt) {
|
|
621
|
-
var _a;
|
|
622
|
-
moveRequested.current = false;
|
|
623
|
-
if (SVGref.current == null)
|
|
624
|
-
return;
|
|
625
|
-
var pt = SVGref.current.createSVGPoint();
|
|
626
|
-
pt.x = evt.clientX;
|
|
627
|
-
pt.y = evt.clientY;
|
|
628
|
-
var ptTransform = pt.matrixTransform(SVGref.current.getScreenCTM().inverse());
|
|
629
|
-
if (mouseMode === 'pan') {
|
|
630
|
-
var dP = mousePosition[0] - ptTransform.x;
|
|
631
|
-
var Plower = xTransform(tDomain[0]);
|
|
632
|
-
var Pupper = xTransform(tDomain[1]);
|
|
633
|
-
var Tmin = xInvTransform(Plower + dP);
|
|
634
|
-
var Tmax = xInvTransform(Pupper + dP);
|
|
635
|
-
if ((props.Tmin === undefined || Tmin > props.Tmin) &&
|
|
636
|
-
(props.Tmax === undefined || Tmax < props.Tmax))
|
|
637
|
-
setTdomain([Tmin, Tmax]);
|
|
638
|
-
var zoomYAxis = function (domain, axis, allDomains) {
|
|
639
|
-
var dY = yInvTransform(mousePosition[1], axis) - yInvTransform(ptTransform.y, axis);
|
|
640
|
-
// Need to type correct our arguements
|
|
641
|
-
var propMin = typeCorrect(props.Ymin, axis);
|
|
642
|
-
var propMax = typeCorrect(props.Ymax, axis);
|
|
643
|
-
if ((propMin === undefined || domain[0] + dY > propMin) &&
|
|
644
|
-
(propMax === undefined || domain[1] + dY < propMax)) {
|
|
645
|
-
allDomains[axis] = [domain[0] + dY, domain[1] + dY];
|
|
646
|
-
return true;
|
|
647
|
-
}
|
|
648
|
-
return false;
|
|
649
|
-
};
|
|
650
|
-
applyToYDomain(zoomYAxis);
|
|
651
|
-
}
|
|
652
|
-
setMousePosition([ptTransform.x, ptTransform.y]);
|
|
653
|
-
// Here on mouse is snapped (if neccessary)
|
|
654
|
-
var ptFinal;
|
|
655
|
-
if ((_a = props.snapMouse) !== null && _a !== void 0 ? _a : false)
|
|
656
|
-
ptFinal = snapMouseToClosestSeries(ptTransform);
|
|
657
|
-
else
|
|
658
|
-
ptFinal = ptTransform;
|
|
659
|
-
setMousePositionSnap([ptFinal.x, ptFinal.y]);
|
|
660
|
-
if (handlers.current.size > 0)
|
|
661
|
-
handlers.current.forEach(function (v) { return (v.onMove !== undefined ? v.onMove(xInvTransform(v.allowSnapping ? ptFinal.x : ptTransform.x), yInvTransform(v.allowSnapping ? ptFinal.y : ptTransform.y, v.axis)) : null); });
|
|
662
|
-
}
|
|
663
|
-
function handleMouseDown(evt) {
|
|
664
|
-
var _a;
|
|
665
|
-
if (SVGref.current == null)
|
|
666
|
-
return;
|
|
667
|
-
var pt = SVGref.current.createSVGPoint();
|
|
668
|
-
pt.x = evt.clientX;
|
|
669
|
-
pt.y = evt.clientY;
|
|
670
|
-
var ptTransform = pt.matrixTransform(SVGref.current.getScreenCTM().inverse());
|
|
671
|
-
setMouseClick([ptTransform.x, ptTransform.y]);
|
|
672
|
-
if (selectedMode.includes('zoom') && (props.zoom === undefined || props.zoom))
|
|
673
|
-
setMouseMode(selectedMode);
|
|
674
|
-
if (selectedMode === 'pan' && (props.pan === undefined || props.pan)) {
|
|
675
|
-
setMouseMode('pan');
|
|
676
|
-
setMouseStyle('grabbing');
|
|
677
|
-
}
|
|
678
|
-
// Todo: Review question: can we just use mousePosition and mousePositionSnap here?
|
|
679
|
-
// Here on mouse is snapped (if neccessary)
|
|
680
|
-
var ptFinal;
|
|
681
|
-
if ((_a = props.snapMouse) !== null && _a !== void 0 ? _a : false)
|
|
682
|
-
ptFinal = snapMouseToClosestSeries(ptTransform);
|
|
683
|
-
else
|
|
684
|
-
ptFinal = ptTransform;
|
|
685
|
-
if (selectedMode === 'select' && props.onSelect !== undefined)
|
|
686
|
-
props.onSelect(xInvTransform(ptFinal.x), __spreadArray([], __read(GraphContext_1.AxisMap.values()), false).map(function (axis) { return yInvTransform(ptFinal.y, axis); }), {
|
|
687
|
-
setTDomain: updateXDomain,
|
|
688
|
-
setYDomain: updateYDomain
|
|
689
|
-
});
|
|
690
|
-
if (handlers.current.size > 0 && selectedMode === 'select')
|
|
691
|
-
handlers.current.forEach(function (v) { return (v.onClick !== undefined ? v.onClick(xInvTransform(v.allowSnapping ? ptFinal.x : ptTransform.x), yInvTransform(v.allowSnapping ? ptFinal.y : ptTransform.y, v.axis)) : null); });
|
|
692
|
-
}
|
|
693
|
-
function handleMouseUp() {
|
|
694
|
-
if (selectedMode === 'pan' && (props.pan === undefined || props.pan))
|
|
695
|
-
setMouseStyle('grab');
|
|
696
|
-
if (mouseMode.includes('zoom')) {
|
|
697
|
-
if ((Math.abs(mousePosition[0] - mouseClick[0]) < 10) && (Math.abs(mousePosition[1] - mouseClick[1]) < 10)) {
|
|
698
|
-
setMouseMode('none');
|
|
699
|
-
return;
|
|
700
|
-
}
|
|
701
|
-
if (mouseMode !== 'zoom-horizontal') {
|
|
702
|
-
var t0 = Math.min(xInvTransform(mousePosition[0]), xInvTransform(mouseClick[0]));
|
|
703
|
-
var t1 = Math.max(xInvTransform(mousePosition[0]), xInvTransform(mouseClick[0]));
|
|
704
|
-
var newTDomain = [Math.max(tDomain[0], t0), Math.min(tDomain[1], t1)];
|
|
705
|
-
if (selectedMode === 'zoom-vertical') {
|
|
706
|
-
var newYDomain = getConstrainedYDomain(newTDomain);
|
|
707
|
-
if (!_.isEqual(newYDomain, yDomain))
|
|
708
|
-
setYdomain(newYDomain);
|
|
709
|
-
}
|
|
710
|
-
setTdomain(newTDomain);
|
|
711
|
-
}
|
|
712
|
-
if (mouseMode !== 'zoom-vertical') {
|
|
713
|
-
var newYDomain = yDomain.map(function (domain, axis, allDomains) {
|
|
714
|
-
var y0 = Math.min(yInvTransform(mousePosition[1], axis), yInvTransform(mouseClick[1], axis));
|
|
715
|
-
var y1 = Math.max(yInvTransform(mousePosition[1], axis), yInvTransform(mouseClick[1], axis));
|
|
716
|
-
return [Math.max(domain[0], y0), Math.min(domain[1], y1)];
|
|
717
|
-
});
|
|
718
|
-
if (!_.isEqual(newYDomain, yDomain)) {
|
|
719
|
-
// todo: added contraint to t domain when mode is zoom-horizontal
|
|
720
|
-
setYdomain(newYDomain);
|
|
721
|
-
}
|
|
722
|
-
}
|
|
723
|
-
}
|
|
724
|
-
setMouseMode('none');
|
|
725
|
-
if (handlers.current.size > 0 && selectedMode === 'select')
|
|
726
|
-
handlers.current.forEach(function (v) { return (v.onRelease !== undefined ? v.onRelease(xInvTransform(v.allowSnapping ? mousePositionSnap[0] : mousePosition[0]), yInvTransform(v.allowSnapping ? mousePositionSnap[1] : mousePosition[1], v.axis)) : null); });
|
|
727
|
-
}
|
|
728
|
-
function handleMouseOut(_) {
|
|
729
|
-
setMouseIn(false);
|
|
730
|
-
if (mouseMode === 'pan')
|
|
731
|
-
setMouseMode('none');
|
|
732
|
-
if (handlers.current.size > 0 && selectedMode === 'select')
|
|
733
|
-
handlers.current.forEach(function (v) { return (v.onPlotLeave !== undefined ? v.onPlotLeave(xInvTransform(v.allowSnapping ? mousePositionSnap[0] : mousePosition[0]), yInvTransform(v.allowSnapping ? mousePositionSnap[1] : mousePosition[1], v.axis)) : null); });
|
|
734
|
-
}
|
|
735
|
-
function handleMouseIn(_) {
|
|
736
|
-
setMouseIn(true);
|
|
737
|
-
}
|
|
738
|
-
function updateXDomain(x) {
|
|
739
|
-
if (x[0] === tDomain[0] && x[1] === tDomain[1])
|
|
740
|
-
return;
|
|
741
|
-
if (x[0] < x[1])
|
|
742
|
-
setTdomain(x);
|
|
743
|
-
else
|
|
744
|
-
setTdomain([x[1], x[0]]);
|
|
745
|
-
}
|
|
746
|
-
function updateYDomain(y) {
|
|
747
|
-
var correctFunction = function (domain, axis, allDomains) {
|
|
748
|
-
if (y[axis][0] === domain[0] && y[axis][1] === domain[1])
|
|
749
|
-
return false;
|
|
750
|
-
if (y[0] < y[1])
|
|
751
|
-
allDomains[axis] = y[axis];
|
|
752
|
-
else
|
|
753
|
-
allDomains[axis] = [y[axis][1], y[axis][0]];
|
|
754
|
-
return true;
|
|
755
|
-
};
|
|
756
|
-
applyToYDomain(correctFunction);
|
|
757
|
-
}
|
|
758
|
-
return (React.createElement(GraphContext_1.ContextWrapper, { XDomain: tDomain, MousePosition: mousePosition, MousePositionSnap: mousePositionSnap, YDomain: yDomain, CurrentMode: selectedMode, MouseIn: mouseIn, UpdateFlag: updateFlag, Data: data, DataGuid: dataGuid, XApplyPixelOffset: xApplyOffset, YApplyPixelOffset: yApplyOffset, XTransform: xTransform, YTransform: yTransform, XInvTransform: xInvTransform, YInvTransform: yInvTransform, SetXDomain: updateXDomain, SetYDomain: updateYDomain, AddData: addData, RemoveData: setData, UpdateData: setData, SetLegend: setLegend, RegisterSelect: registerSelect, RemoveSelect: removeSelect, UpdateSelect: updateSelect },
|
|
759
|
-
React.createElement("div", { id: guid, style: { height: props.height, width: props.width, position: 'relative' } },
|
|
760
|
-
React.createElement("div", { style: { height: svgHeight, width: svgWidth, position: 'absolute', cursor: mouseStyle }, onWheel: handleMouseWheel, onMouseMove: handleMouseMove, onMouseDown: handleMouseDown, onMouseUp: handleMouseUp, onMouseLeave: handleMouseOut, onMouseEnter: handleMouseIn },
|
|
761
|
-
React.createElement("svg", { ref: SVGref, width: svgWidth < 0 ? 0 : svgWidth, height: svgHeight < 0 ? 0 : svgHeight, style: SvgStyle, viewBox: "0 0 "
|
|
762
|
-
props.showBorder !== undefined && props.showBorder ? React.createElement("path", { stroke: 'black', d: "M "
|
|
763
|
-
props.XAxisType === 'time' || props.XAxisType === undefined ?
|
|
764
|
-
React.createElement(TimeAxis_1.default, { label: props.Tlabel, offsetBottom: offsetBottom, offsetLeft: offsetLeft, offsetRight: offsetRight, width: svgWidth, height: svgHeight, setHeight: setHeightXLabel, heightAxis: heightXLabel, showLeftMostTick: !yHasData[0], showRightMostTick: !yHasData[1], showDate: props.showDateOnTimeAxis }) :
|
|
765
|
-
React.createElement(LogAxis_1.default, { offsetTop: offsetTop, showGrid: props.showGrid, label: props.Tlabel, offsetBottom: offsetBottom, offsetLeft: offsetLeft, offsetRight: offsetRight, width: svgWidth, height: svgHeight, setHeight: setHeightXLabel, heightAxis: heightXLabel, showLeftMostTick: !yHasData[0], showRightMostTick: !yHasData[1] }),
|
|
766
|
-
yHasData[0] ? React.createElement(ValueAxis_1.default, { offsetRight: offsetRight, showGrid: props.showGrid, label: typeCorrect(props.Ylabel, 0), offsetTop: offsetTop, offsetLeft: offsetLeft, offsetBottom: offsetBottom, width: svgWidth, height: svgHeight, setWidthAxis: setHeightLeftYLabel, setHeightFactor: setHeightYFactor, axis: 'left', hAxis: heightLeftYLabel, hFactor: heightYFactor, useFactor: props.useMetricFactors === undefined ? true : props.useMetricFactors }) : null,
|
|
767
|
-
yHasData[1] ? React.createElement(ValueAxis_1.default, { offsetRight: offsetRight, showGrid: props.showGrid, label: typeCorrect(props.Ylabel, 1), offsetTop: offsetTop, offsetLeft: offsetLeft, offsetBottom: offsetBottom, width: svgWidth, height: svgHeight, setWidthAxis: setHeightRightYLabel, setHeightFactor: setHeightYFactor, axis: 'right', hAxis: heightRightYLabel, hFactor: heightYFactor, useFactor: props.useMetricFactors === undefined ? true : props.useMetricFactors }) : null,
|
|
768
|
-
React.createElement("defs", null,
|
|
769
|
-
React.createElement("clipPath", { id: "cp-" + guid },
|
|
770
|
-
React.createElement("path", { stroke: 'none', fill: 'none', d: " M "
|
|
771
|
-
React.createElement("g", { clipPath: 'url(#cp-' + guid + ')' },
|
|
772
|
-
React.Children.map(props.children, function (element) {
|
|
773
|
-
if (!React.isValidElement(element))
|
|
774
|
-
return null;
|
|
775
|
-
if (element.type === Line_1.default || element.type === LineWithThreshold_1.default || element.type === Infobox_1.default ||
|
|
776
|
-
element.type === HorizontalMarker_1.default || element.type === VerticalMarker_1.default || element.type === SymbolicMarker_1.default
|
|
777
|
-
|| element.type === Circle_1.default || element.type === AggregatingCircles_1.default || element.type === HeatMapChart_1.default)
|
|
778
|
-
return element;
|
|
779
|
-
return null;
|
|
780
|
-
}),
|
|
781
|
-
!photoReady && (props.showMouse === undefined || (props.showMouse !== 'none' && props.showMouse !== false)) ?
|
|
782
|
-
React.createElement("path", { stroke: 'black', style: { strokeWidth: 2, opacity: mouseIn ? 0.8 : 0.0 }, d: (props.showMouse !== 'horizontal' ?
|
|
783
|
-
"M "
|
|
784
|
-
"M "
|
|
785
|
-
: null,
|
|
786
|
-
(props.zoom === undefined || props.zoom) && mouseMode.includes('zoom') ?
|
|
787
|
-
React.createElement("rect", { fillOpacity: 0.8, fill: 'black', x: mouseMode !== 'zoom-horizontal' ? Math.min(mouseClick[0], mousePosition[0]) : offsetLeft, y: mouseMode !== 'zoom-vertical' ? Math.min(mouseClick[1], mousePosition[1]) : offsetTop, width: mouseMode !== 'zoom-horizontal' ? Math.abs(mouseClick[0] - mousePosition[0]) : (svgWidth - offsetLeft - offsetRight), height: mouseMode !== 'zoom-vertical' ? Math.abs(mouseClick[1] - mousePosition[1]) : (svgHeight - offsetTop - offsetBottom) })
|
|
788
|
-
: null),
|
|
789
|
-
(photoReady || props.menuLocation === 'hide') ? React.createElement(React.Fragment, null) :
|
|
790
|
-
React.createElement(InteractiveButtons_1.default, { showPan: (props.pan === undefined || props.pan), showZoom: props.zoom === undefined || props.zoom, showReset: !(props.pan !== undefined && props.zoom !== undefined && !props.zoom && !props.pan), showSelect: props.onSelect !== undefined || handlers.current.size > 0, showDownload: props.onDataInspect !== undefined, showCapture: props.onCapture !== undefined, currentSelection: selectedMode, setSelection: setSelection, holdOpen: props.holdMenuOpen, heightAvaliable: svgHeight - 22, setWidth: setMenueWidth, x: (props.menuLocation === 'left' ? 14 : (svgWidth - 14 - menueWidth + 20)), y: 22, "data-html2canvas-ignore": "true" }, React.Children.map(props.children, function (element) {
|
|
791
|
-
if (!React.isValidElement(element))
|
|
792
|
-
return null;
|
|
793
|
-
if (element.type === Button_1.default)
|
|
794
|
-
return element;
|
|
795
|
-
return null;
|
|
796
|
-
})))),
|
|
797
|
-
props.legend !== undefined && props.legend !== 'hidden' ?
|
|
798
|
-
React.createElement(Legend_1.default, { location: props.legend, height: legendHeight, width: legendWidth, graphWidth: svgWidth, graphHeight: svgHeight, RequestLegendWidth: requestLegendWidthChange, RequestLegendHeight: requestLegendHeightChange, HideDisabled: photoReady })
|
|
799
|
-
: null)));
|
|
800
|
-
};
|
|
801
|
-
exports.default = Plot;
|
|
802
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGxvdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9QbG90LnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEseUdBQXlHO0FBQ3pHLG1CQUFtQjtBQUNuQixFQUFFO0FBQ0YscUVBQXFFO0FBQ3JFLEVBQUU7QUFDRix3R0FBd0c7QUFDeEcsd0dBQXdHO0FBQ3hHLHNHQUFzRztBQUN0Ryx3RkFBd0Y7QUFDeEYsRUFBRTtBQUNGLDBDQUEwQztBQUMxQyxFQUFFO0FBQ0Ysd0dBQXdHO0FBQ3hHLHdHQUF3RztBQUN4Ryw0RUFBNEU7QUFDNUUsRUFBRTtBQUNGLDhCQUE4QjtBQUM5Qix3R0FBd0c7QUFDeEcsMEJBQTBCO0FBQzFCLG1EQUFtRDtBQUNuRCxFQUFFO0FBQ0YseUdBQXlHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUd6Ryw2QkFBK0I7QUFDL0IsMEJBQTRCO0FBQzVCLDJEQUFzRDtBQUN0RCwrQ0FBNkg7QUFDN0gsbUVBQTBEO0FBQzFELGlDQUEwQztBQUMxQyx1Q0FBa0M7QUFDbEMscUNBQWdDO0FBQ2hDLHlDQUFvQztBQUNwQyxtQ0FBOEI7QUFDOUIseURBQW9EO0FBQ3BELCtCQUEwQjtBQUMxQixtQ0FBOEI7QUFDOUIsdURBQWtEO0FBQ2xELG1EQUE4QztBQUM5QyxtREFBOEM7QUFDOUMsbUNBQThCO0FBQzlCLDJEQUFzRDtBQUN0RCxxQ0FBZ0M7QUFDaEMsK0NBQTBDO0FBQzFDLDBDQUE0QztBQUM1QyxJQUFNLFdBQVcsR0FBUSxZQUFZLENBQUM7QUF5Q3RDLElBQU0sUUFBUSxHQUF3QjtJQUNsQyxJQUFJLEVBQUUsTUFBTTtJQUNaLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLGtCQUFrQixFQUFFLE1BQU07SUFDMUIsZ0JBQWdCLEVBQUUsTUFBTTtJQUN4QixlQUFlLEVBQUUsTUFBTTtJQUN2QixhQUFhLEVBQUUsTUFBTTtJQUNyQixZQUFZLEVBQUUsTUFBTTtJQUNwQixhQUFhLEVBQUUsTUFB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
|
|
1
|
+
"use strict";
|
|
2
|
+
// ******************************************************************************************************
|
|
3
|
+
// Plot.tsx - Gbtc
|
|
4
|
+
//
|
|
5
|
+
// Copyright © 2020, 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
|
+
// 03/18/2021 - C Lackner
|
|
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
|
+
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
41
|
+
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
42
|
+
if (ar || !(i in from)) {
|
|
43
|
+
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
44
|
+
ar[i] = from[i];
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return to.concat(ar || Array.prototype.slice.call(from));
|
|
48
|
+
};
|
|
49
|
+
var __values = (this && this.__values) || function(o) {
|
|
50
|
+
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
|
51
|
+
if (m) return m.call(o);
|
|
52
|
+
if (o && typeof o.length === "number") return {
|
|
53
|
+
next: function () {
|
|
54
|
+
if (o && i >= o.length) o = void 0;
|
|
55
|
+
return { value: o && o[i++], done: !o };
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
59
|
+
};
|
|
60
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
61
|
+
var React = require("react");
|
|
62
|
+
var _ = require("lodash");
|
|
63
|
+
var InteractiveButtons_1 = require("./InteractiveButtons");
|
|
64
|
+
var GraphContext_1 = require("./GraphContext");
|
|
65
|
+
var helper_functions_1 = require("@gpa-gemstone/helper-functions");
|
|
66
|
+
var lodash_1 = require("lodash");
|
|
67
|
+
var TimeAxis_1 = require("./TimeAxis");
|
|
68
|
+
var LogAxis_1 = require("./LogAxis");
|
|
69
|
+
var ValueAxis_1 = require("./ValueAxis");
|
|
70
|
+
var Legend_1 = require("./Legend");
|
|
71
|
+
var LineWithThreshold_1 = require("./LineWithThreshold");
|
|
72
|
+
var Line_1 = require("./Line");
|
|
73
|
+
var Button_1 = require("./Button");
|
|
74
|
+
var HorizontalMarker_1 = require("./HorizontalMarker");
|
|
75
|
+
var VerticalMarker_1 = require("./VerticalMarker");
|
|
76
|
+
var SymbolicMarker_1 = require("./SymbolicMarker");
|
|
77
|
+
var Circle_1 = require("./Circle");
|
|
78
|
+
var AggregatingCircles_1 = require("./AggregatingCircles");
|
|
79
|
+
var Infobox_1 = require("./Infobox");
|
|
80
|
+
var HeatMapChart_1 = require("./HeatMapChart");
|
|
81
|
+
var _html2canvas = require("html2canvas");
|
|
82
|
+
var html2canvas = _html2canvas;
|
|
83
|
+
var SvgStyle = {
|
|
84
|
+
fill: 'none',
|
|
85
|
+
userSelect: 'none',
|
|
86
|
+
WebkitTouchCallout: 'none',
|
|
87
|
+
WebkitUserSelect: 'none',
|
|
88
|
+
KhtmlUserSelect: 'none',
|
|
89
|
+
MozUserSelect: 'none',
|
|
90
|
+
msUserSelect: 'none',
|
|
91
|
+
pointerEvents: 'none',
|
|
92
|
+
};
|
|
93
|
+
var defaultLegendHeight = 50;
|
|
94
|
+
var defaultLegendWidth = 100;
|
|
95
|
+
var Plot = function (props) {
|
|
96
|
+
var _a, _b, _c;
|
|
97
|
+
// Type correcting functions to convert props into something usable
|
|
98
|
+
var typeCorrect = React.useCallback(function (arg, arrayIndex) {
|
|
99
|
+
if (arg == null)
|
|
100
|
+
return undefined;
|
|
101
|
+
if (!(arg instanceof Object) || !Object.prototype.hasOwnProperty.call(arg, 'length'))
|
|
102
|
+
return (arrayIndex === 0 ? arg : undefined);
|
|
103
|
+
return arg[arrayIndex];
|
|
104
|
+
}, []);
|
|
105
|
+
var typeCorrectDomain = React.useCallback(function (arg) {
|
|
106
|
+
if (arg === undefined || arg.length === 0)
|
|
107
|
+
return [[0, 1], [0, 1]];
|
|
108
|
+
if (typeof (arg[0]) === 'number')
|
|
109
|
+
return [arg, [0, 1]];
|
|
110
|
+
return arg;
|
|
111
|
+
}, []);
|
|
112
|
+
/*
|
|
113
|
+
Actual plot that will handle Axis etc.
|
|
114
|
+
*/
|
|
115
|
+
var SVGref = React.useRef(null);
|
|
116
|
+
var handlers = React.useRef(new Map());
|
|
117
|
+
var wheelTimeout = React.useRef({ timeout: undefined, stopScroll: false });
|
|
118
|
+
var heightChange = React.useRef({ timeout: undefined, extraNeeded: 0, captureID: undefined });
|
|
119
|
+
var widthTimeout = React.useRef({ timeout: undefined, requesterMap: new Map() });
|
|
120
|
+
var guid = React.useMemo(function () { return (0, helper_functions_1.CreateGuid)(); }, []);
|
|
121
|
+
var data = React.useRef(new Map());
|
|
122
|
+
var _d = __read(React.useState(""), 2), dataGuid = _d[0], setDataGuid = _d[1];
|
|
123
|
+
var _e = __read(React.useState(props.defaultTdomain), 2), tDomain = _e[0], setTdomain = _e[1];
|
|
124
|
+
var _f = __read(React.useState(0), 2), tOffset = _f[0], setToffset = _f[1];
|
|
125
|
+
var _g = __read(React.useState(1), 2), tScale = _g[0], setTscale = _g[1];
|
|
126
|
+
var _h = __read(React.useState(Array(GraphContext_1.AxisMap.size).fill([0, 0])), 2), yDomain = _h[0], setYdomain = _h[1];
|
|
127
|
+
var _j = __read(React.useState(Array(GraphContext_1.AxisMap.size).fill(0)), 2), yOffset = _j[0], setYoffset = _j[1];
|
|
128
|
+
var _k = __read(React.useState(Array(GraphContext_1.AxisMap.size).fill(1)), 2), yScale = _k[0], setYscale = _k[1];
|
|
129
|
+
// ToDo: This is hardset to two because it's tied to display, 'left' and 'right'
|
|
130
|
+
var _l = __read(React.useState(Array(2).fill(0)), 2), yHasData = _l[0], setYHasData = _l[1];
|
|
131
|
+
var _m = __read(React.useState('none'), 2), mouseMode = _m[0], setMouseMode = _m[1];
|
|
132
|
+
var _o = __read(React.useState((_a = props.defaultMouseMode) !== null && _a !== void 0 ? _a : 'zoom-rectangular'), 2), selectedMode = _o[0], setSelectedMode = _o[1];
|
|
133
|
+
var _p = __read(React.useState(false), 2), mouseIn = _p[0], setMouseIn = _p[1];
|
|
134
|
+
var _q = __read(React.useState([0, 0]), 2), mousePosition = _q[0], setMousePosition = _q[1];
|
|
135
|
+
var _r = __read(React.useState([0, 0]), 2), mousePositionSnap = _r[0], setMousePositionSnap = _r[1];
|
|
136
|
+
var _s = __read(React.useState([0, 0]), 2), mouseClick = _s[0], setMouseClick = _s[1];
|
|
137
|
+
var _t = __read(React.useState("default"), 2), mouseStyle = _t[0], setMouseStyle = _t[1];
|
|
138
|
+
var moveRequested = React.useRef(false);
|
|
139
|
+
var _u = __read(React.useState(false), 2), photoReady = _u[0], setPhotoReady = _u[1];
|
|
140
|
+
var _v = __read(React.useState(10), 2), offsetTop = _v[0], setOffsetTop = _v[1];
|
|
141
|
+
var _w = __read(React.useState(10), 2), offsetBottom = _w[0], setOffsetBottom = _w[1];
|
|
142
|
+
var _x = __read(React.useState(5), 2), offsetLeft = _x[0], setOffsetLeft = _x[1];
|
|
143
|
+
var _y = __read(React.useState(5), 2), offsetRight = _y[0], setOffsetRight = _y[1];
|
|
144
|
+
var _z = __read(React.useState(0), 2), heightYFactor = _z[0], setHeightYFactor = _z[1];
|
|
145
|
+
var _0 = __read(React.useState(0), 2), heightXLabel = _0[0], setHeightXLabel = _0[1];
|
|
146
|
+
var _1 = __read(React.useState(0), 2), heightLeftYLabel = _1[0], setHeightLeftYLabel = _1[1];
|
|
147
|
+
var _2 = __read(React.useState(0), 2), heightRightYLabel = _2[0], setHeightRightYLabel = _2[1];
|
|
148
|
+
// States for Props to avoid change notification on ref change
|
|
149
|
+
var _3 = __read(React.useState(props.defaultTdomain), 2), defaultTdomain = _3[0], setDefaultTdomain = _3[1];
|
|
150
|
+
var _4 = __read(React.useState(typeCorrectDomain(props.defaultYdomain)), 2), defaultYdomain = _4[0], setDefaultYdomain = _4[1];
|
|
151
|
+
var _5 = __read(React.useState(0), 2), updateFlag = _5[0], setUpdateFlag = _5[1];
|
|
152
|
+
var _6 = __read(React.useState((_b = props.legendHeight) !== null && _b !== void 0 ? _b : defaultLegendHeight), 2), legendHeight = _6[0], setLegendHeight = _6[1];
|
|
153
|
+
var _7 = __read(React.useState((_c = props.legendWidth) !== null && _c !== void 0 ? _c : defaultLegendWidth), 2), legendWidth = _7[0], setLegendWidth = _7[1];
|
|
154
|
+
var _8 = __read(React.useState(props.height), 2), svgHeight = _8[0], setSVGheight = _8[1];
|
|
155
|
+
var _9 = __read(React.useState(props.width), 2), svgWidth = _9[0], setSVGwidth = _9[1];
|
|
156
|
+
var _10 = __read(React.useState(28), 2), menueWidth = _10[0], setMenueWidth = _10[1];
|
|
157
|
+
var applyToYDomain = React.useCallback(function (predicate) {
|
|
158
|
+
var newDomain = __spreadArray([], __read(yDomain), false);
|
|
159
|
+
var apply = false;
|
|
160
|
+
newDomain.forEach(function (d, i, a) {
|
|
161
|
+
// Note: Apply MUST be after predicate, or it short-circuits it
|
|
162
|
+
apply = predicate(d, i, a) || apply;
|
|
163
|
+
});
|
|
164
|
+
if (apply) {
|
|
165
|
+
setYdomain(newDomain);
|
|
166
|
+
}
|
|
167
|
+
}, [yDomain]);
|
|
168
|
+
// Effect to Reset the legend width/height
|
|
169
|
+
React.useEffect(function () {
|
|
170
|
+
if (props.legendHeight !== undefined)
|
|
171
|
+
setLegendHeight(props.legendHeight);
|
|
172
|
+
}, [props.legendHeight]);
|
|
173
|
+
React.useEffect(function () {
|
|
174
|
+
if (props.legendWidth !== undefined)
|
|
175
|
+
setLegendWidth(props.legendWidth);
|
|
176
|
+
}, [props.legendWidth]);
|
|
177
|
+
// Recompute height and width
|
|
178
|
+
React.useEffect(function () {
|
|
179
|
+
setSVGheight(props.height - (props.legend === 'bottom' ? legendHeight : 0));
|
|
180
|
+
}, [props.height, props.legend, legendHeight]);
|
|
181
|
+
React.useEffect(function () {
|
|
182
|
+
setSVGwidth(props.width - (props.legend === 'right' ? legendWidth : 0));
|
|
183
|
+
}, [props.width, props.legend, legendWidth]);
|
|
184
|
+
// enforce T limits
|
|
185
|
+
React.useEffect(function () {
|
|
186
|
+
if (props.Tmin !== undefined && tDomain[0] < props.Tmin)
|
|
187
|
+
setTdomain(function (t) { var _a; return ([(_a = props.Tmin) !== null && _a !== void 0 ? _a : 0, t[1]]); });
|
|
188
|
+
if (props.Tmax !== undefined && tDomain[1] > props.Tmax)
|
|
189
|
+
setTdomain(function (t) { var _a; return ([t[0], (_a = props.Tmax) !== null && _a !== void 0 ? _a : 0]); });
|
|
190
|
+
}, [tDomain]);
|
|
191
|
+
// enforce Y limits
|
|
192
|
+
React.useEffect(function () {
|
|
193
|
+
var mutateDomain = function (domain, axis, allDomains) {
|
|
194
|
+
var hasApplied = false;
|
|
195
|
+
// Need to type correct our arguements
|
|
196
|
+
var propMin = typeCorrect(props.Ymin, axis);
|
|
197
|
+
var propMax = typeCorrect(props.Ymax, axis);
|
|
198
|
+
if (propMin !== undefined && domain[0] < propMin) {
|
|
199
|
+
allDomains[axis] = [propMin, domain[1]];
|
|
200
|
+
hasApplied = true;
|
|
201
|
+
}
|
|
202
|
+
if (propMax !== undefined && domain[1] > propMax) {
|
|
203
|
+
allDomains[axis] = [domain[0], propMax];
|
|
204
|
+
hasApplied = true;
|
|
205
|
+
}
|
|
206
|
+
return hasApplied;
|
|
207
|
+
};
|
|
208
|
+
applyToYDomain(mutateDomain);
|
|
209
|
+
}, [yDomain]);
|
|
210
|
+
React.useEffect(function () {
|
|
211
|
+
if (!(0, lodash_1.isEqual)(defaultTdomain, props.defaultTdomain))
|
|
212
|
+
setDefaultTdomain(props.defaultTdomain);
|
|
213
|
+
}, [props.defaultTdomain]);
|
|
214
|
+
React.useEffect(function () {
|
|
215
|
+
if (!(0, lodash_1.isEqual)(defaultYdomain, props.defaultYdomain))
|
|
216
|
+
setDefaultYdomain(typeCorrectDomain(props.defaultYdomain));
|
|
217
|
+
}, [props.defaultYdomain]);
|
|
218
|
+
React.useEffect(function () {
|
|
219
|
+
setTdomain(defaultTdomain);
|
|
220
|
+
}, [defaultTdomain]);
|
|
221
|
+
React.useEffect(function () {
|
|
222
|
+
setYdomain(defaultYdomain);
|
|
223
|
+
}, [defaultYdomain]);
|
|
224
|
+
// Adjust top and bottom Offset
|
|
225
|
+
React.useEffect(function () {
|
|
226
|
+
var top = heightYFactor + 10;
|
|
227
|
+
var bottom = heightXLabel;
|
|
228
|
+
if (offsetTop !== top)
|
|
229
|
+
setOffsetTop(top);
|
|
230
|
+
if (offsetBottom !== bottom)
|
|
231
|
+
setOffsetBottom(bottom);
|
|
232
|
+
}, [heightXLabel, heightYFactor]);
|
|
233
|
+
// Adjust Left Offset
|
|
234
|
+
React.useEffect(function () {
|
|
235
|
+
var left = heightLeftYLabel + (props.menuLocation === 'left' ? (menueWidth + 2) : 10);
|
|
236
|
+
setOffsetLeft(left);
|
|
237
|
+
}, [heightLeftYLabel, props.menuLocation, menueWidth]);
|
|
238
|
+
// Adjust Right Offset
|
|
239
|
+
React.useEffect(function () {
|
|
240
|
+
var right = heightRightYLabel + ((props.menuLocation === 'right' || props.menuLocation === undefined) ? (menueWidth + 2) : 10);
|
|
241
|
+
setOffsetRight(right);
|
|
242
|
+
}, [heightRightYLabel, props.menuLocation, menueWidth]);
|
|
243
|
+
// Adjust Y domain defaults
|
|
244
|
+
React.useEffect(function () {
|
|
245
|
+
if (props.yDomain !== 'AutoValue' && props.yDomain !== 'HalfAutoValue')
|
|
246
|
+
return;
|
|
247
|
+
var dataReducerFunc = function (result, series, func, axis) {
|
|
248
|
+
// This part of the data may not belong to the axis we care about at the moment
|
|
249
|
+
var dataAxis = GraphContext_1.AxisMap.get(series.axis);
|
|
250
|
+
if (axis === dataAxis) {
|
|
251
|
+
var value = func([Number.MIN_SAFE_INTEGER, Number.MAX_SAFE_INTEGER]);
|
|
252
|
+
if (value !== undefined)
|
|
253
|
+
result.push(value);
|
|
254
|
+
}
|
|
255
|
+
return result;
|
|
256
|
+
};
|
|
257
|
+
var newDefaultDomain = defaultYdomain.map(function (yDomain, axis) {
|
|
258
|
+
var yMin = Math.min.apply(Math, __spreadArray([], __read(__spreadArray([], __read(data.current.values()), false).reduce(function (result, series) { return dataReducerFunc(result, series, series.getMin, axis); }, [])), false));
|
|
259
|
+
var yMax = Math.max.apply(Math, __spreadArray([], __read(__spreadArray([], __read(data.current.values()), false).reduce(function (result, series) { return dataReducerFunc(result, series, series.getMax, axis); }, [])), false));
|
|
260
|
+
if (!isNaN(yMin) && !isNaN(yMax) && isFinite(yMin) && isFinite(yMax)) {
|
|
261
|
+
if (props.yDomain === 'AutoValue')
|
|
262
|
+
return [yMin, yMax];
|
|
263
|
+
// If this condition is satisfied, it means our series is mostly positive range
|
|
264
|
+
else if (Math.abs(yMax) >= Math.abs(yMin))
|
|
265
|
+
return [0, yMax];
|
|
266
|
+
else
|
|
267
|
+
return [yMin, 0];
|
|
268
|
+
}
|
|
269
|
+
return [0, 1];
|
|
270
|
+
});
|
|
271
|
+
if (!_.isEqual(newDefaultDomain, defaultYdomain))
|
|
272
|
+
setDefaultYdomain(newDefaultDomain);
|
|
273
|
+
}, [dataGuid, props.yDomain]);
|
|
274
|
+
React.useEffect(function () {
|
|
275
|
+
var newHasData = Array(2);
|
|
276
|
+
var hasFunc = function (axis) { return __spreadArray([], __read(data.current.values()), false).some(function (series) { return GraphContext_1.AxisMap.get(axis) === GraphContext_1.AxisMap.get(series.axis); }); };
|
|
277
|
+
newHasData[0] = hasFunc('left');
|
|
278
|
+
newHasData[1] = hasFunc('right');
|
|
279
|
+
setYHasData(newHasData);
|
|
280
|
+
}, [dataGuid]);
|
|
281
|
+
// Adjust x axis
|
|
282
|
+
React.useEffect(function () {
|
|
283
|
+
var dT = tDomain[1] - tDomain[0];
|
|
284
|
+
var dTmin = tDomain[0];
|
|
285
|
+
if (dT === 0)
|
|
286
|
+
return;
|
|
287
|
+
if (props.XAxisType === 'log') {
|
|
288
|
+
dT = Math.log10(tDomain[1]) - Math.log10(tDomain[0]);
|
|
289
|
+
dTmin = Math.log10(tDomain[0]);
|
|
290
|
+
}
|
|
291
|
+
var scale = (svgWidth - offsetLeft - offsetRight) / dT;
|
|
292
|
+
setTscale(scale);
|
|
293
|
+
setToffset(offsetLeft - dTmin * scale);
|
|
294
|
+
}, [tDomain, offsetLeft, offsetRight, props.XAxisType, svgWidth]);
|
|
295
|
+
// Adjust y axis
|
|
296
|
+
React.useEffect(function () {
|
|
297
|
+
var e_1, _a;
|
|
298
|
+
var mutateFunction = function (scaleArray, offsetArray, axis) {
|
|
299
|
+
var dY = yDomain[axis][1] - yDomain[axis][0];
|
|
300
|
+
var scale = (svgHeight - offsetTop - offsetBottom) / (dY === 0 ? 0.00001 : dY);
|
|
301
|
+
scaleArray[axis] = -scale;
|
|
302
|
+
offsetArray[axis] = svgHeight - offsetBottom + yDomain[axis][0] * scale;
|
|
303
|
+
};
|
|
304
|
+
// Update every axis
|
|
305
|
+
var newScale = __spreadArray([], __read(yScale), false);
|
|
306
|
+
var newOffset = __spreadArray([], __read(yOffset), false);
|
|
307
|
+
try {
|
|
308
|
+
for (var _b = __values(GraphContext_1.AxisMap.values()), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
309
|
+
var axis = _c.value;
|
|
310
|
+
mutateFunction(newScale, newOffset, axis);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
314
|
+
finally {
|
|
315
|
+
try {
|
|
316
|
+
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
317
|
+
}
|
|
318
|
+
finally { if (e_1) throw e_1.error; }
|
|
319
|
+
}
|
|
320
|
+
setYscale(newScale);
|
|
321
|
+
setYoffset(newOffset);
|
|
322
|
+
}, [yDomain, offsetTop, offsetBottom, svgHeight]);
|
|
323
|
+
React.useEffect(function () { setUpdateFlag(function (x) { return x + 1; }); }, [tScale, tOffset, yScale, yOffset]);
|
|
324
|
+
// Change mouse cursor
|
|
325
|
+
React.useEffect(function () {
|
|
326
|
+
var newCursor;
|
|
327
|
+
if (props.cursorOverride == null) {
|
|
328
|
+
switch (selectedMode) {
|
|
329
|
+
case 'pan':
|
|
330
|
+
newCursor = 'grab';
|
|
331
|
+
break;
|
|
332
|
+
case 'select':
|
|
333
|
+
newCursor = 'pointer';
|
|
334
|
+
break;
|
|
335
|
+
default:
|
|
336
|
+
newCursor = 'crosshair';
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
else
|
|
340
|
+
newCursor = props.cursorOverride;
|
|
341
|
+
setMouseStyle(newCursor);
|
|
342
|
+
}, [selectedMode, props.cursorOverride]);
|
|
343
|
+
// Stop scrolling while zooming
|
|
344
|
+
React.useEffect(function () {
|
|
345
|
+
var cancelWheel = function (e) { if (wheelTimeout.current.stopScroll)
|
|
346
|
+
e.preventDefault(); };
|
|
347
|
+
document.body.addEventListener('wheel', cancelWheel, { passive: false });
|
|
348
|
+
return function () { return document.body.removeEventListener('wheel', cancelWheel); };
|
|
349
|
+
}, []);
|
|
350
|
+
// Execute Plot Capture and leave photo mode
|
|
351
|
+
React.useEffect(function () {
|
|
352
|
+
// ToDo: We can clean this up some and improve performance using html2canvas options (but the biggest hurdle is the legend, which we don't have a lot of options for...)
|
|
353
|
+
if (!photoReady)
|
|
354
|
+
return;
|
|
355
|
+
// we can't immediately complete the request, since some layout things may still be changing...
|
|
356
|
+
clearTimeout(heightChange.current.timeout);
|
|
357
|
+
// timeout to set if we don't see any more changes within 0.05 seconds
|
|
358
|
+
heightChange.current.timeout = setTimeout(function () {
|
|
359
|
+
var _a;
|
|
360
|
+
var id = (_a = heightChange.current.captureID) !== null && _a !== void 0 ? _a : guid;
|
|
361
|
+
var element = document.getElementById(id);
|
|
362
|
+
if (element == null) {
|
|
363
|
+
console.error("Could not find document element with id ".concat(id));
|
|
364
|
+
}
|
|
365
|
+
else {
|
|
366
|
+
html2canvas(element).then(function (canvas) {
|
|
367
|
+
document.body.appendChild(canvas);
|
|
368
|
+
var imageData = canvas.toDataURL("image/png").replace(/^data:image\/png/, "data:application/octet-stream");
|
|
369
|
+
var anchorElement = document.createElement("a");
|
|
370
|
+
anchorElement.href = imageData;
|
|
371
|
+
anchorElement.download = "".concat(id, ".png");
|
|
372
|
+
document.body.appendChild(anchorElement);
|
|
373
|
+
anchorElement.click();
|
|
374
|
+
// Removing children created/cleanup
|
|
375
|
+
window.URL.revokeObjectURL(imageData);
|
|
376
|
+
document.body.removeChild(anchorElement);
|
|
377
|
+
document.body.removeChild(canvas);
|
|
378
|
+
});
|
|
379
|
+
}
|
|
380
|
+
setPhotoReady(false);
|
|
381
|
+
if (props.onCaptureComplete !== undefined)
|
|
382
|
+
props.onCaptureComplete();
|
|
383
|
+
}, 50);
|
|
384
|
+
});
|
|
385
|
+
// requests new legend height/width upto a defined maximum set by props
|
|
386
|
+
var requestLegendHeightChange = React.useCallback(function (newHeight) {
|
|
387
|
+
var _a;
|
|
388
|
+
var heightLimit = props.legend !== 'bottom' ? svgHeight : ((_a = props.legendHeight) !== null && _a !== void 0 ? _a : defaultLegendHeight);
|
|
389
|
+
if (!photoReady)
|
|
390
|
+
heightChange.current.extraNeeded = Math.max(newHeight - heightLimit, 0);
|
|
391
|
+
if (props.legend !== 'bottom')
|
|
392
|
+
return;
|
|
393
|
+
var limitedHeight = Math.min(newHeight, heightLimit);
|
|
394
|
+
if (legendHeight !== limitedHeight)
|
|
395
|
+
setLegendHeight(limitedHeight);
|
|
396
|
+
}, [props.legendHeight, setLegendHeight, legendHeight, props.legend, photoReady]);
|
|
397
|
+
var requestLegendWidthChange = React.useCallback(function (newWidth, requesterID) {
|
|
398
|
+
var _a;
|
|
399
|
+
if (newWidth < 0) {
|
|
400
|
+
widthTimeout.current.requesterMap.delete(requesterID);
|
|
401
|
+
return;
|
|
402
|
+
}
|
|
403
|
+
if (props.legend !== 'right')
|
|
404
|
+
return;
|
|
405
|
+
var limitedWidth = Math.min(newWidth, (_a = props.legendWidth) !== null && _a !== void 0 ? _a : defaultLegendWidth);
|
|
406
|
+
// we can't immediately complete the request, since there are multiple legend items trying to adjust this at a time sometimes
|
|
407
|
+
clearTimeout(widthTimeout.current.timeout);
|
|
408
|
+
widthTimeout.current.requesterMap.set(requesterID, limitedWidth);
|
|
409
|
+
// timeout to set if we don't see any more requests within 0.05 seconds
|
|
410
|
+
widthTimeout.current.timeout = setTimeout(function () {
|
|
411
|
+
var largestRequested = Math.max.apply(Math, __spreadArray([], __read(widthTimeout.current.requesterMap.values()), false));
|
|
412
|
+
if (legendWidth !== largestRequested)
|
|
413
|
+
setLegendWidth(largestRequested);
|
|
414
|
+
}, 50);
|
|
415
|
+
}, [props.legendWidth, setLegendWidth, legendWidth, props.legend]);
|
|
416
|
+
// transforms from pixels into x value. result passed into onClick function
|
|
417
|
+
var xInvTransform = React.useCallback(function (p) {
|
|
418
|
+
var xT = (p - tOffset) / tScale;
|
|
419
|
+
if (props.XAxisType === 'log')
|
|
420
|
+
xT = Math.pow(10, (p - tOffset) / tScale);
|
|
421
|
+
return xT;
|
|
422
|
+
}, [tOffset, tScale, props.XAxisType]);
|
|
423
|
+
// transforms from pixels into y value. result passed into onClick function
|
|
424
|
+
var yInvTransform = React.useCallback(function (p, a) {
|
|
425
|
+
var axis = (typeof (a) !== 'number') ? GraphContext_1.AxisMap.get(a) : a;
|
|
426
|
+
return (p - yOffset[axis]) / yScale[axis];
|
|
427
|
+
}, [yOffset, yScale]);
|
|
428
|
+
var Reset = React.useCallback(function () {
|
|
429
|
+
setTdomain(defaultTdomain);
|
|
430
|
+
setYdomain(defaultYdomain);
|
|
431
|
+
}, [defaultYdomain, defaultTdomain]);
|
|
432
|
+
// new X transformation from x value into Pixels
|
|
433
|
+
var xTransform = React.useCallback(function (value) {
|
|
434
|
+
var xT = value * tScale + tOffset;
|
|
435
|
+
if (props.XAxisType === 'log') {
|
|
436
|
+
var v = (value === 0 ? tDomain[0] * 0.01 : value);
|
|
437
|
+
xT = Math.log10(v) * tScale + tOffset;
|
|
438
|
+
}
|
|
439
|
+
return xT;
|
|
440
|
+
}, [tScale, tOffset, props.XAxisType, tDomain]);
|
|
441
|
+
// new Y transformation from y value into Pixels
|
|
442
|
+
var yTransform = React.useCallback(function (value, a) {
|
|
443
|
+
var axis = (typeof (a) !== 'number') ? GraphContext_1.AxisMap.get(a) : a;
|
|
444
|
+
return value * yScale[axis] + yOffset[axis];
|
|
445
|
+
}, [yScale, yOffset]);
|
|
446
|
+
// applies offset and contraints to x Pixel value to get something that is plotable
|
|
447
|
+
var xApplyOffset = React.useCallback(function (value) {
|
|
448
|
+
if (value >= 0)
|
|
449
|
+
return Math.min(value + offsetLeft, svgWidth - offsetRight);
|
|
450
|
+
else
|
|
451
|
+
return Math.max(offsetLeft, svgWidth - offsetRight + value);
|
|
452
|
+
}, [offsetLeft, offsetRight, svgWidth]);
|
|
453
|
+
// applies offset and contraints to y Pixel value to get something that is plotable
|
|
454
|
+
var yApplyOffset = React.useCallback(function (value) {
|
|
455
|
+
if (value >= 0)
|
|
456
|
+
return Math.min(value + offsetTop, svgHeight - offsetBottom);
|
|
457
|
+
else
|
|
458
|
+
return Math.max(offsetTop, svgHeight - offsetBottom + value);
|
|
459
|
+
}, [offsetTop, offsetBottom, svgHeight]);
|
|
460
|
+
var setData = React.useCallback(function (key, d) {
|
|
461
|
+
setDataGuid((0, helper_functions_1.CreateGuid)());
|
|
462
|
+
if (d != null)
|
|
463
|
+
data.current.set(key, d);
|
|
464
|
+
else
|
|
465
|
+
data.current.delete(key);
|
|
466
|
+
}, []);
|
|
467
|
+
var addData = React.useCallback(function (d) {
|
|
468
|
+
var key = (0, helper_functions_1.CreateGuid)();
|
|
469
|
+
setData(key, d);
|
|
470
|
+
return key;
|
|
471
|
+
}, []);
|
|
472
|
+
var setLegend = React.useCallback(function (key, legend) {
|
|
473
|
+
var series = data.current.get(key);
|
|
474
|
+
if (series === undefined)
|
|
475
|
+
return;
|
|
476
|
+
series.legend = legend;
|
|
477
|
+
data.current.set(key, series);
|
|
478
|
+
}, []);
|
|
479
|
+
function snapMouseToClosestSeries(pixelPt) {
|
|
480
|
+
var xVal = xInvTransform(pixelPt.x);
|
|
481
|
+
var findClosestPoint = function (result, series) {
|
|
482
|
+
var pointArray = series.getPoints(xVal, 7);
|
|
483
|
+
if (pointArray === undefined)
|
|
484
|
+
return result;
|
|
485
|
+
var ptArrayResult = pointArray.reduce(function (result, pt) {
|
|
486
|
+
var point = [xTransform(pt[0]), yTransform(pt[1], GraphContext_1.AxisMap.get(series.axis))];
|
|
487
|
+
var newDistSq = Math.pow((point[0] - pixelPt.x), 2) + Math.pow((point[1] - pixelPt.y), 2);
|
|
488
|
+
if (result.distSq === undefined || newDistSq < result.distSq)
|
|
489
|
+
return { pt: { x: point[0], y: point[1] }, distSq: newDistSq };
|
|
490
|
+
return result;
|
|
491
|
+
}, { pt: { x: 0, y: 0 }, distSq: undefined });
|
|
492
|
+
if (ptArrayResult.distSq !== undefined && (result.distSq === undefined || ptArrayResult.distSq < result.distSq))
|
|
493
|
+
return ptArrayResult;
|
|
494
|
+
return result;
|
|
495
|
+
};
|
|
496
|
+
return __spreadArray([], __read(data.current.values()), false).reduce(function (result, series) { return findClosestPoint(result, series); }, { pt: { x: 0, y: 0 }, distSq: undefined }).pt;
|
|
497
|
+
}
|
|
498
|
+
var registerSelect = React.useCallback(function (handler) {
|
|
499
|
+
var key = (0, helper_functions_1.CreateGuid)();
|
|
500
|
+
handlers.current.set(key, handler);
|
|
501
|
+
return key;
|
|
502
|
+
}, []);
|
|
503
|
+
var removeSelect = React.useCallback(function (key) {
|
|
504
|
+
handlers.current.delete(key);
|
|
505
|
+
}, []);
|
|
506
|
+
var updateSelect = React.useCallback(function (key, handler) {
|
|
507
|
+
handlers.current.set(key, handler);
|
|
508
|
+
}, []);
|
|
509
|
+
var setSelection = React.useCallback(function (s) {
|
|
510
|
+
if (s === "reset")
|
|
511
|
+
Reset();
|
|
512
|
+
else if (s === "download") {
|
|
513
|
+
if (props.onDataInspect !== undefined)
|
|
514
|
+
props.onDataInspect(tDomain);
|
|
515
|
+
}
|
|
516
|
+
else if (s === "capture") {
|
|
517
|
+
setPhotoReady(true);
|
|
518
|
+
if (props.onCapture !== undefined)
|
|
519
|
+
heightChange.current.captureID = props.onCapture(heightChange.current.extraNeeded);
|
|
520
|
+
}
|
|
521
|
+
else
|
|
522
|
+
setSelectedMode(s);
|
|
523
|
+
}, [tDomain, Reset, props.onDataInspect]);
|
|
524
|
+
var getConstrainedYDomain = React.useCallback(function (newTDomain) {
|
|
525
|
+
var dataReducerFunc = function (result, series, func, axis) {
|
|
526
|
+
// This part of the data may not belong to the axis we care about at the moment
|
|
527
|
+
var dataAxis = GraphContext_1.AxisMap.get(series.axis);
|
|
528
|
+
if (axis === dataAxis) {
|
|
529
|
+
var value = func(newTDomain);
|
|
530
|
+
if (value !== undefined)
|
|
531
|
+
result.push(value);
|
|
532
|
+
}
|
|
533
|
+
return result;
|
|
534
|
+
};
|
|
535
|
+
return yDomain.map(function (oldDomain, axis) {
|
|
536
|
+
var yMin = Math.min.apply(Math, __spreadArray([], __read(__spreadArray([], __read(data.current.values()), false).reduce(function (result, series) { return dataReducerFunc(result, series, series.getMin, axis); }, [])), false));
|
|
537
|
+
var yMax = Math.max.apply(Math, __spreadArray([], __read(__spreadArray([], __read(data.current.values()), false).reduce(function (result, series) { return dataReducerFunc(result, series, series.getMax, axis); }, [])), false));
|
|
538
|
+
if (!isNaN(yMin) && !isNaN(yMax) && isFinite(yMin) && isFinite(yMax))
|
|
539
|
+
return [yMin, yMax];
|
|
540
|
+
return yDomain[axis];
|
|
541
|
+
});
|
|
542
|
+
}, [dataGuid, yDomain]);
|
|
543
|
+
function handleMouseWheel(evt) {
|
|
544
|
+
var _a;
|
|
545
|
+
if (props.zoom !== undefined && !props.zoom)
|
|
546
|
+
return;
|
|
547
|
+
if (!selectedMode.includes('zoom'))
|
|
548
|
+
return;
|
|
549
|
+
if (!mouseIn)
|
|
550
|
+
return;
|
|
551
|
+
// while wheel is moving, do not release the lock
|
|
552
|
+
clearTimeout(wheelTimeout.current.timeout);
|
|
553
|
+
wheelTimeout.current.stopScroll = true;
|
|
554
|
+
// flag indicating to lock page scrolling
|
|
555
|
+
wheelTimeout.current.timeout = setTimeout(function () {
|
|
556
|
+
wheelTimeout.current.stopScroll = false;
|
|
557
|
+
}, 200);
|
|
558
|
+
var multiplier = 1.25;
|
|
559
|
+
// event.deltaY positive is wheel down or out and negative is wheel up or in
|
|
560
|
+
if (evt.deltaY < 0)
|
|
561
|
+
multiplier = 0.75;
|
|
562
|
+
if (selectedMode !== 'zoom-horizontal') {
|
|
563
|
+
var x0 = xTransform(tDomain[0]);
|
|
564
|
+
var x1 = xTransform(tDomain[1]);
|
|
565
|
+
if (mousePosition[0] < offsetLeft)
|
|
566
|
+
x1 = multiplier * (x1 - x0) + x0;
|
|
567
|
+
else if (mousePosition[0] > (svgWidth - offsetRight))
|
|
568
|
+
x0 = x1 - multiplier * (x1 - x0);
|
|
569
|
+
else {
|
|
570
|
+
var Xcenter = mousePosition[0];
|
|
571
|
+
x0 = Xcenter - (Xcenter - x0) * multiplier;
|
|
572
|
+
x1 = Xcenter + (x1 - Xcenter) * multiplier;
|
|
573
|
+
}
|
|
574
|
+
if ((x1 - x0) > 10) {
|
|
575
|
+
var newTDomain = void 0;
|
|
576
|
+
if ((_a = props.limitZoom) !== null && _a !== void 0 ? _a : false)
|
|
577
|
+
newTDomain = [Math.max(defaultTdomain[0], xInvTransform(x0)), Math.min(defaultTdomain[1], xInvTransform(x1))];
|
|
578
|
+
else
|
|
579
|
+
newTDomain = [xInvTransform(x0), xInvTransform(x1)];
|
|
580
|
+
if (selectedMode === 'zoom-vertical') {
|
|
581
|
+
var newYDomain = getConstrainedYDomain(newTDomain);
|
|
582
|
+
if (!_.isEqual(newYDomain, yDomain))
|
|
583
|
+
setYdomain(newYDomain);
|
|
584
|
+
}
|
|
585
|
+
setTdomain(newTDomain);
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
if (selectedMode !== 'zoom-vertical') {
|
|
589
|
+
var newYDomain = yDomain.map(function (domain, axis, allDomains) {
|
|
590
|
+
var _a;
|
|
591
|
+
var y0 = yTransform(domain[0], axis);
|
|
592
|
+
var y1 = yTransform(domain[1], axis);
|
|
593
|
+
if (mousePosition[1] < offsetTop)
|
|
594
|
+
y1 = multiplier * (y1 - y0) + y0;
|
|
595
|
+
else if (mousePosition[1] > (svgHeight - offsetBottom))
|
|
596
|
+
y0 = y1 - multiplier * (y1 - y0);
|
|
597
|
+
else {
|
|
598
|
+
var Ycenter = mousePosition[1];
|
|
599
|
+
y0 = Ycenter - (Ycenter - y0) * multiplier;
|
|
600
|
+
y1 = Ycenter + (y1 - Ycenter) * multiplier;
|
|
601
|
+
}
|
|
602
|
+
if (Math.abs(y1 - y0) > 10) {
|
|
603
|
+
if ((_a = props.limitZoom) !== null && _a !== void 0 ? _a : false)
|
|
604
|
+
return [Math.max(defaultYdomain[axis][0], yInvTransform(y0, axis)), Math.min(defaultYdomain[axis][1], yInvTransform(y1, axis))];
|
|
605
|
+
return [yInvTransform(y0, axis), yInvTransform(y1, axis)];
|
|
606
|
+
}
|
|
607
|
+
return domain;
|
|
608
|
+
});
|
|
609
|
+
if (!_.isEqual(newYDomain, yDomain)) {
|
|
610
|
+
// todo: added contraint to t domain when mode is zoom-horizontal
|
|
611
|
+
setYdomain(newYDomain);
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
function handleMouseMove(evt) {
|
|
616
|
+
if (!moveRequested.current)
|
|
617
|
+
requestAnimationFrame(function () { return mouseMoveEvent(evt); });
|
|
618
|
+
moveRequested.current = true;
|
|
619
|
+
}
|
|
620
|
+
function mouseMoveEvent(evt) {
|
|
621
|
+
var _a;
|
|
622
|
+
moveRequested.current = false;
|
|
623
|
+
if (SVGref.current == null)
|
|
624
|
+
return;
|
|
625
|
+
var pt = SVGref.current.createSVGPoint();
|
|
626
|
+
pt.x = evt.clientX;
|
|
627
|
+
pt.y = evt.clientY;
|
|
628
|
+
var ptTransform = pt.matrixTransform(SVGref.current.getScreenCTM().inverse());
|
|
629
|
+
if (mouseMode === 'pan') {
|
|
630
|
+
var dP = mousePosition[0] - ptTransform.x;
|
|
631
|
+
var Plower = xTransform(tDomain[0]);
|
|
632
|
+
var Pupper = xTransform(tDomain[1]);
|
|
633
|
+
var Tmin = xInvTransform(Plower + dP);
|
|
634
|
+
var Tmax = xInvTransform(Pupper + dP);
|
|
635
|
+
if ((props.Tmin === undefined || Tmin > props.Tmin) &&
|
|
636
|
+
(props.Tmax === undefined || Tmax < props.Tmax))
|
|
637
|
+
setTdomain([Tmin, Tmax]);
|
|
638
|
+
var zoomYAxis = function (domain, axis, allDomains) {
|
|
639
|
+
var dY = yInvTransform(mousePosition[1], axis) - yInvTransform(ptTransform.y, axis);
|
|
640
|
+
// Need to type correct our arguements
|
|
641
|
+
var propMin = typeCorrect(props.Ymin, axis);
|
|
642
|
+
var propMax = typeCorrect(props.Ymax, axis);
|
|
643
|
+
if ((propMin === undefined || domain[0] + dY > propMin) &&
|
|
644
|
+
(propMax === undefined || domain[1] + dY < propMax)) {
|
|
645
|
+
allDomains[axis] = [domain[0] + dY, domain[1] + dY];
|
|
646
|
+
return true;
|
|
647
|
+
}
|
|
648
|
+
return false;
|
|
649
|
+
};
|
|
650
|
+
applyToYDomain(zoomYAxis);
|
|
651
|
+
}
|
|
652
|
+
setMousePosition([ptTransform.x, ptTransform.y]);
|
|
653
|
+
// Here on mouse is snapped (if neccessary)
|
|
654
|
+
var ptFinal;
|
|
655
|
+
if ((_a = props.snapMouse) !== null && _a !== void 0 ? _a : false)
|
|
656
|
+
ptFinal = snapMouseToClosestSeries(ptTransform);
|
|
657
|
+
else
|
|
658
|
+
ptFinal = ptTransform;
|
|
659
|
+
setMousePositionSnap([ptFinal.x, ptFinal.y]);
|
|
660
|
+
if (handlers.current.size > 0)
|
|
661
|
+
handlers.current.forEach(function (v) { return (v.onMove !== undefined ? v.onMove(xInvTransform(v.allowSnapping ? ptFinal.x : ptTransform.x), yInvTransform(v.allowSnapping ? ptFinal.y : ptTransform.y, v.axis)) : null); });
|
|
662
|
+
}
|
|
663
|
+
function handleMouseDown(evt) {
|
|
664
|
+
var _a;
|
|
665
|
+
if (SVGref.current == null)
|
|
666
|
+
return;
|
|
667
|
+
var pt = SVGref.current.createSVGPoint();
|
|
668
|
+
pt.x = evt.clientX;
|
|
669
|
+
pt.y = evt.clientY;
|
|
670
|
+
var ptTransform = pt.matrixTransform(SVGref.current.getScreenCTM().inverse());
|
|
671
|
+
setMouseClick([ptTransform.x, ptTransform.y]);
|
|
672
|
+
if (selectedMode.includes('zoom') && (props.zoom === undefined || props.zoom))
|
|
673
|
+
setMouseMode(selectedMode);
|
|
674
|
+
if (selectedMode === 'pan' && (props.pan === undefined || props.pan)) {
|
|
675
|
+
setMouseMode('pan');
|
|
676
|
+
setMouseStyle('grabbing');
|
|
677
|
+
}
|
|
678
|
+
// Todo: Review question: can we just use mousePosition and mousePositionSnap here?
|
|
679
|
+
// Here on mouse is snapped (if neccessary)
|
|
680
|
+
var ptFinal;
|
|
681
|
+
if ((_a = props.snapMouse) !== null && _a !== void 0 ? _a : false)
|
|
682
|
+
ptFinal = snapMouseToClosestSeries(ptTransform);
|
|
683
|
+
else
|
|
684
|
+
ptFinal = ptTransform;
|
|
685
|
+
if (selectedMode === 'select' && props.onSelect !== undefined)
|
|
686
|
+
props.onSelect(xInvTransform(ptFinal.x), __spreadArray([], __read(GraphContext_1.AxisMap.values()), false).map(function (axis) { return yInvTransform(ptFinal.y, axis); }), {
|
|
687
|
+
setTDomain: updateXDomain,
|
|
688
|
+
setYDomain: updateYDomain
|
|
689
|
+
});
|
|
690
|
+
if (handlers.current.size > 0 && selectedMode === 'select')
|
|
691
|
+
handlers.current.forEach(function (v) { return (v.onClick !== undefined ? v.onClick(xInvTransform(v.allowSnapping ? ptFinal.x : ptTransform.x), yInvTransform(v.allowSnapping ? ptFinal.y : ptTransform.y, v.axis)) : null); });
|
|
692
|
+
}
|
|
693
|
+
function handleMouseUp() {
|
|
694
|
+
if (selectedMode === 'pan' && (props.pan === undefined || props.pan))
|
|
695
|
+
setMouseStyle('grab');
|
|
696
|
+
if (mouseMode.includes('zoom')) {
|
|
697
|
+
if ((Math.abs(mousePosition[0] - mouseClick[0]) < 10) && (Math.abs(mousePosition[1] - mouseClick[1]) < 10)) {
|
|
698
|
+
setMouseMode('none');
|
|
699
|
+
return;
|
|
700
|
+
}
|
|
701
|
+
if (mouseMode !== 'zoom-horizontal') {
|
|
702
|
+
var t0 = Math.min(xInvTransform(mousePosition[0]), xInvTransform(mouseClick[0]));
|
|
703
|
+
var t1 = Math.max(xInvTransform(mousePosition[0]), xInvTransform(mouseClick[0]));
|
|
704
|
+
var newTDomain = [Math.max(tDomain[0], t0), Math.min(tDomain[1], t1)];
|
|
705
|
+
if (selectedMode === 'zoom-vertical') {
|
|
706
|
+
var newYDomain = getConstrainedYDomain(newTDomain);
|
|
707
|
+
if (!_.isEqual(newYDomain, yDomain))
|
|
708
|
+
setYdomain(newYDomain);
|
|
709
|
+
}
|
|
710
|
+
setTdomain(newTDomain);
|
|
711
|
+
}
|
|
712
|
+
if (mouseMode !== 'zoom-vertical') {
|
|
713
|
+
var newYDomain = yDomain.map(function (domain, axis, allDomains) {
|
|
714
|
+
var y0 = Math.min(yInvTransform(mousePosition[1], axis), yInvTransform(mouseClick[1], axis));
|
|
715
|
+
var y1 = Math.max(yInvTransform(mousePosition[1], axis), yInvTransform(mouseClick[1], axis));
|
|
716
|
+
return [Math.max(domain[0], y0), Math.min(domain[1], y1)];
|
|
717
|
+
});
|
|
718
|
+
if (!_.isEqual(newYDomain, yDomain)) {
|
|
719
|
+
// todo: added contraint to t domain when mode is zoom-horizontal
|
|
720
|
+
setYdomain(newYDomain);
|
|
721
|
+
}
|
|
722
|
+
}
|
|
723
|
+
}
|
|
724
|
+
setMouseMode('none');
|
|
725
|
+
if (handlers.current.size > 0 && selectedMode === 'select')
|
|
726
|
+
handlers.current.forEach(function (v) { return (v.onRelease !== undefined ? v.onRelease(xInvTransform(v.allowSnapping ? mousePositionSnap[0] : mousePosition[0]), yInvTransform(v.allowSnapping ? mousePositionSnap[1] : mousePosition[1], v.axis)) : null); });
|
|
727
|
+
}
|
|
728
|
+
function handleMouseOut(_) {
|
|
729
|
+
setMouseIn(false);
|
|
730
|
+
if (mouseMode === 'pan')
|
|
731
|
+
setMouseMode('none');
|
|
732
|
+
if (handlers.current.size > 0 && selectedMode === 'select')
|
|
733
|
+
handlers.current.forEach(function (v) { return (v.onPlotLeave !== undefined ? v.onPlotLeave(xInvTransform(v.allowSnapping ? mousePositionSnap[0] : mousePosition[0]), yInvTransform(v.allowSnapping ? mousePositionSnap[1] : mousePosition[1], v.axis)) : null); });
|
|
734
|
+
}
|
|
735
|
+
function handleMouseIn(_) {
|
|
736
|
+
setMouseIn(true);
|
|
737
|
+
}
|
|
738
|
+
function updateXDomain(x) {
|
|
739
|
+
if (x[0] === tDomain[0] && x[1] === tDomain[1])
|
|
740
|
+
return;
|
|
741
|
+
if (x[0] < x[1])
|
|
742
|
+
setTdomain(x);
|
|
743
|
+
else
|
|
744
|
+
setTdomain([x[1], x[0]]);
|
|
745
|
+
}
|
|
746
|
+
function updateYDomain(y) {
|
|
747
|
+
var correctFunction = function (domain, axis, allDomains) {
|
|
748
|
+
if (y[axis][0] === domain[0] && y[axis][1] === domain[1])
|
|
749
|
+
return false;
|
|
750
|
+
if (y[0] < y[1])
|
|
751
|
+
allDomains[axis] = y[axis];
|
|
752
|
+
else
|
|
753
|
+
allDomains[axis] = [y[axis][1], y[axis][0]];
|
|
754
|
+
return true;
|
|
755
|
+
};
|
|
756
|
+
applyToYDomain(correctFunction);
|
|
757
|
+
}
|
|
758
|
+
return (React.createElement(GraphContext_1.ContextWrapper, { XDomain: tDomain, MousePosition: mousePosition, MousePositionSnap: mousePositionSnap, YDomain: yDomain, CurrentMode: selectedMode, MouseIn: mouseIn, UpdateFlag: updateFlag, Data: data, DataGuid: dataGuid, XApplyPixelOffset: xApplyOffset, YApplyPixelOffset: yApplyOffset, XTransform: xTransform, YTransform: yTransform, XInvTransform: xInvTransform, YInvTransform: yInvTransform, SetXDomain: updateXDomain, SetYDomain: updateYDomain, AddData: addData, RemoveData: setData, UpdateData: setData, SetLegend: setLegend, RegisterSelect: registerSelect, RemoveSelect: removeSelect, UpdateSelect: updateSelect },
|
|
759
|
+
React.createElement("div", { id: guid, style: { height: props.height, width: props.width, position: 'relative' } },
|
|
760
|
+
React.createElement("div", { style: { height: svgHeight, width: svgWidth, position: 'absolute', cursor: mouseStyle }, onWheel: handleMouseWheel, onMouseMove: handleMouseMove, onMouseDown: handleMouseDown, onMouseUp: handleMouseUp, onMouseLeave: handleMouseOut, onMouseEnter: handleMouseIn },
|
|
761
|
+
React.createElement("svg", { ref: SVGref, width: svgWidth < 0 ? 0 : svgWidth, height: svgHeight < 0 ? 0 : svgHeight, style: SvgStyle, viewBox: "0 0 ".concat(svgWidth < 0 ? 0 : svgWidth, " ").concat(svgHeight < 0 ? 0 : svgHeight) },
|
|
762
|
+
props.showBorder !== undefined && props.showBorder ? React.createElement("path", { stroke: 'black', d: "M ".concat(offsetLeft, " ").concat(offsetTop, " H ").concat(svgWidth - offsetRight, " V ").concat(svgHeight - offsetBottom, " H ").concat(offsetLeft, " Z") }) : null,
|
|
763
|
+
props.XAxisType === 'time' || props.XAxisType === undefined ?
|
|
764
|
+
React.createElement(TimeAxis_1.default, { label: props.Tlabel, offsetBottom: offsetBottom, offsetLeft: offsetLeft, offsetRight: offsetRight, width: svgWidth, height: svgHeight, setHeight: setHeightXLabel, heightAxis: heightXLabel, showLeftMostTick: !yHasData[0], showRightMostTick: !yHasData[1], showDate: props.showDateOnTimeAxis }) :
|
|
765
|
+
React.createElement(LogAxis_1.default, { offsetTop: offsetTop, showGrid: props.showGrid, label: props.Tlabel, offsetBottom: offsetBottom, offsetLeft: offsetLeft, offsetRight: offsetRight, width: svgWidth, height: svgHeight, setHeight: setHeightXLabel, heightAxis: heightXLabel, showLeftMostTick: !yHasData[0], showRightMostTick: !yHasData[1] }),
|
|
766
|
+
yHasData[0] ? React.createElement(ValueAxis_1.default, { offsetRight: offsetRight, showGrid: props.showGrid, label: typeCorrect(props.Ylabel, 0), offsetTop: offsetTop, offsetLeft: offsetLeft, offsetBottom: offsetBottom, width: svgWidth, height: svgHeight, setWidthAxis: setHeightLeftYLabel, setHeightFactor: setHeightYFactor, axis: 'left', hAxis: heightLeftYLabel, hFactor: heightYFactor, useFactor: props.useMetricFactors === undefined ? true : props.useMetricFactors }) : null,
|
|
767
|
+
yHasData[1] ? React.createElement(ValueAxis_1.default, { offsetRight: offsetRight, showGrid: props.showGrid, label: typeCorrect(props.Ylabel, 1), offsetTop: offsetTop, offsetLeft: offsetLeft, offsetBottom: offsetBottom, width: svgWidth, height: svgHeight, setWidthAxis: setHeightRightYLabel, setHeightFactor: setHeightYFactor, axis: 'right', hAxis: heightRightYLabel, hFactor: heightYFactor, useFactor: props.useMetricFactors === undefined ? true : props.useMetricFactors }) : null,
|
|
768
|
+
React.createElement("defs", null,
|
|
769
|
+
React.createElement("clipPath", { id: "cp-" + guid },
|
|
770
|
+
React.createElement("path", { stroke: 'none', fill: 'none', d: " M ".concat(offsetLeft, ",").concat(offsetTop - 5, " H ").concat(svgWidth - offsetRight + 5, " V ").concat(svgHeight - offsetBottom, " H ").concat(offsetLeft, " Z") }))),
|
|
771
|
+
React.createElement("g", { clipPath: 'url(#cp-' + guid + ')' },
|
|
772
|
+
React.Children.map(props.children, function (element) {
|
|
773
|
+
if (!React.isValidElement(element))
|
|
774
|
+
return null;
|
|
775
|
+
if (element.type === Line_1.default || element.type === LineWithThreshold_1.default || element.type === Infobox_1.default ||
|
|
776
|
+
element.type === HorizontalMarker_1.default || element.type === VerticalMarker_1.default || element.type === SymbolicMarker_1.default
|
|
777
|
+
|| element.type === Circle_1.default || element.type === AggregatingCircles_1.default || element.type === HeatMapChart_1.default)
|
|
778
|
+
return element;
|
|
779
|
+
return null;
|
|
780
|
+
}),
|
|
781
|
+
!photoReady && (props.showMouse === undefined || (props.showMouse !== 'none' && props.showMouse !== false)) ?
|
|
782
|
+
React.createElement("path", { stroke: 'black', style: { strokeWidth: 2, opacity: mouseIn ? 0.8 : 0.0 }, d: (props.showMouse !== 'horizontal' ?
|
|
783
|
+
"M ".concat(mousePosition[0], " ").concat(offsetTop, " V ").concat(svgHeight - offsetBottom) :
|
|
784
|
+
"M ".concat(offsetLeft, " ").concat(mousePosition[1], " H ").concat(svgWidth - offsetRight)) })
|
|
785
|
+
: null,
|
|
786
|
+
(props.zoom === undefined || props.zoom) && mouseMode.includes('zoom') ?
|
|
787
|
+
React.createElement("rect", { fillOpacity: 0.8, fill: 'black', x: mouseMode !== 'zoom-horizontal' ? Math.min(mouseClick[0], mousePosition[0]) : offsetLeft, y: mouseMode !== 'zoom-vertical' ? Math.min(mouseClick[1], mousePosition[1]) : offsetTop, width: mouseMode !== 'zoom-horizontal' ? Math.abs(mouseClick[0] - mousePosition[0]) : (svgWidth - offsetLeft - offsetRight), height: mouseMode !== 'zoom-vertical' ? Math.abs(mouseClick[1] - mousePosition[1]) : (svgHeight - offsetTop - offsetBottom) })
|
|
788
|
+
: null),
|
|
789
|
+
(photoReady || props.menuLocation === 'hide') ? React.createElement(React.Fragment, null) :
|
|
790
|
+
React.createElement(InteractiveButtons_1.default, { showPan: (props.pan === undefined || props.pan), showZoom: props.zoom === undefined || props.zoom, showReset: !(props.pan !== undefined && props.zoom !== undefined && !props.zoom && !props.pan), showSelect: props.onSelect !== undefined || handlers.current.size > 0, showDownload: props.onDataInspect !== undefined, showCapture: props.onCapture !== undefined, currentSelection: selectedMode, setSelection: setSelection, holdOpen: props.holdMenuOpen, heightAvaliable: svgHeight - 22, setWidth: setMenueWidth, x: (props.menuLocation === 'left' ? 14 : (svgWidth - 14 - menueWidth + 20)), y: 22, "data-html2canvas-ignore": "true" }, React.Children.map(props.children, function (element) {
|
|
791
|
+
if (!React.isValidElement(element))
|
|
792
|
+
return null;
|
|
793
|
+
if (element.type === Button_1.default)
|
|
794
|
+
return element;
|
|
795
|
+
return null;
|
|
796
|
+
})))),
|
|
797
|
+
props.legend !== undefined && props.legend !== 'hidden' ?
|
|
798
|
+
React.createElement(Legend_1.default, { location: props.legend, height: legendHeight, width: legendWidth, graphWidth: svgWidth, graphHeight: svgHeight, RequestLegendWidth: requestLegendWidthChange, RequestLegendHeight: requestLegendHeightChange, HideDisabled: photoReady })
|
|
799
|
+
: null)));
|
|
800
|
+
};
|
|
801
|
+
exports.default = Plot;
|
|
802
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGxvdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9QbG90LnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEseUdBQXlHO0FBQ3pHLG1CQUFtQjtBQUNuQixFQUFFO0FBQ0YscUVBQXFFO0FBQ3JFLEVBQUU7QUFDRix3R0FBd0c7QUFDeEcsd0dBQXdHO0FBQ3hHLHNHQUFzRztBQUN0Ryx3RkFBd0Y7QUFDeEYsRUFBRTtBQUNGLDBDQUEwQztBQUMxQyxFQUFFO0FBQ0Ysd0dBQXdHO0FBQ3hHLHdHQUF3RztBQUN4Ryw0RUFBNEU7QUFDNUUsRUFBRTtBQUNGLDhCQUE4QjtBQUM5Qix3R0FBd0c7QUFDeEcsMEJBQTBCO0FBQzFCLG1EQUFtRDtBQUNuRCxFQUFFO0FBQ0YseUdBQXlHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUd6Ryw2QkFBK0I7QUFDL0IsMEJBQTRCO0FBQzVCLDJEQUFzRDtBQUN0RCwrQ0FBNkg7QUFDN0gsbUVBQTBEO0FBQzFELGlDQUEwQztBQUMxQyx1Q0FBa0M7QUFDbEMscUNBQWdDO0FBQ2hDLHlDQUFvQztBQUNwQyxtQ0FBOEI7QUFDOUIseURBQW9EO0FBQ3BELCtCQUEwQjtBQUMxQixtQ0FBOEI7QUFDOUIsdURBQWtEO0FBQ2xELG1EQUE4QztBQUM5QyxtREFBOEM7QUFDOUMsbUNBQThCO0FBQzlCLDJEQUFzRDtBQUN0RCxxQ0FBZ0M7QUFDaEMsK0NBQTBDO0FBQzFDLDBDQUE0QztBQUM1QyxJQUFNLFdBQVcsR0FBUSxZQUFZLENBQUM7QUEwQ3RDLElBQU0sUUFBUSxHQUF3QjtJQUNsQyxJQUFJLEVBQUUsTUFBTTtJQUNaLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLGtCQUFrQixFQUFFLE1BQU07SUFDMUIsZ0JBQWdCLEVBQUUsTUFBTTtJQUN4QixlQUFlLEVBQUUsTUFBTTtJQUN2QixhQUFhLEVBQUUsTUFBTTtJQUNyQixZQUFZLEVBQUUsTUFBTTtJQUNwQixhQUFhLEVBQUUsTUFB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
|