@controleonline/ui-default 1.0.265 → 1.0.267

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.
@@ -1,396 +1,431 @@
1
- import React, { useEffect, useMemo, useRef } from 'react';
2
- import { View, useWindowDimensions } from 'react-native';
3
- import { useIsFocused, useRoute } from '@react-navigation/native';
4
- import { useStore } from '@store';
5
- import { useMessage } from '@controleonline/ui-common/src/react/components/MessageService';
6
- import { normalizeText } from '../inputs/defaultInputUtils';
7
- import { DEFAULT_COMPACT_BREAKPOINT, isObject, stableSerialize } from './DefaultTable.utils';
8
- import {
9
- resolveDefaultTablePreferenceScope,
10
- resolveStoredTableFiltersPreference,
11
- resolveStoredTableViewModePreference,
12
- resolveStoredVisibleColumnsPreference,
13
- sanitizeTableFiltersPreference,
14
- sanitizeVisibleColumnsPreference,
15
- } from '../../utils/tableVisibleColumnsPreferences';
16
- import DefaultTableBody from './DefaultTableBody';
17
- import DefaultTableFooter from './DefaultTableFooter';
18
- import DefaultTableToolbar from './DefaultTableToolbar';
19
- import styles from './DefaultTable.styles';
20
- import { useDefaultTablePagination } from './useDefaultTablePagination';
21
- import {
22
- useDefaultTableSortedData,
23
- useDefaultTableSortState,
24
- } from './useDefaultTableSorting';
25
- import useDefaultTableTheme from './useDefaultTableTheme';
26
-
27
- export {
28
- mergeSortedDataWithLiveItems,
29
- resolveColumnListLoadParams,
30
- shouldTriggerEndReachedFromScroll,
31
- } from './DefaultTable.utils';
32
-
33
- const publishStoreValue = (store, actionName, value, getterName) => {
34
- if (typeof store?.actions?.[actionName] === 'function') {
35
- store.actions[actionName](value);
36
- return;
37
- }
38
-
39
- if (store?.getters) {
40
- store.getters[getterName] = value;
41
- }
42
- };
43
-
44
- const assignGetterValue = (store, getterName, value) => {
45
- if (store?.getters) {
46
- store.getters[getterName] = value;
47
- }
48
- };
49
-
50
- const DefaultTable = ({
51
- accentColor = null,
52
- actions = {},
53
- add = null,
54
- compactBreakpoint = DEFAULT_COMPACT_BREAKPOINT,
55
- columns = [],
56
- data = undefined,
57
- filters = {},
58
- footerComponent = null,
59
- forceCardsOnCompact = true,
60
- getOptionsForColumn = null,
61
- hasMore = null,
62
- initialViewMode = 'table',
63
- isLoading = false,
64
- onAdd = null,
65
- onDataLoaded = null,
66
- onEditRow = null,
67
- onEndReached = null,
68
- onFilterChange = null,
69
- onMomentumScrollBegin = null,
70
- onRowPress = null,
71
- onSaved = null,
72
- onScrollBeginDrag = null,
73
- onSortChange = null,
74
- pageSize = null,
75
- renderCard = null,
76
- requestParams = {},
77
- rowActionsComponent = null,
78
- rowStyle = null,
79
- showColumnFiltersButton = true,
80
- showRowActions = true,
81
- showTotalItemsInCompactToolbar = false,
82
- showTotalItemsInFooter = true,
83
- sort = null,
84
- storeName = '',
85
- summary = undefined,
86
- summaryLabels = {},
87
- toolbarActions = [],
88
- visibleColumnsPreferenceKey = '',
89
- }) => {
90
- const { width } = useWindowDimensions();
91
- const route = useRoute?.();
92
- const store = useStore(storeName);
93
- const isFocused = useIsFocused();
94
- const configsSignatureRef = useRef('');
95
- const { showError } = useMessage() || {};
96
- const { themeColors } = useDefaultTableTheme(accentColor);
97
- const tablePreferenceScope = useMemo(
98
- () =>
99
- resolveDefaultTablePreferenceScope({
100
- preferenceKey: visibleColumnsPreferenceKey,
101
- route,
102
- storeName,
103
- }),
104
- [route?.key, route?.name, storeName, visibleColumnsPreferenceKey],
105
- );
106
- const storedViewMode = useMemo(
107
- () => resolveStoredTableViewModePreference(tablePreferenceScope, null),
108
- [initialViewMode, tablePreferenceScope],
109
- );
110
- const resolvedActions = useMemo(
111
- () => ({
112
- ...(store?.actions || {}),
113
- ...(actions || {}),
114
- }),
115
- [actions, store?.actions],
116
- );
117
- const autoMode = data === undefined && normalizeText(storeName) !== '';
118
- const storeColumns = Array.isArray(store?.getters?.columns) ? store.getters.columns : [];
119
- const columnsForTable = storeColumns.length > 0 ? storeColumns : columns;
120
- const storeFilters = isObject(store?.getters?.filters) ? store.getters.filters : {};
121
- const requestParamsSeed = isObject(requestParams) ? requestParams : {};
122
- const resolvedTotalItems = store?.getters?.totalItems;
123
- const currentConfigs = store?.getters?.configs || {};
124
- const isCompactView = width > 0 && width <= compactBreakpoint;
125
-
126
- if (storeColumns.length === 0 && Array.isArray(columns) && columns.length > 0) {
127
- assignGetterValue(store, 'columns', columns);
128
- }
129
-
130
- if (data !== undefined && Array.isArray(data)) {
131
- assignGetterValue(store, 'items', data);
132
- }
133
-
134
- const { requestSort, resolvedSort } = useDefaultTableSortState({
135
- autoMode,
136
- columnsForTable,
137
- onSortChange,
138
- sort,
139
- tablePreferenceScope,
140
- });
141
- const {
142
- buildRequestQuery,
143
- currentPage,
144
- handleEndReached,
145
- resolvedData,
146
- } = useDefaultTablePagination({
147
- autoMode,
148
- columnsForTable,
149
- data,
150
- filters: storeFilters,
151
- hasMore,
152
- isFocused,
153
- isLoading,
154
- onEndReached,
155
- pageSize,
156
- requestParams: requestParamsSeed,
157
- resolvedActions,
158
- resolvedSort,
159
- resolvedTotalItems,
160
- showError,
161
- store,
162
- storeName,
163
- });
164
- const sortedData = useDefaultTableSortedData({
165
- resolvedData,
166
- resolvedSort,
167
- storeName,
168
- tableColumns: columnsForTable,
169
- });
170
- const debugFallbackParameters = useMemo(() => {
171
- if (autoMode) {
172
- return buildRequestQuery(currentPage || 1, false);
173
- }
174
-
175
- return {
176
- filters: storeFilters,
177
- requestParams: requestParamsSeed,
178
- sort: resolvedSort || null,
179
- };
180
- }, [autoMode, buildRequestQuery, currentPage, requestParamsSeed, resolvedSort, storeFilters]);
181
- const effectiveViewMode =
182
- currentConfigs.viewMode ||
183
- storedViewMode ||
184
- (isCompactView && forceCardsOnCompact !== false ? 'cards' : initialViewMode);
185
- const tableFiltersVisible = Boolean(currentConfigs.tableFiltersVisible);
186
- const defaultTableConfigs = useMemo(
187
- () => ({
188
- add,
189
- compactBreakpoint,
190
- debugFallbackParameters,
191
- effectiveViewMode,
192
- filters,
193
- footerComponent,
194
- forceCardsOnCompact,
195
- getOptionsForColumn,
196
- initialViewMode,
197
- onAdd,
198
- onDataLoaded,
199
- onEditRow,
200
- onEndReached: handleEndReached,
201
- onFilterChange,
202
- onMomentumScrollBegin,
203
- onRowPress,
204
- onSaved,
205
- onScrollBeginDrag,
206
- renderCard,
207
- requestParams: requestParamsSeed,
208
- requestSort,
209
- resolvedSort,
210
- rowActionsComponent,
211
- rowStyle,
212
- showColumnFiltersButton,
213
- showRowActions,
214
- showTotalItemsInCompactToolbar,
215
- showTotalItemsInFooter,
216
- sortedData,
217
- summary,
218
- summaryLabels,
219
- tableFiltersVisible,
220
- tablePreferenceScope,
221
- toolbarActions,
222
- viewMode: effectiveViewMode,
223
- }),
224
- [
225
- add,
226
- compactBreakpoint,
227
- debugFallbackParameters,
228
- effectiveViewMode,
229
- filters,
230
- footerComponent,
231
- forceCardsOnCompact,
232
- getOptionsForColumn,
233
- handleEndReached,
234
- initialViewMode,
235
- onAdd,
236
- onDataLoaded,
237
- onEditRow,
238
- onFilterChange,
239
- onMomentumScrollBegin,
240
- onRowPress,
241
- onSaved,
242
- onScrollBeginDrag,
243
- renderCard,
244
- requestParamsSeed,
245
- requestSort,
246
- resolvedSort,
247
- rowActionsComponent,
248
- rowStyle,
249
- showColumnFiltersButton,
250
- showRowActions,
251
- showTotalItemsInCompactToolbar,
252
- showTotalItemsInFooter,
253
- sortedData,
254
- summary,
255
- summaryLabels,
256
- tableFiltersVisible,
257
- tablePreferenceScope,
258
- toolbarActions,
259
- ],
260
- );
261
- const defaultTableConfigsSignature = useMemo(
262
- () =>
263
- stableSerialize({
264
- add,
265
- compactBreakpoint,
266
- debugFallbackParameters,
267
- effectiveViewMode,
268
- filters,
269
- forceCardsOnCompact,
270
- initialViewMode,
271
- resolvedSort,
272
- showColumnFiltersButton,
273
- showRowActions,
274
- showTotalItemsInCompactToolbar,
275
- showTotalItemsInFooter,
276
- storedViewMode,
277
- tableFiltersVisible,
278
- sortedDataLength: sortedData.length,
279
- toolbarActionsLength: Array.isArray(toolbarActions) ? toolbarActions.length : 0,
280
- }),
281
- [
282
- add,
283
- compactBreakpoint,
284
- debugFallbackParameters,
285
- effectiveViewMode,
286
- filters,
287
- forceCardsOnCompact,
288
- initialViewMode,
289
- resolvedSort,
290
- showColumnFiltersButton,
291
- showRowActions,
292
- showTotalItemsInCompactToolbar,
293
- showTotalItemsInFooter,
294
- storedViewMode,
295
- tableFiltersVisible,
296
- sortedData.length,
297
- toolbarActions,
298
- ],
299
- );
300
-
301
- if (store?.getters) {
302
- assignGetterValue(store, 'configs', defaultTableConfigs);
303
- }
304
-
305
- useEffect(() => {
306
- if (storeColumns.length > 0 || !Array.isArray(columns) || columns.length === 0) {
307
- return;
308
- }
309
-
310
- publishStoreValue(store, 'setColumns', columns, 'columns');
311
- }, [columns, store, storeColumns.length]);
312
-
313
- useEffect(() => {
314
- if (data === undefined || !Array.isArray(data)) {
315
- return;
316
- }
317
-
318
- publishStoreValue(store, 'setItems', data, 'items');
319
- }, [data, store]);
320
-
321
- useEffect(() => {
322
- if (!columnsForTable.length) {
323
- return;
324
- }
325
-
326
- const storedVisibleColumns = resolveStoredVisibleColumnsPreference(tablePreferenceScope);
327
- if (!storedVisibleColumns) {
328
- return;
329
- }
330
-
331
- const nextVisibleColumns = sanitizeVisibleColumnsPreference({
332
- columns: columnsForTable,
333
- visibleColumns: storedVisibleColumns,
334
- });
335
- const currentVisibleColumns = store?.getters?.visibleColumns || {};
336
-
337
- if (stableSerialize(currentVisibleColumns) === stableSerialize(nextVisibleColumns)) {
338
- return;
339
- }
340
-
341
- publishStoreValue(store, 'setVisibleColumns', nextVisibleColumns, 'visibleColumns');
342
- }, [columnsForTable, store, tablePreferenceScope]);
343
-
344
- useEffect(() => {
345
- if (!columnsForTable.length || Object.keys(storeFilters).length > 0) {
346
- return;
347
- }
348
-
349
- const storedFilters = resolveStoredTableFiltersPreference(tablePreferenceScope);
350
- if (!storedFilters) {
351
- return;
352
- }
353
-
354
- const nextFilters = sanitizeTableFiltersPreference({
355
- columns: columnsForTable,
356
- filters: storedFilters,
357
- });
358
-
359
- if (Object.keys(nextFilters).length === 0) {
360
- return;
361
- }
362
-
363
- publishStoreValue(store, 'setFilters', nextFilters, 'filters');
364
- }, [columnsForTable, store, storeFilters, tablePreferenceScope]);
365
-
366
- useEffect(() => {
367
- if (configsSignatureRef.current === defaultTableConfigsSignature) {
368
- return;
369
- }
370
-
371
- configsSignatureRef.current = defaultTableConfigsSignature;
372
- publishStoreValue(store, 'setConfigs', defaultTableConfigs, 'configs');
373
- }, [defaultTableConfigs, defaultTableConfigsSignature, store]);
374
-
375
- useEffect(() => {
376
- onDataLoaded?.(sortedData);
377
- }, [onDataLoaded, sortedData]);
378
-
379
- return (
380
- <View
381
- style={[
382
- styles.wrap,
383
- {
384
- borderColor: themeColors.panelBorder,
385
- backgroundColor: themeColors.panelBackground,
386
- },
387
- ]}
388
- >
389
- <DefaultTableToolbar storeName={storeName} />
390
- <DefaultTableBody storeName={storeName} />
391
- <DefaultTableFooter storeName={storeName} />
392
- </View>
393
- );
394
- };
395
-
396
- export default DefaultTable;
1
+ import React, { useEffect, useMemo, useRef } from 'react';
2
+ import { TouchableOpacity, View, useWindowDimensions } from 'react-native';
3
+ import { useIsFocused, useRoute } from '@react-navigation/native';
4
+ import { useStore } from '@store';
5
+ import { useMessage } from '@controleonline/ui-common/src/react/components/MessageService';
6
+ import Icon from 'react-native-vector-icons/Feather';
7
+ import { normalizeText } from '../inputs/defaultInputUtils';
8
+ import { DEFAULT_COMPACT_BREAKPOINT, isObject, stableSerialize } from './DefaultTable.utils';
9
+ import {
10
+ resolveDefaultTablePreferenceScope,
11
+ resolveStoredTableFiltersPreference,
12
+ resolveStoredTableViewModePreference,
13
+ resolveStoredVisibleColumnsPreference,
14
+ sanitizeTableFiltersPreference,
15
+ sanitizeVisibleColumnsPreference,
16
+ } from '../../utils/tableVisibleColumnsPreferences';
17
+ import DefaultTableBody from './DefaultTableBody';
18
+ import DefaultTableFooter from './DefaultTableFooter';
19
+ import DefaultTableToolbar from './DefaultTableToolbar';
20
+ import styles from './DefaultTable.styles';
21
+ import { useDefaultTablePagination } from './useDefaultTablePagination';
22
+ import {
23
+ useDefaultTableSortedData,
24
+ useDefaultTableSortState,
25
+ } from './useDefaultTableSorting';
26
+ import useDefaultTableTheme from './useDefaultTableTheme';
27
+
28
+ export {
29
+ mergeSortedDataWithLiveItems,
30
+ resolveColumnListLoadParams,
31
+ shouldTriggerEndReachedFromScroll,
32
+ } from './DefaultTable.utils';
33
+
34
+ const publishStoreValue = (store, actionName, value, getterName) => {
35
+ if (typeof store?.actions?.[actionName] === 'function') {
36
+ store.actions[actionName](value);
37
+ return;
38
+ }
39
+
40
+ if (store?.getters) {
41
+ store.getters[getterName] = value;
42
+ }
43
+ };
44
+
45
+ const assignGetterValue = (store, getterName, value) => {
46
+ if (store?.getters) {
47
+ store.getters[getterName] = value;
48
+ }
49
+ };
50
+
51
+ const DefaultTable = ({
52
+ accentColor = null,
53
+ actions = {},
54
+ add = null,
55
+ compactBreakpoint = DEFAULT_COMPACT_BREAKPOINT,
56
+ columns = [],
57
+ data = undefined,
58
+ filters = {},
59
+ footerComponent = null,
60
+ forceCardsOnCompact = true,
61
+ getOptionsForColumn = null,
62
+ hasMore = null,
63
+ initialViewMode = 'table',
64
+ isLoading = false,
65
+ onAdd = null,
66
+ onDataLoaded = null,
67
+ onEditRow = null,
68
+ onEndReached = null,
69
+ onFilterChange = null,
70
+ onMomentumScrollBegin = null,
71
+ onRowPress = null,
72
+ onSaved = null,
73
+ onScrollBeginDrag = null,
74
+ onSortChange = null,
75
+ pageSize = null,
76
+ pinRowActions = true,
77
+ renderCard = null,
78
+ requestParams = {},
79
+ rowActionsComponent = null,
80
+ rowStyle = null,
81
+ showColumnFiltersButton = true,
82
+ showRowActions = true,
83
+ showToolbar = true,
84
+ showTotalItemsInCompactToolbar = false,
85
+ showTotalItemsInFooter = true,
86
+ sort = null,
87
+ storeName = '',
88
+ summary = undefined,
89
+ summaryLabels = {},
90
+ toolbarActions = [],
91
+ visibleColumnsPreferenceKey = '',
92
+ }) => {
93
+ const { width } = useWindowDimensions();
94
+ const route = useRoute?.();
95
+ const store = useStore(storeName);
96
+ const isFocused = useIsFocused();
97
+ const configsSignatureRef = useRef('');
98
+ const { showError } = useMessage() || {};
99
+ const { tableBorderColors, themeColors } = useDefaultTableTheme(accentColor);
100
+ const tablePanelBorderColor = tableBorderColors.containerBorderColor;
101
+ const floatingAddBackgroundColor =
102
+ themeColors.buttonBackground || themeColors.primary || accentColor;
103
+ const floatingAddIconColor = themeColors.buttonText;
104
+ const tablePreferenceScope = useMemo(
105
+ () =>
106
+ resolveDefaultTablePreferenceScope({
107
+ preferenceKey: visibleColumnsPreferenceKey,
108
+ route,
109
+ storeName,
110
+ }),
111
+ [route?.key, route?.name, storeName, visibleColumnsPreferenceKey],
112
+ );
113
+ const storedViewMode = useMemo(
114
+ () => resolveStoredTableViewModePreference(tablePreferenceScope, null),
115
+ [initialViewMode, tablePreferenceScope],
116
+ );
117
+ const resolvedActions = useMemo(
118
+ () => ({
119
+ ...(store?.actions || {}),
120
+ ...(actions || {}),
121
+ }),
122
+ [actions, store?.actions],
123
+ );
124
+ const autoMode = data === undefined && normalizeText(storeName) !== '';
125
+ const storeColumns = Array.isArray(store?.getters?.columns) ? store.getters.columns : [];
126
+ const columnsForTable = storeColumns.length > 0 ? storeColumns : columns;
127
+ const storeFilters = isObject(store?.getters?.filters) ? store.getters.filters : {};
128
+ const requestParamsSeed = isObject(requestParams) ? requestParams : {};
129
+ const resolvedTotalItems = store?.getters?.totalItems;
130
+ const currentConfigs = store?.getters?.configs || {};
131
+ const isCompactView = width > 0 && width <= compactBreakpoint;
132
+ const addConfig = store?.getters?.add;
133
+ const shouldRenderFloatingAddButton =
134
+ showToolbar === false &&
135
+ (addConfig === true || add === true) &&
136
+ (typeof onAdd === 'function' || typeof store?.actions?.save === 'function');
137
+
138
+ if (storeColumns.length === 0 && Array.isArray(columns) && columns.length > 0) {
139
+ assignGetterValue(store, 'columns', columns);
140
+ }
141
+
142
+ if (data !== undefined && Array.isArray(data)) {
143
+ assignGetterValue(store, 'items', data);
144
+ }
145
+
146
+ const { requestSort, resolvedSort } = useDefaultTableSortState({
147
+ autoMode,
148
+ columnsForTable,
149
+ onSortChange,
150
+ sort,
151
+ tablePreferenceScope,
152
+ });
153
+ const {
154
+ buildRequestQuery,
155
+ currentPage,
156
+ handleEndReached,
157
+ resolvedData,
158
+ } = useDefaultTablePagination({
159
+ autoMode,
160
+ columnsForTable,
161
+ data,
162
+ filters: storeFilters,
163
+ hasMore,
164
+ isFocused,
165
+ isLoading,
166
+ onEndReached,
167
+ pageSize,
168
+ requestParams: requestParamsSeed,
169
+ resolvedActions,
170
+ resolvedSort,
171
+ resolvedTotalItems,
172
+ showError,
173
+ store,
174
+ storeName,
175
+ });
176
+ const sortedData = useDefaultTableSortedData({
177
+ resolvedData,
178
+ resolvedSort,
179
+ storeName,
180
+ tableColumns: columnsForTable,
181
+ });
182
+ const debugFallbackParameters = useMemo(() => {
183
+ if (autoMode) {
184
+ return buildRequestQuery(currentPage || 1, false);
185
+ }
186
+
187
+ return {
188
+ filters: storeFilters,
189
+ requestParams: requestParamsSeed,
190
+ sort: resolvedSort || null,
191
+ };
192
+ }, [autoMode, buildRequestQuery, currentPage, requestParamsSeed, resolvedSort, storeFilters]);
193
+ const effectiveViewMode =
194
+ currentConfigs.viewMode ||
195
+ storedViewMode ||
196
+ (isCompactView && forceCardsOnCompact !== false ? 'cards' : initialViewMode);
197
+ const tableFiltersVisible = Boolean(currentConfigs.tableFiltersVisible);
198
+ const defaultTableConfigs = useMemo(
199
+ () => ({
200
+ add,
201
+ compactBreakpoint,
202
+ debugFallbackParameters,
203
+ effectiveViewMode,
204
+ filters,
205
+ footerComponent,
206
+ forceCardsOnCompact,
207
+ getOptionsForColumn,
208
+ initialViewMode,
209
+ onAdd,
210
+ onDataLoaded,
211
+ onEditRow,
212
+ onEndReached: handleEndReached,
213
+ onFilterChange,
214
+ onMomentumScrollBegin,
215
+ onRowPress,
216
+ onSaved,
217
+ onScrollBeginDrag,
218
+ pinRowActions,
219
+ renderCard,
220
+ requestParams: requestParamsSeed,
221
+ requestSort,
222
+ resolvedSort,
223
+ rowActionsComponent,
224
+ rowStyle,
225
+ showColumnFiltersButton,
226
+ showRowActions,
227
+ showToolbar,
228
+ showTotalItemsInCompactToolbar,
229
+ showTotalItemsInFooter,
230
+ sortedData,
231
+ summary,
232
+ summaryLabels,
233
+ tableFiltersVisible,
234
+ tablePreferenceScope,
235
+ toolbarActions,
236
+ viewMode: effectiveViewMode,
237
+ }),
238
+ [
239
+ add,
240
+ compactBreakpoint,
241
+ debugFallbackParameters,
242
+ effectiveViewMode,
243
+ filters,
244
+ footerComponent,
245
+ forceCardsOnCompact,
246
+ getOptionsForColumn,
247
+ handleEndReached,
248
+ initialViewMode,
249
+ onAdd,
250
+ onDataLoaded,
251
+ onEditRow,
252
+ onFilterChange,
253
+ onMomentumScrollBegin,
254
+ onRowPress,
255
+ onSaved,
256
+ onScrollBeginDrag,
257
+ pinRowActions,
258
+ renderCard,
259
+ requestParamsSeed,
260
+ requestSort,
261
+ resolvedSort,
262
+ rowActionsComponent,
263
+ rowStyle,
264
+ showColumnFiltersButton,
265
+ showRowActions,
266
+ showToolbar,
267
+ showTotalItemsInCompactToolbar,
268
+ showTotalItemsInFooter,
269
+ sortedData,
270
+ summary,
271
+ summaryLabels,
272
+ tableFiltersVisible,
273
+ tablePreferenceScope,
274
+ toolbarActions,
275
+ ],
276
+ );
277
+ const defaultTableConfigsSignature = useMemo(
278
+ () =>
279
+ stableSerialize({
280
+ add,
281
+ compactBreakpoint,
282
+ debugFallbackParameters,
283
+ effectiveViewMode,
284
+ filters,
285
+ forceCardsOnCompact,
286
+ initialViewMode,
287
+ pinRowActions,
288
+ resolvedSort,
289
+ showColumnFiltersButton,
290
+ showRowActions,
291
+ showToolbar,
292
+ showTotalItemsInCompactToolbar,
293
+ showTotalItemsInFooter,
294
+ storedViewMode,
295
+ tableFiltersVisible,
296
+ sortedDataLength: sortedData.length,
297
+ toolbarActionsLength: Array.isArray(toolbarActions) ? toolbarActions.length : 0,
298
+ }),
299
+ [
300
+ add,
301
+ compactBreakpoint,
302
+ debugFallbackParameters,
303
+ effectiveViewMode,
304
+ filters,
305
+ forceCardsOnCompact,
306
+ initialViewMode,
307
+ pinRowActions,
308
+ resolvedSort,
309
+ showColumnFiltersButton,
310
+ showRowActions,
311
+ showToolbar,
312
+ showTotalItemsInCompactToolbar,
313
+ showTotalItemsInFooter,
314
+ storedViewMode,
315
+ tableFiltersVisible,
316
+ sortedData.length,
317
+ toolbarActions,
318
+ ],
319
+ );
320
+
321
+ if (store?.getters) {
322
+ assignGetterValue(store, 'configs', defaultTableConfigs);
323
+ }
324
+
325
+ useEffect(() => {
326
+ if (storeColumns.length > 0 || !Array.isArray(columns) || columns.length === 0) {
327
+ return;
328
+ }
329
+
330
+ publishStoreValue(store, 'setColumns', columns, 'columns');
331
+ }, [columns, store, storeColumns.length]);
332
+
333
+ useEffect(() => {
334
+ if (data === undefined || !Array.isArray(data)) {
335
+ return;
336
+ }
337
+
338
+ publishStoreValue(store, 'setItems', data, 'items');
339
+ }, [data, store]);
340
+
341
+ useEffect(() => {
342
+ if (!columnsForTable.length) {
343
+ return;
344
+ }
345
+
346
+ const storedVisibleColumns = resolveStoredVisibleColumnsPreference(tablePreferenceScope);
347
+ if (!storedVisibleColumns) {
348
+ return;
349
+ }
350
+
351
+ const nextVisibleColumns = sanitizeVisibleColumnsPreference({
352
+ columns: columnsForTable,
353
+ visibleColumns: storedVisibleColumns,
354
+ });
355
+ const currentVisibleColumns = store?.getters?.visibleColumns || {};
356
+
357
+ if (stableSerialize(currentVisibleColumns) === stableSerialize(nextVisibleColumns)) {
358
+ return;
359
+ }
360
+
361
+ publishStoreValue(store, 'setVisibleColumns', nextVisibleColumns, 'visibleColumns');
362
+ }, [columnsForTable, store, tablePreferenceScope]);
363
+
364
+ useEffect(() => {
365
+ if (!columnsForTable.length || Object.keys(storeFilters).length > 0) {
366
+ return;
367
+ }
368
+
369
+ const storedFilters = resolveStoredTableFiltersPreference(tablePreferenceScope);
370
+ if (!storedFilters) {
371
+ return;
372
+ }
373
+
374
+ const nextFilters = sanitizeTableFiltersPreference({
375
+ columns: columnsForTable,
376
+ filters: storedFilters,
377
+ });
378
+
379
+ if (Object.keys(nextFilters).length === 0) {
380
+ return;
381
+ }
382
+
383
+ publishStoreValue(store, 'setFilters', nextFilters, 'filters');
384
+ }, [columnsForTable, store, storeFilters, tablePreferenceScope]);
385
+
386
+ useEffect(() => {
387
+ if (configsSignatureRef.current === defaultTableConfigsSignature) {
388
+ return;
389
+ }
390
+
391
+ configsSignatureRef.current = defaultTableConfigsSignature;
392
+ publishStoreValue(store, 'setConfigs', defaultTableConfigs, 'configs');
393
+ }, [defaultTableConfigs, defaultTableConfigsSignature, store]);
394
+
395
+ useEffect(() => {
396
+ onDataLoaded?.(sortedData);
397
+ }, [onDataLoaded, sortedData]);
398
+
399
+ return (
400
+ <View
401
+ style={[
402
+ styles.wrap,
403
+ {
404
+ borderWidth: tablePanelBorderColor ? 1 : 0,
405
+ borderColor: tablePanelBorderColor,
406
+ backgroundColor: themeColors.panelBackground,
407
+ },
408
+ ]}
409
+ >
410
+ {showToolbar !== false ? <DefaultTableToolbar storeName={storeName} /> : null}
411
+ <DefaultTableBody storeName={storeName} />
412
+ <DefaultTableFooter storeName={storeName} />
413
+ {shouldRenderFloatingAddButton ? (
414
+ <TouchableOpacity
415
+ accessibilityRole="button"
416
+ accessibilityLabel={global.t?.t(storeName, 'button', 'add') || 'Adicionar'}
417
+ activeOpacity={0.84}
418
+ style={[
419
+ styles.floatingAddButton,
420
+ { backgroundColor: floatingAddBackgroundColor },
421
+ ]}
422
+ onPress={() => onAdd?.()}
423
+ >
424
+ <Icon name="plus" size={24} color={floatingAddIconColor} />
425
+ </TouchableOpacity>
426
+ ) : null}
427
+ </View>
428
+ );
429
+ };
430
+
431
+ export default DefaultTable;