react-science 0.25.0 → 0.26.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 (161) hide show
  1. package/lib/app/explorer/MeasurementExplorer.js +29 -7
  2. package/lib/app/explorer/MeasurementExplorerWithState.js +2 -2
  3. package/lib/app/helpers/MeasurementPlot.js +28 -19
  4. package/lib/app/helpers/react-plot.js +1 -1
  5. package/lib/app/kinds/mass/MassPlotView.js +2 -2
  6. package/lib/app/kinds/mass/MeasurementMassPlot.js +49 -33
  7. package/lib/app/panels/measurement-info/MeasurementInfoPanel.js +13 -58
  8. package/lib/app-data/state/data/data.helpers.js +32 -8
  9. package/lib/components/forms/Checkbox.js +4 -5
  10. package/lib/components/forms/Input.js +3 -87
  11. package/lib/components/forms/TextArea.js +25 -0
  12. package/lib/components/forms/index.js +2 -0
  13. package/lib/components/forms/radio-group/ButtonRadioItem.js +76 -0
  14. package/lib/components/forms/radio-group/ClassicRadioItem.js +92 -0
  15. package/lib/components/forms/radio-group/RadioGroup.js +69 -0
  16. package/lib/components/forms/radio-group/index.js +17 -0
  17. package/lib/components/forms/styles.js +80 -0
  18. package/lib/components/forms/utils/SubText.js +20 -0
  19. package/lib/components/forms/utils/index.js +17 -0
  20. package/lib/components/header/PanelHeader.js +51 -0
  21. package/lib/components/header/index.js +1 -0
  22. package/lib/components/index.js +1 -0
  23. package/lib/components/info-panel/InfoPanel.js +94 -0
  24. package/lib/components/info-panel/index.js +17 -0
  25. package/lib/components/modal/ConfirmModal.js +3 -2
  26. package/lib/components/table/Table.js +2 -2
  27. package/lib/components/toolbar/PanelPreferencesToolbar.js +26 -0
  28. package/lib/components/toolbar/index.js +1 -0
  29. package/lib-esm/app/explorer/MeasurementExplorer.d.ts.map +1 -1
  30. package/lib-esm/app/explorer/MeasurementExplorer.js +30 -8
  31. package/lib-esm/app/explorer/MeasurementExplorer.js.map +1 -1
  32. package/lib-esm/app/explorer/MeasurementExplorerWithState.d.ts.map +1 -1
  33. package/lib-esm/app/explorer/MeasurementExplorerWithState.js +2 -2
  34. package/lib-esm/app/explorer/MeasurementExplorerWithState.js.map +1 -1
  35. package/lib-esm/app/helpers/MeasurementPlot.d.ts +3 -3
  36. package/lib-esm/app/helpers/MeasurementPlot.d.ts.map +1 -1
  37. package/lib-esm/app/helpers/MeasurementPlot.js +28 -19
  38. package/lib-esm/app/helpers/MeasurementPlot.js.map +1 -1
  39. package/lib-esm/app/helpers/react-plot.d.ts.map +1 -1
  40. package/lib-esm/app/helpers/react-plot.js +1 -1
  41. package/lib-esm/app/helpers/react-plot.js.map +1 -1
  42. package/lib-esm/app/kinds/mass/MassPlotView.d.ts.map +1 -1
  43. package/lib-esm/app/kinds/mass/MassPlotView.js +2 -2
  44. package/lib-esm/app/kinds/mass/MassPlotView.js.map +1 -1
  45. package/lib-esm/app/kinds/mass/MeasurementMassPlot.d.ts.map +1 -1
  46. package/lib-esm/app/kinds/mass/MeasurementMassPlot.js +49 -33
  47. package/lib-esm/app/kinds/mass/MeasurementMassPlot.js.map +1 -1
  48. package/lib-esm/app/panels/measurement-info/MeasurementInfoPanel.d.ts.map +1 -1
  49. package/lib-esm/app/panels/measurement-info/MeasurementInfoPanel.js +15 -60
  50. package/lib-esm/app/panels/measurement-info/MeasurementInfoPanel.js.map +1 -1
  51. package/lib-esm/app-data/state/data/data.helpers.d.ts +20 -12
  52. package/lib-esm/app-data/state/data/data.helpers.d.ts.map +1 -1
  53. package/lib-esm/app-data/state/data/data.helpers.js +30 -7
  54. package/lib-esm/app-data/state/data/data.helpers.js.map +1 -1
  55. package/lib-esm/components/forms/Checkbox.d.ts.map +1 -1
  56. package/lib-esm/components/forms/Checkbox.js +1 -2
  57. package/lib-esm/components/forms/Checkbox.js.map +1 -1
  58. package/lib-esm/components/forms/Input.d.ts +4 -2
  59. package/lib-esm/components/forms/Input.d.ts.map +1 -1
  60. package/lib-esm/components/forms/Input.js +3 -87
  61. package/lib-esm/components/forms/Input.js.map +1 -1
  62. package/lib-esm/components/forms/TextArea.d.ts +8 -0
  63. package/lib-esm/components/forms/TextArea.d.ts.map +1 -0
  64. package/lib-esm/components/forms/TextArea.js +19 -0
  65. package/lib-esm/components/forms/TextArea.js.map +1 -0
  66. package/lib-esm/components/forms/index.d.ts +2 -0
  67. package/lib-esm/components/forms/index.d.ts.map +1 -1
  68. package/lib-esm/components/forms/index.js +2 -0
  69. package/lib-esm/components/forms/index.js.map +1 -1
  70. package/lib-esm/components/forms/radio-group/ButtonRadioItem.d.ts +3 -0
  71. package/lib-esm/components/forms/radio-group/ButtonRadioItem.d.ts.map +1 -0
  72. package/lib-esm/components/forms/radio-group/ButtonRadioItem.js +50 -0
  73. package/lib-esm/components/forms/radio-group/ButtonRadioItem.js.map +1 -0
  74. package/lib-esm/components/forms/radio-group/ClassicRadioItem.d.ts +3 -0
  75. package/lib-esm/components/forms/radio-group/ClassicRadioItem.d.ts.map +1 -0
  76. package/lib-esm/components/forms/radio-group/ClassicRadioItem.js +66 -0
  77. package/lib-esm/components/forms/radio-group/ClassicRadioItem.js.map +1 -0
  78. package/lib-esm/components/forms/radio-group/RadioGroup.d.ts +18 -0
  79. package/lib-esm/components/forms/radio-group/RadioGroup.d.ts.map +1 -0
  80. package/lib-esm/components/forms/radio-group/RadioGroup.js +43 -0
  81. package/lib-esm/components/forms/radio-group/RadioGroup.js.map +1 -0
  82. package/lib-esm/components/forms/radio-group/index.d.ts +2 -0
  83. package/lib-esm/components/forms/radio-group/index.d.ts.map +1 -0
  84. package/lib-esm/components/forms/radio-group/index.js +2 -0
  85. package/lib-esm/components/forms/radio-group/index.js.map +1 -0
  86. package/lib-esm/components/forms/styles.d.ts +26 -0
  87. package/lib-esm/components/forms/styles.d.ts.map +1 -0
  88. package/lib-esm/components/forms/styles.js +75 -0
  89. package/lib-esm/components/forms/styles.js.map +1 -0
  90. package/lib-esm/components/forms/utils/SubText.d.ts +7 -0
  91. package/lib-esm/components/forms/utils/SubText.d.ts.map +1 -0
  92. package/lib-esm/components/forms/utils/SubText.js +17 -0
  93. package/lib-esm/components/forms/utils/SubText.js.map +1 -0
  94. package/lib-esm/components/forms/utils/index.d.ts +2 -0
  95. package/lib-esm/components/forms/utils/index.d.ts.map +1 -0
  96. package/lib-esm/components/forms/utils/index.js +2 -0
  97. package/lib-esm/components/forms/utils/index.js.map +1 -0
  98. package/lib-esm/components/header/PanelHeader.d.ts +10 -0
  99. package/lib-esm/components/header/PanelHeader.d.ts.map +1 -0
  100. package/lib-esm/components/header/PanelHeader.js +48 -0
  101. package/lib-esm/components/header/PanelHeader.js.map +1 -0
  102. package/lib-esm/components/header/index.d.ts +1 -0
  103. package/lib-esm/components/header/index.d.ts.map +1 -1
  104. package/lib-esm/components/header/index.js +1 -0
  105. package/lib-esm/components/header/index.js.map +1 -1
  106. package/lib-esm/components/index.d.ts +1 -0
  107. package/lib-esm/components/index.d.ts.map +1 -1
  108. package/lib-esm/components/index.js +1 -0
  109. package/lib-esm/components/index.js.map +1 -1
  110. package/lib-esm/components/info-panel/InfoPanel.d.ts +15 -0
  111. package/lib-esm/components/info-panel/InfoPanel.d.ts.map +1 -0
  112. package/lib-esm/components/info-panel/InfoPanel.js +91 -0
  113. package/lib-esm/components/info-panel/InfoPanel.js.map +1 -0
  114. package/lib-esm/components/info-panel/index.d.ts +2 -0
  115. package/lib-esm/components/info-panel/index.d.ts.map +1 -0
  116. package/lib-esm/components/info-panel/index.js +2 -0
  117. package/lib-esm/components/info-panel/index.js.map +1 -0
  118. package/lib-esm/components/modal/ConfirmModal.d.ts.map +1 -1
  119. package/lib-esm/components/modal/ConfirmModal.js +3 -2
  120. package/lib-esm/components/modal/ConfirmModal.js.map +1 -1
  121. package/lib-esm/components/table/Table.d.ts +2 -3
  122. package/lib-esm/components/table/Table.d.ts.map +1 -1
  123. package/lib-esm/components/table/Table.js +2 -2
  124. package/lib-esm/components/table/Table.js.map +1 -1
  125. package/lib-esm/components/toolbar/PanelPreferencesToolbar.d.ts +7 -0
  126. package/lib-esm/components/toolbar/PanelPreferencesToolbar.d.ts.map +1 -0
  127. package/lib-esm/components/toolbar/PanelPreferencesToolbar.js +23 -0
  128. package/lib-esm/components/toolbar/PanelPreferencesToolbar.js.map +1 -0
  129. package/lib-esm/components/toolbar/index.d.ts +1 -0
  130. package/lib-esm/components/toolbar/index.d.ts.map +1 -1
  131. package/lib-esm/components/toolbar/index.js +1 -0
  132. package/lib-esm/components/toolbar/index.js.map +1 -1
  133. package/package.json +16 -14
  134. package/src/app/explorer/MeasurementExplorer.tsx +34 -12
  135. package/src/app/explorer/MeasurementExplorerWithState.tsx +2 -2
  136. package/src/app/helpers/MeasurementPlot.tsx +44 -33
  137. package/src/app/helpers/react-plot.tsx +6 -4
  138. package/src/app/kinds/mass/MassPlotView.tsx +2 -2
  139. package/src/app/kinds/mass/MeasurementMassPlot.tsx +57 -37
  140. package/src/app/panels/measurement-info/MeasurementInfoPanel.tsx +14 -84
  141. package/src/app-data/state/data/data.helpers.ts +49 -16
  142. package/src/components/forms/Checkbox.tsx +2 -3
  143. package/src/components/forms/Input.tsx +14 -125
  144. package/src/components/forms/TextArea.tsx +45 -0
  145. package/src/components/forms/index.ts +2 -0
  146. package/src/components/forms/radio-group/ButtonRadioItem.tsx +77 -0
  147. package/src/components/forms/radio-group/ClassicRadioItem.tsx +95 -0
  148. package/src/components/forms/radio-group/RadioGroup.tsx +83 -0
  149. package/src/components/forms/radio-group/index.ts +1 -0
  150. package/src/components/forms/styles.ts +96 -0
  151. package/src/components/forms/utils/SubText.tsx +31 -0
  152. package/src/components/forms/utils/index.ts +1 -0
  153. package/src/components/header/PanelHeader.tsx +75 -0
  154. package/src/components/header/index.ts +1 -0
  155. package/src/components/index.ts +1 -0
  156. package/src/components/info-panel/InfoPanel.tsx +150 -0
  157. package/src/components/info-panel/index.ts +1 -0
  158. package/src/components/modal/ConfirmModal.tsx +3 -2
  159. package/src/components/table/Table.tsx +3 -5
  160. package/src/components/toolbar/PanelPreferencesToolbar.tsx +46 -0
  161. package/src/components/toolbar/index.ts +1 -0
@@ -29,13 +29,35 @@ const MeasurementExplorerAction = styled_1.default.div `
29
29
  display: flex;
30
30
  `;
31
31
  function MeasurementExplorer(props) {
32
- const { measurement: { data }, width = '100%', height = '100%', } = props;
32
+ const { measurement, width = '100%', height = '100%' } = props;
33
+ const measurementsArray = (0, react_1.useMemo)(() => (Array.isArray(measurement) ? measurement : [measurement]), [measurement]);
34
+ const varNames = (0, react_1.useMemo)(() => {
35
+ const varNames = [];
36
+ for (const [i, { data }] of measurementsArray.entries()) {
37
+ for (const { variables } of data) {
38
+ const names = [];
39
+ for (const varName in variables) {
40
+ if (i === 0) {
41
+ names.push(varName);
42
+ }
43
+ else if (!varNames.flat().includes(varName)) {
44
+ throw new Error(`Measurements selected does not have the same variables `);
45
+ }
46
+ }
47
+ varNames.push(names);
48
+ }
49
+ }
50
+ return varNames;
51
+ }, [measurementsArray]);
33
52
  function defaultInfo(dataIndex) {
34
- const varNames = Object.keys(data[dataIndex].variables);
35
53
  return {
36
54
  dataIndex,
37
- xVariableName: varNames.includes('x') ? 'x' : varNames[0],
38
- yVariableName: varNames.includes('y') ? 'y' : varNames[1],
55
+ xVariableName: varNames[dataIndex].includes('x')
56
+ ? 'x'
57
+ : varNames[dataIndex][0],
58
+ yVariableName: varNames[dataIndex].includes('y')
59
+ ? 'y'
60
+ : varNames[dataIndex][1],
39
61
  };
40
62
  }
41
63
  const [info, setInfo] = (0, react_1.useState)({
@@ -52,9 +74,9 @@ function MeasurementExplorer(props) {
52
74
  const formatVarKey = `${varKey} - `;
53
75
  return formatVarKey + label + formatUnit;
54
76
  }
55
- const { variables } = data[info.dataIndex];
77
+ const { variables } = measurementsArray[0].data[info.dataIndex];
56
78
  const oppositeAxis = axis === 'x' ? 'yVariableName' : 'xVariableName';
57
- return Object.keys(variables).map((d) => {
79
+ return varNames[info.dataIndex].map((d) => {
58
80
  if (d !== info[oppositeAxis]) {
59
81
  return ((0, jsx_runtime_1.jsx)("option", { value: d, children: formatVar(d) }, d));
60
82
  }
@@ -69,7 +91,7 @@ function MeasurementExplorer(props) {
69
91
  ...defaultInfo(value),
70
92
  }));
71
93
  }
72
- }, children: data.map((d, i) => (
94
+ }, children: measurementsArray[0].data.map((d, i) => (
73
95
  // eslint-disable-next-line react/no-array-index-key
74
96
  (0, jsx_runtime_1.jsx)("option", { value: i, children: i }, i))) })] }), (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("label", { children: "xVariable: " }), (0, jsx_runtime_1.jsx)(MeasurementExplorerSelect, { onChange: ({ target }) => {
75
97
  const value = target.value;
@@ -2,12 +2,12 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const jsx_runtime_1 = require("react/jsx-runtime");
4
4
  const index_1 = require("../../app-data/index");
5
- const index_2 = require("../../components/index");
6
5
  const MeasurementExplorer_1 = require("./MeasurementExplorer");
7
6
  function MeasurementExplorerWithState() {
8
7
  const appState = (0, index_1.useAppState)();
9
8
  const data = (0, index_1.getCurrentMeasurementData)(appState);
10
- (0, index_2.assertNotNull)(data);
9
+ if (!data)
10
+ return (0, jsx_runtime_1.jsx)("div", { children: "No selected measurement" });
11
11
  return ((0, jsx_runtime_1.jsx)(MeasurementExplorer_1.MeasurementExplorer, { measurement: data.data, measurementDisplay: data.display }));
12
12
  }
13
13
  exports.default = MeasurementExplorerWithState;
@@ -11,23 +11,32 @@ function MeasurementPlot(props) {
11
11
  }
12
12
  exports.MeasurementPlot = MeasurementPlot;
13
13
  function MeasurementComponent(props) {
14
- const { measurementDisplay, measurement: { data }, dataIndex = 0, xVariableName = 'x', yVariableName = 'y', } = props;
15
- const { x, y } = (0, react_1.useMemo)(() => {
16
- const { variables } = data[dataIndex];
17
- const { [xVariableName]: x, [yVariableName]: y } = variables;
18
- if (x === undefined || y === undefined) {
19
- throw new Error(`Variable "${x === undefined ? xVariableName : yVariableName}" is not available in data. Only ${Object.keys(data[dataIndex].variables).join(', ')} are available`);
20
- }
21
- return { x, y };
22
- }, [data, dataIndex, xVariableName, yVariableName]);
23
- const { color } = measurementDisplay;
24
- if (color.kind !== 'fixed') {
25
- throw new Error(`unimplemented stroke for kind ${color.kind}`);
26
- }
27
- return ((0, jsx_runtime_1.jsx)(index_1.BasicComponent, { ...props, children: (0, jsx_runtime_1.jsx)(react_plot_1.LineSeries, { lineStyle: {
28
- stroke: color.color,
29
- }, data: (0, ml_spectra_processing_1.xyToXYObject)({
30
- x: x.data,
31
- y: y.data,
32
- }) }) }));
14
+ const { measurementDisplay, measurement, dataIndex = 0, xVariableName = 'x', yVariableName = 'y', } = props;
15
+ const dataXY = (0, react_1.useMemo)(() => {
16
+ const measurementsArray = Array.isArray(measurement)
17
+ ? measurement
18
+ : [measurement];
19
+ return measurementsArray.map(({ data, id }) => {
20
+ const { variables } = data[dataIndex];
21
+ const { [xVariableName]: x, [yVariableName]: y } = variables;
22
+ if (x === undefined || y === undefined) {
23
+ throw new Error(`Variable "${x === undefined ? xVariableName : yVariableName}" is not available in data. Only ${Object.keys(data[dataIndex].variables).join(', ')} are available`);
24
+ }
25
+ return { x, y, id };
26
+ });
27
+ }, [dataIndex, measurement, xVariableName, yVariableName]);
28
+ return ((0, jsx_runtime_1.jsx)(index_1.BasicComponent, { ...props, children: dataXY.map(({ x, y, id }, i) => {
29
+ const { color } = Array.isArray(measurementDisplay)
30
+ ? measurementDisplay[i]
31
+ : measurementDisplay;
32
+ if (color.kind !== 'fixed') {
33
+ throw new Error(`unimplemented stroke for kind ${color.kind}`);
34
+ }
35
+ return ((0, jsx_runtime_1.jsx)(react_plot_1.LineSeries, { lineStyle: {
36
+ stroke: color.color,
37
+ }, data: (0, ml_spectra_processing_1.xyToXYObject)({
38
+ x: x.data,
39
+ y: y.data,
40
+ }) }, id));
41
+ }) }));
33
42
  }
@@ -19,7 +19,7 @@ const BasicComponentRoot = styled_1.default.div `
19
19
  `;
20
20
  function BasicComponent(props) {
21
21
  const { children, measurement, dataIndex = 0, xVariableName = 'x', yVariableName = 'y', width = '100%', height = '100%', zoom = 'horizontal', wheelZoom = 'vertical', crossHair = true, showHorizontalAxis = true, showVerticalAxis = true, showHorizontalGrid = true, showVerticalGrid = true, flipHorizontalAxis = false, } = props;
22
- const { info: { title }, data, } = measurement;
22
+ const [{ info: { title }, data, },] = Array.isArray(measurement) ? measurement : [measurement];
23
23
  const { x, y } = (0, react_1.useMemo)(() => {
24
24
  const { variables } = data[dataIndex];
25
25
  const { [xVariableName]: x, [yVariableName]: y } = variables;
@@ -3,12 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.MassPlotView = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const index_1 = require("../../../app-data/index");
6
- const index_2 = require("../../../components/index");
7
6
  const MeasurementMassPlot_1 = require("./MeasurementMassPlot");
8
7
  function MassPlotView() {
9
8
  const appState = (0, index_1.useAppState)();
10
9
  const data = (0, index_1.getCurrentMeasurementData)(appState);
11
- (0, index_2.assertNotNull)(data);
10
+ if (!data)
11
+ return (0, jsx_runtime_1.jsx)("div", { children: "No selected measurement" });
12
12
  return ((0, jsx_runtime_1.jsx)(MeasurementMassPlot_1.MeasurementMassPlot, { measurement: data.data, measurementDisplay: data.display }));
13
13
  }
14
14
  exports.MassPlotView = MassPlotView;
@@ -9,49 +9,65 @@ const react_1 = require("react");
9
9
  const react_plot_1 = require("react-plot");
10
10
  const index_1 = require("../../helpers/index");
11
11
  function MeasurementMassPlot(props) {
12
- const { measurement } = props;
13
- if (!measurement.data) {
14
- throw new Error('This is weird, the data property is not available on measurement');
15
- }
16
- if (measurement.data.length === 0) {
17
- throw new Error('Data property is empty');
18
- }
19
- if (measurement.data.length > 1) {
20
- throw new Error('Length of data property is larger than 1');
21
- }
22
- if (!measurement.data[0].variables.x) {
23
- throw new Error('x variable in undefined');
24
- }
25
- if (!measurement.data[0].variables.y) {
26
- throw new Error('y variable in undefined');
12
+ const { measurement: measurements } = props;
13
+ const measurementsArray = Array.isArray(measurements)
14
+ ? measurements
15
+ : [measurements];
16
+ for (const measurement of measurementsArray) {
17
+ if (!measurement.data) {
18
+ throw new Error('This is weird, the data property is not available on measurement');
19
+ }
20
+ if (measurement.data.length === 0) {
21
+ throw new Error('Data property is empty');
22
+ }
23
+ if (measurement.data.length > 1) {
24
+ throw new Error('Length of data property is larger than 1');
25
+ }
26
+ if (!measurement.data[0].variables.x) {
27
+ throw new Error('x variable in undefined');
28
+ }
29
+ if (!measurement.data[0].variables.y) {
30
+ throw new Error('y variable in undefined');
31
+ }
27
32
  }
28
33
  return ((0, jsx_runtime_1.jsx)(react_plot_1.PlotController, { children: (0, jsx_runtime_1.jsx)(MassComponent, { ...props }) }));
29
34
  }
30
35
  exports.MeasurementMassPlot = MeasurementMassPlot;
31
36
  function MassComponent(props) {
32
- const { measurement } = props;
33
- const { data } = measurement;
34
- const { variables } = data[0];
35
- const { x, y } = (0, react_1.useMemo)(() => {
36
- return { x: variables.x, y: variables.y };
37
- }, [variables]);
38
- const { x: xDomain } = (0, react_plot_1.usePlotControllerAxes)();
39
- const { profile, peaks } = (0, react_1.useMemo)(() => {
40
- const spectrum = new ms_spectrum_1.Spectrum({
41
- x: x.data,
42
- y: y.data,
37
+ const { measurement: measurements } = props;
38
+ const dataXY = (0, react_1.useMemo)(() => {
39
+ const measurementsArray = Array.isArray(measurements)
40
+ ? measurements
41
+ : [measurements];
42
+ return measurementsArray.map(({ data, id }) => {
43
+ const { variables } = data[0];
44
+ const { x, y } = variables;
45
+ return { x, y, id };
43
46
  });
44
- const isContinuous = spectrum.isContinuous();
45
- const profile = isContinuous &&
46
- (0, ml_spectra_processing_1.xyToXYObject)({
47
+ }, [measurements]);
48
+ const { x: xDomain } = (0, react_plot_1.usePlotControllerAxes)();
49
+ const { profiles, peaks } = (0, react_1.useMemo)(() => {
50
+ const profiles = [];
51
+ const peaks = [];
52
+ for (const { x, y, id } of dataXY) {
53
+ const spectrum = new ms_spectrum_1.Spectrum({
47
54
  x: x.data,
48
55
  y: y.data,
49
56
  });
57
+ const isContinuous = spectrum.isContinuous();
58
+ const data = isContinuous &&
59
+ (0, ml_spectra_processing_1.xyToXYObject)({
60
+ x: x.data,
61
+ y: y.data,
62
+ });
63
+ profiles.push({ data, id });
64
+ peaks.push(...spectrum.getPeaks(data));
65
+ }
50
66
  return {
51
- profile,
52
- peaks: spectrum.getPeaks(profile),
67
+ profiles,
68
+ peaks,
53
69
  };
54
- }, [x.data, y.data]);
70
+ }, [dataXY]);
55
71
  const bestPeaks = (0, react_1.useMemo)(() => (0, ms_spectrum_1.getBestPeaks)(peaks, {
56
72
  from: xDomain?.min,
57
73
  to: xDomain?.max,
@@ -59,5 +75,5 @@ function MassComponent(props) {
59
75
  numberSlots: 10,
60
76
  threshold: 0.01,
61
77
  }), [peaks, xDomain?.max, xDomain?.min]);
62
- return ((0, jsx_runtime_1.jsxs)(index_1.BasicComponent, { ...props, children: [profile && (0, jsx_runtime_1.jsx)(react_plot_1.LineSeries, { data: profile, lineStyle: { stroke: 'green' } }), (0, jsx_runtime_1.jsx)(react_plot_1.BarSeries, { data: peaks, lineStyle: { stroke: 'red' } }), (0, jsx_runtime_1.jsx)(react_plot_1.Annotations, { children: bestPeaks.map(({ x, y, shortLabel }) => ((0, jsx_runtime_1.jsxs)(react_plot_1.Annotation.Group, { x: x, y: y, children: [(0, jsx_runtime_1.jsx)(react_plot_1.Annotation.Line, { x1: "0", x2: "0", y1: "0", y2: "-5", style: { strokeWidth: 2, stroke: 'blue' } }), (0, jsx_runtime_1.jsx)(react_plot_1.Annotation.Text, { style: { fontSize: '13px', fontWeight: '600' }, x: "2", y: "0", children: shortLabel }), (0, jsx_runtime_1.jsx)(react_plot_1.Annotation.Text, { style: { fontSize: '13px', fontWeight: '600' }, x: "2", y: "-14", children: x.toFixed(4) })] }, x))) })] }));
78
+ return ((0, jsx_runtime_1.jsxs)(index_1.BasicComponent, { ...props, children: [profiles.map(({ data, id }) => data && ((0, jsx_runtime_1.jsx)(react_plot_1.LineSeries, { data: data, lineStyle: { stroke: 'green' } }, id))), (0, jsx_runtime_1.jsx)(react_plot_1.BarSeries, { data: peaks, lineStyle: { stroke: 'red' } }), (0, jsx_runtime_1.jsx)(react_plot_1.Annotations, { children: bestPeaks.map(({ x, y, shortLabel }) => ((0, jsx_runtime_1.jsxs)(react_plot_1.Annotation.Group, { x: x, y: y, children: [(0, jsx_runtime_1.jsx)(react_plot_1.Annotation.Line, { x1: "0", x2: "0", y1: "0", y2: "-5", style: { strokeWidth: 2, stroke: 'blue' } }), (0, jsx_runtime_1.jsx)(react_plot_1.Annotation.Text, { style: { fontSize: '13px', fontWeight: '600' }, x: "2", y: "0", children: shortLabel }), (0, jsx_runtime_1.jsx)(react_plot_1.Annotation.Text, { style: { fontSize: '13px', fontWeight: '600' }, x: "2", y: "-14", children: x.toFixed(4) })] }, x))) })] }));
63
79
  }
@@ -2,70 +2,25 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.MeasurementInfoPanel = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
- const react_1 = require("react");
6
5
  const index_1 = require("../../../app-data/index");
7
6
  const index_2 = require("../../../components/index");
8
7
  function MeasurementInfoPanel() {
9
8
  const appState = (0, index_1.useAppState)();
10
9
  const measurement = (0, index_1.getCurrentMeasurementData)(appState);
11
- const [search, setSearch] = (0, react_1.useState)('');
12
10
  if (!measurement)
13
11
  return null;
14
- const { meta, info } = measurement.data;
15
- function viewData(data) {
16
- return Object.keys(data).map((key) => {
17
- const value = data[key];
18
- if (!key.toLowerCase().includes(search.toLowerCase()) &&
19
- !valueSearch(value, search)) {
20
- return null;
21
- }
22
- return ((0, jsx_runtime_1.jsxs)(index_2.Table.Row, { children: [(0, jsx_runtime_1.jsx)(index_2.ValueRenderers.Text, { value: key }), valueCell(value)] }, key));
23
- });
24
- }
25
- return ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("input", { style: {
26
- border: 'solid 1px black',
27
- width: '300px',
28
- marginBottom: '10px',
29
- padding: '3px',
30
- }, value: search, placeholder: "search for a parameter ...", onChange: ({ target }) => {
31
- if (target.value !== undefined)
32
- setSearch(target.value);
33
- } }), (0, jsx_runtime_1.jsxs)(index_2.Table, { children: [(0, jsx_runtime_1.jsxs)(index_2.Table.Header, { children: [(0, jsx_runtime_1.jsx)(index_2.ValueRenderers.Title, { value: "Parameter" }), (0, jsx_runtime_1.jsx)(index_2.ValueRenderers.Title, { value: "Value" })] }), viewData(info), viewData(meta)] })] }));
12
+ // TODO: solution for multiple measurements
13
+ const { meta, info } = measurement.data[0];
14
+ const data = [
15
+ {
16
+ description: 'Information',
17
+ data: info,
18
+ },
19
+ {
20
+ description: 'Metadata',
21
+ data: meta,
22
+ },
23
+ ];
24
+ return (0, jsx_runtime_1.jsx)(index_2.InfoPanel, { data: data, title: "" });
34
25
  }
35
26
  exports.MeasurementInfoPanel = MeasurementInfoPanel;
36
- /**
37
- * Get the value cell depending on the type of the value
38
- * @param value - ValueRenderers value.
39
- * @returns - ValueRenderers component.
40
- */
41
- function valueCell(value) {
42
- switch (typeof value) {
43
- case 'number':
44
- return (0, jsx_runtime_1.jsx)(index_2.ValueRenderers.Number, { value: value });
45
- case 'object':
46
- return (0, jsx_runtime_1.jsx)(index_2.ValueRenderers.Object, { value: value });
47
- case 'string':
48
- return (0, jsx_runtime_1.jsx)(index_2.ValueRenderers.Text, { value: value });
49
- default:
50
- (0, jsx_runtime_1.jsx)(index_2.ValueRenderers.Text, { value: value });
51
- }
52
- }
53
- /**
54
- * Search a string in different type of values
55
- *
56
- * @param value - Value to search in.
57
- * @param search - Value to search for.
58
- * @returns - If search exist in value
59
- */
60
- function valueSearch(value, search) {
61
- switch (typeof value) {
62
- case 'number':
63
- return String(value).includes(search.toLowerCase());
64
- case 'object':
65
- return JSON.stringify(value).toLowerCase().includes(search.toLowerCase());
66
- case 'string':
67
- return value.toLowerCase().includes(search.toLowerCase());
68
- default:
69
- return false;
70
- }
71
- }
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getExistingMeasurementKinds = exports.iterateKindMeasurementsAndView = exports.iterateMeasurementEntries = exports.getSelectedMeasurementOrFail = exports.getSelectedMeasurement = exports.getMeasurementKindAndId = exports.getFirstSelectedMeasurementData = exports.getCurrentMeasurementData = exports.getCurrentMeasurement = exports.getFirstMeasurementOrFail = exports.getFirstMeasurement = exports.getMeasurementOrFail = exports.getMeasurement = void 0;
3
+ exports.getExistingMeasurementKinds = exports.iterateKindMeasurementsAndView = exports.iterateMeasurementEntries = exports.getSelectedMeasurementOrFail = exports.getSelectedMeasurement = exports.getMeasurementKindAndIds = exports.getMeasurementKindAndId = exports.getFirstSelectedMeasurementData = exports.getCurrentMeasurementData = exports.getCurrentMeasurement = exports.getFirstMeasurementOrFail = exports.getFirstMeasurement = exports.getMeasurementOrFail = exports.getMeasurement = void 0;
4
4
  const index_1 = require("../../../components/index");
5
5
  const kinds_1 = require("./kinds");
6
6
  function getMeasurement(measurements, kind, selected) {
@@ -31,16 +31,23 @@ function getCurrentMeasurement(state) {
31
31
  const selectedMeasurement = getSelectedMeasurement(state.view);
32
32
  if (!selectedMeasurement)
33
33
  return null;
34
- return getMeasurement(state.data.measurements, selectedMeasurement.kind, selectedMeasurement.id);
34
+ const measurements = [];
35
+ for (const id of selectedMeasurement.ids) {
36
+ const measurement = getMeasurement(state.data.measurements, selectedMeasurement.kind, id);
37
+ if (!measurement)
38
+ return null;
39
+ measurements.push(measurement);
40
+ }
41
+ return measurements;
35
42
  }
36
43
  exports.getCurrentMeasurement = getCurrentMeasurement;
37
44
  function getCurrentMeasurementData(state) {
38
45
  const selectedMeasurement = getCurrentMeasurement(state);
39
46
  if (!selectedMeasurement)
40
47
  return null;
41
- const kindAndId = getMeasurementKindAndId(state.data, selectedMeasurement.id);
42
- const display = state.view.measurements[selectedMeasurement.id];
43
- return { data: selectedMeasurement, display, kindAndId };
48
+ const kindAndIds = getMeasurementKindAndIds(state.data, selectedMeasurement);
49
+ const display = selectedMeasurement.map(({ id }) => state.view.measurements[id]);
50
+ return { data: selectedMeasurement, display, kindAndIds };
44
51
  }
45
52
  exports.getCurrentMeasurementData = getCurrentMeasurementData;
46
53
  function getFirstSelectedMeasurementData(state) {
@@ -65,16 +72,33 @@ function getMeasurementKindAndId(data, measurementId) {
65
72
  throw new Error(`Measurement kind for ${measurementId} not found`);
66
73
  }
67
74
  exports.getMeasurementKindAndId = getMeasurementKindAndId;
75
+ function getMeasurementKindAndIds(data, measurementId) {
76
+ let found = false;
77
+ for (const kind of kinds_1.measurementKinds) {
78
+ for (const { id } of measurementId) {
79
+ const measurement = getMeasurement(data.measurements, kind, id);
80
+ if (measurement)
81
+ found = true;
82
+ if (found && !measurement) {
83
+ throw new Error(`Measurement kind for ${measurementId.join(', ')} not found`);
84
+ }
85
+ }
86
+ if (found)
87
+ return { kind, ids: measurementId };
88
+ }
89
+ throw new Error(`Measurement kind for ${measurementId.join(', ')} not found`);
90
+ }
91
+ exports.getMeasurementKindAndIds = getMeasurementKindAndIds;
68
92
  function getSelectedMeasurement(view) {
69
93
  const { selectedKind, selectedMeasurements } = view;
70
94
  if (!selectedKind)
71
95
  return null;
72
96
  const kind = selectedKind;
73
97
  const currentMeasurements = selectedMeasurements[kind];
74
- if (!currentMeasurements || currentMeasurements.length !== 1)
98
+ if (!currentMeasurements || currentMeasurements.length === 0)
75
99
  return null;
76
- const id = currentMeasurements[0];
77
- return { kind, id };
100
+ const ids = currentMeasurements;
101
+ return { kind, ids };
78
102
  }
79
103
  exports.getSelectedMeasurement = getSelectedMeasurement;
80
104
  function getSelectedMeasurementOrFail(view) {
@@ -29,8 +29,7 @@ const jsx_runtime_1 = require("@emotion/react/jsx-runtime");
29
29
  const react_1 = require("@emotion/react");
30
30
  const RadixCheckbox = __importStar(require("@radix-ui/react-checkbox"));
31
31
  const index_1 = require("react-icons/rx/index");
32
- const enabledColor = '#1677ff';
33
- const disabledColor = '#b8b8b8';
32
+ const styles_1 = require("./styles");
34
33
  function Checkbox(props) {
35
34
  const { checked = 'indeterminate', disabled = false, label, onChange, } = props;
36
35
  return ((0, jsx_runtime_1.jsxs)("label", { style: {
@@ -43,17 +42,17 @@ function Checkbox(props) {
43
42
  backgroundColor: disabled
44
43
  ? 'rgba(0, 0, 0, 0.04)'
45
44
  : checked
46
- ? enabledColor
45
+ ? styles_1.enabledColor
47
46
  : 'white',
48
47
  borderWidth: '1px',
49
- borderColor: checked && !disabled ? enabledColor : disabledColor,
48
+ borderColor: checked && !disabled ? styles_1.enabledColor : styles_1.disabledColor,
50
49
  borderRadius: '4px',
51
50
  display: 'flex',
52
51
  alignItems: 'center',
53
52
  justifyContent: 'center',
54
53
  cursor: disabled ? 'not-allowed' : 'pointer',
55
54
  }), children: (0, jsx_runtime_1.jsx)(RadixCheckbox.Indicator, { css: (0, react_1.css)({
56
- color: disabled ? disabledColor : 'white',
55
+ color: disabled ? styles_1.disabledColor : 'white',
57
56
  }), children: checked === true ? ((0, jsx_runtime_1.jsx)(index_1.RxCheck, {})) : checked === 'indeterminate' ? ((0, jsx_runtime_1.jsx)(index_1.RxMinus, {})) : null }) }), (0, jsx_runtime_1.jsx)("span", { style: {
58
57
  paddingInline: '8px',
59
58
  lineHeight: '16px',
@@ -8,72 +8,8 @@ const jsx_runtime_1 = require("react/jsx-runtime");
8
8
  const styled_1 = __importDefault(require("@emotion/styled"));
9
9
  const index_1 = require("../index");
10
10
  const FieldsContext_1 = require("./context/FieldsContext");
11
- const LabelStyled = styled_1.default.label `
12
- padding: ${(props) => props.variant === 'default'
13
- ? props.hasTrailing
14
- ? '2px 9px 4px 9px'
15
- : '2px 9px'
16
- : props.hasTrailing
17
- ? '1px 7px 1px 7px'
18
- : '1px 7px'};
19
-
20
- font-size: ${(props) => (props.variant === 'small' ? '1em' : '1.125em')};
21
- line-height: '17px';
22
-
23
- background-color: white;
24
- border-width: 1px;
25
- align-items: center;
26
- flex-direction: row;
27
- flex: 1 1 0%;
28
- display: flex;
29
- position: relative;
30
-
31
- border-top-right-radius: ${(props) => props.hasLeading && !props.hasTrailing && '0.375rem'};
32
-
33
- border-bottom-right-radius: ${(props) => props.hasLeading && !props.hasTrailing && '0.375rem'};
34
-
35
- border-top-left-radius: ${(props) => props.hasTrailing && !props.hasLeading && '0.375rem'};
36
-
37
- border-bottom-left-radius: ${(props) => props.hasTrailing && !props.hasLeading && '0.375rem'};
38
-
39
- border-radius: ${(props) => !props.hasLeading && !props.hasTrailing && '0.375rem'};
40
-
41
- border-color: var(--custom-border-color);
42
- `;
43
- function getStyleColor(hasError, hasValid) {
44
- if (hasError) {
45
- return {
46
- default: '#ffa39e',
47
- hover: '#f95d55',
48
- };
49
- }
50
- if (hasValid) {
51
- return {
52
- default: '#6adc24',
53
- hover: '#62cb21',
54
- };
55
- }
56
- return {
57
- default: 'rgb(217, 217, 217)',
58
- hover: '#4096ff',
59
- };
60
- }
61
- const GroupStyled = styled_1.default.div `
62
- display: flex;
63
- border-radius: 0.375rem;
64
- margin-top: 0.25rem;
65
-
66
- .addon {
67
- color: ${({ hasError }) => hasError && '#f95d55'};
68
- }
69
-
70
- --custom-border-color: ${({ hasError, hasValid }) => getStyleColor(hasError, hasValid).default};
71
-
72
- :hover,
73
- :focus-within {
74
- --custom-border-color: ${({ hasError, hasValid }) => getStyleColor(hasError, hasValid).hover};
75
- }
76
- `;
11
+ const styles_1 = require("./styles");
12
+ const utils_1 = require("./utils");
77
13
  const InputStyled = styled_1.default.input `
78
14
  padding: 0;
79
15
  flex: 1 1 0%;
@@ -119,32 +55,12 @@ const TrailingInlineAddonStyled = styled_1.default.div `
119
55
  align-items: center;
120
56
  padding-left: 0.5rem;
121
57
  `;
122
- const RootInput = styled_1.default.div `
123
- display: flex;
124
- flex-direction: column;
125
- gap: 2px;
126
- `;
127
58
  function Input(props) {
128
59
  const { variant: variantProps, trailingAddon, leadingAddon, help, error, valid, loading, ...otherProps } = props;
129
60
  const { name, variant: contextVariant } = (0, FieldsContext_1.useFieldsContext)();
130
61
  const hasLeading = (leadingAddon && !leadingAddon.inline) || false;
131
62
  const hasTrailing = (trailingAddon && !trailingAddon.inline) || false;
132
63
  const variant = variantProps || contextVariant;
133
- return ((0, jsx_runtime_1.jsxs)(RootInput, { children: [(0, jsx_runtime_1.jsxs)(GroupStyled, { hasError: !!error, hasValid: !!valid, children: [leadingAddon && !leadingAddon.inline && ((0, jsx_runtime_1.jsx)(LeadingAddonStyled, { children: leadingAddon.addon })), (0, jsx_runtime_1.jsxs)(LabelStyled, { variant: variant, hasLeading: hasLeading, hasTrailing: hasTrailing, children: [leadingAddon?.inline && ((0, jsx_runtime_1.jsx)(LeadingInlineAddonStyled, { className: "addon", children: leadingAddon.addon })), (0, jsx_runtime_1.jsx)(InputStyled, { id: name, name: name, ...otherProps }), trailingAddon?.inline && ((0, jsx_runtime_1.jsx)(TrailingInlineAddonStyled, { className: "addon", children: trailingAddon.addon })), loading && ((0, jsx_runtime_1.jsx)(TrailingInlineAddonStyled, { style: { height: variant === 'default' ? 20 : 10 }, children: (0, jsx_runtime_1.jsx)(index_1.FullSpinner, { height: variant === 'default' ? 20 : 10, width: variant === 'default' ? 20 : 10 }) }))] }), trailingAddon && !trailingAddon.inline && ((0, jsx_runtime_1.jsx)(TrailingAddonStyled, { children: trailingAddon.addon }))] }), (0, jsx_runtime_1.jsx)(SubText, { error: error, help: help, valid: valid })] }));
64
+ return ((0, jsx_runtime_1.jsxs)(styles_1.InputContainer, { children: [(0, jsx_runtime_1.jsxs)(styles_1.GroupStyled, { hasError: !!error, hasValid: !!valid, children: [leadingAddon && !leadingAddon.inline && ((0, jsx_runtime_1.jsx)(LeadingAddonStyled, { children: leadingAddon.addon })), (0, jsx_runtime_1.jsxs)(styles_1.LabelStyled, { variant: variant, hasLeading: hasLeading, hasTrailing: hasTrailing, children: [leadingAddon?.inline && ((0, jsx_runtime_1.jsx)(LeadingInlineAddonStyled, { className: "addon", children: leadingAddon.addon })), (0, jsx_runtime_1.jsx)(InputStyled, { id: name, name: name, ...otherProps }), trailingAddon?.inline && ((0, jsx_runtime_1.jsx)(TrailingInlineAddonStyled, { className: "addon", children: trailingAddon.addon })), loading && ((0, jsx_runtime_1.jsx)(TrailingInlineAddonStyled, { style: { height: variant === 'default' ? 20 : 10 }, children: (0, jsx_runtime_1.jsx)(index_1.FullSpinner, { height: variant === 'default' ? 20 : 10, width: variant === 'default' ? 20 : 10 }) }))] }), trailingAddon && !trailingAddon.inline && ((0, jsx_runtime_1.jsx)(TrailingAddonStyled, { children: trailingAddon.addon }))] }), (0, jsx_runtime_1.jsx)(utils_1.SubText, { error: error, help: help, valid: valid })] }));
134
65
  }
135
66
  exports.Input = Input;
136
- function SubText(props) {
137
- const { error, help, valid: validProps } = props;
138
- const valid = typeof validProps === 'string' ? validProps : undefined;
139
- const text = error || valid || help;
140
- return (0, jsx_runtime_1.jsx)("p", { style: { color: getColor(error, validProps) }, children: text });
141
- }
142
- function getColor(error, valid) {
143
- if (error) {
144
- return '#f95d55';
145
- }
146
- if (valid && typeof valid !== 'boolean') {
147
- return '#62cb21';
148
- }
149
- return 'gray';
150
- }
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.TextArea = void 0;
7
+ const jsx_runtime_1 = require("react/jsx-runtime");
8
+ const styled_1 = __importDefault(require("@emotion/styled"));
9
+ const FieldsContext_1 = require("./context/FieldsContext");
10
+ const styles_1 = require("./styles");
11
+ const utils_1 = require("./utils");
12
+ const TextAreaStyled = styled_1.default.textarea `
13
+ padding: 0;
14
+ flex: 1 1 0%;
15
+ border: none;
16
+ position: relative;
17
+ outline: none;
18
+ `;
19
+ function TextArea(props) {
20
+ const { variant: variantProps, help, error, valid, ...otherProps } = props;
21
+ const { name, variant: contextVariant } = (0, FieldsContext_1.useFieldsContext)();
22
+ const variant = variantProps || contextVariant;
23
+ return ((0, jsx_runtime_1.jsxs)(styles_1.InputContainer, { children: [(0, jsx_runtime_1.jsx)(styles_1.GroupStyled, { hasError: !!error, hasValid: !!valid, children: (0, jsx_runtime_1.jsx)(styles_1.LabelStyled, { variant: variant, children: (0, jsx_runtime_1.jsx)(TextAreaStyled, { id: name, name: name, ...otherProps }) }) }), (0, jsx_runtime_1.jsx)(utils_1.SubText, { error: error, help: help, valid: valid })] }));
24
+ }
25
+ exports.TextArea = TextArea;
@@ -15,6 +15,8 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./Input"), exports);
18
+ __exportStar(require("./TextArea"), exports);
18
19
  __exportStar(require("./Checkbox"), exports);
19
20
  __exportStar(require("./context"), exports);
20
21
  __exportStar(require("./Select"), exports);
22
+ __exportStar(require("./radio-group"), exports);