@etsoo/materialui 1.3.42 → 1.3.44
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.
- package/__tests__/NotifierMUTests.tsx +140 -140
- package/__tests__/ResponsePage.tsx +48 -0
- package/__tests__/SelectEx.tsx +2 -2
- package/__tests__/SwitchAnt.tsx +17 -17
- package/__tests__/tsconfig.json +17 -17
- package/lib/AddresSelector.js +1 -2
- package/lib/AuditDisplay.js +2 -3
- package/lib/BridgeCloseButton.js +1 -2
- package/lib/ComboBox.js +5 -5
- package/lib/ComboBoxMultiple.js +7 -8
- package/lib/ComboBoxPro.js +1 -2
- package/lib/CultureDataTable.js +2 -2
- package/lib/DataGridEx.d.ts +2 -3
- package/lib/DataGridEx.js +12 -14
- package/lib/DataGridRenderers.js +6 -6
- package/lib/DataSteps.js +1 -2
- package/lib/DataTable.js +1 -2
- package/lib/DialogButton.js +2 -3
- package/lib/DnDList.js +1 -1
- package/lib/EmailInput.js +1 -2
- package/lib/FileUploadButton.js +1 -1
- package/lib/GridDataFormat.js +5 -5
- package/lib/GridUtils.js +1 -2
- package/lib/HiSelector.js +1 -1
- package/lib/HiSelectorTL.js +1 -1
- package/lib/InputField.js +4 -5
- package/lib/InputTipField.js +1 -1
- package/lib/ItemList.js +2 -3
- package/lib/ListChooser.js +4 -5
- package/lib/LoadingButton.js +1 -2
- package/lib/MaskInput.js +2 -3
- package/lib/NotifierMU.js +14 -19
- package/lib/OptionBool.js +1 -2
- package/lib/OptionGroup.js +3 -4
- package/lib/OptionGroupFlag.js +1 -1
- package/lib/QuickList.js +2 -2
- package/lib/ResponsibleContainer.d.ts +3 -3
- package/lib/ResponsibleContainer.js +3 -3
- package/lib/ScrollerListEx.d.ts +6 -7
- package/lib/ScrollerListEx.js +30 -36
- package/lib/SearchField.js +3 -4
- package/lib/SelectBool.js +1 -2
- package/lib/SelectEx.js +6 -8
- package/lib/ShowDataComparison.js +3 -4
- package/lib/Switch.js +1 -2
- package/lib/SwitchAnt.js +6 -7
- package/lib/TableEx.js +5 -7
- package/lib/TagList.js +3 -5
- package/lib/TagListPro.js +3 -5
- package/lib/TextFieldEx.js +2 -2
- package/lib/Tiplist.js +6 -8
- package/lib/TiplistPro.js +9 -10
- package/lib/TooltipClick.js +2 -2
- package/lib/TwoFieldInput.js +1 -1
- package/lib/UserAvatar.js +1 -2
- package/lib/UserAvatarEditor.js +4 -6
- package/lib/app/CommonApp.js +1 -1
- package/lib/app/ReactApp.js +4 -6
- package/lib/app/ServiceApp.js +5 -7
- package/lib/pages/DataGridPage.d.ts +2 -2
- package/lib/pages/DataGridPage.js +2 -3
- package/lib/pages/DataGridPageProps.d.ts +2 -2
- package/lib/pages/FixedListPage.d.ts +2 -2
- package/lib/pages/FixedListPage.js +2 -3
- package/lib/pages/LeftDrawer.js +2 -3
- package/lib/pages/ListPage.d.ts +2 -2
- package/lib/pages/ListPage.js +2 -3
- package/lib/pages/ListPageProps.d.ts +1 -1
- package/lib/pages/ResponsivePage.d.ts +2 -2
- package/lib/pages/ResponsivePage.js +1 -2
- package/lib/pages/ResponsivePageProps.d.ts +2 -2
- package/lib/pages/TablePage.js +3 -5
- package/lib/pages/UserMenu.js +1 -2
- package/lib/pages/ViewPage.js +6 -7
- package/package.json +14 -12
- package/src/DataGridEx.tsx +6 -12
- package/src/ResponsibleContainer.tsx +7 -9
- package/src/ScrollerListEx.tsx +301 -311
- package/src/pages/DataGridPage.tsx +4 -5
- package/src/pages/DataGridPageProps.ts +3 -4
- package/src/pages/FixedListPage.tsx +4 -5
- package/src/pages/ListPage.tsx +4 -5
- package/src/pages/ListPageProps.ts +2 -3
- package/src/pages/ResponsivePage.tsx +4 -5
- package/src/pages/ResponsivePageProps.ts +3 -4
- package/tsconfig.json +3 -3
package/src/ScrollerListEx.tsx
CHANGED
|
@@ -1,106 +1,106 @@
|
|
|
1
|
-
import { css } from
|
|
2
|
-
import { ScrollerList, ScrollerListProps } from
|
|
3
|
-
import { DataTypes,
|
|
4
|
-
import { useTheme } from
|
|
5
|
-
import React from
|
|
6
|
-
import { ListChildComponentProps } from
|
|
7
|
-
import { MouseEventWithDataHandler, MUGlobal } from
|
|
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 =
|
|
13
|
+
const selectedClassName = "ScrollerListEx-Selected";
|
|
14
14
|
|
|
15
15
|
const createGridStyle = (
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
alternatingColors: [string?, string?],
|
|
17
|
+
selectedColor: string
|
|
18
18
|
) => {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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
|
-
|
|
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
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
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
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
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
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
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
|
-
|
|
114
|
-
|
|
115
|
-
|
|
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
|
-
|
|
122
|
-
|
|
123
|
-
>
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
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
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
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
|
-
}
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
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
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
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
|
-
|
|
268
|
-
|
|
269
|
-
|
|
264
|
+
const onMouseDown = (div: HTMLDivElement, data: T) => {
|
|
265
|
+
// Destruct
|
|
266
|
+
const [selectedDiv, selectedData] = selectedItem.current ?? [];
|
|
270
267
|
|
|
271
|
-
|
|
272
|
-
return;
|
|
268
|
+
if (selectedData != null && selectedData[idField] === data[idField]) return;
|
|
273
269
|
|
|
274
|
-
|
|
270
|
+
selectedDiv?.classList.remove(selectedClassName);
|
|
275
271
|
|
|
276
|
-
|
|
272
|
+
div.classList.add(selectedClassName);
|
|
277
273
|
|
|
278
|
-
|
|
274
|
+
selectedItem.current = [div, data];
|
|
279
275
|
|
|
280
|
-
|
|
281
|
-
|
|
276
|
+
if (onSelectChange) onSelectChange([data]);
|
|
277
|
+
};
|
|
282
278
|
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
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
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
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
|
-
|
|
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
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
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
|
-
//
|
|
366
|
-
return
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
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
|
}
|