@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.
- package/lib/AsyncSubject.d.ts +23 -23
- package/lib/AsyncSubject.js +64 -64
- package/lib/client/MeasurementDataClient.d.ts +126 -124
- package/lib/client/MeasurementDataClient.d.ts.map +1 -1
- package/lib/client/MeasurementDataClient.js +99 -99
- package/lib/client/MeasurementDataClient.js.map +1 -1
- package/lib/client/OnlineMeasurementDataClient.d.ts +43 -42
- package/lib/client/OnlineMeasurementDataClient.d.ts.map +1 -1
- package/lib/client/OnlineMeasurementDataClient.js +181 -166
- package/lib/client/OnlineMeasurementDataClient.js.map +1 -1
- package/lib/client/debug.d.ts +1 -1
- package/lib/client/debug.js +4 -4
- package/lib/client/index.d.ts +2 -2
- package/lib/client/index.js +2 -2
- package/lib/client/offline/OfflineMeasurementDataClient.d.ts +15 -14
- package/lib/client/offline/OfflineMeasurementDataClient.d.ts.map +1 -1
- package/lib/client/offline/OfflineMeasurementDataClient.js +44 -41
- package/lib/client/offline/OfflineMeasurementDataClient.js.map +1 -1
- package/lib/client/offline/offline.d.ts +16 -16
- package/lib/client/offline/offline.js +79 -79
- package/lib/client/sbf.d.ts +34 -34
- package/lib/client/sbf.js +88 -88
- package/lib/components/Icon/CloseIcon.d.ts +7 -0
- package/lib/components/Icon/CloseIcon.d.ts.map +1 -0
- package/lib/components/Icon/CloseIcon.js +32 -0
- package/lib/components/Icon/CloseIcon.js.map +1 -0
- package/lib/components/MeasurementsChooser.d.ts +34 -34
- package/lib/components/MeasurementsChooser.js +95 -95
- package/lib/components/MeasurementsModuleProvider.d.ts +34 -34
- package/lib/components/MeasurementsModuleProvider.d.ts.map +1 -1
- package/lib/components/MeasurementsModuleProvider.js +73 -73
- package/lib/components/MeasurementsModuleProvider.js.map +1 -1
- package/lib/components/MeasurementsTable/CheckboxCell.d.ts +18 -18
- package/lib/components/MeasurementsTable/CheckboxCell.js +15 -15
- package/lib/components/MeasurementsTable/ColorCell.d.ts +29 -29
- package/lib/components/MeasurementsTable/ColorCell.d.ts.map +1 -1
- package/lib/components/MeasurementsTable/ColorCell.js +58 -57
- package/lib/components/MeasurementsTable/ColorCell.js.map +1 -1
- package/lib/components/MeasurementsTable/ColorPicker.d.ts +3 -3
- package/lib/components/MeasurementsTable/ColorPicker.js +10 -10
- package/lib/components/MeasurementsTable/ColumnResizer.d.ts +4 -4
- package/lib/components/MeasurementsTable/ColumnResizer.js +5 -5
- package/lib/components/MeasurementsTable/ColumnSorting.d.ts +13 -13
- package/lib/components/MeasurementsTable/ColumnSorting.js +9 -9
- package/lib/components/MeasurementsTable/MeasurementsTable.d.ts +55 -55
- package/lib/components/MeasurementsTable/MeasurementsTable.js +182 -182
- package/lib/components/MeasurementsTable/MeasurementsTable.js.map +1 -1
- package/lib/components/MeasurementsTable/SelectedContext.d.ts +9 -9
- package/lib/components/MeasurementsTable/SelectedContext.js +9 -9
- package/lib/components/MeasurementsTable/TextColumnFilter.d.ts +8 -8
- package/lib/components/MeasurementsTable/TextColumnFilter.js +15 -15
- package/lib/components/MeasurementsTable/filters.d.ts +2 -2
- package/lib/components/MeasurementsTable/filters.js +9 -9
- package/lib/components/MeasurementsTable/index.d.ts +1 -1
- package/lib/components/MeasurementsTable/index.js +1 -1
- package/lib/components/ModalMeasurementChooser.d.ts +19 -19
- package/lib/components/ModalMeasurementChooser.d.ts.map +1 -1
- package/lib/components/ModalMeasurementChooser.js +33 -29
- package/lib/components/ModalMeasurementChooser.js.map +1 -1
- package/lib/hooks/useMeasurement.d.ts +17 -17
- package/lib/hooks/useMeasurement.d.ts.map +1 -1
- package/lib/hooks/useMeasurement.js +41 -41
- package/lib/hooks/useMeasurements.d.ts +9 -9
- package/lib/hooks/useMeasurements.js +16 -16
- package/lib/hooks/useMeasurementsModule.d.ts +18 -18
- package/lib/hooks/useMeasurementsModule.js +12 -12
- package/lib/hooks/useOverlayMeasurementData.d.ts +2 -0
- package/lib/hooks/useOverlayMeasurementData.d.ts.map +1 -0
- package/lib/hooks/useOverlayMeasurementData.js +42 -0
- package/lib/hooks/useOverlayMeasurementData.js.map +1 -0
- package/lib/hooks/useTimedMeasurementData.d.ts +26 -26
- package/lib/hooks/useTimedMeasurementData.js +123 -123
- package/lib/hooks/useWindowedMeasurementData.d.ts +25 -25
- package/lib/hooks/useWindowedMeasurementData.js +119 -119
- package/lib/index.d.ts +13 -12
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +13 -12
- package/lib/index.js.map +1 -1
- package/lib/redux/measurements.slice.d.ts +107 -107
- package/lib/redux/measurements.slice.d.ts.map +1 -1
- package/lib/redux/measurements.slice.js +71 -71
- package/lib/redux/measurements.slice.js.map +1 -1
- package/lib/redux/reducer.d.ts +8 -8
- package/lib/redux/reducer.js +2 -2
- package/lib/types.d.ts +66 -65
- package/lib/types.d.ts.map +1 -1
- package/lib/types.js +51 -46
- package/lib/types.js.map +1 -1
- package/package.json +5 -5
- package/lib/hooks/useDataScaleValue.d.ts +0 -3
- package/lib/hooks/useDataScaleValue.d.ts.map +0 -1
- package/lib/hooks/useDataScaleValue.js +0 -9
- 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
|
package/lib/index.d.ts.map
CHANGED
|
@@ -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"}
|