react-science 3.0.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.
- package/lib/app/hooks/file-loading.d.ts +3 -2
- package/lib/app/hooks/file-loading.d.ts.map +1 -1
- package/lib/app/hooks/file-loading.js +12 -12
- package/lib/app/hooks/file-loading.js.map +1 -1
- package/lib/app/panels/SignalProcessingPanel.js +1 -1
- package/lib/app/panels/SignalProcessingPanel.js.map +1 -1
- package/lib/app/panels/measurement-info/MeasurementInfoPanelAccordion.js +1 -1
- package/lib/app/panels/measurement-info/MeasurementInfoPanelAccordion.js.map +1 -1
- package/lib/app-data/loaders/biologicLoader.d.ts +2 -2
- package/lib/app-data/loaders/biologicLoader.d.ts.map +1 -1
- package/lib/app-data/loaders/biologicLoader.js +4 -4
- package/lib/app-data/loaders/biologicLoader.js.map +1 -1
- package/lib/app-data/loaders/cdfLoader.d.ts +2 -2
- package/lib/app-data/loaders/cdfLoader.d.ts.map +1 -1
- package/lib/app-data/loaders/cdfLoader.js +6 -9
- package/lib/app-data/loaders/cdfLoader.js.map +1 -1
- package/lib/app-data/loaders/jcampLoader.d.ts +2 -2
- package/lib/app-data/loaders/jcampLoader.d.ts.map +1 -1
- package/lib/app-data/loaders/jcampLoader.js +10 -13
- package/lib/app-data/loaders/jcampLoader.js.map +1 -1
- package/lib/app-data/loaders/loadMeasurements.d.ts +4 -3
- package/lib/app-data/loaders/loadMeasurements.d.ts.map +1 -1
- package/lib/app-data/loaders/loadMeasurements.js +3 -3
- package/lib/app-data/loaders/loadMeasurements.js.map +1 -1
- package/lib/app-data/loaders/proprietary/agilent/cary500Loader.d.ts +3 -2
- package/lib/app-data/loaders/proprietary/agilent/cary500Loader.d.ts.map +1 -1
- package/lib/app-data/loaders/proprietary/agilent/cary500Loader.js +4 -9
- package/lib/app-data/loaders/proprietary/agilent/cary500Loader.js.map +1 -1
- package/lib/app-data/loaders/spcLoader.d.ts +2 -2
- package/lib/app-data/loaders/spcLoader.d.ts.map +1 -1
- package/lib/app-data/loaders/spcLoader.js +3 -8
- package/lib/app-data/loaders/spcLoader.js.map +1 -1
- package/lib/app-data/loaders/utility/measurementLoader.d.ts +2 -2
- package/lib/app-data/loaders/utility/measurementLoader.d.ts.map +1 -1
- package/lib/app-data/loaders/utility/measurementLoader.js.map +1 -1
- package/lib/app-data/loaders/wdfLoader.d.ts +2 -2
- package/lib/app-data/loaders/wdfLoader.d.ts.map +1 -1
- package/lib/app-data/loaders/wdfLoader.js +3 -9
- package/lib/app-data/loaders/wdfLoader.js.map +1 -1
- package/lib/components/accordion/Accordion.d.ts +1 -0
- package/lib/components/accordion/Accordion.d.ts.map +1 -1
- package/lib/components/accordion/Accordion.js +12 -11
- package/lib/components/accordion/Accordion.js.map +1 -1
- package/lib/components/index.d.ts +2 -1
- package/lib/components/index.d.ts.map +1 -1
- package/lib/components/index.js +2 -1
- package/lib/components/index.js.map +1 -1
- package/lib/components/info-panel/InfoPanel.d.ts.map +1 -1
- package/lib/components/info-panel/InfoPanel.js +2 -5
- package/lib/components/info-panel/InfoPanel.js.map +1 -1
- package/lib/components/logger/FifoLoggerDialog.d.ts +10 -0
- package/lib/components/logger/FifoLoggerDialog.d.ts.map +1 -0
- package/lib/components/logger/FifoLoggerDialog.js +55 -0
- package/lib/components/logger/FifoLoggerDialog.js.map +1 -0
- package/lib/components/logger/FifoLoggerProvider.d.ts +7 -0
- package/lib/components/logger/FifoLoggerProvider.d.ts.map +1 -0
- package/lib/components/logger/FifoLoggerProvider.js +10 -0
- package/lib/components/logger/FifoLoggerProvider.js.map +1 -0
- package/lib/components/logger/FifoLoggerToolbarItem.d.ts +2 -0
- package/lib/components/logger/FifoLoggerToolbarItem.d.ts.map +1 -0
- package/lib/components/logger/FifoLoggerToolbarItem.js +39 -0
- package/lib/components/logger/FifoLoggerToolbarItem.js.map +1 -0
- package/lib/components/logger/index.d.ts +5 -0
- package/lib/components/logger/index.d.ts.map +1 -0
- package/lib/components/logger/index.js +21 -0
- package/lib/components/logger/index.js.map +1 -0
- package/lib/components/logger/loggerContext.d.ts +4 -0
- package/lib/components/logger/loggerContext.d.ts.map +1 -0
- package/lib/components/logger/loggerContext.js +6 -0
- package/lib/components/logger/loggerContext.js.map +1 -0
- package/lib/components/logger/useFifoLogger.d.ts +3 -0
- package/lib/components/logger/useFifoLogger.d.ts.map +1 -0
- package/lib/components/logger/useFifoLogger.js +25 -0
- package/lib/components/logger/useFifoLogger.js.map +1 -0
- package/lib/components/root-layout/RootLayout.d.ts.map +1 -1
- package/lib/components/root-layout/RootLayout.js +6 -1
- package/lib/components/root-layout/RootLayout.js.map +1 -1
- package/lib/components/table/Table.d.ts +2 -3
- package/lib/components/table/Table.d.ts.map +1 -1
- package/lib/components/table/Table.js +2 -2
- package/lib/components/table/Table.js.map +1 -1
- package/lib/components/table/TableHeader.d.ts +1 -1
- package/lib/components/table/TableHeader.d.ts.map +1 -1
- package/lib/components/table/TableHeader.js +2 -2
- package/lib/components/table/TableHeader.js.map +1 -1
- package/lib/components/table/TableRow.d.ts +3 -1
- package/lib/components/table/TableRow.d.ts.map +1 -1
- package/lib/components/table/TableRow.js +9 -22
- package/lib/components/table/TableRow.js.map +1 -1
- package/lib/components/table/tableContext.d.ts +0 -2
- package/lib/components/table/tableContext.d.ts.map +1 -1
- package/lib/components/table/tableContext.js +1 -1
- package/lib/components/table/tableContext.js.map +1 -1
- package/lib/components/toolbar/Toolbar.d.ts +4 -2
- package/lib/components/toolbar/Toolbar.d.ts.map +1 -1
- package/lib/components/toolbar/Toolbar.js +2 -2
- package/lib/components/toolbar/Toolbar.js.map +1 -1
- package/lib/components/toolbar/TooltipHelpContent.d.ts +11 -0
- package/lib/components/toolbar/TooltipHelpContent.d.ts.map +1 -0
- package/lib/components/toolbar/TooltipHelpContent.js +102 -0
- package/lib/components/toolbar/TooltipHelpContent.js.map +1 -0
- package/lib/components/toolbar/index.d.ts +1 -0
- package/lib/components/toolbar/index.d.ts.map +1 -1
- package/lib/components/toolbar/index.js +1 -0
- package/lib/components/toolbar/index.js.map +1 -1
- package/lib-esm/app/hooks/file-loading.d.ts +3 -2
- package/lib-esm/app/hooks/file-loading.d.ts.map +1 -1
- package/lib-esm/app/hooks/file-loading.js +9 -9
- package/lib-esm/app/hooks/file-loading.js.map +1 -1
- package/lib-esm/app/panels/SignalProcessingPanel.js +1 -1
- package/lib-esm/app/panels/SignalProcessingPanel.js.map +1 -1
- package/lib-esm/app/panels/measurement-info/MeasurementInfoPanelAccordion.js +1 -1
- package/lib-esm/app/panels/measurement-info/MeasurementInfoPanelAccordion.js.map +1 -1
- package/lib-esm/app-data/loaders/biologicLoader.d.ts +2 -2
- package/lib-esm/app-data/loaders/biologicLoader.d.ts.map +1 -1
- package/lib-esm/app-data/loaders/biologicLoader.js +4 -4
- package/lib-esm/app-data/loaders/biologicLoader.js.map +1 -1
- package/lib-esm/app-data/loaders/cdfLoader.d.ts +2 -2
- package/lib-esm/app-data/loaders/cdfLoader.d.ts.map +1 -1
- package/lib-esm/app-data/loaders/cdfLoader.js +6 -9
- package/lib-esm/app-data/loaders/cdfLoader.js.map +1 -1
- package/lib-esm/app-data/loaders/jcampLoader.d.ts +2 -2
- package/lib-esm/app-data/loaders/jcampLoader.d.ts.map +1 -1
- package/lib-esm/app-data/loaders/jcampLoader.js +10 -13
- package/lib-esm/app-data/loaders/jcampLoader.js.map +1 -1
- package/lib-esm/app-data/loaders/loadMeasurements.d.ts +4 -3
- package/lib-esm/app-data/loaders/loadMeasurements.d.ts.map +1 -1
- package/lib-esm/app-data/loaders/loadMeasurements.js +3 -3
- package/lib-esm/app-data/loaders/loadMeasurements.js.map +1 -1
- package/lib-esm/app-data/loaders/proprietary/agilent/cary500Loader.d.ts +3 -2
- package/lib-esm/app-data/loaders/proprietary/agilent/cary500Loader.d.ts.map +1 -1
- package/lib-esm/app-data/loaders/proprietary/agilent/cary500Loader.js +5 -10
- package/lib-esm/app-data/loaders/proprietary/agilent/cary500Loader.js.map +1 -1
- package/lib-esm/app-data/loaders/spcLoader.d.ts +2 -2
- package/lib-esm/app-data/loaders/spcLoader.d.ts.map +1 -1
- package/lib-esm/app-data/loaders/spcLoader.js +4 -9
- package/lib-esm/app-data/loaders/spcLoader.js.map +1 -1
- package/lib-esm/app-data/loaders/utility/measurementLoader.d.ts +2 -2
- package/lib-esm/app-data/loaders/utility/measurementLoader.d.ts.map +1 -1
- package/lib-esm/app-data/loaders/utility/measurementLoader.js.map +1 -1
- package/lib-esm/app-data/loaders/wdfLoader.d.ts +2 -2
- package/lib-esm/app-data/loaders/wdfLoader.d.ts.map +1 -1
- package/lib-esm/app-data/loaders/wdfLoader.js +3 -9
- package/lib-esm/app-data/loaders/wdfLoader.js.map +1 -1
- package/lib-esm/components/accordion/Accordion.d.ts +1 -0
- package/lib-esm/components/accordion/Accordion.d.ts.map +1 -1
- package/lib-esm/components/accordion/Accordion.js +12 -11
- package/lib-esm/components/accordion/Accordion.js.map +1 -1
- package/lib-esm/components/index.d.ts +2 -1
- package/lib-esm/components/index.d.ts.map +1 -1
- package/lib-esm/components/index.js +2 -1
- package/lib-esm/components/index.js.map +1 -1
- package/lib-esm/components/info-panel/InfoPanel.d.ts.map +1 -1
- package/lib-esm/components/info-panel/InfoPanel.js +2 -5
- package/lib-esm/components/info-panel/InfoPanel.js.map +1 -1
- package/lib-esm/components/logger/FifoLoggerDialog.d.ts +10 -0
- package/lib-esm/components/logger/FifoLoggerDialog.d.ts.map +1 -0
- package/lib-esm/components/logger/FifoLoggerDialog.js +48 -0
- package/lib-esm/components/logger/FifoLoggerDialog.js.map +1 -0
- package/lib-esm/components/logger/FifoLoggerProvider.d.ts +7 -0
- package/lib-esm/components/logger/FifoLoggerProvider.d.ts.map +1 -0
- package/lib-esm/components/logger/FifoLoggerProvider.js +6 -0
- package/lib-esm/components/logger/FifoLoggerProvider.js.map +1 -0
- package/lib-esm/components/logger/FifoLoggerToolbarItem.d.ts +2 -0
- package/lib-esm/components/logger/FifoLoggerToolbarItem.d.ts.map +1 -0
- package/lib-esm/components/logger/FifoLoggerToolbarItem.js +35 -0
- package/lib-esm/components/logger/FifoLoggerToolbarItem.js.map +1 -0
- package/lib-esm/components/logger/index.d.ts +5 -0
- package/lib-esm/components/logger/index.d.ts.map +1 -0
- package/lib-esm/components/logger/index.js +5 -0
- package/lib-esm/components/logger/index.js.map +1 -0
- package/lib-esm/components/logger/loggerContext.d.ts +4 -0
- package/lib-esm/components/logger/loggerContext.d.ts.map +1 -0
- package/lib-esm/components/logger/loggerContext.js +3 -0
- package/lib-esm/components/logger/loggerContext.js.map +1 -0
- package/lib-esm/components/logger/useFifoLogger.d.ts +3 -0
- package/lib-esm/components/logger/useFifoLogger.d.ts.map +1 -0
- package/lib-esm/components/logger/useFifoLogger.js +20 -0
- package/lib-esm/components/logger/useFifoLogger.js.map +1 -0
- package/lib-esm/components/root-layout/RootLayout.d.ts.map +1 -1
- package/lib-esm/components/root-layout/RootLayout.js +6 -1
- package/lib-esm/components/root-layout/RootLayout.js.map +1 -1
- package/lib-esm/components/table/Table.d.ts +2 -3
- package/lib-esm/components/table/Table.d.ts.map +1 -1
- package/lib-esm/components/table/Table.js +2 -2
- package/lib-esm/components/table/Table.js.map +1 -1
- package/lib-esm/components/table/TableHeader.d.ts +1 -1
- package/lib-esm/components/table/TableHeader.d.ts.map +1 -1
- package/lib-esm/components/table/TableHeader.js +2 -2
- package/lib-esm/components/table/TableHeader.js.map +1 -1
- package/lib-esm/components/table/TableRow.d.ts +3 -1
- package/lib-esm/components/table/TableRow.d.ts.map +1 -1
- package/lib-esm/components/table/TableRow.js +7 -20
- package/lib-esm/components/table/TableRow.js.map +1 -1
- package/lib-esm/components/table/tableContext.d.ts +0 -2
- package/lib-esm/components/table/tableContext.d.ts.map +1 -1
- package/lib-esm/components/table/tableContext.js +1 -1
- package/lib-esm/components/table/tableContext.js.map +1 -1
- package/lib-esm/components/toolbar/Toolbar.d.ts +4 -2
- package/lib-esm/components/toolbar/Toolbar.d.ts.map +1 -1
- package/lib-esm/components/toolbar/Toolbar.js +2 -2
- package/lib-esm/components/toolbar/Toolbar.js.map +1 -1
- package/lib-esm/components/toolbar/TooltipHelpContent.d.ts +11 -0
- package/lib-esm/components/toolbar/TooltipHelpContent.d.ts.map +1 -0
- package/lib-esm/components/toolbar/TooltipHelpContent.js +95 -0
- package/lib-esm/components/toolbar/TooltipHelpContent.js.map +1 -0
- package/lib-esm/components/toolbar/index.d.ts +1 -0
- package/lib-esm/components/toolbar/index.d.ts.map +1 -1
- package/lib-esm/components/toolbar/index.js +1 -0
- package/lib-esm/components/toolbar/index.js.map +1 -1
- package/package.json +7 -5
- package/src/app/hooks/file-loading.ts +12 -10
- package/src/app/panels/SignalProcessingPanel.tsx +1 -1
- package/src/app/panels/measurement-info/MeasurementInfoPanelAccordion.tsx +1 -1
- package/src/app-data/loaders/biologicLoader.ts +6 -5
- package/src/app-data/loaders/cdfLoader.ts +8 -13
- package/src/app-data/loaders/jcampLoader.ts +11 -15
- package/src/app-data/loaders/loadMeasurements.ts +6 -5
- package/src/app-data/loaders/proprietary/agilent/cary500Loader.ts +8 -16
- package/src/app-data/loaders/spcLoader.ts +6 -12
- package/src/app-data/loaders/utility/measurementLoader.ts +2 -3
- package/src/app-data/loaders/wdfLoader.ts +5 -12
- package/src/components/accordion/Accordion.tsx +17 -12
- package/src/components/index.ts +2 -1
- package/src/components/info-panel/InfoPanel.tsx +2 -12
- package/src/components/logger/FifoLoggerDialog.tsx +129 -0
- package/src/components/logger/FifoLoggerProvider.tsx +15 -0
- package/src/components/logger/FifoLoggerToolbarItem.tsx +59 -0
- package/src/components/logger/index.ts +4 -0
- package/src/components/logger/loggerContext.ts +4 -0
- package/src/components/logger/useFifoLogger.ts +22 -0
- package/src/components/root-layout/RootLayout.tsx +20 -13
- package/src/components/table/Table.tsx +1 -6
- package/src/components/table/TableHeader.tsx +2 -2
- package/src/components/table/TableRow.tsx +17 -24
- package/src/components/table/tableContext.ts +1 -1
- package/src/components/toolbar/Toolbar.tsx +8 -3
- package/src/components/toolbar/TooltipHelpContent.tsx +173 -0
- package/src/components/toolbar/index.ts +1 -0
package/src/components/index.ts
CHANGED
|
@@ -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 './
|
|
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';
|
|
@@ -150,32 +150,22 @@ export function InfoPanel(props: InfoPanelProps) {
|
|
|
150
150
|
striped
|
|
151
151
|
css={css({
|
|
152
152
|
width: '100%',
|
|
153
|
-
'td:first-child': {
|
|
154
|
-
width: '30%',
|
|
155
|
-
},
|
|
156
153
|
})}
|
|
157
154
|
compact
|
|
158
155
|
>
|
|
159
156
|
<Table.Header>
|
|
160
|
-
<ValueRenderers.Header
|
|
161
|
-
style={{ width: '50px' }}
|
|
162
|
-
value="Parameter"
|
|
163
|
-
/>
|
|
157
|
+
<ValueRenderers.Header value="Parameter" />
|
|
164
158
|
<ValueRenderers.Header value="Value" />
|
|
165
159
|
</Table.Header>
|
|
166
160
|
{data.map(([key, value]) => (
|
|
167
161
|
<Table.Row
|
|
168
162
|
key={key}
|
|
169
|
-
bordered
|
|
170
163
|
style={{
|
|
171
164
|
height: '10px',
|
|
172
165
|
padding: '0 !imporant',
|
|
173
166
|
}}
|
|
174
167
|
>
|
|
175
|
-
<ValueRenderers.Text
|
|
176
|
-
style={{ width: '50px' }}
|
|
177
|
-
value={key}
|
|
178
|
-
/>
|
|
168
|
+
<ValueRenderers.Text value={key} />
|
|
179
169
|
{valueCell(value)}
|
|
180
170
|
</Table.Row>
|
|
181
171
|
))}
|
|
@@ -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,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
|
+
}
|
|
@@ -19,6 +19,8 @@ const style: CSSProperties = {
|
|
|
19
19
|
width: '100%',
|
|
20
20
|
height: '100%',
|
|
21
21
|
fontSize: '14px',
|
|
22
|
+
display: 'flex',
|
|
23
|
+
flexDirection: 'column',
|
|
22
24
|
};
|
|
23
25
|
|
|
24
26
|
export function RootLayout(props: RootLayoutProps) {
|
|
@@ -33,18 +35,23 @@ export function RootLayout(props: RootLayoutProps) {
|
|
|
33
35
|
}, []);
|
|
34
36
|
|
|
35
37
|
return (
|
|
36
|
-
<
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
38
|
+
<CustomDivPreflight
|
|
39
|
+
ref={ref}
|
|
40
|
+
style={{
|
|
41
|
+
...style,
|
|
42
|
+
...props.style,
|
|
43
|
+
}}
|
|
44
|
+
translate="no"
|
|
45
|
+
>
|
|
46
|
+
<BlueprintProvider
|
|
47
|
+
{...(rootRef ? { portalContainer: rootRef } : undefined)}
|
|
48
|
+
>
|
|
49
|
+
<RootLayoutProvider innerRef={rootRef}>
|
|
50
|
+
<QueryClientProvider client={queryClient}>
|
|
51
|
+
<AccordionProvider>{props.children}</AccordionProvider>
|
|
52
|
+
</QueryClientProvider>
|
|
53
|
+
</RootLayoutProvider>
|
|
54
|
+
</BlueprintProvider>
|
|
55
|
+
</CustomDivPreflight>
|
|
49
56
|
);
|
|
50
57
|
}
|
|
@@ -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,
|
|
4
|
+
export const TableHeader = ({ children, bordered, style }: TableProps) => {
|
|
5
5
|
return (
|
|
6
6
|
<thead>
|
|
7
|
-
<TableRow
|
|
7
|
+
<TableRow bordered={bordered} style={style}>
|
|
8
8
|
{children}
|
|
9
9
|
</TableRow>
|
|
10
10
|
</thead>
|
|
@@ -1,6 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import {
|
|
2
|
+
Children,
|
|
3
|
+
HTMLAttributes,
|
|
4
|
+
isValidElement,
|
|
5
|
+
ReactElement,
|
|
6
|
+
ReactNode,
|
|
7
|
+
} from 'react';
|
|
4
8
|
|
|
5
9
|
import {
|
|
6
10
|
Boolean,
|
|
@@ -15,26 +19,20 @@ import {
|
|
|
15
19
|
import type { TableProps } from './Table';
|
|
16
20
|
import { useTableContext } from './tableContext';
|
|
17
21
|
|
|
18
|
-
|
|
19
|
-
hasBorder: css({
|
|
20
|
-
border: '0.5px solid rgb(0, 0, 0)',
|
|
21
|
-
padding: '5px',
|
|
22
|
-
position: 'relative',
|
|
23
|
-
}),
|
|
24
|
-
noBorder: css({
|
|
25
|
-
padding: '5px',
|
|
26
|
-
position: 'relative',
|
|
27
|
-
}),
|
|
28
|
-
};
|
|
22
|
+
export type TableRowProps = TableProps & HTMLAttributes<HTMLTableRowElement>;
|
|
29
23
|
|
|
30
24
|
export const TableRow = ({
|
|
31
25
|
children,
|
|
32
26
|
style = {},
|
|
33
|
-
|
|
34
|
-
|
|
27
|
+
bordered = false,
|
|
28
|
+
...other
|
|
29
|
+
}: TableRowProps) => {
|
|
35
30
|
const { cells } = useRowChildren(children);
|
|
36
31
|
return (
|
|
37
|
-
<tr
|
|
32
|
+
<tr
|
|
33
|
+
style={{ border: bordered ? '1px solid black' : '', ...style }}
|
|
34
|
+
{...other}
|
|
35
|
+
>
|
|
38
36
|
{cells}
|
|
39
37
|
</tr>
|
|
40
38
|
);
|
|
@@ -42,7 +40,7 @@ export const TableRow = ({
|
|
|
42
40
|
|
|
43
41
|
function useRowChildren(children: ReactNode) {
|
|
44
42
|
const cells: ReactElement[] = [];
|
|
45
|
-
const {
|
|
43
|
+
const { color } = useTableContext();
|
|
46
44
|
for (const child of Children.toArray(children)) {
|
|
47
45
|
if (
|
|
48
46
|
typeof child === 'object' &&
|
|
@@ -57,11 +55,7 @@ function useRowChildren(children: ReactNode) {
|
|
|
57
55
|
) {
|
|
58
56
|
if (child.type === Header) {
|
|
59
57
|
cells.push(
|
|
60
|
-
<th
|
|
61
|
-
key={child.key}
|
|
62
|
-
style={{ color }}
|
|
63
|
-
css={hasBorder ? styles.hasBorder : styles.noBorder}
|
|
64
|
-
>
|
|
58
|
+
<th key={child.key} style={{ color }}>
|
|
65
59
|
{child}
|
|
66
60
|
</th>,
|
|
67
61
|
);
|
|
@@ -73,7 +67,6 @@ function useRowChildren(children: ReactNode) {
|
|
|
73
67
|
color,
|
|
74
68
|
position: 'relative',
|
|
75
69
|
}}
|
|
76
|
-
css={hasBorder ? styles.hasBorder : styles.noBorder}
|
|
77
70
|
>
|
|
78
71
|
{child}
|
|
79
72
|
</td>,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createContext, useContext } from 'react';
|
|
2
2
|
|
|
3
|
-
export const TableContext = createContext({
|
|
3
|
+
export const TableContext = createContext({ color: '' });
|
|
4
4
|
export function useTableContext() {
|
|
5
5
|
const context = useContext(TableContext);
|
|
6
6
|
return context;
|
|
@@ -15,6 +15,7 @@ import { css } from '@emotion/react';
|
|
|
15
15
|
import {
|
|
16
16
|
cloneElement,
|
|
17
17
|
JSX,
|
|
18
|
+
MouseEvent,
|
|
18
19
|
ReactElement,
|
|
19
20
|
ReactNode,
|
|
20
21
|
useLayoutEffect,
|
|
@@ -58,7 +59,11 @@ export interface ToolbarItemProps extends ToolbarBaseProps {
|
|
|
58
59
|
tooltipProps?: Omit<TooltipProps, 'content'>;
|
|
59
60
|
icon: IconName | JSX.Element;
|
|
60
61
|
active?: boolean;
|
|
61
|
-
onClick?: (
|
|
62
|
+
onClick?: (
|
|
63
|
+
item: ToolbarItemProps & {
|
|
64
|
+
event: MouseEvent;
|
|
65
|
+
},
|
|
66
|
+
) => void;
|
|
62
67
|
className?: string;
|
|
63
68
|
isPopover?: boolean;
|
|
64
69
|
tag?: ReactNode;
|
|
@@ -211,8 +216,8 @@ Toolbar.Item = function ToolbarItem(props: ToolbarItemProps) {
|
|
|
211
216
|
)}
|
|
212
217
|
</div>
|
|
213
218
|
}
|
|
214
|
-
onClick={() => {
|
|
215
|
-
onClick?.(props);
|
|
219
|
+
onClick={(event) => {
|
|
220
|
+
onClick?.({ event, ...props });
|
|
216
221
|
}}
|
|
217
222
|
tooltipProps={
|
|
218
223
|
!tooltip
|
|
@@ -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
|
+
}
|