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.
Files changed (219) hide show
  1. package/lib/app/about/AboutDialogToolbarButton.d.ts +2 -2
  2. package/lib/app/about/AboutDialogToolbarButton.d.ts.map +1 -1
  3. package/lib/app/kinds/ir/IrPeaksPanel.d.ts.map +1 -1
  4. package/lib/app/kinds/ir/IrPeaksPanel.js +7 -18
  5. package/lib/app/kinds/ir/IrPeaksPanel.js.map +1 -1
  6. package/lib/app/panels/SignalProcessingPanel.d.ts.map +1 -1
  7. package/lib/app/panels/SignalProcessingPanel.js +52 -27
  8. package/lib/app/panels/SignalProcessingPanel.js.map +1 -1
  9. package/lib/app/panels/measurements/MeasurementsTable.d.ts.map +1 -1
  10. package/lib/app/panels/measurements/MeasurementsTable.js +6 -6
  11. package/lib/app/panels/measurements/MeasurementsTable.js.map +1 -1
  12. package/lib/app/panels/measurements/measurementPanelContext.d.ts +2 -1
  13. package/lib/app/panels/measurements/measurementPanelContext.d.ts.map +1 -1
  14. package/lib/app/panels/measurements/measurementPanelContext.js.map +1 -1
  15. package/lib/components/color-picker/react-color/common/Swatch.d.ts +2 -2
  16. package/lib/components/color-picker/react-color/common/interaction.d.ts +2 -2
  17. package/lib/components/dialog/ConfirmDialog.js +3 -3
  18. package/lib/components/dialog/ConfirmDialog.js.map +1 -1
  19. package/lib/components/info-panel/InfoPanel.d.ts.map +1 -1
  20. package/lib/components/info-panel/InfoPanel.js +24 -19
  21. package/lib/components/info-panel/InfoPanel.js.map +1 -1
  22. package/lib/components/logger/FifoLoggerDialog.d.ts.map +1 -1
  23. package/lib/components/logger/FifoLoggerDialog.js +37 -9
  24. package/lib/components/logger/FifoLoggerDialog.js.map +1 -1
  25. package/lib/components/root-layout/css-reset/customPreflight.d.ts.map +1 -1
  26. package/lib/components/table/default_table_cell.d.ts +3 -0
  27. package/lib/components/table/default_table_cell.d.ts.map +1 -0
  28. package/lib/components/table/default_table_cell.js +46 -0
  29. package/lib/components/table/default_table_cell.js.map +1 -0
  30. package/lib/components/table/index.d.ts +2 -1
  31. package/lib/components/table/index.d.ts.map +1 -1
  32. package/lib/components/table/index.js +2 -1
  33. package/lib/components/table/index.js.map +1 -1
  34. package/lib/components/table/table_body.d.ts +11 -0
  35. package/lib/components/table/table_body.d.ts.map +1 -0
  36. package/lib/components/table/table_body.js +11 -0
  37. package/lib/components/table/table_body.js.map +1 -0
  38. package/lib/components/table/table_header.d.ts +8 -0
  39. package/lib/components/table/table_header.d.ts.map +1 -0
  40. package/lib/components/table/table_header.js +17 -0
  41. package/lib/components/table/table_header.js.map +1 -0
  42. package/lib/components/table/table_header_cell.d.ts +7 -0
  43. package/lib/components/table/table_header_cell.d.ts.map +1 -0
  44. package/lib/components/table/table_header_cell.js +22 -0
  45. package/lib/components/table/table_header_cell.js.map +1 -0
  46. package/lib/components/table/table_root.d.ts +18 -0
  47. package/lib/components/table/table_root.d.ts.map +1 -0
  48. package/lib/components/table/table_root.js +23 -0
  49. package/lib/components/table/table_root.js.map +1 -0
  50. package/lib/components/table/table_row.d.ts +8 -0
  51. package/lib/components/table/table_row.d.ts.map +1 -0
  52. package/lib/components/table/table_row.js +9 -0
  53. package/lib/components/table/table_row.js.map +1 -0
  54. package/lib/components/table/table_row_cell.d.ts +7 -0
  55. package/lib/components/table/table_row_cell.d.ts.map +1 -0
  56. package/lib/components/table/table_row_cell.js +10 -0
  57. package/lib/components/table/table_row_cell.js.map +1 -0
  58. package/lib/components/table/table_utils.d.ts +6 -0
  59. package/lib/components/table/table_utils.d.ts.map +1 -0
  60. package/lib/components/table/table_utils.js +8 -0
  61. package/lib/components/table/table_utils.js.map +1 -0
  62. package/lib/components/table/use_table_columns.d.ts +4 -0
  63. package/lib/components/table/use_table_columns.d.ts.map +1 -0
  64. package/lib/components/table/use_table_columns.js +17 -0
  65. package/lib/components/table/use_table_columns.js.map +1 -0
  66. package/lib/components/toolbar/PanelPreferencesToolbar.d.ts +2 -1
  67. package/lib/components/toolbar/PanelPreferencesToolbar.d.ts.map +1 -1
  68. package/lib/components/toolbar/PanelPreferencesToolbar.js.map +1 -1
  69. package/lib/components/toolbar/Toolbar.d.ts +2 -2
  70. package/lib/components/toolbar/Toolbar.d.ts.map +1 -1
  71. package/lib/components/toolbar/Toolbar.js +2 -2
  72. package/lib/components/toolbar/Toolbar.js.map +1 -1
  73. package/lib/components/value-renderers/index.d.ts +0 -1
  74. package/lib/components/value-renderers/index.d.ts.map +1 -1
  75. package/lib/components/value-renderers/index.js +1 -3
  76. package/lib/components/value-renderers/index.js.map +1 -1
  77. package/lib-esm/app/about/AboutDialogToolbarButton.d.ts +2 -2
  78. package/lib-esm/app/about/AboutDialogToolbarButton.d.ts.map +1 -1
  79. package/lib-esm/app/kinds/ir/IrPeaksPanel.d.ts.map +1 -1
  80. package/lib-esm/app/kinds/ir/IrPeaksPanel.js +9 -20
  81. package/lib-esm/app/kinds/ir/IrPeaksPanel.js.map +1 -1
  82. package/lib-esm/app/panels/SignalProcessingPanel.d.ts.map +1 -1
  83. package/lib-esm/app/panels/SignalProcessingPanel.js +54 -29
  84. package/lib-esm/app/panels/SignalProcessingPanel.js.map +1 -1
  85. package/lib-esm/app/panels/measurements/MeasurementsTable.d.ts.map +1 -1
  86. package/lib-esm/app/panels/measurements/MeasurementsTable.js +7 -7
  87. package/lib-esm/app/panels/measurements/MeasurementsTable.js.map +1 -1
  88. package/lib-esm/app/panels/measurements/measurementPanelContext.d.ts +2 -1
  89. package/lib-esm/app/panels/measurements/measurementPanelContext.d.ts.map +1 -1
  90. package/lib-esm/app/panels/measurements/measurementPanelContext.js.map +1 -1
  91. package/lib-esm/components/color-picker/react-color/common/Swatch.d.ts +2 -2
  92. package/lib-esm/components/color-picker/react-color/common/interaction.d.ts +2 -2
  93. package/lib-esm/components/dialog/ConfirmDialog.js +1 -1
  94. package/lib-esm/components/dialog/ConfirmDialog.js.map +1 -1
  95. package/lib-esm/components/info-panel/InfoPanel.d.ts.map +1 -1
  96. package/lib-esm/components/info-panel/InfoPanel.js +19 -14
  97. package/lib-esm/components/info-panel/InfoPanel.js.map +1 -1
  98. package/lib-esm/components/logger/FifoLoggerDialog.d.ts.map +1 -1
  99. package/lib-esm/components/logger/FifoLoggerDialog.js +36 -8
  100. package/lib-esm/components/logger/FifoLoggerDialog.js.map +1 -1
  101. package/lib-esm/components/root-layout/css-reset/customPreflight.d.ts.map +1 -1
  102. package/lib-esm/components/table/default_table_cell.d.ts +3 -0
  103. package/lib-esm/components/table/default_table_cell.d.ts.map +1 -0
  104. package/lib-esm/components/table/default_table_cell.js +20 -0
  105. package/lib-esm/components/table/default_table_cell.js.map +1 -0
  106. package/lib-esm/components/table/index.d.ts +2 -1
  107. package/lib-esm/components/table/index.d.ts.map +1 -1
  108. package/lib-esm/components/table/index.js +2 -1
  109. package/lib-esm/components/table/index.js.map +1 -1
  110. package/lib-esm/components/table/table_body.d.ts +11 -0
  111. package/lib-esm/components/table/table_body.d.ts.map +1 -0
  112. package/lib-esm/components/table/table_body.js +8 -0
  113. package/lib-esm/components/table/table_body.js.map +1 -0
  114. package/lib-esm/components/table/table_header.d.ts +8 -0
  115. package/lib-esm/components/table/table_header.d.ts.map +1 -0
  116. package/lib-esm/components/table/table_header.js +14 -0
  117. package/lib-esm/components/table/table_header.js.map +1 -0
  118. package/lib-esm/components/table/table_header_cell.d.ts +7 -0
  119. package/lib-esm/components/table/table_header_cell.d.ts.map +1 -0
  120. package/lib-esm/components/table/table_header_cell.js +19 -0
  121. package/lib-esm/components/table/table_header_cell.js.map +1 -0
  122. package/lib-esm/components/table/table_root.d.ts +18 -0
  123. package/lib-esm/components/table/table_root.d.ts.map +1 -0
  124. package/lib-esm/components/table/table_root.js +20 -0
  125. package/lib-esm/components/table/table_root.js.map +1 -0
  126. package/lib-esm/components/table/table_row.d.ts +8 -0
  127. package/lib-esm/components/table/table_row.d.ts.map +1 -0
  128. package/lib-esm/components/table/table_row.js +6 -0
  129. package/lib-esm/components/table/table_row.js.map +1 -0
  130. package/lib-esm/components/table/table_row_cell.d.ts +7 -0
  131. package/lib-esm/components/table/table_row_cell.d.ts.map +1 -0
  132. package/lib-esm/components/table/table_row_cell.js +7 -0
  133. package/lib-esm/components/table/table_row_cell.js.map +1 -0
  134. package/lib-esm/components/table/table_utils.d.ts +6 -0
  135. package/lib-esm/components/table/table_utils.d.ts.map +1 -0
  136. package/lib-esm/components/table/table_utils.js +5 -0
  137. package/lib-esm/components/table/table_utils.js.map +1 -0
  138. package/lib-esm/components/table/use_table_columns.d.ts +4 -0
  139. package/lib-esm/components/table/use_table_columns.d.ts.map +1 -0
  140. package/lib-esm/components/table/use_table_columns.js +14 -0
  141. package/lib-esm/components/table/use_table_columns.js.map +1 -0
  142. package/lib-esm/components/toolbar/PanelPreferencesToolbar.d.ts +2 -1
  143. package/lib-esm/components/toolbar/PanelPreferencesToolbar.d.ts.map +1 -1
  144. package/lib-esm/components/toolbar/PanelPreferencesToolbar.js.map +1 -1
  145. package/lib-esm/components/toolbar/Toolbar.d.ts +2 -2
  146. package/lib-esm/components/toolbar/Toolbar.d.ts.map +1 -1
  147. package/lib-esm/components/toolbar/Toolbar.js +2 -2
  148. package/lib-esm/components/toolbar/Toolbar.js.map +1 -1
  149. package/lib-esm/components/value-renderers/index.d.ts +0 -1
  150. package/lib-esm/components/value-renderers/index.d.ts.map +1 -1
  151. package/lib-esm/components/value-renderers/index.js +0 -1
  152. package/lib-esm/components/value-renderers/index.js.map +1 -1
  153. package/package.json +30 -30
  154. package/src/app/about/AboutDialogToolbarButton.tsx +2 -2
  155. package/src/app/kinds/ir/IrPeaksPanel.tsx +15 -51
  156. package/src/app/panels/SignalProcessingPanel.tsx +99 -82
  157. package/src/app/panels/measurements/MeasurementsTable.tsx +19 -21
  158. package/src/app/panels/measurements/measurementPanelContext.tsx +2 -2
  159. package/src/components/dialog/ConfirmDialog.tsx +1 -1
  160. package/src/components/info-panel/InfoPanel.tsx +33 -34
  161. package/src/components/logger/FifoLoggerDialog.tsx +60 -38
  162. package/src/components/table/default_table_cell.tsx +20 -0
  163. package/src/components/table/index.ts +2 -1
  164. package/src/components/table/table_body.tsx +31 -0
  165. package/src/components/table/table_header.tsx +32 -0
  166. package/src/components/table/table_header_cell.tsx +38 -0
  167. package/src/components/table/table_root.tsx +77 -0
  168. package/src/components/table/table_row.tsx +14 -0
  169. package/src/components/table/table_row_cell.tsx +17 -0
  170. package/src/components/table/table_utils.ts +21 -0
  171. package/src/components/table/use_table_columns.ts +19 -0
  172. package/src/components/toolbar/PanelPreferencesToolbar.tsx +2 -1
  173. package/src/components/toolbar/Toolbar.tsx +6 -7
  174. package/src/components/value-renderers/index.ts +0 -2
  175. package/lib/components/table/Table.d.ts +0 -17
  176. package/lib/components/table/Table.d.ts.map +0 -1
  177. package/lib/components/table/Table.js +0 -38
  178. package/lib/components/table/Table.js.map +0 -1
  179. package/lib/components/table/TableHeader.d.ts +0 -5
  180. package/lib/components/table/TableHeader.d.ts.map +0 -1
  181. package/lib/components/table/TableHeader.js +0 -16
  182. package/lib/components/table/TableHeader.js.map +0 -1
  183. package/lib/components/table/TableRow.d.ts +0 -5
  184. package/lib/components/table/TableRow.d.ts.map +0 -1
  185. package/lib/components/table/TableRow.js +0 -44
  186. package/lib/components/table/TableRow.js.map +0 -1
  187. package/lib/components/table/tableContext.d.ts +0 -7
  188. package/lib/components/table/tableContext.d.ts.map +0 -1
  189. package/lib/components/table/tableContext.js +0 -11
  190. package/lib/components/table/tableContext.js.map +0 -1
  191. package/lib/components/value-renderers/Header.d.ts +0 -7
  192. package/lib/components/value-renderers/Header.d.ts.map +0 -1
  193. package/lib/components/value-renderers/Header.js +0 -14
  194. package/lib/components/value-renderers/Header.js.map +0 -1
  195. package/lib-esm/components/table/Table.d.ts +0 -17
  196. package/lib-esm/components/table/Table.d.ts.map +0 -1
  197. package/lib-esm/components/table/Table.js +0 -35
  198. package/lib-esm/components/table/Table.js.map +0 -1
  199. package/lib-esm/components/table/TableHeader.d.ts +0 -5
  200. package/lib-esm/components/table/TableHeader.d.ts.map +0 -1
  201. package/lib-esm/components/table/TableHeader.js +0 -12
  202. package/lib-esm/components/table/TableHeader.js.map +0 -1
  203. package/lib-esm/components/table/TableRow.d.ts +0 -5
  204. package/lib-esm/components/table/TableRow.d.ts.map +0 -1
  205. package/lib-esm/components/table/TableRow.js +0 -40
  206. package/lib-esm/components/table/TableRow.js.map +0 -1
  207. package/lib-esm/components/table/tableContext.d.ts +0 -7
  208. package/lib-esm/components/table/tableContext.d.ts.map +0 -1
  209. package/lib-esm/components/table/tableContext.js +0 -7
  210. package/lib-esm/components/table/tableContext.js.map +0 -1
  211. package/lib-esm/components/value-renderers/Header.d.ts +0 -7
  212. package/lib-esm/components/value-renderers/Header.d.ts.map +0 -1
  213. package/lib-esm/components/value-renderers/Header.js +0 -11
  214. package/lib-esm/components/value-renderers/Header.js.map +0 -1
  215. package/src/components/table/Table.tsx +0 -70
  216. package/src/components/table/TableHeader.tsx +0 -24
  217. package/src/components/table/TableRow.tsx +0 -82
  218. package/src/components/table/tableContext.ts +0 -7
  219. 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, Table, ValueRenderers } from '../../components/index';
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
- MeasurementVisibilityToggle,
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.td`
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
- <th>
209
- <MeasurementsIconsContainer
210
- style={{
211
- paddingLeft: '26px',
208
+ <MeasurementsIconsContainer
209
+ style={{
210
+ paddingLeft: '26px',
211
+ }}
212
+ >
213
+ <MeasurementCheckbox
214
+ checked={allSelected}
215
+ onSelectCheckbox={() => {
216
+ onSelectLink(!allSelected);
212
217
  }}
213
- >
214
- <MeasurementCheckbox
215
- checked={allSelected}
216
- onSelectCheckbox={() => {
217
- onSelectLink(!allSelected);
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: React.ReactNode;
24
+ children: ReactNode;
25
25
  value: MeasurementState;
26
26
  }) {
27
27
  return (
@@ -7,7 +7,7 @@ import {
7
7
  } from '@blueprintjs/core';
8
8
  import { css } from '@emotion/react';
9
9
 
10
- import { Button } from '..';
10
+ import { Button } from '../button';
11
11
 
12
12
  interface ConfirmDialogProps extends Omit<DialogProps, 'isCloseButtonShown'> {
13
13
  onConfirm: () => void;
@@ -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 { ValueRenderers } from '../index';
8
- import { Table } from '../table/Table';
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: Array<[string, string | number | object]> = [];
80
- const startsWith: Array<[string, string | number | object]> = [];
81
- const includes: Array<[string, string | number | object]> = [];
82
- const valueContains: Array<[string, string | number | object]> = [];
95
+ const exactMatch: InfoPanelDatum[] = [];
96
+ const startsWith: InfoPanelDatum[] = [];
97
+ const includes: InfoPanelDatum[] = [];
98
+ const valueContains: InfoPanelDatum[] = [];
83
99
 
84
- for (const [key, value] of Object.entries(data).sort(([a], [b]) =>
100
+ for (const [parameter, value] of Object.entries(data).sort(([a], [b]) =>
85
101
  a.localeCompare(b),
86
102
  )) {
87
- const lowerKey = key.toLowerCase();
103
+ const lowerKey = parameter.toLowerCase();
88
104
  const lowerSearch = search.toLowerCase();
89
105
  if (lowerKey === lowerSearch) {
90
- exactMatch.push([key, value]);
106
+ exactMatch.push({ parameter, value });
91
107
  continue;
92
108
  }
93
109
  if (lowerKey.startsWith(lowerSearch)) {
94
- startsWith.push([key, value]);
110
+ startsWith.push({ parameter, value });
95
111
  continue;
96
112
  }
97
113
  if (lowerKey.includes(lowerSearch)) {
98
- includes.push([key, value]);
114
+ includes.push({ parameter, value });
99
115
  continue;
100
116
  }
101
117
  if (valueSearch(value, search)) {
102
- valueContains.push([key, value]);
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: Array<[string, string | number | object]>;
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
- css={css({
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, Table, useFifoLogger, ValueRenderers } from '../index';
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
- 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>
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 './Table';
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
+ }