Skip to content

Commit ada9978

Browse files
fix: page param not getting reset when applying filters (#7243)
Closes #7188 In the collection list view, after adding a filter, the page number should be reset since the doc count will have changed. --------- Co-authored-by: Jarrod Flesch <jarrodmflesch@gmail.com>
1 parent 874279c commit ada9978

File tree

4 files changed

+70
-21
lines changed

4 files changed

+70
-21
lines changed

packages/ui/src/elements/SortColumn/index.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ export const SortColumn: React.FC<SortColumnProps> = (props) => {
3737
if (sort === desc) descClasses.push(`${baseClass}--active`)
3838

3939
const setSort = useCallback(
40-
(newSort) => {
41-
refineListData({
40+
async (newSort: string) => {
41+
await refineListData({
4242
sort: newSort,
4343
})
4444
},
@@ -56,7 +56,7 @@ export const SortColumn: React.FC<SortColumnProps> = (props) => {
5656
label,
5757
})}
5858
className={[...ascClasses, `${baseClass}__button`].filter(Boolean).join(' ')}
59-
onClick={() => setSort(asc)}
59+
onClick={() => void setSort(asc)}
6060
type="button"
6161
>
6262
<ChevronIcon direction="up" />
@@ -67,7 +67,7 @@ export const SortColumn: React.FC<SortColumnProps> = (props) => {
6767
label,
6868
})}
6969
className={[...descClasses, `${baseClass}__button`].filter(Boolean).join(' ')}
70-
onClick={() => setSort(desc)}
70+
onClick={() => void setSort(desc)}
7171
type="button"
7272
>
7373
<ChevronIcon />

packages/ui/src/elements/WhereBuilder/index.tsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,8 +143,11 @@ export const WhereBuilder: React.FC<WhereBuilderProps> = (props) => {
143143

144144
React.useEffect(() => {
145145
if (shouldUpdateQuery) {
146-
handleWhereChange({ or: conditions })
147-
setShouldUpdateQuery(false)
146+
async function handleChange() {
147+
await handleWhereChange({ or: conditions })
148+
setShouldUpdateQuery(false)
149+
}
150+
void handleChange()
148151
}
149152
}, [conditions, handleWhereChange, shouldUpdateQuery])
150153

packages/ui/src/providers/ListQuery/index.tsx

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,19 @@ import { useSearchParams } from '../SearchParams/index.js'
1313

1414
export type ColumnPreferences = Pick<Column, 'accessor' | 'active'>[]
1515

16-
type Handlers = {
17-
handlePageChange?: (page: number) => void
18-
handlePerPageChange?: (limit: number) => void
19-
handleSearchChange?: (search: string) => void
20-
handleSortChange?: (sort: string) => void
21-
handleWhereChange?: (where: Where) => void
16+
type PropHandlers = {
17+
handlePageChange?: (page: number) => Promise<void> | void
18+
handlePerPageChange?: (limit: number) => Promise<void> | void
19+
handleSearchChange?: (search: string) => Promise<void> | void
20+
handleSortChange?: (sort: string) => Promise<void> | void
21+
handleWhereChange?: (where: Where) => Promise<void> | void
22+
}
23+
type ContextHandlers = {
24+
handlePageChange?: (page: number) => Promise<void>
25+
handlePerPageChange?: (limit: number) => Promise<void>
26+
handleSearchChange?: (search: string) => Promise<void>
27+
handleSortChange?: (sort: string) => Promise<void>
28+
handleWhereChange?: (where: Where) => Promise<void>
2229
}
2330

2431
export type ListQueryProps = {
@@ -28,14 +35,14 @@ export type ListQueryProps = {
2835
defaultSort?: string
2936
modifySearchParams?: boolean
3037
preferenceKey?: string
31-
} & Handlers
38+
} & PropHandlers
3239

3340
export type ListQueryContext = {
3441
data: PaginatedDocs
3542
defaultLimit?: number
3643
defaultSort?: string
37-
refineListData: (args: RefineOverrides) => void
38-
} & Handlers
44+
refineListData: (args: RefineOverrides) => Promise<void>
45+
} & ContextHandlers
3946

4047
const Context = createContext({} as ListQueryContext)
4148

@@ -71,6 +78,9 @@ export const ListQueryProvider: React.FC<ListQueryProps> = ({
7178
async (query: RefineOverrides) => {
7279
if (!modifySearchParams) return
7380

81+
let pageQuery = 'page' in query ? query.page : currentQuery?.page
82+
if ('where' in query || 'search' in query) pageQuery = '1'
83+
7484
const updatedPreferences: Record<string, unknown> = {}
7585
let updatePreferences = false
7686

@@ -88,7 +98,7 @@ export const ListQueryProvider: React.FC<ListQueryProps> = ({
8898

8999
const params = {
90100
limit: 'limit' in query ? query.limit : currentQuery?.limit,
91-
page: 'page' in query ? query.page : currentQuery?.page,
101+
page: pageQuery,
92102
search: 'search' in query ? query.search : currentQuery?.search,
93103
sort: 'sort' in query ? query.sort : currentQuery?.sort,
94104
where: 'where' in query ? query.where : currentQuery?.where,
@@ -102,7 +112,7 @@ export const ListQueryProvider: React.FC<ListQueryProps> = ({
102112
const handlePageChange = React.useCallback(
103113
async (arg: number) => {
104114
if (typeof handlePageChangeFromProps === 'function') {
105-
handlePageChangeFromProps(arg)
115+
await handlePageChangeFromProps(arg)
106116
}
107117
await refineListData({ page: String(arg) })
108118
},
@@ -111,7 +121,7 @@ export const ListQueryProvider: React.FC<ListQueryProps> = ({
111121
const handlePerPageChange = React.useCallback(
112122
async (arg: number) => {
113123
if (typeof handlePerPageChangeFromProps === 'function') {
114-
handlePerPageChangeFromProps(arg)
124+
await handlePerPageChangeFromProps(arg)
115125
}
116126
await refineListData({ limit: String(arg) })
117127
},
@@ -120,7 +130,7 @@ export const ListQueryProvider: React.FC<ListQueryProps> = ({
120130
const handleSearchChange = React.useCallback(
121131
async (arg: string) => {
122132
if (typeof handleSearchChangeFromProps === 'function') {
123-
handleSearchChangeFromProps(arg)
133+
await handleSearchChangeFromProps(arg)
124134
}
125135
await refineListData({ search: arg })
126136
},
@@ -129,7 +139,7 @@ export const ListQueryProvider: React.FC<ListQueryProps> = ({
129139
const handleSortChange = React.useCallback(
130140
async (arg: string) => {
131141
if (typeof handleSortChangeFromProps === 'function') {
132-
handleSortChangeFromProps(arg)
142+
await handleSortChangeFromProps(arg)
133143
}
134144
await refineListData({ sort: arg })
135145
},
@@ -138,7 +148,7 @@ export const ListQueryProvider: React.FC<ListQueryProps> = ({
138148
const handleWhereChange = React.useCallback(
139149
async (arg: Where) => {
140150
if (typeof handleWhereChangeFromProps === 'function') {
141-
handleWhereChangeFromProps(arg)
151+
await handleWhereChangeFromProps(arg)
142152
}
143153
await refineListData({ where: arg })
144154
},

test/admin/e2e/2/e2e.spec.ts

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -421,6 +421,42 @@ describe('admin2', () => {
421421
await expect(page.getByPlaceholder('Enter a value')).toHaveValue('[object Object]')
422422
await expect(page.locator(tableRowLocator)).toHaveCount(1)
423423
})
424+
425+
test('should reset page when filters are applied', async () => {
426+
await deleteAllPosts()
427+
await mapAsync([...Array(6)], async () => {
428+
await createPost()
429+
})
430+
await page.reload()
431+
await mapAsync([...Array(6)], async () => {
432+
await createPost({ title: 'test' })
433+
})
434+
await page.reload()
435+
436+
const pageInfo = page.locator('.collection-list__page-info')
437+
const perPage = page.locator('.per-page')
438+
const tableItems = page.locator(tableRowLocator)
439+
440+
await expect(tableItems).toHaveCount(10)
441+
await expect(pageInfo).toHaveText('1-10 of 12')
442+
await expect(perPage).toContainText('Per Page: 10')
443+
444+
// go to page 2
445+
await page.goto(`${postsUrl.list}?limit=10&page=2`)
446+
447+
// add filter
448+
await page.locator('.list-controls__toggle-where').click()
449+
await page.locator('.where-builder__add-first-filter').click()
450+
await page.locator('.condition__field .rs__control').click()
451+
const options = page.locator('.rs__option')
452+
await options.locator('text=Tab 1 > Title').click()
453+
await page.locator('.condition__operator .rs__control').click()
454+
await options.locator('text=equals').click()
455+
await page.locator('.condition__value input').fill('test')
456+
457+
// expect to be on page 1
458+
await expect(pageInfo).toHaveText('1-6 of 6')
459+
})
424460
})
425461

426462
describe('table columns', () => {

0 commit comments

Comments
 (0)