Skip to content

Commit 8c662e3

Browse files
authored
Merge pull request #139 from brunomous/feature/cache-module-integration
Integrate Filter settings with Cache Module endpoints
2 parents 6e97634 + dabc147 commit 8c662e3

File tree

6 files changed

+281
-82
lines changed

6 files changed

+281
-82
lines changed

Diff for: packages/react-material-ui/src/components/ComposedTable/index.tsx

+20-21
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useState, useEffect } from 'react';
1+
import React, { useState } from 'react';
22

33
import type { TableRootProps } from '../Table/TableRoot';
44
import type { FilterProps } from '../Filter/Filter';
@@ -36,27 +36,22 @@ const ComposedTable = (props: ComposedTableProps) => {
3636
const auth = useAuth();
3737
const pathname = usePathname();
3838

39-
const [settings, setSettings] = useSettingsStorage({
40-
key: 'tableSettings',
41-
user: (auth?.user as { id: string })?.id ?? '',
42-
settingsId: props.settingsId || pathname,
43-
list: props.headers.map((header) => ({
39+
const [orderableHeaders, setOrderableHeaders] = useState(props.headers);
40+
41+
const { setSettings } = useSettingsStorage({
42+
key: props.settingsId || pathname,
43+
type: 'table',
44+
assignee: {
45+
id: (auth?.user as { id: string })?.id ?? '',
46+
},
47+
data: props.headers.map((header) => ({
4448
id: header.id,
4549
hide: Boolean(header.hide),
4650
})),
47-
});
48-
49-
const [orderableHeaders, setOrderableHeaders] = useState(props.headers);
50-
51-
const handleHeadersOrderChange = (list: ListItem[]) => {
52-
setOrderableHeaders(list);
53-
setSettings(list);
54-
};
55-
56-
useEffect(() => {
57-
if (settings.length) {
51+
cacheApiUri: props.settingsCacheUri,
52+
setListCallback: (callbackData) =>
5853
setOrderableHeaders(
59-
settings.map((item: ListItem) => {
54+
callbackData.map((item: ListItem) => {
6055
const headerItem = props.headers.find(
6156
(header) => header.id === item.id,
6257
);
@@ -66,9 +61,13 @@ const ComposedTable = (props: ComposedTableProps) => {
6661
...headerItem,
6762
};
6863
}),
69-
);
70-
}
71-
}, []);
64+
),
65+
});
66+
67+
const handleHeadersOrderChange = (list: ListItem[]) => {
68+
setOrderableHeaders(list);
69+
setSettings(list);
70+
};
7271

7372
return (
7473
<Box>

Diff for: packages/react-material-ui/src/components/Filter/Filter.tsx

+23-21
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
'use client';
22

3-
import React, { ReactNode, useState, useEffect } from 'react';
3+
import React, { ReactNode, useState } from 'react';
44
import { Box, Grid, GridProps } from '@mui/material';
55
import { FilterAlt } from '@mui/icons-material';
66
import { useAuth } from '@concepta/react-auth-provider';
@@ -201,28 +201,19 @@ export type FilterProps = {
201201
complementaryActions?: ReactNode | ((filters: ListItem[]) => ReactNode);
202202
/** Settings identifier */
203203
settingsId?: string;
204+
settingsCacheUri?: string;
204205
} & GridProps;
205206

206207
export const Filter = (props: FilterProps) => {
207208
const { filters, minimumFilters = 0, hasAllOption, ...rest } = props;
209+
208210
const auth = useAuth();
209211
const pathname = usePathname();
210212

211-
const [settings, setSettings] = useSettingsStorage({
212-
key: 'filterSettings',
213-
user: (auth?.user as { id: string })?.id ?? '',
214-
settingsId: props.settingsId || pathname,
215-
list: filters.map((header) => ({
216-
id: header.id,
217-
hide: Boolean(header.hide),
218-
})),
219-
});
220-
221213
const resetFilters = (item) => () => {
222214
if (item && item?.onDebouncedSearchChange) {
223215
item.onDebouncedSearchChange(null);
224216
}
225-
226217
if (item && item?.onChange) {
227218
item.onChange(null);
228219
}
@@ -237,13 +228,18 @@ export const Filter = (props: FilterProps) => {
237228
})),
238229
);
239230

240-
const handleFilterOrderChange = (list: ListItem[]) => {
241-
setFilterOrder(list);
242-
setSettings(list);
243-
};
244-
245-
useEffect(() => {
246-
if (settings.length) {
231+
const { setSettings } = useSettingsStorage({
232+
key: props.settingsId || pathname,
233+
type: 'filter',
234+
assignee: {
235+
id: (auth?.user as { id: string })?.id ?? '',
236+
},
237+
data: filters.map((header) => ({
238+
id: header.id,
239+
hide: Boolean(header.hide),
240+
})),
241+
cacheApiUri: props.settingsCacheUri,
242+
setListCallback: (settings) => {
247243
const originalFilters = [...filters];
248244
const newFiltersOrder = [];
249245

@@ -252,6 +248,7 @@ export const Filter = (props: FilterProps) => {
252248
(filter) => filter?.id === item.id,
253249
);
254250
const filterItem = originalFilters[filterItemIndex];
251+
255252
if (filterItem) {
256253
newFiltersOrder.push({
257254
...item,
@@ -274,8 +271,13 @@ export const Filter = (props: FilterProps) => {
274271
});
275272

276273
setFilterOrder(newFiltersOrder);
277-
}
278-
}, []);
274+
},
275+
});
276+
277+
const handleFilterOrderChange = (list: ListItem[]) => {
278+
setFilterOrder(list);
279+
setSettings(list);
280+
};
279281

280282
return (
281283
<Box

Diff for: packages/react-material-ui/src/components/submodules/Filter/index.tsx

+7-2
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,12 @@ export type FilterDetails = {
3939

4040
export type FilterCallback = (filter: FilterValues) => void;
4141

42-
const FilterSubmodule = () => {
42+
type Props = {
43+
settingsId?: string;
44+
settingsCacheUri?: string;
45+
};
46+
47+
const FilterSubmodule = (props: Props) => {
4348
const {
4449
filters,
4550
updateSearch,
@@ -186,7 +191,7 @@ const FilterSubmodule = () => {
186191

187192
if (filters.length === 0) return null;
188193

189-
return <Filter filters={filterObjs} />;
194+
return <Filter {...props} filters={filterObjs} />;
190195
};
191196

192197
export default FilterSubmodule;

Diff for: packages/react-material-ui/src/components/submodules/Table/index.tsx

+8-1
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,8 @@ export interface TableSubmoduleProps {
109109
paginationStyle?: PaginationStyle;
110110
allowModalPreview?: boolean;
111111
mobileModalTitleSrc?: string;
112+
filterSettingsId?: string;
113+
filterSettingsCacheUri?: string;
112114
}
113115

114116
const TableSubmodule = (props: TableSubmoduleProps) => {
@@ -259,7 +261,12 @@ const TableSubmodule = (props: TableSubmoduleProps) => {
259261
my: 4,
260262
}}
261263
>
262-
{filters && <FilterSubmodule />}
264+
{filters && (
265+
<FilterSubmodule
266+
settingsId={props.filterSettingsId}
267+
settingsCacheUri={props.filterSettingsCacheUri}
268+
/>
269+
)}
263270
<Box
264271
sx={{
265272
display: 'flex',

0 commit comments

Comments
 (0)