@zac-apps/helium 1.0.0-beta.1

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 (3) hide show
  1. package/README.md +0 -0
  2. package/dist/index.js +1500 -0
  3. package/package.json +71 -0
package/dist/index.js ADDED
@@ -0,0 +1,1500 @@
1
+ import _defineProperty from '@babel/runtime/helpers/defineProperty';
2
+ import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
3
+ import React, { useState, createContext, useContext, useEffect } from 'react';
4
+ import moment from 'moment';
5
+ import { useImmer } from 'use-immer';
6
+ import useMediaQuery from '@mui/material/useMediaQuery';
7
+ import Grid from '@mui/material/Unstable_Grid2';
8
+ import TableBody from '@mui/material/TableBody';
9
+ import TableCell from '@mui/material/TableCell';
10
+ import TableHead from '@mui/material/TableHead';
11
+ import TableRow from '@mui/material/TableRow';
12
+ import IconButton from '@mui/material/IconButton';
13
+ import SaveIcon from '@mui/icons-material/Save';
14
+ import EditIcon from '@mui/icons-material/Edit';
15
+ import { ErrorAlert, AppTable, TableHeadCell, Percentage, AppTheme, DivTitle, PublicFetch, Progress, AppGrid, AppCard } from '@zac-apps/commons';
16
+ import TextField from '@mui/material/TextField';
17
+ import InputAdornment from '@mui/material/InputAdornment';
18
+ import { jsxs, jsx } from 'react/jsx-runtime';
19
+ import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';
20
+ import Chip from '@mui/material/Chip';
21
+ import AddBoxIcon from '@mui/icons-material/AddBox';
22
+ import DeleteIcon from '@mui/icons-material/Delete';
23
+ import Divider from '@mui/material/Divider';
24
+ import FormControlLabel from '@mui/material/FormControlLabel';
25
+ import FormControl from '@mui/material/FormControl';
26
+ import FormGroup from '@mui/material/FormGroup';
27
+ import Checkbox from '@mui/material/Checkbox';
28
+ import Button from '@mui/material/Button';
29
+ import moment$1 from 'moment/moment.js';
30
+ import Typography from '@mui/material/Typography';
31
+ import { LineChart, Line, CartesianGrid, XAxis, Label, YAxis, ReferenceLine, ReferenceArea, Tooltip } from 'recharts';
32
+ import Paper from '@mui/material/Paper';
33
+ import ButtonGroup from '@mui/material/ButtonGroup';
34
+ import Switch from '@mui/material/Switch';
35
+
36
+ function NumField(_ref) {
37
+ var input = _ref.input,
38
+ SetInput = _ref.SetInput,
39
+ error = _ref.error,
40
+ SetError = _ref.SetError,
41
+ minValue = _ref.minValue,
42
+ maxValue = _ref.maxValue,
43
+ adornment = _ref.adornment,
44
+ size = _ref.size;
45
+ var _useState = useState(""),
46
+ _useState2 = _slicedToArray(_useState, 2),
47
+ errorMessage = _useState2[0],
48
+ SetErrorMessage = _useState2[1];
49
+ var _useState3 = useState(false),
50
+ _useState4 = _slicedToArray(_useState3, 2),
51
+ alert = _useState4[0],
52
+ SetAlert = _useState4[1];
53
+ var sx = {};
54
+ if (size === "small") {
55
+ sx = {
56
+ maxWidth: 75
57
+ };
58
+ }
59
+ function handleEntry(e) {
60
+ var errorFound = false;
61
+ var inputVal = e.target.value;
62
+ if (!inputVal.match(/[0-9-]*/)[0] || inputVal.match(/[0-9-]*/)[0] !== inputVal) {
63
+ errorFound = true;
64
+ SetErrorMessage("Input is not numerical.");
65
+ }
66
+ if (inputVal > maxValue || inputVal < minValue) {
67
+ errorFound = true;
68
+ SetErrorMessage("Input is outside allowed boundaries.");
69
+ }
70
+ SetInput(inputVal);
71
+ SetError(errorFound);
72
+ SetAlert(errorFound);
73
+ }
74
+ return /*#__PURE__*/jsxs(React.Fragment, {
75
+ children: [/*#__PURE__*/jsx(TextField, {
76
+ size: "small",
77
+ sx: sx,
78
+ onChange: function onChange(e) {
79
+ return handleEntry(e);
80
+ },
81
+ value: input,
82
+ error: error,
83
+ inputProps: {
84
+ inputMode: "numeric"
85
+ },
86
+ InputProps: {
87
+ endAdornment: /*#__PURE__*/jsx(InputAdornment, {
88
+ position: "end",
89
+ children: adornment
90
+ })
91
+ }
92
+ }), /*#__PURE__*/jsx(ErrorAlert, {
93
+ alert: alert,
94
+ SetAlert: SetAlert,
95
+ message: errorMessage
96
+ })]
97
+ });
98
+ }
99
+
100
+ // Define context
101
+
102
+ var LookupContext = /*#__PURE__*/createContext(null);
103
+
104
+ // Look up amount in liters for specific spectrometer
105
+
106
+ function CalcLiters(_ref) {
107
+ var spec = _ref.spec,
108
+ value = _ref.value;
109
+ var heliumLookup = useContext(LookupContext).lookup;
110
+
111
+ // Catch negative values
112
+
113
+ if (value < 0 || !value) {
114
+ value = 0;
115
+ } else {
116
+ value = Number(value);
117
+ }
118
+ var returnVal = heliumLookup[spec].find(function (m) {
119
+ return m.level === value;
120
+ }).liters;
121
+ return returnVal;
122
+ }
123
+
124
+ // Look up difference from maximum
125
+
126
+ function CalcToMax(_ref3) {
127
+ var spec = _ref3.spec,
128
+ value = _ref3.value;
129
+ var heliumLookup = useContext(LookupContext).lookup;
130
+
131
+ // Catch negative values
132
+
133
+ value = Number(value) || 0;
134
+ if (value < 0 || !value) {
135
+ value = 0;
136
+ }
137
+ var maxLiters = Math.max.apply(null, heliumLookup[spec].map(function (m) {
138
+ return m.liters;
139
+ }));
140
+ var returnVal = maxLiters - heliumLookup[spec].find(function (m) {
141
+ return m.level === value;
142
+ }).liters;
143
+ returnVal = Math.round(returnVal * 10) / 10;
144
+ return returnVal;
145
+ }
146
+
147
+ function HeliumEntry(_ref) {
148
+ var heliumData = _ref.heliumData,
149
+ SetHeliumData = _ref.SetHeliumData,
150
+ spec = _ref.spec,
151
+ SetLevelsEdited = _ref.SetLevelsEdited;
152
+ var heliumLookup = useContext(LookupContext).lookup;
153
+ var value = Number(heliumData.helium[spec]) || 0;
154
+ var maxValue = Math.max.apply(null, heliumLookup[spec].map(function (m) {
155
+ return m.level;
156
+ }));
157
+ var minValue = 0;
158
+ var _useState = useState(false),
159
+ _useState2 = _slicedToArray(_useState, 2),
160
+ edit = _useState2[0],
161
+ SetEdit = _useState2[1];
162
+ var _useState3 = useState(value),
163
+ _useState4 = _slicedToArray(_useState3, 2),
164
+ input = _useState4[0],
165
+ SetInput = _useState4[1];
166
+ var _useState5 = useState(false),
167
+ _useState6 = _slicedToArray(_useState5, 2),
168
+ error = _useState6[0],
169
+ SetError = _useState6[1];
170
+ if (edit) {
171
+ return /*#__PURE__*/jsxs(TableCell, {
172
+ children: [/*#__PURE__*/jsx(NumField, {
173
+ input: input,
174
+ SetInput: SetInput,
175
+ error: error,
176
+ SetError: SetError,
177
+ minValue: minValue,
178
+ maxValue: maxValue,
179
+ adornment: "%",
180
+ size: "small"
181
+ }), /*#__PURE__*/jsx(IconButton, {
182
+ disabled: error,
183
+ onClick: function onClick() {
184
+ SetHeliumData(function (heliumData) {
185
+ heliumData.helium[spec] = Number(input);
186
+ });
187
+ SetEdit(!edit);
188
+ SetLevelsEdited(true);
189
+ },
190
+ children: /*#__PURE__*/jsx(SaveIcon, {})
191
+ })]
192
+ });
193
+ } else {
194
+ return /*#__PURE__*/jsxs(TableCell, {
195
+ children: [Percentage(value, true), /*#__PURE__*/jsx(IconButton, {
196
+ size: "small",
197
+ onClick: function onClick() {
198
+ return SetEdit(!edit);
199
+ },
200
+ children: /*#__PURE__*/jsx(EditIcon, {})
201
+ })]
202
+ });
203
+ }
204
+ }
205
+
206
+ // render Helium level table
207
+
208
+ function HeliumTable(_ref2) {
209
+ var heliumData = _ref2.heliumData,
210
+ SetHeliumData = _ref2.SetHeliumData,
211
+ SetLevelsEdited = _ref2.SetLevelsEdited;
212
+ // Catch if no data present
213
+
214
+ if (heliumData.helium.length === 0) {
215
+ return /*#__PURE__*/jsx(Grid, {
216
+ children: /*#__PURE__*/jsx("em", {
217
+ children: "No Helium data found."
218
+ })
219
+ });
220
+ }
221
+
222
+ // Calculate sum of missing helium
223
+
224
+ var totalToMax = Object.keys(heliumData.helium).reduce(function (total, current) {
225
+ return total + CalcToMax({
226
+ spec: current,
227
+ value: heliumData.helium[current]
228
+ });
229
+ }, 0);
230
+ totalToMax = Math.round(totalToMax * 10) / 10;
231
+ return /*#__PURE__*/jsxs(AppTable, {
232
+ children: [/*#__PURE__*/jsx(TableHead, {
233
+ children: /*#__PURE__*/jsxs(TableRow, {
234
+ children: [/*#__PURE__*/jsx(TableHeadCell, {
235
+ children: "Spectrometer"
236
+ }), /*#__PURE__*/jsxs(TableHeadCell, {
237
+ children: ["Helium level", /*#__PURE__*/jsx("br", {}), "[%]"]
238
+ }), /*#__PURE__*/jsxs(TableHeadCell, {
239
+ children: ["Helium level", /*#__PURE__*/jsx("br", {}), "[liters]"]
240
+ }), /*#__PURE__*/jsxs(TableHeadCell, {
241
+ children: ["Diff. to maximum", /*#__PURE__*/jsx("br", {}), "[liters]"]
242
+ })]
243
+ })
244
+ }), /*#__PURE__*/jsx(TableBody, {
245
+ children: Object.keys(heliumData.helium).map(function (m) {
246
+ return /*#__PURE__*/jsxs(TableRow, {
247
+ children: [/*#__PURE__*/jsx(TableCell, {
248
+ children: m
249
+ }), /*#__PURE__*/jsx(HeliumEntry, {
250
+ heliumData: heliumData,
251
+ SetHeliumData: SetHeliumData,
252
+ SetLevelsEdited: SetLevelsEdited,
253
+ spec: m
254
+ }), /*#__PURE__*/jsx(TableCell, {
255
+ children: /*#__PURE__*/jsx(CalcLiters, {
256
+ spec: m,
257
+ value: heliumData.helium[m]
258
+ })
259
+ }), /*#__PURE__*/jsx(TableCell, {
260
+ children: /*#__PURE__*/jsx("strong", {
261
+ children: /*#__PURE__*/jsx(CalcToMax, {
262
+ spec: m,
263
+ value: heliumData.helium[m]
264
+ })
265
+ })
266
+ })]
267
+ }, m + "_entry");
268
+ })
269
+ }), /*#__PURE__*/jsx("tfoot", {
270
+ children: /*#__PURE__*/jsxs(TableRow, {
271
+ children: [/*#__PURE__*/jsx(TableCell, {
272
+ children: /*#__PURE__*/jsx("strong", {
273
+ children: "Sum"
274
+ })
275
+ }), /*#__PURE__*/jsx(TableCell, {}), /*#__PURE__*/jsx(TableCell, {}), /*#__PURE__*/jsx(TableCell, {
276
+ children: /*#__PURE__*/jsx("strong", {
277
+ children: totalToMax
278
+ })
279
+ })]
280
+ })
281
+ })]
282
+ });
283
+ }
284
+ function EditAdmon(_ref3) {
285
+ var levelsEdited = _ref3.levelsEdited;
286
+ if (levelsEdited) {
287
+ return /*#__PURE__*/jsxs(React.Fragment, {
288
+ children: [", ", /*#__PURE__*/jsx("strong", {
289
+ children: "edited"
290
+ })]
291
+ });
292
+ } else {
293
+ return null;
294
+ }
295
+ }
296
+
297
+ function SelectSpecs(_ref) {
298
+ var specs = _ref.specs,
299
+ SetSpecs = _ref.SetSpecs;
300
+ function SetAll(value) {
301
+ SetSpecs(function (specs) {
302
+ Object.keys(specs).map(function (spec) {
303
+ return specs[spec] = value;
304
+ });
305
+ });
306
+ return;
307
+ }
308
+ return /*#__PURE__*/jsxs(FormControl, {
309
+ children: [/*#__PURE__*/jsx(Divider, {
310
+ textAlign: "left",
311
+ children: /*#__PURE__*/jsx("strong", {
312
+ children: "Select spectrometers"
313
+ })
314
+ }), /*#__PURE__*/jsxs(FormGroup, {
315
+ row: true,
316
+ sx: {
317
+ px: 2
318
+ },
319
+ children: [Object.keys(specs).map(function (m) {
320
+ return /*#__PURE__*/jsx(FormControlLabel, {
321
+ control: /*#__PURE__*/jsx(Checkbox, {
322
+ size: "small"
323
+ }),
324
+ checked: specs[m],
325
+ onChange: function onChange() {
326
+ return SetSpecs(function (specs) {
327
+ specs[m] = !specs[m];
328
+ });
329
+ },
330
+ label: m
331
+ }, m + "_check");
332
+ }), " ", /*#__PURE__*/jsx(Button, {
333
+ size: "small",
334
+ onClick: function onClick() {
335
+ return SetAll(true);
336
+ },
337
+ children: "all"
338
+ }), " ", "\u2002", " ", /*#__PURE__*/jsx(Button, {
339
+ size: "small",
340
+ onClick: function onClick() {
341
+ return SetAll(false);
342
+ },
343
+ children: "none"
344
+ })]
345
+ })]
346
+ });
347
+ }
348
+
349
+ 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; }
350
+ 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), !0).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; }
351
+
352
+ // Admonition colors
353
+
354
+ var errorBg = AppTheme.palette.primary.main;
355
+ var errorText = AppTheme.palette.primary.contrastText;
356
+ var warnText = AppTheme.palette.warning.main;
357
+ function HePrognosisEntry(_ref) {
358
+ var value = _ref.value,
359
+ days = _ref.days,
360
+ spec = _ref.spec;
361
+ var heliumLookupData = useContext(LookupContext);
362
+
363
+ // Define lookup objects
364
+
365
+ var boilOff = heliumLookupData.boilOff;
366
+ var minima = heliumLookupData.minima;
367
+ var boil = Math.round(value + days * boilOff[spec]);
368
+
369
+ // Catch negative values
370
+
371
+ if (boil < 0) {
372
+ boil = 0;
373
+ }
374
+ var boilLiter = CalcLiters({
375
+ value: boil,
376
+ spec: spec
377
+ });
378
+ var boilToMax = CalcToMax({
379
+ value: boil,
380
+ spec: spec
381
+ });
382
+ var style = {};
383
+ if (boil < minima[spec] - 30 * boilOff[spec]) {
384
+ style = {
385
+ backgroundColor: errorBg,
386
+ color: errorText
387
+ };
388
+ } else if (boil < minima[spec] - 60 * boilOff[spec]) {
389
+ style = {
390
+ color: warnText
391
+ };
392
+ }
393
+ return /*#__PURE__*/jsxs(TableCell, {
394
+ sx: style,
395
+ children: [Percentage(boil, true), " ", /*#__PURE__*/jsx("br", {}), boilLiter, " L", /*#__PURE__*/jsx("br", {}), /*#__PURE__*/jsxs("strong", {
396
+ children: [boilToMax, " L"]
397
+ })]
398
+ });
399
+ }
400
+
401
+ // Calculate total missing helium at prognosed date
402
+
403
+ function HePrognosisSum(_ref2) {
404
+ var heliumData = _ref2.heliumData,
405
+ days = _ref2.days;
406
+ var heliumLookupData = useContext(LookupContext);
407
+
408
+ // Define lookup objects
409
+
410
+ var boilOff = heliumLookupData.boilOff;
411
+ var boilData = {};
412
+ Object.keys(heliumData).map(function (spec) {
413
+ boilData = _objectSpread$3(_objectSpread$3({}, boilData), {}, _defineProperty({}, spec, Math.round(heliumData[spec] + days * boilOff[spec])));
414
+ return null;
415
+ });
416
+ var toMaxSum = Object.keys(boilData).reduce(function (total, current) {
417
+ return total + CalcToMax({
418
+ spec: current,
419
+ value: boilData[current]
420
+ });
421
+ }, 0);
422
+ toMaxSum = Math.round(toMaxSum * 10) / 10;
423
+ return /*#__PURE__*/jsx(TableCell, {
424
+ children: /*#__PURE__*/jsxs("strong", {
425
+ children: [toMaxSum, " L"]
426
+ })
427
+ });
428
+ }
429
+
430
+ // Cell for day increment with edit switch
431
+
432
+ function HePrognosisIncr(_ref3) {
433
+ var days = _ref3.days,
434
+ increments = _ref3.increments,
435
+ SetIncrements = _ref3.SetIncrements,
436
+ dates = _ref3.dates;
437
+ var _useState = useState(false),
438
+ _useState2 = _slicedToArray(_useState, 2),
439
+ edit = _useState2[0],
440
+ SetEdit = _useState2[1];
441
+ var _useState3 = useState(days),
442
+ _useState4 = _slicedToArray(_useState3, 2),
443
+ input = _useState4[0],
444
+ SetInput = _useState4[1];
445
+ var _useState5 = useState(false),
446
+ _useState6 = _slicedToArray(_useState5, 2),
447
+ error = _useState6[0],
448
+ SetError = _useState6[1];
449
+ if (edit) {
450
+ return /*#__PURE__*/jsxs(TableCell, {
451
+ children: [dates[days], " ", /*#__PURE__*/jsx("br", {}), /*#__PURE__*/jsx(NumField, {
452
+ input: input,
453
+ SetInput: SetInput,
454
+ error: error,
455
+ SetError: SetError,
456
+ size: "small"
457
+ }), /*#__PURE__*/jsx("br", {}), /*#__PURE__*/jsx(IconButton, {
458
+ disabled: error,
459
+ size: "small",
460
+ onClick: function onClick() {
461
+ SetEdit(!edit);
462
+ SetIncrements(increments.map(function (inc) {
463
+ if (inc === days) {
464
+ return Number(input);
465
+ } else {
466
+ return inc;
467
+ }
468
+ }));
469
+ },
470
+ children: /*#__PURE__*/jsx(SaveIcon, {})
471
+ }), /*#__PURE__*/jsx(IconButton, {
472
+ size: "small",
473
+ onClick: function onClick() {
474
+ return SetIncrements(increments.filter(function (n) {
475
+ return n !== days;
476
+ }));
477
+ },
478
+ children: /*#__PURE__*/jsx(DeleteIcon, {})
479
+ })]
480
+ });
481
+ } else {
482
+ return /*#__PURE__*/jsxs(TableCell, {
483
+ children: [dates[days], " ", /*#__PURE__*/jsx("br", {}), " in ", days, " days ", /*#__PURE__*/jsx("br", {}), /*#__PURE__*/jsx(IconButton, {
484
+ size: "small",
485
+ onClick: function onClick() {
486
+ return SetEdit(!edit);
487
+ },
488
+ children: /*#__PURE__*/jsx(EditIcon, {})
489
+ }), /*#__PURE__*/jsx(IconButton, {
490
+ size: "small",
491
+ onClick: function onClick() {
492
+ return SetIncrements(increments.filter(function (n) {
493
+ return n !== days;
494
+ }));
495
+ },
496
+ children: /*#__PURE__*/jsx(DeleteIcon, {})
497
+ })]
498
+ });
499
+ }
500
+ }
501
+
502
+ // Render table row in prognosis table
503
+
504
+ function HePrognosisBody(_ref4) {
505
+ var increments = _ref4.increments,
506
+ SetIncrements = _ref4.SetIncrements,
507
+ heliumData = _ref4.heliumData,
508
+ dates = _ref4.dates;
509
+ return /*#__PURE__*/jsx(React.Fragment, {
510
+ children: increments.map(function (m) {
511
+ return /*#__PURE__*/jsxs(TableRow, {
512
+ children: [/*#__PURE__*/jsx(HePrognosisIncr, {
513
+ days: m,
514
+ increments: increments,
515
+ SetIncrements: SetIncrements,
516
+ dates: dates
517
+ }), Object.keys(heliumData).map(function (spec) {
518
+ return /*#__PURE__*/jsx(HePrognosisEntry, {
519
+ value: heliumData[spec],
520
+ days: m,
521
+ spec: spec
522
+ }, spec + "_progentry");
523
+ }), /*#__PURE__*/jsx(HePrognosisSum, {
524
+ heliumData: heliumData,
525
+ days: m
526
+ })]
527
+ }, m + "_incr");
528
+ })
529
+ });
530
+ }
531
+
532
+ // function for adding additional table entries
533
+
534
+ function AddPrognoEntry(_ref5) {
535
+ var increments = _ref5.increments,
536
+ SetIncrements = _ref5.SetIncrements;
537
+ var _useState7 = useState(""),
538
+ _useState8 = _slicedToArray(_useState7, 2),
539
+ input = _useState8[0];
540
+ _useState8[1];
541
+ var _useState9 = useState(false),
542
+ _useState10 = _slicedToArray(_useState9, 2),
543
+ error = _useState10[0];
544
+ _useState10[1];
545
+ return /*#__PURE__*/jsxs(React.Fragment, {
546
+ children: [/*#__PURE__*/jsx(Divider, {
547
+ textAlign: "left",
548
+ children: /*#__PURE__*/jsx("strong", {
549
+ children: "Add prediction row"
550
+ })
551
+ }), /*#__PURE__*/jsx(Grid, {
552
+ children: /*#__PURE__*/jsx(IconButton, {
553
+ disabled: error,
554
+ onClick: function onClick() {
555
+ SetIncrements([Number(input)].concat(_toConsumableArray(increments)));
556
+ },
557
+ children: /*#__PURE__*/jsx(AddBoxIcon, {})
558
+ })
559
+ })]
560
+ });
561
+ }
562
+
563
+ // render prognosis table based on day increments state array
564
+
565
+ function HePrognosis(_ref6) {
566
+ var heliumData = _ref6.heliumData;
567
+ var heliumLookupData = useContext(LookupContext);
568
+
569
+ // Define lookup objects
570
+
571
+ var minima = heliumLookupData.minima;
572
+ var specDefault = {};
573
+ var specList = Object.keys(heliumData.helium);
574
+ specList.map(function (spec) {
575
+ return specDefault = _objectSpread$3(_objectSpread$3({}, specDefault), {}, _defineProperty({}, spec, true));
576
+ });
577
+ var _useImmer = useImmer(specDefault),
578
+ _useImmer2 = _slicedToArray(_useImmer, 2),
579
+ specs = _useImmer2[0],
580
+ SetSpecs = _useImmer2[1];
581
+ var _useState11 = useState([14, 30, 60, 90]),
582
+ _useState12 = _slicedToArray(_useState11, 2),
583
+ increments = _useState12[0],
584
+ SetIncrements = _useState12[1];
585
+ var currHeliumData = {};
586
+ Object.keys(specs).filter(function (spec) {
587
+ return specs[spec];
588
+ }).map(function (spec) {
589
+ return currHeliumData = _objectSpread$3(_objectSpread$3({}, currHeliumData), {}, _defineProperty({}, spec, heliumData.helium[spec]));
590
+ });
591
+ var dates = {};
592
+ for (var i in increments) {
593
+ var d = new Date();
594
+ d.setDate(d.getDate() + increments[i]);
595
+ dates = _objectSpread$3(_objectSpread$3({}, dates), {}, _defineProperty({}, increments[i], moment(d).format("ll")));
596
+ }
597
+ return /*#__PURE__*/jsxs(Grid, {
598
+ container: true,
599
+ columns: {
600
+ xs: 6,
601
+ sm: 12
602
+ },
603
+ children: [/*#__PURE__*/jsx(Grid, {
604
+ xs: 6,
605
+ children: /*#__PURE__*/jsx(SelectSpecs, {
606
+ specs: specs,
607
+ SetSpecs: SetSpecs
608
+ })
609
+ }), /*#__PURE__*/jsx(Grid, {
610
+ xs: 6,
611
+ children: /*#__PURE__*/jsx(AddPrognoEntry, {
612
+ increments: increments,
613
+ SetIncrements: SetIncrements
614
+ })
615
+ }), /*#__PURE__*/jsx(Grid, {
616
+ xs: 12,
617
+ children: /*#__PURE__*/jsxs(AppTable, {
618
+ children: [/*#__PURE__*/jsxs(TableHead, {
619
+ children: [/*#__PURE__*/jsxs(TableRow, {
620
+ children: [/*#__PURE__*/jsx(TableHeadCell, {}), Object.keys(currHeliumData).map(function (spec) {
621
+ return /*#__PURE__*/jsxs(TableHeadCell, {
622
+ children: [spec, /*#__PURE__*/jsx("br", {}), "(", minima[spec], " %)"]
623
+ }, spec + "_th");
624
+ }), /*#__PURE__*/jsx(TableHeadCell, {
625
+ children: "Sum"
626
+ })]
627
+ }), /*#__PURE__*/jsxs(TableRow, {
628
+ children: [/*#__PURE__*/jsx(TableHeadCell, {}), /*#__PURE__*/jsx(TableHeadCell, {
629
+ align: "center",
630
+ colSpan: Object.keys(specs).length + 1,
631
+ children: /*#__PURE__*/jsx("em", {
632
+ children: "[%], Liters, L. to max"
633
+ })
634
+ })]
635
+ })]
636
+ }), /*#__PURE__*/jsx(TableBody, {
637
+ children: /*#__PURE__*/jsx(HePrognosisBody, {
638
+ increments: increments,
639
+ SetIncrements: SetIncrements,
640
+ dates: dates,
641
+ heliumData: currHeliumData
642
+ })
643
+ })]
644
+ })
645
+ }), /*#__PURE__*/jsxs(Grid, {
646
+ xs: 12,
647
+ sx: {
648
+ display: "flex",
649
+ justifyContent: "center",
650
+ alignItems: "center",
651
+ pt: 2
652
+ },
653
+ children: [/*#__PURE__*/jsx(Chip, {
654
+ sx: {
655
+ backgroundColor: errorBg,
656
+ color: errorText,
657
+ mx: 1
658
+ },
659
+ label: "Minimum in less than 30 days"
660
+ }), /*#__PURE__*/jsx(Chip, {
661
+ sx: {
662
+ color: warnText,
663
+ mx: 1
664
+ },
665
+ variant: "outlined",
666
+ label: "Minimum in less than 60 days"
667
+ })]
668
+ })]
669
+ });
670
+ }
671
+
672
+ function LiterInput(_ref) {
673
+ var limit = _ref.limit,
674
+ SetLimit = _ref.SetLimit,
675
+ error = _ref.error,
676
+ SetError = _ref.SetError;
677
+ var _useState = useState(limit),
678
+ _useState2 = _slicedToArray(_useState, 2),
679
+ input = _useState2[0],
680
+ SetInput = _useState2[1];
681
+ var _useState3 = useState(false),
682
+ _useState4 = _slicedToArray(_useState3, 2),
683
+ edit = _useState4[0],
684
+ SetEdit = _useState4[1];
685
+ if (edit) {
686
+ return /*#__PURE__*/jsxs(React.Fragment, {
687
+ children: [/*#__PURE__*/jsx(NumField, {
688
+ input: input,
689
+ SetInput: SetInput,
690
+ error: error,
691
+ SetError: SetError,
692
+ size: "medium",
693
+ adornment: "L"
694
+ }), " ", /*#__PURE__*/jsx(IconButton, {
695
+ disabled: error,
696
+ size: "small",
697
+ onClick: function onClick() {
698
+ SetEdit(!edit);
699
+ SetLimit(Number(input));
700
+ },
701
+ children: /*#__PURE__*/jsx(SaveIcon, {})
702
+ })]
703
+ });
704
+ } else {
705
+ return /*#__PURE__*/jsxs(React.Fragment, {
706
+ children: [limit, " L", " ", /*#__PURE__*/jsx(IconButton, {
707
+ size: "small",
708
+ onClick: function onClick() {
709
+ return SetEdit(!edit);
710
+ },
711
+ children: /*#__PURE__*/jsx(EditIcon, {})
712
+ })]
713
+ });
714
+ }
715
+ }
716
+
717
+ function FindPair(_ref) {
718
+ var currSpecs = _ref.currSpecs,
719
+ heliumData = _ref.heliumData,
720
+ boilOff = _ref.boilOff,
721
+ limit = _ref.limit;
722
+ // find all possible pairs of spectrometers
723
+
724
+ var specPairs = [];
725
+ currSpecs.map(function (spec1) {
726
+ currSpecs.map(function (spec2) {
727
+ if (spec1 !== spec2) {
728
+ specPairs.push([spec1, spec2].sort()); // sort to facilitate duplicate removal
729
+ }
730
+ });
731
+ });
732
+
733
+ // remove duplicates from array by conversion to string
734
+
735
+ specPairs = Array.from(new Set(specPairs.map(JSON.stringify)), JSON.parse);
736
+ var specPairsLiters = [];
737
+ var _loop = function _loop() {
738
+ var j = 1;
739
+ var pairBoil = 0;
740
+
741
+ // Add current pair of specs
742
+
743
+ specPairsLiters.push(specPairs[i]);
744
+
745
+ // Calculate L. to max for pair until reaching target value
746
+
747
+ do {
748
+ pairBoil = specPairs[i].reduce(function (total, current) {
749
+ var boil = Math.round(heliumData.helium[current] + j * boilOff[current]);
750
+
751
+ // Catch negative values
752
+ if (boil < 0) {
753
+ boil = 0;
754
+ }
755
+ var boilToMax = CalcToMax({
756
+ value: boil,
757
+ spec: current
758
+ });
759
+ return total + boilToMax;
760
+ }, 0);
761
+ j++;
762
+ } while (pairBoil < limit && j < 300);
763
+
764
+ // Result to pair
765
+
766
+ specPairsLiters[i].push(j);
767
+ specPairsLiters[i].push(pairBoil);
768
+ specPairsLiters[i].push(pairBoil > limit);
769
+ };
770
+ for (var i in specPairs) {
771
+ _loop();
772
+ }
773
+
774
+ // Remove pairs that did not converge
775
+
776
+ specPairsLiters = specPairsLiters.filter(function (pair) {
777
+ return pair[4];
778
+ });
779
+
780
+ // Find pair with minimal number of days
781
+
782
+ var minPair = [];
783
+ switch (specPairsLiters.length) {
784
+ case 0:
785
+ minPair = [];
786
+ break;
787
+ case 1:
788
+ minPair = _toConsumableArray(specPairsLiters);
789
+ break;
790
+ default:
791
+ minPair = specPairsLiters.reduce(function (min, current) {
792
+ var i = current[2] < min[2] ? current : min;
793
+ return i;
794
+ });
795
+ break;
796
+ }
797
+ minPair = minPair.flat();
798
+ return minPair;
799
+ }
800
+ function FindTriple(_ref2) {
801
+ var currSpecs = _ref2.currSpecs,
802
+ heliumData = _ref2.heliumData,
803
+ boilOff = _ref2.boilOff,
804
+ limit = _ref2.limit;
805
+ // find all possible triples of spectrometers
806
+
807
+ var specTriples = [];
808
+ currSpecs.map(function (spec1) {
809
+ currSpecs.map(function (spec2) {
810
+ currSpecs.map(function (spec3) {
811
+ if (!(spec1 === spec2 || spec2 === spec3 || spec3 === spec1)) {
812
+ specTriples.push([spec1, spec2, spec3].sort()); // sort to facilitate duplicate removal
813
+ }
814
+ });
815
+ });
816
+ });
817
+
818
+ // remove duplicates from array by conversion to string
819
+
820
+ specTriples = Array.from(new Set(specTriples.map(JSON.stringify)), JSON.parse);
821
+ var specTriplesLiters = [];
822
+ var _loop2 = function _loop2() {
823
+ var j = 1;
824
+ var pairBoil = 0;
825
+
826
+ // Add current pair of specs
827
+
828
+ specTriplesLiters.push(specTriples[i]);
829
+
830
+ // Calculate L. to max for pair until reaching target value
831
+
832
+ do {
833
+ pairBoil = specTriples[i].reduce(function (total, current) {
834
+ var boil = Math.round(heliumData.helium[current] + j * boilOff[current]);
835
+
836
+ // Catch negative values
837
+ if (boil < 0) {
838
+ boil = 0;
839
+ }
840
+ var boilToMax = CalcToMax({
841
+ value: boil,
842
+ spec: current
843
+ });
844
+ return total + boilToMax;
845
+ }, 0);
846
+ j++;
847
+ } while (pairBoil < limit && j < 300);
848
+
849
+ // Result to triple
850
+
851
+ specTriplesLiters[i].push(j);
852
+ specTriplesLiters[i].push(pairBoil);
853
+ specTriplesLiters[i].push(pairBoil > limit);
854
+ };
855
+ for (var i in specTriples) {
856
+ _loop2();
857
+ }
858
+
859
+ // Remove triples that did not converge
860
+
861
+ specTriplesLiters = specTriplesLiters.filter(function (pair) {
862
+ return pair[5];
863
+ });
864
+
865
+ // Find triple with minimal number of days
866
+
867
+ var minTriple = [];
868
+ switch (specTriplesLiters.length) {
869
+ case 0:
870
+ minTriple = [];
871
+ break;
872
+ case 1:
873
+ minTriple = _toConsumableArray(specTriplesLiters);
874
+ break;
875
+ default:
876
+ minTriple = specTriplesLiters.reduce(function (min, current) {
877
+ var i = current[3] < min[3] ? current : min;
878
+ return i;
879
+ });
880
+ break;
881
+ }
882
+ minTriple = minTriple.flat();
883
+ return minTriple;
884
+ }
885
+
886
+ 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; }
887
+ 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), !0).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; }
888
+ function TupleResult(_ref) {
889
+ var children = _ref.children,
890
+ title = _ref.title;
891
+ return /*#__PURE__*/jsx(Grid, {
892
+ children: /*#__PURE__*/jsxs(AppTable, {
893
+ children: [/*#__PURE__*/jsx(TableHead, {
894
+ children: /*#__PURE__*/jsx(TableRow, {
895
+ children: /*#__PURE__*/jsx(TableHeadCell, {
896
+ children: title
897
+ })
898
+ })
899
+ }), /*#__PURE__*/jsx(TableBody, {
900
+ children: /*#__PURE__*/jsx(TableRow, {
901
+ children: /*#__PURE__*/jsx(TableCell, {
902
+ children: children
903
+ })
904
+ })
905
+ })]
906
+ })
907
+ });
908
+ }
909
+ function PairResult(_ref2) {
910
+ var minPair = _ref2.minPair;
911
+ if (minPair.length !== 0) {
912
+ var d = new Date();
913
+ d.setDate(d.getDate() + minPair[2]);
914
+ var date = moment$1(d).format("ll");
915
+ return /*#__PURE__*/jsxs(TupleResult, {
916
+ title: "Pair",
917
+ children: [/*#__PURE__*/jsx("strong", {
918
+ children: minPair[0]
919
+ }), " and ", /*#__PURE__*/jsx("strong", {
920
+ children: minPair[1]
921
+ }), " ", "in ", /*#__PURE__*/jsxs("strong", {
922
+ children: [minPair[2], " days"]
923
+ }), " (", date, ")"]
924
+ });
925
+ } else {
926
+ return /*#__PURE__*/jsx(TupleResult, {
927
+ title: "Pair",
928
+ children: /*#__PURE__*/jsx("em", {
929
+ children: "No spectrometer pair reaches the target value."
930
+ })
931
+ });
932
+ }
933
+ }
934
+ function TripleResult(_ref3) {
935
+ var minTriple = _ref3.minTriple;
936
+ if (minTriple.length !== 0) {
937
+ var d = new Date();
938
+ d.setDate(d.getDate() + minTriple[3]);
939
+ var date = moment$1(d).format("ll");
940
+ return /*#__PURE__*/jsxs(TupleResult, {
941
+ title: "Triple",
942
+ children: [/*#__PURE__*/jsx("strong", {
943
+ children: minTriple[0]
944
+ }), ", ", /*#__PURE__*/jsx("strong", {
945
+ children: minTriple[1]
946
+ }), ", and ", /*#__PURE__*/jsx("strong", {
947
+ children: minTriple[2]
948
+ }), " in", " ", /*#__PURE__*/jsxs("strong", {
949
+ children: [minTriple[3], " days"]
950
+ }), " (", date, ")"]
951
+ });
952
+ } else {
953
+ return /*#__PURE__*/jsx(TupleResult, {
954
+ title: "Triple",
955
+ children: /*#__PURE__*/jsx("p", {
956
+ children: /*#__PURE__*/jsx("em", {
957
+ children: "No spectrometer triple reaches the target value."
958
+ })
959
+ })
960
+ });
961
+ }
962
+ }
963
+ function PairWizard(_ref4) {
964
+ var heliumData = _ref4.heliumData;
965
+ var heliumLookupData = useContext(LookupContext);
966
+
967
+ // Define lookup objects
968
+
969
+ var boilOff = heliumLookupData.boilOff;
970
+ var defaultSpecs = {};
971
+ Object.keys(boilOff).map(function (spec) {
972
+ return defaultSpecs = _objectSpread$2(_objectSpread$2({}, defaultSpecs), {}, _defineProperty({}, spec, true));
973
+ });
974
+ var _useImmer = useImmer(defaultSpecs),
975
+ _useImmer2 = _slicedToArray(_useImmer, 2),
976
+ specs = _useImmer2[0],
977
+ SetSpecs = _useImmer2[1];
978
+ var currSpecs = Object.keys(specs).filter(function (spec) {
979
+ return specs[spec];
980
+ });
981
+ var _useState = useState(false),
982
+ _useState2 = _slicedToArray(_useState, 2),
983
+ error = _useState2[0],
984
+ SetError = _useState2[1];
985
+ var _useState3 = useState(100),
986
+ _useState4 = _slicedToArray(_useState3, 2),
987
+ limit = _useState4[0],
988
+ SetLimit = _useState4[1];
989
+ var minPair = FindPair(_objectSpread$2({}, {
990
+ currSpecs: currSpecs,
991
+ heliumData: heliumData,
992
+ boilOff: boilOff,
993
+ limit: limit
994
+ }));
995
+ var minTriple = FindTriple(_objectSpread$2({}, {
996
+ currSpecs: currSpecs,
997
+ heliumData: heliumData,
998
+ boilOff: boilOff,
999
+ limit: limit
1000
+ }));
1001
+ return /*#__PURE__*/jsx(React.Fragment, {
1002
+ children: /*#__PURE__*/jsxs(Grid, {
1003
+ container: true,
1004
+ columns: {
1005
+ xs: 6,
1006
+ md: 12
1007
+ },
1008
+ children: [/*#__PURE__*/jsxs(Grid, {
1009
+ xs: 6,
1010
+ sx: {
1011
+ px: 2
1012
+ },
1013
+ children: [/*#__PURE__*/jsx(Divider, {
1014
+ textAlign: "left",
1015
+ children: /*#__PURE__*/jsx("strong", {
1016
+ children: "Find earliest set of spectrometers requiring"
1017
+ })
1018
+ }), /*#__PURE__*/jsx(Grid, {
1019
+ sx: {
1020
+ padding: 2,
1021
+ display: "flex",
1022
+ justifyContent: "center"
1023
+ },
1024
+ children: /*#__PURE__*/jsx(Typography, {
1025
+ variant: "h4",
1026
+ children: /*#__PURE__*/jsx(LiterInput, {
1027
+ limit: limit,
1028
+ SetLimit: SetLimit,
1029
+ error: error,
1030
+ SetError: SetError
1031
+ })
1032
+ })
1033
+ }), /*#__PURE__*/jsx(Grid, {
1034
+ children: /*#__PURE__*/jsx(SelectSpecs, {
1035
+ specs: specs,
1036
+ SetSpecs: SetSpecs
1037
+ })
1038
+ })]
1039
+ }), /*#__PURE__*/jsxs(Grid, {
1040
+ xs: 6,
1041
+ sx: {
1042
+ px: 2
1043
+ },
1044
+ children: [/*#__PURE__*/jsx(Divider, {
1045
+ textAlign: "left",
1046
+ children: /*#__PURE__*/jsx("strong", {
1047
+ children: "Result"
1048
+ })
1049
+ }), /*#__PURE__*/jsxs(Grid, {
1050
+ sx: {
1051
+ px: 3
1052
+ },
1053
+ children: [/*#__PURE__*/jsx(PairResult, {
1054
+ minPair: minPair
1055
+ }), /*#__PURE__*/jsx(TripleResult, {
1056
+ minTriple: minTriple
1057
+ })]
1058
+ })]
1059
+ })]
1060
+ })
1061
+ });
1062
+ }
1063
+
1064
+ 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; }
1065
+ 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), !0).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; }
1066
+ function EstimateConsumption() {
1067
+ // Get data
1068
+
1069
+ var heliumLookupData = useContext(LookupContext);
1070
+ var boilOff = heliumLookupData.boilOff;
1071
+ var lookup = heliumLookupData.lookup;
1072
+
1073
+ // Define array and populate with days and liters to get from 100% to 50%
1074
+
1075
+ var specCons = [];
1076
+ Object.keys(lookup).map(function (spec) {
1077
+ return specCons.push({
1078
+ name: spec,
1079
+ liters: (lookup[spec].filter(function (x) {
1080
+ return x.level === 100;
1081
+ })[0].liters - lookup[spec].filter(function (x) {
1082
+ return x.level === 50;
1083
+ })[0].liters).toFixed(1),
1084
+ days: (-50 / boilOff[spec]).toFixed(1)
1085
+ });
1086
+ });
1087
+
1088
+ // Calculate consumption per day, month, year from values above
1089
+
1090
+ specCons = specCons.map(function (spec) {
1091
+ return _objectSpread$1(_objectSpread$1({}, spec), {}, {
1092
+ perDay: spec.liters / spec.days,
1093
+ perMonth: (spec.liters / spec.days * 30).toFixed(1),
1094
+ perYear: (spec.liters / spec.days * 365).toFixed(1)
1095
+ });
1096
+ });
1097
+ return /*#__PURE__*/jsxs(React.Fragment, {
1098
+ children: [/*#__PURE__*/jsx("p", {
1099
+ children: "Helium consumption estimated based on lookup values."
1100
+ }), /*#__PURE__*/jsxs(AppTable, {
1101
+ children: [/*#__PURE__*/jsx(TableHead, {
1102
+ children: /*#__PURE__*/jsxs(TableRow, {
1103
+ children: [/*#__PURE__*/jsx(TableHeadCell, {}), specCons.map(function (spec) {
1104
+ return /*#__PURE__*/jsx(TableHeadCell, {
1105
+ children: spec.name
1106
+ }, "Head" + spec.name);
1107
+ }), /*#__PURE__*/jsx(TableHeadCell, {
1108
+ children: "Sum"
1109
+ })]
1110
+ })
1111
+ }), /*#__PURE__*/jsxs(TableBody, {
1112
+ children: [/*#__PURE__*/jsxs(TableRow, {
1113
+ children: [/*#__PURE__*/jsx(TableCell, {
1114
+ children: "per month"
1115
+ }), specCons.map(function (spec) {
1116
+ return /*#__PURE__*/jsxs(TableCell, {
1117
+ children: [spec.perMonth, " L ", /*#__PURE__*/jsx("br", {}), "(", (spec.perMonth * 0.79).toFixed(2), " m", /*#__PURE__*/jsx("sup", {
1118
+ children: "3"
1119
+ }), " Gas)"]
1120
+ }, "perMonth" + spec.name);
1121
+ }), /*#__PURE__*/jsx(TableCell, {
1122
+ children: /*#__PURE__*/jsxs("strong", {
1123
+ children: [specCons.reduce(function (total, spec) {
1124
+ return total + Number(spec.perMonth);
1125
+ }, 0).toFixed(1), " ", "L", /*#__PURE__*/jsx("br", {}), "(", (specCons.reduce(function (total, spec) {
1126
+ return total + Number(spec.perMonth);
1127
+ }, 0) * 0.79).toFixed(2), " ", "m", /*#__PURE__*/jsx("sup", {
1128
+ children: "3"
1129
+ }), " Gas)"]
1130
+ })
1131
+ })]
1132
+ }), /*#__PURE__*/jsxs(TableRow, {
1133
+ children: [/*#__PURE__*/jsx(TableCell, {
1134
+ rowSpan: 2,
1135
+ children: "per year"
1136
+ }), specCons.map(function (spec) {
1137
+ return /*#__PURE__*/jsxs(TableCell, {
1138
+ children: [spec.perYear, " L ", /*#__PURE__*/jsx("br", {}), "(", (spec.perYear * 0.79).toFixed(2), " m", /*#__PURE__*/jsx("sup", {
1139
+ children: "3"
1140
+ }), " ", "Gas)"]
1141
+ }, "perYear" + spec.name);
1142
+ }), /*#__PURE__*/jsx(TableCell, {
1143
+ children: /*#__PURE__*/jsxs("strong", {
1144
+ children: [specCons.reduce(function (total, spec) {
1145
+ return total + Number(spec.perYear);
1146
+ }, 0).toFixed(1), " ", "L", /*#__PURE__*/jsx("br", {}), "(", (specCons.reduce(function (total, spec) {
1147
+ return total + Number(spec.perYear);
1148
+ }, 0) * 0.79).toFixed(2), " ", "m", /*#__PURE__*/jsx("sup", {
1149
+ children: "3"
1150
+ }), " Gas)"]
1151
+ })
1152
+ })]
1153
+ })]
1154
+ })]
1155
+ })]
1156
+ });
1157
+ }
1158
+
1159
+ function RenderGraph(_ref) {
1160
+ var data = _ref.data,
1161
+ height = _ref.height,
1162
+ width = _ref.width,
1163
+ spec = _ref.spec;
1164
+ // Import Context
1165
+
1166
+ var heliumLookupData = useContext(LookupContext);
1167
+
1168
+ // Custom Tooltip for LineChart
1169
+
1170
+ var CustomTooltip = function CustomTooltip(_ref2) {
1171
+ var active = _ref2.active,
1172
+ payload = _ref2.payload,
1173
+ label = _ref2.label;
1174
+ if (active && payload && payload.length) {
1175
+ var date = moment(payload[0].payload.date, "ddd MMM D HH:mm:ss YYYY").format("LL");
1176
+ return /*#__PURE__*/jsxs("div", {
1177
+ style: {
1178
+ border: "solid 1px " + AppTheme.palette.secondary.main,
1179
+ padding: "0.75em",
1180
+ backgroundColor: "#ffffffaa"
1181
+ },
1182
+ children: [/*#__PURE__*/jsx("strong", {
1183
+ children: date
1184
+ }), /*#__PURE__*/jsx("br", {}), /*#__PURE__*/jsxs("em", {
1185
+ children: ["(", label, " days ago)"]
1186
+ }), /*#__PURE__*/jsx("br", {}), /*#__PURE__*/jsxs("strong", {
1187
+ style: {
1188
+ color: AppTheme.palette.primary.main
1189
+ },
1190
+ children: [payload[0].value, " %"]
1191
+ })]
1192
+ });
1193
+ }
1194
+ };
1195
+
1196
+ // Button for days state change
1197
+
1198
+ function DayButton(_ref3) {
1199
+ var value = _ref3.value;
1200
+ return /*#__PURE__*/jsx(Button, {
1201
+ onClick: function onClick() {
1202
+ return SetDays(value);
1203
+ },
1204
+ color: value === days ? "primary" : "secondary" // Active button style
1205
+ ,
1206
+ variant: value === days ? "contained" : "outlined" // Active button style
1207
+ ,
1208
+ size: "small",
1209
+ children: value
1210
+ });
1211
+ }
1212
+
1213
+ // State
1214
+
1215
+ var _useState = useState(90),
1216
+ _useState2 = _slicedToArray(_useState, 2),
1217
+ days = _useState2[0],
1218
+ SetDays = _useState2[1];
1219
+ var _useState3 = useState(true),
1220
+ _useState4 = _slicedToArray(_useState3, 2),
1221
+ showMinima = _useState4[0],
1222
+ setShowMinima = _useState4[1];
1223
+
1224
+ // Add days ago to data
1225
+
1226
+ data.map(function (item) {
1227
+ item.days = -moment(item.date, "ddd MMM D HH:mm:ss YYYY").diff(moment(), "days");
1228
+ });
1229
+
1230
+ // Get last n elements of array
1231
+
1232
+ data = data.slice(Math.max(data.length - days, 0));
1233
+ return /*#__PURE__*/jsxs(React.Fragment, {
1234
+ children: [/*#__PURE__*/jsxs(LineChart, {
1235
+ height: height,
1236
+ width: width,
1237
+ data: data,
1238
+ margin: {
1239
+ top: 5,
1240
+ right: 20,
1241
+ bottom: 25,
1242
+ left: 0
1243
+ },
1244
+ children: [/*#__PURE__*/jsx(Line, {
1245
+ dataKey: "level",
1246
+ stroke: AppTheme.palette.primary.main,
1247
+ fill: AppTheme.palette.primary.main,
1248
+ type: "linear",
1249
+ dot: {
1250
+ r: 1.5
1251
+ }
1252
+ }), /*#__PURE__*/jsx(CartesianGrid, {
1253
+ stroke: AppTheme.palette.divider,
1254
+ strokeDasharray: "5 5"
1255
+ }), /*#__PURE__*/jsx(XAxis, {
1256
+ dataKey: "days",
1257
+ interval: days < 15 ? 1 : Math.round(days / 3),
1258
+ children: /*#__PURE__*/jsx(Label, {
1259
+ value: "Days ago",
1260
+ offset: 1,
1261
+ position: "bottom"
1262
+ })
1263
+ }), /*#__PURE__*/jsx(YAxis, {
1264
+ dataKey: "level",
1265
+ unit: "%",
1266
+ type: "number",
1267
+ domain: [0, 100]
1268
+ }), showMinima ? /*#__PURE__*/jsxs(React.Fragment, {
1269
+ children: [/*#__PURE__*/jsx(ReferenceLine, {
1270
+ y: heliumLookupData.minima[spec],
1271
+ stroke: AppTheme.palette.secondary.main,
1272
+ strokeDasharray: (3)
1273
+ }), /*#__PURE__*/jsx(ReferenceArea, {
1274
+ y1: heliumLookupData.minima[spec],
1275
+ y2: 0,
1276
+ stroke: "none",
1277
+ stro: true,
1278
+ fill: AppTheme.palette.secondary.main,
1279
+ fillOpacity: 0.1
1280
+ })]
1281
+ }) : null, /*#__PURE__*/jsx(Tooltip, {
1282
+ content: /*#__PURE__*/jsx(CustomTooltip, {})
1283
+ })]
1284
+ }), /*#__PURE__*/jsxs(ButtonGroup, {
1285
+ disableElevation: true,
1286
+ variant: "outlined",
1287
+ fullWidth: true,
1288
+ color: "secondary",
1289
+ "aria-label": "contained primary button group",
1290
+ sx: {
1291
+ justifySelf: "center",
1292
+ px: 5
1293
+ },
1294
+ size: "small",
1295
+ children: [/*#__PURE__*/jsx(DayButton, {
1296
+ value: 7
1297
+ }), /*#__PURE__*/jsx(DayButton, {
1298
+ value: 30
1299
+ }), /*#__PURE__*/jsx(DayButton, {
1300
+ value: 90
1301
+ }), /*#__PURE__*/jsx(DayButton, {
1302
+ value: 180
1303
+ }), /*#__PURE__*/jsx(DayButton, {
1304
+ value: 365
1305
+ })]
1306
+ }), /*#__PURE__*/jsx(FormGroup, {
1307
+ children: /*#__PURE__*/jsx(FormControlLabel, {
1308
+ control: /*#__PURE__*/jsx(Switch, {
1309
+ label: "Show Minimum",
1310
+ checked: showMinima,
1311
+ onChange: function onChange() {
1312
+ return setShowMinima(!showMinima);
1313
+ }
1314
+ }),
1315
+ label: "Show Minimum",
1316
+ sx: {
1317
+ justifyContent: "center"
1318
+ }
1319
+ })
1320
+ })]
1321
+ });
1322
+ }
1323
+ function HeliumGraph(_ref4) {
1324
+ var graphData = _ref4.graphData,
1325
+ graphDataMeta = _ref4.graphDataMeta,
1326
+ matches = _ref4.matches;
1327
+ var height = matches ? 250 : 200;
1328
+ var width = matches ? 300 : 280;
1329
+ return /*#__PURE__*/jsxs(React.Fragment, {
1330
+ children: [/*#__PURE__*/jsxs(DivTitle, {
1331
+ children: [/*#__PURE__*/jsx("strong", {
1332
+ children: "Helium level monitoring"
1333
+ }), " ", /*#__PURE__*/jsxs("em", {
1334
+ children: ["(updated ", moment(graphDataMeta.date).fromNow(), ")"]
1335
+ })]
1336
+ }), /*#__PURE__*/jsx(Grid, {
1337
+ container: true,
1338
+ sx: {
1339
+ display: "flex",
1340
+ justifyContent: "center"
1341
+ },
1342
+ children: Object.keys(graphData).map(function (spec) {
1343
+ return /*#__PURE__*/jsxs(Paper, {
1344
+ sx: {
1345
+ display: "flex",
1346
+ flexDirection: "column",
1347
+ justifyItems: "center",
1348
+ stroke: AppTheme.palette.divider,
1349
+ px: 2,
1350
+ paddingBottom: 2,
1351
+ margin: 2
1352
+ },
1353
+ children: [/*#__PURE__*/jsx("h4", {
1354
+ children: spec
1355
+ }), /*#__PURE__*/jsx(RenderGraph, {
1356
+ data: graphData[spec],
1357
+ height: height,
1358
+ width: width,
1359
+ spec: spec
1360
+ })]
1361
+ }, "graph_" + spec);
1362
+ })
1363
+ })]
1364
+ });
1365
+ }
1366
+
1367
+ 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; }
1368
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).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; }
1369
+ function Helium(props) {
1370
+ // State
1371
+
1372
+ var _useImmer = useImmer(null),
1373
+ _useImmer2 = _slicedToArray(_useImmer, 2),
1374
+ heliumData = _useImmer2[0],
1375
+ SetHeliumData = _useImmer2[1];
1376
+ var _useState = useState(false),
1377
+ _useState2 = _slicedToArray(_useState, 2),
1378
+ levelsEdited = _useState2[0],
1379
+ SetLevelsEdited = _useState2[1];
1380
+ var _useState3 = useState(false),
1381
+ _useState4 = _slicedToArray(_useState3, 2),
1382
+ preprocessed = _useState4[0],
1383
+ SetPreprocessed = _useState4[1];
1384
+
1385
+ // Query Media size for responsive column wrapping
1386
+
1387
+ var matches = useMediaQuery(AppTheme.breakpoints.up("lg"));
1388
+ var maxHeight = matches ? props.maxHeight || 1280 : 1000000;
1389
+ var cardSize = matches ? 6 : 12;
1390
+ var collapsed = !matches;
1391
+
1392
+ // fetch data
1393
+
1394
+ var heliumLookupData = PublicFetch({
1395
+ url: "/heliumLookup.json"
1396
+ });
1397
+ var fetchGraph = PublicFetch({
1398
+ url: "/graphdata.json"
1399
+ });
1400
+ PublicFetch({
1401
+ url: "/helium.json",
1402
+ SetState: SetHeliumData
1403
+ });
1404
+ useEffect(function () {
1405
+ if (heliumData) {
1406
+ Object.keys(heliumData.helium).map(function (spec) {
1407
+ SetHeliumData(function (heliumData) {
1408
+ heliumData.helium[spec] = Number(heliumData.helium[spec]);
1409
+ });
1410
+ });
1411
+ SetPreprocessed(true);
1412
+ }
1413
+ }, [heliumData]);
1414
+
1415
+ // Catch empty data
1416
+
1417
+ if (!heliumData || !heliumLookupData || !fetchGraph || preprocessed === false) {
1418
+ return /*#__PURE__*/jsx(Progress, {});
1419
+ }
1420
+ var graphDataMeta = fetchGraph.meta;
1421
+ var graphData = _objectSpread({}, fetchGraph);
1422
+ delete graphData.meta;
1423
+ if (!graphDataMeta) {
1424
+ return /*#__PURE__*/jsx(Progress, {});
1425
+ }
1426
+ return /*#__PURE__*/jsx(AppGrid, {
1427
+ children: /*#__PURE__*/jsxs(LookupContext.Provider, {
1428
+ value: heliumLookupData,
1429
+ children: [/*#__PURE__*/jsx(AppCard, {
1430
+ title: "Helium Graphs",
1431
+ size: 12,
1432
+ collapsed: collapsed,
1433
+ children: /*#__PURE__*/jsx(HeliumGraph, {
1434
+ graphData: graphData,
1435
+ graphDataMeta: graphDataMeta,
1436
+ matches: matches
1437
+ })
1438
+ }), /*#__PURE__*/jsxs(Grid, {
1439
+ sx: {
1440
+ display: "flex",
1441
+ flexFlow: "column wrap",
1442
+ maxHeight: maxHeight
1443
+ },
1444
+ children: [/*#__PURE__*/jsxs(AppCard, {
1445
+ title: "Helium Calculator",
1446
+ size: cardSize,
1447
+ collapsed: collapsed,
1448
+ children: [/*#__PURE__*/jsx(Grid, {
1449
+ children: /*#__PURE__*/jsxs(DivTitle, {
1450
+ children: [/*#__PURE__*/jsx("strong", {
1451
+ children: "Current levels"
1452
+ }), " ", /*#__PURE__*/jsxs("em", {
1453
+ children: ["(updated", " ", moment(heliumData.meta.date).fromNow(), /*#__PURE__*/jsx(EditAdmon, {
1454
+ levelsEdited: levelsEdited
1455
+ }), ")"]
1456
+ })]
1457
+ })
1458
+ }), /*#__PURE__*/jsx(Grid, {
1459
+ children: /*#__PURE__*/jsx(HeliumTable, {
1460
+ heliumLookupData: heliumLookupData,
1461
+ heliumData: heliumData,
1462
+ SetHeliumData: SetHeliumData,
1463
+ SetLevelsEdited: SetLevelsEdited
1464
+ })
1465
+ })]
1466
+ }), /*#__PURE__*/jsx(AppCard, {
1467
+ title: "Spectrometer Set",
1468
+ size: cardSize,
1469
+ collapsed: collapsed,
1470
+ children: /*#__PURE__*/jsx(Grid, {
1471
+ children: /*#__PURE__*/jsx(PairWizard, {
1472
+ heliumData: heliumData
1473
+ })
1474
+ })
1475
+ }), /*#__PURE__*/jsx(AppCard, {
1476
+ title: "Estimated Consumption",
1477
+ size: cardSize,
1478
+ collapsed: collapsed,
1479
+ children: /*#__PURE__*/jsx(Grid, {
1480
+ children: /*#__PURE__*/jsx(EstimateConsumption, {})
1481
+ })
1482
+ }), /*#__PURE__*/jsx(AppCard, {
1483
+ title: "Helium Estimation",
1484
+ size: cardSize,
1485
+ children: /*#__PURE__*/jsx(HePrognosis, {
1486
+ heliumData: heliumData,
1487
+ heliumLookupData: heliumLookupData
1488
+ })
1489
+ }), /*#__PURE__*/jsx(AppCard, {
1490
+ title: "Fill Target",
1491
+ size: cardSize
1492
+ })]
1493
+ })]
1494
+ })
1495
+ });
1496
+ }
1497
+
1498
+ // Import and export all components
1499
+
1500
+ export { Helium as default };