react-science 6.0.1 → 7.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 (93) hide show
  1. package/lib/app/explorer/MeasurementExplorer.d.ts +2 -3
  2. package/lib/app/explorer/MeasurementExplorer.d.ts.map +1 -1
  3. package/lib/app/explorer/MeasurementExplorer.js +2 -2
  4. package/lib/app/explorer/MeasurementExplorer.js.map +1 -1
  5. package/lib/app/panels/measurements/MeasurementsPanel.d.ts.map +1 -1
  6. package/lib/app/panels/measurements/MeasurementsPanel.js +1 -0
  7. package/lib/app/panels/measurements/MeasurementsPanel.js.map +1 -1
  8. package/lib/app/panels/measurements/MeasurementsTable.js +2 -2
  9. package/lib/app/panels/measurements/MeasurementsTable.js.map +1 -1
  10. package/lib/app-data/kinds/iv/IvMeasurement.d.ts +1 -2
  11. package/lib/app-data/kinds/iv/IvMeasurement.d.ts.map +1 -1
  12. package/lib/app-data/state/data/data.helpers.d.ts +1 -1
  13. package/lib/components/button/Button.d.ts.map +1 -1
  14. package/lib/components/button/Button.js +19 -13
  15. package/lib/components/button/Button.js.map +1 -1
  16. package/lib/components/color-picker/gradient-select/GradientSelect.js +2 -2
  17. package/lib/components/color-picker/gradient-select/GradientSelect.js.map +1 -1
  18. package/lib/components/header/PanelHeader.d.ts.map +1 -1
  19. package/lib/components/header/PanelHeader.js +2 -19
  20. package/lib/components/header/PanelHeader.js.map +1 -1
  21. package/lib/components/index.d.ts +1 -0
  22. package/lib/components/index.d.ts.map +1 -1
  23. package/lib/components/index.js +1 -0
  24. package/lib/components/index.js.map +1 -1
  25. package/lib/components/info-panel/InfoPanel.d.ts.map +1 -1
  26. package/lib/components/info-panel/InfoPanel.js +18 -12
  27. package/lib/components/info-panel/InfoPanel.js.map +1 -1
  28. package/lib/components/selected-total/SelectedTotal.d.ts +7 -0
  29. package/lib/components/selected-total/SelectedTotal.d.ts.map +1 -0
  30. package/lib/components/selected-total/SelectedTotal.js +25 -0
  31. package/lib/components/selected-total/SelectedTotal.js.map +1 -0
  32. package/lib/components/selected-total/index.d.ts +2 -0
  33. package/lib/components/selected-total/index.d.ts.map +1 -0
  34. package/lib/components/selected-total/index.js +18 -0
  35. package/lib/components/selected-total/index.js.map +1 -0
  36. package/lib/components/toolbar/Toolbar.d.ts +5 -14
  37. package/lib/components/toolbar/Toolbar.d.ts.map +1 -1
  38. package/lib/components/toolbar/Toolbar.js +28 -13
  39. package/lib/components/toolbar/Toolbar.js.map +1 -1
  40. package/lib-esm/app/explorer/MeasurementExplorer.d.ts +2 -3
  41. package/lib-esm/app/explorer/MeasurementExplorer.d.ts.map +1 -1
  42. package/lib-esm/app/explorer/MeasurementExplorer.js +2 -2
  43. package/lib-esm/app/explorer/MeasurementExplorer.js.map +1 -1
  44. package/lib-esm/app/panels/measurements/MeasurementsPanel.d.ts.map +1 -1
  45. package/lib-esm/app/panels/measurements/MeasurementsPanel.js +2 -1
  46. package/lib-esm/app/panels/measurements/MeasurementsPanel.js.map +1 -1
  47. package/lib-esm/app/panels/measurements/MeasurementsTable.js +2 -2
  48. package/lib-esm/app/panels/measurements/MeasurementsTable.js.map +1 -1
  49. package/lib-esm/app-data/kinds/iv/IvMeasurement.d.ts +1 -2
  50. package/lib-esm/app-data/kinds/iv/IvMeasurement.d.ts.map +1 -1
  51. package/lib-esm/app-data/state/data/data.helpers.d.ts +3 -3
  52. package/lib-esm/components/button/Button.d.ts.map +1 -1
  53. package/lib-esm/components/button/Button.js +20 -14
  54. package/lib-esm/components/button/Button.js.map +1 -1
  55. package/lib-esm/components/color-picker/gradient-select/GradientSelect.js +2 -2
  56. package/lib-esm/components/color-picker/gradient-select/GradientSelect.js.map +1 -1
  57. package/lib-esm/components/header/PanelHeader.d.ts.map +1 -1
  58. package/lib-esm/components/header/PanelHeader.js +2 -19
  59. package/lib-esm/components/header/PanelHeader.js.map +1 -1
  60. package/lib-esm/components/index.d.ts +1 -0
  61. package/lib-esm/components/index.d.ts.map +1 -1
  62. package/lib-esm/components/index.js +1 -0
  63. package/lib-esm/components/index.js.map +1 -1
  64. package/lib-esm/components/info-panel/InfoPanel.d.ts.map +1 -1
  65. package/lib-esm/components/info-panel/InfoPanel.js +19 -13
  66. package/lib-esm/components/info-panel/InfoPanel.js.map +1 -1
  67. package/lib-esm/components/selected-total/SelectedTotal.d.ts +7 -0
  68. package/lib-esm/components/selected-total/SelectedTotal.d.ts.map +1 -0
  69. package/lib-esm/components/selected-total/SelectedTotal.js +22 -0
  70. package/lib-esm/components/selected-total/SelectedTotal.js.map +1 -0
  71. package/lib-esm/components/selected-total/index.d.ts +2 -0
  72. package/lib-esm/components/selected-total/index.d.ts.map +1 -0
  73. package/lib-esm/components/selected-total/index.js +2 -0
  74. package/lib-esm/components/selected-total/index.js.map +1 -0
  75. package/lib-esm/components/table/table_utils.d.ts +1 -1
  76. package/lib-esm/components/table/table_utils.d.ts.map +1 -1
  77. package/lib-esm/components/toolbar/Toolbar.d.ts +5 -14
  78. package/lib-esm/components/toolbar/Toolbar.d.ts.map +1 -1
  79. package/lib-esm/components/toolbar/Toolbar.js +28 -13
  80. package/lib-esm/components/toolbar/Toolbar.js.map +1 -1
  81. package/package.json +33 -31
  82. package/src/app/explorer/MeasurementExplorer.tsx +6 -4
  83. package/src/app/panels/measurements/MeasurementsPanel.tsx +2 -1
  84. package/src/app/panels/measurements/MeasurementsTable.tsx +4 -4
  85. package/src/app-data/kinds/iv/IvMeasurement.ts +1 -1
  86. package/src/components/button/Button.tsx +41 -28
  87. package/src/components/color-picker/gradient-select/GradientSelect.tsx +2 -2
  88. package/src/components/header/PanelHeader.tsx +2 -20
  89. package/src/components/index.ts +1 -0
  90. package/src/components/info-panel/InfoPanel.tsx +69 -45
  91. package/src/components/selected-total/SelectedTotal.tsx +32 -0
  92. package/src/components/selected-total/index.ts +1 -0
  93. package/src/components/toolbar/Toolbar.tsx +42 -32
@@ -2,8 +2,9 @@
2
2
  import { Icon, InputGroup } from '@blueprintjs/core';
3
3
  import { css } from '@emotion/react';
4
4
  import * as Collapsible from '@radix-ui/react-collapsible';
5
- import { CSSProperties, useCallback, useMemo, useState } from 'react';
5
+ import { CSSProperties, memo, useCallback, useMemo, useState } from 'react';
6
6
 
7
+ import { SelectedTotal } from '../selected-total/SelectedTotal';
7
8
  import { createTableColumnHelper, Table } from '../table';
8
9
  import * as ValueRenderers from '../value-renderers';
9
10
 
@@ -19,6 +20,7 @@ interface InfoPanelProps {
19
20
  titleStyle?: CSSProperties;
20
21
  inputStyle?: CSSProperties;
21
22
  }
23
+
22
24
  const style = {
23
25
  content: css({
24
26
  overflow: 'hidden',
@@ -87,9 +89,17 @@ const columns = [
87
89
  }),
88
90
  ];
89
91
 
92
+ const emptyData: InfoPanelData[] = [];
93
+
90
94
  export function InfoPanel(props: InfoPanelProps) {
95
+ const {
96
+ title = 'Information',
97
+ data = emptyData,
98
+ titleStyle,
99
+ inputStyle,
100
+ } = props;
101
+
91
102
  const [search, setSearch] = useState('');
92
- const { title = 'Information', data = [], titleStyle, inputStyle } = props;
93
103
  const viewData = useCallback(
94
104
  (data: Record<string, string | number | object>) => {
95
105
  const exactMatch: InfoPanelDatum[] = [];
@@ -123,12 +133,9 @@ export function InfoPanel(props: InfoPanelProps) {
123
133
  },
124
134
  [search],
125
135
  );
136
+
126
137
  const { filteredData, total, count } = useMemo(() => {
127
- const filteredData: Array<
128
- Omit<InfoPanelData, 'data'> & {
129
- data: InfoPanelDatum[];
130
- }
131
- > = [];
138
+ const filteredData: InfoPanelContentDatum[] = [];
132
139
  let total = 0;
133
140
  let count = 0;
134
141
  for (const { data: dataContent, ...other } of data) {
@@ -140,6 +147,7 @@ export function InfoPanel(props: InfoPanelProps) {
140
147
  }
141
148
  return { filteredData, total, count };
142
149
  }, [data, viewData]);
150
+
143
151
  return (
144
152
  <div css={style.container}>
145
153
  <div
@@ -179,47 +187,63 @@ export function InfoPanel(props: InfoPanelProps) {
179
187
  type="search"
180
188
  fill
181
189
  />
182
- [{count}/{total}]
183
- </div>
184
- <div
185
- style={{
186
- position: 'relative',
187
- marginTop: '5px',
188
- display: 'flex',
189
- flexDirection: 'column',
190
- overflowY: 'auto',
191
- flex: 1,
192
- }}
193
- >
194
- {filteredData.map(({ description, data }) => {
195
- return (
196
- <Collapsible.Root
197
- key={description}
198
- className="CollapsibleRoot"
199
- defaultOpen
200
- >
201
- <Collapsible.Trigger asChild css={style.button}>
202
- <div>
203
- <Icon icon="chevron-right" css={style.chevron} />
204
- {description}
205
- </div>
206
- </Collapsible.Trigger>
207
- <Collapsible.Content css={style.content}>
208
- <Table
209
- data={data}
210
- columns={columns}
211
- striped
212
- tableProps={{ style: { width: '100%' } }}
213
- compact
214
- />
215
- </Collapsible.Content>
216
- </Collapsible.Root>
217
- );
218
- })}
190
+ <SelectedTotal count={count} total={total} />
219
191
  </div>
192
+ <InfoPanelContent filteredData={filteredData} />
220
193
  </div>
221
194
  );
222
195
  }
196
+
197
+ type InfoPanelContentDatum = Omit<InfoPanelData, 'data'> & {
198
+ data: InfoPanelDatum[];
199
+ };
200
+
201
+ interface InfoPanelContentProps {
202
+ filteredData: InfoPanelContentDatum[];
203
+ }
204
+
205
+ const InfoPanelContent = memo((props: InfoPanelContentProps) => {
206
+ const { filteredData } = props;
207
+ return (
208
+ <div
209
+ style={{
210
+ position: 'relative',
211
+ marginTop: '5px',
212
+ display: 'flex',
213
+ flexDirection: 'column',
214
+ overflowY: 'auto',
215
+ flex: 1,
216
+ }}
217
+ >
218
+ {filteredData.map(({ description, data }) => {
219
+ return (
220
+ <Collapsible.Root
221
+ key={description}
222
+ className="CollapsibleRoot"
223
+ defaultOpen
224
+ >
225
+ <Collapsible.Trigger asChild css={style.button}>
226
+ <div>
227
+ <Icon icon="chevron-right" css={style.chevron} />
228
+ {description}
229
+ </div>
230
+ </Collapsible.Trigger>
231
+ <Collapsible.Content css={style.content}>
232
+ <Table
233
+ data={data}
234
+ columns={columns}
235
+ striped
236
+ tableProps={{ style: { width: '100%' } }}
237
+ compact
238
+ />
239
+ </Collapsible.Content>
240
+ </Collapsible.Root>
241
+ );
242
+ })}
243
+ </div>
244
+ );
245
+ });
246
+
223
247
  /**
224
248
  * Get the value cell depending on the type of the value
225
249
  * @param value - ValueRenderers value.
@@ -236,7 +260,7 @@ function valueCell(value: number | string | object | boolean) {
236
260
  case 'string':
237
261
  return <ValueRenderers.Text value={value} />;
238
262
  default:
239
- <ValueRenderers.Text value={value} />;
263
+ return <ValueRenderers.Text value={value} />;
240
264
  }
241
265
  }
242
266
 
@@ -0,0 +1,32 @@
1
+ interface SelectedTotalProps {
2
+ total?: number;
3
+ count?: number;
4
+ }
5
+
6
+ export function SelectedTotal(props: SelectedTotalProps) {
7
+ const { total, count } = props;
8
+ return (
9
+ <div
10
+ style={{
11
+ whiteSpace: 'nowrap',
12
+ margin: 0,
13
+ }}
14
+ >
15
+ {formatCounterLabel(count, total)}
16
+ </div>
17
+ );
18
+ }
19
+
20
+ function formatCounterLabel(count?: number, total?: number) {
21
+ const thinSpace = '\u2009';
22
+ if (count !== undefined && total !== undefined) {
23
+ return `[${thinSpace}${count}${thinSpace}/${thinSpace}${total}${thinSpace}]`;
24
+ }
25
+ if (count !== undefined) {
26
+ return `[${thinSpace}${count}${thinSpace}]`;
27
+ }
28
+ if (total !== undefined) {
29
+ return `[${thinSpace}${total}${thinSpace}]`;
30
+ }
31
+ return '';
32
+ }
@@ -0,0 +1 @@
1
+ export * from './SelectedTotal';
@@ -1,28 +1,26 @@
1
1
  /** @jsxImportSource @emotion/react */
2
2
  import {
3
3
  ButtonGroup,
4
+ ButtonGroupProps,
4
5
  Classes,
5
6
  Colors,
6
7
  Icon,
7
8
  Intent,
8
9
  Popover,
9
10
  PopoverProps,
10
- TagProps,
11
11
  TooltipProps,
12
12
  } from '@blueprintjs/core';
13
- import { IconName } from '@blueprintjs/icons';
14
13
  import { css } from '@emotion/react';
15
14
  import {
16
15
  cloneElement,
17
- type MouseEvent,
18
- type ReactElement,
19
- type ReactNode,
16
+ MouseEvent,
17
+ ReactNode,
20
18
  useLayoutEffect,
21
19
  useMemo,
22
20
  useRef,
23
21
  } from 'react';
24
22
 
25
- import { Button } from '../button';
23
+ import { Button, ButtonProps } from '../button';
26
24
 
27
25
  import {
28
26
  ToolbarContext,
@@ -40,33 +38,26 @@ interface ToolbarBaseProps {
40
38
  intent?: Intent;
41
39
  disabled?: boolean;
42
40
  }
43
- export interface ToolbarProps extends ToolbarBaseProps {
44
- vertical?: boolean;
45
- large?: boolean;
46
- children?:
47
- | Array<ReactElement<ToolbarItemProps>>
48
- | ReactElement<ToolbarItemProps>
49
- | Iterable<ReactNode>
50
- | boolean
51
- | null;
41
+ export interface ToolbarProps
42
+ extends ToolbarBaseProps,
43
+ Pick<
44
+ ButtonGroupProps,
45
+ 'children' | 'minimal' | 'large' | 'vertical' | 'fill'
46
+ > {
52
47
  popoverInteractionKind?: PopoverInteractionType;
53
48
  }
54
49
 
55
- export interface ToolbarItemProps extends ToolbarBaseProps {
56
- id?: string;
50
+ export interface ToolbarItemProps
51
+ extends ToolbarBaseProps,
52
+ Pick<ButtonProps, 'id' | 'icon' | 'active' | 'tag' | 'tagProps'> {
57
53
  tooltip?: TooltipProps['content'];
58
54
  tooltipProps?: Omit<TooltipProps, 'content'>;
59
- icon: IconName | ReactElement;
60
- active?: boolean;
61
55
  onClick?: (
62
56
  item: ToolbarItemProps & {
63
57
  event: MouseEvent;
64
58
  },
65
59
  ) => void;
66
- className?: string;
67
60
  isPopover?: boolean;
68
- tag?: ReactNode;
69
- tagProps?: Omit<TagProps, 'children'>;
70
61
  }
71
62
 
72
63
  export interface ToolbarPopoverItemProps extends PopoverProps {
@@ -83,10 +74,18 @@ export function Toolbar(props: ToolbarProps) {
83
74
  large,
84
75
  vertical,
85
76
  popoverInteractionKind,
77
+ minimal,
78
+ fill,
86
79
  } = props;
87
80
 
88
81
  const contextValue = useMemo(
89
- () => ({ intent, large, vertical, disabled, popoverInteractionKind }),
82
+ () => ({
83
+ intent,
84
+ large,
85
+ vertical,
86
+ disabled,
87
+ popoverInteractionKind,
88
+ }),
90
89
  [intent, large, vertical, disabled, popoverInteractionKind],
91
90
  );
92
91
  const ref = useRef<HTMLDivElement>(null);
@@ -124,11 +123,13 @@ export function Toolbar(props: ToolbarProps) {
124
123
  return (
125
124
  <ToolbarProvider value={contextValue}>
126
125
  <ButtonGroup
126
+ fill={fill}
127
127
  // Reset because of layout effect above
128
128
  // TODO: remove once the workaround is no longer needed
129
129
  key={String(vertical)}
130
130
  vertical={vertical}
131
131
  large={large}
132
+ minimal={minimal}
132
133
  style={{
133
134
  flexWrap: 'wrap',
134
135
  borderRight: vertical ? border : undefined,
@@ -147,7 +148,6 @@ Toolbar.Item = function ToolbarItem(props: ToolbarItemProps) {
147
148
  onClick,
148
149
  tooltip,
149
150
  tooltipProps,
150
- id,
151
151
  intent: itemIntent,
152
152
  disabled: itemDisabled,
153
153
  isPopover,
@@ -163,7 +163,7 @@ Toolbar.Item = function ToolbarItem(props: ToolbarItemProps) {
163
163
  const intent = itemIntent ?? toolbarIntent;
164
164
  const disabled = itemDisabled ?? toolbarDisabled;
165
165
  const resizedIcon =
166
- typeof icon === 'string'
166
+ !icon || typeof icon === 'string'
167
167
  ? icon
168
168
  : cloneElement(icon, {
169
169
  className: icon.props.className
@@ -174,19 +174,28 @@ Toolbar.Item = function ToolbarItem(props: ToolbarItemProps) {
174
174
  return (
175
175
  <Button
176
176
  alignText={isPopover ? 'left' : undefined}
177
- minimal
178
177
  disabled={disabled}
179
178
  css={css`
180
179
  .${Classes.ICON} {
181
180
  color: ${Colors.DARK_GRAY3};
182
181
  }
182
+ .bp5-icon {
183
+ width: ${large ? '20px' : '16px'};
184
+ height: ${large ? '20px' : '16px'};
185
+ font-size: ${large ? '14px' : '12px'};
186
+ }
187
+ .bp5-tag {
188
+ font-size: ${large ? '12px' : '10px'};
189
+ line-height: ${large ? '14px' : '12px'};
190
+ min-width: ${large ? '18px' : '15px'};
191
+ min-height: ${large ? '18px' : '15px'};
192
+ }
183
193
  `}
184
194
  intent={intent}
185
195
  style={{
186
196
  position: 'relative',
187
197
  fontSize: '1.125em',
188
198
  width: 'fit-content',
189
- flex: 'none',
190
199
  }}
191
200
  type="button"
192
201
  active={active}
@@ -198,9 +207,10 @@ Toolbar.Item = function ToolbarItem(props: ToolbarItemProps) {
198
207
  alignItems: 'center',
199
208
  width: 0,
200
209
  height: 0,
210
+ marginRight: 0,
201
211
  }}
202
212
  >
203
- <Icon icon={resizedIcon} />
213
+ <Icon icon={resizedIcon} size={large ? 20 : 16} />
204
214
  {isPopover && (
205
215
  <Icon
206
216
  icon="caret-right"
@@ -210,6 +220,8 @@ Toolbar.Item = function ToolbarItem(props: ToolbarItemProps) {
210
220
  position: 'absolute',
211
221
  bottom: 0,
212
222
  right: 0,
223
+ width: large ? 14 : 9,
224
+ height: large ? 14 : 9,
213
225
  }}
214
226
  />
215
227
  )}
@@ -260,13 +272,11 @@ Toolbar.PopoverItem = function ToolbarPopoverItem(
260
272
  fontSize: '1.125em',
261
273
  width: 'fit-content',
262
274
  height: 'fit-content',
263
- flex: 'none',
264
275
  },
265
276
  }}
277
+ renderTarget={() => <Toolbar.Item isPopover {...itemProps} />}
266
278
  {...other}
267
- >
268
- <Toolbar.Item isPopover {...itemProps} />
269
- </Popover>
279
+ />
270
280
  );
271
281
  };
272
282