@etsoo/react 1.4.30 → 1.4.31
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/lib/mu/ResponsibleContainer.d.ts +1 -9
- package/lib/mu/ResponsibleContainer.js +7 -12
- package/lib/mu/SearchBar.js +6 -10
- package/lib/mu/pages/ResponsivePage.js +18 -20
- package/package.json +1 -1
- package/src/mu/ResponsibleContainer.tsx +8 -33
- package/src/mu/SearchBar.tsx +23 -27
- package/src/mu/pages/ResponsivePage.tsx +19 -19
|
@@ -23,7 +23,7 @@ export interface ResponsibleContainerProps<T extends {}, F extends DataTypes.Bas
|
|
|
23
23
|
/**
|
|
24
24
|
* Container box SX (dataGrid determines the case)
|
|
25
25
|
*/
|
|
26
|
-
containerBoxSx?: (dataGrid
|
|
26
|
+
containerBoxSx?: (dataGrid?: boolean) => SxProps<Theme>;
|
|
27
27
|
/**
|
|
28
28
|
* Min width to show Datagrid
|
|
29
29
|
*/
|
|
@@ -52,10 +52,6 @@ export interface ResponsibleContainerProps<T extends {}, F extends DataTypes.Bas
|
|
|
52
52
|
* Item size, a function indicates its a variable size list
|
|
53
53
|
*/
|
|
54
54
|
itemSize: ((index: number) => number) | number;
|
|
55
|
-
/**
|
|
56
|
-
* Listbox SX (dataGrid determines the case)
|
|
57
|
-
*/
|
|
58
|
-
listBoxSx?: (dataGrid: boolean, height: number) => SxProps<Theme>;
|
|
59
55
|
/**
|
|
60
56
|
* Load data callback
|
|
61
57
|
*/
|
|
@@ -76,10 +72,6 @@ export interface ResponsibleContainerProps<T extends {}, F extends DataTypes.Bas
|
|
|
76
72
|
* Pull to refresh data
|
|
77
73
|
*/
|
|
78
74
|
pullToRefresh?: boolean;
|
|
79
|
-
/**
|
|
80
|
-
* Searchbox SX
|
|
81
|
-
*/
|
|
82
|
-
searchBoxSx?: SxProps<Theme>;
|
|
83
75
|
/**
|
|
84
76
|
* Size ready to read miliseconds span
|
|
85
77
|
*/
|
|
@@ -12,8 +12,8 @@ import { SearchBar } from './SearchBar';
|
|
|
12
12
|
function getDefaultSearchBoxSx(paddings) {
|
|
13
13
|
const half = MUGlobal.half(paddings);
|
|
14
14
|
return {
|
|
15
|
-
paddingLeft: (theme) => theme.spacing(
|
|
16
|
-
paddingRight: (theme) => theme.spacing(
|
|
15
|
+
paddingLeft: (theme) => theme.spacing(1),
|
|
16
|
+
paddingRight: (theme) => theme.spacing(1),
|
|
17
17
|
paddingTop: half,
|
|
18
18
|
marginBottom: half
|
|
19
19
|
};
|
|
@@ -25,7 +25,7 @@ function getDefaultSearchBoxSx(paddings) {
|
|
|
25
25
|
*/
|
|
26
26
|
export function ResponsibleContainer(props) {
|
|
27
27
|
// Destruct
|
|
28
|
-
const { adjustHeight, columns, containerBoxSx, dataGridMinWidth = DataGridExCalColumns(columns).total, elementReady, fields, fieldTemplate, height,
|
|
28
|
+
const { adjustHeight, columns, containerBoxSx, dataGridMinWidth = Math.max(576, DataGridExCalColumns(columns).total), elementReady, fields, fieldTemplate, height, loadData, mRef, paddings = MUGlobal.pagePaddings, pullToRefresh = true, sizeReadyMiliseconds = 0, ...rest } = props;
|
|
29
29
|
// Labels
|
|
30
30
|
const labels = Labels.CommonPage;
|
|
31
31
|
// Refs
|
|
@@ -64,7 +64,6 @@ export function ResponsibleContainer(props) {
|
|
|
64
64
|
// Last rect
|
|
65
65
|
const lastRect = state.rect;
|
|
66
66
|
// 32 = scroll bar width
|
|
67
|
-
console.log(lastRect, rect);
|
|
68
67
|
if (lastRect != null &&
|
|
69
68
|
state.mounted !== true &&
|
|
70
69
|
Math.abs(rect.width - lastRect.width) <= 32 &&
|
|
@@ -107,9 +106,7 @@ export function ResponsibleContainer(props) {
|
|
|
107
106
|
// Delete
|
|
108
107
|
delete rest.itemRenderer;
|
|
109
108
|
return [
|
|
110
|
-
React.createElement(Box, {
|
|
111
|
-
? undefined
|
|
112
|
-
: listBoxSx(true, heightLocal) },
|
|
109
|
+
React.createElement(Box, { className: "DataGridBox" },
|
|
113
110
|
React.createElement(DataGridEx, { autoLoad: !hasFields, height: heightLocal, width: rect.width, loadData: localLoadData, mRef: mRefs, outerRef: (element) => {
|
|
114
111
|
if (element != null && elementReady)
|
|
115
112
|
elementReady(element, true);
|
|
@@ -127,9 +124,7 @@ export function ResponsibleContainer(props) {
|
|
|
127
124
|
delete rest.hoverColor;
|
|
128
125
|
delete rest.selectable;
|
|
129
126
|
return [
|
|
130
|
-
React.createElement(Box, { sx:
|
|
131
|
-
? undefined
|
|
132
|
-
: listBoxSx(false, heightLocal) },
|
|
127
|
+
React.createElement(Box, { className: "ListBox", sx: { height: heightLocal } },
|
|
133
128
|
React.createElement(ScrollerListEx, { autoLoad: !hasFields, height: heightLocal, loadData: localLoadData, mRef: mRefs, oRef: (element) => {
|
|
134
129
|
if (element != null && elementReady)
|
|
135
130
|
elementReady(element, false);
|
|
@@ -149,11 +144,11 @@ export function ResponsibleContainer(props) {
|
|
|
149
144
|
? '.DataGridEx-Body'
|
|
150
145
|
: '.ScrollerListEx-Body';
|
|
151
146
|
// Layout
|
|
152
|
-
return (React.createElement(Box, { sx: containerBoxSx == null
|
|
147
|
+
return (React.createElement(Box, { sx: containerBoxSx == null
|
|
153
148
|
? undefined
|
|
154
149
|
: containerBoxSx(showDataGrid) },
|
|
155
150
|
React.createElement(Stack, null,
|
|
156
|
-
React.createElement(Box, { ref: dimensions[0][0],
|
|
151
|
+
React.createElement(Box, { ref: dimensions[0][0], className: "SearchBox" }, searchBar),
|
|
157
152
|
list),
|
|
158
153
|
pullToRefresh && pullContainer && (React.createElement(PullToRefreshUI, { mainElement: pullContainer, triggerElement: pullContainer, instructionsPullToRefresh: labels.pullToRefresh, instructionsReleaseToRefresh: labels.releaseToRefresh, instructionsRefreshing: labels.refreshing, onRefresh: () => { var _a; return (_a = state.ref) === null || _a === void 0 ? void 0 : _a.reset(); }, shouldPullToRefresh: () => {
|
|
159
154
|
const container = document.querySelector(pullContainer);
|
package/lib/mu/SearchBar.js
CHANGED
|
@@ -52,7 +52,6 @@ const setChildState = (child, enabled) => {
|
|
|
52
52
|
* @returns Component
|
|
53
53
|
*/
|
|
54
54
|
export function SearchBar(props) {
|
|
55
|
-
var _a;
|
|
56
55
|
// Destruct
|
|
57
56
|
const { className, fields, innerHeight = 40, onSubmit } = props;
|
|
58
57
|
// Labels
|
|
@@ -65,14 +64,12 @@ export function SearchBar(props) {
|
|
|
65
64
|
// Drawer open / close
|
|
66
65
|
const [open, updateOpen] = React.useState(false);
|
|
67
66
|
// State
|
|
68
|
-
const state = React.useRef({ hasMore: true }).current;
|
|
69
|
-
const lastMaxWidth = (_a = state.lastMaxWidth) !== null && _a !== void 0 ? _a : 9999;
|
|
67
|
+
const state = React.useRef({ hasMore: true, lastMaxWidth: 9999 }).current;
|
|
70
68
|
// Watch container
|
|
71
69
|
const { dimensions } = useDimensions(1, (target, rect) => {
|
|
72
70
|
// Same logic from resetButtonRef
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
(!state.hasMore && rect.width > lastMaxWidth))
|
|
71
|
+
if (rect.width === state.lastMaxWidth ||
|
|
72
|
+
(!state.hasMore && rect.width > state.lastMaxWidth))
|
|
76
73
|
return false;
|
|
77
74
|
// Len
|
|
78
75
|
const len = target.children.length;
|
|
@@ -80,7 +77,7 @@ export function SearchBar(props) {
|
|
|
80
77
|
var classList = target.children[i].classList;
|
|
81
78
|
classList.remove('showChild');
|
|
82
79
|
}
|
|
83
|
-
});
|
|
80
|
+
}, 0);
|
|
84
81
|
// Show or hide element
|
|
85
82
|
const setElementVisible = (element, visible) => {
|
|
86
83
|
element.classList.remove(visible ? 'hiddenChild' : 'showChild');
|
|
@@ -99,10 +96,9 @@ export function SearchBar(props) {
|
|
|
99
96
|
containerRect.width < 10)
|
|
100
97
|
return;
|
|
101
98
|
// Container width
|
|
102
|
-
console.log('resetButtonRef', state.hasMore, containerRect.width, lastMaxWidth);
|
|
103
99
|
let maxWidth = containerRect.width;
|
|
104
|
-
if (maxWidth === lastMaxWidth ||
|
|
105
|
-
(!state.hasMore && maxWidth > lastMaxWidth)) {
|
|
100
|
+
if (maxWidth === state.lastMaxWidth ||
|
|
101
|
+
(!state.hasMore && maxWidth > state.lastMaxWidth)) {
|
|
106
102
|
return;
|
|
107
103
|
}
|
|
108
104
|
state.lastMaxWidth = maxWidth;
|
|
@@ -13,34 +13,32 @@ export function ResponsivePage(props) {
|
|
|
13
13
|
const { pageProps = {}, ...rest } = props;
|
|
14
14
|
(_a = pageProps.paddings) !== null && _a !== void 0 ? _a : (pageProps.paddings = MUGlobal.pagePaddings);
|
|
15
15
|
const { paddings, fabColumnDirection, ...pageRest } = pageProps;
|
|
16
|
+
const half = MUGlobal.half(paddings);
|
|
16
17
|
// State
|
|
17
18
|
const [scrollContainer, setScrollContainer] = React.useState();
|
|
18
19
|
const [direction, setDirection] = React.useState(fabColumnDirection);
|
|
19
20
|
// Layout
|
|
20
21
|
return (React.createElement(CommonPage, { ...pageRest, paddings: {}, scrollContainer: scrollContainer, fabColumnDirection: direction },
|
|
21
22
|
React.createElement(ResponsibleContainer, { paddings: paddings, containerBoxSx: (dataGrid) => {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
23
|
+
// .SearchBox keep the same to avoid flick when switching between DataGrid and List
|
|
24
|
+
return {
|
|
25
|
+
'& .SearchBox': {
|
|
26
|
+
marginLeft: paddings,
|
|
27
|
+
marginTop: paddings,
|
|
28
|
+
marginRight: paddings,
|
|
29
|
+
marginBottom: half
|
|
30
|
+
},
|
|
31
|
+
'& .ListBox': {
|
|
32
|
+
marginBottom: paddings
|
|
33
|
+
},
|
|
34
|
+
'& .DataGridBox': {
|
|
35
|
+
marginLeft: paddings,
|
|
36
|
+
marginRight: paddings,
|
|
37
|
+
marginBottom: paddings
|
|
38
|
+
}
|
|
39
|
+
};
|
|
33
40
|
}, elementReady: (element, isDataGrid) => {
|
|
34
41
|
setDirection(!isDataGrid);
|
|
35
42
|
setScrollContainer(element);
|
|
36
|
-
}, listBoxSx: (dataGrid, height) => {
|
|
37
|
-
if (dataGrid) {
|
|
38
|
-
return {};
|
|
39
|
-
}
|
|
40
|
-
else {
|
|
41
|
-
return {
|
|
42
|
-
height: height
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
43
|
}, ...rest })));
|
|
46
44
|
}
|
package/package.json
CHANGED
|
@@ -54,7 +54,7 @@ export interface ResponsibleContainerProps<
|
|
|
54
54
|
/**
|
|
55
55
|
* Container box SX (dataGrid determines the case)
|
|
56
56
|
*/
|
|
57
|
-
containerBoxSx?: (dataGrid
|
|
57
|
+
containerBoxSx?: (dataGrid?: boolean) => SxProps<Theme>;
|
|
58
58
|
|
|
59
59
|
/**
|
|
60
60
|
* Min width to show Datagrid
|
|
@@ -93,11 +93,6 @@ export interface ResponsibleContainerProps<
|
|
|
93
93
|
*/
|
|
94
94
|
itemSize: ((index: number) => number) | number;
|
|
95
95
|
|
|
96
|
-
/**
|
|
97
|
-
* Listbox SX (dataGrid determines the case)
|
|
98
|
-
*/
|
|
99
|
-
listBoxSx?: (dataGrid: boolean, height: number) => SxProps<Theme>;
|
|
100
|
-
|
|
101
96
|
/**
|
|
102
97
|
* Load data callback
|
|
103
98
|
*/
|
|
@@ -125,11 +120,6 @@ export interface ResponsibleContainerProps<
|
|
|
125
120
|
*/
|
|
126
121
|
pullToRefresh?: boolean;
|
|
127
122
|
|
|
128
|
-
/**
|
|
129
|
-
* Searchbox SX
|
|
130
|
-
*/
|
|
131
|
-
searchBoxSx?: SxProps<Theme>;
|
|
132
|
-
|
|
133
123
|
/**
|
|
134
124
|
* Size ready to read miliseconds span
|
|
135
125
|
*/
|
|
@@ -145,8 +135,8 @@ interface LocalRefs {
|
|
|
145
135
|
function getDefaultSearchBoxSx(paddings: {}): SxProps<Theme> {
|
|
146
136
|
const half = MUGlobal.half(paddings);
|
|
147
137
|
return {
|
|
148
|
-
paddingLeft: (theme) => theme.spacing(
|
|
149
|
-
paddingRight: (theme) => theme.spacing(
|
|
138
|
+
paddingLeft: (theme) => theme.spacing(1),
|
|
139
|
+
paddingRight: (theme) => theme.spacing(1),
|
|
150
140
|
paddingTop: half,
|
|
151
141
|
marginBottom: half
|
|
152
142
|
};
|
|
@@ -166,17 +156,15 @@ export function ResponsibleContainer<
|
|
|
166
156
|
adjustHeight,
|
|
167
157
|
columns,
|
|
168
158
|
containerBoxSx,
|
|
169
|
-
dataGridMinWidth = DataGridExCalColumns(columns).total,
|
|
159
|
+
dataGridMinWidth = Math.max(576, DataGridExCalColumns(columns).total),
|
|
170
160
|
elementReady,
|
|
171
161
|
fields,
|
|
172
162
|
fieldTemplate,
|
|
173
163
|
height,
|
|
174
|
-
listBoxSx,
|
|
175
164
|
loadData,
|
|
176
165
|
mRef,
|
|
177
166
|
paddings = MUGlobal.pagePaddings,
|
|
178
167
|
pullToRefresh = true,
|
|
179
|
-
searchBoxSx = getDefaultSearchBoxSx(paddings),
|
|
180
168
|
sizeReadyMiliseconds = 0,
|
|
181
169
|
...rest
|
|
182
170
|
} = props;
|
|
@@ -229,7 +217,6 @@ export function ResponsibleContainer<
|
|
|
229
217
|
const lastRect = state.rect;
|
|
230
218
|
|
|
231
219
|
// 32 = scroll bar width
|
|
232
|
-
console.log(lastRect, rect);
|
|
233
220
|
if (
|
|
234
221
|
lastRect != null &&
|
|
235
222
|
state.mounted !== true &&
|
|
@@ -283,13 +270,7 @@ export function ResponsibleContainer<
|
|
|
283
270
|
delete rest.itemRenderer;
|
|
284
271
|
|
|
285
272
|
return [
|
|
286
|
-
<Box
|
|
287
|
-
sx={
|
|
288
|
-
listBoxSx == null
|
|
289
|
-
? undefined
|
|
290
|
-
: listBoxSx(true, heightLocal)
|
|
291
|
-
}
|
|
292
|
-
>
|
|
273
|
+
<Box className="DataGridBox">
|
|
293
274
|
<DataGridEx<T>
|
|
294
275
|
autoLoad={!hasFields}
|
|
295
276
|
height={heightLocal}
|
|
@@ -319,13 +300,7 @@ export function ResponsibleContainer<
|
|
|
319
300
|
delete rest.selectable;
|
|
320
301
|
|
|
321
302
|
return [
|
|
322
|
-
<Box
|
|
323
|
-
sx={
|
|
324
|
-
listBoxSx == null
|
|
325
|
-
? undefined
|
|
326
|
-
: listBoxSx(false, heightLocal)
|
|
327
|
-
}
|
|
328
|
-
>
|
|
303
|
+
<Box className="ListBox" sx={{ height: heightLocal }}>
|
|
329
304
|
<ScrollerListEx<T>
|
|
330
305
|
autoLoad={!hasFields}
|
|
331
306
|
height={heightLocal}
|
|
@@ -365,13 +340,13 @@ export function ResponsibleContainer<
|
|
|
365
340
|
return (
|
|
366
341
|
<Box
|
|
367
342
|
sx={
|
|
368
|
-
containerBoxSx == null
|
|
343
|
+
containerBoxSx == null
|
|
369
344
|
? undefined
|
|
370
345
|
: containerBoxSx(showDataGrid)
|
|
371
346
|
}
|
|
372
347
|
>
|
|
373
348
|
<Stack>
|
|
374
|
-
<Box ref={dimensions[0][0]}
|
|
349
|
+
<Box ref={dimensions[0][0]} className="SearchBox">
|
|
375
350
|
{searchBar}
|
|
376
351
|
</Box>
|
|
377
352
|
{list}
|
package/src/mu/SearchBar.tsx
CHANGED
|
@@ -104,28 +104,30 @@ export function SearchBar(props: SearchBarProps) {
|
|
|
104
104
|
form?: HTMLFormElement;
|
|
105
105
|
moreForm?: HTMLFormElement;
|
|
106
106
|
submitSeed?: number;
|
|
107
|
-
lastMaxWidth
|
|
107
|
+
lastMaxWidth: number;
|
|
108
108
|
hasMore: boolean;
|
|
109
|
-
}>({ hasMore: true }).current;
|
|
110
|
-
const lastMaxWidth = state.lastMaxWidth ?? 9999;
|
|
109
|
+
}>({ hasMore: true, lastMaxWidth: 9999 }).current;
|
|
111
110
|
|
|
112
111
|
// Watch container
|
|
113
|
-
const { dimensions } = useDimensions(
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
112
|
+
const { dimensions } = useDimensions(
|
|
113
|
+
1,
|
|
114
|
+
(target, rect) => {
|
|
115
|
+
// Same logic from resetButtonRef
|
|
116
|
+
if (
|
|
117
|
+
rect.width === state.lastMaxWidth ||
|
|
118
|
+
(!state.hasMore && rect.width > state.lastMaxWidth)
|
|
119
|
+
)
|
|
120
|
+
return false;
|
|
121
|
+
|
|
122
|
+
// Len
|
|
123
|
+
const len = target.children.length;
|
|
124
|
+
for (let i = 0; i < len; i++) {
|
|
125
|
+
var classList = target.children[i].classList;
|
|
126
|
+
classList.remove('showChild');
|
|
127
|
+
}
|
|
128
|
+
},
|
|
129
|
+
0
|
|
130
|
+
);
|
|
129
131
|
|
|
130
132
|
// Show or hide element
|
|
131
133
|
const setElementVisible = (element: Element, visible: boolean) => {
|
|
@@ -149,16 +151,10 @@ export function SearchBar(props: SearchBarProps) {
|
|
|
149
151
|
return;
|
|
150
152
|
|
|
151
153
|
// Container width
|
|
152
|
-
console.log(
|
|
153
|
-
'resetButtonRef',
|
|
154
|
-
state.hasMore,
|
|
155
|
-
containerRect.width,
|
|
156
|
-
lastMaxWidth
|
|
157
|
-
);
|
|
158
154
|
let maxWidth = containerRect.width;
|
|
159
155
|
if (
|
|
160
|
-
maxWidth === lastMaxWidth ||
|
|
161
|
-
(!state.hasMore && maxWidth > lastMaxWidth)
|
|
156
|
+
maxWidth === state.lastMaxWidth ||
|
|
157
|
+
(!state.hasMore && maxWidth > state.lastMaxWidth)
|
|
162
158
|
) {
|
|
163
159
|
return;
|
|
164
160
|
}
|
|
@@ -20,6 +20,8 @@ export function ResponsivePage<
|
|
|
20
20
|
pageProps.paddings ??= MUGlobal.pagePaddings;
|
|
21
21
|
const { paddings, fabColumnDirection, ...pageRest } = pageProps;
|
|
22
22
|
|
|
23
|
+
const half = MUGlobal.half(paddings);
|
|
24
|
+
|
|
23
25
|
// State
|
|
24
26
|
const [scrollContainer, setScrollContainer] = React.useState<HTMLElement>();
|
|
25
27
|
const [direction, setDirection] = React.useState(fabColumnDirection);
|
|
@@ -35,30 +37,28 @@ export function ResponsivePage<
|
|
|
35
37
|
<ResponsibleContainer<T, F>
|
|
36
38
|
paddings={paddings}
|
|
37
39
|
containerBoxSx={(dataGrid) => {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
40
|
+
// .SearchBox keep the same to avoid flick when switching between DataGrid and List
|
|
41
|
+
return {
|
|
42
|
+
'& .SearchBox': {
|
|
43
|
+
marginLeft: paddings,
|
|
44
|
+
marginTop: paddings,
|
|
45
|
+
marginRight: paddings,
|
|
46
|
+
marginBottom: half
|
|
47
|
+
},
|
|
48
|
+
'& .ListBox': {
|
|
49
|
+
marginBottom: paddings
|
|
50
|
+
},
|
|
51
|
+
'& .DataGridBox': {
|
|
52
|
+
marginLeft: paddings,
|
|
53
|
+
marginRight: paddings,
|
|
54
|
+
marginBottom: paddings
|
|
55
|
+
}
|
|
56
|
+
};
|
|
48
57
|
}}
|
|
49
58
|
elementReady={(element, isDataGrid) => {
|
|
50
59
|
setDirection(!isDataGrid);
|
|
51
60
|
setScrollContainer(element);
|
|
52
61
|
}}
|
|
53
|
-
listBoxSx={(dataGrid, height) => {
|
|
54
|
-
if (dataGrid) {
|
|
55
|
-
return {};
|
|
56
|
-
} else {
|
|
57
|
-
return {
|
|
58
|
-
height: height
|
|
59
|
-
};
|
|
60
|
-
}
|
|
61
|
-
}}
|
|
62
62
|
{...rest}
|
|
63
63
|
/>
|
|
64
64
|
</CommonPage>
|