react-science 3.1.0 → 4.1.0

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 (236) hide show
  1. package/lib/app/hooks/file-loading.d.ts +3 -2
  2. package/lib/app/hooks/file-loading.d.ts.map +1 -1
  3. package/lib/app/hooks/file-loading.js +12 -12
  4. package/lib/app/hooks/file-loading.js.map +1 -1
  5. package/lib/app/panels/SignalProcessingPanel.js +1 -1
  6. package/lib/app/panels/SignalProcessingPanel.js.map +1 -1
  7. package/lib/app-data/loaders/biologicLoader.d.ts +2 -2
  8. package/lib/app-data/loaders/biologicLoader.d.ts.map +1 -1
  9. package/lib/app-data/loaders/biologicLoader.js +4 -4
  10. package/lib/app-data/loaders/biologicLoader.js.map +1 -1
  11. package/lib/app-data/loaders/cdfLoader.d.ts +2 -2
  12. package/lib/app-data/loaders/cdfLoader.d.ts.map +1 -1
  13. package/lib/app-data/loaders/cdfLoader.js +6 -9
  14. package/lib/app-data/loaders/cdfLoader.js.map +1 -1
  15. package/lib/app-data/loaders/jcampLoader.d.ts +2 -2
  16. package/lib/app-data/loaders/jcampLoader.d.ts.map +1 -1
  17. package/lib/app-data/loaders/jcampLoader.js +10 -13
  18. package/lib/app-data/loaders/jcampLoader.js.map +1 -1
  19. package/lib/app-data/loaders/loadMeasurements.d.ts +4 -3
  20. package/lib/app-data/loaders/loadMeasurements.d.ts.map +1 -1
  21. package/lib/app-data/loaders/loadMeasurements.js +3 -3
  22. package/lib/app-data/loaders/loadMeasurements.js.map +1 -1
  23. package/lib/app-data/loaders/proprietary/agilent/cary500Loader.d.ts +3 -2
  24. package/lib/app-data/loaders/proprietary/agilent/cary500Loader.d.ts.map +1 -1
  25. package/lib/app-data/loaders/proprietary/agilent/cary500Loader.js +4 -9
  26. package/lib/app-data/loaders/proprietary/agilent/cary500Loader.js.map +1 -1
  27. package/lib/app-data/loaders/spcLoader.d.ts +2 -2
  28. package/lib/app-data/loaders/spcLoader.d.ts.map +1 -1
  29. package/lib/app-data/loaders/spcLoader.js +3 -8
  30. package/lib/app-data/loaders/spcLoader.js.map +1 -1
  31. package/lib/app-data/loaders/utility/measurementLoader.d.ts +2 -2
  32. package/lib/app-data/loaders/utility/measurementLoader.d.ts.map +1 -1
  33. package/lib/app-data/loaders/utility/measurementLoader.js.map +1 -1
  34. package/lib/app-data/loaders/wdfLoader.d.ts +2 -2
  35. package/lib/app-data/loaders/wdfLoader.d.ts.map +1 -1
  36. package/lib/app-data/loaders/wdfLoader.js +3 -9
  37. package/lib/app-data/loaders/wdfLoader.js.map +1 -1
  38. package/lib/components/button/Button.d.ts +1 -1
  39. package/lib/components/button/Button.d.ts.map +1 -1
  40. package/lib/components/button/Button.js +3 -2
  41. package/lib/components/button/Button.js.map +1 -1
  42. package/lib/components/color-picker/gradient-select/GradientSelect.d.ts +1 -1
  43. package/lib/components/color-picker/gradient-select/GradientSelect.d.ts.map +1 -1
  44. package/lib/components/color-picker/gradient-select/GradientSelect.js +45 -23
  45. package/lib/components/color-picker/gradient-select/GradientSelect.js.map +1 -1
  46. package/lib/components/hooks/useSelect.d.ts +7 -5
  47. package/lib/components/hooks/useSelect.d.ts.map +1 -1
  48. package/lib/components/hooks/useSelect.js +3 -1
  49. package/lib/components/hooks/useSelect.js.map +1 -1
  50. package/lib/components/index.d.ts +2 -1
  51. package/lib/components/index.d.ts.map +1 -1
  52. package/lib/components/index.js +2 -1
  53. package/lib/components/index.js.map +1 -1
  54. package/lib/components/info-panel/InfoPanel.d.ts.map +1 -1
  55. package/lib/components/info-panel/InfoPanel.js +78 -20
  56. package/lib/components/info-panel/InfoPanel.js.map +1 -1
  57. package/lib/components/logger/FifoLoggerDialog.d.ts +10 -0
  58. package/lib/components/logger/FifoLoggerDialog.d.ts.map +1 -0
  59. package/lib/components/logger/FifoLoggerDialog.js +55 -0
  60. package/lib/components/logger/FifoLoggerDialog.js.map +1 -0
  61. package/lib/components/logger/FifoLoggerProvider.d.ts +7 -0
  62. package/lib/components/logger/FifoLoggerProvider.d.ts.map +1 -0
  63. package/lib/components/logger/FifoLoggerProvider.js +10 -0
  64. package/lib/components/logger/FifoLoggerProvider.js.map +1 -0
  65. package/lib/components/logger/FifoLoggerToolbarItem.d.ts +2 -0
  66. package/lib/components/logger/FifoLoggerToolbarItem.d.ts.map +1 -0
  67. package/lib/components/logger/FifoLoggerToolbarItem.js +39 -0
  68. package/lib/components/logger/FifoLoggerToolbarItem.js.map +1 -0
  69. package/lib/components/logger/index.d.ts +5 -0
  70. package/lib/components/logger/index.d.ts.map +1 -0
  71. package/lib/components/logger/index.js +21 -0
  72. package/lib/components/logger/index.js.map +1 -0
  73. package/lib/components/logger/loggerContext.d.ts +4 -0
  74. package/lib/components/logger/loggerContext.d.ts.map +1 -0
  75. package/lib/components/logger/loggerContext.js +6 -0
  76. package/lib/components/logger/loggerContext.js.map +1 -0
  77. package/lib/components/logger/useFifoLogger.d.ts +3 -0
  78. package/lib/components/logger/useFifoLogger.d.ts.map +1 -0
  79. package/lib/components/logger/useFifoLogger.js +25 -0
  80. package/lib/components/logger/useFifoLogger.js.map +1 -0
  81. package/lib/components/table/Table.d.ts +4 -3
  82. package/lib/components/table/Table.d.ts.map +1 -1
  83. package/lib/components/table/Table.js +2 -2
  84. package/lib/components/table/Table.js.map +1 -1
  85. package/lib/components/table/TableHeader.d.ts +3 -1
  86. package/lib/components/table/TableHeader.d.ts.map +1 -1
  87. package/lib/components/table/TableHeader.js +8 -2
  88. package/lib/components/table/TableHeader.js.map +1 -1
  89. package/lib/components/table/TableRow.d.ts +1 -1
  90. package/lib/components/table/TableRow.d.ts.map +1 -1
  91. package/lib/components/table/TableRow.js +9 -22
  92. package/lib/components/table/TableRow.js.map +1 -1
  93. package/lib/components/table/tableContext.d.ts +0 -2
  94. package/lib/components/table/tableContext.d.ts.map +1 -1
  95. package/lib/components/table/tableContext.js +1 -1
  96. package/lib/components/table/tableContext.js.map +1 -1
  97. package/lib/components/toolbar/TooltipHelpContent.d.ts +11 -0
  98. package/lib/components/toolbar/TooltipHelpContent.d.ts.map +1 -0
  99. package/lib/components/toolbar/TooltipHelpContent.js +102 -0
  100. package/lib/components/toolbar/TooltipHelpContent.js.map +1 -0
  101. package/lib/components/toolbar/index.d.ts +1 -0
  102. package/lib/components/toolbar/index.d.ts.map +1 -1
  103. package/lib/components/toolbar/index.js +1 -0
  104. package/lib/components/toolbar/index.js.map +1 -1
  105. package/lib-esm/app/hooks/file-loading.d.ts +3 -2
  106. package/lib-esm/app/hooks/file-loading.d.ts.map +1 -1
  107. package/lib-esm/app/hooks/file-loading.js +9 -9
  108. package/lib-esm/app/hooks/file-loading.js.map +1 -1
  109. package/lib-esm/app/panels/SignalProcessingPanel.js +1 -1
  110. package/lib-esm/app/panels/SignalProcessingPanel.js.map +1 -1
  111. package/lib-esm/app-data/loaders/biologicLoader.d.ts +2 -2
  112. package/lib-esm/app-data/loaders/biologicLoader.d.ts.map +1 -1
  113. package/lib-esm/app-data/loaders/biologicLoader.js +4 -4
  114. package/lib-esm/app-data/loaders/biologicLoader.js.map +1 -1
  115. package/lib-esm/app-data/loaders/cdfLoader.d.ts +2 -2
  116. package/lib-esm/app-data/loaders/cdfLoader.d.ts.map +1 -1
  117. package/lib-esm/app-data/loaders/cdfLoader.js +6 -9
  118. package/lib-esm/app-data/loaders/cdfLoader.js.map +1 -1
  119. package/lib-esm/app-data/loaders/jcampLoader.d.ts +2 -2
  120. package/lib-esm/app-data/loaders/jcampLoader.d.ts.map +1 -1
  121. package/lib-esm/app-data/loaders/jcampLoader.js +10 -13
  122. package/lib-esm/app-data/loaders/jcampLoader.js.map +1 -1
  123. package/lib-esm/app-data/loaders/loadMeasurements.d.ts +4 -3
  124. package/lib-esm/app-data/loaders/loadMeasurements.d.ts.map +1 -1
  125. package/lib-esm/app-data/loaders/loadMeasurements.js +3 -3
  126. package/lib-esm/app-data/loaders/loadMeasurements.js.map +1 -1
  127. package/lib-esm/app-data/loaders/proprietary/agilent/cary500Loader.d.ts +3 -2
  128. package/lib-esm/app-data/loaders/proprietary/agilent/cary500Loader.d.ts.map +1 -1
  129. package/lib-esm/app-data/loaders/proprietary/agilent/cary500Loader.js +5 -10
  130. package/lib-esm/app-data/loaders/proprietary/agilent/cary500Loader.js.map +1 -1
  131. package/lib-esm/app-data/loaders/spcLoader.d.ts +2 -2
  132. package/lib-esm/app-data/loaders/spcLoader.d.ts.map +1 -1
  133. package/lib-esm/app-data/loaders/spcLoader.js +4 -9
  134. package/lib-esm/app-data/loaders/spcLoader.js.map +1 -1
  135. package/lib-esm/app-data/loaders/utility/measurementLoader.d.ts +2 -2
  136. package/lib-esm/app-data/loaders/utility/measurementLoader.d.ts.map +1 -1
  137. package/lib-esm/app-data/loaders/utility/measurementLoader.js.map +1 -1
  138. package/lib-esm/app-data/loaders/wdfLoader.d.ts +2 -2
  139. package/lib-esm/app-data/loaders/wdfLoader.d.ts.map +1 -1
  140. package/lib-esm/app-data/loaders/wdfLoader.js +3 -9
  141. package/lib-esm/app-data/loaders/wdfLoader.js.map +1 -1
  142. package/lib-esm/components/button/Button.d.ts +1 -1
  143. package/lib-esm/components/button/Button.d.ts.map +1 -1
  144. package/lib-esm/components/button/Button.js +3 -2
  145. package/lib-esm/components/button/Button.js.map +1 -1
  146. package/lib-esm/components/color-picker/gradient-select/GradientSelect.d.ts +1 -1
  147. package/lib-esm/components/color-picker/gradient-select/GradientSelect.d.ts.map +1 -1
  148. package/lib-esm/components/color-picker/gradient-select/GradientSelect.js +45 -23
  149. package/lib-esm/components/color-picker/gradient-select/GradientSelect.js.map +1 -1
  150. package/lib-esm/components/hooks/useSelect.d.ts +7 -5
  151. package/lib-esm/components/hooks/useSelect.d.ts.map +1 -1
  152. package/lib-esm/components/hooks/useSelect.js +3 -1
  153. package/lib-esm/components/hooks/useSelect.js.map +1 -1
  154. package/lib-esm/components/index.d.ts +2 -1
  155. package/lib-esm/components/index.d.ts.map +1 -1
  156. package/lib-esm/components/index.js +2 -1
  157. package/lib-esm/components/index.js.map +1 -1
  158. package/lib-esm/components/info-panel/InfoPanel.d.ts.map +1 -1
  159. package/lib-esm/components/info-panel/InfoPanel.js +52 -17
  160. package/lib-esm/components/info-panel/InfoPanel.js.map +1 -1
  161. package/lib-esm/components/logger/FifoLoggerDialog.d.ts +10 -0
  162. package/lib-esm/components/logger/FifoLoggerDialog.d.ts.map +1 -0
  163. package/lib-esm/components/logger/FifoLoggerDialog.js +48 -0
  164. package/lib-esm/components/logger/FifoLoggerDialog.js.map +1 -0
  165. package/lib-esm/components/logger/FifoLoggerProvider.d.ts +7 -0
  166. package/lib-esm/components/logger/FifoLoggerProvider.d.ts.map +1 -0
  167. package/lib-esm/components/logger/FifoLoggerProvider.js +6 -0
  168. package/lib-esm/components/logger/FifoLoggerProvider.js.map +1 -0
  169. package/lib-esm/components/logger/FifoLoggerToolbarItem.d.ts +2 -0
  170. package/lib-esm/components/logger/FifoLoggerToolbarItem.d.ts.map +1 -0
  171. package/lib-esm/components/logger/FifoLoggerToolbarItem.js +35 -0
  172. package/lib-esm/components/logger/FifoLoggerToolbarItem.js.map +1 -0
  173. package/lib-esm/components/logger/index.d.ts +5 -0
  174. package/lib-esm/components/logger/index.d.ts.map +1 -0
  175. package/lib-esm/components/logger/index.js +5 -0
  176. package/lib-esm/components/logger/index.js.map +1 -0
  177. package/lib-esm/components/logger/loggerContext.d.ts +4 -0
  178. package/lib-esm/components/logger/loggerContext.d.ts.map +1 -0
  179. package/lib-esm/components/logger/loggerContext.js +3 -0
  180. package/lib-esm/components/logger/loggerContext.js.map +1 -0
  181. package/lib-esm/components/logger/useFifoLogger.d.ts +3 -0
  182. package/lib-esm/components/logger/useFifoLogger.d.ts.map +1 -0
  183. package/lib-esm/components/logger/useFifoLogger.js +20 -0
  184. package/lib-esm/components/logger/useFifoLogger.js.map +1 -0
  185. package/lib-esm/components/table/Table.d.ts +4 -3
  186. package/lib-esm/components/table/Table.d.ts.map +1 -1
  187. package/lib-esm/components/table/Table.js +2 -2
  188. package/lib-esm/components/table/Table.js.map +1 -1
  189. package/lib-esm/components/table/TableHeader.d.ts +3 -1
  190. package/lib-esm/components/table/TableHeader.d.ts.map +1 -1
  191. package/lib-esm/components/table/TableHeader.js +8 -2
  192. package/lib-esm/components/table/TableHeader.js.map +1 -1
  193. package/lib-esm/components/table/TableRow.d.ts +1 -1
  194. package/lib-esm/components/table/TableRow.d.ts.map +1 -1
  195. package/lib-esm/components/table/TableRow.js +6 -19
  196. package/lib-esm/components/table/TableRow.js.map +1 -1
  197. package/lib-esm/components/table/tableContext.d.ts +0 -2
  198. package/lib-esm/components/table/tableContext.d.ts.map +1 -1
  199. package/lib-esm/components/table/tableContext.js +1 -1
  200. package/lib-esm/components/table/tableContext.js.map +1 -1
  201. package/lib-esm/components/toolbar/TooltipHelpContent.d.ts +11 -0
  202. package/lib-esm/components/toolbar/TooltipHelpContent.d.ts.map +1 -0
  203. package/lib-esm/components/toolbar/TooltipHelpContent.js +95 -0
  204. package/lib-esm/components/toolbar/TooltipHelpContent.js.map +1 -0
  205. package/lib-esm/components/toolbar/index.d.ts +1 -0
  206. package/lib-esm/components/toolbar/index.d.ts.map +1 -1
  207. package/lib-esm/components/toolbar/index.js +1 -0
  208. package/lib-esm/components/toolbar/index.js.map +1 -1
  209. package/package.json +15 -13
  210. package/src/app/hooks/file-loading.ts +12 -10
  211. package/src/app/panels/SignalProcessingPanel.tsx +1 -1
  212. package/src/app-data/loaders/biologicLoader.ts +6 -5
  213. package/src/app-data/loaders/cdfLoader.ts +8 -13
  214. package/src/app-data/loaders/jcampLoader.ts +11 -15
  215. package/src/app-data/loaders/loadMeasurements.ts +6 -5
  216. package/src/app-data/loaders/proprietary/agilent/cary500Loader.ts +8 -16
  217. package/src/app-data/loaders/spcLoader.ts +6 -12
  218. package/src/app-data/loaders/utility/measurementLoader.ts +2 -3
  219. package/src/app-data/loaders/wdfLoader.ts +5 -12
  220. package/src/components/button/Button.tsx +12 -5
  221. package/src/components/color-picker/gradient-select/GradientSelect.tsx +82 -46
  222. package/src/components/hooks/useSelect.tsx +13 -8
  223. package/src/components/index.ts +2 -1
  224. package/src/components/info-panel/InfoPanel.tsx +88 -49
  225. package/src/components/logger/FifoLoggerDialog.tsx +129 -0
  226. package/src/components/logger/FifoLoggerProvider.tsx +15 -0
  227. package/src/components/logger/FifoLoggerToolbarItem.tsx +59 -0
  228. package/src/components/logger/index.ts +4 -0
  229. package/src/components/logger/loggerContext.ts +4 -0
  230. package/src/components/logger/useFifoLogger.ts +22 -0
  231. package/src/components/table/Table.tsx +1 -6
  232. package/src/components/table/TableHeader.tsx +15 -3
  233. package/src/components/table/TableRow.tsx +4 -23
  234. package/src/components/table/tableContext.ts +1 -1
  235. package/src/components/toolbar/TooltipHelpContent.tsx +173 -0
  236. package/src/components/toolbar/index.ts +1 -0
@@ -1,11 +1,11 @@
1
1
  import { parseMPR, parseMPT } from 'biologic-converter';
2
2
  import type { MeasurementVariable } from 'cheminfo-types';
3
+ import type { FifoLogger } from 'fifo-logger';
3
4
  import type { FileCollection } from 'filelist-utils';
4
5
 
5
- import type { Measurements, MeasurementBase } from '../index';
6
+ import type { MeasurementBase, Measurements } from '../index';
6
7
 
7
8
  import { getMeasurementInfoFromFile } from './utility/getMeasurementInfoFromFile';
8
- import { createLogEntry, ParserLog } from './utility/parserLog';
9
9
 
10
10
  /* the MeasurementBase has got a data key,
11
11
  and inside a variable key, compatible with this type */
@@ -18,7 +18,7 @@ type MeasurementDataVariable = Record<string, MeasurementVariable>;
18
18
  */
19
19
  export async function biologicLoader(
20
20
  fileCollection: FileCollection,
21
- logs?: ParserLog[],
21
+ logger?: FifoLogger,
22
22
  ): Promise<Partial<Measurements>> {
23
23
  const measurements: Partial<Measurements> = {};
24
24
  const entries: MeasurementBase[] = [];
@@ -67,14 +67,15 @@ export async function biologicLoader(
67
67
  } catch (error) {
68
68
  //send error to UI to show to User ?
69
69
  if (error instanceof Error) {
70
- if (logs) {
71
- logs.push(createLogEntry({ error, relativePath: file.relativePath }));
70
+ if (logger) {
71
+ logger.error(error);
72
72
  } else {
73
73
  throw error;
74
74
  }
75
75
  }
76
76
  }
77
77
  }
78
+ logger?.debug(`Loaded ${entries.length} entries with biologicLoader`);
78
79
  measurements.iv = { entries };
79
80
  return measurements;
80
81
  }
@@ -1,18 +1,19 @@
1
+ import type { FifoLogger } from 'fifo-logger';
1
2
  import type { FileCollection } from 'filelist-utils';
2
3
  import { NetCDFReader } from 'netcdfjs';
3
4
 
4
5
  import { assert } from '../../components/index';
5
- import type { MeasurementBase, Measurements, MeasurementKind } from '../index';
6
+ import type { MeasurementBase, MeasurementKind, Measurements } from '../index';
6
7
 
7
8
  import { getMeasurementInfoFromFile } from './utility/getMeasurementInfoFromFile';
8
- import { ParserLog, createLogEntry } from './utility/parserLog';
9
9
 
10
10
  export async function cdfLoader(
11
11
  fileCollection: FileCollection,
12
- logs?: ParserLog[],
12
+ logger?: FifoLogger,
13
13
  ): Promise<Partial<Measurements>> {
14
14
  const newMeasurements: Partial<Measurements> = {};
15
15
  let kind: MeasurementKind | undefined;
16
+ let count = 0;
16
17
  for (const file of fileCollection) {
17
18
  if (/\.cdf$/i.test(file.name)) {
18
19
  try {
@@ -57,18 +58,12 @@ export async function cdfLoader(
57
58
  : chromatogram(reader),
58
59
  };
59
60
  newMeasurements[kind]?.entries.push(newMeasurement);
61
+ count++;
60
62
  } catch (error) {
61
63
  if (error instanceof Error) {
62
64
  //send error to UI ?
63
- if (logs) {
64
- logs.push(
65
- createLogEntry({
66
- error,
67
- parser: 'cdfLoader',
68
- message: 'error parsing file from cdfLoader',
69
- relativePath: file.relativePath,
70
- }),
71
- );
65
+ if (logger) {
66
+ logger.error(error);
72
67
  } else {
73
68
  throw error;
74
69
  }
@@ -76,7 +71,7 @@ export async function cdfLoader(
76
71
  }
77
72
  }
78
73
  }
79
-
74
+ logger?.debug(`Loaded ${count} measurements with cdfLoader`);
80
75
  return newMeasurements;
81
76
  }
82
77
 
@@ -1,3 +1,4 @@
1
+ import type { FifoLogger } from 'fifo-logger';
1
2
  import type { FileCollection } from 'filelist-utils';
2
3
  import { convert } from 'jcampconverter';
3
4
 
@@ -5,7 +6,6 @@ import { assert } from '../../components/index';
5
6
  import type { MeasurementKind, Measurements } from '../index';
6
7
 
7
8
  import { getMeasurementInfoFromFile } from './utility/getMeasurementInfoFromFile';
8
- import { createLogEntry, ParserLog } from './utility/parserLog';
9
9
 
10
10
  /**
11
11
  *
@@ -15,8 +15,9 @@ import { createLogEntry, ParserLog } from './utility/parserLog';
15
15
  */
16
16
  export async function jcampLoader(
17
17
  fileCollection: FileCollection,
18
- logs?: ParserLog[],
18
+ logger?: FifoLogger,
19
19
  ): Promise<Partial<Measurements>> {
20
+ let count = 0;
20
21
  const newMeasurements: Partial<Measurements> = {};
21
22
  for (const file of fileCollection) {
22
23
  if (/(?:\.jdx|\.dx)$/i.test(file.name)) {
@@ -50,22 +51,15 @@ export async function jcampLoader(
50
51
  meta: measurement.meta,
51
52
  data: normalizeSpectra(measurement.spectra),
52
53
  };
54
+ count++;
53
55
  Object.assign(newMeasurement.info, measurement.info);
54
56
  newMeasurements[kind]?.entries.push(newMeasurement);
55
57
  }
56
58
  }
57
59
  } catch (error) {
58
- // send error to UI ?
59
60
  if (error instanceof Error) {
60
- if (logs) {
61
- logs.push(
62
- createLogEntry({
63
- error,
64
- parser: 'jcamp converter',
65
- relativePath: file.relativePath,
66
- message: 'error parsing jdx or dx file',
67
- }),
68
- );
61
+ if (logger) {
62
+ logger?.error(error);
69
63
  } else {
70
64
  throw error;
71
65
  }
@@ -74,6 +68,7 @@ export async function jcampLoader(
74
68
  }
75
69
  }
76
70
 
71
+ logger?.debug(`Loaded ${count} measurements with jcampLoader`);
77
72
  return newMeasurements;
78
73
  }
79
74
 
@@ -97,10 +92,11 @@ function normalizeSpectra(spectra: any) {
97
92
  for (const key in variables) {
98
93
  const variable = variables[key];
99
94
  if (variable.label) continue;
100
- variable.label = variable.name || variable.symbol || key;
101
- if (variable.units && !variable.label.includes(variable.units)) {
102
- variable.label += ` [${variable.units}]`;
95
+ let label: string = variable.name || variable.symbol || key;
96
+ if (variable.units && !label.includes(variable.units)) {
97
+ label += ` [${variable.units}]`;
103
98
  }
99
+ variable.label = label;
104
100
  }
105
101
  }
106
102
  data.push({ variables });
@@ -1,7 +1,8 @@
1
+ import type { FifoLogger } from 'fifo-logger';
1
2
  import type { FileCollection } from 'filelist-utils';
2
3
  import { xMinMaxValues } from 'ml-spectra-processing';
3
4
 
4
- import { Measurements, enhance, Enhancers, MeasurementBase } from '../index';
5
+ import { enhance, Enhancers, MeasurementBase, Measurements } from '../index';
5
6
 
6
7
  import {
7
8
  MeasurementsLoader,
@@ -12,20 +13,20 @@ import type { ParserLog } from './utility/parserLog';
12
13
  export interface LoadOptions {
13
14
  loaders?: MeasurementsLoader[];
14
15
  enhancers?: Partial<Enhancers>;
15
- logger?: boolean;
16
+ logger?: FifoLogger;
16
17
  }
17
18
 
18
19
  export async function loadMeasurements(
19
20
  fileCollection: FileCollection,
20
- options: LoadOptions = {},
21
+ options: LoadOptions,
21
22
  ) {
22
23
  const measurements: Partial<Measurements> = {};
23
24
  const logs: ParserLog[] = [];
24
- const { loaders = [], enhancers = {}, logger = true } = options;
25
+ const { loaders = [], enhancers = {}, logger } = options;
25
26
  for (const loader of loaders) {
26
27
  // TODO: load in parallel
27
28
  // eslint-disable-next-line no-await-in-loop
28
- const loaderData = await loader(fileCollection, logger ? logs : undefined);
29
+ const loaderData = await loader(fileCollection, logger);
29
30
  for (const { entries } of Object.values(loaderData)) {
30
31
  for (const entry of entries) {
31
32
  computeMinMax(entry);
@@ -1,16 +1,15 @@
1
- import type { FileCollectionItem, FileCollection } from 'filelist-utils';
1
+ import type { FifoLogger } from 'fifo-logger';
2
+ import type { FileCollection, FileCollectionItem } from 'filelist-utils';
2
3
 
3
4
  import {
4
- Measurements,
5
- MeasurementBase,
6
5
  getMeasurementInfoFromFile,
7
- ParserLog,
8
- createLogEntry,
6
+ MeasurementBase,
7
+ Measurements,
9
8
  } from '../../../index';
10
9
 
11
10
  export async function cary500Loader(
12
11
  fileCollection: FileCollection,
13
- logs?: ParserLog[],
12
+ logger?: FifoLogger,
14
13
  ): Promise<Partial<Measurements>> {
15
14
  const newMeasurements: Partial<Measurements> = {};
16
15
  const entries: MeasurementBase[] = [];
@@ -26,16 +25,8 @@ export async function cary500Loader(
26
25
  }
27
26
  } catch (error) {
28
27
  if (error instanceof Error) {
29
- if (logs) {
30
- logs.push(
31
- createLogEntry({
32
- kind: 'error',
33
- parser: 'cary500Loader',
34
- message: 'Error parsing cary500 experiment.',
35
- error,
36
- relativePath: file.relativePath,
37
- }),
38
- );
28
+ if (logger) {
29
+ logger.error(error);
39
30
  } else {
40
31
  throw error;
41
32
  }
@@ -43,6 +34,7 @@ export async function cary500Loader(
43
34
  }
44
35
  }
45
36
  }
37
+ logger?.debug(`Loaded ${entries.length} entries with cary500Loader`);
46
38
  newMeasurements.uvvis = { entries };
47
39
  return newMeasurements;
48
40
  }
@@ -1,11 +1,11 @@
1
+ import type { FifoLogger } from 'fifo-logger';
1
2
  import type { FileCollection } from 'filelist-utils';
2
- import { parse, guessSpectraType } from 'spc-parser';
3
+ import { guessSpectraType, parse } from 'spc-parser';
3
4
 
4
5
  import { assert } from '../../components/index';
5
- import type { MeasurementKind, Measurements, MeasurementBase } from '../index';
6
+ import type { MeasurementBase, MeasurementKind, Measurements } from '../index';
6
7
 
7
8
  import { getMeasurementInfoFromFile } from './utility/getMeasurementInfoFromFile';
8
- import { ParserLog, createLogEntry } from './utility/parserLog';
9
9
 
10
10
  /**
11
11
  *
@@ -15,7 +15,7 @@ import { ParserLog, createLogEntry } from './utility/parserLog';
15
15
  */
16
16
  export async function spcLoader(
17
17
  fileCollection: FileCollection,
18
- logs?: ParserLog[],
18
+ logger?: FifoLogger,
19
19
  ): Promise<Partial<Measurements>> {
20
20
  const measurements: Partial<Measurements> = {};
21
21
  for (const file of fileCollection) {
@@ -38,14 +38,8 @@ export async function spcLoader(
38
38
  data: parsed.spectra as unknown as MeasurementBase['data'],
39
39
  });
40
40
  } catch (error) {
41
- if (error instanceof Error && logs) {
42
- logs.push(
43
- createLogEntry({
44
- parser: 'spc-parser',
45
- relativePath: file.relativePath,
46
- error,
47
- }),
48
- );
41
+ if (error instanceof Error && logger) {
42
+ logger.error(error);
49
43
  } else {
50
44
  throw error;
51
45
  }
@@ -1,13 +1,12 @@
1
+ import type { FifoLogger } from 'fifo-logger';
1
2
  import type { FileCollection } from 'filelist-utils';
2
3
 
3
4
  import { assert } from '../../../components/index';
4
5
  import type { MeasurementBase, Measurements } from '../../index';
5
6
 
6
- import type { ParserLog } from './parserLog';
7
-
8
7
  export type MeasurementsLoader = (
9
8
  fileCollection: FileCollection,
10
- logs?: ParserLog[],
9
+ logger?: FifoLogger,
11
10
  ) => Promise<Partial<Measurements>>;
12
11
 
13
12
  export function mergeMeasurements(
@@ -1,11 +1,11 @@
1
1
  import { MeasurementVariable } from 'cheminfo-types';
2
+ import type { FifoLogger } from 'fifo-logger';
2
3
  import type { FileCollection } from 'filelist-utils';
3
4
  import { parse, Wdf } from 'wdf-parser';
4
5
 
5
- import type { Measurements, MeasurementBase } from '../index';
6
+ import type { MeasurementBase, Measurements } from '../index';
6
7
 
7
8
  import { getMeasurementInfoFromFile } from './utility/getMeasurementInfoFromFile';
8
- import { ParserLog, createLogEntry } from './utility/parserLog';
9
9
 
10
10
  /**
11
11
  *
@@ -15,7 +15,7 @@ import { ParserLog, createLogEntry } from './utility/parserLog';
15
15
  */
16
16
  export async function wdfLoader(
17
17
  fileCollection: FileCollection,
18
- logs?: ParserLog[],
18
+ logger?: FifoLogger,
19
19
  ): Promise<Partial<Measurements>> {
20
20
  const measurements: Partial<Measurements> = {};
21
21
  const entries: MeasurementBase[] = [];
@@ -33,15 +33,8 @@ export async function wdfLoader(
33
33
  });
34
34
  } catch (error) {
35
35
  if (error instanceof Error) {
36
- if (logs) {
37
- logs.push(
38
- createLogEntry({
39
- parser: 'wdf',
40
- error,
41
- message: 'error reading wdf file',
42
- relativePath: file.relativePath,
43
- }),
44
- );
36
+ if (logger) {
37
+ logger.error(error);
45
38
  } else {
46
39
  throw error;
47
40
  }
@@ -18,21 +18,28 @@ type BlueprintProps = {
18
18
  BlueprintAnchorButtonProps[key];
19
19
  };
20
20
  export type ButtonProps = BlueprintProps & {
21
- tooltipProps?: Omit<TooltipProps, 'children'>;
21
+ tooltipProps?: Partial<Omit<TooltipProps, 'children'>>;
22
22
  tag?: ReactNode;
23
23
  tagProps?: Omit<TagProps, 'children'>;
24
24
  };
25
25
 
26
26
  export function Button(props: ButtonProps) {
27
- const { tooltipProps, children, tag, tagProps, ...buttonProps } = props;
28
-
27
+ const { tooltipProps = {}, children, tag, tagProps, ...buttonProps } = props;
28
+ const {
29
+ fill,
30
+ content = '',
31
+ disabled = !tooltipProps.content,
32
+ ...otherToolTipProps
33
+ } = tooltipProps;
29
34
  const InnerButton = buttonProps.disabled
30
35
  ? BlueprintAnchorButton
31
36
  : BlueprintButton;
32
37
  return (
33
38
  <Tooltip
34
- fill={tooltipProps?.fill || buttonProps.fill}
35
- {...tooltipProps}
39
+ fill={fill || buttonProps.fill}
40
+ disabled={disabled}
41
+ content={content}
42
+ {...otherToolTipProps}
36
43
  renderTarget={({ isOpen, ...targetProps }) => (
37
44
  <div style={{ position: 'relative' }}>
38
45
  {tag && (
@@ -1,9 +1,8 @@
1
+ /** @jsxImportSource @emotion/react */
2
+ import { css } from '@emotion/react';
1
3
  import styled from '@emotion/styled';
2
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment, @typescript-eslint/prefer-ts-expect-error
3
- // @ts-ignore This import fails when compiling to CJS.
4
- import { Listbox } from '@headlessui/react';
4
+ import * as Select from '@radix-ui/react-select';
5
5
  import * as scaleChromatic from 'd3-scale-chromatic';
6
- import { Fragment } from 'react';
7
6
  import { FaChevronDown } from 'react-icons/fa';
8
7
 
9
8
  import FixedGradientPreview from '../preview/FixedGradientPreview';
@@ -24,16 +23,10 @@ const GradientSelectListbox = styled.div`
24
23
  position: relative;
25
24
  width: 100%;
26
25
  border: 1px solid darkgray;
26
+ margin-top: 100px;
27
27
  border-radius: 0.25rem;
28
28
  `;
29
29
 
30
- const GradientSelectButton = styled.button`
31
- position: relative;
32
- width: 100%;
33
- height: 30px;
34
- padding: 3px;
35
- `;
36
-
37
30
  const GradientSelectChevron = styled(FaChevronDown)`
38
31
  position: absolute;
39
32
  height: 100%;
@@ -41,23 +34,11 @@ const GradientSelectChevron = styled(FaChevronDown)`
41
34
  right: 0.5rem;
42
35
  `;
43
36
 
44
- const GradientSelectOptions = styled.ul`
45
- position: absolute;
46
- width: 100%;
47
- margin-top: 5px;
48
- border: 1px solid darkgray;
49
- border-radius: 0.25rem;
50
- padding-inline: 3px;
51
- padding-bottom: 5px;
52
- `;
53
-
54
- const GradientSelectOption = styled.li<{ active: boolean }>`
37
+ const GradientSelectOption = styled.li`
55
38
  display: flex;
56
39
  flex-direction: column;
57
40
  padding-top: 5px;
58
41
  cursor: pointer;
59
- ${(props) => !props.active && 'opacity: 0.8;'}
60
- ${(props) => props.active && 'font-weight: bold;'}
61
42
  `;
62
43
 
63
44
  export interface GradientSelectProps {
@@ -68,27 +49,82 @@ export interface GradientSelectProps {
68
49
  export function GradientSelect(props: GradientSelectProps) {
69
50
  const { value, onChange } = props;
70
51
  return (
71
- <Listbox value={value} onChange={onChange}>
72
- <GradientSelectListbox>
73
- <Listbox.Button as={GradientSelectButton}>
74
- <FixedGradientPreview gradient={value} />
75
- <GradientSelectChevron />
76
- </Listbox.Button>
77
- <Listbox.Options as={GradientSelectOptions}>
78
- {scaleOptions.map((option) => (
79
- <Listbox.Option as={Fragment} key={option} value={option}>
80
- {({ active }) => (
81
- <GradientSelectOption active={active}>
82
- {option}
83
- <div style={{ height: 15 }}>
84
- <FixedGradientPreview gradient={option} />
85
- </div>
86
- </GradientSelectOption>
87
- )}
88
- </Listbox.Option>
89
- ))}
90
- </Listbox.Options>
91
- </GradientSelectListbox>
92
- </Listbox>
52
+ <GradientSelectListbox>
53
+ <Select.Root value={value} onValueChange={onChange}>
54
+ <Select.Trigger
55
+ css={css`
56
+ width: 100%;
57
+ height: 30px;
58
+ padding: 4px;
59
+ `}
60
+ >
61
+ <Select.Value>
62
+ <FixedGradientPreview gradient={value} />
63
+ <GradientSelectChevron />
64
+ </Select.Value>
65
+ </Select.Trigger>
66
+ <Select.Portal>
67
+ <Select.Content
68
+ position="popper"
69
+ sideOffset={10}
70
+ css={css`
71
+ background-color: white;
72
+ width: var(--radix-select-trigger-width);
73
+ border: 1px solid darkgray;
74
+ border-radius: 0.25rem;
75
+ padding: 4px;
76
+ `}
77
+ >
78
+ <Select.Viewport>
79
+ {scaleOptions.map((option) => (
80
+ <Select.Item
81
+ key={option}
82
+ value={option}
83
+ css={css`
84
+ outline: none;
85
+ padding: 8px 0 8px 0;
86
+ cursor: pointer;
87
+ margin-left: 20px;
88
+ &[data-state='checked'] {
89
+ font-weight: bold;
90
+ }
91
+ &[data-state='unchecked'] {
92
+ opacity: 1;
93
+ }
94
+
95
+ &:not([data-highlighted]) span {
96
+ margin-left: 12px;
97
+ }
98
+ &[data-highlighted] {
99
+ span {
100
+ margin-left: 4px;
101
+ }
102
+ ::before {
103
+ content: '';
104
+ display: inline-block;
105
+ width: 8px;
106
+ height: 8px;
107
+ border-radius: 1px;
108
+ filter: brightness(60%);
109
+ background-color: dimgray;
110
+ }
111
+ }
112
+ `}
113
+ >
114
+ <Select.ItemText>
115
+ {option}
116
+ <GradientSelectOption>
117
+ <div style={{ height: 15 }}>
118
+ <FixedGradientPreview gradient={option} />
119
+ </div>
120
+ </GradientSelectOption>
121
+ </Select.ItemText>
122
+ </Select.Item>
123
+ ))}
124
+ </Select.Viewport>
125
+ </Select.Content>
126
+ </Select.Portal>
127
+ </Select.Root>
128
+ </GradientSelectListbox>
93
129
  );
94
130
  }
@@ -1,6 +1,6 @@
1
1
  import { MenuItem } from '@blueprintjs/core';
2
2
  import { ItemRenderer } from '@blueprintjs/select';
3
- import { useState } from 'react';
3
+ import { ReactNode, useState } from 'react';
4
4
 
5
5
  type FilterType<SourceType, Type> = Pick<
6
6
  SourceType,
@@ -9,14 +9,17 @@ type FilterType<SourceType, Type> = Pick<
9
9
  }[keyof SourceType]
10
10
  >;
11
11
 
12
- interface BaseOptions<T> {
13
- itemTextKey: keyof FilterType<T, string>;
12
+ interface ItemOptions<T> {
13
+ renderItem?: (item: T) => ReactNode;
14
14
  defaultSelectedItem?: T;
15
15
  }
16
16
 
17
- interface RenderOptions<T> {
17
+ interface BaseOptions<T> extends ItemOptions<T> {
18
+ itemTextKey: keyof FilterType<T, string>;
19
+ }
20
+
21
+ interface RenderOptions<T> extends ItemOptions<T> {
18
22
  getItemText: (item: T) => string;
19
- defaultSelectedItem?: T;
20
23
  }
21
24
 
22
25
  type SelectOptions<T> = BaseOptions<T> | RenderOptions<T>;
@@ -91,16 +94,18 @@ function getItemRenderer<T>(value: T, options: SelectOptions<T>) {
91
94
  { handleClick, handleFocus, modifiers, index },
92
95
  ) => {
93
96
  const label = getLabel(item, options);
97
+ const { renderItem } = options;
98
+ const { active, disabled } = modifiers;
94
99
  return (
95
100
  <MenuItem
96
- active={modifiers.active}
97
- disabled={modifiers.disabled}
101
+ active={active}
102
+ disabled={disabled}
98
103
  selected={selectedLabel === label}
99
104
  key={index}
100
105
  onClick={handleClick}
101
106
  onFocus={handleFocus}
102
107
  roleStructure="listoption"
103
- text={label}
108
+ text={renderItem?.(item) || label}
104
109
  />
105
110
  );
106
111
  };
@@ -1,13 +1,14 @@
1
1
  export * from './accordion/index';
2
2
  export * from './button/index';
3
3
  export * from './color-picker/index';
4
+ export * from './dialog/index';
4
5
  export * from './drop-zone/index';
5
6
  export * from './forms/index';
6
7
  export * from './fullscreen/index';
7
8
  export * from './header/index';
8
9
  export * from './hooks/index';
9
10
  export * from './info-panel/index';
10
- export * from './dialog/index';
11
+ export * from './logger/index';
11
12
  export * from './root-layout/index';
12
13
  export * from './split-pane/index';
13
14
  export * from './table/index';