react-science 0.24.3 → 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 (284) 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/hooks/file-loading.js +1 -1
  6. package/lib/app/kinds/mass/MassPlotView.js +2 -2
  7. package/lib/app/kinds/mass/MeasurementMassPlot.js +49 -33
  8. package/lib/app/panels/SignalProcessingPanel.js +1 -1
  9. package/lib/app/panels/measurement-info/MeasurementInfoPanel.js +13 -58
  10. package/lib/app-data/kinds/ir/irAutoPeakPickingEnhancer.js +4 -4
  11. package/lib/app-data/kinds/ir/irMeasurementEnhancer.js +1 -1
  12. package/lib/app-data/loaders/cdfLoader.js +4 -5
  13. package/lib/app-data/loaders/jcampLoader.js +1 -1
  14. package/lib/app-data/loaders/loadMeasurements.js +1 -1
  15. package/lib/app-data/loaders/wdfLoader.js +1 -1
  16. package/lib/app-data/state/data/data.helpers.js +35 -11
  17. package/lib/components/accordion/AccordionContext.js +1 -1
  18. package/lib/components/color-picker/gradient-select/GradientSelect.js +2 -0
  19. package/lib/components/color-picker/react-color/common/EditableInput.js +1 -1
  20. package/lib/components/dropdown-menu/DropdownMenu.js +2 -0
  21. package/lib/components/dropdown-menu/MenuItems.js +5 -1
  22. package/lib/components/forms/Checkbox.js +4 -5
  23. package/lib/components/forms/Input.js +3 -87
  24. package/lib/components/forms/TextArea.js +25 -0
  25. package/lib/components/forms/index.js +2 -0
  26. package/lib/components/forms/radio-group/ButtonRadioItem.js +76 -0
  27. package/lib/components/forms/radio-group/ClassicRadioItem.js +92 -0
  28. package/lib/components/forms/radio-group/RadioGroup.js +69 -0
  29. package/lib/components/forms/radio-group/index.js +17 -0
  30. package/lib/components/forms/styles.js +80 -0
  31. package/lib/components/forms/utils/SubText.js +20 -0
  32. package/lib/components/forms/utils/index.js +17 -0
  33. package/lib/components/header/PanelHeader.js +51 -0
  34. package/lib/components/header/index.js +1 -0
  35. package/lib/components/hooks/useOnOff.js +1 -1
  36. package/lib/components/index.js +1 -0
  37. package/lib/components/info-panel/InfoPanel.js +94 -0
  38. package/lib/components/info-panel/index.js +17 -0
  39. package/lib/components/modal/ConfirmModal.js +9 -6
  40. package/lib/components/modal/Modal.js +6 -4
  41. package/lib/components/modal/useDialog.js +13 -3
  42. package/lib/components/root-layout/css-reset/customPreflight.js +15 -3
  43. package/lib/components/root-layout/css-reset/preflight.js +14 -3
  44. package/lib/components/split-pane/SplitPane.js +1 -1
  45. package/lib/components/table/Table.js +4 -4
  46. package/lib/components/toolbar/PanelPreferencesToolbar.js +26 -0
  47. package/lib/components/toolbar/index.js +1 -0
  48. package/lib/components/value-renderers/Boolean.js +1 -1
  49. package/lib-esm/app/explorer/MeasurementExplorer.d.ts.map +1 -1
  50. package/lib-esm/app/explorer/MeasurementExplorer.js +30 -8
  51. package/lib-esm/app/explorer/MeasurementExplorer.js.map +1 -1
  52. package/lib-esm/app/explorer/MeasurementExplorerWithState.d.ts.map +1 -1
  53. package/lib-esm/app/explorer/MeasurementExplorerWithState.js +2 -2
  54. package/lib-esm/app/explorer/MeasurementExplorerWithState.js.map +1 -1
  55. package/lib-esm/app/helpers/MeasurementPlot.d.ts +3 -3
  56. package/lib-esm/app/helpers/MeasurementPlot.d.ts.map +1 -1
  57. package/lib-esm/app/helpers/MeasurementPlot.js +28 -19
  58. package/lib-esm/app/helpers/MeasurementPlot.js.map +1 -1
  59. package/lib-esm/app/helpers/react-plot.d.ts.map +1 -1
  60. package/lib-esm/app/helpers/react-plot.js +1 -1
  61. package/lib-esm/app/helpers/react-plot.js.map +1 -1
  62. package/lib-esm/app/hooks/file-loading.js +1 -1
  63. package/lib-esm/app/hooks/file-loading.js.map +1 -1
  64. package/lib-esm/app/kinds/ir/IrPeaksPanel.js.map +1 -1
  65. package/lib-esm/app/kinds/mass/MassPlotView.d.ts.map +1 -1
  66. package/lib-esm/app/kinds/mass/MassPlotView.js +2 -2
  67. package/lib-esm/app/kinds/mass/MassPlotView.js.map +1 -1
  68. package/lib-esm/app/kinds/mass/MeasurementMassPlot.d.ts.map +1 -1
  69. package/lib-esm/app/kinds/mass/MeasurementMassPlot.js +49 -33
  70. package/lib-esm/app/kinds/mass/MeasurementMassPlot.js.map +1 -1
  71. package/lib-esm/app/panels/SignalProcessingPanel.js +1 -1
  72. package/lib-esm/app/panels/SignalProcessingPanel.js.map +1 -1
  73. package/lib-esm/app/panels/measurement-info/MeasurementInfoPanel.d.ts.map +1 -1
  74. package/lib-esm/app/panels/measurement-info/MeasurementInfoPanel.js +15 -60
  75. package/lib-esm/app/panels/measurement-info/MeasurementInfoPanel.js.map +1 -1
  76. package/lib-esm/app-data/enhancers/enhance.d.ts +1 -1
  77. package/lib-esm/app-data/enhancers/enhance.d.ts.map +1 -1
  78. package/lib-esm/app-data/kinds/ir/irAutoPeakPickingEnhancer.js +4 -4
  79. package/lib-esm/app-data/kinds/ir/irAutoPeakPickingEnhancer.js.map +1 -1
  80. package/lib-esm/app-data/kinds/ir/irMeasurementEnhancer.js +1 -1
  81. package/lib-esm/app-data/kinds/ir/irMeasurementEnhancer.js.map +1 -1
  82. package/lib-esm/app-data/loaders/cdfLoader.d.ts.map +1 -1
  83. package/lib-esm/app-data/loaders/cdfLoader.js +4 -5
  84. package/lib-esm/app-data/loaders/cdfLoader.js.map +1 -1
  85. package/lib-esm/app-data/loaders/jcampLoader.js +1 -1
  86. package/lib-esm/app-data/loaders/jcampLoader.js.map +1 -1
  87. package/lib-esm/app-data/loaders/loadMeasurements.js +1 -1
  88. package/lib-esm/app-data/loaders/loadMeasurements.js.map +1 -1
  89. package/lib-esm/app-data/loaders/wdfLoader.js +1 -1
  90. package/lib-esm/app-data/loaders/wdfLoader.js.map +1 -1
  91. package/lib-esm/app-data/state/data/data.helpers.d.ts +22 -14
  92. package/lib-esm/app-data/state/data/data.helpers.d.ts.map +1 -1
  93. package/lib-esm/app-data/state/data/data.helpers.js +33 -10
  94. package/lib-esm/app-data/state/data/data.helpers.js.map +1 -1
  95. package/lib-esm/app-data/state/view/AppView.d.ts +1 -1
  96. package/lib-esm/app-data/state/view/AppView.d.ts.map +1 -1
  97. package/lib-esm/components/accordion/Accordion.js.map +1 -1
  98. package/lib-esm/components/accordion/AccordionContext.d.ts +1 -1
  99. package/lib-esm/components/accordion/AccordionContext.d.ts.map +1 -1
  100. package/lib-esm/components/accordion/AccordionContext.js +1 -1
  101. package/lib-esm/components/accordion/AccordionContext.js.map +1 -1
  102. package/lib-esm/components/color-picker/gradient-select/GradientSelect.d.ts.map +1 -1
  103. package/lib-esm/components/color-picker/gradient-select/GradientSelect.js +2 -0
  104. package/lib-esm/components/color-picker/gradient-select/GradientSelect.js.map +1 -1
  105. package/lib-esm/components/color-picker/react-color/common/EditableInput.js +1 -1
  106. package/lib-esm/components/color-picker/react-color/common/EditableInput.js.map +1 -1
  107. package/lib-esm/components/color-picker/react-color/helpers/color.d.ts +13 -13
  108. package/lib-esm/components/color-picker/react-color/sketch/SketchPresetColors.d.ts +2 -2
  109. package/lib-esm/components/color-picker/react-color/sketch/SketchPresetColors.d.ts.map +1 -1
  110. package/lib-esm/components/dropdown-menu/DropdownMenu.d.ts.map +1 -1
  111. package/lib-esm/components/dropdown-menu/DropdownMenu.js +2 -0
  112. package/lib-esm/components/dropdown-menu/DropdownMenu.js.map +1 -1
  113. package/lib-esm/components/dropdown-menu/MenuItems.d.ts.map +1 -1
  114. package/lib-esm/components/dropdown-menu/MenuItems.js +5 -1
  115. package/lib-esm/components/dropdown-menu/MenuItems.js.map +1 -1
  116. package/lib-esm/components/dropdown-menu/useContextMenuPlacement.d.ts +1 -1
  117. package/lib-esm/components/dropdown-menu/useContextMenuPlacement.d.ts.map +1 -1
  118. package/lib-esm/components/dropdown-menu/useContextMenuPlacement.js.map +1 -1
  119. package/lib-esm/components/forms/Checkbox.d.ts.map +1 -1
  120. package/lib-esm/components/forms/Checkbox.js +1 -2
  121. package/lib-esm/components/forms/Checkbox.js.map +1 -1
  122. package/lib-esm/components/forms/Input.d.ts +4 -2
  123. package/lib-esm/components/forms/Input.d.ts.map +1 -1
  124. package/lib-esm/components/forms/Input.js +3 -87
  125. package/lib-esm/components/forms/Input.js.map +1 -1
  126. package/lib-esm/components/forms/Select.d.ts +1 -1
  127. package/lib-esm/components/forms/Select.d.ts.map +1 -1
  128. package/lib-esm/components/forms/TextArea.d.ts +8 -0
  129. package/lib-esm/components/forms/TextArea.d.ts.map +1 -0
  130. package/lib-esm/components/forms/TextArea.js +19 -0
  131. package/lib-esm/components/forms/TextArea.js.map +1 -0
  132. package/lib-esm/components/forms/index.d.ts +2 -0
  133. package/lib-esm/components/forms/index.d.ts.map +1 -1
  134. package/lib-esm/components/forms/index.js +2 -0
  135. package/lib-esm/components/forms/index.js.map +1 -1
  136. package/lib-esm/components/forms/radio-group/ButtonRadioItem.d.ts +3 -0
  137. package/lib-esm/components/forms/radio-group/ButtonRadioItem.d.ts.map +1 -0
  138. package/lib-esm/components/forms/radio-group/ButtonRadioItem.js +50 -0
  139. package/lib-esm/components/forms/radio-group/ButtonRadioItem.js.map +1 -0
  140. package/lib-esm/components/forms/radio-group/ClassicRadioItem.d.ts +3 -0
  141. package/lib-esm/components/forms/radio-group/ClassicRadioItem.d.ts.map +1 -0
  142. package/lib-esm/components/forms/radio-group/ClassicRadioItem.js +66 -0
  143. package/lib-esm/components/forms/radio-group/ClassicRadioItem.js.map +1 -0
  144. package/lib-esm/components/forms/radio-group/RadioGroup.d.ts +18 -0
  145. package/lib-esm/components/forms/radio-group/RadioGroup.d.ts.map +1 -0
  146. package/lib-esm/components/forms/radio-group/RadioGroup.js +43 -0
  147. package/lib-esm/components/forms/radio-group/RadioGroup.js.map +1 -0
  148. package/lib-esm/components/forms/radio-group/index.d.ts +2 -0
  149. package/lib-esm/components/forms/radio-group/index.d.ts.map +1 -0
  150. package/lib-esm/components/forms/radio-group/index.js +2 -0
  151. package/lib-esm/components/forms/radio-group/index.js.map +1 -0
  152. package/lib-esm/components/forms/styles.d.ts +26 -0
  153. package/lib-esm/components/forms/styles.d.ts.map +1 -0
  154. package/lib-esm/components/forms/styles.js +75 -0
  155. package/lib-esm/components/forms/styles.js.map +1 -0
  156. package/lib-esm/components/forms/utils/SubText.d.ts +7 -0
  157. package/lib-esm/components/forms/utils/SubText.d.ts.map +1 -0
  158. package/lib-esm/components/forms/utils/SubText.js +17 -0
  159. package/lib-esm/components/forms/utils/SubText.js.map +1 -0
  160. package/lib-esm/components/forms/utils/index.d.ts +2 -0
  161. package/lib-esm/components/forms/utils/index.d.ts.map +1 -0
  162. package/lib-esm/components/forms/utils/index.js +2 -0
  163. package/lib-esm/components/forms/utils/index.js.map +1 -0
  164. package/lib-esm/components/header/PanelHeader.d.ts +10 -0
  165. package/lib-esm/components/header/PanelHeader.d.ts.map +1 -0
  166. package/lib-esm/components/header/PanelHeader.js +48 -0
  167. package/lib-esm/components/header/PanelHeader.js.map +1 -0
  168. package/lib-esm/components/header/index.d.ts +1 -0
  169. package/lib-esm/components/header/index.d.ts.map +1 -1
  170. package/lib-esm/components/header/index.js +1 -0
  171. package/lib-esm/components/header/index.js.map +1 -1
  172. package/lib-esm/components/hooks/useModifiedPopper.js.map +1 -1
  173. package/lib-esm/components/hooks/useOnOff.d.ts.map +1 -1
  174. package/lib-esm/components/hooks/useOnOff.js +1 -1
  175. package/lib-esm/components/hooks/useOnOff.js.map +1 -1
  176. package/lib-esm/components/index.d.ts +1 -0
  177. package/lib-esm/components/index.d.ts.map +1 -1
  178. package/lib-esm/components/index.js +1 -0
  179. package/lib-esm/components/index.js.map +1 -1
  180. package/lib-esm/components/info-panel/InfoPanel.d.ts +15 -0
  181. package/lib-esm/components/info-panel/InfoPanel.d.ts.map +1 -0
  182. package/lib-esm/components/info-panel/InfoPanel.js +91 -0
  183. package/lib-esm/components/info-panel/InfoPanel.js.map +1 -0
  184. package/lib-esm/components/info-panel/index.d.ts +2 -0
  185. package/lib-esm/components/info-panel/index.d.ts.map +1 -0
  186. package/lib-esm/components/info-panel/index.js +2 -0
  187. package/lib-esm/components/info-panel/index.js.map +1 -0
  188. package/lib-esm/components/layout-manager/LayoutManager.d.ts +2 -4
  189. package/lib-esm/components/layout-manager/LayoutManager.d.ts.map +1 -1
  190. package/lib-esm/components/layout-manager/LayoutManager.js.map +1 -1
  191. package/lib-esm/components/modal/ConfirmModal.d.ts.map +1 -1
  192. package/lib-esm/components/modal/ConfirmModal.js +9 -6
  193. package/lib-esm/components/modal/ConfirmModal.js.map +1 -1
  194. package/lib-esm/components/modal/Modal.d.ts +1 -1
  195. package/lib-esm/components/modal/Modal.d.ts.map +1 -1
  196. package/lib-esm/components/modal/Modal.js +6 -4
  197. package/lib-esm/components/modal/Modal.js.map +1 -1
  198. package/lib-esm/components/modal/useDialog.d.ts +11 -5
  199. package/lib-esm/components/modal/useDialog.d.ts.map +1 -1
  200. package/lib-esm/components/modal/useDialog.js +14 -4
  201. package/lib-esm/components/modal/useDialog.js.map +1 -1
  202. package/lib-esm/components/root-layout/css-reset/customPreflight.d.ts.map +1 -1
  203. package/lib-esm/components/root-layout/css-reset/customPreflight.js +15 -3
  204. package/lib-esm/components/root-layout/css-reset/customPreflight.js.map +1 -1
  205. package/lib-esm/components/root-layout/css-reset/preflight.d.ts +1 -1
  206. package/lib-esm/components/root-layout/css-reset/preflight.d.ts.map +1 -1
  207. package/lib-esm/components/root-layout/css-reset/preflight.js +14 -3
  208. package/lib-esm/components/root-layout/css-reset/preflight.js.map +1 -1
  209. package/lib-esm/components/split-pane/SplitPane.js +1 -1
  210. package/lib-esm/components/split-pane/SplitPane.js.map +1 -1
  211. package/lib-esm/components/table/Table.d.ts +2 -3
  212. package/lib-esm/components/table/Table.d.ts.map +1 -1
  213. package/lib-esm/components/table/Table.js +4 -4
  214. package/lib-esm/components/table/Table.js.map +1 -1
  215. package/lib-esm/components/toolbar/PanelPreferencesToolbar.d.ts +7 -0
  216. package/lib-esm/components/toolbar/PanelPreferencesToolbar.d.ts.map +1 -0
  217. package/lib-esm/components/toolbar/PanelPreferencesToolbar.js +23 -0
  218. package/lib-esm/components/toolbar/PanelPreferencesToolbar.js.map +1 -0
  219. package/lib-esm/components/toolbar/index.d.ts +1 -0
  220. package/lib-esm/components/toolbar/index.d.ts.map +1 -1
  221. package/lib-esm/components/toolbar/index.js +1 -0
  222. package/lib-esm/components/toolbar/index.js.map +1 -1
  223. package/lib-esm/components/value-renderers/Boolean.d.ts.map +1 -1
  224. package/lib-esm/components/value-renderers/Boolean.js +1 -1
  225. package/lib-esm/components/value-renderers/Boolean.js.map +1 -1
  226. package/package.json +45 -43
  227. package/src/app/explorer/MeasurementExplorer.tsx +34 -12
  228. package/src/app/explorer/MeasurementExplorerWithState.tsx +2 -2
  229. package/src/app/helpers/MeasurementPlot.tsx +44 -33
  230. package/src/app/helpers/react-plot.tsx +6 -4
  231. package/src/app/hooks/file-loading.ts +1 -1
  232. package/src/app/kinds/ir/IrPeaksPanel.tsx +1 -1
  233. package/src/app/kinds/mass/MassPlotView.tsx +2 -2
  234. package/src/app/kinds/mass/MeasurementMassPlot.tsx +57 -37
  235. package/src/app/panels/SignalProcessingPanel.tsx +1 -1
  236. package/src/app/panels/measurement-info/MeasurementInfoPanel.tsx +14 -84
  237. package/src/app-data/enhancers/enhance.ts +3 -3
  238. package/src/app-data/kinds/ir/irAutoPeakPickingEnhancer.ts +6 -6
  239. package/src/app-data/kinds/ir/irMeasurementEnhancer.ts +1 -1
  240. package/src/app-data/loaders/cdfLoader.ts +4 -5
  241. package/src/app-data/loaders/jcampLoader.ts +1 -1
  242. package/src/app-data/loaders/loadMeasurements.ts +1 -1
  243. package/src/app-data/loaders/wdfLoader.ts +3 -3
  244. package/src/app-data/state/data/data.helpers.ts +54 -21
  245. package/src/app-data/state/view/AppView.ts +1 -1
  246. package/src/components/accordion/Accordion.tsx +1 -1
  247. package/src/components/accordion/AccordionContext.tsx +3 -3
  248. package/src/components/color-picker/gradient-select/GradientSelect.tsx +2 -0
  249. package/src/components/color-picker/react-color/common/EditableInput.jsx +1 -1
  250. package/src/components/color-picker/react-color/sketch/SketchPresetColors.tsx +1 -1
  251. package/src/components/dropdown-menu/DropdownMenu.tsx +2 -0
  252. package/src/components/dropdown-menu/MenuItems.tsx +5 -1
  253. package/src/components/dropdown-menu/useContextMenuPlacement.ts +1 -1
  254. package/src/components/forms/Checkbox.tsx +2 -3
  255. package/src/components/forms/Input.tsx +14 -125
  256. package/src/components/forms/Select.tsx +1 -1
  257. package/src/components/forms/TextArea.tsx +45 -0
  258. package/src/components/forms/index.ts +2 -0
  259. package/src/components/forms/radio-group/ButtonRadioItem.tsx +77 -0
  260. package/src/components/forms/radio-group/ClassicRadioItem.tsx +95 -0
  261. package/src/components/forms/radio-group/RadioGroup.tsx +83 -0
  262. package/src/components/forms/radio-group/index.ts +1 -0
  263. package/src/components/forms/styles.ts +96 -0
  264. package/src/components/forms/utils/SubText.tsx +31 -0
  265. package/src/components/forms/utils/index.ts +1 -0
  266. package/src/components/header/PanelHeader.tsx +75 -0
  267. package/src/components/header/index.ts +1 -0
  268. package/src/components/hooks/useModifiedPopper.ts +1 -1
  269. package/src/components/hooks/useOnOff.ts +1 -2
  270. package/src/components/index.ts +1 -0
  271. package/src/components/info-panel/InfoPanel.tsx +150 -0
  272. package/src/components/info-panel/index.ts +1 -0
  273. package/src/components/layout-manager/LayoutManager.tsx +2 -4
  274. package/src/components/modal/ConfirmModal.tsx +41 -33
  275. package/src/components/modal/Modal.tsx +19 -15
  276. package/src/components/modal/useDialog.ts +36 -10
  277. package/src/components/root-layout/css-reset/customPreflight.ts +15 -3
  278. package/src/components/root-layout/css-reset/preflight.css +15 -3
  279. package/src/components/root-layout/css-reset/preflight.ts +14 -3
  280. package/src/components/split-pane/SplitPane.tsx +1 -1
  281. package/src/components/table/Table.tsx +5 -7
  282. package/src/components/toolbar/PanelPreferencesToolbar.tsx +46 -0
  283. package/src/components/toolbar/index.ts +1 -0
  284. package/src/components/value-renderers/Boolean.tsx +3 -1
@@ -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;
@@ -18,7 +18,7 @@ function useLoadFileCollectionFromHash(onLoad) {
18
18
  }
19
19
  const request = await fetch(filelistUrl);
20
20
  const data = await request.json();
21
- let baseURL = filelistUrl.replace(/\/[^/]*$/, '/');
21
+ const baseURL = filelistUrl.replace(/\/[^/]*$/, '/');
22
22
  const fileCollection = await (0, filelist_utils_1.fileCollectionFromWebSource)({
23
23
  entries: data,
24
24
  baseURL,
@@ -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
  }
@@ -67,7 +67,7 @@ function getDefaultFilter({ options, name }) {
67
67
  return { name };
68
68
  }
69
69
  function normalCase(str) {
70
- const result = str.replace(/(?<upper>[A-Z])/g, ' $<upper>').trim();
70
+ const result = str.replaceAll(/(?<upper>[A-Z])/g, ' $<upper>').trim();
71
71
  return result.charAt(0).toUpperCase() + result.slice(1);
72
72
  }
73
73
  function optionInput([key, { description, choices }], options, onChange) {
@@ -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
- }
@@ -13,11 +13,11 @@ function irAutoPeakPickingEnhancer(measurement, options = {}) {
13
13
  if (measurement.data.length === 0)
14
14
  return;
15
15
  const datum = measurement.data[0];
16
- let x = datum.variables[xVariable]?.data;
17
- let y = datum.variables[yVariable]?.data;
16
+ const x = datum.variables[xVariable]?.data;
17
+ const y = datum.variables[yVariable]?.data;
18
18
  if (!x || !y)
19
19
  return [];
20
- let { from, to } = options;
20
+ const { from, to } = options;
21
21
  let peaks = (0, ml_gsd_1.gsd)({ x, y }, options);
22
22
  if (from !== undefined) {
23
23
  peaks = peaks.filter((peak) => peak.x >= from);
@@ -43,7 +43,7 @@ function getIrAutoPeakPickingEnhancer(options) {
43
43
  }
44
44
  exports.getIrAutoPeakPickingEnhancer = getIrAutoPeakPickingEnhancer;
45
45
  function getPeakKind(transmittance, minTransmittance, maxTransmittance) {
46
- let position = (maxTransmittance - transmittance) / (maxTransmittance - minTransmittance);
46
+ const position = (maxTransmittance - transmittance) / (maxTransmittance - minTransmittance);
47
47
  if (position < 0.33) {
48
48
  return 'w';
49
49
  }
@@ -9,7 +9,7 @@ exports.irMeasurementEnhancer = void 0;
9
9
  function irMeasurementEnhancer(measurement) {
10
10
  for (const datum of measurement.data) {
11
11
  const variables = datum.variables;
12
- let yVariable = variables.y;
12
+ const yVariable = variables.y;
13
13
  let absorbance = true;
14
14
  if (yVariable.label.toLowerCase().includes('trans')) {
15
15
  absorbance = false;
@@ -20,8 +20,7 @@ async function cdfLoader(fileCollection, logs) {
20
20
  kind = 'gclcms';
21
21
  }
22
22
  else if (reader.dataVariableExists('ordinate_values') &&
23
- reader.getAttribute('detector_name') &&
24
- reader.getAttribute('detector_name').match(/dad|tic/i)) {
23
+ reader.getAttribute('detector_name')?.match(/dad|tic/i)) {
25
24
  kind = 'gclc';
26
25
  }
27
26
  else {
@@ -82,7 +81,7 @@ function chromatogramWithMassSpectra(reader) {
82
81
  allIntensities.push(intensities);
83
82
  allMasses.push(masses);
84
83
  }
85
- let data = [];
84
+ const data = [];
86
85
  for (let i = 0; i < times.length; i++) {
87
86
  data.push({
88
87
  info: {
@@ -109,7 +108,7 @@ function chromatogramWithMassSpectra(reader) {
109
108
  }
110
109
  function chromatogram(reader) {
111
110
  // Taken from: https://github.com/cheminfo/netcdf-gcms
112
- let data = [];
111
+ const data = [];
113
112
  const intensities = reader.getDataVariable('ordinate_values');
114
113
  const numberPoints = intensities.length;
115
114
  const detector = reader.getAttribute('detector_name');
@@ -137,7 +136,7 @@ function chromatogram(reader) {
137
136
  else {
138
137
  samplingInterval = (runtimeLength - delayTime) / numberPoints;
139
138
  }
140
- let times = [];
139
+ const times = [];
141
140
  let time = delayTime;
142
141
  for (let i = 0; i < numberPoints; i++) {
143
142
  times.push(time);
@@ -88,7 +88,7 @@ function normalizeSpectra(spectra) {
88
88
  };
89
89
  }
90
90
  else {
91
- for (let key in variables) {
91
+ for (const key in variables) {
92
92
  const variable = variables[key];
93
93
  if (variable.label)
94
94
  continue;
@@ -6,7 +6,7 @@ const index_1 = require("../index");
6
6
  const measurementLoader_1 = require("./utility/measurementLoader");
7
7
  async function loadMeasurements(fileCollection, options = {}) {
8
8
  const measurements = {};
9
- let logs = [];
9
+ const logs = [];
10
10
  const { loaders = [], enhancers = {}, logger = true } = options;
11
11
  for (const loader of loaders) {
12
12
  const loaderData = await loader(fileCollection, logger ? logs : undefined);
@@ -50,7 +50,7 @@ function normalizeSpectra(blocks) {
50
50
  const results = [];
51
51
  for (let i = 0; i < yVariables.length; i++) {
52
52
  const yVariable = yVariables[i];
53
- let origin = origins[i] || {};
53
+ const origin = origins[i] || {};
54
54
  results.push({
55
55
  variables: { x: getXVariable(blocks), y: yVariable },
56
56
  meta: { ...origin },
@@ -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) {
@@ -57,7 +64,7 @@ function getFirstSelectedMeasurementData(state) {
57
64
  }
58
65
  exports.getFirstSelectedMeasurementData = getFirstSelectedMeasurementData;
59
66
  function getMeasurementKindAndId(data, measurementId) {
60
- for (let kind of kinds_1.measurementKinds) {
67
+ for (const kind of kinds_1.measurementKinds) {
61
68
  const measurement = getMeasurement(data.measurements, kind, measurementId);
62
69
  if (measurement)
63
70
  return { kind, id: measurementId };
@@ -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) {
@@ -85,7 +109,7 @@ function getSelectedMeasurementOrFail(view) {
85
109
  exports.getSelectedMeasurementOrFail = getSelectedMeasurementOrFail;
86
110
  function* iterateMeasurementEntries(measurements) {
87
111
  for (const [measurementKind, measurementData] of Object.entries(measurements)) {
88
- for (let measurement of measurementData.entries) {
112
+ for (const measurement of measurementData.entries) {
89
113
  yield { kind: measurementKind, measurement };
90
114
  }
91
115
  }
@@ -94,7 +118,7 @@ exports.iterateMeasurementEntries = iterateMeasurementEntries;
94
118
  function* iterateKindMeasurementsAndView(state, kind) {
95
119
  const measurements = state.data.measurements[kind];
96
120
  const view = state.view.measurements;
97
- for (let measurement of measurements.entries) {
121
+ for (const measurement of measurements.entries) {
98
122
  yield { measurement, view: view[measurement.id] };
99
123
  }
100
124
  }
@@ -71,7 +71,7 @@ function useAccordionContext(title, defaultOpened) {
71
71
  utils.create(title, defaultOpened);
72
72
  return () => utils.remove(title);
73
73
  }, [defaultOpened, title, utils]);
74
- let item = getItem(title, state.items);
74
+ const item = getItem(title, state.items);
75
75
  return (0, react_1.useMemo)(() => ({
76
76
  item,
77
77
  utils: {
@@ -29,6 +29,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
29
29
  exports.GradientSelect = exports.fixedGradientScales = void 0;
30
30
  const jsx_runtime_1 = require("react/jsx-runtime");
31
31
  const styled_1 = __importDefault(require("@emotion/styled"));
32
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment, @typescript-eslint/prefer-ts-expect-error
33
+ // @ts-ignore This import fails when compiling to CJS.
32
34
  const react_1 = require("@headlessui/react");
33
35
  const scaleChromatic = __importStar(require("d3-scale-chromatic"));
34
36
  const react_2 = require("react");
@@ -7,7 +7,7 @@ const UP_KEY_CODE = 38;
7
7
  const DOWN_KEY_CODE = 40;
8
8
  const VALID_KEY_CODES = new Set([UP_KEY_CODE, DOWN_KEY_CODE]);
9
9
  const isValidKeyCode = (keyCode) => VALID_KEY_CODES.has(keyCode);
10
- const getNumberValue = (value) => Number(String(value).replace(/%/g, ''));
10
+ const getNumberValue = (value) => Number(String(value).replaceAll('%', ''));
11
11
  let idCounter = 1;
12
12
  const styles = {
13
13
  wrap: {
@@ -2,6 +2,8 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.DropdownMenu = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment, @typescript-eslint/prefer-ts-expect-error
6
+ // @ts-ignore This import fails when compiling to CJS.
5
7
  const react_1 = require("@headlessui/react");
6
8
  const react_2 = require("react");
7
9
  const useModifiedPopper_1 = require("../hooks/useModifiedPopper");
@@ -6,6 +6,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.MenuItems = void 0;
7
7
  const jsx_runtime_1 = require("react/jsx-runtime");
8
8
  const styled_1 = __importDefault(require("@emotion/styled"));
9
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment, @typescript-eslint/prefer-ts-expect-error
10
+ // @ts-ignore This import fails when compiling to CJS.
9
11
  const react_1 = require("@headlessui/react");
10
12
  const ItemDiv = styled_1.default.div `
11
13
  display: contents;
@@ -39,7 +41,9 @@ const ItemsDiv = styled_1.default.div `
39
41
  align-items: center;
40
42
  border-radius: 6px;
41
43
  background-color: white;
42
- box-shadow: rgba(0, 0, 0, 0.3) 0px 19px 38px, rgba(0, 0, 0, 0.22) 0px 5px 12px;
44
+ box-shadow:
45
+ rgba(0, 0, 0, 0.3) 0px 19px 38px,
46
+ rgba(0, 0, 0, 0.22) 0px 5px 12px;
43
47
  padding-top: 5px;
44
48
  padding-bottom: 5px;
45
49
  --cell-padding: 16px;