@etsoo/materialui 1.0.1

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