@zac-apps/helium 2.0.0-beta.13 → 2.0.0-beta.14

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.
Files changed (2) hide show
  1. package/dist/index.js +1900 -9
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1,18 +1,1909 @@
1
1
  import _defineProperty from '@babel/runtime/helpers/defineProperty';
2
2
  import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
3
- import { useState, useEffect } from 'react';
3
+ import React, { createContext, useContext, useState, useEffect } from 'react';
4
4
  import { useImmer } from 'use-immer';
5
5
  import useMediaQuery from '@mui/material/useMediaQuery';
6
6
  import Grid from '@mui/material/Grid';
7
- import GraphsPanel from '@/helium/panels/GraphsPanel.js';
8
- import CalculatorPanel from '@/helium/panels/CalculatorPanel.js';
9
- import SpectrometerSetPanel from '@/helium/panels/SpectrometerSetPanel.js';
10
- import EstimatedConsumptionPanel from '@/helium/panels/EstimatedConsumptionPanel.js';
11
- import EstimationPanel from '@/helium/panels/EstimationPanel.js';
12
- import FillTargetPanel from '@/helium/panels/FillTargetPanel.js';
13
- import { AppTheme, PublicFetch, Progress, AppGrid } from '@zac-apps/commons';
14
- import { HeliumContext } from '@/helium/HeliumContext.js';
7
+ import { AppTheme, AppTable, TableHeadCell, DivTitle, AppCard, ErrorAlert, Percentage, SpecSwitch, PublicFetch, Progress, AppGrid } from '@zac-apps/commons';
8
+ import moment from 'moment';
9
+ import Paper from '@mui/material/Paper';
10
+ import { LineChart, Line, CartesianGrid, XAxis, Label, YAxis, ReferenceLine, ReferenceArea, Tooltip } from 'recharts';
11
+ import ButtonGroup from '@mui/material/ButtonGroup';
12
+ import Button from '@mui/material/Button';
13
+ import FormGroup from '@mui/material/FormGroup';
14
+ import FormControlLabel from '@mui/material/FormControlLabel';
15
+ import Switch from '@mui/material/Switch';
16
+ import TableHead from '@mui/material/TableHead';
17
+ import TableCell from '@mui/material/TableCell';
18
+ import TableRow from '@mui/material/TableRow';
19
+ import TableBody from '@mui/material/TableBody';
15
20
  import { jsx, jsxs } from 'react/jsx-runtime';
21
+ import regression from 'regression';
22
+ import { mean, sqrt, sum } from 'mathjs';
23
+ import IconButton from '@mui/material/IconButton';
24
+ import SaveIcon from '@mui/icons-material/Save';
25
+ import EditIcon from '@mui/icons-material/Edit';
26
+ import TextField from '@mui/material/TextField';
27
+ import InputAdornment from '@mui/material/InputAdornment';
28
+ import moment$1 from 'moment/moment.js';
29
+ import Divider from '@mui/material/Divider';
30
+ import Typography from '@mui/material/Typography';
31
+ import FormControl from '@mui/material/FormControl';
32
+ import Checkbox from '@mui/material/Checkbox';
33
+ import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';
34
+ import Chip from '@mui/material/Chip';
35
+ import AddBoxIcon from '@mui/icons-material/AddBox';
36
+ import DeleteIcon from '@mui/icons-material/Delete';
37
+
38
+ // Define context
39
+
40
+ var HeliumContext = /*#__PURE__*/createContext(null);
41
+
42
+ function ShowEstimate(_ref) {
43
+ var spec = _ref.spec,
44
+ estimatedBoiloff = _ref.estimatedBoiloff,
45
+ estimatedError = _ref.estimatedError;
46
+ var heliumLookupData = useContext(HeliumContext).heliumLookupData;
47
+
48
+ // Get stored data
49
+
50
+ var storedBoiloff = heliumLookupData.boilOff[spec].toFixed(3) || "N/A";
51
+
52
+ // Round values from props
53
+
54
+ estimatedBoiloff = estimatedBoiloff.toFixed(3) || "N/A";
55
+ estimatedError = estimatedError.toFixed(3) || "N/A";
56
+
57
+ // Warn if values differ
58
+
59
+ var renderEstimatedBoiloff = Math.abs(estimatedBoiloff - storedBoiloff) < 0.01 ? estimatedBoiloff : /*#__PURE__*/jsx("strong", {
60
+ style: {
61
+ color: AppTheme.palette.primary.main
62
+ },
63
+ children: estimatedBoiloff
64
+ });
65
+ return /*#__PURE__*/jsxs("div", {
66
+ children: [/*#__PURE__*/jsx("h4", {
67
+ children: "Boiloff coefficients (%/day)"
68
+ }), /*#__PURE__*/jsx(Grid, {
69
+ container: true,
70
+ children: /*#__PURE__*/jsxs(AppTable, {
71
+ children: [/*#__PURE__*/jsx(TableHead, {
72
+ children: /*#__PURE__*/jsxs(TableRow, {
73
+ children: [/*#__PURE__*/jsx(TableHeadCell, {
74
+ children: "Estimated"
75
+ }), /*#__PURE__*/jsx(TableHeadCell, {
76
+ children: "Stored"
77
+ })]
78
+ })
79
+ }), /*#__PURE__*/jsx(TableBody, {
80
+ children: /*#__PURE__*/jsxs(TableRow, {
81
+ children: [/*#__PURE__*/jsxs(TableCell, {
82
+ children: [renderEstimatedBoiloff, " ", /*#__PURE__*/jsxs("em", {
83
+ style: {
84
+ color: AppTheme.palette.secondary.main
85
+ },
86
+ children: ["(\xB1", estimatedError, ")"]
87
+ })]
88
+ }), /*#__PURE__*/jsx(TableCell, {
89
+ children: storedBoiloff
90
+ })]
91
+ })
92
+ })]
93
+ })
94
+ })]
95
+ });
96
+ }
97
+
98
+ function EstimateSlope(_ref) {
99
+ var data = _ref.data;
100
+ _ref.spec;
101
+ // define slope and intercept
102
+
103
+ var slope = 0;
104
+ var intercept = 0;
105
+
106
+ // Define firstMax and firstMaxIndex
107
+
108
+ var firstMax = Number(data[data.length - 1].level);
109
+ var firstMaxIndex = data.length - 1;
110
+
111
+ // Check if the last time when the spectrometer was filled is more than 45 days ago
112
+
113
+ var lastMaxIndex = data.length - 1;
114
+ var lastMax = Number(data[lastMaxIndex].level);
115
+ for (var i = data.length - 2; i >= 0; i--) {
116
+ var level = Number(data[i].level);
117
+ if (level > firstMax) {
118
+ lastMax = level;
119
+ lastMaxIndex = i;
120
+ }
121
+
122
+ // stop if level decreases from maximum
123
+
124
+ if (level < lastMax) {
125
+ break;
126
+ }
127
+ }
128
+
129
+ // if the last maximum is less than 45 days ago, use the last maximum as the first maximum
130
+ // otherwise, the initial firstMaxIndex is the last maximum index
131
+
132
+ if (lastMaxIndex >= data.length - 45) {
133
+ firstMaxIndex = lastMaxIndex - 1;
134
+ firstMax = Number(data[firstMaxIndex].level);
135
+ }
136
+
137
+ // minimum level is the level at firstMaxIndex
138
+
139
+ var minLevelIndex = firstMaxIndex - 1;
140
+
141
+ // find previous time when spectrometer was filled - for this start from lastMinimumIndex and go back until a maximum is found or until level reaches 90%
142
+
143
+ var maxLevel = Number(data[minLevelIndex].level);
144
+ var maxLevelIndex = minLevelIndex;
145
+ for (var _i = minLevelIndex - 1; _i >= 0; _i--) {
146
+ var _level = Number(data[_i].level);
147
+ if (_level > maxLevel) {
148
+ maxLevel = _level;
149
+ maxLevelIndex = _i;
150
+ }
151
+
152
+ // stop if level is decreases from maximum or if level is above 90%
153
+
154
+ if (_level < maxLevel - 1 || _level >= 90) {
155
+ break;
156
+ }
157
+ }
158
+
159
+ // Create an array of points between maximum and minimum in the form [[x1, y1], [x2, y2], ...]
160
+
161
+ var points = [];
162
+ for (var _i2 = maxLevelIndex; _i2 <= minLevelIndex; _i2++) {
163
+ points.push([_i2, Number(data[_i2].level)]);
164
+ }
165
+
166
+ // Perform linear regression on the points
167
+
168
+ var result = regression.linear(points, {
169
+ precision: 6
170
+ });
171
+ slope = result.equation[0];
172
+ intercept = result.equation[1];
173
+
174
+ // Determine slope uncertainty based on regression result
175
+ // For that, create an array of control values
176
+ var control = [];
177
+ for (var _i3 = maxLevelIndex; _i3 <= minLevelIndex; _i3++) {
178
+ control.push([_i3, _i3 * slope + intercept]);
179
+ }
180
+
181
+ // Calculate mean x value
182
+
183
+ var meanX = mean(points.map(function (point) {
184
+ return point[0];
185
+ }));
186
+
187
+ // Calculate standard slope error
188
+
189
+ var slopeError = sqrt(1 / (control.length - 2) * sum(points.map(function (point, i) {
190
+ return Math.pow(point[1] - control[i][1], 2);
191
+ })) / sum(points.map(function (point, i) {
192
+ return Math.pow(point[0] - meanX, 2);
193
+ })));
194
+ return {
195
+ slope: slope,
196
+ intercept: intercept,
197
+ slopeError: slopeError
198
+ };
199
+ }
200
+
201
+ function ownKeys$4(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
202
+ function _objectSpread$4(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$4(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$4(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
203
+ function RenderGraph(_ref) {
204
+ var data = _ref.data,
205
+ height = _ref.height,
206
+ width = _ref.width,
207
+ spec = _ref.spec;
208
+ // Import Context
209
+
210
+ var heliumLookupData = useContext(HeliumContext).heliumLookupData;
211
+
212
+ // Get estimated data
213
+
214
+ var estimateResult = EstimateSlope(_objectSpread$4({}, {
215
+ data: data,
216
+ spec: spec
217
+ }));
218
+ var estimatedBoiloff = estimateResult.slope;
219
+ var estimatedIntercept = estimateResult.intercept;
220
+ var estimatedError = estimateResult.slopeError;
221
+
222
+ // Custom Tooltip for LineChart
223
+
224
+ var CustomTooltip = function CustomTooltip(_ref2) {
225
+ var active = _ref2.active,
226
+ payload = _ref2.payload,
227
+ label = _ref2.label;
228
+ if (active && payload && payload.length) {
229
+ var date = moment(payload[0].payload.date, "ddd MMM D HH:mm:ss YYYY").format("LL");
230
+ return /*#__PURE__*/jsxs("div", {
231
+ style: {
232
+ border: "solid 1px " + AppTheme.palette.secondary.main,
233
+ padding: "0.75em",
234
+ backgroundColor: "#ffffffaa"
235
+ },
236
+ children: [/*#__PURE__*/jsx("strong", {
237
+ children: date
238
+ }), /*#__PURE__*/jsx("br", {}), /*#__PURE__*/jsxs("em", {
239
+ children: ["(", label, " days ago)"]
240
+ }), /*#__PURE__*/jsx("br", {}), /*#__PURE__*/jsxs("strong", {
241
+ style: {
242
+ color: AppTheme.palette.primary.main
243
+ },
244
+ children: [payload[0].value, " %"]
245
+ })]
246
+ });
247
+ }
248
+ };
249
+
250
+ // Button for days state change
251
+
252
+ function DayButton(_ref3) {
253
+ var value = _ref3.value;
254
+ return /*#__PURE__*/jsx(Button, {
255
+ onClick: function onClick() {
256
+ return SetDays(value);
257
+ },
258
+ color: value === days ? "primary" : "secondary" // Active button style
259
+ ,
260
+ variant: value === days ? "contained" : "outlined" // Active button style
261
+ ,
262
+ size: "small",
263
+ children: value
264
+ });
265
+ }
266
+
267
+ // State
268
+
269
+ var _useState = useState(90),
270
+ _useState2 = _slicedToArray(_useState, 2),
271
+ days = _useState2[0],
272
+ SetDays = _useState2[1];
273
+ var _useState3 = useState(true),
274
+ _useState4 = _slicedToArray(_useState3, 2),
275
+ showMinima = _useState4[0],
276
+ setShowMinima = _useState4[1];
277
+ var _useState5 = useState(false),
278
+ _useState6 = _slicedToArray(_useState5, 2),
279
+ showEstimate = _useState6[0],
280
+ setShowEstimate = _useState6[1];
281
+
282
+ // Add days ago to data (do not mutate props — create a new array)
283
+ var dataWithDays = (data || []).map(function (item) {
284
+ return _objectSpread$4(_objectSpread$4({}, item), {}, {
285
+ days: -moment(item.date, "ddd MMM D HH:mm:ss YYYY").diff(moment(), "days")
286
+ });
287
+ });
288
+
289
+ // Get chart data from estimate
290
+
291
+ // First, get difference between today and last data point
292
+
293
+ // Guard against empty data
294
+ var daysSinceUpate = 0;
295
+ if (dataWithDays.length > 0) {
296
+ daysSinceUpate = moment().diff(moment(dataWithDays[dataWithDays.length - 1].date, "ddd MMM D HH:mm:ss YYYY"), "days");
297
+ }
298
+
299
+ // Then calculate estimated data points
300
+
301
+ // Build final dataset (with optional estimate) without mutating original
302
+ var dataWithEstimate = showEstimate ? dataWithDays.map(function (item) {
303
+ var itemDays = item.days;
304
+ var level = item.level;
305
+ var estimate = estimatedBoiloff * (dataWithDays.length - itemDays + daysSinceUpate) + estimatedIntercept;
306
+ return {
307
+ date: item.date,
308
+ days: itemDays,
309
+ level: level,
310
+ estimate: estimate
311
+ };
312
+ }) : dataWithDays;
313
+
314
+ // Get last n elements of array
315
+
316
+ var slicedData = dataWithEstimate.slice(Math.max(dataWithEstimate.length - days, 0));
317
+
318
+ // Improve visibility of estimate
319
+
320
+ var lineColor = showEstimate ? AppTheme.palette.grey[300] : AppTheme.palette.primary.main;
321
+ return /*#__PURE__*/jsxs(React.Fragment, {
322
+ children: [/*#__PURE__*/jsxs(LineChart, {
323
+ height: height,
324
+ width: width,
325
+ data: slicedData,
326
+ margin: {
327
+ top: 5,
328
+ right: 20,
329
+ bottom: 25,
330
+ left: 0
331
+ },
332
+ children: [/*#__PURE__*/jsx(Line, {
333
+ dataKey: "level",
334
+ stroke: lineColor,
335
+ fill: lineColor,
336
+ type: "linear",
337
+ dot: {
338
+ r: 1.5
339
+ }
340
+ }), showEstimate ? /*#__PURE__*/jsx(Line, {
341
+ dataKey: "estimate",
342
+ stroke: AppTheme.palette.action.main,
343
+ type: "monotone",
344
+ strokeDasharray: "5 5",
345
+ strokeWidth: 2,
346
+ dot: false
347
+ }) : null, /*#__PURE__*/jsx(CartesianGrid, {
348
+ stroke: AppTheme.palette.divider,
349
+ strokeDasharray: "5 5"
350
+ }), /*#__PURE__*/jsx(XAxis, {
351
+ dataKey: "days",
352
+ interval: days < 15 ? 1 : Math.round(days / 3),
353
+ children: /*#__PURE__*/jsx(Label, {
354
+ value: "Days ago",
355
+ offset: 1,
356
+ position: "bottom"
357
+ })
358
+ }), /*#__PURE__*/jsx(YAxis, {
359
+ dataKey: "level",
360
+ unit: "%",
361
+ type: "number",
362
+ domain: [0, 100]
363
+ }), showMinima ? /*#__PURE__*/jsxs(React.Fragment, {
364
+ children: [/*#__PURE__*/jsx(ReferenceLine, {
365
+ y: heliumLookupData.minima[spec],
366
+ stroke: AppTheme.palette.secondary.main,
367
+ strokeDasharray: (3)
368
+ }), /*#__PURE__*/jsx(ReferenceArea, {
369
+ y1: heliumLookupData.minima[spec],
370
+ y2: 0,
371
+ stroke: "none",
372
+ stro: true,
373
+ fill: AppTheme.palette.secondary.main,
374
+ fillOpacity: 0.1
375
+ })]
376
+ }) : null, /*#__PURE__*/jsx(Tooltip, {
377
+ content: /*#__PURE__*/jsx(CustomTooltip, {})
378
+ })]
379
+ }), /*#__PURE__*/jsxs(ButtonGroup, {
380
+ disableElevation: true,
381
+ variant: "outlined",
382
+ fullWidth: true,
383
+ color: "secondary",
384
+ "aria-label": "contained primary button group",
385
+ sx: {
386
+ justifySelf: "center",
387
+ px: 5
388
+ },
389
+ size: "small",
390
+ children: [/*#__PURE__*/jsx(DayButton, {
391
+ value: 7
392
+ }), /*#__PURE__*/jsx(DayButton, {
393
+ value: 30
394
+ }), /*#__PURE__*/jsx(DayButton, {
395
+ value: 90
396
+ }), /*#__PURE__*/jsx(DayButton, {
397
+ value: 180
398
+ }), /*#__PURE__*/jsx(DayButton, {
399
+ value: 365
400
+ })]
401
+ }), /*#__PURE__*/jsxs(FormGroup, {
402
+ children: [/*#__PURE__*/jsx(FormControlLabel, {
403
+ control: /*#__PURE__*/jsx(Switch, {
404
+ label: "Show Minimum",
405
+ checked: showMinima,
406
+ onChange: function onChange() {
407
+ return setShowMinima(!showMinima);
408
+ }
409
+ }),
410
+ label: "Show Minimum",
411
+ sx: {
412
+ justifyContent: "center"
413
+ }
414
+ }), /*#__PURE__*/jsx(FormControlLabel, {
415
+ control: /*#__PURE__*/jsx(Switch, {
416
+ label: "Show Estimate",
417
+ checked: showEstimate,
418
+ onChange: function onChange() {
419
+ return setShowEstimate(!showEstimate);
420
+ }
421
+ }),
422
+ label: "Show Estimate",
423
+ sx: {
424
+ justifyContent: "center"
425
+ }
426
+ })]
427
+ }), /*#__PURE__*/jsx(ShowEstimate, {
428
+ spec: spec,
429
+ estimatedBoiloff: estimatedBoiloff,
430
+ estimatedError: estimatedError
431
+ })]
432
+ });
433
+ }
434
+
435
+ function HeliumGraph(_ref) {
436
+ var graphData = _ref.graphData,
437
+ graphDataMeta = _ref.graphDataMeta,
438
+ matches = _ref.matches;
439
+ var height = matches ? 250 : 200;
440
+ var width = matches ? 300 : 280;
441
+ var heliumLookupData = useContext(HeliumContext).heliumLookupData;
442
+
443
+ // remove spectrometers not existing in heliumLookupData
444
+
445
+ Object.keys(graphData).forEach(function (spec) {
446
+ if (!heliumLookupData.boilOff[spec]) {
447
+ delete graphData[spec];
448
+ }
449
+ });
450
+
451
+ // Catch missing data
452
+
453
+ if (graphData.error) {
454
+ return /*#__PURE__*/jsxs(React.Fragment, {
455
+ children: [/*#__PURE__*/jsx(DivTitle, {
456
+ children: /*#__PURE__*/jsx("strong", {
457
+ children: "Helium level monitoring"
458
+ })
459
+ }), /*#__PURE__*/jsx(Grid, {
460
+ sx: {
461
+ display: "flex",
462
+ justifyContent: "center"
463
+ },
464
+ children: /*#__PURE__*/jsx("em", {
465
+ children: "No graph data available"
466
+ })
467
+ })]
468
+ });
469
+ }
470
+
471
+ // Render component
472
+
473
+ return /*#__PURE__*/jsxs(React.Fragment, {
474
+ children: [/*#__PURE__*/jsxs(DivTitle, {
475
+ children: [/*#__PURE__*/jsx("strong", {
476
+ children: "Helium level monitoring"
477
+ }), " ", /*#__PURE__*/jsxs("em", {
478
+ children: ["(updated ", moment(graphDataMeta.date).fromNow(), ")"]
479
+ })]
480
+ }), /*#__PURE__*/jsx(Grid, {
481
+ container: true,
482
+ sx: {
483
+ display: "flex",
484
+ justifyContent: "center"
485
+ },
486
+ children: Object.keys(graphData).map(function (spec) {
487
+ return /*#__PURE__*/jsxs(Paper, {
488
+ sx: {
489
+ display: "flex",
490
+ flexDirection: "column",
491
+ justifyItems: "center",
492
+ stroke: AppTheme.palette.divider,
493
+ px: 2,
494
+ paddingBottom: 2,
495
+ margin: 2
496
+ },
497
+ children: [/*#__PURE__*/jsx("h4", {
498
+ children: spec
499
+ }), /*#__PURE__*/jsx(RenderGraph, {
500
+ data: graphData[spec],
501
+ height: height,
502
+ width: width,
503
+ spec: spec
504
+ })]
505
+ }, "graph_" + spec);
506
+ })
507
+ })]
508
+ });
509
+ }
510
+
511
+ function GraphsPanel(_ref) {
512
+ var graphData = _ref.graphData,
513
+ graphDataMeta = _ref.graphDataMeta;
514
+ var context = useContext(HeliumContext);
515
+ var collapsed = context.collapsed;
516
+ var matches = context.matches;
517
+ return /*#__PURE__*/jsx(AppCard, {
518
+ title: "Helium Graphs",
519
+ size: 12,
520
+ collapsed: collapsed,
521
+ children: /*#__PURE__*/jsx(HeliumGraph, {
522
+ graphData: graphData,
523
+ graphDataMeta: graphDataMeta,
524
+ matches: matches
525
+ })
526
+ });
527
+ }
528
+
529
+ function NumField(_ref) {
530
+ var input = _ref.input,
531
+ SetInput = _ref.SetInput,
532
+ error = _ref.error,
533
+ SetError = _ref.SetError,
534
+ minValue = _ref.minValue,
535
+ maxValue = _ref.maxValue,
536
+ adornment = _ref.adornment,
537
+ size = _ref.size;
538
+ var _useState = useState(""),
539
+ _useState2 = _slicedToArray(_useState, 2),
540
+ errorMessage = _useState2[0],
541
+ SetErrorMessage = _useState2[1];
542
+ var _useState3 = useState(false),
543
+ _useState4 = _slicedToArray(_useState3, 2),
544
+ alert = _useState4[0],
545
+ SetAlert = _useState4[1];
546
+ var sx = {};
547
+ if (size === "small") {
548
+ sx = {
549
+ maxWidth: 75
550
+ };
551
+ }
552
+ function handleEntry(e) {
553
+ var errorFound = false;
554
+ var inputVal = e.target.value;
555
+ if (!inputVal.match(/[0-9-]*/)[0] || inputVal.match(/[0-9-]*/)[0] !== inputVal) {
556
+ errorFound = true;
557
+ SetErrorMessage("Input is not numerical.");
558
+ }
559
+ if (inputVal > maxValue || inputVal < minValue) {
560
+ errorFound = true;
561
+ SetErrorMessage("Input is outside allowed boundaries.");
562
+ }
563
+ SetInput(inputVal);
564
+ SetError(errorFound);
565
+ SetAlert(errorFound);
566
+ }
567
+ return /*#__PURE__*/jsxs(React.Fragment, {
568
+ children: [/*#__PURE__*/jsx(TextField, {
569
+ size: "small",
570
+ sx: sx,
571
+ onChange: function onChange(e) {
572
+ return handleEntry(e);
573
+ },
574
+ value: input,
575
+ error: error,
576
+ inputProps: {
577
+ inputMode: "numeric"
578
+ },
579
+ InputProps: {
580
+ endAdornment: /*#__PURE__*/jsx(InputAdornment, {
581
+ position: "end",
582
+ children: adornment
583
+ })
584
+ }
585
+ }), /*#__PURE__*/jsx(ErrorAlert, {
586
+ alert: alert,
587
+ SetAlert: SetAlert,
588
+ message: errorMessage
589
+ })]
590
+ });
591
+ }
592
+
593
+ // Look up amount in liters for specific spectrometer
594
+
595
+ function CalcLiters(_ref) {
596
+ var spec = _ref.spec,
597
+ value = _ref.value;
598
+ var heliumLookup = useContext(HeliumContext).heliumLookupData.lookup;
599
+
600
+ // Catch negative values
601
+
602
+ if (value < 0 || !value) {
603
+ value = 0;
604
+ } else {
605
+ value = Number(value);
606
+ }
607
+ var returnVal = heliumLookup[spec].find(function (m) {
608
+ return m.level === value;
609
+ }).liters;
610
+ return returnVal;
611
+ }
612
+
613
+ // Look up percentage for liter value in specific spectrometer
614
+
615
+ function CalcPercent(_ref2) {
616
+ var spec = _ref2.spec,
617
+ value = _ref2.value;
618
+ var heliumLookup = useContext(HeliumContext).heliumLookupData.lookup;
619
+ var returnVal = 0;
620
+
621
+ // Catch values out of boundary
622
+
623
+ if (value < 0 || !value) {
624
+ value = 0;
625
+ } else {
626
+ value = Number(value);
627
+ }
628
+ if (value > heliumLookup[spec].find(function (m) {
629
+ return m.level === 100;
630
+ }).liters) {
631
+ returnVal = 100;
632
+ } else {
633
+ var closestLiters = heliumLookup[spec].reduce(function (prev, curr) {
634
+ return Math.abs(curr.liters - value) < Math.abs(prev.liters - value) ? curr : prev;
635
+ }).liters;
636
+ returnVal = heliumLookup[spec].find(function (m) {
637
+ return m.liters === closestLiters;
638
+ }).level;
639
+ }
640
+ return returnVal;
641
+ }
642
+
643
+ // Look up difference from maximum
644
+
645
+ function CalcToMax(_ref3) {
646
+ var spec = _ref3.spec,
647
+ value = _ref3.value;
648
+ var heliumLookup = useContext(HeliumContext).heliumLookupData.lookup;
649
+
650
+ // Catch negative values
651
+
652
+ value = Number(value) || 0;
653
+ if (value < 0 || !value) {
654
+ value = 0;
655
+ }
656
+ var maxLiters = Math.max.apply(null, heliumLookup[spec].map(function (m) {
657
+ return m.liters;
658
+ }));
659
+ var returnVal = maxLiters - heliumLookup[spec].find(function (m) {
660
+ return m.level === value;
661
+ }).liters;
662
+ returnVal = Math.round(returnVal * 10) / 10;
663
+ return returnVal;
664
+ }
665
+
666
+ function HeliumEntry(_ref) {
667
+ var spec = _ref.spec;
668
+ var context = useContext(HeliumContext);
669
+ var heliumLookup = context.heliumLookupData.lookup;
670
+ var heliumData = context.heliumData;
671
+ var SetHeliumData = context.SetHeliumData;
672
+ var SetLevelsEdited = context.SetLevelsEdited;
673
+ var value = Number(heliumData.helium[spec]) || 0;
674
+ var maxValue = Math.max.apply(null, heliumLookup[spec].map(function (m) {
675
+ return m.level;
676
+ }));
677
+ var minValue = 0;
678
+ var _useState = useState(false),
679
+ _useState2 = _slicedToArray(_useState, 2),
680
+ edit = _useState2[0],
681
+ SetEdit = _useState2[1];
682
+ var _useState3 = useState(value),
683
+ _useState4 = _slicedToArray(_useState3, 2),
684
+ input = _useState4[0],
685
+ SetInput = _useState4[1];
686
+ var _useState5 = useState(false),
687
+ _useState6 = _slicedToArray(_useState5, 2),
688
+ error = _useState6[0],
689
+ SetError = _useState6[1];
690
+ if (edit) {
691
+ return /*#__PURE__*/jsxs(TableCell, {
692
+ children: [/*#__PURE__*/jsx(NumField, {
693
+ input: input,
694
+ SetInput: SetInput,
695
+ error: error,
696
+ SetError: SetError,
697
+ minValue: minValue,
698
+ maxValue: maxValue,
699
+ adornment: "%",
700
+ size: "small"
701
+ }), /*#__PURE__*/jsx(IconButton, {
702
+ disabled: error,
703
+ onClick: function onClick() {
704
+ SetHeliumData(function (heliumData) {
705
+ heliumData.helium[spec] = Number(input);
706
+ });
707
+ SetEdit(!edit);
708
+ SetLevelsEdited(true);
709
+ },
710
+ children: /*#__PURE__*/jsx(SaveIcon, {})
711
+ })]
712
+ });
713
+ } else {
714
+ return /*#__PURE__*/jsxs(TableCell, {
715
+ children: [Percentage(value, true), /*#__PURE__*/jsx(IconButton, {
716
+ size: "small",
717
+ onClick: function onClick() {
718
+ return SetEdit(!edit);
719
+ },
720
+ children: /*#__PURE__*/jsx(EditIcon, {})
721
+ })]
722
+ });
723
+ }
724
+ }
725
+
726
+ // render Helium level table
727
+
728
+ function HeliumTable() {
729
+ var context = useContext(HeliumContext);
730
+ var heliumData = context.heliumData;
731
+ context.SetHeliumData;
732
+ context.SetLevelsEdited;
733
+
734
+ // Catch if no data present
735
+
736
+ if (heliumData.helium.length === 0) {
737
+ return /*#__PURE__*/jsx(Grid, {
738
+ children: /*#__PURE__*/jsx("em", {
739
+ children: "No Helium data found."
740
+ })
741
+ });
742
+ }
743
+
744
+ // Calculate sum of missing helium
745
+
746
+ var totalToMax = Object.keys(heliumData.helium).reduce(function (total, current) {
747
+ return total + CalcToMax({
748
+ spec: current,
749
+ value: heliumData.helium[current]
750
+ });
751
+ }, 0);
752
+ totalToMax = Math.round(totalToMax * 10) / 10;
753
+ return /*#__PURE__*/jsxs(AppTable, {
754
+ children: [/*#__PURE__*/jsx(TableHead, {
755
+ children: /*#__PURE__*/jsxs(TableRow, {
756
+ children: [/*#__PURE__*/jsx(TableHeadCell, {
757
+ children: "Spectrometer"
758
+ }), /*#__PURE__*/jsxs(TableHeadCell, {
759
+ children: ["Helium level", /*#__PURE__*/jsx("br", {}), "[%]"]
760
+ }), /*#__PURE__*/jsxs(TableHeadCell, {
761
+ children: ["Helium level", /*#__PURE__*/jsx("br", {}), "[liters]"]
762
+ }), /*#__PURE__*/jsxs(TableHeadCell, {
763
+ children: ["Diff. to maximum", /*#__PURE__*/jsx("br", {}), "[liters]"]
764
+ })]
765
+ })
766
+ }), /*#__PURE__*/jsx(TableBody, {
767
+ children: Object.keys(heliumData.helium).map(function (m) {
768
+ return /*#__PURE__*/jsxs(TableRow, {
769
+ children: [/*#__PURE__*/jsx(TableCell, {
770
+ children: m
771
+ }), /*#__PURE__*/jsx(HeliumEntry, {
772
+ spec: m
773
+ }), /*#__PURE__*/jsx(TableCell, {
774
+ children: /*#__PURE__*/jsx(CalcLiters, {
775
+ spec: m,
776
+ value: heliumData.helium[m]
777
+ })
778
+ }), /*#__PURE__*/jsx(TableCell, {
779
+ children: /*#__PURE__*/jsx("strong", {
780
+ children: /*#__PURE__*/jsx(CalcToMax, {
781
+ spec: m,
782
+ value: heliumData.helium[m]
783
+ })
784
+ })
785
+ })]
786
+ }, m + "_entry");
787
+ })
788
+ }), /*#__PURE__*/jsx("tfoot", {
789
+ children: /*#__PURE__*/jsxs(TableRow, {
790
+ children: [/*#__PURE__*/jsx(TableCell, {
791
+ children: /*#__PURE__*/jsx("strong", {
792
+ children: "Sum"
793
+ })
794
+ }), /*#__PURE__*/jsx(TableCell, {}), /*#__PURE__*/jsx(TableCell, {}), /*#__PURE__*/jsx(TableCell, {
795
+ children: /*#__PURE__*/jsx("strong", {
796
+ children: totalToMax
797
+ })
798
+ })]
799
+ })
800
+ })]
801
+ });
802
+ }
803
+
804
+ function EditAdmon() {
805
+ var context = useContext(HeliumContext);
806
+ if (context.levelsEdited) {
807
+ return /*#__PURE__*/jsxs(React.Fragment, {
808
+ children: [", ", /*#__PURE__*/jsx("strong", {
809
+ children: "edited"
810
+ })]
811
+ });
812
+ } else {
813
+ return null;
814
+ }
815
+ }
816
+
817
+ function CalculatorPanel() {
818
+ var context = useContext(HeliumContext);
819
+ var heliumData = context.heliumData;
820
+ context.levelsEdited;
821
+ return /*#__PURE__*/jsxs(AppCard, {
822
+ title: "Helium Calculator",
823
+ size: context.cardSize,
824
+ collapsed: context.collapsed,
825
+ sx: {
826
+ mb: context.bottomMargin
827
+ },
828
+ children: [/*#__PURE__*/jsx(Grid, {
829
+ children: /*#__PURE__*/jsxs(DivTitle, {
830
+ children: [/*#__PURE__*/jsx("strong", {
831
+ children: "Current levels"
832
+ }), " ", /*#__PURE__*/jsxs("em", {
833
+ children: [heliumData.meta.date || heliumData.meta.date !== 0 ? "(updated " + moment(heliumData.meta.date).fromNow() + ")" : "(manual)", /*#__PURE__*/jsx(EditAdmon, {})]
834
+ })]
835
+ })
836
+ }), /*#__PURE__*/jsx(Grid, {
837
+ children: /*#__PURE__*/jsx(HeliumTable, {})
838
+ })]
839
+ });
840
+ }
841
+
842
+ function LiterInput(_ref) {
843
+ var limit = _ref.limit,
844
+ SetLimit = _ref.SetLimit,
845
+ error = _ref.error,
846
+ SetError = _ref.SetError;
847
+ var _useState = useState(limit),
848
+ _useState2 = _slicedToArray(_useState, 2),
849
+ input = _useState2[0],
850
+ SetInput = _useState2[1];
851
+ var _useState3 = useState(false),
852
+ _useState4 = _slicedToArray(_useState3, 2),
853
+ edit = _useState4[0],
854
+ SetEdit = _useState4[1];
855
+ if (edit) {
856
+ return /*#__PURE__*/jsxs(React.Fragment, {
857
+ children: [/*#__PURE__*/jsx(NumField, {
858
+ input: input,
859
+ SetInput: SetInput,
860
+ error: error,
861
+ SetError: SetError,
862
+ size: "medium",
863
+ adornment: "L"
864
+ }), " ", /*#__PURE__*/jsx(IconButton, {
865
+ disabled: error,
866
+ size: "small",
867
+ onClick: function onClick() {
868
+ SetEdit(!edit);
869
+ SetLimit(Number(input));
870
+ },
871
+ children: /*#__PURE__*/jsx(SaveIcon, {})
872
+ })]
873
+ });
874
+ } else {
875
+ return /*#__PURE__*/jsxs(React.Fragment, {
876
+ children: [limit, " L", " ", /*#__PURE__*/jsx(IconButton, {
877
+ size: "small",
878
+ onClick: function onClick() {
879
+ return SetEdit(!edit);
880
+ },
881
+ children: /*#__PURE__*/jsx(EditIcon, {})
882
+ })]
883
+ });
884
+ }
885
+ }
886
+
887
+ function SelectSpecs(_ref) {
888
+ var specs = _ref.specs,
889
+ SetSpecs = _ref.SetSpecs;
890
+ function SetAll(value) {
891
+ SetSpecs(function (specs) {
892
+ Object.keys(specs).map(function (spec) {
893
+ return specs[spec] = value;
894
+ });
895
+ });
896
+ return;
897
+ }
898
+ return /*#__PURE__*/jsxs(FormControl, {
899
+ children: [/*#__PURE__*/jsx(Divider, {
900
+ textAlign: "left",
901
+ children: /*#__PURE__*/jsx("strong", {
902
+ children: "Select spectrometers"
903
+ })
904
+ }), /*#__PURE__*/jsxs(FormGroup, {
905
+ row: true,
906
+ sx: {
907
+ px: 2
908
+ },
909
+ children: [Object.keys(specs).map(function (m) {
910
+ return /*#__PURE__*/jsx(FormControlLabel, {
911
+ control: /*#__PURE__*/jsx(Checkbox, {
912
+ size: "small"
913
+ }),
914
+ checked: specs[m],
915
+ onChange: function onChange() {
916
+ return SetSpecs(function (specs) {
917
+ specs[m] = !specs[m];
918
+ });
919
+ },
920
+ label: m
921
+ }, m + "_check");
922
+ }), " ", /*#__PURE__*/jsx(Button, {
923
+ size: "small",
924
+ onClick: function onClick() {
925
+ return SetAll(true);
926
+ },
927
+ children: "all"
928
+ }), " ", "\u2002", " ", /*#__PURE__*/jsx(Button, {
929
+ size: "small",
930
+ onClick: function onClick() {
931
+ return SetAll(false);
932
+ },
933
+ children: "none"
934
+ })]
935
+ })]
936
+ });
937
+ }
938
+
939
+ function FindPair(_ref) {
940
+ var currSpecs = _ref.currSpecs,
941
+ heliumData = _ref.heliumData,
942
+ boilOff = _ref.boilOff,
943
+ limit = _ref.limit;
944
+ // find all possible pairs of spectrometers
945
+
946
+ var specPairs = [];
947
+ currSpecs.map(function (spec1) {
948
+ currSpecs.map(function (spec2) {
949
+ if (spec1 !== spec2) {
950
+ specPairs.push([spec1, spec2].sort()); // sort to facilitate duplicate removal
951
+ }
952
+ });
953
+ });
954
+
955
+ // remove duplicates from array by conversion to string
956
+
957
+ specPairs = Array.from(new Set(specPairs.map(JSON.stringify)), JSON.parse);
958
+ var specPairsLiters = [];
959
+ var _loop = function _loop() {
960
+ var j = 1;
961
+ var pairBoil = 0;
962
+
963
+ // Add current pair of specs
964
+
965
+ specPairsLiters.push(specPairs[i]);
966
+
967
+ // Calculate L. to max for pair until reaching target value
968
+
969
+ do {
970
+ pairBoil = specPairs[i].reduce(function (total, current) {
971
+ var boil = Math.round(heliumData.helium[current] + j * boilOff[current]);
972
+
973
+ // Catch negative values
974
+ if (boil < 0) {
975
+ boil = 0;
976
+ }
977
+ var boilToMax = CalcToMax({
978
+ value: boil,
979
+ spec: current
980
+ });
981
+ return total + boilToMax;
982
+ }, 0);
983
+ j++;
984
+ } while (pairBoil < limit && j < 300);
985
+
986
+ // Result to pair
987
+
988
+ specPairsLiters[i].push(j);
989
+ specPairsLiters[i].push(pairBoil);
990
+ specPairsLiters[i].push(pairBoil > limit);
991
+ };
992
+ for (var i in specPairs) {
993
+ _loop();
994
+ }
995
+
996
+ // Remove pairs that did not converge
997
+
998
+ specPairsLiters = specPairsLiters.filter(function (pair) {
999
+ return pair[4];
1000
+ });
1001
+
1002
+ // Find pair with minimal number of days
1003
+
1004
+ var minPair = [];
1005
+ switch (specPairsLiters.length) {
1006
+ case 0:
1007
+ minPair = [];
1008
+ break;
1009
+ case 1:
1010
+ minPair = _toConsumableArray(specPairsLiters);
1011
+ break;
1012
+ default:
1013
+ minPair = specPairsLiters.reduce(function (min, current) {
1014
+ var i = current[2] < min[2] ? current : min;
1015
+ return i;
1016
+ });
1017
+ break;
1018
+ }
1019
+ minPair = minPair.flat();
1020
+ return minPair;
1021
+ }
1022
+ function FindTriple(_ref2) {
1023
+ var currSpecs = _ref2.currSpecs,
1024
+ heliumData = _ref2.heliumData,
1025
+ boilOff = _ref2.boilOff,
1026
+ limit = _ref2.limit;
1027
+ // find all possible triples of spectrometers
1028
+
1029
+ var specTriples = [];
1030
+ currSpecs.map(function (spec1) {
1031
+ currSpecs.map(function (spec2) {
1032
+ currSpecs.map(function (spec3) {
1033
+ if (!(spec1 === spec2 || spec2 === spec3 || spec3 === spec1)) {
1034
+ specTriples.push([spec1, spec2, spec3].sort()); // sort to facilitate duplicate removal
1035
+ }
1036
+ });
1037
+ });
1038
+ });
1039
+
1040
+ // remove duplicates from array by conversion to string
1041
+
1042
+ specTriples = Array.from(new Set(specTriples.map(JSON.stringify)), JSON.parse);
1043
+ var specTriplesLiters = [];
1044
+ var _loop2 = function _loop2() {
1045
+ var j = 1;
1046
+ var pairBoil = 0;
1047
+
1048
+ // Add current pair of specs
1049
+
1050
+ specTriplesLiters.push(specTriples[i]);
1051
+
1052
+ // Calculate L. to max for pair until reaching target value
1053
+
1054
+ do {
1055
+ pairBoil = specTriples[i].reduce(function (total, current) {
1056
+ var boil = Math.round(heliumData.helium[current] + j * boilOff[current]);
1057
+
1058
+ // Catch negative values
1059
+ if (boil < 0) {
1060
+ boil = 0;
1061
+ }
1062
+ var boilToMax = CalcToMax({
1063
+ value: boil,
1064
+ spec: current
1065
+ });
1066
+ return total + boilToMax;
1067
+ }, 0);
1068
+ j++;
1069
+ } while (pairBoil < limit && j < 300);
1070
+
1071
+ // Result to triple
1072
+
1073
+ specTriplesLiters[i].push(j);
1074
+ specTriplesLiters[i].push(pairBoil);
1075
+ specTriplesLiters[i].push(pairBoil > limit);
1076
+ };
1077
+ for (var i in specTriples) {
1078
+ _loop2();
1079
+ }
1080
+
1081
+ // Remove triples that did not converge
1082
+
1083
+ specTriplesLiters = specTriplesLiters.filter(function (pair) {
1084
+ return pair[5];
1085
+ });
1086
+
1087
+ // Find triple with minimal number of days
1088
+
1089
+ var minTriple = [];
1090
+ switch (specTriplesLiters.length) {
1091
+ case 0:
1092
+ minTriple = [];
1093
+ break;
1094
+ case 1:
1095
+ minTriple = _toConsumableArray(specTriplesLiters);
1096
+ break;
1097
+ default:
1098
+ minTriple = specTriplesLiters.reduce(function (min, current) {
1099
+ var i = current[3] < min[3] ? current : min;
1100
+ return i;
1101
+ });
1102
+ break;
1103
+ }
1104
+ minTriple = minTriple.flat();
1105
+ return minTriple;
1106
+ }
1107
+
1108
+ function ownKeys$3(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
1109
+ function _objectSpread$3(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$3(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$3(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
1110
+ function TupleResult(_ref) {
1111
+ var children = _ref.children,
1112
+ title = _ref.title;
1113
+ return /*#__PURE__*/jsx(Grid, {
1114
+ children: /*#__PURE__*/jsxs(AppTable, {
1115
+ children: [/*#__PURE__*/jsx(TableHead, {
1116
+ children: /*#__PURE__*/jsx(TableRow, {
1117
+ children: /*#__PURE__*/jsx(TableHeadCell, {
1118
+ children: title
1119
+ })
1120
+ })
1121
+ }), /*#__PURE__*/jsx(TableBody, {
1122
+ children: /*#__PURE__*/jsx(TableRow, {
1123
+ children: /*#__PURE__*/jsx(TableCell, {
1124
+ children: children
1125
+ })
1126
+ })
1127
+ })]
1128
+ })
1129
+ });
1130
+ }
1131
+ function PairResult(_ref2) {
1132
+ var minPair = _ref2.minPair;
1133
+ if (minPair.length !== 0) {
1134
+ var d = new Date();
1135
+ d.setDate(d.getDate() + minPair[2]);
1136
+ var date = moment$1(d).format("ll");
1137
+ return /*#__PURE__*/jsxs(TupleResult, {
1138
+ title: "Pair",
1139
+ children: [/*#__PURE__*/jsx("strong", {
1140
+ children: minPair[0]
1141
+ }), " and ", /*#__PURE__*/jsx("strong", {
1142
+ children: minPair[1]
1143
+ }), " ", "in ", /*#__PURE__*/jsxs("strong", {
1144
+ children: [minPair[2], " days"]
1145
+ }), " (", date, ")"]
1146
+ });
1147
+ } else {
1148
+ return /*#__PURE__*/jsx(TupleResult, {
1149
+ title: "Pair",
1150
+ children: /*#__PURE__*/jsx("em", {
1151
+ children: "No spectrometer pair reaches the target value."
1152
+ })
1153
+ });
1154
+ }
1155
+ }
1156
+ function TripleResult(_ref3) {
1157
+ var minTriple = _ref3.minTriple;
1158
+ if (minTriple.length !== 0) {
1159
+ var d = new Date();
1160
+ d.setDate(d.getDate() + minTriple[3]);
1161
+ var date = moment$1(d).format("ll");
1162
+ return /*#__PURE__*/jsxs(TupleResult, {
1163
+ title: "Triple",
1164
+ children: [/*#__PURE__*/jsx("strong", {
1165
+ children: minTriple[0]
1166
+ }), ", ", /*#__PURE__*/jsx("strong", {
1167
+ children: minTriple[1]
1168
+ }), ", and ", /*#__PURE__*/jsx("strong", {
1169
+ children: minTriple[2]
1170
+ }), " in", " ", /*#__PURE__*/jsxs("strong", {
1171
+ children: [minTriple[3], " days"]
1172
+ }), " (", date, ")"]
1173
+ });
1174
+ } else {
1175
+ return /*#__PURE__*/jsx(TupleResult, {
1176
+ title: "Triple",
1177
+ children: /*#__PURE__*/jsx("p", {
1178
+ children: /*#__PURE__*/jsx("em", {
1179
+ children: "No spectrometer triple reaches the target value."
1180
+ })
1181
+ })
1182
+ });
1183
+ }
1184
+ }
1185
+ function PairWizard() {
1186
+ var context = useContext(HeliumContext);
1187
+ var heliumLookupData = context.heliumLookupData;
1188
+ var heliumData = context.heliumData;
1189
+
1190
+ // Define lookup objects
1191
+
1192
+ var boilOff = heliumLookupData.boilOff;
1193
+ var defaultSpecs = {};
1194
+ Object.keys(boilOff).map(function (spec) {
1195
+ return defaultSpecs = _objectSpread$3(_objectSpread$3({}, defaultSpecs), {}, _defineProperty({}, spec, true));
1196
+ });
1197
+ var _useImmer = useImmer(defaultSpecs),
1198
+ _useImmer2 = _slicedToArray(_useImmer, 2),
1199
+ specs = _useImmer2[0],
1200
+ SetSpecs = _useImmer2[1];
1201
+ var currSpecs = Object.keys(specs).filter(function (spec) {
1202
+ return specs[spec];
1203
+ });
1204
+ var _useState = useState(false),
1205
+ _useState2 = _slicedToArray(_useState, 2),
1206
+ error = _useState2[0],
1207
+ SetError = _useState2[1];
1208
+ var _useState3 = useState(100),
1209
+ _useState4 = _slicedToArray(_useState3, 2),
1210
+ limit = _useState4[0],
1211
+ SetLimit = _useState4[1];
1212
+ var minPair = FindPair(_objectSpread$3({}, {
1213
+ currSpecs: currSpecs,
1214
+ heliumData: heliumData,
1215
+ boilOff: boilOff,
1216
+ limit: limit
1217
+ }));
1218
+ var minTriple = FindTriple(_objectSpread$3({}, {
1219
+ currSpecs: currSpecs,
1220
+ heliumData: heliumData,
1221
+ boilOff: boilOff,
1222
+ limit: limit
1223
+ }));
1224
+ return /*#__PURE__*/jsx(React.Fragment, {
1225
+ children: /*#__PURE__*/jsxs(Grid, {
1226
+ container: true,
1227
+ columns: {
1228
+ xs: 6,
1229
+ md: 12
1230
+ },
1231
+ children: [/*#__PURE__*/jsxs(Grid, {
1232
+ sx: {
1233
+ px: 2
1234
+ },
1235
+ size: 6,
1236
+ children: [/*#__PURE__*/jsx(Divider, {
1237
+ textAlign: "left",
1238
+ children: /*#__PURE__*/jsx("strong", {
1239
+ children: "Find earliest set of spectrometers requiring"
1240
+ })
1241
+ }), /*#__PURE__*/jsx(Grid, {
1242
+ sx: {
1243
+ padding: 2,
1244
+ display: "flex",
1245
+ justifyContent: "center"
1246
+ },
1247
+ children: /*#__PURE__*/jsx(Typography, {
1248
+ variant: "h4",
1249
+ children: /*#__PURE__*/jsx(LiterInput, {
1250
+ limit: limit,
1251
+ SetLimit: SetLimit,
1252
+ error: error,
1253
+ SetError: SetError
1254
+ })
1255
+ })
1256
+ }), /*#__PURE__*/jsx(Grid, {
1257
+ children: /*#__PURE__*/jsx(SelectSpecs, {
1258
+ specs: specs,
1259
+ SetSpecs: SetSpecs
1260
+ })
1261
+ })]
1262
+ }), /*#__PURE__*/jsxs(Grid, {
1263
+ sx: {
1264
+ px: 2
1265
+ },
1266
+ size: 6,
1267
+ children: [/*#__PURE__*/jsx(Divider, {
1268
+ textAlign: "left",
1269
+ children: /*#__PURE__*/jsx("strong", {
1270
+ children: "Result"
1271
+ })
1272
+ }), /*#__PURE__*/jsxs(Grid, {
1273
+ sx: {
1274
+ px: 3
1275
+ },
1276
+ children: [/*#__PURE__*/jsx(PairResult, {
1277
+ minPair: minPair
1278
+ }), /*#__PURE__*/jsx(TripleResult, {
1279
+ minTriple: minTriple
1280
+ })]
1281
+ })]
1282
+ })]
1283
+ })
1284
+ });
1285
+ }
1286
+
1287
+ function SpectrometerSetPanel() {
1288
+ var context = useContext(HeliumContext);
1289
+ return /*#__PURE__*/jsx(AppCard, {
1290
+ title: "Spectrometer Set",
1291
+ size: context.cardSize,
1292
+ collapsed: context.collapsed,
1293
+ sx: {
1294
+ mb: context.bottomMargin
1295
+ },
1296
+ children: /*#__PURE__*/jsx(Grid, {
1297
+ children: /*#__PURE__*/jsx(PairWizard, {})
1298
+ })
1299
+ });
1300
+ }
1301
+
1302
+ function ownKeys$2(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
1303
+ function _objectSpread$2(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$2(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$2(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
1304
+ function EstimateConsumption() {
1305
+ // Get data
1306
+
1307
+ var heliumLookupData = useContext(HeliumContext).heliumLookupData;
1308
+ var boilOff = heliumLookupData.boilOff;
1309
+ var lookup = heliumLookupData.lookup;
1310
+
1311
+ // Define array and populate with days and liters to get from 100% to 50%
1312
+
1313
+ var specCons = [];
1314
+ Object.keys(lookup).map(function (spec) {
1315
+ return specCons.push({
1316
+ name: spec,
1317
+ liters: (lookup[spec].filter(function (x) {
1318
+ return x.level === 100;
1319
+ })[0].liters - lookup[spec].filter(function (x) {
1320
+ return x.level === 50;
1321
+ })[0].liters).toFixed(1),
1322
+ days: (-50 / boilOff[spec]).toFixed(1)
1323
+ });
1324
+ });
1325
+
1326
+ // Calculate consumption per day, month, year from values above
1327
+
1328
+ specCons = specCons.map(function (spec) {
1329
+ return _objectSpread$2(_objectSpread$2({}, spec), {}, {
1330
+ perDay: spec.liters / spec.days,
1331
+ perMonth: (spec.liters / spec.days * 30).toFixed(1),
1332
+ perYear: (spec.liters / spec.days * 365).toFixed(1)
1333
+ });
1334
+ });
1335
+ return /*#__PURE__*/jsxs(React.Fragment, {
1336
+ children: [/*#__PURE__*/jsx("p", {
1337
+ children: "Helium consumption estimated based on lookup values."
1338
+ }), /*#__PURE__*/jsxs(AppTable, {
1339
+ children: [/*#__PURE__*/jsx(TableHead, {
1340
+ children: /*#__PURE__*/jsxs(TableRow, {
1341
+ children: [/*#__PURE__*/jsx(TableHeadCell, {}), specCons.map(function (spec) {
1342
+ return /*#__PURE__*/jsx(TableHeadCell, {
1343
+ children: spec.name
1344
+ }, "Head" + spec.name);
1345
+ }), /*#__PURE__*/jsx(TableHeadCell, {
1346
+ children: "Sum"
1347
+ })]
1348
+ })
1349
+ }), /*#__PURE__*/jsxs(TableBody, {
1350
+ children: [/*#__PURE__*/jsxs(TableRow, {
1351
+ children: [/*#__PURE__*/jsx(TableCell, {
1352
+ children: "per month"
1353
+ }), specCons.map(function (spec) {
1354
+ return /*#__PURE__*/jsxs(TableCell, {
1355
+ children: [spec.perMonth, " L ", /*#__PURE__*/jsx("br", {}), "(", (spec.perMonth * 0.79).toFixed(2), " m", /*#__PURE__*/jsx("sup", {
1356
+ children: "3"
1357
+ }), " Gas)"]
1358
+ }, "perMonth" + spec.name);
1359
+ }), /*#__PURE__*/jsx(TableCell, {
1360
+ children: /*#__PURE__*/jsxs("strong", {
1361
+ children: [specCons.reduce(function (total, spec) {
1362
+ return total + Number(spec.perMonth);
1363
+ }, 0).toFixed(1), " ", "L", /*#__PURE__*/jsx("br", {}), "(", (specCons.reduce(function (total, spec) {
1364
+ return total + Number(spec.perMonth);
1365
+ }, 0) * 0.79).toFixed(2), " ", "m", /*#__PURE__*/jsx("sup", {
1366
+ children: "3"
1367
+ }), " Gas)"]
1368
+ })
1369
+ })]
1370
+ }), /*#__PURE__*/jsxs(TableRow, {
1371
+ children: [/*#__PURE__*/jsx(TableCell, {
1372
+ rowSpan: 2,
1373
+ children: "per year"
1374
+ }), specCons.map(function (spec) {
1375
+ return /*#__PURE__*/jsxs(TableCell, {
1376
+ children: [spec.perYear, " L ", /*#__PURE__*/jsx("br", {}), "(", (spec.perYear * 0.79).toFixed(2), " m", /*#__PURE__*/jsx("sup", {
1377
+ children: "3"
1378
+ }), " ", "Gas)"]
1379
+ }, "perYear" + spec.name);
1380
+ }), /*#__PURE__*/jsx(TableCell, {
1381
+ children: /*#__PURE__*/jsxs("strong", {
1382
+ children: [specCons.reduce(function (total, spec) {
1383
+ return total + Number(spec.perYear);
1384
+ }, 0).toFixed(1), " ", "L", /*#__PURE__*/jsx("br", {}), "(", (specCons.reduce(function (total, spec) {
1385
+ return total + Number(spec.perYear);
1386
+ }, 0) * 0.79).toFixed(2), " ", "m", /*#__PURE__*/jsx("sup", {
1387
+ children: "3"
1388
+ }), " Gas)"]
1389
+ })
1390
+ })]
1391
+ })]
1392
+ })]
1393
+ })]
1394
+ });
1395
+ }
1396
+
1397
+ function EstimatedConsumptionPanel() {
1398
+ var context = useContext(HeliumContext);
1399
+ var cardSize = context.cardSize;
1400
+ var collapsed = context.collapsed;
1401
+ return /*#__PURE__*/jsx(AppCard, {
1402
+ title: "Estimated Consumption",
1403
+ size: cardSize,
1404
+ collapsed: collapsed,
1405
+ sx: {
1406
+ mb: context.bottomMargin
1407
+ },
1408
+ children: /*#__PURE__*/jsx(Grid, {
1409
+ children: /*#__PURE__*/jsx(EstimateConsumption, {})
1410
+ })
1411
+ });
1412
+ }
1413
+
1414
+ function ownKeys$1(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
1415
+ function _objectSpread$1(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys$1(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys$1(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
1416
+
1417
+ // Admonition colors
1418
+
1419
+ var errorBg = AppTheme.palette.primary.main;
1420
+ var errorText = AppTheme.palette.primary.contrastText;
1421
+ var warnText = AppTheme.palette.warning.main;
1422
+ function HePrognosisEntry(_ref) {
1423
+ var value = _ref.value,
1424
+ days = _ref.days,
1425
+ spec = _ref.spec;
1426
+ var context = useContext(HeliumContext);
1427
+ var heliumLookupData = context.heliumLookupData;
1428
+
1429
+ // Define lookup objects
1430
+
1431
+ var boilOff = heliumLookupData.boilOff;
1432
+ var minima = heliumLookupData.minima;
1433
+ var boil = Math.round(value + days * boilOff[spec]);
1434
+
1435
+ // Catch negative values
1436
+
1437
+ if (boil < 0) {
1438
+ boil = 0;
1439
+ }
1440
+ var boilLiter = CalcLiters({
1441
+ value: boil,
1442
+ spec: spec
1443
+ });
1444
+ var boilToMax = CalcToMax({
1445
+ value: boil,
1446
+ spec: spec
1447
+ });
1448
+ var style = {};
1449
+ if (boil < minima[spec] - 30 * boilOff[spec]) {
1450
+ style = {
1451
+ backgroundColor: errorBg,
1452
+ color: errorText
1453
+ };
1454
+ } else if (boil < minima[spec] - 60 * boilOff[spec]) {
1455
+ style = {
1456
+ color: warnText
1457
+ };
1458
+ }
1459
+ return /*#__PURE__*/jsxs(TableCell, {
1460
+ sx: style,
1461
+ children: [Percentage(boil, true), " ", /*#__PURE__*/jsx("br", {}), boilLiter, " L", /*#__PURE__*/jsx("br", {}), /*#__PURE__*/jsxs("strong", {
1462
+ children: [boilToMax, " L"]
1463
+ })]
1464
+ });
1465
+ }
1466
+
1467
+ // Calculate total missing helium at prognosed date
1468
+
1469
+ function HePrognosisSum(_ref2) {
1470
+ var currHeliumData = _ref2.currHeliumData,
1471
+ days = _ref2.days;
1472
+ var context = useContext(HeliumContext);
1473
+ var heliumLookupData = context.heliumLookupData;
1474
+
1475
+ // Define lookup objects
1476
+
1477
+ var boilOff = heliumLookupData.boilOff;
1478
+ var boilData = {};
1479
+ Object.keys(currHeliumData).map(function (spec) {
1480
+ boilData = _objectSpread$1(_objectSpread$1({}, boilData), {}, _defineProperty({}, spec, Math.round(currHeliumData[spec] + days * boilOff[spec])));
1481
+ return null;
1482
+ });
1483
+ var toMaxSum = Object.keys(boilData).reduce(function (total, current) {
1484
+ return total + CalcToMax({
1485
+ spec: current,
1486
+ value: boilData[current]
1487
+ });
1488
+ }, 0);
1489
+ toMaxSum = Math.round(toMaxSum * 10) / 10;
1490
+ return /*#__PURE__*/jsx(TableCell, {
1491
+ children: /*#__PURE__*/jsxs("strong", {
1492
+ children: [toMaxSum, " L"]
1493
+ })
1494
+ });
1495
+ }
1496
+
1497
+ // Cell for day increment with edit switch
1498
+
1499
+ function HePrognosisIncr(_ref3) {
1500
+ var days = _ref3.days,
1501
+ increments = _ref3.increments,
1502
+ SetIncrements = _ref3.SetIncrements,
1503
+ dates = _ref3.dates;
1504
+ var _useState = useState(false),
1505
+ _useState2 = _slicedToArray(_useState, 2),
1506
+ edit = _useState2[0],
1507
+ SetEdit = _useState2[1];
1508
+ var _useState3 = useState(days),
1509
+ _useState4 = _slicedToArray(_useState3, 2),
1510
+ input = _useState4[0],
1511
+ SetInput = _useState4[1];
1512
+ var _useState5 = useState(false),
1513
+ _useState6 = _slicedToArray(_useState5, 2),
1514
+ error = _useState6[0],
1515
+ SetError = _useState6[1];
1516
+ if (edit) {
1517
+ return /*#__PURE__*/jsxs(TableCell, {
1518
+ children: [dates[days], " ", /*#__PURE__*/jsx("br", {}), /*#__PURE__*/jsx(NumField, {
1519
+ input: input,
1520
+ SetInput: SetInput,
1521
+ error: error,
1522
+ SetError: SetError,
1523
+ size: "small"
1524
+ }), /*#__PURE__*/jsx("br", {}), /*#__PURE__*/jsx(IconButton, {
1525
+ disabled: error,
1526
+ size: "small",
1527
+ onClick: function onClick() {
1528
+ SetEdit(!edit);
1529
+ SetIncrements(increments.map(function (inc) {
1530
+ if (inc === days) {
1531
+ return Number(input);
1532
+ } else {
1533
+ return inc;
1534
+ }
1535
+ }));
1536
+ },
1537
+ children: /*#__PURE__*/jsx(SaveIcon, {})
1538
+ }), /*#__PURE__*/jsx(IconButton, {
1539
+ size: "small",
1540
+ onClick: function onClick() {
1541
+ return SetIncrements(increments.filter(function (n) {
1542
+ return n !== days;
1543
+ }));
1544
+ },
1545
+ children: /*#__PURE__*/jsx(DeleteIcon, {})
1546
+ })]
1547
+ });
1548
+ } else {
1549
+ return /*#__PURE__*/jsxs(TableCell, {
1550
+ children: [dates[days], " ", /*#__PURE__*/jsx("br", {}), " in ", days, " days ", /*#__PURE__*/jsx("br", {}), /*#__PURE__*/jsx(IconButton, {
1551
+ size: "small",
1552
+ onClick: function onClick() {
1553
+ return SetEdit(!edit);
1554
+ },
1555
+ children: /*#__PURE__*/jsx(EditIcon, {})
1556
+ }), /*#__PURE__*/jsx(IconButton, {
1557
+ size: "small",
1558
+ onClick: function onClick() {
1559
+ return SetIncrements(increments.filter(function (n) {
1560
+ return n !== days;
1561
+ }));
1562
+ },
1563
+ children: /*#__PURE__*/jsx(DeleteIcon, {})
1564
+ })]
1565
+ });
1566
+ }
1567
+ }
1568
+
1569
+ // Render table row in prognosis table
1570
+
1571
+ function HePrognosisBody(_ref4) {
1572
+ var increments = _ref4.increments,
1573
+ SetIncrements = _ref4.SetIncrements,
1574
+ currHeliumData = _ref4.currHeliumData,
1575
+ dates = _ref4.dates;
1576
+ return /*#__PURE__*/jsx(React.Fragment, {
1577
+ children: increments.map(function (m) {
1578
+ return /*#__PURE__*/jsxs(TableRow, {
1579
+ children: [/*#__PURE__*/jsx(HePrognosisIncr, {
1580
+ days: m,
1581
+ increments: increments,
1582
+ SetIncrements: SetIncrements,
1583
+ dates: dates
1584
+ }), Object.keys(currHeliumData).map(function (spec) {
1585
+ return /*#__PURE__*/jsx(HePrognosisEntry, {
1586
+ value: currHeliumData[spec],
1587
+ days: m,
1588
+ spec: spec
1589
+ }, spec + "_progentry");
1590
+ }), /*#__PURE__*/jsx(HePrognosisSum, {
1591
+ currHeliumData: currHeliumData,
1592
+ days: m
1593
+ })]
1594
+ }, m + "_incr");
1595
+ })
1596
+ });
1597
+ }
1598
+
1599
+ // function for adding additional table entries
1600
+
1601
+ function AddPrognoEntry(_ref5) {
1602
+ var increments = _ref5.increments,
1603
+ SetIncrements = _ref5.SetIncrements;
1604
+ var _useState7 = useState(""),
1605
+ _useState8 = _slicedToArray(_useState7, 2),
1606
+ input = _useState8[0],
1607
+ SetInput = _useState8[1];
1608
+ var _useState9 = useState(false),
1609
+ _useState0 = _slicedToArray(_useState9, 2),
1610
+ error = _useState0[0],
1611
+ SetError = _useState0[1];
1612
+ return /*#__PURE__*/jsxs(React.Fragment, {
1613
+ children: [/*#__PURE__*/jsx(Divider, {
1614
+ textAlign: "left",
1615
+ children: /*#__PURE__*/jsx("strong", {
1616
+ children: "Add prediction row"
1617
+ })
1618
+ }), /*#__PURE__*/jsxs(Grid, {
1619
+ children: [/*#__PURE__*/jsx(NumField, {
1620
+ input: input,
1621
+ SetInput: SetInput,
1622
+ error: error,
1623
+ SetError: SetError,
1624
+ adornment: "days",
1625
+ size: "medium"
1626
+ }), /*#__PURE__*/jsx(IconButton, {
1627
+ disabled: error,
1628
+ onClick: function onClick() {
1629
+ SetIncrements([Number(input)].concat(_toConsumableArray(increments)));
1630
+ },
1631
+ children: /*#__PURE__*/jsx(AddBoxIcon, {})
1632
+ })]
1633
+ })]
1634
+ });
1635
+ }
1636
+
1637
+ // render prognosis table based on day increments state array
1638
+
1639
+ function HePrognosis() {
1640
+ var context = useContext(HeliumContext);
1641
+ var heliumLookupData = context.heliumLookupData;
1642
+ var heliumData = context.heliumData;
1643
+ // Define lookup objects
1644
+
1645
+ var minima = heliumLookupData.minima;
1646
+ var specDefault = {};
1647
+ var specList = Object.keys(heliumData.helium);
1648
+ specList.map(function (spec) {
1649
+ return specDefault = _objectSpread$1(_objectSpread$1({}, specDefault), {}, _defineProperty({}, spec, true));
1650
+ });
1651
+ var _useImmer = useImmer(specDefault),
1652
+ _useImmer2 = _slicedToArray(_useImmer, 2),
1653
+ specs = _useImmer2[0],
1654
+ SetSpecs = _useImmer2[1];
1655
+ var _useState1 = useState([14, 30, 60, 90]),
1656
+ _useState10 = _slicedToArray(_useState1, 2),
1657
+ increments = _useState10[0],
1658
+ SetIncrements = _useState10[1];
1659
+ var currHeliumData = {};
1660
+ Object.keys(specs).filter(function (spec) {
1661
+ return specs[spec];
1662
+ }).map(function (spec) {
1663
+ return currHeliumData = _objectSpread$1(_objectSpread$1({}, currHeliumData), {}, _defineProperty({}, spec, heliumData.helium[spec]));
1664
+ });
1665
+ var dates = {};
1666
+ for (var i in increments) {
1667
+ var d = new Date();
1668
+ d.setDate(d.getDate() + increments[i]);
1669
+ dates = _objectSpread$1(_objectSpread$1({}, dates), {}, _defineProperty({}, increments[i], moment(d).format("ll")));
1670
+ }
1671
+ return /*#__PURE__*/jsxs(Grid, {
1672
+ container: true,
1673
+ columns: {
1674
+ xs: 6,
1675
+ sm: 12
1676
+ },
1677
+ children: [/*#__PURE__*/jsx(Grid, {
1678
+ size: 6,
1679
+ children: /*#__PURE__*/jsx(SelectSpecs, {
1680
+ specs: specs,
1681
+ SetSpecs: SetSpecs
1682
+ })
1683
+ }), /*#__PURE__*/jsx(Grid, {
1684
+ size: 6,
1685
+ children: /*#__PURE__*/jsx(AddPrognoEntry, {
1686
+ increments: increments,
1687
+ SetIncrements: SetIncrements
1688
+ })
1689
+ }), /*#__PURE__*/jsx(Grid, {
1690
+ size: 12,
1691
+ children: /*#__PURE__*/jsxs(AppTable, {
1692
+ children: [/*#__PURE__*/jsxs(TableHead, {
1693
+ children: [/*#__PURE__*/jsxs(TableRow, {
1694
+ children: [/*#__PURE__*/jsx(TableHeadCell, {}), Object.keys(currHeliumData).map(function (spec) {
1695
+ return /*#__PURE__*/jsxs(TableHeadCell, {
1696
+ children: [spec, /*#__PURE__*/jsx("br", {}), "(", minima[spec], " %)"]
1697
+ }, spec + "_th");
1698
+ }), /*#__PURE__*/jsx(TableHeadCell, {
1699
+ children: "Sum"
1700
+ })]
1701
+ }), /*#__PURE__*/jsxs(TableRow, {
1702
+ children: [/*#__PURE__*/jsx(TableHeadCell, {}), /*#__PURE__*/jsx(TableHeadCell, {
1703
+ align: "center",
1704
+ colSpan: Object.keys(specs).length + 1,
1705
+ children: /*#__PURE__*/jsx("em", {
1706
+ children: "[%], Liters, L. to max"
1707
+ })
1708
+ })]
1709
+ })]
1710
+ }), /*#__PURE__*/jsx(TableBody, {
1711
+ children: /*#__PURE__*/jsx(HePrognosisBody, {
1712
+ increments: increments,
1713
+ SetIncrements: SetIncrements,
1714
+ dates: dates,
1715
+ currHeliumData: currHeliumData
1716
+ })
1717
+ })]
1718
+ })
1719
+ }), /*#__PURE__*/jsxs(Grid, {
1720
+ sx: {
1721
+ display: "flex",
1722
+ justifyContent: "center",
1723
+ alignItems: "center",
1724
+ pt: 2
1725
+ },
1726
+ size: 12,
1727
+ children: [/*#__PURE__*/jsx(Chip, {
1728
+ sx: {
1729
+ backgroundColor: errorBg,
1730
+ color: errorText,
1731
+ mx: 1
1732
+ },
1733
+ label: "Minimum in less than 30 days"
1734
+ }), /*#__PURE__*/jsx(Chip, {
1735
+ sx: {
1736
+ color: warnText,
1737
+ mx: 1
1738
+ },
1739
+ variant: "outlined",
1740
+ label: "Minimum in less than 60 days"
1741
+ })]
1742
+ })]
1743
+ });
1744
+ }
1745
+
1746
+ function EstimationPanel() {
1747
+ var context = useContext(HeliumContext);
1748
+ return /*#__PURE__*/jsx(AppCard, {
1749
+ title: "Helium Estimation",
1750
+ size: context.cardSize,
1751
+ sx: {
1752
+ mb: context.bottomMargin
1753
+ },
1754
+ children: /*#__PURE__*/jsx(HePrognosis, {})
1755
+ });
1756
+ }
1757
+
1758
+ function FillTarget() {
1759
+ var context = useContext(HeliumContext);
1760
+ var heliumLookupData = context.heliumLookupData;
1761
+ var heliumData = context.heliumData;
1762
+ var boilOff = heliumLookupData.boilOff;
1763
+ var lookup = heliumLookupData.lookup;
1764
+ var _useState = useState(false),
1765
+ _useState2 = _slicedToArray(_useState, 2),
1766
+ error = _useState2[0],
1767
+ SetError = _useState2[1];
1768
+ var _useState3 = useState(25),
1769
+ _useState4 = _slicedToArray(_useState3, 2),
1770
+ amount = _useState4[0],
1771
+ SetAmount = _useState4[1];
1772
+ var _useState5 = useState(Object.keys(lookup)[0]),
1773
+ _useState6 = _slicedToArray(_useState5, 2),
1774
+ spec = _useState6[0],
1775
+ SetSpec = _useState6[1];
1776
+ var currLevel = heliumData.helium[spec];
1777
+ var currLiter = CalcLiters({
1778
+ value: currLevel,
1779
+ spec: spec
1780
+ });
1781
+ var finalLiter = currLiter + amount;
1782
+ var finalLevel = CalcPercent({
1783
+ value: finalLiter,
1784
+ spec: spec
1785
+ });
1786
+ return /*#__PURE__*/jsx(React.Fragment, {
1787
+ children: /*#__PURE__*/jsxs(Grid, {
1788
+ container: true,
1789
+ columns: {
1790
+ xs: 6,
1791
+ md: 12
1792
+ },
1793
+ children: [/*#__PURE__*/jsxs(Grid, {
1794
+ sx: {
1795
+ px: 2
1796
+ },
1797
+ size: 6,
1798
+ children: [/*#__PURE__*/jsx(Divider, {
1799
+ textAlign: "left",
1800
+ children: /*#__PURE__*/jsx("strong", {
1801
+ children: "Select Spectrometer"
1802
+ })
1803
+ }), /*#__PURE__*/jsx(Grid, {
1804
+ sx: {
1805
+ padding: 2,
1806
+ display: "flex",
1807
+ justifyContent: "center"
1808
+ },
1809
+ children: /*#__PURE__*/jsx(SpecSwitch, {
1810
+ setup: boilOff,
1811
+ spec: spec,
1812
+ SetSpec: SetSpec
1813
+ })
1814
+ })]
1815
+ }), /*#__PURE__*/jsxs(Grid, {
1816
+ sx: {
1817
+ px: 2
1818
+ },
1819
+ size: 6,
1820
+ children: [/*#__PURE__*/jsx(Divider, {
1821
+ textAlign: "left",
1822
+ children: /*#__PURE__*/jsx("strong", {
1823
+ children: "Current status"
1824
+ })
1825
+ }), /*#__PURE__*/jsx(Grid, {
1826
+ sx: {
1827
+ padding: 2,
1828
+ display: "flex",
1829
+ justifyContent: "center"
1830
+ },
1831
+ children: /*#__PURE__*/jsxs(Typography, {
1832
+ variant: "h4",
1833
+ children: [currLevel, " % (", currLiter, " L)"]
1834
+ })
1835
+ })]
1836
+ }), /*#__PURE__*/jsxs(Grid, {
1837
+ sx: {
1838
+ px: 2
1839
+ },
1840
+ size: 6,
1841
+ children: [/*#__PURE__*/jsx(Divider, {
1842
+ textAlign: "left",
1843
+ children: /*#__PURE__*/jsx("strong", {
1844
+ children: "Helium fill amount"
1845
+ })
1846
+ }), /*#__PURE__*/jsx(Grid, {
1847
+ sx: {
1848
+ padding: 2,
1849
+ display: "flex",
1850
+ justifyContent: "center"
1851
+ },
1852
+ children: /*#__PURE__*/jsx(Typography, {
1853
+ variant: "h4",
1854
+ children: /*#__PURE__*/jsx(LiterInput, {
1855
+ error: error,
1856
+ SetError: SetError,
1857
+ limit: amount,
1858
+ SetLimit: SetAmount
1859
+ })
1860
+ })
1861
+ })]
1862
+ }), /*#__PURE__*/jsxs(Grid, {
1863
+ sx: {
1864
+ px: 2
1865
+ },
1866
+ size: 6,
1867
+ children: [/*#__PURE__*/jsx(Divider, {
1868
+ textAlign: "left",
1869
+ children: /*#__PURE__*/jsx("strong", {
1870
+ children: "After filling"
1871
+ })
1872
+ }), /*#__PURE__*/jsx(Grid, {
1873
+ sx: {
1874
+ padding: 2,
1875
+ display: "flex",
1876
+ justifyContent: "center"
1877
+ },
1878
+ children: /*#__PURE__*/jsx(Typography, {
1879
+ variant: "h4",
1880
+ children: /*#__PURE__*/jsxs("em", {
1881
+ style: {
1882
+ color: AppTheme.palette.warning.main
1883
+ },
1884
+ children: ["~ ", finalLevel, " % (", CalcLiters({
1885
+ value: finalLevel,
1886
+ spec: spec
1887
+ }), " L)"]
1888
+ })
1889
+ })
1890
+ })]
1891
+ })]
1892
+ })
1893
+ });
1894
+ }
1895
+
1896
+ function FillTargetPanel() {
1897
+ var context = useContext(HeliumContext);
1898
+ return /*#__PURE__*/jsx(AppCard, {
1899
+ title: "Fill Target",
1900
+ size: context.cardSize,
1901
+ sx: {
1902
+ mb: context.bottomMargin
1903
+ },
1904
+ children: /*#__PURE__*/jsx(FillTarget, {})
1905
+ });
1906
+ }
16
1907
 
17
1908
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
18
1909
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }