@etsoo/materialui 1.3.41 → 1.3.43

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 (82) hide show
  1. package/__tests__/tsconfig.json +17 -17
  2. package/lib/AddresSelector.js +1 -2
  3. package/lib/AuditDisplay.js +2 -3
  4. package/lib/BridgeCloseButton.js +1 -2
  5. package/lib/ComboBox.js +5 -5
  6. package/lib/ComboBoxMultiple.js +7 -8
  7. package/lib/ComboBoxPro.js +1 -2
  8. package/lib/CultureDataTable.js +2 -2
  9. package/lib/DataGridEx.d.ts +2 -3
  10. package/lib/DataGridEx.js +12 -14
  11. package/lib/DataGridRenderers.js +6 -6
  12. package/lib/DataSteps.js +1 -2
  13. package/lib/DataTable.js +1 -2
  14. package/lib/DialogButton.js +2 -3
  15. package/lib/DnDList.js +1 -1
  16. package/lib/EmailInput.js +1 -2
  17. package/lib/FileUploadButton.js +1 -1
  18. package/lib/GridDataFormat.js +5 -5
  19. package/lib/GridUtils.js +1 -2
  20. package/lib/HiSelector.js +1 -1
  21. package/lib/HiSelectorTL.js +1 -1
  22. package/lib/InputField.js +4 -5
  23. package/lib/InputTipField.js +1 -1
  24. package/lib/ItemList.js +2 -3
  25. package/lib/ListChooser.js +4 -5
  26. package/lib/LoadingButton.js +1 -2
  27. package/lib/MaskInput.js +2 -3
  28. package/lib/NotifierMU.js +14 -19
  29. package/lib/OptionBool.js +1 -2
  30. package/lib/OptionGroup.js +3 -4
  31. package/lib/OptionGroupFlag.js +1 -1
  32. package/lib/QuickList.js +2 -2
  33. package/lib/ResponsibleContainer.d.ts +3 -3
  34. package/lib/ResponsibleContainer.js +3 -3
  35. package/lib/ScrollerListEx.d.ts +6 -7
  36. package/lib/ScrollerListEx.js +30 -36
  37. package/lib/SearchField.js +3 -4
  38. package/lib/SelectBool.js +1 -2
  39. package/lib/SelectEx.js +6 -8
  40. package/lib/ShowDataComparison.js +3 -4
  41. package/lib/Switch.js +1 -2
  42. package/lib/SwitchAnt.js +6 -7
  43. package/lib/TableEx.js +5 -7
  44. package/lib/TagList.js +3 -5
  45. package/lib/TagListPro.js +3 -5
  46. package/lib/TextFieldEx.js +2 -2
  47. package/lib/Tiplist.js +6 -8
  48. package/lib/TiplistPro.js +9 -10
  49. package/lib/TooltipClick.js +2 -2
  50. package/lib/TwoFieldInput.js +1 -1
  51. package/lib/UserAvatar.js +1 -2
  52. package/lib/UserAvatarEditor.js +4 -6
  53. package/lib/app/CommonApp.js +1 -1
  54. package/lib/app/ReactApp.js +4 -6
  55. package/lib/app/ServiceApp.js +5 -7
  56. package/lib/pages/DataGridPage.d.ts +2 -2
  57. package/lib/pages/DataGridPage.js +2 -3
  58. package/lib/pages/DataGridPageProps.d.ts +2 -2
  59. package/lib/pages/FixedListPage.d.ts +2 -2
  60. package/lib/pages/FixedListPage.js +2 -3
  61. package/lib/pages/LeftDrawer.js +2 -3
  62. package/lib/pages/ListPage.d.ts +2 -2
  63. package/lib/pages/ListPage.js +2 -3
  64. package/lib/pages/ListPageProps.d.ts +1 -1
  65. package/lib/pages/ResponsivePage.d.ts +2 -2
  66. package/lib/pages/ResponsivePage.js +1 -2
  67. package/lib/pages/ResponsivePageProps.d.ts +2 -2
  68. package/lib/pages/TablePage.js +3 -5
  69. package/lib/pages/UserMenu.js +1 -2
  70. package/lib/pages/ViewPage.js +6 -7
  71. package/package.json +14 -12
  72. package/src/DataGridEx.tsx +6 -12
  73. package/src/ResponsibleContainer.tsx +7 -9
  74. package/src/ScrollerListEx.tsx +301 -311
  75. package/src/pages/DataGridPage.tsx +4 -5
  76. package/src/pages/DataGridPageProps.ts +3 -4
  77. package/src/pages/FixedListPage.tsx +4 -5
  78. package/src/pages/ListPage.tsx +4 -5
  79. package/src/pages/ListPageProps.ts +2 -3
  80. package/src/pages/ResponsivePage.tsx +4 -5
  81. package/src/pages/ResponsivePageProps.ts +2 -3
  82. package/tsconfig.json +3 -3
@@ -1,106 +1,106 @@
1
- import { css } from '@emotion/css';
2
- import { ScrollerList, ScrollerListProps } from '@etsoo/react';
3
- import { DataTypes, IdDefaultType, Utils } from '@etsoo/shared';
4
- import { useTheme } from '@mui/material';
5
- import React from 'react';
6
- import { ListChildComponentProps } from 'react-window';
7
- import { MouseEventWithDataHandler, MUGlobal } from './MUGlobal';
1
+ import { css } from "@emotion/css";
2
+ import { ScrollerList, ScrollerListProps } from "@etsoo/react";
3
+ import { DataTypes, Utils } from "@etsoo/shared";
4
+ import { useTheme } from "@mui/material";
5
+ import React from "react";
6
+ import { ListChildComponentProps } from "react-window";
7
+ import { MouseEventWithDataHandler, MUGlobal } from "./MUGlobal";
8
8
 
9
9
  // Scroll bar size
10
10
  const scrollbarSize = 16;
11
11
 
12
12
  // Selected class name
13
- const selectedClassName = 'ScrollerListEx-Selected';
13
+ const selectedClassName = "ScrollerListEx-Selected";
14
14
 
15
15
  const createGridStyle = (
16
- alternatingColors: [string?, string?],
17
- selectedColor: string
16
+ alternatingColors: [string?, string?],
17
+ selectedColor: string
18
18
  ) => {
19
- return css({
20
- '& .ScrollerListEx-Selected': {
21
- backgroundColor: selectedColor
22
- },
23
- '& .ScrollerListEx-Row0:not(.ScrollerListEx-Selected)': {
24
- backgroundColor: alternatingColors[0]
25
- },
26
- '& .ScrollerListEx-Row1:not(.ScrollerListEx-Selected)': {
27
- backgroundColor: alternatingColors[1]
28
- },
29
- '@media (min-width: 800px)': {
30
- '::-webkit-scrollbar': {
31
- width: scrollbarSize,
32
- height: scrollbarSize,
33
- backgroundColor: '#f6f6f6'
34
- },
35
- '::-webkit-scrollbar-thumb': {
36
- backgroundColor: 'rgba(0,0,0,0.4)',
37
- borderRadius: '2px'
38
- },
39
- '::-webkit-scrollbar-track-piece:start': {
40
- background: 'transparent'
41
- },
42
- '::-webkit-scrollbar-track-piece:end': {
43
- background: 'transparent'
44
- }
45
- }
46
- });
19
+ return css({
20
+ "& .ScrollerListEx-Selected": {
21
+ backgroundColor: selectedColor
22
+ },
23
+ "& .ScrollerListEx-Row0:not(.ScrollerListEx-Selected)": {
24
+ backgroundColor: alternatingColors[0]
25
+ },
26
+ "& .ScrollerListEx-Row1:not(.ScrollerListEx-Selected)": {
27
+ backgroundColor: alternatingColors[1]
28
+ },
29
+ "@media (min-width: 800px)": {
30
+ "::-webkit-scrollbar": {
31
+ width: scrollbarSize,
32
+ height: scrollbarSize,
33
+ backgroundColor: "#f6f6f6"
34
+ },
35
+ "::-webkit-scrollbar-thumb": {
36
+ backgroundColor: "rgba(0,0,0,0.4)",
37
+ borderRadius: "2px"
38
+ },
39
+ "::-webkit-scrollbar-track-piece:start": {
40
+ background: "transparent"
41
+ },
42
+ "::-webkit-scrollbar-track-piece:end": {
43
+ background: "transparent"
44
+ }
45
+ }
46
+ });
47
47
  };
48
48
 
49
49
  // Default margin
50
50
  const defaultMargin = (margin: object, isNarrow?: boolean) => {
51
- const half = MUGlobal.half(margin);
52
-
53
- if (isNarrow == null) {
54
- const half = MUGlobal.half(margin);
55
- return {
56
- marginLeft: margin,
57
- marginRight: margin,
58
- marginTop: half,
59
- marginBottom: half
60
- };
61
- }
51
+ const half = MUGlobal.half(margin);
62
52
 
63
- if (isNarrow) {
64
- return {
65
- marginLeft: 0,
66
- marginRight: 0,
67
- marginTop: half,
68
- marginBottom: half
69
- };
70
- }
53
+ if (isNarrow == null) {
54
+ const half = MUGlobal.half(margin);
55
+ return {
56
+ marginLeft: margin,
57
+ marginRight: margin,
58
+ marginTop: half,
59
+ marginBottom: half
60
+ };
61
+ }
71
62
 
63
+ if (isNarrow) {
72
64
  return {
73
- marginLeft: half,
74
- marginRight: half,
75
- marginTop: half,
76
- marginBottom: half
65
+ marginLeft: 0,
66
+ marginRight: 0,
67
+ marginTop: half,
68
+ marginBottom: half
77
69
  };
70
+ }
71
+
72
+ return {
73
+ marginLeft: half,
74
+ marginRight: half,
75
+ marginTop: half,
76
+ marginBottom: half
77
+ };
78
78
  };
79
79
 
80
80
  /**
81
81
  * Extended ScrollerList inner item renderer props
82
82
  */
83
83
  export interface ScrollerListExInnerItemRendererProps<T>
84
- extends ListChildComponentProps<T> {
85
- /**
86
- * Item selected
87
- */
88
- selected: boolean;
89
-
90
- /**
91
- * Item height
92
- */
93
- itemHeight: number;
94
-
95
- /**
96
- * Item space
97
- */
98
- space: number;
99
-
100
- /**
101
- * Default margins
102
- */
103
- margins: object;
84
+ extends ListChildComponentProps<T> {
85
+ /**
86
+ * Item selected
87
+ */
88
+ selected: boolean;
89
+
90
+ /**
91
+ * Item height
92
+ */
93
+ itemHeight: number;
94
+
95
+ /**
96
+ * Item space
97
+ */
98
+ space: number;
99
+
100
+ /**
101
+ * Default margins
102
+ */
103
+ margins: object;
104
104
  }
105
105
 
106
106
  /**
@@ -110,146 +110,144 @@ export interface ScrollerListExInnerItemRendererProps<T>
110
110
  * 3. Dynamic calculation
111
111
  */
112
112
  export type ScrollerListExItemSize =
113
- | ((index: number) => [number, number] | [number, number, object])
114
- | [number, number]
115
- | [number, object, boolean?];
113
+ | ((index: number) => [number, number] | [number, number, object])
114
+ | [number, number]
115
+ | [number, object, boolean?];
116
116
 
117
117
  /**
118
118
  * Extended ScrollerList Props
119
119
  */
120
- export type ScrollerListExProps<
121
- T extends object,
122
- D extends DataTypes.Keys<T>
123
- > = Omit<ScrollerListProps<T, D>, 'itemRenderer' | 'itemSize'> & {
124
- /**
125
- * Alternating colors for odd/even rows
126
- */
127
- alternatingColors?: [string?, string?];
128
-
129
- /**
130
- * Inner item renderer
131
- */
132
- innerItemRenderer: (
133
- props: ScrollerListExInnerItemRendererProps<T>
134
- ) => React.ReactNode;
135
-
136
- /**
137
- * Item renderer
138
- */
139
- itemRenderer?: (props: ListChildComponentProps<T>) => React.ReactElement;
140
-
141
- /**
142
- * Item size, a function indicates its a variable size list
143
- */
144
- itemSize: ScrollerListExItemSize;
145
-
146
- /**
147
- * Double click handler
148
- */
149
- onDoubleClick?: MouseEventWithDataHandler<T>;
150
-
151
- /**
152
- * Click handler
153
- */
154
- onClick?: MouseEventWithDataHandler<T>;
155
-
156
- /**
157
- * On items select change
158
- */
159
- onSelectChange?: (selectedItems: T[]) => void;
160
-
161
- /**
162
- * Selected color
163
- */
164
- selectedColor?: string;
120
+ export type ScrollerListExProps<T extends object> = Omit<
121
+ ScrollerListProps<T>,
122
+ "itemRenderer" | "itemSize"
123
+ > & {
124
+ /**
125
+ * Alternating colors for odd/even rows
126
+ */
127
+ alternatingColors?: [string?, string?];
128
+
129
+ /**
130
+ * Inner item renderer
131
+ */
132
+ innerItemRenderer: (
133
+ props: ScrollerListExInnerItemRendererProps<T>
134
+ ) => React.ReactNode;
135
+
136
+ /**
137
+ * Item renderer
138
+ */
139
+ itemRenderer?: (props: ListChildComponentProps<T>) => React.ReactElement;
140
+
141
+ /**
142
+ * Item size, a function indicates its a variable size list
143
+ */
144
+ itemSize: ScrollerListExItemSize;
145
+
146
+ /**
147
+ * Double click handler
148
+ */
149
+ onDoubleClick?: MouseEventWithDataHandler<T>;
150
+
151
+ /**
152
+ * Click handler
153
+ */
154
+ onClick?: MouseEventWithDataHandler<T>;
155
+
156
+ /**
157
+ * On items select change
158
+ */
159
+ onSelectChange?: (selectedItems: T[]) => void;
160
+
161
+ /**
162
+ * Selected color
163
+ */
164
+ selectedColor?: string;
165
165
  };
166
166
 
167
167
  interface defaultItemRendererProps<T> extends ListChildComponentProps<T> {
168
- /**
169
- * onMouseDown callback
170
- */
171
- onMouseDown: (div: HTMLDivElement, data: T) => void;
172
-
173
- /**
174
- * Inner item renderer
175
- */
176
- innerItemRenderer: (
177
- props: ScrollerListExInnerItemRendererProps<T>
178
- ) => React.ReactNode;
179
-
180
- /**
181
- * Item height
182
- */
183
- itemHeight: number;
184
-
185
- /**
186
- * Double click handler
187
- */
188
- onDoubleClick?: MouseEventWithDataHandler<T>;
189
-
190
- /**
191
- * Click handler
192
- */
193
- onClick?: MouseEventWithDataHandler<T>;
194
-
195
- /**
196
- * Item space
197
- */
198
- space: number;
199
-
200
- /**
201
- * Default margins
202
- */
203
- margins: object;
204
-
205
- /**
206
- * Item selected
207
- */
208
- selected: boolean;
168
+ /**
169
+ * onMouseDown callback
170
+ */
171
+ onMouseDown: (div: HTMLDivElement, data: T) => void;
172
+
173
+ /**
174
+ * Inner item renderer
175
+ */
176
+ innerItemRenderer: (
177
+ props: ScrollerListExInnerItemRendererProps<T>
178
+ ) => React.ReactNode;
179
+
180
+ /**
181
+ * Item height
182
+ */
183
+ itemHeight: number;
184
+
185
+ /**
186
+ * Double click handler
187
+ */
188
+ onDoubleClick?: MouseEventWithDataHandler<T>;
189
+
190
+ /**
191
+ * Click handler
192
+ */
193
+ onClick?: MouseEventWithDataHandler<T>;
194
+
195
+ /**
196
+ * Item space
197
+ */
198
+ space: number;
199
+
200
+ /**
201
+ * Default margins
202
+ */
203
+ margins: object;
204
+
205
+ /**
206
+ * Item selected
207
+ */
208
+ selected: boolean;
209
209
  }
210
210
 
211
211
  // Default itemRenderer
212
212
  function defaultItemRenderer<T>({
213
+ index,
214
+ innerItemRenderer,
215
+ data,
216
+ onMouseDown,
217
+ selected,
218
+ style,
219
+ itemHeight,
220
+ onClick,
221
+ onDoubleClick,
222
+ space,
223
+ margins
224
+ }: defaultItemRendererProps<T>) {
225
+ // Child
226
+ const child = innerItemRenderer({
213
227
  index,
214
- innerItemRenderer,
215
228
  data,
216
- onMouseDown,
217
- selected,
218
229
  style,
230
+ selected,
219
231
  itemHeight,
220
- onClick,
221
- onDoubleClick,
222
232
  space,
223
233
  margins
224
- }: defaultItemRendererProps<T>) {
225
- // Child
226
- const child = innerItemRenderer({
227
- index,
228
- data,
229
- style,
230
- selected,
231
- itemHeight,
232
- space,
233
- margins
234
- });
235
-
236
- let rowClass = `ScrollerListEx-Row${index % 2}`;
237
- if (selected) rowClass += ` ${selectedClassName}`;
238
-
239
- // Layout
240
- return (
241
- <div
242
- className={rowClass}
243
- style={style}
244
- onMouseDown={(event) => onMouseDown(event.currentTarget, data)}
245
- onClick={(event) => onClick && onClick(event, data)}
246
- onDoubleClick={(event) =>
247
- onDoubleClick && onDoubleClick(event, data)
248
- }
249
- >
250
- {child}
251
- </div>
252
- );
234
+ });
235
+
236
+ let rowClass = `ScrollerListEx-Row${index % 2}`;
237
+ if (selected) rowClass += ` ${selectedClassName}`;
238
+
239
+ // Layout
240
+ return (
241
+ <div
242
+ className={rowClass}
243
+ style={style}
244
+ onMouseDown={(event) => onMouseDown(event.currentTarget, data)}
245
+ onClick={(event) => onClick && onClick(event, data)}
246
+ onDoubleClick={(event) => onDoubleClick && onDoubleClick(event, data)}
247
+ >
248
+ {child}
249
+ </div>
250
+ );
253
251
  }
254
252
 
255
253
  /**
@@ -257,123 +255,115 @@ function defaultItemRenderer<T>({
257
255
  * @param props Props
258
256
  * @returns Component
259
257
  */
260
- export function ScrollerListEx<
261
- T extends object,
262
- D extends DataTypes.Keys<T> = IdDefaultType<T>
263
- >(props: ScrollerListExProps<T, D>) {
264
- // Selected item ref
265
- const selectedItem = React.useRef<[HTMLDivElement, T]>();
258
+ export function ScrollerListEx<T extends object>(
259
+ props: ScrollerListExProps<T>
260
+ ) {
261
+ // Selected item ref
262
+ const selectedItem = React.useRef<[HTMLDivElement, T]>();
266
263
 
267
- const onMouseDown = (div: HTMLDivElement, data: T) => {
268
- // Destruct
269
- const [selectedDiv, selectedData] = selectedItem.current ?? [];
264
+ const onMouseDown = (div: HTMLDivElement, data: T) => {
265
+ // Destruct
266
+ const [selectedDiv, selectedData] = selectedItem.current ?? [];
270
267
 
271
- if (selectedData != null && selectedData[idField] === data[idField])
272
- return;
268
+ if (selectedData != null && selectedData[idField] === data[idField]) return;
273
269
 
274
- selectedDiv?.classList.remove(selectedClassName);
270
+ selectedDiv?.classList.remove(selectedClassName);
275
271
 
276
- div.classList.add(selectedClassName);
272
+ div.classList.add(selectedClassName);
277
273
 
278
- selectedItem.current = [div, data];
274
+ selectedItem.current = [div, data];
279
275
 
280
- if (onSelectChange) onSelectChange([data]);
281
- };
276
+ if (onSelectChange) onSelectChange([data]);
277
+ };
282
278
 
283
- const isSelected = (data?: T) => {
284
- const [_, selectedData] = selectedItem.current ?? [];
285
- const selected =
286
- selectedData && data && selectedData[idField] === data[idField]
287
- ? true
288
- : false;
289
- return selected;
290
- };
279
+ const isSelected = (data?: T) => {
280
+ const [_, selectedData] = selectedItem.current ?? [];
281
+ const selected =
282
+ selectedData && data && selectedData[idField] === data[idField]
283
+ ? true
284
+ : false;
285
+ return selected;
286
+ };
291
287
 
292
- // Destruct
293
- const {
294
- alternatingColors = [undefined, undefined],
295
- className,
296
- idField = 'id' as D,
288
+ // Destruct
289
+ const {
290
+ alternatingColors = [undefined, undefined],
291
+ className,
292
+ idField = "id" as DataTypes.Keys<T>,
293
+ innerItemRenderer,
294
+ itemSize,
295
+ itemRenderer = (itemProps) => {
296
+ const [itemHeight, space, margins] = calculateItemSize(itemProps.index);
297
+ return defaultItemRenderer({
298
+ itemHeight,
297
299
  innerItemRenderer,
298
- itemSize,
299
- itemRenderer = (itemProps) => {
300
- const [itemHeight, space, margins] = calculateItemSize(
301
- itemProps.index
302
- );
303
- return defaultItemRenderer({
304
- itemHeight,
305
- innerItemRenderer,
306
- onMouseDown,
307
- onClick,
308
- onDoubleClick,
309
- space,
310
- margins,
311
- selected: isSelected(itemProps.data),
312
- ...itemProps
313
- });
314
- },
300
+ onMouseDown,
315
301
  onClick,
316
302
  onDoubleClick,
317
- onSelectChange,
318
- selectedColor = '#edf4fb',
319
- ...rest
320
- } = props;
321
-
322
- // Theme
323
- const theme = useTheme();
324
-
325
- // Cache calculation
326
- const itemSizeResult = React.useMemo(():
327
- | [number, number, object]
328
- | undefined => {
329
- if (typeof itemSize === 'function') return undefined;
330
- const [size, spaces, isNarrow] = itemSize;
331
- if (typeof spaces === 'number')
332
- return [
333
- size,
334
- spaces,
335
- defaultMargin(MUGlobal.pagePaddings, undefined)
336
- ];
337
-
338
- return [
339
- size,
340
- MUGlobal.getSpace(spaces, theme),
341
- defaultMargin(spaces, isNarrow)
342
- ];
343
- }, [itemSize]);
344
-
345
- // Calculate size
346
- const calculateItemSize = (index: number): [number, number, object] => {
347
- // Callback function
348
- if (typeof itemSize === 'function') {
349
- const result = itemSize(index);
350
- if (result.length == 2)
351
- return [...result, defaultMargin(MUGlobal.pagePaddings)];
352
- return result;
353
- }
354
-
355
- // Calculation
356
- return itemSizeResult!;
357
- };
358
-
359
- // Local item size
360
- const itemSizeLocal = (index: number) => {
361
- const [size, space] = calculateItemSize(index);
362
- return size + space;
363
- };
303
+ space,
304
+ margins,
305
+ selected: isSelected(itemProps.data),
306
+ ...itemProps
307
+ });
308
+ },
309
+ onClick,
310
+ onDoubleClick,
311
+ onSelectChange,
312
+ selectedColor = "#edf4fb",
313
+ ...rest
314
+ } = props;
315
+
316
+ // Theme
317
+ const theme = useTheme();
318
+
319
+ // Cache calculation
320
+ const itemSizeResult = React.useMemo(():
321
+ | [number, number, object]
322
+ | undefined => {
323
+ if (typeof itemSize === "function") return undefined;
324
+ const [size, spaces, isNarrow] = itemSize;
325
+ if (typeof spaces === "number")
326
+ return [size, spaces, defaultMargin(MUGlobal.pagePaddings, undefined)];
327
+
328
+ return [
329
+ size,
330
+ MUGlobal.getSpace(spaces, theme),
331
+ defaultMargin(spaces, isNarrow)
332
+ ];
333
+ }, [itemSize]);
334
+
335
+ // Calculate size
336
+ const calculateItemSize = (index: number): [number, number, object] => {
337
+ // Callback function
338
+ if (typeof itemSize === "function") {
339
+ const result = itemSize(index);
340
+ if (result.length == 2)
341
+ return [...result, defaultMargin(MUGlobal.pagePaddings)];
342
+ return result;
343
+ }
364
344
 
365
- // Layout
366
- return (
367
- <ScrollerList<T, D>
368
- className={Utils.mergeClasses(
369
- 'ScrollerListEx-Body',
370
- className,
371
- createGridStyle(alternatingColors, selectedColor)
372
- )}
373
- idField={idField}
374
- itemRenderer={itemRenderer}
375
- itemSize={itemSizeLocal}
376
- {...rest}
377
- />
378
- );
345
+ // Calculation
346
+ return itemSizeResult!;
347
+ };
348
+
349
+ // Local item size
350
+ const itemSizeLocal = (index: number) => {
351
+ const [size, space] = calculateItemSize(index);
352
+ return size + space;
353
+ };
354
+
355
+ // Layout
356
+ return (
357
+ <ScrollerList<T>
358
+ className={Utils.mergeClasses(
359
+ "ScrollerListEx-Body",
360
+ className,
361
+ createGridStyle(alternatingColors, selectedColor)
362
+ )}
363
+ idField={idField}
364
+ itemRenderer={itemRenderer}
365
+ itemSize={itemSizeLocal}
366
+ {...rest}
367
+ />
368
+ );
379
369
  }