Skip to content

Commit 72995fc

Browse files
authored
feat(ui): useTableColumns add abillity to reset columns state (#8296)
Fixes #8205 Adds `resetColumnsState` method to `useTableColumns` return Example of a `BeforeList` component for column state reset: ```ts 'use client' import { Pill, useTableColumns } from '@payloadcms/ui' function ResetDefaultColumnsButton() { const { resetColumnsState } = useTableColumns() return <Pill onClick={resetColumnsState}>Reset to default columns</Pill> } export { ResetDefaultColumnsButton } ``` Additionally, fixes that `setActiveColumns` didn't respect the passed order of columns and didn't update the UI immediately
1 parent a095a6f commit 72995fc

File tree

4 files changed

+121
-8
lines changed

4 files changed

+121
-8
lines changed

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

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { getInitialColumns } from './getInitialColumns.js'
1515
export interface ITableColumns {
1616
columns: Column[]
1717
moveColumn: (args: { fromIndex: number; toIndex: number }) => void
18+
resetColumnsState: () => void
1819
setActiveColumns: (columns: string[]) => void
1920
toggleColumn: (column: string) => void
2021
}
@@ -122,19 +123,35 @@ export const TableColumnsProvider: React.FC<Props> = ({
122123
)
123124

124125
const setActiveColumns = React.useCallback(
125-
(activeColumnAccessors) => {
126-
const activeColumns = tableColumns.map((col) => {
127-
return {
128-
...col,
129-
active: activeColumnAccessors.includes(col.accessor),
130-
}
131-
})
132-
126+
(activeColumnAccessors: string[]) => {
127+
const activeColumns = tableColumns
128+
.map((col) => {
129+
return {
130+
...col,
131+
active: activeColumnAccessors.includes(col.accessor),
132+
}
133+
})
134+
.toSorted((first, second) => {
135+
const indexOfFirst = activeColumnAccessors.indexOf(first.accessor)
136+
const indexOfSecond = activeColumnAccessors.indexOf(second.accessor)
137+
138+
if (indexOfFirst === -1 || indexOfSecond === -1) {
139+
return 0
140+
}
141+
142+
return indexOfFirst > indexOfSecond ? 1 : -1
143+
})
144+
145+
setTableColumns(activeColumns)
133146
updateColumnPreferences(activeColumns)
134147
},
135148
[tableColumns, updateColumnPreferences],
136149
)
137150

151+
const resetColumnsState = React.useCallback(() => {
152+
setActiveColumns(defaultColumns)
153+
}, [defaultColumns, setActiveColumns])
154+
138155
// //////////////////////////////////////////////
139156
// Get preferences on collection change (drawers)
140157
// //////////////////////////////////////////////
@@ -182,6 +199,7 @@ export const TableColumnsProvider: React.FC<Props> = ({
182199
value={{
183200
columns: tableColumns,
184201
moveColumn,
202+
resetColumnsState,
185203
setActiveColumns,
186204
toggleColumn,
187205
}}

test/admin/collections/Posts.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ export const Posts: CollectionConfig = {
1212
description: 'This is a custom collection description.',
1313
group: 'One',
1414
listSearchableFields: ['id', 'title', 'description', 'number'],
15+
components: {
16+
beforeListTable: ['/components/ResetColumns/index.js#ResetDefaultColumnsButton'],
17+
},
1518
meta: {
1619
description: 'This is a custom meta description for posts',
1720
openGraph: {
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
'use client'
2+
3+
import { Pill, useTableColumns } from '@payloadcms/ui'
4+
5+
function ResetDefaultColumnsButton() {
6+
const { resetColumnsState } = useTableColumns()
7+
8+
return <Pill onClick={resetColumnsState}>Reset to default columns</Pill>
9+
}
10+
11+
export { ResetDefaultColumnsButton }

test/admin/payload-types.ts

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ export interface Config {
2727
customIdTab: CustomIdTab;
2828
customIdRow: CustomIdRow;
2929
'disable-duplicate': DisableDuplicate;
30+
'payload-locked-documents': PayloadLockedDocument;
3031
'payload-preferences': PayloadPreference;
3132
'payload-migrations': PayloadMigration;
3233
};
@@ -269,6 +270,86 @@ export interface DisableDuplicate {
269270
updatedAt: string;
270271
createdAt: string;
271272
}
273+
/**
274+
* This interface was referenced by `Config`'s JSON-Schema
275+
* via the `definition` "payload-locked-documents".
276+
*/
277+
export interface PayloadLockedDocument {
278+
id: string;
279+
document?:
280+
| ({
281+
relationTo: 'uploads';
282+
value: string | Upload;
283+
} | null)
284+
| ({
285+
relationTo: 'posts';
286+
value: string | Post;
287+
} | null)
288+
| ({
289+
relationTo: 'users';
290+
value: string | User;
291+
} | null)
292+
| ({
293+
relationTo: 'hidden-collection';
294+
value: string | HiddenCollection;
295+
} | null)
296+
| ({
297+
relationTo: 'collection-no-api-view';
298+
value: string | CollectionNoApiView;
299+
} | null)
300+
| ({
301+
relationTo: 'custom-views-one';
302+
value: string | CustomViewsOne;
303+
} | null)
304+
| ({
305+
relationTo: 'custom-views-two';
306+
value: string | CustomViewsTwo;
307+
} | null)
308+
| ({
309+
relationTo: 'custom-fields';
310+
value: string | CustomField;
311+
} | null)
312+
| ({
313+
relationTo: 'group-one-collection-ones';
314+
value: string | GroupOneCollectionOne;
315+
} | null)
316+
| ({
317+
relationTo: 'group-one-collection-twos';
318+
value: string | GroupOneCollectionTwo;
319+
} | null)
320+
| ({
321+
relationTo: 'group-two-collection-ones';
322+
value: string | GroupTwoCollectionOne;
323+
} | null)
324+
| ({
325+
relationTo: 'group-two-collection-twos';
326+
value: string | GroupTwoCollectionTwo;
327+
} | null)
328+
| ({
329+
relationTo: 'geo';
330+
value: string | Geo;
331+
} | null)
332+
| ({
333+
relationTo: 'customIdTab';
334+
value: string | CustomIdTab;
335+
} | null)
336+
| ({
337+
relationTo: 'customIdRow';
338+
value: string | CustomIdRow;
339+
} | null)
340+
| ({
341+
relationTo: 'disable-duplicate';
342+
value: string | DisableDuplicate;
343+
} | null);
344+
editedAt?: string | null;
345+
globalSlug?: string | null;
346+
user: {
347+
relationTo: 'users';
348+
value: string | User;
349+
};
350+
updatedAt: string;
351+
createdAt: string;
352+
}
272353
/**
273354
* This interface was referenced by `Config`'s JSON-Schema
274355
* via the `definition` "payload-preferences".

0 commit comments

Comments
 (0)