@insync-stageplayer/measurements 0.4.8 → 0.4.13

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 (93) hide show
  1. package/lib/AsyncSubject.d.ts +23 -23
  2. package/lib/AsyncSubject.js +64 -64
  3. package/lib/client/MeasurementDataClient.d.ts +126 -124
  4. package/lib/client/MeasurementDataClient.d.ts.map +1 -1
  5. package/lib/client/MeasurementDataClient.js +99 -99
  6. package/lib/client/MeasurementDataClient.js.map +1 -1
  7. package/lib/client/OnlineMeasurementDataClient.d.ts +43 -42
  8. package/lib/client/OnlineMeasurementDataClient.d.ts.map +1 -1
  9. package/lib/client/OnlineMeasurementDataClient.js +181 -166
  10. package/lib/client/OnlineMeasurementDataClient.js.map +1 -1
  11. package/lib/client/debug.d.ts +1 -1
  12. package/lib/client/debug.js +4 -4
  13. package/lib/client/index.d.ts +2 -2
  14. package/lib/client/index.js +2 -2
  15. package/lib/client/offline/OfflineMeasurementDataClient.d.ts +15 -14
  16. package/lib/client/offline/OfflineMeasurementDataClient.d.ts.map +1 -1
  17. package/lib/client/offline/OfflineMeasurementDataClient.js +44 -41
  18. package/lib/client/offline/OfflineMeasurementDataClient.js.map +1 -1
  19. package/lib/client/offline/offline.d.ts +16 -16
  20. package/lib/client/offline/offline.js +79 -79
  21. package/lib/client/sbf.d.ts +34 -34
  22. package/lib/client/sbf.js +88 -88
  23. package/lib/components/Icon/CloseIcon.d.ts +7 -0
  24. package/lib/components/Icon/CloseIcon.d.ts.map +1 -0
  25. package/lib/components/Icon/CloseIcon.js +32 -0
  26. package/lib/components/Icon/CloseIcon.js.map +1 -0
  27. package/lib/components/MeasurementsChooser.d.ts +34 -34
  28. package/lib/components/MeasurementsChooser.js +95 -95
  29. package/lib/components/MeasurementsModuleProvider.d.ts +34 -34
  30. package/lib/components/MeasurementsModuleProvider.d.ts.map +1 -1
  31. package/lib/components/MeasurementsModuleProvider.js +73 -73
  32. package/lib/components/MeasurementsModuleProvider.js.map +1 -1
  33. package/lib/components/MeasurementsTable/CheckboxCell.d.ts +18 -18
  34. package/lib/components/MeasurementsTable/CheckboxCell.js +15 -15
  35. package/lib/components/MeasurementsTable/ColorCell.d.ts +29 -29
  36. package/lib/components/MeasurementsTable/ColorCell.d.ts.map +1 -1
  37. package/lib/components/MeasurementsTable/ColorCell.js +58 -57
  38. package/lib/components/MeasurementsTable/ColorCell.js.map +1 -1
  39. package/lib/components/MeasurementsTable/ColorPicker.d.ts +3 -3
  40. package/lib/components/MeasurementsTable/ColorPicker.js +10 -10
  41. package/lib/components/MeasurementsTable/ColumnResizer.d.ts +4 -4
  42. package/lib/components/MeasurementsTable/ColumnResizer.js +5 -5
  43. package/lib/components/MeasurementsTable/ColumnSorting.d.ts +13 -13
  44. package/lib/components/MeasurementsTable/ColumnSorting.js +9 -9
  45. package/lib/components/MeasurementsTable/MeasurementsTable.d.ts +55 -55
  46. package/lib/components/MeasurementsTable/MeasurementsTable.js +182 -182
  47. package/lib/components/MeasurementsTable/MeasurementsTable.js.map +1 -1
  48. package/lib/components/MeasurementsTable/SelectedContext.d.ts +9 -9
  49. package/lib/components/MeasurementsTable/SelectedContext.js +9 -9
  50. package/lib/components/MeasurementsTable/TextColumnFilter.d.ts +8 -8
  51. package/lib/components/MeasurementsTable/TextColumnFilter.js +15 -15
  52. package/lib/components/MeasurementsTable/filters.d.ts +2 -2
  53. package/lib/components/MeasurementsTable/filters.js +9 -9
  54. package/lib/components/MeasurementsTable/index.d.ts +1 -1
  55. package/lib/components/MeasurementsTable/index.js +1 -1
  56. package/lib/components/ModalMeasurementChooser.d.ts +19 -19
  57. package/lib/components/ModalMeasurementChooser.d.ts.map +1 -1
  58. package/lib/components/ModalMeasurementChooser.js +33 -29
  59. package/lib/components/ModalMeasurementChooser.js.map +1 -1
  60. package/lib/hooks/useMeasurement.d.ts +17 -17
  61. package/lib/hooks/useMeasurement.d.ts.map +1 -1
  62. package/lib/hooks/useMeasurement.js +41 -41
  63. package/lib/hooks/useMeasurements.d.ts +9 -9
  64. package/lib/hooks/useMeasurements.js +16 -16
  65. package/lib/hooks/useMeasurementsModule.d.ts +18 -18
  66. package/lib/hooks/useMeasurementsModule.js +12 -12
  67. package/lib/hooks/useOverlayMeasurementData.d.ts +2 -0
  68. package/lib/hooks/useOverlayMeasurementData.d.ts.map +1 -0
  69. package/lib/hooks/useOverlayMeasurementData.js +42 -0
  70. package/lib/hooks/useOverlayMeasurementData.js.map +1 -0
  71. package/lib/hooks/useTimedMeasurementData.d.ts +26 -26
  72. package/lib/hooks/useTimedMeasurementData.js +123 -123
  73. package/lib/hooks/useWindowedMeasurementData.d.ts +25 -25
  74. package/lib/hooks/useWindowedMeasurementData.js +119 -119
  75. package/lib/index.d.ts +13 -12
  76. package/lib/index.d.ts.map +1 -1
  77. package/lib/index.js +13 -12
  78. package/lib/index.js.map +1 -1
  79. package/lib/redux/measurements.slice.d.ts +107 -107
  80. package/lib/redux/measurements.slice.d.ts.map +1 -1
  81. package/lib/redux/measurements.slice.js +71 -71
  82. package/lib/redux/measurements.slice.js.map +1 -1
  83. package/lib/redux/reducer.d.ts +8 -8
  84. package/lib/redux/reducer.js +2 -2
  85. package/lib/types.d.ts +66 -65
  86. package/lib/types.d.ts.map +1 -1
  87. package/lib/types.js +51 -46
  88. package/lib/types.js.map +1 -1
  89. package/package.json +5 -5
  90. package/lib/hooks/useDataScaleValue.d.ts +0 -3
  91. package/lib/hooks/useDataScaleValue.d.ts.map +0 -1
  92. package/lib/hooks/useDataScaleValue.js +0 -9
  93. package/lib/hooks/useDataScaleValue.js.map +0 -1
@@ -1,124 +1,124 @@
1
- import { useEffect, useState, useMemo } from "react";
2
- import { filter, groupBy, map, scan, switchMap, toArray } from "rxjs/operators";
3
- import { useMeasurements } from "./useMeasurements";
4
- import { from } from "rxjs";
5
- import { useSelector } from "react-redux";
6
- import { useMeasurementsModule } from "./useMeasurementsModule";
7
- /**
8
- * Returns measurement data for a time. The current time is provided by options.timer which is
9
- * an instance of a Timer defined in @insync-stageplayer/time.
10
- * @param options
11
- * @returns
12
- */
13
- export const useTimedMeasurementData = (options) => {
14
- const { client, selector } = useMeasurementsModule();
15
- const { rows, measurements: measurementIds, limit, timer, unit } = options;
16
- /**
17
- * Create a map with files, we need these to get the start time of a file. So that we can create a timer with an offset.
18
- */
19
- const files = useSelector((s) => selector(s).files);
20
- const filesById = useMemo(() => {
21
- return files.reduce((acc, c) => (Object.assign(Object.assign({}, acc), { [c.path]: c })), {});
22
- }, [files]);
23
- /**
24
- * The scale of the model for which the measurement data was recorded.
25
- */
26
- const measurementScale = useSelector((s) => selector(s).measurementScale);
27
- const { measurements, loading, didInvalidate } = useMeasurements();
28
- const [state, setState] = useState({
29
- loading: false,
30
- });
31
- useEffect(() => {
32
- if (loading || didInvalidate)
33
- return;
34
- const observable$ = from(measurements).pipe(filter((m) => measurementIds.indexOf(m.id) !== -1),
35
- // Request are on a per file basis.
36
- groupBy((m) => m.file), switchMap((grouped) => grouped.pipe(toArray(), switchMap((measurements) => {
37
- //
38
- // The measurements in the app have an ID like (ROOT:/32322/WAVE) that
39
- // is incompatible with the IDs of the API (just WAVE). So we keep track of a map
40
- // that contains the mapping from the IDs used by the API to the ones used in the
41
- // app so we can map them back later.
42
- //
43
- const nameIdMap = measurements.reduce((acc, c) => {
44
- return Object.assign(Object.assign({}, acc), { [c.name]: c.id });
45
- }, {});
46
- // Retrieve the file in which theses measurements are stored.
47
- const fileObj = filesById[grouped.key];
48
- const start = fileObj.timing.start;
49
- // We'll map the timer to have an offset and for the time to be scaled using the measurement scale.
50
- const time$ = timer.state.pipe(map((timerState) => {
51
- const offset = timerState.time - start;
52
- const time = offset * Math.sqrt(measurementScale);
53
- return time;
54
- }));
55
- return client
56
- .createMeasurementDataObservable({
57
- rows,
58
- limit,
59
- measurements: measurements.map((m) => m.name),
60
- time$,
61
- unit,
62
- file: grouped.key,
63
- })
64
- .pipe(
65
- // This is where we map back the IDs
66
- map((v) => {
67
- var _a;
68
- return (Object.assign(Object.assign({}, v), {
69
- // We add a file property so we can retrieve for which file this loading is.
70
- file: grouped.key, data: Object.assign(Object.assign({}, v.data), { measurementData: ((_a = v.data) === null || _a === void 0 ? void 0 : _a.measurementData)
71
- ? Object.keys(v.data.measurementData).reduce((acc, c) => {
72
- var _a, _b;
73
- if ((_a = v.data) === null || _a === void 0 ? void 0 : _a.measurementData[c]) {
74
- return Object.assign(Object.assign({}, acc), { [nameIdMap[c]]: (_b = v.data) === null || _b === void 0 ? void 0 : _b.measurementData[c] });
75
- }
76
- return acc;
77
- }, {})
78
- : undefined }) }));
79
- }));
80
- }))),
81
- // We accumulate the data from all the files here.
82
- scan((acc, c) => {
83
- var _a, _b;
84
- const loadingFiles = c.loading
85
- ? [...acc.loadingFiles, c.file]
86
- : acc.loadingFiles.filter((f) => f !== c.file);
87
- return {
88
- loadingFiles,
89
- data: Object.assign(Object.assign(Object.assign({}, acc.data), c.data), {
90
- // We'll only return the new range if all files have finished loading.
91
- range: loadingFiles.length > 0 || !c.data.range
92
- ? acc.data.range
93
- : c.data.range, measurementData: Object.assign(Object.assign({}, (_a = acc.data) === null || _a === void 0 ? void 0 : _a.measurementData), (_b = c.data) === null || _b === void 0 ? void 0 : _b.measurementData) }),
94
- error: c.error,
95
- };
96
- }, {
97
- loadingFiles: [],
98
- data: {},
99
- }),
100
- // We should not retrieve measurement data if still loading. So we clear the data here if some file is still loading.
101
- map((state) => {
102
- const loading = state.loadingFiles.length > 0;
103
- return Object.assign(Object.assign({}, state), { loading, data: state.data });
104
- }));
105
- const subscription = observable$.subscribe(setState);
106
- return () => {
107
- subscription.unsubscribe();
108
- };
109
- }, [
110
- measurements,
111
- client,
112
- measurementIds,
113
- rows,
114
- limit,
115
- filesById,
116
- timer,
117
- measurementScale,
118
- unit,
119
- loading,
120
- didInvalidate,
121
- ]);
122
- return state;
123
- };
1
+ import { useEffect, useState, useMemo } from "react";
2
+ import { filter, groupBy, map, scan, switchMap, toArray } from "rxjs/operators";
3
+ import { useMeasurements } from "./useMeasurements";
4
+ import { from } from "rxjs";
5
+ import { useSelector } from "react-redux";
6
+ import { useMeasurementsModule } from "./useMeasurementsModule";
7
+ /**
8
+ * Returns measurement data for a time. The current time is provided by options.timer which is
9
+ * an instance of a Timer defined in @insync-stageplayer/time.
10
+ * @param options
11
+ * @returns
12
+ */
13
+ export const useTimedMeasurementData = (options) => {
14
+ const { client, selector } = useMeasurementsModule();
15
+ const { rows, measurements: measurementIds, limit, timer, unit } = options;
16
+ /**
17
+ * Create a map with files, we need these to get the start time of a file. So that we can create a timer with an offset.
18
+ */
19
+ const files = useSelector((s) => selector(s).files);
20
+ const filesById = useMemo(() => {
21
+ return files.reduce((acc, c) => (Object.assign(Object.assign({}, acc), { [c.path]: c })), {});
22
+ }, [files]);
23
+ /**
24
+ * The scale of the model for which the measurement data was recorded.
25
+ */
26
+ const measurementScale = useSelector((s) => selector(s).measurementScale);
27
+ const { measurements, loading, didInvalidate } = useMeasurements();
28
+ const [state, setState] = useState({
29
+ loading: false,
30
+ });
31
+ useEffect(() => {
32
+ if (loading || didInvalidate)
33
+ return;
34
+ const observable$ = from(measurements).pipe(filter((m) => measurementIds.indexOf(m.id) !== -1),
35
+ // Request are on a per file basis.
36
+ groupBy((m) => m.file), switchMap((grouped) => grouped.pipe(toArray(), switchMap((measurements) => {
37
+ //
38
+ // The measurements in the app have an ID like (ROOT:/32322/WAVE) that
39
+ // is incompatible with the IDs of the API (just WAVE). So we keep track of a map
40
+ // that contains the mapping from the IDs used by the API to the ones used in the
41
+ // app so we can map them back later.
42
+ //
43
+ const nameIdMap = measurements.reduce((acc, c) => {
44
+ return Object.assign(Object.assign({}, acc), { [c.name]: c.id });
45
+ }, {});
46
+ // Retrieve the file in which theses measurements are stored.
47
+ const fileObj = filesById[grouped.key];
48
+ const start = fileObj.timing.start;
49
+ // We'll map the timer to have an offset and for the time to be scaled using the measurement scale.
50
+ const time$ = timer.state.pipe(map((timerState) => {
51
+ const offset = timerState.time - start;
52
+ const time = offset * Math.sqrt(measurementScale);
53
+ return time;
54
+ }));
55
+ return client
56
+ .createMeasurementDataObservable({
57
+ rows,
58
+ limit,
59
+ measurements: measurements.map((m) => m.name),
60
+ time$,
61
+ unit,
62
+ file: grouped.key,
63
+ })
64
+ .pipe(
65
+ // This is where we map back the IDs
66
+ map((v) => {
67
+ var _a;
68
+ return (Object.assign(Object.assign({}, v), {
69
+ // We add a file property so we can retrieve for which file this loading is.
70
+ file: grouped.key, data: Object.assign(Object.assign({}, v.data), { measurementData: ((_a = v.data) === null || _a === void 0 ? void 0 : _a.measurementData)
71
+ ? Object.keys(v.data.measurementData).reduce((acc, c) => {
72
+ var _a, _b;
73
+ if ((_a = v.data) === null || _a === void 0 ? void 0 : _a.measurementData[c]) {
74
+ return Object.assign(Object.assign({}, acc), { [nameIdMap[c]]: (_b = v.data) === null || _b === void 0 ? void 0 : _b.measurementData[c] });
75
+ }
76
+ return acc;
77
+ }, {})
78
+ : undefined }) }));
79
+ }));
80
+ }))),
81
+ // We accumulate the data from all the files here.
82
+ scan((acc, c) => {
83
+ var _a, _b;
84
+ const loadingFiles = c.loading
85
+ ? [...acc.loadingFiles, c.file]
86
+ : acc.loadingFiles.filter((f) => f !== c.file);
87
+ return {
88
+ loadingFiles,
89
+ data: Object.assign(Object.assign(Object.assign({}, acc.data), c.data), {
90
+ // We'll only return the new range if all files have finished loading.
91
+ range: loadingFiles.length > 0 || !c.data.range
92
+ ? acc.data.range
93
+ : c.data.range, measurementData: Object.assign(Object.assign({}, (_a = acc.data) === null || _a === void 0 ? void 0 : _a.measurementData), (_b = c.data) === null || _b === void 0 ? void 0 : _b.measurementData) }),
94
+ error: c.error,
95
+ };
96
+ }, {
97
+ loadingFiles: [],
98
+ data: {},
99
+ }),
100
+ // We should not retrieve measurement data if still loading. So we clear the data here if some file is still loading.
101
+ map((state) => {
102
+ const loading = state.loadingFiles.length > 0;
103
+ return Object.assign(Object.assign({}, state), { loading, data: state.data });
104
+ }));
105
+ const subscription = observable$.subscribe(setState);
106
+ return () => {
107
+ subscription.unsubscribe();
108
+ };
109
+ }, [
110
+ measurements,
111
+ client,
112
+ measurementIds,
113
+ rows,
114
+ limit,
115
+ filesById,
116
+ timer,
117
+ measurementScale,
118
+ unit,
119
+ loading,
120
+ didInvalidate,
121
+ ]);
122
+ return state;
123
+ };
124
124
  //# sourceMappingURL=useTimedMeasurementData.js.map
@@ -1,26 +1,26 @@
1
- import { AsyncState } from "../AsyncSubject";
2
- import { CreateWindowedMeasurementDataObservableArgs } from "../client";
3
- import { MeasurementsTypes } from "../types";
4
- import { NumberRange } from "@insync-stageplayer/common";
5
- import { Timer } from "@insync-stageplayer/time";
6
- /**
7
- * The options for the useWindowedMeasurementData
8
- */
9
- export declare type UseWindowedMeasurementDataOptions = Omit<CreateWindowedMeasurementDataObservableArgs, "file" | "time$"> & {
10
- /**
11
- * Observable Timer (from @insync-stageplayer/time) that emits times.
12
- */
13
- timer: Timer;
14
- };
15
- declare type StateValue = {
16
- measurementData: MeasurementsTypes.DataMap;
17
- range: NumberRange;
18
- };
19
- /**
20
- * A hook that returns windowed data.
21
- * @param options
22
- * @returns
23
- */
24
- export declare const useWindowedMeasurementData: (options: UseWindowedMeasurementDataOptions) => AsyncState<StateValue>;
25
- export {};
1
+ import { AsyncState } from "../AsyncSubject";
2
+ import { CreateWindowedMeasurementDataObservableArgs } from "../client";
3
+ import { MeasurementsTypes } from "../types";
4
+ import { NumberRange } from "@insync-stageplayer/common";
5
+ import { Timer } from "@insync-stageplayer/time";
6
+ /**
7
+ * The options for the useWindowedMeasurementData
8
+ */
9
+ export declare type UseWindowedMeasurementDataOptions = Omit<CreateWindowedMeasurementDataObservableArgs, "file" | "time$"> & {
10
+ /**
11
+ * Observable Timer (from @insync-stageplayer/time) that emits times.
12
+ */
13
+ timer: Timer;
14
+ };
15
+ declare type StateValue = {
16
+ measurementData: MeasurementsTypes.DataMap;
17
+ range: NumberRange;
18
+ };
19
+ /**
20
+ * A hook that returns windowed data.
21
+ * @param options
22
+ * @returns
23
+ */
24
+ export declare const useWindowedMeasurementData: (options: UseWindowedMeasurementDataOptions) => AsyncState<StateValue>;
25
+ export {};
26
26
  //# sourceMappingURL=useWindowedMeasurementData.d.ts.map
@@ -1,120 +1,120 @@
1
- import { useEffect, useState, useMemo } from "react";
2
- import { useMeasurements } from "./useMeasurements";
3
- import { from } from "rxjs";
4
- import { map, filter, groupBy, switchMap, toArray, scan } from "rxjs/operators";
5
- import { useSelector } from "react-redux";
6
- import { useMeasurementsModule } from "./useMeasurementsModule";
7
- /**
8
- * A hook that returns windowed data.
9
- * @param options
10
- * @returns
11
- */
12
- export const useWindowedMeasurementData = (options) => {
13
- const { rows, measurements: measurementIds, visibleWindow, unit, timer, } = options;
14
- const { client, selector } = useMeasurementsModule();
15
- // The timer will give back timestamps in "realtime" in microseconds, so for example: 1500635719101123 (Fri Jul 21 2017 13:15:19 GMT+0200 (Central European Summer Time) {}).
16
- // We will need to use the measurement scale and the start of the measurementfiles to calculate the offset time for a given measurement.
17
- const measurementScale = useSelector((s) => selector(s).measurementScale);
18
- const { measurements } = useMeasurements();
19
- const [state, setState] = useState({
20
- loading: false,
21
- });
22
- /**
23
- * Create a map with files, we need these to get the start time of a file. So that we can create a timer with an offset.
24
- */
25
- const files = useSelector((s) => selector(s).files);
26
- const filesById = useMemo(() => {
27
- return files.reduce((acc, c) => (Object.assign(Object.assign({}, acc), { [c.path]: c })), {});
28
- }, [files]);
29
- useEffect(() => {
30
- const observable$ = from(measurements).pipe(filter((m) => measurementIds.indexOf(m.id) !== -1),
31
- // Request are on a per file basis.
32
- groupBy((m) => m.file), switchMap((grouped) => grouped.pipe(toArray(), switchMap((measurements) => {
33
- //
34
- // The measurements in the app have an ID like (ROOT:/32322/WAVE) that
35
- // is incompatible with the IDs of the API (just WAVE). So we keep track of a map
36
- // that contains the mapping from the IDs used by the API to the ones used in the
37
- // app so we can map them back later.
38
- //
39
- const nameIdMap = measurements.reduce((acc, c) => {
40
- return Object.assign(Object.assign({}, acc), { [c.name]: c.id });
41
- }, {});
42
- // Retrieve the file in which theses measurements are stored.
43
- const fileObj = filesById[grouped.key];
44
- const start = fileObj.timing.start;
45
- // We'll map the timer to have an offset and for the time to be scaled using the measurement scale.
46
- const time$ = timer.state.pipe(map((timerState) => {
47
- const offsetTime = timerState.time - start;
48
- const scaledOffsetTime = offsetTime * Math.sqrt(measurementScale);
49
- return scaledOffsetTime;
50
- }));
51
- return client
52
- .createWindowedMeasurementDataObservable({
53
- rows,
54
- visibleWindow,
55
- measurements: measurements.map((m) => m.name),
56
- // times are on a per-file basis, so this will use the offset of the file
57
- time$,
58
- file: grouped.key,
59
- unit,
60
- })
61
- .pipe(
62
- // This is where we map back the IDs
63
- map((v) => {
64
- var _a;
65
- return (Object.assign(Object.assign({}, v), {
66
- // We add a file property so we can retrieve for which file this loading is.
67
- file: grouped.key, data: Object.assign(Object.assign({}, v.data), { measurementData: ((_a = v.data) === null || _a === void 0 ? void 0 : _a.measurementData)
68
- ? Object.keys(v.data.measurementData).reduce((acc, c) => {
69
- var _a, _b;
70
- if ((_a = v.data) === null || _a === void 0 ? void 0 : _a.measurementData[c]) {
71
- return Object.assign(Object.assign({}, acc), { [nameIdMap[c]]: (_b = v.data) === null || _b === void 0 ? void 0 : _b.measurementData[c] });
72
- }
73
- return acc;
74
- }, {})
75
- : undefined }) }));
76
- }));
77
- }))),
78
- // We accumulate the data from all the files here.
79
- scan((acc, c) => {
80
- var _a, _b;
81
- const loadingFiles = c.loading
82
- ? [...acc.loadingFiles, c.file]
83
- : acc.loadingFiles.filter((f) => f !== c.file);
84
- return {
85
- loadingFiles,
86
- data: Object.assign(Object.assign(Object.assign({}, acc.data), c.data), {
87
- // We'll only return the new range if all files have finished loading.
88
- range: loadingFiles.length > 0 || !c.data.range
89
- ? acc.data.range
90
- : c.data.range, measurementData: Object.assign(Object.assign({}, (_a = acc.data) === null || _a === void 0 ? void 0 : _a.measurementData), (_b = c.data) === null || _b === void 0 ? void 0 : _b.measurementData) }),
91
- error: c.error,
92
- };
93
- }, {
94
- loadingFiles: [],
95
- data: {},
96
- }),
97
- // We should not retrieve measurement data if still loading. So we clear the data here if some file is still loading.
98
- map((state) => {
99
- const loading = state.loadingFiles.length > 0;
100
- return Object.assign(Object.assign({}, state), { loading, data: state.data });
101
- }));
102
- const subscription = observable$.subscribe(setState);
103
- return () => {
104
- subscription.unsubscribe();
105
- };
106
- }, [
107
- client,
108
- measurementIds,
109
- measurements,
110
- options,
111
- rows,
112
- visibleWindow,
113
- measurementScale,
114
- unit,
115
- timer.state,
116
- filesById,
117
- ]);
118
- return state;
119
- };
1
+ import { useEffect, useState, useMemo } from "react";
2
+ import { useMeasurements } from "./useMeasurements";
3
+ import { from } from "rxjs";
4
+ import { map, filter, groupBy, switchMap, toArray, scan } from "rxjs/operators";
5
+ import { useSelector } from "react-redux";
6
+ import { useMeasurementsModule } from "./useMeasurementsModule";
7
+ /**
8
+ * A hook that returns windowed data.
9
+ * @param options
10
+ * @returns
11
+ */
12
+ export const useWindowedMeasurementData = (options) => {
13
+ const { rows, measurements: measurementIds, visibleWindow, unit, timer, } = options;
14
+ const { client, selector } = useMeasurementsModule();
15
+ // The timer will give back timestamps in "realtime" in microseconds, so for example: 1500635719101123 (Fri Jul 21 2017 13:15:19 GMT+0200 (Central European Summer Time) {}).
16
+ // We will need to use the measurement scale and the start of the measurementfiles to calculate the offset time for a given measurement.
17
+ const measurementScale = useSelector((s) => selector(s).measurementScale);
18
+ const { measurements } = useMeasurements();
19
+ const [state, setState] = useState({
20
+ loading: false,
21
+ });
22
+ /**
23
+ * Create a map with files, we need these to get the start time of a file. So that we can create a timer with an offset.
24
+ */
25
+ const files = useSelector((s) => selector(s).files);
26
+ const filesById = useMemo(() => {
27
+ return files.reduce((acc, c) => (Object.assign(Object.assign({}, acc), { [c.path]: c })), {});
28
+ }, [files]);
29
+ useEffect(() => {
30
+ const observable$ = from(measurements).pipe(filter((m) => measurementIds.indexOf(m.id) !== -1),
31
+ // Request are on a per file basis.
32
+ groupBy((m) => m.file), switchMap((grouped) => grouped.pipe(toArray(), switchMap((measurements) => {
33
+ //
34
+ // The measurements in the app have an ID like (ROOT:/32322/WAVE) that
35
+ // is incompatible with the IDs of the API (just WAVE). So we keep track of a map
36
+ // that contains the mapping from the IDs used by the API to the ones used in the
37
+ // app so we can map them back later.
38
+ //
39
+ const nameIdMap = measurements.reduce((acc, c) => {
40
+ return Object.assign(Object.assign({}, acc), { [c.name]: c.id });
41
+ }, {});
42
+ // Retrieve the file in which theses measurements are stored.
43
+ const fileObj = filesById[grouped.key];
44
+ const start = fileObj.timing.start;
45
+ // We'll map the timer to have an offset and for the time to be scaled using the measurement scale.
46
+ const time$ = timer.state.pipe(map((timerState) => {
47
+ const offsetTime = timerState.time - start;
48
+ const scaledOffsetTime = offsetTime * Math.sqrt(measurementScale);
49
+ return scaledOffsetTime;
50
+ }));
51
+ return client
52
+ .createWindowedMeasurementDataObservable({
53
+ rows,
54
+ visibleWindow,
55
+ measurements: measurements.map((m) => m.name),
56
+ // times are on a per-file basis, so this will use the offset of the file
57
+ time$,
58
+ file: grouped.key,
59
+ unit,
60
+ })
61
+ .pipe(
62
+ // This is where we map back the IDs
63
+ map((v) => {
64
+ var _a;
65
+ return (Object.assign(Object.assign({}, v), {
66
+ // We add a file property so we can retrieve for which file this loading is.
67
+ file: grouped.key, data: Object.assign(Object.assign({}, v.data), { measurementData: ((_a = v.data) === null || _a === void 0 ? void 0 : _a.measurementData)
68
+ ? Object.keys(v.data.measurementData).reduce((acc, c) => {
69
+ var _a, _b;
70
+ if ((_a = v.data) === null || _a === void 0 ? void 0 : _a.measurementData[c]) {
71
+ return Object.assign(Object.assign({}, acc), { [nameIdMap[c]]: (_b = v.data) === null || _b === void 0 ? void 0 : _b.measurementData[c] });
72
+ }
73
+ return acc;
74
+ }, {})
75
+ : undefined }) }));
76
+ }));
77
+ }))),
78
+ // We accumulate the data from all the files here.
79
+ scan((acc, c) => {
80
+ var _a, _b;
81
+ const loadingFiles = c.loading
82
+ ? [...acc.loadingFiles, c.file]
83
+ : acc.loadingFiles.filter((f) => f !== c.file);
84
+ return {
85
+ loadingFiles,
86
+ data: Object.assign(Object.assign(Object.assign({}, acc.data), c.data), {
87
+ // We'll only return the new range if all files have finished loading.
88
+ range: loadingFiles.length > 0 || !c.data.range
89
+ ? acc.data.range
90
+ : c.data.range, measurementData: Object.assign(Object.assign({}, (_a = acc.data) === null || _a === void 0 ? void 0 : _a.measurementData), (_b = c.data) === null || _b === void 0 ? void 0 : _b.measurementData) }),
91
+ error: c.error,
92
+ };
93
+ }, {
94
+ loadingFiles: [],
95
+ data: {},
96
+ }),
97
+ // We should not retrieve measurement data if still loading. So we clear the data here if some file is still loading.
98
+ map((state) => {
99
+ const loading = state.loadingFiles.length > 0;
100
+ return Object.assign(Object.assign({}, state), { loading, data: state.data });
101
+ }));
102
+ const subscription = observable$.subscribe(setState);
103
+ return () => {
104
+ subscription.unsubscribe();
105
+ };
106
+ }, [
107
+ client,
108
+ measurementIds,
109
+ measurements,
110
+ options,
111
+ rows,
112
+ visibleWindow,
113
+ measurementScale,
114
+ unit,
115
+ timer.state,
116
+ filesById,
117
+ ]);
118
+ return state;
119
+ };
120
120
  //# sourceMappingURL=useWindowedMeasurementData.js.map
package/lib/index.d.ts CHANGED
@@ -1,13 +1,14 @@
1
- export * from "./types";
2
- export * from "./client";
3
- export * from "./hooks/useTimedMeasurementData";
4
- export * from "./hooks/useWindowedMeasurementData";
5
- export * from "./components/MeasurementsModuleProvider";
6
- export * from "./components/MeasurementsTable";
7
- export * from "./components/MeasurementsChooser";
8
- export * from "./components/ModalMeasurementChooser";
9
- export * from "./redux/reducer";
10
- export * from "./hooks/useMeasurements";
11
- export * from "./hooks/useMeasurement";
12
- export * from "./hooks/useMeasurementsModule";
1
+ export * from "./types";
2
+ export * from "./client";
3
+ export * from "./hooks/useTimedMeasurementData";
4
+ export * from "./hooks/useWindowedMeasurementData";
5
+ export * from "./components/MeasurementsModuleProvider";
6
+ export * from "./components/MeasurementsTable";
7
+ export * from "./components/MeasurementsChooser";
8
+ export * from "./components/ModalMeasurementChooser";
9
+ export * from "./redux/reducer";
10
+ export * from "./hooks/useMeasurements";
11
+ export * from "./hooks/useMeasurement";
12
+ export * from "./hooks/useMeasurementsModule";
13
+ export * from "./hooks/useOverlayMeasurementData";
13
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,iCAAiC,CAAC;AAChD,cAAc,oCAAoC,CAAC;AACnD,cAAc,yCAAyC,CAAC;AACxD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,kCAAkC,CAAC;AACjD,cAAc,sCAAsC,CAAC;AACrD,cAAc,iBAAiB,CAAC;AAChC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,+BAA+B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,iCAAiC,CAAC;AAChD,cAAc,oCAAoC,CAAC;AACnD,cAAc,yCAAyC,CAAC;AACxD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,kCAAkC,CAAC;AACjD,cAAc,sCAAsC,CAAC;AACrD,cAAc,iBAAiB,CAAC;AAChC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,mCAAmC,CAAC"}
package/lib/index.js CHANGED
@@ -1,13 +1,14 @@
1
- export * from "./types";
2
- export * from "./client";
3
- export * from "./hooks/useTimedMeasurementData";
4
- export * from "./hooks/useWindowedMeasurementData";
5
- export * from "./components/MeasurementsModuleProvider";
6
- export * from "./components/MeasurementsTable";
7
- export * from "./components/MeasurementsChooser";
8
- export * from "./components/ModalMeasurementChooser";
9
- export * from "./redux/reducer";
10
- export * from "./hooks/useMeasurements";
11
- export * from "./hooks/useMeasurement";
12
- export * from "./hooks/useMeasurementsModule";
1
+ export * from "./types";
2
+ export * from "./client";
3
+ export * from "./hooks/useTimedMeasurementData";
4
+ export * from "./hooks/useWindowedMeasurementData";
5
+ export * from "./components/MeasurementsModuleProvider";
6
+ export * from "./components/MeasurementsTable";
7
+ export * from "./components/MeasurementsChooser";
8
+ export * from "./components/ModalMeasurementChooser";
9
+ export * from "./redux/reducer";
10
+ export * from "./hooks/useMeasurements";
11
+ export * from "./hooks/useMeasurement";
12
+ export * from "./hooks/useMeasurementsModule";
13
+ export * from "./hooks/useOverlayMeasurementData";
13
14
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,iCAAiC,CAAC;AAChD,cAAc,oCAAoC,CAAC;AACnD,cAAc,yCAAyC,CAAC;AACxD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,kCAAkC,CAAC;AACjD,cAAc,sCAAsC,CAAC;AACrD,cAAc,iBAAiB,CAAC;AAChC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,+BAA+B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,iCAAiC,CAAC;AAChD,cAAc,oCAAoC,CAAC;AACnD,cAAc,yCAAyC,CAAC;AACxD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,kCAAkC,CAAC;AACjD,cAAc,sCAAsC,CAAC;AACrD,cAAc,iBAAiB,CAAC;AAChC,cAAc,yBAAyB,CAAC;AACxC,cAAc,wBAAwB,CAAC;AACvC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,mCAAmC,CAAC"}