react-science 4.1.3 → 5.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/about/AboutDialogToolbarButton.d.ts +2 -2
- package/lib/app/about/AboutDialogToolbarButton.d.ts.map +1 -1
- package/lib/app/kinds/ir/IrPeaksPanel.d.ts.map +1 -1
- package/lib/app/kinds/ir/IrPeaksPanel.js +7 -18
- package/lib/app/kinds/ir/IrPeaksPanel.js.map +1 -1
- package/lib/app/panels/SignalProcessingPanel.d.ts.map +1 -1
- package/lib/app/panels/SignalProcessingPanel.js +52 -27
- package/lib/app/panels/SignalProcessingPanel.js.map +1 -1
- package/lib/app/panels/measurements/MeasurementsTable.d.ts.map +1 -1
- package/lib/app/panels/measurements/MeasurementsTable.js +6 -6
- package/lib/app/panels/measurements/MeasurementsTable.js.map +1 -1
- package/lib/app/panels/measurements/measurementPanelContext.d.ts +2 -1
- package/lib/app/panels/measurements/measurementPanelContext.d.ts.map +1 -1
- package/lib/app/panels/measurements/measurementPanelContext.js.map +1 -1
- package/lib/components/color-picker/react-color/common/Swatch.d.ts +2 -2
- package/lib/components/color-picker/react-color/common/interaction.d.ts +2 -2
- package/lib/components/dialog/ConfirmDialog.js +3 -3
- package/lib/components/dialog/ConfirmDialog.js.map +1 -1
- package/lib/components/info-panel/InfoPanel.d.ts.map +1 -1
- package/lib/components/info-panel/InfoPanel.js +24 -19
- package/lib/components/info-panel/InfoPanel.js.map +1 -1
- package/lib/components/logger/FifoLoggerDialog.d.ts.map +1 -1
- package/lib/components/logger/FifoLoggerDialog.js +37 -9
- package/lib/components/logger/FifoLoggerDialog.js.map +1 -1
- package/lib/components/root-layout/css-reset/customPreflight.d.ts.map +1 -1
- package/lib/components/table/default_table_cell.d.ts +3 -0
- package/lib/components/table/default_table_cell.d.ts.map +1 -0
- package/lib/components/table/default_table_cell.js +46 -0
- package/lib/components/table/default_table_cell.js.map +1 -0
- package/lib/components/table/index.d.ts +2 -1
- package/lib/components/table/index.d.ts.map +1 -1
- package/lib/components/table/index.js +2 -1
- package/lib/components/table/index.js.map +1 -1
- package/lib/components/table/table_body.d.ts +11 -0
- package/lib/components/table/table_body.d.ts.map +1 -0
- package/lib/components/table/table_body.js +11 -0
- package/lib/components/table/table_body.js.map +1 -0
- package/lib/components/table/table_header.d.ts +8 -0
- package/lib/components/table/table_header.d.ts.map +1 -0
- package/lib/components/table/table_header.js +17 -0
- package/lib/components/table/table_header.js.map +1 -0
- package/lib/components/table/table_header_cell.d.ts +7 -0
- package/lib/components/table/table_header_cell.d.ts.map +1 -0
- package/lib/components/table/table_header_cell.js +22 -0
- package/lib/components/table/table_header_cell.js.map +1 -0
- package/lib/components/table/table_root.d.ts +18 -0
- package/lib/components/table/table_root.d.ts.map +1 -0
- package/lib/components/table/table_root.js +23 -0
- package/lib/components/table/table_root.js.map +1 -0
- package/lib/components/table/table_row.d.ts +8 -0
- package/lib/components/table/table_row.d.ts.map +1 -0
- package/lib/components/table/table_row.js +9 -0
- package/lib/components/table/table_row.js.map +1 -0
- package/lib/components/table/table_row_cell.d.ts +7 -0
- package/lib/components/table/table_row_cell.d.ts.map +1 -0
- package/lib/components/table/table_row_cell.js +10 -0
- package/lib/components/table/table_row_cell.js.map +1 -0
- package/lib/components/table/table_utils.d.ts +6 -0
- package/lib/components/table/table_utils.d.ts.map +1 -0
- package/lib/components/table/table_utils.js +8 -0
- package/lib/components/table/table_utils.js.map +1 -0
- package/lib/components/table/use_table_columns.d.ts +4 -0
- package/lib/components/table/use_table_columns.d.ts.map +1 -0
- package/lib/components/table/use_table_columns.js +17 -0
- package/lib/components/table/use_table_columns.js.map +1 -0
- package/lib/components/toolbar/PanelPreferencesToolbar.d.ts +2 -1
- package/lib/components/toolbar/PanelPreferencesToolbar.d.ts.map +1 -1
- package/lib/components/toolbar/PanelPreferencesToolbar.js.map +1 -1
- package/lib/components/toolbar/Toolbar.d.ts +2 -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/value-renderers/index.d.ts +0 -1
- package/lib/components/value-renderers/index.d.ts.map +1 -1
- package/lib/components/value-renderers/index.js +1 -3
- package/lib/components/value-renderers/index.js.map +1 -1
- package/lib-esm/app/about/AboutDialogToolbarButton.d.ts +2 -2
- package/lib-esm/app/about/AboutDialogToolbarButton.d.ts.map +1 -1
- package/lib-esm/app/kinds/ir/IrPeaksPanel.d.ts.map +1 -1
- package/lib-esm/app/kinds/ir/IrPeaksPanel.js +9 -20
- package/lib-esm/app/kinds/ir/IrPeaksPanel.js.map +1 -1
- package/lib-esm/app/panels/SignalProcessingPanel.d.ts.map +1 -1
- package/lib-esm/app/panels/SignalProcessingPanel.js +54 -29
- package/lib-esm/app/panels/SignalProcessingPanel.js.map +1 -1
- package/lib-esm/app/panels/measurements/MeasurementsTable.d.ts.map +1 -1
- package/lib-esm/app/panels/measurements/MeasurementsTable.js +7 -7
- package/lib-esm/app/panels/measurements/MeasurementsTable.js.map +1 -1
- package/lib-esm/app/panels/measurements/measurementPanelContext.d.ts +2 -1
- package/lib-esm/app/panels/measurements/measurementPanelContext.d.ts.map +1 -1
- package/lib-esm/app/panels/measurements/measurementPanelContext.js.map +1 -1
- package/lib-esm/components/color-picker/react-color/common/Swatch.d.ts +2 -2
- package/lib-esm/components/color-picker/react-color/common/interaction.d.ts +2 -2
- package/lib-esm/components/dialog/ConfirmDialog.js +1 -1
- package/lib-esm/components/dialog/ConfirmDialog.js.map +1 -1
- package/lib-esm/components/info-panel/InfoPanel.d.ts.map +1 -1
- package/lib-esm/components/info-panel/InfoPanel.js +19 -14
- package/lib-esm/components/info-panel/InfoPanel.js.map +1 -1
- package/lib-esm/components/logger/FifoLoggerDialog.d.ts.map +1 -1
- package/lib-esm/components/logger/FifoLoggerDialog.js +36 -8
- package/lib-esm/components/logger/FifoLoggerDialog.js.map +1 -1
- package/lib-esm/components/root-layout/css-reset/customPreflight.d.ts.map +1 -1
- package/lib-esm/components/table/default_table_cell.d.ts +3 -0
- package/lib-esm/components/table/default_table_cell.d.ts.map +1 -0
- package/lib-esm/components/table/default_table_cell.js +20 -0
- package/lib-esm/components/table/default_table_cell.js.map +1 -0
- package/lib-esm/components/table/index.d.ts +2 -1
- package/lib-esm/components/table/index.d.ts.map +1 -1
- package/lib-esm/components/table/index.js +2 -1
- package/lib-esm/components/table/index.js.map +1 -1
- package/lib-esm/components/table/table_body.d.ts +11 -0
- package/lib-esm/components/table/table_body.d.ts.map +1 -0
- package/lib-esm/components/table/table_body.js +8 -0
- package/lib-esm/components/table/table_body.js.map +1 -0
- package/lib-esm/components/table/table_header.d.ts +8 -0
- package/lib-esm/components/table/table_header.d.ts.map +1 -0
- package/lib-esm/components/table/table_header.js +14 -0
- package/lib-esm/components/table/table_header.js.map +1 -0
- package/lib-esm/components/table/table_header_cell.d.ts +7 -0
- package/lib-esm/components/table/table_header_cell.d.ts.map +1 -0
- package/lib-esm/components/table/table_header_cell.js +19 -0
- package/lib-esm/components/table/table_header_cell.js.map +1 -0
- package/lib-esm/components/table/table_root.d.ts +18 -0
- package/lib-esm/components/table/table_root.d.ts.map +1 -0
- package/lib-esm/components/table/table_root.js +20 -0
- package/lib-esm/components/table/table_root.js.map +1 -0
- package/lib-esm/components/table/table_row.d.ts +8 -0
- package/lib-esm/components/table/table_row.d.ts.map +1 -0
- package/lib-esm/components/table/table_row.js +6 -0
- package/lib-esm/components/table/table_row.js.map +1 -0
- package/lib-esm/components/table/table_row_cell.d.ts +7 -0
- package/lib-esm/components/table/table_row_cell.d.ts.map +1 -0
- package/lib-esm/components/table/table_row_cell.js +7 -0
- package/lib-esm/components/table/table_row_cell.js.map +1 -0
- package/lib-esm/components/table/table_utils.d.ts +6 -0
- package/lib-esm/components/table/table_utils.d.ts.map +1 -0
- package/lib-esm/components/table/table_utils.js +5 -0
- package/lib-esm/components/table/table_utils.js.map +1 -0
- package/lib-esm/components/table/use_table_columns.d.ts +4 -0
- package/lib-esm/components/table/use_table_columns.d.ts.map +1 -0
- package/lib-esm/components/table/use_table_columns.js +14 -0
- package/lib-esm/components/table/use_table_columns.js.map +1 -0
- package/lib-esm/components/toolbar/PanelPreferencesToolbar.d.ts +2 -1
- package/lib-esm/components/toolbar/PanelPreferencesToolbar.d.ts.map +1 -1
- package/lib-esm/components/toolbar/PanelPreferencesToolbar.js.map +1 -1
- package/lib-esm/components/toolbar/Toolbar.d.ts +2 -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/value-renderers/index.d.ts +0 -1
- package/lib-esm/components/value-renderers/index.d.ts.map +1 -1
- package/lib-esm/components/value-renderers/index.js +0 -1
- package/lib-esm/components/value-renderers/index.js.map +1 -1
- package/package.json +30 -30
- package/src/app/about/AboutDialogToolbarButton.tsx +2 -2
- package/src/app/kinds/ir/IrPeaksPanel.tsx +15 -51
- package/src/app/panels/SignalProcessingPanel.tsx +99 -82
- package/src/app/panels/measurements/MeasurementsTable.tsx +19 -21
- package/src/app/panels/measurements/measurementPanelContext.tsx +2 -2
- package/src/components/dialog/ConfirmDialog.tsx +1 -1
- package/src/components/info-panel/InfoPanel.tsx +33 -34
- package/src/components/logger/FifoLoggerDialog.tsx +60 -38
- package/src/components/table/default_table_cell.tsx +20 -0
- package/src/components/table/index.ts +2 -1
- package/src/components/table/table_body.tsx +31 -0
- package/src/components/table/table_header.tsx +32 -0
- package/src/components/table/table_header_cell.tsx +38 -0
- package/src/components/table/table_root.tsx +77 -0
- package/src/components/table/table_row.tsx +14 -0
- package/src/components/table/table_row_cell.tsx +17 -0
- package/src/components/table/table_utils.ts +21 -0
- package/src/components/table/use_table_columns.ts +19 -0
- package/src/components/toolbar/PanelPreferencesToolbar.tsx +2 -1
- package/src/components/toolbar/Toolbar.tsx +6 -7
- package/src/components/value-renderers/index.ts +0 -2
- package/lib/components/table/Table.d.ts +0 -17
- package/lib/components/table/Table.d.ts.map +0 -1
- package/lib/components/table/Table.js +0 -38
- package/lib/components/table/Table.js.map +0 -1
- package/lib/components/table/TableHeader.d.ts +0 -5
- package/lib/components/table/TableHeader.d.ts.map +0 -1
- package/lib/components/table/TableHeader.js +0 -16
- package/lib/components/table/TableHeader.js.map +0 -1
- package/lib/components/table/TableRow.d.ts +0 -5
- package/lib/components/table/TableRow.d.ts.map +0 -1
- package/lib/components/table/TableRow.js +0 -44
- package/lib/components/table/TableRow.js.map +0 -1
- package/lib/components/table/tableContext.d.ts +0 -7
- package/lib/components/table/tableContext.d.ts.map +0 -1
- package/lib/components/table/tableContext.js +0 -11
- package/lib/components/table/tableContext.js.map +0 -1
- package/lib/components/value-renderers/Header.d.ts +0 -7
- package/lib/components/value-renderers/Header.d.ts.map +0 -1
- package/lib/components/value-renderers/Header.js +0 -14
- package/lib/components/value-renderers/Header.js.map +0 -1
- package/lib-esm/components/table/Table.d.ts +0 -17
- package/lib-esm/components/table/Table.d.ts.map +0 -1
- package/lib-esm/components/table/Table.js +0 -35
- package/lib-esm/components/table/Table.js.map +0 -1
- package/lib-esm/components/table/TableHeader.d.ts +0 -5
- package/lib-esm/components/table/TableHeader.d.ts.map +0 -1
- package/lib-esm/components/table/TableHeader.js +0 -12
- package/lib-esm/components/table/TableHeader.js.map +0 -1
- package/lib-esm/components/table/TableRow.d.ts +0 -5
- package/lib-esm/components/table/TableRow.d.ts.map +0 -1
- package/lib-esm/components/table/TableRow.js +0 -40
- package/lib-esm/components/table/TableRow.js.map +0 -1
- package/lib-esm/components/table/tableContext.d.ts +0 -7
- package/lib-esm/components/table/tableContext.d.ts.map +0 -1
- package/lib-esm/components/table/tableContext.js +0 -7
- package/lib-esm/components/table/tableContext.js.map +0 -1
- package/lib-esm/components/value-renderers/Header.d.ts +0 -7
- package/lib-esm/components/value-renderers/Header.d.ts.map +0 -1
- package/lib-esm/components/value-renderers/Header.js +0 -11
- package/lib-esm/components/value-renderers/Header.js.map +0 -1
- package/src/components/table/Table.tsx +0 -70
- package/src/components/table/TableHeader.tsx +0 -24
- package/src/components/table/TableRow.tsx +0 -82
- package/src/components/table/tableContext.ts +0 -7
- package/src/components/value-renderers/Header.tsx +0 -18
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { FilterXYType } from 'ml-signal-processing';
|
|
2
2
|
import filterXY from 'ml-signal-processing/FilterXYSchema.json';
|
|
3
3
|
|
|
4
|
-
import { Button,
|
|
4
|
+
import { Button, createTableColumnHelper, Table } from '../../components/index';
|
|
5
5
|
|
|
6
6
|
export interface Filter<OptionsType = string | number> {
|
|
7
7
|
name: FilterXYType['name'];
|
|
@@ -35,92 +35,106 @@ const defaultFilters = filterXY.anyOf.map(({ properties }) => {
|
|
|
35
35
|
options,
|
|
36
36
|
};
|
|
37
37
|
});
|
|
38
|
+
|
|
39
|
+
const columnHelper = createTableColumnHelper<Filter>();
|
|
40
|
+
|
|
38
41
|
export function SignalProcessingPanel(props: SignalProcessingPanelProps) {
|
|
39
42
|
const { filters = [], onChange } = props;
|
|
40
43
|
|
|
44
|
+
const columns = [
|
|
45
|
+
columnHelper.display({
|
|
46
|
+
header: ' ',
|
|
47
|
+
cell: ({ row }) => {
|
|
48
|
+
return (
|
|
49
|
+
<div style={{ display: 'flex', gap: '3px' }}>
|
|
50
|
+
<Button
|
|
51
|
+
style={{ width: '15px' }}
|
|
52
|
+
intent="success"
|
|
53
|
+
onClick={() => {
|
|
54
|
+
const newFilters = [...filters];
|
|
55
|
+
newFilters.splice(
|
|
56
|
+
row.index + 1,
|
|
57
|
+
0,
|
|
58
|
+
getDefaultFilter(defaultFilters[0]),
|
|
59
|
+
);
|
|
60
|
+
onChange?.(newFilters);
|
|
61
|
+
}}
|
|
62
|
+
>
|
|
63
|
+
+
|
|
64
|
+
</Button>
|
|
65
|
+
<Button
|
|
66
|
+
style={{ width: '15px' }}
|
|
67
|
+
intent="danger"
|
|
68
|
+
onClick={() => {
|
|
69
|
+
onChange?.(filters.filter((_, j) => j !== row.index));
|
|
70
|
+
}}
|
|
71
|
+
>
|
|
72
|
+
-
|
|
73
|
+
</Button>
|
|
74
|
+
</div>
|
|
75
|
+
);
|
|
76
|
+
},
|
|
77
|
+
}),
|
|
78
|
+
columnHelper.accessor('name', {
|
|
79
|
+
header: 'Name',
|
|
80
|
+
cell: ({ row, getValue }) => {
|
|
81
|
+
return (
|
|
82
|
+
<select
|
|
83
|
+
onChange={({ target }) => {
|
|
84
|
+
const value = Number(target.value);
|
|
85
|
+
if (!Number.isNaN(value)) {
|
|
86
|
+
const filter = getDefaultFilter(defaultFilters[value]);
|
|
87
|
+
const newFilters = [...filters];
|
|
88
|
+
newFilters[row.index] = filter;
|
|
89
|
+
onChange?.(newFilters);
|
|
90
|
+
}
|
|
91
|
+
}}
|
|
92
|
+
style={{ border: '1px solid black' }}
|
|
93
|
+
value={defaultFilters.findIndex((f) => f.name === getValue())}
|
|
94
|
+
>
|
|
95
|
+
{defaultFilters.map(({ name }, i: number) => (
|
|
96
|
+
<option key={name} value={i}>
|
|
97
|
+
{normalCase(name)}
|
|
98
|
+
</option>
|
|
99
|
+
))}
|
|
100
|
+
</select>
|
|
101
|
+
);
|
|
102
|
+
},
|
|
103
|
+
}),
|
|
104
|
+
columnHelper.accessor('options', {
|
|
105
|
+
header: 'Options',
|
|
106
|
+
cell: ({ row, getValue }) => {
|
|
107
|
+
const options = getValue();
|
|
108
|
+
if (!options) return null;
|
|
109
|
+
return (
|
|
110
|
+
<>
|
|
111
|
+
{Object.entries(
|
|
112
|
+
defaultFilters.find((f) => f.name === row.original.name)
|
|
113
|
+
?.options || {},
|
|
114
|
+
).map((option) =>
|
|
115
|
+
optionInput(option, options, (value) => {
|
|
116
|
+
const FilterOptions = {
|
|
117
|
+
...filters[row.index].options,
|
|
118
|
+
[option[0]]: value,
|
|
119
|
+
};
|
|
120
|
+
const filter = {
|
|
121
|
+
name: filters[row.index].name,
|
|
122
|
+
options: FilterOptions,
|
|
123
|
+
};
|
|
124
|
+
const newFilters = [...filters];
|
|
125
|
+
newFilters[row.index] = filter;
|
|
126
|
+
onChange?.(newFilters);
|
|
127
|
+
}),
|
|
128
|
+
)}
|
|
129
|
+
</>
|
|
130
|
+
);
|
|
131
|
+
},
|
|
132
|
+
}),
|
|
133
|
+
];
|
|
134
|
+
|
|
41
135
|
return (
|
|
42
136
|
<div>
|
|
43
|
-
<Table
|
|
44
|
-
<Table.Header>
|
|
45
|
-
<ValueRenderers.Header value=" " />
|
|
46
|
-
<ValueRenderers.Header value="Name" />
|
|
47
|
-
<ValueRenderers.Header value="Options" />
|
|
48
|
-
</Table.Header>
|
|
49
|
-
{filters.map(({ name, options }, i) => (
|
|
50
|
-
<Table.Row key={name} bordered>
|
|
51
|
-
<ValueRenderers.Component>
|
|
52
|
-
<div style={{ display: 'flex', gap: '3px' }}>
|
|
53
|
-
<Button
|
|
54
|
-
style={{ width: '15px' }}
|
|
55
|
-
intent="success"
|
|
56
|
-
onClick={() => {
|
|
57
|
-
const newFilters = [...filters];
|
|
58
|
-
newFilters.splice(
|
|
59
|
-
i + 1,
|
|
60
|
-
0,
|
|
61
|
-
getDefaultFilter(defaultFilters[0]),
|
|
62
|
-
);
|
|
63
|
-
onChange?.(newFilters);
|
|
64
|
-
}}
|
|
65
|
-
>
|
|
66
|
-
+
|
|
67
|
-
</Button>
|
|
68
|
-
<Button
|
|
69
|
-
style={{ width: '15px' }}
|
|
70
|
-
intent="danger"
|
|
71
|
-
onClick={() => {
|
|
72
|
-
onChange?.(filters.filter((_, j) => j !== i));
|
|
73
|
-
}}
|
|
74
|
-
>
|
|
75
|
-
-
|
|
76
|
-
</Button>
|
|
77
|
-
</div>
|
|
78
|
-
</ValueRenderers.Component>
|
|
79
|
-
<ValueRenderers.Component>
|
|
80
|
-
<select
|
|
81
|
-
onChange={({ target }) => {
|
|
82
|
-
const value = Number(target.value);
|
|
83
|
-
if (!Number.isNaN(value)) {
|
|
84
|
-
const filter = getDefaultFilter(defaultFilters[value]);
|
|
85
|
-
const newFilters = [...filters];
|
|
86
|
-
newFilters[i] = filter;
|
|
87
|
-
onChange?.(newFilters);
|
|
88
|
-
}
|
|
89
|
-
}}
|
|
90
|
-
style={{ border: '1px solid black' }}
|
|
91
|
-
value={defaultFilters.findIndex((f) => f.name === name)}
|
|
92
|
-
>
|
|
93
|
-
{defaultFilters.map(({ name }, i: number) => (
|
|
94
|
-
<option key={name} value={i}>
|
|
95
|
-
{normalCase(name)}
|
|
96
|
-
</option>
|
|
97
|
-
))}
|
|
98
|
-
</select>
|
|
99
|
-
</ValueRenderers.Component>
|
|
100
|
-
{options && (
|
|
101
|
-
<ValueRenderers.Component>
|
|
102
|
-
{Object.entries(
|
|
103
|
-
defaultFilters.find((f) => f.name === name)?.options || {},
|
|
104
|
-
).map((option) =>
|
|
105
|
-
optionInput(option, options, (value) => {
|
|
106
|
-
const FilterOptions = {
|
|
107
|
-
...filters[i].options,
|
|
108
|
-
[option[0]]: value,
|
|
109
|
-
};
|
|
110
|
-
const filter = {
|
|
111
|
-
name: filters[i].name,
|
|
112
|
-
options: FilterOptions,
|
|
113
|
-
};
|
|
114
|
-
const newFilters = [...filters];
|
|
115
|
-
newFilters[i] = filter;
|
|
116
|
-
onChange?.(newFilters);
|
|
117
|
-
}),
|
|
118
|
-
)}
|
|
119
|
-
</ValueRenderers.Component>
|
|
120
|
-
)}
|
|
121
|
-
</Table.Row>
|
|
122
|
-
))}
|
|
123
|
-
</Table>
|
|
137
|
+
<Table data={filters} columns={columns} bordered />
|
|
124
138
|
{filters.length === 0 && (
|
|
125
139
|
<Button
|
|
126
140
|
style={{ width: '15px', margin: '5px 20px' }}
|
|
@@ -136,6 +150,7 @@ export function SignalProcessingPanel(props: SignalProcessingPanelProps) {
|
|
|
136
150
|
</div>
|
|
137
151
|
);
|
|
138
152
|
}
|
|
153
|
+
|
|
139
154
|
function getDefaultFilter({ options, name }: Filter<FilterOptionsInfo>) {
|
|
140
155
|
if (options) {
|
|
141
156
|
const result: Record<string, string | number> = {};
|
|
@@ -147,10 +162,12 @@ function getDefaultFilter({ options, name }: Filter<FilterOptionsInfo>) {
|
|
|
147
162
|
}
|
|
148
163
|
return { name };
|
|
149
164
|
}
|
|
165
|
+
|
|
150
166
|
function normalCase(str: string) {
|
|
151
167
|
const result = str.replaceAll(/(?<upper>[A-Z])/g, ' $<upper>').trim();
|
|
152
168
|
return result.charAt(0).toUpperCase() + result.slice(1);
|
|
153
169
|
}
|
|
170
|
+
|
|
154
171
|
function optionInput(
|
|
155
172
|
[key, { description, choices }]: [string, FilterOptionsInfo],
|
|
156
173
|
options: Record<string, string | number>,
|
|
@@ -3,9 +3,9 @@ import styled from '@emotion/styled';
|
|
|
3
3
|
import { useMemo } from 'react';
|
|
4
4
|
|
|
5
5
|
import {
|
|
6
|
+
getMeasurement,
|
|
6
7
|
MeasurementBase,
|
|
7
8
|
MeasurementKind,
|
|
8
|
-
getMeasurement,
|
|
9
9
|
useAppDispatch,
|
|
10
10
|
useAppState,
|
|
11
11
|
} from '../../../app-data';
|
|
@@ -20,10 +20,10 @@ import {
|
|
|
20
20
|
import { MeasurementConfigPanel } from '../index';
|
|
21
21
|
|
|
22
22
|
import {
|
|
23
|
-
MeasurementColorPreview,
|
|
24
23
|
MeasurementCheckbox,
|
|
25
|
-
|
|
24
|
+
MeasurementColorPreview,
|
|
26
25
|
MeasurementSelectedVisibilityChange,
|
|
26
|
+
MeasurementVisibilityToggle,
|
|
27
27
|
useMeasurementPanel,
|
|
28
28
|
} from '.';
|
|
29
29
|
|
|
@@ -90,7 +90,7 @@ const MeasurementsTableRowData = styled.tr`
|
|
|
90
90
|
line-height: 1.25rem;
|
|
91
91
|
`;
|
|
92
92
|
|
|
93
|
-
const MeasurementsIconsContainer = styled.
|
|
93
|
+
const MeasurementsIconsContainer = styled.th`
|
|
94
94
|
display: flex;
|
|
95
95
|
justify-content: flex-start;
|
|
96
96
|
align-items: center;
|
|
@@ -205,24 +205,22 @@ function MeasurementsTableHeader({
|
|
|
205
205
|
return (
|
|
206
206
|
<thead>
|
|
207
207
|
<MeasurementsTableHeaderStyled>
|
|
208
|
-
<
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
208
|
+
<MeasurementsIconsContainer
|
|
209
|
+
style={{
|
|
210
|
+
paddingLeft: '26px',
|
|
211
|
+
}}
|
|
212
|
+
>
|
|
213
|
+
<MeasurementCheckbox
|
|
214
|
+
checked={allSelected}
|
|
215
|
+
onSelectCheckbox={() => {
|
|
216
|
+
onSelectLink(!allSelected);
|
|
212
217
|
}}
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
/>
|
|
220
|
-
<MeasurementSelectedVisibilityChange
|
|
221
|
-
kind={kind}
|
|
222
|
-
isVisible={selectedVisible}
|
|
223
|
-
/>
|
|
224
|
-
</MeasurementsIconsContainer>
|
|
225
|
-
</th>
|
|
218
|
+
/>
|
|
219
|
+
<MeasurementSelectedVisibilityChange
|
|
220
|
+
kind={kind}
|
|
221
|
+
isVisible={selectedVisible}
|
|
222
|
+
/>
|
|
223
|
+
</MeasurementsIconsContainer>
|
|
226
224
|
<TableHeaderFilename>Filename</TableHeaderFilename>
|
|
227
225
|
<TableHeaderTechnique>Technique</TableHeaderTechnique>
|
|
228
226
|
</MeasurementsTableHeaderStyled>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Panel } from '@blueprintjs/core';
|
|
2
|
-
import { createContext, useContext } from 'react';
|
|
2
|
+
import { createContext, type ReactNode, useContext } from 'react';
|
|
3
3
|
|
|
4
4
|
export interface MeasurementState {
|
|
5
5
|
openPanel?: (panel: Panel<object>) => void;
|
|
@@ -21,7 +21,7 @@ export function MeasurementPanelProvider({
|
|
|
21
21
|
children,
|
|
22
22
|
value,
|
|
23
23
|
}: {
|
|
24
|
-
children:
|
|
24
|
+
children: ReactNode;
|
|
25
25
|
value: MeasurementState;
|
|
26
26
|
}) {
|
|
27
27
|
return (
|
|
@@ -4,8 +4,8 @@ import { css } from '@emotion/react';
|
|
|
4
4
|
import * as Collapsible from '@radix-ui/react-collapsible';
|
|
5
5
|
import { CSSProperties, useCallback, useMemo, useState } from 'react';
|
|
6
6
|
|
|
7
|
-
import {
|
|
8
|
-
import
|
|
7
|
+
import { createTableColumnHelper, Table } from '../table';
|
|
8
|
+
import * as ValueRenderers from '../value-renderers';
|
|
9
9
|
|
|
10
10
|
export interface InfoPanelData {
|
|
11
11
|
description: string;
|
|
@@ -71,35 +71,51 @@ const style = {
|
|
|
71
71
|
}),
|
|
72
72
|
};
|
|
73
73
|
|
|
74
|
+
interface InfoPanelDatum {
|
|
75
|
+
parameter: string;
|
|
76
|
+
value: string | number | object;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const columnHelper = createTableColumnHelper<InfoPanelDatum>();
|
|
80
|
+
const columns = [
|
|
81
|
+
columnHelper.accessor('parameter', {
|
|
82
|
+
header: 'Parameter',
|
|
83
|
+
}),
|
|
84
|
+
columnHelper.accessor('value', {
|
|
85
|
+
header: 'Value',
|
|
86
|
+
cell: ({ getValue }) => valueCell(getValue()),
|
|
87
|
+
}),
|
|
88
|
+
];
|
|
89
|
+
|
|
74
90
|
export function InfoPanel(props: InfoPanelProps) {
|
|
75
91
|
const [search, setSearch] = useState('');
|
|
76
92
|
const { title = 'Information', data = [], titleStyle, inputStyle } = props;
|
|
77
93
|
const viewData = useCallback(
|
|
78
94
|
(data: Record<string, string | number | object>) => {
|
|
79
|
-
const exactMatch:
|
|
80
|
-
const startsWith:
|
|
81
|
-
const includes:
|
|
82
|
-
const valueContains:
|
|
95
|
+
const exactMatch: InfoPanelDatum[] = [];
|
|
96
|
+
const startsWith: InfoPanelDatum[] = [];
|
|
97
|
+
const includes: InfoPanelDatum[] = [];
|
|
98
|
+
const valueContains: InfoPanelDatum[] = [];
|
|
83
99
|
|
|
84
|
-
for (const [
|
|
100
|
+
for (const [parameter, value] of Object.entries(data).sort(([a], [b]) =>
|
|
85
101
|
a.localeCompare(b),
|
|
86
102
|
)) {
|
|
87
|
-
const lowerKey =
|
|
103
|
+
const lowerKey = parameter.toLowerCase();
|
|
88
104
|
const lowerSearch = search.toLowerCase();
|
|
89
105
|
if (lowerKey === lowerSearch) {
|
|
90
|
-
exactMatch.push(
|
|
106
|
+
exactMatch.push({ parameter, value });
|
|
91
107
|
continue;
|
|
92
108
|
}
|
|
93
109
|
if (lowerKey.startsWith(lowerSearch)) {
|
|
94
|
-
startsWith.push(
|
|
110
|
+
startsWith.push({ parameter, value });
|
|
95
111
|
continue;
|
|
96
112
|
}
|
|
97
113
|
if (lowerKey.includes(lowerSearch)) {
|
|
98
|
-
includes.push(
|
|
114
|
+
includes.push({ parameter, value });
|
|
99
115
|
continue;
|
|
100
116
|
}
|
|
101
117
|
if (valueSearch(value, search)) {
|
|
102
|
-
valueContains.push(
|
|
118
|
+
valueContains.push({ parameter, value });
|
|
103
119
|
continue;
|
|
104
120
|
}
|
|
105
121
|
}
|
|
@@ -110,7 +126,7 @@ export function InfoPanel(props: InfoPanelProps) {
|
|
|
110
126
|
const { filteredData, total, count } = useMemo(() => {
|
|
111
127
|
const filteredData: Array<
|
|
112
128
|
Omit<InfoPanelData, 'data'> & {
|
|
113
|
-
data:
|
|
129
|
+
data: InfoPanelDatum[];
|
|
114
130
|
}
|
|
115
131
|
> = [];
|
|
116
132
|
let total = 0;
|
|
@@ -190,29 +206,12 @@ export function InfoPanel(props: InfoPanelProps) {
|
|
|
190
206
|
</Collapsible.Trigger>
|
|
191
207
|
<Collapsible.Content css={style.content}>
|
|
192
208
|
<Table
|
|
209
|
+
data={data}
|
|
210
|
+
columns={columns}
|
|
193
211
|
striped
|
|
194
|
-
|
|
195
|
-
width: '100%',
|
|
196
|
-
})}
|
|
212
|
+
tableProps={{ style: { width: '100%' } }}
|
|
197
213
|
compact
|
|
198
|
-
|
|
199
|
-
<Table.Header>
|
|
200
|
-
<ValueRenderers.Header value="Parameter" />
|
|
201
|
-
<ValueRenderers.Header value="Value" />
|
|
202
|
-
</Table.Header>
|
|
203
|
-
{data.map(([key, value]) => (
|
|
204
|
-
<Table.Row
|
|
205
|
-
key={key}
|
|
206
|
-
style={{
|
|
207
|
-
height: '10px',
|
|
208
|
-
padding: '0 !imporant',
|
|
209
|
-
}}
|
|
210
|
-
>
|
|
211
|
-
<ValueRenderers.Text value={key} />
|
|
212
|
-
{valueCell(value)}
|
|
213
|
-
</Table.Row>
|
|
214
|
-
))}
|
|
215
|
-
</Table>
|
|
214
|
+
/>
|
|
216
215
|
</Collapsible.Content>
|
|
217
216
|
</Collapsible.Root>
|
|
218
217
|
);
|
|
@@ -4,9 +4,16 @@ import { Dialog, DialogBody, DialogFooter } from '@blueprintjs/core';
|
|
|
4
4
|
import { css } from '@emotion/react';
|
|
5
5
|
import styled from '@emotion/styled';
|
|
6
6
|
import type { LogEntry } from 'fifo-logger';
|
|
7
|
-
import { CSSProperties } from 'react';
|
|
7
|
+
import { CSSProperties, useMemo } from 'react';
|
|
8
8
|
|
|
9
|
-
import { Button
|
|
9
|
+
import { Button } from '../button';
|
|
10
|
+
import {
|
|
11
|
+
createTableColumnHelper,
|
|
12
|
+
Table,
|
|
13
|
+
type TableRowTrPropsGetter,
|
|
14
|
+
} from '../table';
|
|
15
|
+
|
|
16
|
+
import { useFifoLogger } from './useFifoLogger';
|
|
10
17
|
|
|
11
18
|
const ActionsFooter = styled.div`
|
|
12
19
|
display: flex;
|
|
@@ -37,8 +44,54 @@ export interface FifoLoggerDialogProps {
|
|
|
37
44
|
unseen: number;
|
|
38
45
|
}
|
|
39
46
|
|
|
47
|
+
const columnHelper = createTableColumnHelper<LogEntry>();
|
|
48
|
+
function useColumns(unseen: number) {
|
|
49
|
+
return useMemo(
|
|
50
|
+
() => [
|
|
51
|
+
columnHelper.display({
|
|
52
|
+
header: '#',
|
|
53
|
+
cell: ({ row }) => {
|
|
54
|
+
return (
|
|
55
|
+
<RowIndexCell
|
|
56
|
+
pillColor={
|
|
57
|
+
row.index >= unseen
|
|
58
|
+
? 'transparent'
|
|
59
|
+
: rowBackgroundColor[row.original.levelLabel]
|
|
60
|
+
}
|
|
61
|
+
>
|
|
62
|
+
{String(row.index + 1)}
|
|
63
|
+
</RowIndexCell>
|
|
64
|
+
);
|
|
65
|
+
},
|
|
66
|
+
}),
|
|
67
|
+
columnHelper.accessor('time', {
|
|
68
|
+
header: 'Time',
|
|
69
|
+
cell: ({ getValue }) => new Date(getValue()).toLocaleTimeString(),
|
|
70
|
+
}),
|
|
71
|
+
columnHelper.accessor('levelLabel', {
|
|
72
|
+
header: 'Level',
|
|
73
|
+
}),
|
|
74
|
+
columnHelper.accessor('message', {
|
|
75
|
+
header: 'Message',
|
|
76
|
+
}),
|
|
77
|
+
],
|
|
78
|
+
[unseen],
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const getRowTrProps: TableRowTrPropsGetter<LogEntry> = (row) => {
|
|
83
|
+
return {
|
|
84
|
+
style: {
|
|
85
|
+
backgroundColor: rowBackgroundColor[row.original.levelLabel],
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
};
|
|
89
|
+
|
|
40
90
|
export function FifoLoggerDialog(props: FifoLoggerDialogProps) {
|
|
41
91
|
const logger = useFifoLogger();
|
|
92
|
+
|
|
93
|
+
const columns = useColumns(props.unseen);
|
|
94
|
+
|
|
42
95
|
return (
|
|
43
96
|
<Dialog
|
|
44
97
|
shouldReturnFocusOnClose={false}
|
|
@@ -55,44 +108,13 @@ export function FifoLoggerDialog(props: FifoLoggerDialogProps) {
|
|
|
55
108
|
>
|
|
56
109
|
<DialogBody>
|
|
57
110
|
<Table
|
|
111
|
+
data={props.logs}
|
|
112
|
+
columns={columns}
|
|
58
113
|
compact
|
|
59
114
|
bordered
|
|
60
|
-
|
|
61
|
-
|
|
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>
|
|
115
|
+
tableProps={{ style: { width: '100%' } }}
|
|
116
|
+
getRowTrProps={getRowTrProps}
|
|
117
|
+
/>
|
|
96
118
|
</DialogBody>
|
|
97
119
|
<DialogFooter
|
|
98
120
|
actions={
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { CellContext, RowData } from '@tanstack/react-table';
|
|
2
|
+
|
|
3
|
+
import * as ValueRenderers from '../value-renderers';
|
|
4
|
+
|
|
5
|
+
// TODO: support Date
|
|
6
|
+
export function defaultTableCell<TData extends RowData, TValue = unknown>(
|
|
7
|
+
context: CellContext<TData, TValue>,
|
|
8
|
+
) {
|
|
9
|
+
const value = context.getValue();
|
|
10
|
+
if (typeof value === 'string') {
|
|
11
|
+
return <ValueRenderers.Text value={value} />;
|
|
12
|
+
} else if (typeof value === 'number') {
|
|
13
|
+
return <ValueRenderers.Number value={value} />;
|
|
14
|
+
} else if (typeof value === 'boolean') {
|
|
15
|
+
return <ValueRenderers.Boolean value={value} />;
|
|
16
|
+
} else {
|
|
17
|
+
// eslint-disable-next-line @typescript-eslint/restrict-template-expressions
|
|
18
|
+
return <ValueRenderers.Text value={`${value}`} />;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
export * from './
|
|
1
|
+
export * from './table_root';
|
|
2
|
+
export * from './table_utils';
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Row, RowData } from '@tanstack/react-table';
|
|
2
|
+
import type { HTMLAttributes } from 'react';
|
|
3
|
+
|
|
4
|
+
import { TableRow } from './table_row';
|
|
5
|
+
import { TableRowCell } from './table_row_cell';
|
|
6
|
+
import type { TableRowTrPropsGetter } from './table_utils';
|
|
7
|
+
|
|
8
|
+
export type TrPropsGetter = Omit<
|
|
9
|
+
HTMLAttributes<HTMLTableRowElement>,
|
|
10
|
+
'children'
|
|
11
|
+
>;
|
|
12
|
+
|
|
13
|
+
interface TableBodyProps<TData extends RowData> {
|
|
14
|
+
rows: Array<Row<TData>>;
|
|
15
|
+
getRowTrProps?: TableRowTrPropsGetter<TData>;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function TableBody<TData extends RowData>(props: TableBodyProps<TData>) {
|
|
19
|
+
const { rows, getRowTrProps } = props;
|
|
20
|
+
return (
|
|
21
|
+
<tbody>
|
|
22
|
+
{rows.map((row) => (
|
|
23
|
+
<TableRow key={row.id} trProps={getRowTrProps?.(row)}>
|
|
24
|
+
{row.getVisibleCells().map((cell) => (
|
|
25
|
+
<TableRowCell key={cell.id} cell={cell} />
|
|
26
|
+
))}
|
|
27
|
+
</TableRow>
|
|
28
|
+
))}
|
|
29
|
+
</tbody>
|
|
30
|
+
);
|
|
31
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { Header, RowData } from '@tanstack/react-table';
|
|
2
|
+
import { CSSProperties } from 'react';
|
|
3
|
+
|
|
4
|
+
import { TableHeaderCell } from './table_header_cell';
|
|
5
|
+
import { TableRow } from './table_row';
|
|
6
|
+
|
|
7
|
+
const headerStyle: CSSProperties = {
|
|
8
|
+
position: 'sticky',
|
|
9
|
+
top: 0,
|
|
10
|
+
zIndex: 10,
|
|
11
|
+
backgroundColor: 'white',
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
interface TableHeaderProps<TData extends RowData> {
|
|
15
|
+
headers: Array<Header<TData, unknown>>;
|
|
16
|
+
sticky: boolean;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function TableHeader<TData extends RowData>(
|
|
20
|
+
props: TableHeaderProps<TData>,
|
|
21
|
+
) {
|
|
22
|
+
const { headers, sticky } = props;
|
|
23
|
+
return (
|
|
24
|
+
<thead style={sticky ? headerStyle : undefined}>
|
|
25
|
+
<TableRow>
|
|
26
|
+
{headers.map((header) => (
|
|
27
|
+
<TableHeaderCell key={header.id} header={header} />
|
|
28
|
+
))}
|
|
29
|
+
</TableRow>
|
|
30
|
+
</thead>
|
|
31
|
+
);
|
|
32
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { flexRender, type Header, type RowData } from '@tanstack/react-table';
|
|
2
|
+
import type { CSSProperties } from 'react';
|
|
3
|
+
|
|
4
|
+
interface TableHeaderCellProps<TData extends RowData> {
|
|
5
|
+
header: Header<TData, unknown>;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export function TableHeaderCell<TData extends RowData>(
|
|
9
|
+
props: TableHeaderCellProps<TData>,
|
|
10
|
+
) {
|
|
11
|
+
const { header } = props;
|
|
12
|
+
const column = header.column;
|
|
13
|
+
|
|
14
|
+
const canSort = column.getCanSort();
|
|
15
|
+
const sorted = column.getIsSorted();
|
|
16
|
+
|
|
17
|
+
const style: CSSProperties = {
|
|
18
|
+
position: 'relative',
|
|
19
|
+
cursor: canSort ? 'pointer' : undefined,
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
return (
|
|
23
|
+
<th
|
|
24
|
+
style={style}
|
|
25
|
+
onClick={canSort ? column.getToggleSortingHandler() : undefined}
|
|
26
|
+
>
|
|
27
|
+
<div style={{ display: 'flex', flexDirection: 'row', gap: '5px' }}>
|
|
28
|
+
{flexRender(header.column.columnDef.header, header.getContext())}
|
|
29
|
+
{sorted
|
|
30
|
+
? {
|
|
31
|
+
asc: '🔼',
|
|
32
|
+
desc: '🔽',
|
|
33
|
+
}[sorted]
|
|
34
|
+
: null}
|
|
35
|
+
</div>
|
|
36
|
+
</th>
|
|
37
|
+
);
|
|
38
|
+
}
|