react-science 3.1.0 → 4.0.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 (209) 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/index.d.ts +2 -1
  39. package/lib/components/index.d.ts.map +1 -1
  40. package/lib/components/index.js +2 -1
  41. package/lib/components/index.js.map +1 -1
  42. package/lib/components/info-panel/InfoPanel.d.ts.map +1 -1
  43. package/lib/components/info-panel/InfoPanel.js +1 -1
  44. package/lib/components/info-panel/InfoPanel.js.map +1 -1
  45. package/lib/components/logger/FifoLoggerDialog.d.ts +10 -0
  46. package/lib/components/logger/FifoLoggerDialog.d.ts.map +1 -0
  47. package/lib/components/logger/FifoLoggerDialog.js +55 -0
  48. package/lib/components/logger/FifoLoggerDialog.js.map +1 -0
  49. package/lib/components/logger/FifoLoggerProvider.d.ts +7 -0
  50. package/lib/components/logger/FifoLoggerProvider.d.ts.map +1 -0
  51. package/lib/components/logger/FifoLoggerProvider.js +10 -0
  52. package/lib/components/logger/FifoLoggerProvider.js.map +1 -0
  53. package/lib/components/logger/FifoLoggerToolbarItem.d.ts +2 -0
  54. package/lib/components/logger/FifoLoggerToolbarItem.d.ts.map +1 -0
  55. package/lib/components/logger/FifoLoggerToolbarItem.js +39 -0
  56. package/lib/components/logger/FifoLoggerToolbarItem.js.map +1 -0
  57. package/lib/components/logger/index.d.ts +5 -0
  58. package/lib/components/logger/index.d.ts.map +1 -0
  59. package/lib/components/logger/index.js +21 -0
  60. package/lib/components/logger/index.js.map +1 -0
  61. package/lib/components/logger/loggerContext.d.ts +4 -0
  62. package/lib/components/logger/loggerContext.d.ts.map +1 -0
  63. package/lib/components/logger/loggerContext.js +6 -0
  64. package/lib/components/logger/loggerContext.js.map +1 -0
  65. package/lib/components/logger/useFifoLogger.d.ts +3 -0
  66. package/lib/components/logger/useFifoLogger.d.ts.map +1 -0
  67. package/lib/components/logger/useFifoLogger.js +25 -0
  68. package/lib/components/logger/useFifoLogger.js.map +1 -0
  69. package/lib/components/table/Table.d.ts +2 -3
  70. package/lib/components/table/Table.d.ts.map +1 -1
  71. package/lib/components/table/Table.js +2 -2
  72. package/lib/components/table/Table.js.map +1 -1
  73. package/lib/components/table/TableHeader.d.ts +1 -1
  74. package/lib/components/table/TableHeader.d.ts.map +1 -1
  75. package/lib/components/table/TableHeader.js +2 -2
  76. package/lib/components/table/TableHeader.js.map +1 -1
  77. package/lib/components/table/TableRow.d.ts +1 -1
  78. package/lib/components/table/TableRow.d.ts.map +1 -1
  79. package/lib/components/table/TableRow.js +9 -22
  80. package/lib/components/table/TableRow.js.map +1 -1
  81. package/lib/components/table/tableContext.d.ts +0 -2
  82. package/lib/components/table/tableContext.d.ts.map +1 -1
  83. package/lib/components/table/tableContext.js +1 -1
  84. package/lib/components/table/tableContext.js.map +1 -1
  85. package/lib/components/toolbar/TooltipHelpContent.d.ts +11 -0
  86. package/lib/components/toolbar/TooltipHelpContent.d.ts.map +1 -0
  87. package/lib/components/toolbar/TooltipHelpContent.js +102 -0
  88. package/lib/components/toolbar/TooltipHelpContent.js.map +1 -0
  89. package/lib/components/toolbar/index.d.ts +1 -0
  90. package/lib/components/toolbar/index.d.ts.map +1 -1
  91. package/lib/components/toolbar/index.js +1 -0
  92. package/lib/components/toolbar/index.js.map +1 -1
  93. package/lib-esm/app/hooks/file-loading.d.ts +3 -2
  94. package/lib-esm/app/hooks/file-loading.d.ts.map +1 -1
  95. package/lib-esm/app/hooks/file-loading.js +9 -9
  96. package/lib-esm/app/hooks/file-loading.js.map +1 -1
  97. package/lib-esm/app/panels/SignalProcessingPanel.js +1 -1
  98. package/lib-esm/app/panels/SignalProcessingPanel.js.map +1 -1
  99. package/lib-esm/app-data/loaders/biologicLoader.d.ts +2 -2
  100. package/lib-esm/app-data/loaders/biologicLoader.d.ts.map +1 -1
  101. package/lib-esm/app-data/loaders/biologicLoader.js +4 -4
  102. package/lib-esm/app-data/loaders/biologicLoader.js.map +1 -1
  103. package/lib-esm/app-data/loaders/cdfLoader.d.ts +2 -2
  104. package/lib-esm/app-data/loaders/cdfLoader.d.ts.map +1 -1
  105. package/lib-esm/app-data/loaders/cdfLoader.js +6 -9
  106. package/lib-esm/app-data/loaders/cdfLoader.js.map +1 -1
  107. package/lib-esm/app-data/loaders/jcampLoader.d.ts +2 -2
  108. package/lib-esm/app-data/loaders/jcampLoader.d.ts.map +1 -1
  109. package/lib-esm/app-data/loaders/jcampLoader.js +10 -13
  110. package/lib-esm/app-data/loaders/jcampLoader.js.map +1 -1
  111. package/lib-esm/app-data/loaders/loadMeasurements.d.ts +4 -3
  112. package/lib-esm/app-data/loaders/loadMeasurements.d.ts.map +1 -1
  113. package/lib-esm/app-data/loaders/loadMeasurements.js +3 -3
  114. package/lib-esm/app-data/loaders/loadMeasurements.js.map +1 -1
  115. package/lib-esm/app-data/loaders/proprietary/agilent/cary500Loader.d.ts +3 -2
  116. package/lib-esm/app-data/loaders/proprietary/agilent/cary500Loader.d.ts.map +1 -1
  117. package/lib-esm/app-data/loaders/proprietary/agilent/cary500Loader.js +5 -10
  118. package/lib-esm/app-data/loaders/proprietary/agilent/cary500Loader.js.map +1 -1
  119. package/lib-esm/app-data/loaders/spcLoader.d.ts +2 -2
  120. package/lib-esm/app-data/loaders/spcLoader.d.ts.map +1 -1
  121. package/lib-esm/app-data/loaders/spcLoader.js +4 -9
  122. package/lib-esm/app-data/loaders/spcLoader.js.map +1 -1
  123. package/lib-esm/app-data/loaders/utility/measurementLoader.d.ts +2 -2
  124. package/lib-esm/app-data/loaders/utility/measurementLoader.d.ts.map +1 -1
  125. package/lib-esm/app-data/loaders/utility/measurementLoader.js.map +1 -1
  126. package/lib-esm/app-data/loaders/wdfLoader.d.ts +2 -2
  127. package/lib-esm/app-data/loaders/wdfLoader.d.ts.map +1 -1
  128. package/lib-esm/app-data/loaders/wdfLoader.js +3 -9
  129. package/lib-esm/app-data/loaders/wdfLoader.js.map +1 -1
  130. package/lib-esm/components/index.d.ts +2 -1
  131. package/lib-esm/components/index.d.ts.map +1 -1
  132. package/lib-esm/components/index.js +2 -1
  133. package/lib-esm/components/index.js.map +1 -1
  134. package/lib-esm/components/info-panel/InfoPanel.d.ts.map +1 -1
  135. package/lib-esm/components/info-panel/InfoPanel.js +1 -1
  136. package/lib-esm/components/info-panel/InfoPanel.js.map +1 -1
  137. package/lib-esm/components/logger/FifoLoggerDialog.d.ts +10 -0
  138. package/lib-esm/components/logger/FifoLoggerDialog.d.ts.map +1 -0
  139. package/lib-esm/components/logger/FifoLoggerDialog.js +48 -0
  140. package/lib-esm/components/logger/FifoLoggerDialog.js.map +1 -0
  141. package/lib-esm/components/logger/FifoLoggerProvider.d.ts +7 -0
  142. package/lib-esm/components/logger/FifoLoggerProvider.d.ts.map +1 -0
  143. package/lib-esm/components/logger/FifoLoggerProvider.js +6 -0
  144. package/lib-esm/components/logger/FifoLoggerProvider.js.map +1 -0
  145. package/lib-esm/components/logger/FifoLoggerToolbarItem.d.ts +2 -0
  146. package/lib-esm/components/logger/FifoLoggerToolbarItem.d.ts.map +1 -0
  147. package/lib-esm/components/logger/FifoLoggerToolbarItem.js +35 -0
  148. package/lib-esm/components/logger/FifoLoggerToolbarItem.js.map +1 -0
  149. package/lib-esm/components/logger/index.d.ts +5 -0
  150. package/lib-esm/components/logger/index.d.ts.map +1 -0
  151. package/lib-esm/components/logger/index.js +5 -0
  152. package/lib-esm/components/logger/index.js.map +1 -0
  153. package/lib-esm/components/logger/loggerContext.d.ts +4 -0
  154. package/lib-esm/components/logger/loggerContext.d.ts.map +1 -0
  155. package/lib-esm/components/logger/loggerContext.js +3 -0
  156. package/lib-esm/components/logger/loggerContext.js.map +1 -0
  157. package/lib-esm/components/logger/useFifoLogger.d.ts +3 -0
  158. package/lib-esm/components/logger/useFifoLogger.d.ts.map +1 -0
  159. package/lib-esm/components/logger/useFifoLogger.js +20 -0
  160. package/lib-esm/components/logger/useFifoLogger.js.map +1 -0
  161. package/lib-esm/components/table/Table.d.ts +2 -3
  162. package/lib-esm/components/table/Table.d.ts.map +1 -1
  163. package/lib-esm/components/table/Table.js +2 -2
  164. package/lib-esm/components/table/Table.js.map +1 -1
  165. package/lib-esm/components/table/TableHeader.d.ts +1 -1
  166. package/lib-esm/components/table/TableHeader.d.ts.map +1 -1
  167. package/lib-esm/components/table/TableHeader.js +2 -2
  168. package/lib-esm/components/table/TableHeader.js.map +1 -1
  169. package/lib-esm/components/table/TableRow.d.ts +1 -1
  170. package/lib-esm/components/table/TableRow.d.ts.map +1 -1
  171. package/lib-esm/components/table/TableRow.js +6 -19
  172. package/lib-esm/components/table/TableRow.js.map +1 -1
  173. package/lib-esm/components/table/tableContext.d.ts +0 -2
  174. package/lib-esm/components/table/tableContext.d.ts.map +1 -1
  175. package/lib-esm/components/table/tableContext.js +1 -1
  176. package/lib-esm/components/table/tableContext.js.map +1 -1
  177. package/lib-esm/components/toolbar/TooltipHelpContent.d.ts +11 -0
  178. package/lib-esm/components/toolbar/TooltipHelpContent.d.ts.map +1 -0
  179. package/lib-esm/components/toolbar/TooltipHelpContent.js +95 -0
  180. package/lib-esm/components/toolbar/TooltipHelpContent.js.map +1 -0
  181. package/lib-esm/components/toolbar/index.d.ts +1 -0
  182. package/lib-esm/components/toolbar/index.d.ts.map +1 -1
  183. package/lib-esm/components/toolbar/index.js +1 -0
  184. package/lib-esm/components/toolbar/index.js.map +1 -1
  185. package/package.json +7 -5
  186. package/src/app/hooks/file-loading.ts +12 -10
  187. package/src/app/panels/SignalProcessingPanel.tsx +1 -1
  188. package/src/app-data/loaders/biologicLoader.ts +6 -5
  189. package/src/app-data/loaders/cdfLoader.ts +8 -13
  190. package/src/app-data/loaders/jcampLoader.ts +11 -15
  191. package/src/app-data/loaders/loadMeasurements.ts +6 -5
  192. package/src/app-data/loaders/proprietary/agilent/cary500Loader.ts +8 -16
  193. package/src/app-data/loaders/spcLoader.ts +6 -12
  194. package/src/app-data/loaders/utility/measurementLoader.ts +2 -3
  195. package/src/app-data/loaders/wdfLoader.ts +5 -12
  196. package/src/components/index.ts +2 -1
  197. package/src/components/info-panel/InfoPanel.tsx +0 -1
  198. package/src/components/logger/FifoLoggerDialog.tsx +129 -0
  199. package/src/components/logger/FifoLoggerProvider.tsx +15 -0
  200. package/src/components/logger/FifoLoggerToolbarItem.tsx +59 -0
  201. package/src/components/logger/index.ts +4 -0
  202. package/src/components/logger/loggerContext.ts +4 -0
  203. package/src/components/logger/useFifoLogger.ts +22 -0
  204. package/src/components/table/Table.tsx +1 -6
  205. package/src/components/table/TableHeader.tsx +2 -2
  206. package/src/components/table/TableRow.tsx +4 -23
  207. package/src/components/table/tableContext.ts +1 -1
  208. package/src/components/toolbar/TooltipHelpContent.tsx +173 -0
  209. package/src/components/toolbar/index.ts +1 -0
@@ -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
  }
@@ -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';
@@ -160,7 +160,6 @@ export function InfoPanel(props: InfoPanelProps) {
160
160
  {data.map(([key, value]) => (
161
161
  <Table.Row
162
162
  key={key}
163
- bordered
164
163
  style={{
165
164
  height: '10px',
166
165
  padding: '0 !imporant',
@@ -0,0 +1,129 @@
1
+ /** @jsxImportSource @emotion/react */
2
+
3
+ import { Dialog, DialogBody, DialogFooter } from '@blueprintjs/core';
4
+ import { css } from '@emotion/react';
5
+ import styled from '@emotion/styled';
6
+ import type { LogEntry } from 'fifo-logger';
7
+ import { CSSProperties } from 'react';
8
+
9
+ import { Button, Table, useFifoLogger, ValueRenderers } from '../index';
10
+
11
+ const ActionsFooter = styled.div`
12
+ display: flex;
13
+ gap: 3px;
14
+ `;
15
+
16
+ interface RowIndexCellProps {
17
+ pillColor: CSSProperties['backgroundColor'];
18
+ }
19
+
20
+ const RowIndexCell = styled.div<RowIndexCellProps>`
21
+ ::before {
22
+ content: '';
23
+ display: inline-block;
24
+ width: 10px;
25
+ height: 10px;
26
+ margin-right: 5px;
27
+ border-radius: 7px;
28
+ filter: brightness(60%);
29
+ background-color: ${({ pillColor }) => pillColor};
30
+ }
31
+ `;
32
+
33
+ export interface FifoLoggerDialogProps {
34
+ isOpen: boolean;
35
+ onClose: () => void;
36
+ logs: LogEntry[];
37
+ unseen: number;
38
+ }
39
+
40
+ export function FifoLoggerDialog(props: FifoLoggerDialogProps) {
41
+ const logger = useFifoLogger();
42
+ return (
43
+ <Dialog
44
+ shouldReturnFocusOnClose={false}
45
+ isOpen={props.isOpen}
46
+ onClose={props.onClose}
47
+ title="Logs"
48
+ icon="info-sign"
49
+ css={css`
50
+ min-width: 800px;
51
+ min-height: 500px;
52
+ max-height: 80vh;
53
+ max-width: 1000px;
54
+ `}
55
+ >
56
+ <DialogBody>
57
+ <Table
58
+ compact
59
+ bordered
60
+ css={css`
61
+ width: 100%;
62
+ `}
63
+ >
64
+ <Table.Header>
65
+ <ValueRenderers.Header value="#" />
66
+ <ValueRenderers.Header value="Time" />
67
+ <ValueRenderers.Header value="Level" />
68
+ <ValueRenderers.Header value="Message" />
69
+ </Table.Header>
70
+ {props.logs.map((logEntry, idx) => (
71
+ <Table.Row
72
+ key={logEntry.id}
73
+ style={{
74
+ backgroundColor: rowBackgroundColor[logEntry.levelLabel],
75
+ }}
76
+ >
77
+ <ValueRenderers.Component>
78
+ <RowIndexCell
79
+ pillColor={
80
+ idx >= props.unseen
81
+ ? 'transparent'
82
+ : rowBackgroundColor[logEntry.levelLabel]
83
+ }
84
+ >
85
+ {String(idx + 1)}
86
+ </RowIndexCell>
87
+ </ValueRenderers.Component>
88
+ <ValueRenderers.Text
89
+ value={new Date(logEntry.time).toLocaleTimeString()}
90
+ />
91
+ <ValueRenderers.Text value={logEntry.levelLabel} />
92
+ <ValueRenderers.Text value={logEntry.message} />
93
+ </Table.Row>
94
+ ))}
95
+ </Table>
96
+ </DialogBody>
97
+ <DialogFooter
98
+ actions={
99
+ <ActionsFooter>
100
+ <Button
101
+ outlined
102
+ intent="danger"
103
+ icon="trash"
104
+ text="Clear logs"
105
+ onClick={() => logger.clear()}
106
+ />
107
+ <Button
108
+ outlined
109
+ intent="none"
110
+ text="Close"
111
+ onClick={props.onClose}
112
+ />
113
+ </ActionsFooter>
114
+ }
115
+ />
116
+ </Dialog>
117
+ );
118
+ }
119
+
120
+ // "fatal" | "error" | "warn" | "info" | "debug" | "trace" | "silent"
121
+ const rowBackgroundColor: Record<string, CSSProperties['backgroundColor']> = {
122
+ fatal: 'pink',
123
+ error: 'pink',
124
+ warn: 'lightyellow',
125
+ info: 'lightgreen',
126
+ debug: 'lightgrey',
127
+ trace: 'lightgrey',
128
+ silent: 'lightgrey',
129
+ };
@@ -0,0 +1,15 @@
1
+ import type { FifoLogger } from 'fifo-logger';
2
+ import { ReactNode } from 'react';
3
+
4
+ import { fifoLoggerContext } from './loggerContext';
5
+
6
+ export function FifoLoggerProvider(props: {
7
+ logger: FifoLogger;
8
+ children: ReactNode;
9
+ }) {
10
+ return (
11
+ <fifoLoggerContext.Provider value={props.logger}>
12
+ {props.children}
13
+ </fifoLoggerContext.Provider>
14
+ );
15
+ }
@@ -0,0 +1,59 @@
1
+ import { Intent } from '@blueprintjs/core';
2
+ import type { LogEntry } from 'fifo-logger';
3
+ import { useState } from 'react';
4
+
5
+ import { useOnOff } from '../hooks';
6
+ import { Toolbar } from '../toolbar';
7
+
8
+ import { FifoLoggerDialog } from './FifoLoggerDialog';
9
+ import { useFifoLogs } from './useFifoLogger';
10
+
11
+ export function FifoLoggerToolbarItem() {
12
+ const [seen, setSeen] = useState(0);
13
+ const [isOpen, open, close] = useOnOff(false);
14
+ const logs = useFifoLogs();
15
+
16
+ const unseen = logs.length - seen;
17
+ return (
18
+ <>
19
+ <Toolbar.Item
20
+ icon="bug"
21
+ tooltip="Logs"
22
+ onClick={open}
23
+ tag={unseen > 0 ? unseen : undefined}
24
+ tagProps={{
25
+ intent: getIntent(logs),
26
+ style: {
27
+ pointerEvents: 'none',
28
+ },
29
+ }}
30
+ />
31
+ <FifoLoggerDialog
32
+ isOpen={isOpen}
33
+ unseen={unseen}
34
+ onClose={() => {
35
+ setSeen(logs.length);
36
+ close();
37
+ }}
38
+ logs={logs}
39
+ />
40
+ </>
41
+ );
42
+ }
43
+
44
+ function getIntent(logs: LogEntry[]): Intent {
45
+ const maxLevel = Math.max(
46
+ ...logs.map((log) => log.level),
47
+ ) as LogEntry['level'];
48
+ return intentMap[maxLevel || 0];
49
+ }
50
+
51
+ const intentMap: Record<LogEntry['level'], Intent> = {
52
+ 60: 'danger',
53
+ 50: 'danger',
54
+ 40: 'warning',
55
+ 30: 'success',
56
+ 20: 'none',
57
+ 10: 'none',
58
+ 0: 'none',
59
+ };
@@ -0,0 +1,4 @@
1
+ export * from './FifoLoggerProvider';
2
+ export * from './FifoLoggerDialog';
3
+ export * from './FifoLoggerToolbarItem';
4
+ export * from './useFifoLogger';
@@ -0,0 +1,4 @@
1
+ import type { FifoLogger } from 'fifo-logger';
2
+ import { createContext } from 'react';
3
+
4
+ export const fifoLoggerContext = createContext<FifoLogger | null>(null);
@@ -0,0 +1,22 @@
1
+ import { useContext, useEffect, useState } from 'react';
2
+
3
+ import { fifoLoggerContext } from './loggerContext';
4
+
5
+ export function useFifoLogger() {
6
+ const fifoLogger = useContext(fifoLoggerContext);
7
+ if (!fifoLogger) {
8
+ throw new Error('useFifoLogger must be used within a FifoLoggerProvider');
9
+ }
10
+ return fifoLogger;
11
+ }
12
+
13
+ export function useFifoLogs() {
14
+ const logger = useFifoLogger();
15
+ const [logs, setLogs] = useState(logger.getLogs());
16
+ useEffect(() => {
17
+ logger.addEventListener('change', () => {
18
+ setLogs(logger.getLogs());
19
+ });
20
+ }, [logger]);
21
+ return logs;
22
+ }
@@ -34,13 +34,11 @@ export interface TableProps extends React.HTMLAttributes<HTMLTableElement> {
34
34
  compact?: boolean;
35
35
  interactive?: boolean;
36
36
  striped?: boolean;
37
- hasBorder?: boolean;
38
37
  color?: string;
39
38
  }
40
39
 
41
40
  export function Table(props: TableProps) {
42
41
  const {
43
- hasBorder = false,
44
42
  bordered = false,
45
43
  compact = false,
46
44
  interactive = false,
@@ -51,10 +49,7 @@ export function Table(props: TableProps) {
51
49
  } = props;
52
50
  const { Header, Rows } = splitChildren(children);
53
51
 
54
- const tableContextValue = useMemo(
55
- () => ({ hasBorder, color }),
56
- [hasBorder, color],
57
- );
52
+ const tableContextValue = useMemo(() => ({ color }), [color]);
58
53
  return (
59
54
  <TableContext.Provider value={tableContextValue}>
60
55
  <HTMLTable
@@ -1,10 +1,10 @@
1
1
  import type { TableProps } from './Table';
2
2
  import { TableRow } from './TableRow';
3
3
 
4
- export const TableHeader = ({ children, hasBorder, style }: TableProps) => {
4
+ export const TableHeader = ({ children, bordered, style }: TableProps) => {
5
5
  return (
6
6
  <thead>
7
- <TableRow hasBorder={hasBorder} style={style}>
7
+ <TableRow bordered={bordered} style={style}>
8
8
  {children}
9
9
  </TableRow>
10
10
  </thead>
@@ -1,5 +1,3 @@
1
- /** @jsxImportSource @emotion/react */
2
- import { css } from '@emotion/react';
3
1
  import {
4
2
  Children,
5
3
  HTMLAttributes,
@@ -23,28 +21,16 @@ import { useTableContext } from './tableContext';
23
21
 
24
22
  export type TableRowProps = TableProps & HTMLAttributes<HTMLTableRowElement>;
25
23
 
26
- const styles = {
27
- hasBorder: css({
28
- border: '0.5px solid rgb(0, 0, 0)',
29
- padding: '5px',
30
- position: 'relative',
31
- }),
32
- noBorder: css({
33
- padding: '5px',
34
- position: 'relative',
35
- }),
36
- };
37
-
38
24
  export const TableRow = ({
39
25
  children,
40
26
  style = {},
41
- hasBorder = false,
27
+ bordered = false,
42
28
  ...other
43
29
  }: TableRowProps) => {
44
30
  const { cells } = useRowChildren(children);
45
31
  return (
46
32
  <tr
47
- style={{ border: hasBorder ? '1px solid black' : '', ...style }}
33
+ style={{ border: bordered ? '1px solid black' : '', ...style }}
48
34
  {...other}
49
35
  >
50
36
  {cells}
@@ -54,7 +40,7 @@ export const TableRow = ({
54
40
 
55
41
  function useRowChildren(children: ReactNode) {
56
42
  const cells: ReactElement[] = [];
57
- const { hasBorder, color } = useTableContext();
43
+ const { color } = useTableContext();
58
44
  for (const child of Children.toArray(children)) {
59
45
  if (
60
46
  typeof child === 'object' &&
@@ -69,11 +55,7 @@ function useRowChildren(children: ReactNode) {
69
55
  ) {
70
56
  if (child.type === Header) {
71
57
  cells.push(
72
- <th
73
- key={child.key}
74
- style={{ color }}
75
- css={hasBorder ? styles.hasBorder : styles.noBorder}
76
- >
58
+ <th key={child.key} style={{ color }}>
77
59
  {child}
78
60
  </th>,
79
61
  );
@@ -85,7 +67,6 @@ function useRowChildren(children: ReactNode) {
85
67
  color,
86
68
  position: 'relative',
87
69
  }}
88
- css={hasBorder ? styles.hasBorder : styles.noBorder}
89
70
  >
90
71
  {child}
91
72
  </td>,
@@ -1,6 +1,6 @@
1
1
  import { createContext, useContext } from 'react';
2
2
 
3
- export const TableContext = createContext({ hasBorder: true, color: '' });
3
+ export const TableContext = createContext({ color: '' });
4
4
  export function useTableContext() {
5
5
  const context = useContext(TableContext);
6
6
  return context;
@@ -0,0 +1,173 @@
1
+ import styled from '@emotion/styled';
2
+ import { CSSProperties } from 'react';
3
+
4
+ const shortcutBoxSize = 1.5;
5
+
6
+ const FlexContainer = styled.div`
7
+ display: flex;
8
+ justify-content: space-between;
9
+ flex-wrap: wrap;
10
+ align-items: center;
11
+ `;
12
+
13
+ interface TitleProps {
14
+ size: CSSProperties['fontSize'];
15
+ }
16
+
17
+ const Title = styled.span<TitleProps>`
18
+ font-size: ${({ size }) => size};
19
+ flex: 1;
20
+ padding: 5px 0;
21
+ text-align: left;
22
+ `;
23
+ const Description = styled.p`
24
+ padding-top: 1rem;
25
+ font-size: 0.7rem;
26
+ text-align: left;
27
+ `;
28
+
29
+ const ShortcutItem = styled.div`
30
+ display: flex;
31
+ justify-content: center;
32
+ align-items: center;
33
+ padding: 0.2rem;
34
+ border: 1px solid;
35
+ border-radius: 4px;
36
+ height: ${shortcutBoxSize}rem;
37
+ min-width: ${shortcutBoxSize}rem;
38
+ margin-left: 5px;
39
+ font-size: 0.75rem;
40
+ font-weight: bold;
41
+ `;
42
+
43
+ const SubTitleItem = styled.div`
44
+ position: relative;
45
+ padding-left: 15px;
46
+ box-sizing: border-box;
47
+
48
+ &::before {
49
+ position: absolute;
50
+ top: ${shortcutBoxSize / 2}rem;
51
+ left: 0;
52
+ width: 10px;
53
+ height: 1px;
54
+ margin: auto;
55
+ content: '';
56
+ border-bottom: 1px solid;
57
+ }
58
+
59
+ &::after {
60
+ position: absolute;
61
+ top: 0;
62
+ bottom: 0;
63
+ left: 0;
64
+ width: 1px;
65
+ height: 100%;
66
+ content: '';
67
+ border-left: 1px solid;
68
+ }
69
+
70
+ &:last-child::after {
71
+ height: ${shortcutBoxSize / 2}rem;
72
+ }
73
+
74
+ &:first-child {
75
+ margin: 0;
76
+ }
77
+ `;
78
+
79
+ export interface TooltipItem {
80
+ title: string;
81
+ shortcuts?: string[];
82
+ subTitles?: Array<Pick<TooltipItem, 'title' | 'shortcuts'>>;
83
+ description?: string;
84
+ link?: string;
85
+ style?: CSSProperties;
86
+ }
87
+
88
+ export function TooltipHelpContent(props: TooltipItem) {
89
+ const {
90
+ title,
91
+ shortcuts = [],
92
+ subTitles = [],
93
+ description = '',
94
+ link,
95
+ style = {},
96
+ } = props;
97
+
98
+ return (
99
+ <div
100
+ style={{
101
+ color: 'white',
102
+ width: '250px',
103
+ padding: '0.5rem',
104
+ ...style,
105
+ }}
106
+ >
107
+ <FlexContainer>
108
+ <Title size="0.9rem">{title}</Title>
109
+ <ShortCuts shortcuts={shortcuts} />
110
+ </FlexContainer>
111
+ <SubTitles items={subTitles} />
112
+
113
+ {(description || link) && (
114
+ <Description>
115
+ {description}
116
+ {link && (
117
+ <a
118
+ style={description ? { paddingLeft: '5px' } : {}}
119
+ target="_blank"
120
+ href={link}
121
+ rel="noreferrer"
122
+ >
123
+ Learn more
124
+ </a>
125
+ )}
126
+ </Description>
127
+ )}
128
+ </div>
129
+ );
130
+ }
131
+
132
+ function ShortCuts({ shortcuts }: { shortcuts: string[] }) {
133
+ return (
134
+ <div
135
+ style={{
136
+ display: 'flex',
137
+ textWrap: 'nowrap',
138
+ }}
139
+ >
140
+ {shortcuts.map((key) => {
141
+ return (
142
+ <ShortcutItem key={key}>
143
+ <span>{key}</span>
144
+ </ShortcutItem>
145
+ );
146
+ })}
147
+ </div>
148
+ );
149
+ }
150
+
151
+ function SubTitles({ items }: { items: TooltipItem[] }) {
152
+ if (!items || items.length === 0) {
153
+ return null;
154
+ }
155
+
156
+ return (
157
+ <ul
158
+ style={{
159
+ paddingLeft: '5px',
160
+ listStyle: 'none',
161
+ }}
162
+ >
163
+ {items.map(({ shortcuts = [], title }) => (
164
+ <SubTitleItem key={title}>
165
+ <FlexContainer>
166
+ <Title size="0.7rem">{title}</Title>
167
+ <ShortCuts shortcuts={shortcuts} />
168
+ </FlexContainer>
169
+ </SubTitleItem>
170
+ ))}
171
+ </ul>
172
+ );
173
+ }
@@ -1,2 +1,3 @@
1
1
  export * from './Toolbar';
2
2
  export * from './PanelPreferencesToolbar';
3
+ export * from './TooltipHelpContent';