Skip to content

Commit bc06cfa

Browse files
committed
useSavedQueries story
1 parent 7edecc7 commit bc06cfa

File tree

1 file changed

+171
-0
lines changed

1 file changed

+171
-0
lines changed
Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,171 @@
1+
import * as React from 'react';
2+
import fakeRestDataProvider from 'ra-data-fakerest';
3+
import { useNavigate } from 'react-router';
4+
import queryString from 'query-string';
5+
import isEqual from 'lodash/isEqual.js';
6+
import {
7+
TestMemoryRouter,
8+
Resource,
9+
ListBase,
10+
FilterLiveForm,
11+
useListContext,
12+
useSavedQueries,
13+
extractValidSavedQueries,
14+
SavedQuery,
15+
} from '../..';
16+
import { Admin, DataTable, TextInput, BooleanInput } from '../../test-ui';
17+
18+
export default { title: 'ra-core/list/filter/useSavedQueries' };
19+
20+
const SavedQueries = () => {
21+
const { resource, filterValues, displayedFilters, sort, perPage } =
22+
useListContext();
23+
const hasFilterValues = !isEqual(filterValues, {});
24+
const navigate = useNavigate();
25+
const [savedQueries, setSavedQueries] = useSavedQueries(resource);
26+
const validSavedQueries = extractValidSavedQueries(savedQueries);
27+
const hasSavedCurrentQuery = validSavedQueries.some(savedQuery =>
28+
isEqual(savedQuery.value, {
29+
filter: filterValues,
30+
sort,
31+
perPage,
32+
displayedFilters,
33+
})
34+
);
35+
36+
const removeQuery = () => {
37+
const savedQueryToRemove = {
38+
filter: filterValues,
39+
sort,
40+
perPage,
41+
displayedFilters,
42+
};
43+
const newSavedQueries = extractValidSavedQueries(savedQueries);
44+
const index = newSavedQueries.findIndex(savedFilter =>
45+
isEqual(savedFilter.value, savedQueryToRemove)
46+
);
47+
setSavedQueries([
48+
...newSavedQueries.slice(0, index),
49+
...newSavedQueries.slice(index + 1),
50+
]);
51+
};
52+
53+
const addQuery = () => {
54+
const newSavedQuery = {
55+
label: `My saved query: ${filterValues.title || 'all'} - ${filterValues.published ? 'published' : 'unpublished'}`,
56+
value: {
57+
filter: filterValues,
58+
sort,
59+
perPage,
60+
displayedFilters,
61+
},
62+
};
63+
const newSavedQueries = extractValidSavedQueries(savedQueries);
64+
setSavedQueries(newSavedQueries.concat(newSavedQuery));
65+
};
66+
67+
const applyQuery = (savedQuery: SavedQuery) => {
68+
navigate({
69+
search: queryString.stringify({
70+
filter: JSON.stringify(savedQuery.value.filter),
71+
sort: savedQuery.value.sort?.field,
72+
order: savedQuery.value.sort?.order,
73+
page: 1,
74+
perPage: savedQuery.value.perPage,
75+
displayedFilters: JSON.stringify(
76+
savedQuery.value.displayedFilters
77+
),
78+
}),
79+
});
80+
};
81+
82+
return (
83+
<>
84+
<p>Saved Queries</p>
85+
{validSavedQueries.length === 0 && (
86+
<p>No saved queries yet. Set a filter to save it.</p>
87+
)}
88+
<ul>
89+
{validSavedQueries.map(
90+
(savedQuery: SavedQuery, index: number) => (
91+
<li>
92+
{savedQuery.label}{' '}
93+
{isEqual(savedQuery.value, {
94+
filter: filterValues,
95+
sort,
96+
perPage,
97+
displayedFilters,
98+
}) ? (
99+
<button
100+
type="button"
101+
onClick={removeQuery}
102+
key={index}
103+
>
104+
Remove
105+
</button>
106+
) : (
107+
<button
108+
type="button"
109+
onClick={() => {
110+
applyQuery(savedQuery);
111+
}}
112+
key={index}
113+
>
114+
Apply
115+
</button>
116+
)}
117+
</li>
118+
)
119+
)}
120+
{hasFilterValues && !hasSavedCurrentQuery && (
121+
<li>
122+
<button onClick={addQuery} type="button">
123+
Save current query
124+
</button>
125+
</li>
126+
)}
127+
</ul>
128+
</>
129+
);
130+
};
131+
132+
const FilterForm = () => {
133+
return (
134+
<FilterLiveForm>
135+
<TextInput source="title" />
136+
<BooleanInput source="published" />
137+
</FilterLiveForm>
138+
);
139+
};
140+
141+
export const Basic = () => (
142+
<TestMemoryRouter>
143+
<Admin
144+
dataProvider={fakeRestDataProvider(
145+
{
146+
posts: [
147+
{ id: 1, title: 'Post 1', published: true },
148+
{ id: 2, title: 'Post 2', published: false },
149+
],
150+
},
151+
process.env.NODE_ENV !== 'test',
152+
process.env.NODE_ENV !== 'test' ? 300 : 0
153+
)}
154+
>
155+
<Resource
156+
name="posts"
157+
list={
158+
<ListBase>
159+
<FilterForm />
160+
<SavedQueries />
161+
<DataTable>
162+
<DataTable.Col source="id" />
163+
<DataTable.Col source="title" />
164+
<DataTable.Col source="published" />
165+
</DataTable>
166+
</ListBase>
167+
}
168+
/>
169+
</Admin>
170+
</TestMemoryRouter>
171+
);

0 commit comments

Comments
 (0)