react-science 0.34.0 → 0.36.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 (193) hide show
  1. package/lib/app/about/AboutDialogToolbarButton.d.ts +3 -3
  2. package/lib/app/about/AboutDialogToolbarButton.d.ts.map +1 -1
  3. package/lib/app/about/AboutDialogToolbarButton.js.map +1 -1
  4. package/lib/app/helpers/react-plot.d.ts.map +1 -1
  5. package/lib/app/helpers/react-plot.js +1 -1
  6. package/lib/app/helpers/react-plot.js.map +1 -1
  7. package/lib/app/kinds/iv/plot-view/IvPlotVariablesSelector.d.ts.map +1 -1
  8. package/lib/app/kinds/iv/plot-view/IvPlotVariablesSelector.js +6 -1
  9. package/lib/app/kinds/iv/plot-view/IvPlotVariablesSelector.js.map +1 -1
  10. package/lib/app/kinds/mass/MeasurementMassPlot.js +1 -1
  11. package/lib/app/kinds/mass/MeasurementMassPlot.js.map +1 -1
  12. package/lib/app/panels/measurements/MeasurementColorPreview.d.ts +1 -1
  13. package/lib/app/panels/measurements/MeasurementColorPreview.d.ts.map +1 -1
  14. package/lib/app/panels/measurements/MeasurementColorPreview.js +19 -16
  15. package/lib/app/panels/measurements/MeasurementColorPreview.js.map +1 -1
  16. package/lib/app/panels/measurements/MeasurementVisibilityToggle.d.ts +3 -3
  17. package/lib/app/panels/measurements/MeasurementVisibilityToggle.d.ts.map +1 -1
  18. package/lib/app/panels/measurements/MeasurementVisibilityToggle.js +6 -6
  19. package/lib/app/panels/measurements/MeasurementVisibilityToggle.js.map +1 -1
  20. package/lib/app/panels/measurements/MeasurementsPanel.d.ts +3 -1
  21. package/lib/app/panels/measurements/MeasurementsPanel.d.ts.map +1 -1
  22. package/lib/app/panels/measurements/MeasurementsPanel.js +17 -13
  23. package/lib/app/panels/measurements/MeasurementsPanel.js.map +1 -1
  24. package/lib/app/panels/measurements/MeasurementsPanelAccordion.d.ts +1 -1
  25. package/lib/app/panels/measurements/MeasurementsPanelAccordion.d.ts.map +1 -1
  26. package/lib/app/panels/measurements/MeasurementsPanelAccordion.js +10 -3
  27. package/lib/app/panels/measurements/MeasurementsPanelAccordion.js.map +1 -1
  28. package/lib/app/panels/measurements/MeasurementsTable.d.ts.map +1 -1
  29. package/lib/app/panels/measurements/MeasurementsTable.js +61 -58
  30. package/lib/app/panels/measurements/MeasurementsTable.js.map +1 -1
  31. package/lib/app/panels/measurements/index.d.ts +5 -0
  32. package/lib/app/panels/measurements/index.d.ts.map +1 -1
  33. package/lib/app/panels/measurements/index.js +5 -0
  34. package/lib/app/panels/measurements/index.js.map +1 -1
  35. package/lib/app/panels/measurements/measurementPanelContext.d.ts +11 -0
  36. package/lib/app/panels/measurements/measurementPanelContext.d.ts.map +1 -0
  37. package/lib/app/panels/measurements/measurementPanelContext.js +19 -0
  38. package/lib/app/panels/measurements/measurementPanelContext.js.map +1 -0
  39. package/lib/components/accordion/Accordion.d.ts.map +1 -1
  40. package/lib/components/accordion/Accordion.js +0 -1
  41. package/lib/components/accordion/Accordion.js.map +1 -1
  42. package/lib/components/button/Button.d.ts +6 -2
  43. package/lib/components/button/Button.d.ts.map +1 -1
  44. package/lib/components/button/Button.js +17 -3
  45. package/lib/components/button/Button.js.map +1 -1
  46. package/lib/components/button/index.d.ts +0 -1
  47. package/lib/components/button/index.d.ts.map +1 -1
  48. package/lib/components/button/index.js +0 -1
  49. package/lib/components/button/index.js.map +1 -1
  50. package/lib/components/color-picker/react-color/sketch/SketchFields.d.ts.map +1 -1
  51. package/lib/components/color-picker/react-color/sketch/SketchFields.js +0 -2
  52. package/lib/components/color-picker/react-color/sketch/SketchFields.js.map +1 -1
  53. package/lib/components/forms/radio-group/RadioGroup.d.ts +0 -1
  54. package/lib/components/forms/radio-group/RadioGroup.d.ts.map +1 -1
  55. package/lib/components/forms/radio-group/RadioGroup.js +4 -9
  56. package/lib/components/forms/radio-group/RadioGroup.js.map +1 -1
  57. package/lib/components/hooks/index.d.ts +1 -0
  58. package/lib/components/hooks/index.d.ts.map +1 -1
  59. package/lib/components/hooks/index.js +1 -0
  60. package/lib/components/hooks/index.js.map +1 -1
  61. package/lib/components/hooks/useSelect.d.ts +21 -0
  62. package/lib/components/hooks/useSelect.d.ts.map +1 -0
  63. package/lib/components/hooks/useSelect.js +45 -0
  64. package/lib/components/hooks/useSelect.js.map +1 -0
  65. package/lib/components/root-layout/RootLayout.js +1 -1
  66. package/lib/components/toolbar/PanelPreferencesToolbar.d.ts +2 -0
  67. package/lib/components/toolbar/PanelPreferencesToolbar.d.ts.map +1 -1
  68. package/lib/components/toolbar/PanelPreferencesToolbar.js +14 -4
  69. package/lib/components/toolbar/PanelPreferencesToolbar.js.map +1 -1
  70. package/lib/components/toolbar/Toolbar.d.ts +13 -4
  71. package/lib/components/toolbar/Toolbar.d.ts.map +1 -1
  72. package/lib/components/toolbar/Toolbar.js +46 -8
  73. package/lib/components/toolbar/Toolbar.js.map +1 -1
  74. package/lib/components/toolbar/toolbarContext.d.ts +2 -0
  75. package/lib/components/toolbar/toolbarContext.d.ts.map +1 -1
  76. package/lib/components/toolbar/toolbarContext.js.map +1 -1
  77. package/lib-esm/app/about/AboutDialogToolbarButton.d.ts +3 -3
  78. package/lib-esm/app/about/AboutDialogToolbarButton.d.ts.map +1 -1
  79. package/lib-esm/app/about/AboutDialogToolbarButton.js.map +1 -1
  80. package/lib-esm/app/helpers/react-plot.d.ts.map +1 -1
  81. package/lib-esm/app/helpers/react-plot.js +1 -1
  82. package/lib-esm/app/helpers/react-plot.js.map +1 -1
  83. package/lib-esm/app/kinds/iv/plot-view/IvPlotVariablesSelector.d.ts.map +1 -1
  84. package/lib-esm/app/kinds/iv/plot-view/IvPlotVariablesSelector.js +6 -1
  85. package/lib-esm/app/kinds/iv/plot-view/IvPlotVariablesSelector.js.map +1 -1
  86. package/lib-esm/app/kinds/mass/MeasurementMassPlot.js +1 -1
  87. package/lib-esm/app/kinds/mass/MeasurementMassPlot.js.map +1 -1
  88. package/lib-esm/app/panels/measurements/MeasurementColorPreview.d.ts +1 -1
  89. package/lib-esm/app/panels/measurements/MeasurementColorPreview.d.ts.map +1 -1
  90. package/lib-esm/app/panels/measurements/MeasurementColorPreview.js +18 -16
  91. package/lib-esm/app/panels/measurements/MeasurementColorPreview.js.map +1 -1
  92. package/lib-esm/app/panels/measurements/MeasurementVisibilityToggle.d.ts +3 -3
  93. package/lib-esm/app/panels/measurements/MeasurementVisibilityToggle.d.ts.map +1 -1
  94. package/lib-esm/app/panels/measurements/MeasurementVisibilityToggle.js +5 -5
  95. package/lib-esm/app/panels/measurements/MeasurementVisibilityToggle.js.map +1 -1
  96. package/lib-esm/app/panels/measurements/MeasurementsPanel.d.ts +3 -1
  97. package/lib-esm/app/panels/measurements/MeasurementsPanel.d.ts.map +1 -1
  98. package/lib-esm/app/panels/measurements/MeasurementsPanel.js +16 -12
  99. package/lib-esm/app/panels/measurements/MeasurementsPanel.js.map +1 -1
  100. package/lib-esm/app/panels/measurements/MeasurementsPanelAccordion.d.ts +1 -1
  101. package/lib-esm/app/panels/measurements/MeasurementsPanelAccordion.d.ts.map +1 -1
  102. package/lib-esm/app/panels/measurements/MeasurementsPanelAccordion.js +10 -3
  103. package/lib-esm/app/panels/measurements/MeasurementsPanelAccordion.js.map +1 -1
  104. package/lib-esm/app/panels/measurements/MeasurementsTable.d.ts.map +1 -1
  105. package/lib-esm/app/panels/measurements/MeasurementsTable.js +63 -37
  106. package/lib-esm/app/panels/measurements/MeasurementsTable.js.map +1 -1
  107. package/lib-esm/app/panels/measurements/index.d.ts +5 -0
  108. package/lib-esm/app/panels/measurements/index.d.ts.map +1 -1
  109. package/lib-esm/app/panels/measurements/index.js +5 -0
  110. package/lib-esm/app/panels/measurements/index.js.map +1 -1
  111. package/lib-esm/app/panels/measurements/measurementPanelContext.d.ts +11 -0
  112. package/lib-esm/app/panels/measurements/measurementPanelContext.d.ts.map +1 -0
  113. package/lib-esm/app/panels/measurements/measurementPanelContext.js +14 -0
  114. package/lib-esm/app/panels/measurements/measurementPanelContext.js.map +1 -0
  115. package/lib-esm/components/accordion/Accordion.d.ts.map +1 -1
  116. package/lib-esm/components/accordion/Accordion.js +0 -1
  117. package/lib-esm/components/accordion/Accordion.js.map +1 -1
  118. package/lib-esm/components/button/Button.d.ts +6 -2
  119. package/lib-esm/components/button/Button.d.ts.map +1 -1
  120. package/lib-esm/components/button/Button.js +18 -4
  121. package/lib-esm/components/button/Button.js.map +1 -1
  122. package/lib-esm/components/button/index.d.ts +0 -1
  123. package/lib-esm/components/button/index.d.ts.map +1 -1
  124. package/lib-esm/components/button/index.js +0 -1
  125. package/lib-esm/components/button/index.js.map +1 -1
  126. package/lib-esm/components/color-picker/react-color/sketch/SketchFields.d.ts.map +1 -1
  127. package/lib-esm/components/color-picker/react-color/sketch/SketchFields.js +0 -2
  128. package/lib-esm/components/color-picker/react-color/sketch/SketchFields.js.map +1 -1
  129. package/lib-esm/components/forms/radio-group/RadioGroup.d.ts +0 -1
  130. package/lib-esm/components/forms/radio-group/RadioGroup.d.ts.map +1 -1
  131. package/lib-esm/components/forms/radio-group/RadioGroup.js +4 -9
  132. package/lib-esm/components/forms/radio-group/RadioGroup.js.map +1 -1
  133. package/lib-esm/components/hooks/index.d.ts +1 -0
  134. package/lib-esm/components/hooks/index.d.ts.map +1 -1
  135. package/lib-esm/components/hooks/index.js +1 -0
  136. package/lib-esm/components/hooks/index.js.map +1 -1
  137. package/lib-esm/components/hooks/useSelect.d.ts +21 -0
  138. package/lib-esm/components/hooks/useSelect.d.ts.map +1 -0
  139. package/lib-esm/components/hooks/useSelect.js +41 -0
  140. package/lib-esm/components/hooks/useSelect.js.map +1 -0
  141. package/lib-esm/components/root-layout/RootLayout.js +1 -1
  142. package/lib-esm/components/toolbar/PanelPreferencesToolbar.d.ts +2 -0
  143. package/lib-esm/components/toolbar/PanelPreferencesToolbar.d.ts.map +1 -1
  144. package/lib-esm/components/toolbar/PanelPreferencesToolbar.js +14 -4
  145. package/lib-esm/components/toolbar/PanelPreferencesToolbar.js.map +1 -1
  146. package/lib-esm/components/toolbar/Toolbar.d.ts +13 -4
  147. package/lib-esm/components/toolbar/Toolbar.d.ts.map +1 -1
  148. package/lib-esm/components/toolbar/Toolbar.js +49 -11
  149. package/lib-esm/components/toolbar/Toolbar.js.map +1 -1
  150. package/lib-esm/components/toolbar/toolbarContext.d.ts +2 -0
  151. package/lib-esm/components/toolbar/toolbarContext.d.ts.map +1 -1
  152. package/lib-esm/components/toolbar/toolbarContext.js.map +1 -1
  153. package/package.json +27 -27
  154. package/src/app/about/AboutDialogToolbarButton.tsx +4 -3
  155. package/src/app/helpers/react-plot.tsx +1 -0
  156. package/src/app/kinds/iv/plot-view/IvPlotVariablesSelector.tsx +7 -1
  157. package/src/app/kinds/mass/MeasurementMassPlot.tsx +2 -2
  158. package/src/app/panels/measurements/MeasurementColorPreview.tsx +30 -31
  159. package/src/app/panels/measurements/MeasurementVisibilityToggle.tsx +17 -14
  160. package/src/app/panels/measurements/MeasurementsPanel.tsx +37 -28
  161. package/src/app/panels/measurements/MeasurementsPanelAccordion.tsx +15 -2
  162. package/src/app/panels/measurements/MeasurementsTable.tsx +153 -57
  163. package/src/app/panels/measurements/index.ts +5 -0
  164. package/src/app/panels/measurements/measurementPanelContext.tsx +32 -0
  165. package/src/components/accordion/Accordion.tsx +0 -1
  166. package/src/components/button/Button.tsx +35 -4
  167. package/src/components/button/index.ts +0 -1
  168. package/src/components/color-picker/react-color/sketch/SketchFields.tsx +0 -2
  169. package/src/components/forms/radio-group/RadioGroup.tsx +3 -14
  170. package/src/components/hooks/index.ts +1 -0
  171. package/src/components/hooks/useSelect.tsx +58 -0
  172. package/src/components/root-layout/RootLayout.tsx +1 -1
  173. package/src/components/toolbar/PanelPreferencesToolbar.tsx +38 -20
  174. package/src/components/toolbar/Toolbar.tsx +112 -10
  175. package/src/components/toolbar/toolbarContext.ts +3 -0
  176. package/lib/components/button/ButtonGroup.d.ts +0 -15
  177. package/lib/components/button/ButtonGroup.d.ts.map +0 -1
  178. package/lib/components/button/ButtonGroup.js +0 -42
  179. package/lib/components/button/ButtonGroup.js.map +0 -1
  180. package/lib/components/forms/radio-group/ClassicRadioItem.d.ts +0 -3
  181. package/lib/components/forms/radio-group/ClassicRadioItem.d.ts.map +0 -1
  182. package/lib/components/forms/radio-group/ClassicRadioItem.js +0 -93
  183. package/lib/components/forms/radio-group/ClassicRadioItem.js.map +0 -1
  184. package/lib-esm/components/button/ButtonGroup.d.ts +0 -15
  185. package/lib-esm/components/button/ButtonGroup.d.ts.map +0 -1
  186. package/lib-esm/components/button/ButtonGroup.js +0 -35
  187. package/lib-esm/components/button/ButtonGroup.js.map +0 -1
  188. package/lib-esm/components/forms/radio-group/ClassicRadioItem.d.ts +0 -3
  189. package/lib-esm/components/forms/radio-group/ClassicRadioItem.d.ts.map +0 -1
  190. package/lib-esm/components/forms/radio-group/ClassicRadioItem.js +0 -66
  191. package/lib-esm/components/forms/radio-group/ClassicRadioItem.js.map +0 -1
  192. package/src/components/button/ButtonGroup.tsx +0 -57
  193. package/src/components/forms/radio-group/ClassicRadioItem.tsx +0 -95
@@ -1,15 +1,14 @@
1
- import { FaEye, FaEyeSlash } from 'react-icons/fa';
2
-
3
1
  import { useAppDispatch } from '../../../app-data/index';
2
+ import { Button } from '../../../components/index';
4
3
 
5
- import { MeasurementsTableProps } from './MeasurementsTable';
4
+ import { MeasurementsTableProps } from '.';
6
5
 
7
6
  interface MeasurementVisibilityToggleProps {
8
7
  id: string;
9
8
  isVisible: boolean;
10
9
  }
11
10
 
12
- export default function MeasurementVisibilityToggle(
11
+ export function MeasurementVisibilityToggle(
13
12
  props: MeasurementVisibilityToggleProps,
14
13
  ) {
15
14
  const { id, isVisible } = props;
@@ -23,20 +22,22 @@ export default function MeasurementVisibilityToggle(
23
22
  }
24
23
 
25
24
  return isVisible ? (
26
- <FaEye onClick={() => setVisibility(false)} style={{ cursor: 'pointer' }} />
25
+ <Button icon="eye-on" onClick={() => setVisibility(false)} minimal />
27
26
  ) : (
28
- <FaEyeSlash
27
+ <Button
28
+ icon="eye-off"
29
29
  onClick={() => setVisibility(true)}
30
- style={{ cursor: 'pointer', opacity: 0.6 }}
30
+ style={{ opacity: 0.6 }}
31
+ minimal
31
32
  />
32
33
  );
33
34
  }
34
35
 
35
36
  export function MeasurementSelectedVisibilityChange(props: {
36
- openedEyes: boolean;
37
+ isVisible: boolean;
37
38
  kind: MeasurementsTableProps['kind'];
38
39
  }) {
39
- const { kind, openedEyes } = props;
40
+ const { kind, isVisible } = props;
40
41
  const dispatch = useAppDispatch();
41
42
 
42
43
  function setVisibility(isVisible: boolean) {
@@ -46,12 +47,14 @@ export function MeasurementSelectedVisibilityChange(props: {
46
47
  });
47
48
  }
48
49
 
49
- return openedEyes ? (
50
- <FaEye onClick={() => setVisibility(false)} style={{ cursor: 'pointer' }} />
50
+ return isVisible ? (
51
+ <Button icon="eye-on" onClick={() => setVisibility(true)} minimal />
51
52
  ) : (
52
- <FaEyeSlash
53
- onClick={() => setVisibility(true)}
54
- style={{ cursor: 'pointer', opacity: 0.6 }}
53
+ <Button
54
+ icon="eye-off"
55
+ onClick={() => setVisibility(false)}
56
+ style={{ opacity: 0.6 }}
57
+ minimal
55
58
  />
56
59
  );
57
60
  }
@@ -1,6 +1,7 @@
1
1
  /** @jsxImportSource @emotion/react */
2
- import { Tab, Tabs } from '@blueprintjs/core';
2
+ import { PanelProps, Tab, Tabs } from '@blueprintjs/core';
3
3
  import { css } from '@emotion/react';
4
+ import { useMemo } from 'react';
4
5
 
5
6
  import {
6
7
  kindLabels,
@@ -10,9 +11,9 @@ import {
10
11
  useAppState,
11
12
  } from '../../../app-data';
12
13
 
13
- import { MeasurementsTable } from './MeasurementsTable';
14
+ import { MeasurementsTable, MeasurementPanelProvider } from '.';
14
15
 
15
- export function MeasurementsPanel() {
16
+ export function MeasurementsPanel({ openPanel }: PanelProps<object>) {
16
17
  const appState = useAppState();
17
18
  const { data, view } = appState;
18
19
 
@@ -36,34 +37,42 @@ export function MeasurementsPanel() {
36
37
  payload: id,
37
38
  });
38
39
  }
40
+ const measurementState = useMemo(
41
+ () => ({
42
+ openPanel,
43
+ }),
44
+ [openPanel],
45
+ );
39
46
 
40
47
  if (items.length > 0) {
41
48
  return (
42
- <Tabs
43
- selectedTabId={view.selectedKind}
44
- onChange={handleTabSelection}
45
- css={css`
46
- div[role='tablist'] {
47
- overflow-x: auto;
48
- padding: 2px 0 0 1rem;
49
- border-bottom: 1px solid gray;
50
- }
51
- div[role='tabpanel'] {
52
- margin-top: 4px;
53
- }
54
- `}
55
- >
56
- {items.map((item) => (
57
- <Tab
58
- id={item.id}
59
- key={item.id}
60
- title={item.title}
61
- panel={item.content}
62
- tagContent={data.measurements[item.id].entries.length}
63
- tagProps={{ round: true }}
64
- />
65
- ))}
66
- </Tabs>
49
+ <MeasurementPanelProvider value={measurementState}>
50
+ <Tabs
51
+ selectedTabId={view.selectedKind}
52
+ onChange={handleTabSelection}
53
+ css={css`
54
+ div[role='tablist'] {
55
+ overflow-x: auto;
56
+ padding: 2px 0 0 1rem;
57
+ border-bottom: 1px solid gray;
58
+ }
59
+ div[role='tabpanel'] {
60
+ margin-top: 4px;
61
+ }
62
+ `}
63
+ >
64
+ {items.map((item) => (
65
+ <Tab
66
+ id={item.id}
67
+ key={item.id}
68
+ title={item.title}
69
+ panel={item.content}
70
+ tagContent={data.measurements[item.id].entries.length}
71
+ tagProps={{ round: true }}
72
+ />
73
+ ))}
74
+ </Tabs>
75
+ </MeasurementPanelProvider>
67
76
  );
68
77
  }
69
78
 
@@ -1,3 +1,7 @@
1
+ /** @jsxImportSource @emotion/react */
2
+ import { PanelStack2 } from '@blueprintjs/core';
3
+ import { css } from '@emotion/react';
4
+
1
5
  import {
2
6
  getExistingMeasurementKinds,
3
7
  kindLabels,
@@ -5,7 +9,7 @@ import {
5
9
  } from '../../../app-data/index';
6
10
  import { Accordion } from '../../../components/index';
7
11
 
8
- import { MeasurementsPanel } from './MeasurementsPanel';
12
+ import { MeasurementsPanel } from '.';
9
13
 
10
14
  export function MeasurementsPanelAccordion() {
11
15
  const appData = useAppData();
@@ -16,7 +20,16 @@ export function MeasurementsPanelAccordion() {
16
20
  : 'Measurements';
17
21
  return (
18
22
  <Accordion.Item title={title} defaultOpened>
19
- <MeasurementsPanel />
23
+ <PanelStack2
24
+ css={css`
25
+ height: 100%;
26
+ `}
27
+ initialPanel={{
28
+ renderPanel: MeasurementsPanel,
29
+ }}
30
+ showPanelHeader={false}
31
+ renderActivePanelOnly={false}
32
+ />
20
33
  </Accordion.Item>
21
34
  );
22
35
  }
@@ -1,19 +1,31 @@
1
+ import { Menu, MenuItem, Popover } from '@blueprintjs/core';
1
2
  import styled from '@emotion/styled';
2
- import { FaTrash } from 'react-icons/fa';
3
+ import { useMemo } from 'react';
3
4
 
4
5
  import {
5
6
  MeasurementBase,
6
7
  MeasurementKind,
8
+ getMeasurement,
7
9
  useAppDispatch,
8
10
  useAppState,
9
11
  } from '../../../app-data';
10
- import { ConfirmDialog, useOnOff } from '../../../components';
12
+ import {
13
+ Button,
14
+ ConfirmDialog,
15
+ InfoPanel,
16
+ InfoPanelData,
17
+ PanelPreferencesToolbar,
18
+ useOnOff,
19
+ } from '../../../components';
20
+ import { MeasurementConfigPanel } from '../index';
11
21
 
12
- import { MeasurementCheckbox } from './MeasurementCheckbox';
13
- import MeasurementColorPreview from './MeasurementColorPreview';
14
- import MeasurementVisibilityToggle, {
22
+ import {
23
+ MeasurementColorPreview,
24
+ MeasurementCheckbox,
25
+ MeasurementVisibilityToggle,
15
26
  MeasurementSelectedVisibilityChange,
16
- } from './MeasurementVisibilityToggle';
27
+ useMeasurementPanel,
28
+ } from '.';
17
29
 
18
30
  export interface MeasurementsTableProps {
19
31
  kind: MeasurementKind;
@@ -49,13 +61,6 @@ const MeasurementsTableBody = styled.tbody`
49
61
  background-color: white;
50
62
  `;
51
63
 
52
- const MeasurementsLinkButton = styled.span`
53
- cursor: pointer;
54
- :hover {
55
- text-decoration: underline;
56
- }
57
- `;
58
-
59
64
  const MeasurementsHeaderColumn = styled.div`
60
65
  display: flex;
61
66
  flex-direction: row;
@@ -65,7 +70,6 @@ const MeasurementsHeaderColumn = styled.div`
65
70
  padding-right: 5px;
66
71
  border-bottom: 1px solid black;
67
72
  `;
68
-
69
73
  const MeasurementsHeaderGroup = styled.div`
70
74
  display: flex;
71
75
  gap: 6px;
@@ -88,14 +92,14 @@ const MeasurementsTableRowData = styled.tr`
88
92
 
89
93
  const MeasurementsIconsContainer = styled.td`
90
94
  display: flex;
91
- justify-content: center;
95
+ justify-content: flex-start;
92
96
  align-items: center;
93
97
  justify-items: center;
94
98
  height: 50px;
95
99
  flex-direction: row;
96
- gap: 0.5rem;
97
100
  cursor: default;
98
- width: 70px;
101
+ gap: 2px;
102
+ width: 100px;
99
103
  `;
100
104
 
101
105
  export function MeasurementsTable(props: MeasurementsTableProps) {
@@ -110,16 +114,6 @@ export function MeasurementsTable(props: MeasurementsTableProps) {
110
114
 
111
115
  const hasSelectedMeasurements = (selectedMeasurements[kind]?.length ?? 0) > 0;
112
116
 
113
- function onSelectLink(select: boolean) {
114
- dispatch({
115
- type: 'SELECT_ALL_MEASUREMENTS',
116
- payload: {
117
- kind,
118
- select,
119
- },
120
- });
121
- }
122
-
123
117
  function onRemove() {
124
118
  dispatch({ type: 'REMOVE_SELECTED_MEASUREMENTS', payload: { kind } });
125
119
  closeRemoveDialog();
@@ -129,21 +123,13 @@ export function MeasurementsTable(props: MeasurementsTableProps) {
129
123
  <MeasurementsTableContainer>
130
124
  <MeasurementsHeaderColumn>
131
125
  <MeasurementsHeaderGroup>
132
- <MeasurementsLinkButton onClick={() => onSelectLink(true)}>
133
- Select all
134
- </MeasurementsLinkButton>
135
- <MeasurementsLinkButton onClick={() => onSelectLink(false)}>
136
- Unselect all
137
- </MeasurementsLinkButton>
138
- </MeasurementsHeaderGroup>
139
- <MeasurementsHeaderGroup>
140
- <MeasurementSelectedVisibilityChange kind={kind} openedEyes />
141
- <MeasurementSelectedVisibilityChange kind={kind} openedEyes={false} />
142
- <FaTrash
143
- style={
144
- hasSelectedMeasurements ? { cursor: 'pointer' } : { opacity: 0.6 }
145
- }
126
+ <Button
127
+ minimal
128
+ icon="trash"
129
+ intent="danger"
130
+ style={{ opacity: hasSelectedMeasurements ? 1 : 0.6 }}
146
131
  onClick={hasSelectedMeasurements ? openRemoveDialog : undefined}
132
+ tooltipProps={{ content: 'Remove selected', position: 'bottom' }}
147
133
  />
148
134
  </MeasurementsHeaderGroup>
149
135
  <ConfirmDialog
@@ -160,7 +146,7 @@ export function MeasurementsTable(props: MeasurementsTableProps) {
160
146
  </MeasurementsHeaderColumn>
161
147
 
162
148
  <MeasurementsTableRoot>
163
- <MeasurementsTableHeader />
149
+ <MeasurementsTableHeader kind={kind} />
164
150
  <MeasurementsTableBody>
165
151
  {measurements[kind].entries.map((element) => (
166
152
  <MeasurementsTableRow key={element.id} item={element} kind={kind} />
@@ -171,15 +157,8 @@ export function MeasurementsTable(props: MeasurementsTableProps) {
171
157
  );
172
158
  }
173
159
 
174
- const TableHeaderEmpty = styled.th`
175
- display: flex;
176
- gap: 5px;
177
- align-items: center;
178
- width: 70px;
179
- `;
180
-
181
160
  const TableHeaderFilename = styled.th`
182
- width: 60%;
161
+ width: 50%;
183
162
  `;
184
163
 
185
164
  const TableHeaderTechnique = styled.th`
@@ -187,15 +166,63 @@ const TableHeaderTechnique = styled.th`
187
166
  `;
188
167
 
189
168
  const TableDataHeaderName = styled.td`
190
- width: 60%;
169
+ width: 50%;
191
170
  overflow: hidden;
192
171
  `;
193
172
 
194
- function MeasurementsTableHeader() {
173
+ function MeasurementsTableHeader({
174
+ kind,
175
+ }: {
176
+ kind: MeasurementsTableProps['kind'];
177
+ }) {
178
+ const {
179
+ data: { measurements: measurementsData },
180
+ view: { selectedMeasurements, measurements },
181
+ } = useAppState();
182
+ const dispatch = useAppDispatch();
183
+ function onSelectLink(select: boolean) {
184
+ dispatch({
185
+ type: 'SELECT_ALL_MEASUREMENTS',
186
+ payload: {
187
+ kind,
188
+ select,
189
+ },
190
+ });
191
+ }
192
+ const allSelected = useMemo(
193
+ () =>
194
+ selectedMeasurements[kind]?.length ===
195
+ measurementsData[kind]?.entries.length,
196
+ [kind, measurementsData, selectedMeasurements],
197
+ );
198
+ const selectedVisible = useMemo(() => {
199
+ const ids = selectedMeasurements[kind];
200
+ if (ids) {
201
+ return ids.every((id) => measurements[id]?.visible);
202
+ }
203
+ return false;
204
+ }, [selectedMeasurements, kind, measurements]);
195
205
  return (
196
206
  <thead>
197
207
  <MeasurementsTableHeaderStyled>
198
- <TableHeaderEmpty />
208
+ <th>
209
+ <MeasurementsIconsContainer
210
+ style={{
211
+ paddingLeft: '26px',
212
+ }}
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>
199
226
  <TableHeaderFilename>Filename</TableHeaderFilename>
200
227
  <TableHeaderTechnique>Technique</TableHeaderTechnique>
201
228
  </MeasurementsTableHeaderStyled>
@@ -205,8 +232,10 @@ function MeasurementsTableHeader() {
205
232
 
206
233
  function MeasurementsTableRow(props: MeasurementsTableRowProps) {
207
234
  const { item, kind } = props;
235
+ const { openPanel } = useMeasurementPanel();
208
236
 
209
237
  const {
238
+ data,
210
239
  view: { selectedMeasurements, measurements },
211
240
  } = useAppState();
212
241
 
@@ -227,10 +256,81 @@ function MeasurementsTableRow(props: MeasurementsTableRowProps) {
227
256
  payload: { id: item.id, kind, acc: isAlreadyChecked ? 'remove' : 'add' },
228
257
  });
229
258
  }
259
+ const { info = {}, meta = {} } =
260
+ getMeasurement(data.measurements, kind, item.id) || {};
261
+
262
+ const infoPanelData: InfoPanelData[] = [
263
+ {
264
+ description: 'Information',
265
+ data: info,
266
+ },
267
+ {
268
+ description: 'Metadata',
269
+ data: meta,
270
+ },
271
+ ];
272
+ const content = (
273
+ <Menu
274
+ style={{
275
+ minWidth: 0,
276
+ }}
277
+ >
278
+ <MenuItem
279
+ text="Information"
280
+ icon="info-sign"
281
+ onClick={() =>
282
+ openPanel?.({
283
+ title: item.info.file?.name ?? item.info.title,
284
+ renderPanel: ({ closePanel }) => (
285
+ <div>
286
+ <PanelPreferencesToolbar
287
+ title={item.info.file?.name ?? item.info.title}
288
+ onClose={closePanel}
289
+ />
290
+ <InfoPanel data={infoPanelData} title="" />
291
+ </div>
292
+ ),
293
+ })
294
+ }
295
+ />
296
+ <MenuItem
297
+ text="Configuration"
298
+ icon="settings"
299
+ onClick={() =>
300
+ openPanel?.({
301
+ title: item.info.file?.name ?? item.info.title,
302
+ renderPanel: ({ closePanel }) => (
303
+ <div>
304
+ <PanelPreferencesToolbar
305
+ title={item.info.file?.name ?? item.info.title}
306
+ onClose={closePanel}
307
+ />
308
+ <MeasurementConfigPanel />
309
+ </div>
310
+ ),
311
+ })
312
+ }
313
+ />
314
+ </Menu>
315
+ );
230
316
 
231
317
  return (
232
318
  <MeasurementsTableRowData>
233
319
  <MeasurementsIconsContainer>
320
+ <Popover content={content} position="bottom-left">
321
+ <Button
322
+ minimal
323
+ icon="more"
324
+ style={{
325
+ transform: 'rotate(90deg)',
326
+ }}
327
+ small
328
+ />
329
+ </Popover>
330
+ <MeasurementCheckbox
331
+ checked={selectedMeasurements[kind]?.includes(item.id) || false}
332
+ onSelectCheckbox={onSelectCheckbox}
333
+ />
234
334
  <MeasurementVisibilityToggle
235
335
  id={item.id}
236
336
  isVisible={measurements[item.id].visible}
@@ -240,10 +340,6 @@ function MeasurementsTableRow(props: MeasurementsTableRowProps) {
240
340
  kind={kind}
241
341
  color={measurements[item.id].color}
242
342
  />
243
- <MeasurementCheckbox
244
- checked={selectedMeasurements[kind]?.includes(item.id) || false}
245
- onSelectCheckbox={onSelectCheckbox}
246
- />
247
343
  </MeasurementsIconsContainer>
248
344
  <TableDataHeaderName onClick={onSelectRow} title={item.id}>
249
345
  {item.info.file?.name ?? item.info.title}
@@ -1,2 +1,7 @@
1
1
  export * from './MeasurementsPanelAccordion';
2
2
  export * from './MeasurementsPanel';
3
+ export * from './MeasurementsTable';
4
+ export * from './measurementPanelContext';
5
+ export * from './MeasurementVisibilityToggle';
6
+ export * from './MeasurementCheckbox';
7
+ export * from './MeasurementColorPreview';
@@ -0,0 +1,32 @@
1
+ import { Panel } from '@blueprintjs/core';
2
+ import { createContext, useContext } from 'react';
3
+
4
+ export interface MeasurementState {
5
+ openPanel?: (panel: Panel<object>) => void;
6
+ }
7
+
8
+ const measurementPanelContext = createContext<MeasurementState>({});
9
+
10
+ export function useMeasurementPanel() {
11
+ const context = useContext(measurementPanelContext);
12
+ if (!context) {
13
+ throw new Error(
14
+ 'useMeasurementPanel must be used within a MeasurementPanel',
15
+ );
16
+ }
17
+ return context;
18
+ }
19
+
20
+ export function MeasurementPanelProvider({
21
+ children,
22
+ value,
23
+ }: {
24
+ children: React.ReactNode;
25
+ value: MeasurementState;
26
+ }) {
27
+ return (
28
+ <measurementPanelContext.Provider value={value}>
29
+ {children}
30
+ </measurementPanelContext.Provider>
31
+ );
32
+ }
@@ -46,7 +46,6 @@ const styles = {
46
46
  padding: '5px 12px',
47
47
  display: 'flex',
48
48
  alignItems: 'center',
49
- fontSize: '1em',
50
49
  borderColor: 'rgb(213, 213, 213) currentcolor currentcolor',
51
50
  borderStyle: 'solid none none',
52
51
  color: 'rgb(45, 45, 45)',
@@ -1,11 +1,16 @@
1
+ /** @jsxImportSource @emotion/react */
1
2
  import {
2
3
  AnchorButton as BlueprintAnchorButton,
3
4
  AnchorButtonProps as BlueprintAnchorButtonProps,
4
5
  Button as BlueprintButton,
5
6
  ButtonProps as BlueprintButtonProps,
7
+ Tag,
8
+ TagProps,
6
9
  Tooltip,
7
10
  TooltipProps,
8
11
  } from '@blueprintjs/core';
12
+ import { css } from '@emotion/react';
13
+ import { ReactNode } from 'react';
9
14
 
10
15
  type BlueprintProps = {
11
16
  [key in keyof BlueprintButtonProps &
@@ -14,10 +19,12 @@ type BlueprintProps = {
14
19
  };
15
20
  export type ButtonProps = BlueprintProps & {
16
21
  tooltipProps?: Omit<TooltipProps, 'children'>;
22
+ tag?: ReactNode;
23
+ tagProps?: Omit<TagProps, 'children'>;
17
24
  };
18
25
 
19
26
  export function Button(props: ButtonProps) {
20
- const { tooltipProps, children, ...buttonProps } = props;
27
+ const { tooltipProps, children, tag, tagProps, ...buttonProps } = props;
21
28
 
22
29
  const InnerButton = buttonProps.disabled
23
30
  ? BlueprintAnchorButton
@@ -27,9 +34,33 @@ export function Button(props: ButtonProps) {
27
34
  fill={tooltipProps?.fill || buttonProps.fill}
28
35
  {...tooltipProps}
29
36
  renderTarget={({ isOpen, ...targetProps }) => (
30
- <InnerButton {...targetProps} {...buttonProps}>
31
- {children}
32
- </InnerButton>
37
+ <div style={{ position: 'relative' }}>
38
+ {tag && (
39
+ <Tag
40
+ css={css`
41
+ position: absolute;
42
+ top: 0;
43
+ left: 0;
44
+ cursor: default;
45
+ font-size: 0.875em;
46
+ padding: 2px !important;
47
+ min-height: 15px;
48
+ min-width: 15px;
49
+ line-height: 1em;
50
+ text-align: center;
51
+ z-index: 20;
52
+ `}
53
+ round
54
+ intent="success"
55
+ {...tagProps}
56
+ >
57
+ {tag}
58
+ </Tag>
59
+ )}
60
+ <InnerButton {...targetProps} {...buttonProps} style={{}}>
61
+ {children}
62
+ </InnerButton>
63
+ </div>
33
64
  )}
34
65
  />
35
66
  );
@@ -1,2 +1 @@
1
1
  export * from './Button';
2
- export * from './ButtonGroup';
@@ -41,14 +41,12 @@ const styles: Record<
41
41
  padding: '4px 10% 3px',
42
42
  border: 'none',
43
43
  boxShadow: 'inset 0 0 0 1px #ccc',
44
- fontSize: '1em',
45
44
  textAlign: 'center',
46
45
  borderRadius: '3px',
47
46
  },
48
47
  label: {
49
48
  display: 'block',
50
49
  textAlign: 'center',
51
- fontSize: '1em',
52
50
  color: '#222',
53
51
  paddingTop: '3px',
54
52
  paddingBottom: '4px',