@applica-software-guru/react-admin 1.5.357 → 1.5.358
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/dist/components/ra-lists/ListTabsToolbar.d.ts +1 -1
- package/dist/components/ra-lists/ListTabsToolbar.d.ts.map +1 -1
- package/dist/react-admin.cjs.js +27 -27
- package/dist/react-admin.cjs.js.gz +0 -0
- package/dist/react-admin.cjs.js.map +1 -1
- package/dist/react-admin.es.js +740 -746
- package/dist/react-admin.es.js.gz +0 -0
- package/dist/react-admin.es.js.map +1 -1
- package/dist/react-admin.umd.js +28 -28
- package/dist/react-admin.umd.js.gz +0 -0
- package/dist/react-admin.umd.js.map +1 -1
- package/package.json +1 -1
- package/src/components/ra-lists/ListTabsToolbar.tsx +43 -46
package/package.json
CHANGED
|
@@ -5,6 +5,7 @@ import { ReactElement, useCallback, useEffect, useMemo, useRef } from 'react';
|
|
|
5
5
|
import { useListViewContext } from './ListViewProvider';
|
|
6
6
|
import { useSessionStorage } from '@/hooks';
|
|
7
7
|
import { useSearchParams } from 'react-router-dom';
|
|
8
|
+
import _ from 'lodash';
|
|
8
9
|
|
|
9
10
|
type ListTabToolbarConfig = {
|
|
10
11
|
label: string;
|
|
@@ -18,40 +19,38 @@ interface ListTabsToolbarProps {
|
|
|
18
19
|
tabs?: ListTabToolbarConfig[];
|
|
19
20
|
}
|
|
20
21
|
|
|
21
|
-
function ListTabsToolbar(
|
|
22
|
-
const { tabs = [] } = props;
|
|
22
|
+
function ListTabsToolbar({ tabs = [] }: ListTabsToolbarProps) {
|
|
23
23
|
const { setFilters, filterValues, displayedFilters } = useListContext();
|
|
24
|
-
const defaultTabIndex = useMemo(() => tabs.findIndex((tab) => tab.default) ?? 0, [tabs]);
|
|
25
24
|
const { setCurrentTabKey } = useListViewContext();
|
|
26
25
|
const resource = useResourceContext();
|
|
27
26
|
const theme = useTheme();
|
|
28
|
-
|
|
29
27
|
const [searchParams, setSearchParams] = useSearchParams();
|
|
30
28
|
|
|
31
29
|
if (tabs.length > 0 && tabs.some((tab) => !tab.key)) {
|
|
32
30
|
throw new Error('ListTabsToolbar: Each tab must have a unique key.');
|
|
33
31
|
}
|
|
34
32
|
|
|
35
|
-
const
|
|
36
|
-
const
|
|
33
|
+
const defaultTabIndex = useMemo(() => tabs.findIndex((tab) => tab.default) ?? 0, [tabs]);
|
|
34
|
+
const resourceKey = useMemo(() => resource.replace(/^entities\//, ''), [resource]);
|
|
35
|
+
const tabGroupKey = useMemo(() => `${resourceKey}-tab-group`, [resourceKey]);
|
|
36
|
+
const tabFiltersKey = useMemo(() => `${resourceKey}-tab-filters`, [resourceKey]);
|
|
37
37
|
|
|
38
38
|
const [currentTab, setCurrentTab] = useSessionStorage(tabGroupKey, defaultTabIndex);
|
|
39
39
|
const [tabFilterStates, setTabFilterStates] = useSessionStorage(tabFiltersKey, {});
|
|
40
40
|
const initialized = useRef(false);
|
|
41
41
|
|
|
42
|
-
const saveCurrentTabFilters =
|
|
43
|
-
(
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
})
|
|
53
|
-
|
|
54
|
-
[filterValues, displayedFilters, setTabFilterStates]
|
|
42
|
+
const saveCurrentTabFilters = useMemo(
|
|
43
|
+
() =>
|
|
44
|
+
_.debounce((tabKey: string, filters: any, displayed: any) => {
|
|
45
|
+
setTabFilterStates((prev: any) => ({
|
|
46
|
+
...prev,
|
|
47
|
+
[tabKey]: {
|
|
48
|
+
filterValues: { ...filters },
|
|
49
|
+
displayedFilters: { ...displayed }
|
|
50
|
+
}
|
|
51
|
+
}));
|
|
52
|
+
}, 500),
|
|
53
|
+
[setTabFilterStates]
|
|
55
54
|
);
|
|
56
55
|
|
|
57
56
|
const restoreTabFilters = useCallback(
|
|
@@ -61,31 +60,20 @@ function ListTabsToolbar(props: ListTabsToolbarProps) {
|
|
|
61
60
|
if (savedState) {
|
|
62
61
|
setFilters(savedState.filterValues, savedState.displayedFilters || {}, debounce);
|
|
63
62
|
} else {
|
|
64
|
-
|
|
65
|
-
...tabFilter
|
|
66
|
-
};
|
|
67
|
-
setFilters(defaultFilters, {}, debounce);
|
|
63
|
+
setFilters(tabFilter, {}, debounce);
|
|
68
64
|
}
|
|
69
65
|
},
|
|
70
66
|
[tabFilterStates, setFilters]
|
|
71
67
|
);
|
|
72
68
|
|
|
73
69
|
const buildFilters = useCallback(
|
|
74
|
-
(index: number, debounce: boolean
|
|
75
|
-
const currentTabKey = tabs[Number(currentTab)]?.key;
|
|
70
|
+
(index: number, debounce: boolean) => {
|
|
76
71
|
const newTabKey = tabs[index].key;
|
|
77
72
|
|
|
78
|
-
|
|
79
|
-
saveCurrentTabFilters(currentTabKey);
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
if (setCurrentTabKey) {
|
|
83
|
-
setCurrentTabKey(newTabKey);
|
|
84
|
-
}
|
|
85
|
-
|
|
73
|
+
setCurrentTabKey?.(newTabKey);
|
|
86
74
|
restoreTabFilters(newTabKey, tabs[index].filter, debounce);
|
|
87
75
|
},
|
|
88
|
-
[tabs,
|
|
76
|
+
[tabs, setCurrentTabKey, restoreTabFilters]
|
|
89
77
|
);
|
|
90
78
|
|
|
91
79
|
const updateUrlParam = useCallback(
|
|
@@ -97,9 +85,26 @@ function ListTabsToolbar(props: ListTabsToolbarProps) {
|
|
|
97
85
|
[searchParams, setSearchParams, tabGroupKey]
|
|
98
86
|
);
|
|
99
87
|
|
|
88
|
+
const handleChange = useCallback(
|
|
89
|
+
(_: any, newIndex: number) => {
|
|
90
|
+
setCurrentTab(newIndex);
|
|
91
|
+
buildFilters(newIndex, true);
|
|
92
|
+
},
|
|
93
|
+
[buildFilters, setCurrentTab]
|
|
94
|
+
);
|
|
95
|
+
|
|
96
|
+
useEffect(() => {
|
|
97
|
+
if (initialized.current && tabs.length > 0) {
|
|
98
|
+
const currentTabKey = tabs[Number(currentTab)]?.key;
|
|
99
|
+
if (currentTabKey) {
|
|
100
|
+
saveCurrentTabFilters(currentTabKey, filterValues, displayedFilters);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}, [filterValues, displayedFilters, currentTab, tabs, saveCurrentTabFilters]);
|
|
104
|
+
|
|
100
105
|
useEffect(() => {
|
|
101
106
|
const param = searchParams.get(tabGroupKey);
|
|
102
|
-
if (
|
|
107
|
+
if (param !== String(currentTab)) {
|
|
103
108
|
updateUrlParam(Number(currentTab));
|
|
104
109
|
}
|
|
105
110
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
@@ -110,23 +115,15 @@ function ListTabsToolbar(props: ListTabsToolbarProps) {
|
|
|
110
115
|
const param = searchParams.get(tabGroupKey);
|
|
111
116
|
const initialIndex = param != null ? Number(param) : Number(currentTab);
|
|
112
117
|
|
|
113
|
-
if (param != null &&
|
|
118
|
+
if (param != null && initialIndex !== Number(currentTab)) {
|
|
114
119
|
setCurrentTab(initialIndex);
|
|
115
120
|
}
|
|
116
121
|
|
|
117
|
-
buildFilters(initialIndex, false
|
|
122
|
+
buildFilters(initialIndex, false);
|
|
118
123
|
initialized.current = true;
|
|
119
124
|
}
|
|
120
125
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
121
|
-
}, [
|
|
122
|
-
|
|
123
|
-
const handleChange = useCallback(
|
|
124
|
-
(_: any, newIndex: number) => {
|
|
125
|
-
setCurrentTab(newIndex);
|
|
126
|
-
buildFilters(newIndex, true, true);
|
|
127
|
-
},
|
|
128
|
-
[buildFilters, setCurrentTab]
|
|
129
|
-
);
|
|
126
|
+
}, []);
|
|
130
127
|
|
|
131
128
|
return (
|
|
132
129
|
<Box sx={{ width: '100%' }}>
|