@etsoo/react 1.4.23 → 1.4.27

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.
@@ -15,7 +15,7 @@ const calculateBatchSize = (height, itemSize) => {
15
15
  */
16
16
  export const ScrollerList = (props) => {
17
17
  // Destruct
18
- const { autoLoad = true, defaultOrderBy, defaultOrderByAsc, height = window.innerHeight, width = '100%', mRef, oRef, style = {}, itemRenderer, itemSize, loadBatchSize = calculateBatchSize(height, itemSize), loadData, threshold = GridSizeGet(loadBatchSize, height) / 2, onItemsRendered, ...rest } = props;
18
+ const { autoLoad = true, defaultOrderBy, defaultOrderByAsc, height = document.documentElement.clientHeight, width = '100%', mRef, oRef, style = {}, itemRenderer, itemSize, loadBatchSize = calculateBatchSize(height, itemSize), loadData, threshold = GridSizeGet(loadBatchSize, height) / 2, onItemsRendered, ...rest } = props;
19
19
  // Style
20
20
  Object.assign(style, {
21
21
  width: '100%',
@@ -120,6 +120,8 @@ export const ScrollerList = (props) => {
120
120
  ...add
121
121
  };
122
122
  Object.assign(state, resetState);
123
+ // Reset
124
+ setRows([]);
123
125
  },
124
126
  scrollTo(scrollOffset) {
125
127
  refMethods.scrollTo(scrollOffset);
@@ -86,7 +86,7 @@ export function DataGridEx(props) {
86
86
  sortLabel = headerCellRenderer({
87
87
  cellProps,
88
88
  column,
89
- columnIndex: index,
89
+ columnIndex: checkable ? index - 1 : index,
90
90
  states
91
91
  });
92
92
  }
@@ -115,7 +115,7 @@ export function DataGridEx(props) {
115
115
  const cell = footerItemRenderer
116
116
  ? footerItemRenderer(rows, {
117
117
  column,
118
- index,
118
+ index: checkable ? index - 1 : index,
119
119
  states,
120
120
  cellProps,
121
121
  checkable
@@ -80,16 +80,18 @@ export var DataGridRenderers;
80
80
  * @param location Renderer location (column index)
81
81
  * @returns Component
82
82
  */
83
- function defaultFooterItemRenderer(_rows, { index, states, checkable }, location = 1) {
83
+ function defaultFooterItemRenderer(_rows, { index, states, checkable }, location = 0) {
84
84
  const { selectedItems, loadedItems, hasNextPage } = states;
85
- if (checkable && index === location + 1) {
86
- return [
87
- selectedItems.length,
88
- loadedItems.toLocaleString() + (hasNextPage ? '+' : '')
89
- ].join(' / ');
90
- }
91
- if (!checkable && index === location) {
92
- return loadedItems.toLocaleString() + (hasNextPage ? '+' : '');
85
+ if (index === location) {
86
+ if (checkable) {
87
+ return [
88
+ selectedItems.length,
89
+ loadedItems.toLocaleString() + (hasNextPage ? '+' : '')
90
+ ].join(' / ');
91
+ }
92
+ else {
93
+ return loadedItems.toLocaleString() + (hasNextPage ? '+' : '');
94
+ }
93
95
  }
94
96
  return undefined;
95
97
  }
@@ -20,6 +20,10 @@ export interface ResponsibleContainerProps<T extends {}, F extends DataTypes.Bas
20
20
  * Columns
21
21
  */
22
22
  columns: GridColumn<T>[];
23
+ /**
24
+ * Container box SX (dataGrid determines the case)
25
+ */
26
+ containerBoxSx?: (dataGrid: boolean) => SxProps<Theme>;
23
27
  /**
24
28
  * Min width to show Datagrid
25
29
  */
@@ -51,7 +55,7 @@ export interface ResponsibleContainerProps<T extends {}, F extends DataTypes.Bas
51
55
  /**
52
56
  * Listbox SX (dataGrid determines the case)
53
57
  */
54
- listBoxSx?: (dataGrid: boolean) => SxProps<Theme>;
58
+ listBoxSx?: (dataGrid: boolean, height: number) => SxProps<Theme>;
55
59
  /**
56
60
  * Load data callback
57
61
  */
@@ -60,6 +64,10 @@ export interface ResponsibleContainerProps<T extends {}, F extends DataTypes.Bas
60
64
  * Methods
61
65
  */
62
66
  mRef?: React.MutableRefObject<GridMethodRef | undefined>;
67
+ /**
68
+ * Element ready callback
69
+ */
70
+ elementReady?: (element: HTMLElement, isDataGrid: boolean) => void;
63
71
  /**
64
72
  * Paddings
65
73
  */
@@ -9,6 +9,15 @@ import { MUGlobal } from './MUGlobal';
9
9
  import { PullToRefreshUI } from './PullToRefreshUI';
10
10
  import { ScrollerListEx } from './ScrollerListEx';
11
11
  import { SearchBar } from './SearchBar';
12
+ function getDefaultSearchBoxSx(paddings) {
13
+ const half = MUGlobal.half(paddings);
14
+ return {
15
+ paddingLeft: (theme) => theme.spacing(0.5),
16
+ paddingRight: (theme) => theme.spacing(0.5),
17
+ paddingTop: half,
18
+ marginBottom: half
19
+ };
20
+ }
12
21
  /**
13
22
  * Responsible container
14
23
  * @param props Props
@@ -16,7 +25,7 @@ import { SearchBar } from './SearchBar';
16
25
  */
17
26
  export function ResponsibleContainer(props) {
18
27
  // Destruct
19
- const { adjustHeight, columns, dataGridMinWidth = DataGridExCalColumns(columns).total, fields, fieldTemplate, height, listBoxSx, loadData, mRef, paddings = MUGlobal.pagePaddings, pullToRefresh = true, searchBoxSx = { marginBottom: MUGlobal.half(paddings) }, sizeReadyMiliseconds = 0, ...rest } = props;
28
+ const { adjustHeight, columns, containerBoxSx, dataGridMinWidth = DataGridExCalColumns(columns).total, elementReady, fields, fieldTemplate, height, listBoxSx, loadData, mRef, paddings = MUGlobal.pagePaddings, pullToRefresh = true, searchBoxSx = getDefaultSearchBoxSx(paddings), sizeReadyMiliseconds = 0, ...rest } = props;
20
29
  // Labels
21
30
  const labels = Labels.CommonPage;
22
31
  // Refs
@@ -55,6 +64,7 @@ export function ResponsibleContainer(props) {
55
64
  // Last rect
56
65
  const lastRect = state.rect;
57
66
  // 32 = scroll bar width
67
+ console.log(lastRect, rect);
58
68
  if (lastRect != null &&
59
69
  state.mounted !== true &&
60
70
  Math.abs(rect.width - lastRect.width) <= 32 &&
@@ -70,7 +80,7 @@ export function ResponsibleContainer(props) {
70
80
  const [list, showDataGrid] = (() => {
71
81
  // No layout
72
82
  if (rect == null)
73
- return [null, false];
83
+ return [null, undefined];
74
84
  // Width
75
85
  const width = rect.width;
76
86
  // Show DataGrid or List dependng on width
@@ -82,7 +92,9 @@ export function ResponsibleContainer(props) {
82
92
  }
83
93
  else {
84
94
  // Auto calculation
85
- heightLocal = window.innerHeight - Math.round(rect.bottom + 1);
95
+ heightLocal =
96
+ document.documentElement.clientHeight -
97
+ Math.round(rect.bottom + 1);
86
98
  const style = window.getComputedStyle(dimensions[0][1]);
87
99
  const boxMargin = parseFloat(style.marginBottom);
88
100
  if (!isNaN(boxMargin))
@@ -95,8 +107,13 @@ export function ResponsibleContainer(props) {
95
107
  // Delete
96
108
  delete rest.itemRenderer;
97
109
  return [
98
- React.createElement(Box, { sx: listBoxSx == null ? undefined : listBoxSx(true) },
99
- React.createElement(DataGridEx, { autoLoad: !hasFields, height: heightLocal, width: rect.width, loadData: localLoadData, mRef: mRefs, columns: columns, ...rest })),
110
+ React.createElement(Box, { sx: listBoxSx == null
111
+ ? undefined
112
+ : listBoxSx(true, heightLocal) },
113
+ React.createElement(DataGridEx, { autoLoad: !hasFields, height: heightLocal, width: rect.width, loadData: localLoadData, mRef: mRefs, outerRef: (element) => {
114
+ if (element != null && elementReady)
115
+ elementReady(element, true);
116
+ }, columns: columns, ...rest })),
100
117
  true
101
118
  ];
102
119
  }
@@ -110,21 +127,33 @@ export function ResponsibleContainer(props) {
110
127
  delete rest.hoverColor;
111
128
  delete rest.selectable;
112
129
  return [
113
- React.createElement(Box, { sx: listBoxSx == null ? undefined : listBoxSx(false) },
114
- React.createElement(ScrollerListEx, { autoLoad: !hasFields, width: rect.width, height: heightLocal, loadData: localLoadData, mRef: mRefs, ...rest })),
130
+ React.createElement(Box, { sx: listBoxSx == null
131
+ ? undefined
132
+ : listBoxSx(false, heightLocal) },
133
+ React.createElement(ScrollerListEx, { autoLoad: !hasFields, height: heightLocal, loadData: localLoadData, mRef: mRefs, oRef: (element) => {
134
+ if (element != null && elementReady)
135
+ elementReady(element, false);
136
+ }, ...rest })),
115
137
  false
116
138
  ];
117
139
  })();
140
+ const searchBar = React.useMemo(() => {
141
+ if (!hasFields || showDataGrid == null)
142
+ return;
143
+ return (React.createElement(SearchBar, { fields: fields, onSubmit: onSubmit, className: `searchBar${showDataGrid ? 'Grid' : 'List'}` }));
144
+ }, [showDataGrid, hasFields]);
118
145
  // Pull container
119
- const pullContainer = list
120
- ? showDataGrid
146
+ const pullContainer = showDataGrid == null
147
+ ? undefined
148
+ : showDataGrid
121
149
  ? '.DataGridEx-Body'
122
- : '.ScrollerListEx-Body'
123
- : undefined;
150
+ : '.ScrollerListEx-Body';
124
151
  // Layout
125
- return (React.createElement(React.Fragment, null,
152
+ return (React.createElement(Box, { sx: containerBoxSx == null || showDataGrid == null
153
+ ? undefined
154
+ : containerBoxSx(showDataGrid) },
126
155
  React.createElement(Stack, null,
127
- React.createElement(Box, { ref: dimensions[0][0], sx: searchBoxSx }, hasFields && (React.createElement(SearchBar, { fields: fields, onSubmit: onSubmit }))),
156
+ React.createElement(Box, { ref: dimensions[0][0], sx: searchBoxSx }, searchBar),
128
157
  list),
129
158
  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: () => {
130
159
  const container = document.querySelector(pullContainer);
@@ -63,12 +63,12 @@ export function SearchBar(props) {
63
63
  const [index, updateIndex] = React.useState();
64
64
  // Drawer open / close
65
65
  const [open, updateOpen] = React.useState(false);
66
- // Forms
67
- const [forms] = React.useState({});
66
+ // State
67
+ const state = React.useRef({}).current;
68
68
  // Watch container
69
69
  const { dimensions } = useDimensions(1, (target, rect) => {
70
70
  // Same logic from resetButtonRef
71
- if (rect.width === forms.lastMaxWidth)
71
+ if (rect.width === state.lastMaxWidth)
72
72
  return false;
73
73
  // Len
74
74
  const len = target.children.length;
@@ -96,10 +96,10 @@ export function SearchBar(props) {
96
96
  return;
97
97
  // Container width
98
98
  let maxWidth = containerRect.width;
99
- if (maxWidth === forms.lastMaxWidth) {
99
+ if (maxWidth === state.lastMaxWidth) {
100
100
  return;
101
101
  }
102
- forms.lastMaxWidth = maxWidth;
102
+ state.lastMaxWidth = maxWidth;
103
103
  // More button
104
104
  const buttonMore = resetButton.previousElementSibling;
105
105
  // Cached button width
@@ -174,8 +174,8 @@ export function SearchBar(props) {
174
174
  const handleForm = (event) => {
175
175
  if (event.nativeEvent.cancelable && !event.nativeEvent.composed)
176
176
  return;
177
- if (forms.form == null)
178
- forms.form = event.currentTarget;
177
+ if (state.form == null)
178
+ state.form = event.currentTarget;
179
179
  handleSubmit();
180
180
  };
181
181
  // Handle more button click
@@ -186,54 +186,56 @@ export function SearchBar(props) {
186
186
  const moreFormChange = (event) => {
187
187
  if (event.nativeEvent.cancelable && !event.nativeEvent.composed)
188
188
  return;
189
- if (forms.moreForm == null)
190
- forms.moreForm = event.currentTarget;
189
+ if (state.moreForm == null)
190
+ state.moreForm = event.currentTarget;
191
191
  handleSubmit();
192
192
  };
193
193
  // Reset
194
194
  const handleReset = () => {
195
195
  // Clear form values
196
- if (forms.form != null)
197
- resetForm(forms.form);
198
- if (forms.moreForm != null)
199
- resetForm(forms.moreForm);
196
+ if (state.form != null)
197
+ resetForm(state.form);
198
+ if (state.moreForm != null)
199
+ resetForm(state.moreForm);
200
200
  // Resubmit
201
201
  handleSubmitInstant(true);
202
202
  };
203
203
  // Submit
204
204
  const handleSubmit = (delay = 480) => {
205
- if (forms.submitSeed != null) {
206
- clearTimeout(forms.submitSeed);
205
+ if (state.submitSeed != null) {
206
+ clearTimeout(state.submitSeed);
207
207
  }
208
208
  // Delay the change
209
- forms.submitSeed = window.setTimeout(handleSubmitInstant, delay);
209
+ state.submitSeed = window.setTimeout(handleSubmitInstant, delay);
210
210
  };
211
211
  // Submit at once
212
212
  const handleSubmitInstant = (reset = false) => {
213
213
  // Reset timeout
214
- forms.submitSeed = undefined;
214
+ state.submitSeed = undefined;
215
215
  // Prepare data
216
- const data = new FormData(forms.form);
217
- if (forms.moreForm != null) {
218
- DomUtils.mergeFormData(data, new FormData(forms.moreForm));
216
+ const data = new FormData(state.form);
217
+ if (state.moreForm != null) {
218
+ DomUtils.mergeFormData(data, new FormData(state.moreForm));
219
219
  }
220
220
  onSubmit(data, reset);
221
221
  };
222
222
  // First loading
223
223
  React.useEffect(() => {
224
- // Delayed way
225
- handleSubmit(100);
226
224
  return () => {
227
225
  // Clear the seeds
228
- if (forms.submitSeed != null)
229
- clearTimeout(forms.submitSeed);
226
+ if (state.submitSeed != null)
227
+ clearTimeout(state.submitSeed);
230
228
  };
231
229
  }, []);
230
+ React.useEffect(() => {
231
+ // Delayed way
232
+ handleSubmit(100);
233
+ }, [className]);
232
234
  // Layout
233
235
  return (React.createElement(React.Fragment, null,
234
236
  React.createElement("form", { id: "SearchBarForm", className: className, onChange: handleForm, ref: (form) => {
235
237
  if (form)
236
- forms.form = form;
238
+ state.form = form;
237
239
  } },
238
240
  React.createElement(Stack, { ref: dimensions[0][0], justifyContent: "center", alignItems: "center", direction: "row", spacing: 1, height: innerHeight, sx: {
239
241
  '& > :not(style)': {
@@ -260,7 +262,7 @@ export function SearchBar(props) {
260
262
  }, open: open, onClose: () => updateOpen(false) },
261
263
  React.createElement("form", { onChange: moreFormChange, ref: (form) => {
262
264
  if (form)
263
- forms.moreForm = form;
265
+ state.moreForm = form;
264
266
  } },
265
267
  React.createElement(Stack, { direction: "column", alignItems: "stretch", spacing: 2, padding: 2 }, moreItems))))));
266
268
  }
@@ -1,9 +1,5 @@
1
1
  /// <reference types="react" />
2
2
  import { CommonPageProps } from './CommonPageProps';
3
- /**
4
- * Default pull container
5
- */
6
- export declare const CommonPagePullContainer = "#page-container";
7
3
  /**
8
4
  * Default scroll container
9
5
  */
@@ -1,17 +1,12 @@
1
1
  import React from 'react';
2
2
  import { FabBox } from '../FabBox';
3
3
  import { ScrollTopFab } from '../ScrollTopFab';
4
- import { PullToRefreshUI } from '../PullToRefreshUI';
5
4
  import { Labels } from '../../app/Labels';
6
5
  import { MUGlobal } from '../MUGlobal';
7
6
  import { MoreFab } from '../MoreFab';
8
7
  import { ReactAppStateDetector } from '../../app/ReactApp';
9
8
  import { Container, Fab } from '@mui/material';
10
9
  import RefreshIcon from '@mui/icons-material/Refresh';
11
- /**
12
- * Default pull container
13
- */
14
- export const CommonPagePullContainer = '#page-container';
15
10
  /**
16
11
  * Default scroll container
17
12
  */
@@ -22,7 +17,7 @@ export const CommonPageScrollContainer = global;
22
17
  */
23
18
  export function CommonPage(props) {
24
19
  // Destruct
25
- const { children, disableGutters = true, fabButtons, fabColumnDirection, fabPaddingAdjust = 1.5, fabSize = 'small', maxWidth = false, moreActions, onRefresh, onUpdate, onUpdateAll, paddings = MUGlobal.pagePaddings, scrollContainer, targetFields, pullContainer, sx = {}, ...rest } = props;
20
+ const { children, disableGutters = true, fabButtons, fabColumnDirection, fabPaddingAdjust = 1.5, fabSize = 'small', maxWidth = false, moreActions, onRefresh, onUpdate, onUpdateAll, paddings = MUGlobal.pagePaddings, scrollContainer, targetFields, sx = {}, ...rest } = props;
26
21
  // Merge style
27
22
  Object.assign(sx, {
28
23
  padding: paddings
@@ -59,9 +54,5 @@ export function CommonPage(props) {
59
54
  onRefresh != null && (React.createElement(Fab, { title: labels.refresh, size: fabSize, onClick: onRefresh, sx: { display: { xs: 'none', md: 'inherit' } } },
60
55
  React.createElement(RefreshIcon, null))),
61
56
  React.createElement(MoreFab, { size: fabSize, title: labels.more, actions: moreActions })),
62
- children),
63
- onRefresh != null && pullContainer != null && (React.createElement(PullToRefreshUI, { mainElement: pullContainer, triggerElement: pullContainer, instructionsPullToRefresh: labels.pullToRefresh, instructionsReleaseToRefresh: labels.releaseToRefresh, instructionsRefreshing: labels.refreshing, onRefresh: onRefresh, shouldPullToRefresh: () => {
64
- const container = document.querySelector(pullContainer);
65
- return !(container === null || container === void 0 ? void 0 : container.scrollTop);
66
- } }))));
57
+ children)));
67
58
  }
@@ -45,10 +45,6 @@ export interface CommonPageProps extends Omit<ContainerProps, 'id'> {
45
45
  * Paddings
46
46
  */
47
47
  paddings?: {};
48
- /**
49
- * Pull container
50
- */
51
- pullContainer?: string;
52
48
  /**
53
49
  * Scroll container
54
50
  */
@@ -13,7 +13,7 @@ import { CommonPage } from './CommonPage';
13
13
  * @returns Component
14
14
  */
15
15
  export function DataGridPage(props) {
16
- var _a, _b;
16
+ var _a;
17
17
  // Destruct
18
18
  const { adjustHeight, fields, fieldTemplate, height, loadData, mRef, sizeReadyMiliseconds = 100, pageProps = {}, ...rest } = props;
19
19
  (_a = pageProps.paddings) !== null && _a !== void 0 ? _a : (pageProps.paddings = MUGlobal.pagePaddings);
@@ -42,7 +42,8 @@ export function DataGridPage(props) {
42
42
  const rect = dimensions[0][2];
43
43
  React.useEffect(() => {
44
44
  if (rect != null && rect.height > 50 && height == null) {
45
- let gridHeight = window.innerHeight - Math.round(rect.top + rect.height + 1);
45
+ let gridHeight = document.documentElement.clientHeight -
46
+ Math.round(rect.top + rect.height + 1);
46
47
  const style = window.getComputedStyle(dimensions[0][1]);
47
48
  const paddingBottom = parseFloat(style.paddingBottom);
48
49
  if (!isNaN(paddingBottom))
@@ -69,12 +70,8 @@ export function DataGridPage(props) {
69
70
  return;
70
71
  ref.reset({ data });
71
72
  }, [ref, data]);
72
- // Pull container id
73
- const pullContainer = ((_b = states.element) === null || _b === void 0 ? void 0 : _b.parentElement)
74
- ? '.DataGridEx-Body'
75
- : undefined;
76
73
  // Layout
77
- return (React.createElement(CommonPage, { ...pageProps, scrollContainer: states.element, pullContainer: pullContainer },
74
+ return (React.createElement(CommonPage, { ...pageProps, scrollContainer: states.element },
78
75
  React.createElement(Stack, null,
79
76
  React.createElement(Box, { ref: dimensions[0][0], sx: {
80
77
  paddingBottom: pageProps.paddings
@@ -48,7 +48,8 @@ export function FixedListPage(props) {
48
48
  const rect = dimensions[0][2];
49
49
  const list = React.useMemo(() => {
50
50
  if (rect != null && rect.height > 50) {
51
- let height = window.innerHeight - Math.round(rect.top + rect.height + 1);
51
+ let height = document.documentElement.clientHeight -
52
+ Math.round(rect.top + rect.height + 1);
52
53
  if (adjustHeight != null) {
53
54
  height -= adjustHeight(height);
54
55
  }
@@ -61,13 +62,9 @@ export function FixedListPage(props) {
61
62
  }, ...rest })));
62
63
  }
63
64
  }, [rect]);
64
- // Pull container id
65
- const pullContainer = (scrollContainer === null || scrollContainer === void 0 ? void 0 : scrollContainer.parentElement)
66
- ? '#' + (scrollContainer === null || scrollContainer === void 0 ? void 0 : scrollContainer.parentElement.id)
67
- : undefined;
68
65
  const { paddings, ...pageRest } = pageProps;
69
66
  // Layout
70
- return (React.createElement(CommonPage, { ...pageRest, paddings: {}, scrollContainer: scrollContainer, pullContainer: pullContainer },
67
+ return (React.createElement(CommonPage, { ...pageRest, paddings: {}, scrollContainer: scrollContainer },
71
68
  React.createElement(Stack, null,
72
69
  React.createElement(Box, { ref: dimensions[0][0], sx: { padding: paddings } },
73
70
  React.createElement(SearchBar, { fields: fields, onSubmit: onSubmit })),
@@ -5,7 +5,7 @@ import useCombinedRefs from '../../uses/useCombinedRefs';
5
5
  import { MUGlobal } from '../MUGlobal';
6
6
  import { ScrollerListEx } from '../ScrollerListEx';
7
7
  import { SearchBar } from '../SearchBar';
8
- import { CommonPage, CommonPagePullContainer, CommonPageScrollContainer } from './CommonPage';
8
+ import { CommonPage, CommonPageScrollContainer } from './CommonPage';
9
9
  /**
10
10
  * List page
11
11
  * @param props Props
@@ -41,7 +41,7 @@ export function ListPage(props) {
41
41
  return loadData(data);
42
42
  };
43
43
  // Layout
44
- return (React.createElement(CommonPage, { ...pageProps, scrollContainer: CommonPageScrollContainer, pullContainer: CommonPagePullContainer },
44
+ return (React.createElement(CommonPage, { ...pageProps, scrollContainer: CommonPageScrollContainer },
45
45
  React.createElement(Stack, null,
46
46
  React.createElement(Box, { sx: {
47
47
  paddingBottom: pageProps.paddings
@@ -1,12 +1,6 @@
1
- import { Box, Stack } from '@mui/material';
2
1
  import React from 'react';
3
- import { GridDataGet } from '../../components/GridLoader';
4
- import useCombinedRefs from '../../uses/useCombinedRefs';
5
- import { useDimensions } from '../../uses/useDimensions';
6
- import { DataGridEx, DataGridExCalColumns } from '../DataGridEx';
7
2
  import { MUGlobal } from '../MUGlobal';
8
- import { ScrollerListEx } from '../ScrollerListEx';
9
- import { SearchBar } from '../SearchBar';
3
+ import { ResponsibleContainer } from '../ResponsibleContainer';
10
4
  import { CommonPage } from './CommonPage';
11
5
  /**
12
6
  * Fixed height list page
@@ -14,119 +8,39 @@ import { CommonPage } from './CommonPage';
14
8
  * @returns Component
15
9
  */
16
10
  export function ResponsivePage(props) {
17
- var _a, _b;
11
+ var _a;
18
12
  // Destruct
19
- const { adjustHeight, columns, dataGridMinWidth = DataGridExCalColumns(columns).total, fields, fieldTemplate, height, loadData, innerItemRenderer, itemSize, mRef, sizeReadyMiliseconds = 0, pageProps = {}, ...rest } = props;
13
+ const { pageProps = {}, ...rest } = props;
20
14
  (_a = pageProps.paddings) !== null && _a !== void 0 ? _a : (pageProps.paddings = MUGlobal.pagePaddings);
21
- // States
22
- const [states, setStates] = React.useReducer((currentState, newState) => {
23
- return { ...currentState, ...newState };
24
- }, {
25
- height
26
- });
27
- const localLoadData = (props) => {
28
- const data = GridDataGet(props, fieldTemplate);
29
- return loadData(data);
30
- };
31
- const refs = useCombinedRefs(mRef, (ref) => {
32
- if (ref == null)
33
- return;
34
- states.ref = ref;
35
- // setStates({ ref });
36
- });
37
- // On submit callback
38
- const onSubmit = (data, _reset) => {
39
- setStates({ data });
40
- };
41
- // Watch container
42
- const { dimensions } = useDimensions(1, undefined, sizeReadyMiliseconds);
43
- const rect = dimensions[0][2];
44
- const showDataGrid = ((_b = rect === null || rect === void 0 ? void 0 : rect.width) !== null && _b !== void 0 ? _b : 0) >= dataGridMinWidth;
45
- React.useEffect(() => {
46
- if (rect != null && rect.height > 50 && height == null) {
47
- let gridHeight = window.innerHeight - Math.round(rect.top + rect.height + 1);
48
- const style = window.getComputedStyle(dimensions[0][1]);
49
- const boxPadding = parseFloat(style.paddingLeft);
50
- if (!isNaN(boxPadding))
51
- gridHeight -= 2 * boxPadding;
52
- if (adjustHeight != null) {
53
- gridHeight -= adjustHeight(gridHeight);
54
- }
55
- if (gridHeight !== states.height)
56
- setStates({ height: gridHeight });
57
- }
58
- }, [rect]);
59
- const { paddings, ...pageRest } = pageProps;
60
- const list = React.useMemo(() => {
61
- const gridHeight = states.height;
62
- if (gridHeight == null)
63
- return;
64
- // Show in a row when under DataGrid
65
- pageProps.fabColumnDirection = !showDataGrid;
66
- if (showDataGrid) {
67
- // Delete
68
- delete rest.itemRenderer;
69
- return (React.createElement(Box, { sx: {
70
- padding: paddings
71
- } },
72
- React.createElement(DataGridEx, { autoLoad: false, height: gridHeight, loadData: localLoadData, mRef: refs, columns: columns, outerRef: (element) => {
73
- if (element != null)
74
- setStates({ element });
75
- }, ...rest })));
76
- }
77
- // Delete
78
- delete rest.checkable;
79
- delete rest.borderRowsCount;
80
- delete rest.bottomHeight;
81
- delete rest.footerItemRenderer;
82
- delete rest.headerHeight;
83
- delete rest.hideFooter;
84
- delete rest.hoverColor;
85
- delete rest.selectable;
86
- // Half
87
- const halfPadding = MUGlobal.half(paddings);
88
- const style = window.getComputedStyle(dimensions[0][1]);
89
- const boxPadding = parseFloat(style.paddingLeft);
90
- return (React.createElement(Box, { sx: {
91
- height: gridHeight + (isNaN(boxPadding) ? 0 : boxPadding),
92
- paddingTop: halfPadding,
93
- paddingBottom: halfPadding
94
- } },
95
- React.createElement(ScrollerListEx, { autoLoad: false, height: gridHeight, innerItemRenderer: innerItemRenderer, itemSize: itemSize, loadData: localLoadData, mRef: refs, oRef: (element) => {
96
- if (element != null)
97
- setStates({ element });
98
- }, ...rest })));
99
- }, [states.height, showDataGrid, localLoadData]);
100
- const sizeRef = React.useRef();
101
- const { ref, data } = states;
102
- React.useEffect(() => {
103
- if (ref == null || data == null || rect == null)
104
- return;
105
- // Resize without reset
106
- if (sizeRef.current == null) {
107
- sizeRef.current = [rect.width, rect.height];
108
- }
109
- else if (sizeRef.current[0] !== rect.width ||
110
- sizeRef.current[1] !== rect.height) {
111
- sizeRef.current = [rect.width, rect.height];
112
- return;
113
- }
114
- ref.reset({ data });
115
- });
116
- // Pull container id
117
- const pullContainer = states.element
118
- ? showDataGrid
119
- ? '.DataGridEx-Body'
120
- : '.ScrollerListEx-Body'
121
- : undefined;
15
+ const { paddings, fabColumnDirection, ...pageRest } = pageProps;
16
+ // State
17
+ const [scrollContainer, setScrollContainer] = React.useState();
18
+ const [direction, setDirection] = React.useState(fabColumnDirection);
122
19
  // Layout
123
- return (React.createElement(CommonPage, { ...pageRest, paddings: {}, scrollContainer: states.element, pullContainer: pullContainer },
124
- React.createElement(Stack, null,
125
- React.createElement(Box, { ref: dimensions[0][0], sx: {
126
- paddingLeft: paddings,
127
- paddingTop: MUGlobal.increase(paddings, 0.5, 'xs'),
128
- paddingRight: paddings
129
- } },
130
- React.createElement(SearchBar, { fields: fields, onSubmit: onSubmit })),
131
- list)));
20
+ return (React.createElement(CommonPage, { ...pageRest, paddings: {}, scrollContainer: scrollContainer, fabColumnDirection: direction },
21
+ React.createElement(ResponsibleContainer, { paddings: paddings, containerBoxSx: (dataGrid) => {
22
+ if (dataGrid) {
23
+ return {
24
+ padding: paddings
25
+ };
26
+ }
27
+ else {
28
+ return {
29
+ paddingTop: paddings,
30
+ paddingBottom: paddings
31
+ };
32
+ }
33
+ }, elementReady: (element, isDataGrid) => {
34
+ setDirection(!isDataGrid);
35
+ setScrollContainer(element);
36
+ }, listBoxSx: (dataGrid, height) => {
37
+ if (dataGrid) {
38
+ return {};
39
+ }
40
+ else {
41
+ return {
42
+ height: height
43
+ };
44
+ }
45
+ }, ...rest })));
132
46
  }
@@ -28,4 +28,8 @@ export interface ResponsePageProps<T, F extends DataTypes.BasicTemplate> extends
28
28
  * Methods
29
29
  */
30
30
  mRef?: React.MutableRefObject<GridMethodRef | undefined>;
31
+ /**
32
+ * Pull to refresh data
33
+ */
34
+ pullToRefresh?: boolean;
31
35
  }