@controleonline/ui-default 1.0.265 → 1.0.266

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,429 @@
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 { themeColors } = useDefaultTableTheme(accentColor);
100
+ const floatingAddBackgroundColor =
101
+ themeColors.buttonBackground || themeColors.primary || accentColor || '#2563EB';
102
+ const floatingAddIconColor = themeColors.buttonText || '#FFFFFF';
103
+ const tablePreferenceScope = useMemo(
104
+ () =>
105
+ resolveDefaultTablePreferenceScope({
106
+ preferenceKey: visibleColumnsPreferenceKey,
107
+ route,
108
+ storeName,
109
+ }),
110
+ [route?.key, route?.name, storeName, visibleColumnsPreferenceKey],
111
+ );
112
+ const storedViewMode = useMemo(
113
+ () => resolveStoredTableViewModePreference(tablePreferenceScope, null),
114
+ [initialViewMode, tablePreferenceScope],
115
+ );
116
+ const resolvedActions = useMemo(
117
+ () => ({
118
+ ...(store?.actions || {}),
119
+ ...(actions || {}),
120
+ }),
121
+ [actions, store?.actions],
122
+ );
123
+ const autoMode = data === undefined && normalizeText(storeName) !== '';
124
+ const storeColumns = Array.isArray(store?.getters?.columns) ? store.getters.columns : [];
125
+ const columnsForTable = storeColumns.length > 0 ? storeColumns : columns;
126
+ const storeFilters = isObject(store?.getters?.filters) ? store.getters.filters : {};
127
+ const requestParamsSeed = isObject(requestParams) ? requestParams : {};
128
+ const resolvedTotalItems = store?.getters?.totalItems;
129
+ const currentConfigs = store?.getters?.configs || {};
130
+ const isCompactView = width > 0 && width <= compactBreakpoint;
131
+ const addConfig = store?.getters?.add;
132
+ const shouldRenderFloatingAddButton =
133
+ showToolbar === false &&
134
+ (addConfig === true || add === true) &&
135
+ (typeof onAdd === 'function' || typeof store?.actions?.save === 'function');
136
+
137
+ if (storeColumns.length === 0 && Array.isArray(columns) && columns.length > 0) {
138
+ assignGetterValue(store, 'columns', columns);
139
+ }
140
+
141
+ if (data !== undefined && Array.isArray(data)) {
142
+ assignGetterValue(store, 'items', data);
143
+ }
144
+
145
+ const { requestSort, resolvedSort } = useDefaultTableSortState({
146
+ autoMode,
147
+ columnsForTable,
148
+ onSortChange,
149
+ sort,
150
+ tablePreferenceScope,
151
+ });
152
+ const {
153
+ buildRequestQuery,
154
+ currentPage,
155
+ handleEndReached,
156
+ resolvedData,
157
+ } = useDefaultTablePagination({
158
+ autoMode,
159
+ columnsForTable,
160
+ data,
161
+ filters: storeFilters,
162
+ hasMore,
163
+ isFocused,
164
+ isLoading,
165
+ onEndReached,
166
+ pageSize,
167
+ requestParams: requestParamsSeed,
168
+ resolvedActions,
169
+ resolvedSort,
170
+ resolvedTotalItems,
171
+ showError,
172
+ store,
173
+ storeName,
174
+ });
175
+ const sortedData = useDefaultTableSortedData({
176
+ resolvedData,
177
+ resolvedSort,
178
+ storeName,
179
+ tableColumns: columnsForTable,
180
+ });
181
+ const debugFallbackParameters = useMemo(() => {
182
+ if (autoMode) {
183
+ return buildRequestQuery(currentPage || 1, false);
184
+ }
185
+
186
+ return {
187
+ filters: storeFilters,
188
+ requestParams: requestParamsSeed,
189
+ sort: resolvedSort || null,
190
+ };
191
+ }, [autoMode, buildRequestQuery, currentPage, requestParamsSeed, resolvedSort, storeFilters]);
192
+ const effectiveViewMode =
193
+ currentConfigs.viewMode ||
194
+ storedViewMode ||
195
+ (isCompactView && forceCardsOnCompact !== false ? 'cards' : initialViewMode);
196
+ const tableFiltersVisible = Boolean(currentConfigs.tableFiltersVisible);
197
+ const defaultTableConfigs = useMemo(
198
+ () => ({
199
+ add,
200
+ compactBreakpoint,
201
+ debugFallbackParameters,
202
+ effectiveViewMode,
203
+ filters,
204
+ footerComponent,
205
+ forceCardsOnCompact,
206
+ getOptionsForColumn,
207
+ initialViewMode,
208
+ onAdd,
209
+ onDataLoaded,
210
+ onEditRow,
211
+ onEndReached: handleEndReached,
212
+ onFilterChange,
213
+ onMomentumScrollBegin,
214
+ onRowPress,
215
+ onSaved,
216
+ onScrollBeginDrag,
217
+ pinRowActions,
218
+ renderCard,
219
+ requestParams: requestParamsSeed,
220
+ requestSort,
221
+ resolvedSort,
222
+ rowActionsComponent,
223
+ rowStyle,
224
+ showColumnFiltersButton,
225
+ showRowActions,
226
+ showToolbar,
227
+ showTotalItemsInCompactToolbar,
228
+ showTotalItemsInFooter,
229
+ sortedData,
230
+ summary,
231
+ summaryLabels,
232
+ tableFiltersVisible,
233
+ tablePreferenceScope,
234
+ toolbarActions,
235
+ viewMode: effectiveViewMode,
236
+ }),
237
+ [
238
+ add,
239
+ compactBreakpoint,
240
+ debugFallbackParameters,
241
+ effectiveViewMode,
242
+ filters,
243
+ footerComponent,
244
+ forceCardsOnCompact,
245
+ getOptionsForColumn,
246
+ handleEndReached,
247
+ initialViewMode,
248
+ onAdd,
249
+ onDataLoaded,
250
+ onEditRow,
251
+ onFilterChange,
252
+ onMomentumScrollBegin,
253
+ onRowPress,
254
+ onSaved,
255
+ onScrollBeginDrag,
256
+ pinRowActions,
257
+ renderCard,
258
+ requestParamsSeed,
259
+ requestSort,
260
+ resolvedSort,
261
+ rowActionsComponent,
262
+ rowStyle,
263
+ showColumnFiltersButton,
264
+ showRowActions,
265
+ showToolbar,
266
+ showTotalItemsInCompactToolbar,
267
+ showTotalItemsInFooter,
268
+ sortedData,
269
+ summary,
270
+ summaryLabels,
271
+ tableFiltersVisible,
272
+ tablePreferenceScope,
273
+ toolbarActions,
274
+ ],
275
+ );
276
+ const defaultTableConfigsSignature = useMemo(
277
+ () =>
278
+ stableSerialize({
279
+ add,
280
+ compactBreakpoint,
281
+ debugFallbackParameters,
282
+ effectiveViewMode,
283
+ filters,
284
+ forceCardsOnCompact,
285
+ initialViewMode,
286
+ pinRowActions,
287
+ resolvedSort,
288
+ showColumnFiltersButton,
289
+ showRowActions,
290
+ showToolbar,
291
+ showTotalItemsInCompactToolbar,
292
+ showTotalItemsInFooter,
293
+ storedViewMode,
294
+ tableFiltersVisible,
295
+ sortedDataLength: sortedData.length,
296
+ toolbarActionsLength: Array.isArray(toolbarActions) ? toolbarActions.length : 0,
297
+ }),
298
+ [
299
+ add,
300
+ compactBreakpoint,
301
+ debugFallbackParameters,
302
+ effectiveViewMode,
303
+ filters,
304
+ forceCardsOnCompact,
305
+ initialViewMode,
306
+ pinRowActions,
307
+ resolvedSort,
308
+ showColumnFiltersButton,
309
+ showRowActions,
310
+ showToolbar,
311
+ showTotalItemsInCompactToolbar,
312
+ showTotalItemsInFooter,
313
+ storedViewMode,
314
+ tableFiltersVisible,
315
+ sortedData.length,
316
+ toolbarActions,
317
+ ],
318
+ );
319
+
320
+ if (store?.getters) {
321
+ assignGetterValue(store, 'configs', defaultTableConfigs);
322
+ }
323
+
324
+ useEffect(() => {
325
+ if (storeColumns.length > 0 || !Array.isArray(columns) || columns.length === 0) {
326
+ return;
327
+ }
328
+
329
+ publishStoreValue(store, 'setColumns', columns, 'columns');
330
+ }, [columns, store, storeColumns.length]);
331
+
332
+ useEffect(() => {
333
+ if (data === undefined || !Array.isArray(data)) {
334
+ return;
335
+ }
336
+
337
+ publishStoreValue(store, 'setItems', data, 'items');
338
+ }, [data, store]);
339
+
340
+ useEffect(() => {
341
+ if (!columnsForTable.length) {
342
+ return;
343
+ }
344
+
345
+ const storedVisibleColumns = resolveStoredVisibleColumnsPreference(tablePreferenceScope);
346
+ if (!storedVisibleColumns) {
347
+ return;
348
+ }
349
+
350
+ const nextVisibleColumns = sanitizeVisibleColumnsPreference({
351
+ columns: columnsForTable,
352
+ visibleColumns: storedVisibleColumns,
353
+ });
354
+ const currentVisibleColumns = store?.getters?.visibleColumns || {};
355
+
356
+ if (stableSerialize(currentVisibleColumns) === stableSerialize(nextVisibleColumns)) {
357
+ return;
358
+ }
359
+
360
+ publishStoreValue(store, 'setVisibleColumns', nextVisibleColumns, 'visibleColumns');
361
+ }, [columnsForTable, store, tablePreferenceScope]);
362
+
363
+ useEffect(() => {
364
+ if (!columnsForTable.length || Object.keys(storeFilters).length > 0) {
365
+ return;
366
+ }
367
+
368
+ const storedFilters = resolveStoredTableFiltersPreference(tablePreferenceScope);
369
+ if (!storedFilters) {
370
+ return;
371
+ }
372
+
373
+ const nextFilters = sanitizeTableFiltersPreference({
374
+ columns: columnsForTable,
375
+ filters: storedFilters,
376
+ });
377
+
378
+ if (Object.keys(nextFilters).length === 0) {
379
+ return;
380
+ }
381
+
382
+ publishStoreValue(store, 'setFilters', nextFilters, 'filters');
383
+ }, [columnsForTable, store, storeFilters, tablePreferenceScope]);
384
+
385
+ useEffect(() => {
386
+ if (configsSignatureRef.current === defaultTableConfigsSignature) {
387
+ return;
388
+ }
389
+
390
+ configsSignatureRef.current = defaultTableConfigsSignature;
391
+ publishStoreValue(store, 'setConfigs', defaultTableConfigs, 'configs');
392
+ }, [defaultTableConfigs, defaultTableConfigsSignature, store]);
393
+
394
+ useEffect(() => {
395
+ onDataLoaded?.(sortedData);
396
+ }, [onDataLoaded, sortedData]);
397
+
398
+ return (
399
+ <View
400
+ style={[
401
+ styles.wrap,
402
+ {
403
+ borderColor: themeColors.panelBorder,
404
+ backgroundColor: themeColors.panelBackground,
405
+ },
406
+ ]}
407
+ >
408
+ {showToolbar !== false ? <DefaultTableToolbar storeName={storeName} /> : null}
409
+ <DefaultTableBody storeName={storeName} />
410
+ <DefaultTableFooter storeName={storeName} />
411
+ {shouldRenderFloatingAddButton ? (
412
+ <TouchableOpacity
413
+ accessibilityRole="button"
414
+ accessibilityLabel={global.t?.t(storeName, 'button', 'add') || 'Adicionar'}
415
+ activeOpacity={0.84}
416
+ style={[
417
+ styles.floatingAddButton,
418
+ { backgroundColor: floatingAddBackgroundColor },
419
+ ]}
420
+ onPress={() => onAdd?.()}
421
+ >
422
+ <Icon name="plus" size={24} color={floatingAddIconColor} />
423
+ </TouchableOpacity>
424
+ ) : null}
425
+ </View>
426
+ );
427
+ };
428
+
429
+ export default DefaultTable;