diff --git a/packages/next/src/views/List/handleServerFunction.tsx b/packages/next/src/views/List/handleServerFunction.tsx index 2408794dfed..3149d593e53 100644 --- a/packages/next/src/views/List/handleServerFunction.tsx +++ b/packages/next/src/views/List/handleServerFunction.tsx @@ -1,4 +1,4 @@ -import type { ListPreferences, ListQuery, ServerFunction, VisibleEntities } from 'payload' +import type { CollectionPreferences, ListQuery, ServerFunction, VisibleEntities } from 'payload' import { getClientConfig } from '@payloadcms/ui/utilities/getClientConfig' import { headers as getHeaders } from 'next/headers.js' @@ -8,7 +8,7 @@ import { renderListView } from './index.js' type RenderListResult = { List: React.ReactNode - preferences: ListPreferences + preferences: CollectionPreferences } export const renderListHandler: ServerFunction< @@ -92,7 +92,7 @@ export const renderListHandler: ServerFunction< importMap: payload.importMap, }) - const preferencesKey = `${collectionSlug}-list` + const preferencesKey = `collection-${collectionSlug}` const preferences = await payload .find({ @@ -119,7 +119,7 @@ export const renderListHandler: ServerFunction< ], }, }) - .then((res) => res.docs[0]?.value as ListPreferences) + .then((res) => res.docs[0]?.value as CollectionPreferences) const visibleEntities: VisibleEntities = { collections: payload.config.collections diff --git a/packages/next/src/views/List/index.tsx b/packages/next/src/views/List/index.tsx index ddef9ce0d02..3df0d9de822 100644 --- a/packages/next/src/views/List/index.tsx +++ b/packages/next/src/views/List/index.tsx @@ -1,8 +1,8 @@ import type { AdminViewServerProps, + CollectionPreferences, ColumnPreference, DefaultDocumentIDType, - ListPreferences, ListQuery, ListViewClientProps, ListViewServerPropsOnly, @@ -98,8 +98,8 @@ export const renderListView = async ( * This will ensure that prefs are only updated when explicitly set by the user * This could potentially be done by injecting a `sessionID` into the params and comparing it against a session cookie */ - const listPreferences = await upsertPreferences({ - key: `${collectionSlug}-list`, + const collectionPreferences = await upsertPreferences({ + key: `collection-${collectionSlug}`, req, value: { columns, @@ -120,10 +120,10 @@ export const renderListView = async ( const page = isNumber(query?.page) ? Number(query.page) : 0 - const limit = listPreferences?.limit || collectionConfig.admin.pagination.defaultLimit + const limit = collectionPreferences?.limit || collectionConfig.admin.pagination.defaultLimit const sort = - listPreferences?.sort || + collectionPreferences?.sort || (typeof collectionConfig.defaultSort === 'string' ? collectionConfig.defaultSort : undefined) let where = mergeListSearchAndWhere({ @@ -150,10 +150,10 @@ export const renderListView = async ( let queryPreset: QueryPreset | undefined let queryPresetPermissions: SanitizedCollectionPermission | undefined - if (listPreferences?.preset) { + if (collectionPreferences?.preset) { try { queryPreset = (await payload.findByID({ - id: listPreferences?.preset, + id: collectionPreferences?.preset, collection: 'payload-query-presets', depth: 0, overrideAccess: false, @@ -194,7 +194,7 @@ export const renderListView = async ( const { columnState, Table } = renderTable({ clientCollectionConfig, collectionConfig, - columnPreferences: listPreferences?.columns, + columnPreferences: collectionPreferences?.columns, columns, customCellProps, docs: data.docs, @@ -230,7 +230,7 @@ export const renderListView = async ( data, i18n, limit, - listPreferences, + listPreferences: collectionPreferences, listSearchableFields: collectionConfig.admin.listSearchableFields, locale: fullLocale, params, @@ -264,7 +264,7 @@ export const renderListView = async ( data={data} defaultLimit={limit} defaultSort={sort} - listPreferences={listPreferences} + listPreferences={collectionPreferences} modifySearchParams={!isInDrawer} orderableFieldName={collectionConfig.orderable === true ? '_order' : undefined} > @@ -278,7 +278,7 @@ export const renderListView = async ( disableQueryPresets, enableRowSelections, hasCreatePermission, - listPreferences, + listPreferences: collectionPreferences, newDocumentURL, queryPreset, queryPresetPermissions, diff --git a/packages/payload/src/admin/views/list.ts b/packages/payload/src/admin/views/list.ts index 932c858f35b..7097e0bd417 100644 --- a/packages/payload/src/admin/views/list.ts +++ b/packages/payload/src/admin/views/list.ts @@ -4,7 +4,7 @@ import type { SanitizedCollectionConfig, } from '../../collections/config/types.js' import type { ServerProps } from '../../config/types.js' -import type { ListPreferences } from '../../preferences/types.js' +import type { CollectionPreferences } from '../../preferences/types.js' import type { QueryPreset } from '../../query-presets/types.js' import type { ResolvedFilterOptions } from '../../types/index.js' import type { Column } from '../elements/Table.js' @@ -30,7 +30,7 @@ export type ListViewServerPropsOnly = { collectionConfig: SanitizedCollectionConfig data: Data limit: number - listPreferences: ListPreferences + listPreferences: CollectionPreferences listSearchableFields: CollectionAdminOptions['listSearchableFields'] } & ServerProps @@ -48,7 +48,7 @@ export type ListViewClientProps = { /** * @deprecated */ - listPreferences?: ListPreferences + listPreferences?: CollectionPreferences newDocumentURL: string /** * @deprecated diff --git a/packages/payload/src/index.ts b/packages/payload/src/index.ts index fc2e7f763fa..c769c27d858 100644 --- a/packages/payload/src/index.ts +++ b/packages/payload/src/index.ts @@ -1475,11 +1475,15 @@ export { restoreVersionOperation as restoreVersionOperationGlobal } from './glob export { updateOperation as updateOperationGlobal } from './globals/operations/update.js' export type { CollapsedPreferences, + CollectionPreferences, + /** + * @deprecated Use `CollectionPreferences` instead. + */ + CollectionPreferences as ListPreferences, ColumnPreference, DocumentPreferences, FieldsPreferences, InsideFieldsPreferences, - ListPreferences, PreferenceRequest, PreferenceUpdateRequest, TabsPreferences, diff --git a/packages/payload/src/preferences/types.ts b/packages/payload/src/preferences/types.ts index 49f110eb027..23dc1ef5407 100644 --- a/packages/payload/src/preferences/types.ts +++ b/packages/payload/src/preferences/types.ts @@ -34,7 +34,7 @@ export type ColumnPreference = { active: boolean } -export type ListPreferences = { +export type CollectionPreferences = { columns?: ColumnPreference[] limit?: number preset?: DefaultDocumentIDType diff --git a/packages/payload/src/query-presets/types.ts b/packages/payload/src/query-presets/types.ts index 05b5307b7f0..d4030c0374e 100644 --- a/packages/payload/src/query-presets/types.ts +++ b/packages/payload/src/query-presets/types.ts @@ -1,6 +1,6 @@ import type { Field } from '../fields/config/types.js' import type { Access, CollectionSlug } from '../index.js' -import type { ListPreferences } from '../preferences/types.js' +import type { CollectionPreferences } from '../preferences/types.js' import type { Where } from '../types/index.js' // Note: order matters here as it will change the rendered order in the UI @@ -19,7 +19,7 @@ export type QueryPreset = { users?: string[] } } - columns: ListPreferences['columns'] + columns: CollectionPreferences['columns'] id: number | string isShared: boolean relatedCollection: CollectionSlug diff --git a/packages/plugin-import-export/src/components/FieldsToExport/index.tsx b/packages/plugin-import-export/src/components/FieldsToExport/index.tsx index 64daeb52eba..e3c32e1870b 100644 --- a/packages/plugin-import-export/src/components/FieldsToExport/index.tsx +++ b/packages/plugin-import-export/src/components/FieldsToExport/index.tsx @@ -1,6 +1,6 @@ 'use client' -import type { ListPreferences, SelectFieldClientComponent } from 'payload' +import type { CollectionPreferences, SelectFieldClientComponent } from 'payload' import type { ReactNode } from 'react' import { @@ -51,10 +51,11 @@ export const FieldsToExport: SelectFieldClientComponent = (props) => { if (id || !collectionSlug) { return } + const doAsync = async () => { const currentPreferences = await getPreference<{ - columns: ListPreferences['columns'] - }>(`${collectionSlug}-list`) + columns: CollectionPreferences['columns'] + }>(`collection-${collectionSlug}`) const columns = currentPreferences?.columns?.filter((a) => a.active).map((b) => b.accessor) setValue(columns ?? collectionConfig?.admin?.defaultColumns ?? []) diff --git a/packages/ui/src/elements/RelationshipTable/index.tsx b/packages/ui/src/elements/RelationshipTable/index.tsx index 5195413f233..8f066647abb 100644 --- a/packages/ui/src/elements/RelationshipTable/index.tsx +++ b/packages/ui/src/elements/RelationshipTable/index.tsx @@ -124,7 +124,7 @@ export const RelationshipTable: React.FC = (pro newQuery.where = hoistQueryParamsToAnd(newQuery.where, filterOptions) } - // map columns from string[] to ListPreferences['columns'] + // map columns from string[] to CollectionPreferences['columns'] const defaultColumns = field.admin.defaultColumns ? field.admin.defaultColumns.map((accessor) => ({ accessor, diff --git a/packages/ui/src/exports/client/index.ts b/packages/ui/src/exports/client/index.ts index 4131a17f1d6..813bc45f500 100644 --- a/packages/ui/src/exports/client/index.ts +++ b/packages/ui/src/exports/client/index.ts @@ -385,7 +385,7 @@ export type { /** * @deprecated * This export will be removed in the next major version. - * Use `import type { ListPreferences } from 'payload'` instead. + * Use `import type { CollectionPreferences } from 'payload'` instead. */ ListPreferences, } from 'payload' diff --git a/packages/ui/src/providers/ListQuery/types.ts b/packages/ui/src/providers/ListQuery/types.ts index 8d1e137d932..ec919230272 100644 --- a/packages/ui/src/providers/ListQuery/types.ts +++ b/packages/ui/src/providers/ListQuery/types.ts @@ -1,7 +1,7 @@ import type { ClientCollectionConfig, + CollectionPreferences, ColumnPreference, - ListPreferences, ListQuery, PaginatedDocs, Sort, @@ -25,7 +25,7 @@ export type ListQueryProps = { readonly data: PaginatedDocs readonly defaultLimit?: number readonly defaultSort?: Sort - readonly listPreferences?: ListPreferences + readonly listPreferences?: CollectionPreferences readonly modifySearchParams?: boolean readonly onQueryChange?: OnListQueryChange readonly orderableFieldName?: string diff --git a/packages/ui/src/providers/TableColumns/buildColumnState/index.tsx b/packages/ui/src/providers/TableColumns/buildColumnState/index.tsx index 45201d79272..48c39b0e98d 100644 --- a/packages/ui/src/providers/TableColumns/buildColumnState/index.tsx +++ b/packages/ui/src/providers/TableColumns/buildColumnState/index.tsx @@ -2,12 +2,12 @@ import type { I18nClient } from '@payloadcms/translations' import type { ClientComponentProps, ClientField, + CollectionPreferences, CollectionSlug, Column, DefaultCellComponentProps, Document, Field, - ListPreferences, PaginatedDocs, Payload, SanitizedCollectionConfig, @@ -38,8 +38,8 @@ import { sortFieldMap } from './sortFieldMap.js' export type BuildColumnStateArgs = { beforeRows?: Column[] clientFields: ClientField[] - columnPreferences: ListPreferences['columns'] - columns?: ListPreferences['columns'] + columnPreferences: CollectionPreferences['columns'] + columns?: CollectionPreferences['columns'] customCellProps: DefaultCellComponentProps['customCellProps'] enableLinkedCell?: boolean enableRowSelections: boolean diff --git a/packages/ui/src/providers/TableColumns/getInitialColumns.ts b/packages/ui/src/providers/TableColumns/getInitialColumns.ts index 02e797ec384..530cda1753c 100644 --- a/packages/ui/src/providers/TableColumns/getInitialColumns.ts +++ b/packages/ui/src/providers/TableColumns/getInitialColumns.ts @@ -1,11 +1,11 @@ -import type { ClientField, CollectionConfig, Field, ListPreferences } from 'payload' +import type { ClientField, CollectionConfig, CollectionPreferences, Field } from 'payload' import { fieldAffectsData } from 'payload/shared' const getRemainingColumns = ( fields: T, useAsTitle: string, -): ListPreferences['columns'] => +): CollectionPreferences['columns'] => fields?.reduce((remaining, field) => { if (fieldAffectsData(field) && field.name === useAsTitle) { return remaining @@ -40,7 +40,7 @@ export const getInitialColumns = ( fields: T, useAsTitle: CollectionConfig['admin']['useAsTitle'], defaultColumns: CollectionConfig['admin']['defaultColumns'], -): ListPreferences['columns'] => { +): CollectionPreferences['columns'] => { let initialColumns = [] if (Array.isArray(defaultColumns) && defaultColumns.length >= 1) { diff --git a/packages/ui/src/providers/TableColumns/types.ts b/packages/ui/src/providers/TableColumns/types.ts index 1b593f49523..ccebb04efb5 100644 --- a/packages/ui/src/providers/TableColumns/types.ts +++ b/packages/ui/src/providers/TableColumns/types.ts @@ -1,4 +1,4 @@ -import type { Column, ListPreferences } from 'payload' +import type { CollectionPreferences, Column } from 'payload' import type { SortColumnProps } from '../../elements/SortColumn/index.js' @@ -27,7 +27,7 @@ export type TableColumnsProviderProps = { /** * @deprecated */ - readonly listPreferences?: ListPreferences + readonly listPreferences?: CollectionPreferences /** * @deprecated */ diff --git a/packages/ui/src/utilities/buildTableState.ts b/packages/ui/src/utilities/buildTableState.ts index 70393ced2c6..3852fda4187 100644 --- a/packages/ui/src/utilities/buildTableState.ts +++ b/packages/ui/src/utilities/buildTableState.ts @@ -2,9 +2,9 @@ import type { BuildTableStateArgs, ClientCollectionConfig, ClientConfig, + CollectionPreferences, Column, ErrorResult, - ListPreferences, PaginatedDocs, SanitizedCollectionConfig, ServerFunction, @@ -22,7 +22,7 @@ type BuildTableStateSuccessResult = { clientConfig?: ClientConfig data: PaginatedDocs errors?: never - preferences: ListPreferences + preferences: CollectionPreferences renderedFilters: Map state: Column[] Table: React.ReactNode @@ -142,10 +142,10 @@ const buildTableState = async ( } } - const listPreferences = await upsertPreferences({ + const collectionPreferences = await upsertPreferences({ key: Array.isArray(collectionSlug) ? `${parent.collectionSlug}-${parent.joinPath}` - : `${collectionSlug}-list`, + : `collection-${collectionSlug}`, req, value: { columns, @@ -231,7 +231,7 @@ const buildTableState = async ( clientConfig, collectionConfig, collections: Array.isArray(collectionSlug) ? collectionSlug : undefined, - columnPreferences: Array.isArray(collectionSlug) ? listPreferences?.columns : undefined, // TODO, might not be neededcolumns, + columnPreferences: Array.isArray(collectionSlug) ? collectionPreferences?.columns : undefined, // TODO, might not be neededcolumns, columns, docs, enableRowSelections, @@ -253,7 +253,7 @@ const buildTableState = async ( return { data, - preferences: listPreferences, + preferences: collectionPreferences, renderedFilters, state: columnState, Table, diff --git a/packages/ui/src/utilities/renderTable.tsx b/packages/ui/src/utilities/renderTable.tsx index d7cec3a1487..d0b0216119e 100644 --- a/packages/ui/src/utilities/renderTable.tsx +++ b/packages/ui/src/utilities/renderTable.tsx @@ -3,11 +3,11 @@ import type { ClientConfig, ClientField, CollectionConfig, + CollectionPreferences, Column, ColumnPreference, Field, ImportMap, - ListPreferences, PaginatedDocs, Payload, SanitizedCollectionConfig, @@ -80,8 +80,8 @@ export const renderTable = ({ clientConfig?: ClientConfig collectionConfig?: SanitizedCollectionConfig collections?: string[] - columnPreferences: ListPreferences['columns'] - columns?: ListPreferences['columns'] + columnPreferences: CollectionPreferences['columns'] + columns?: CollectionPreferences['columns'] customCellProps?: Record docs: PaginatedDocs['docs'] drawerSlug?: string diff --git a/tsconfig.base.json b/tsconfig.base.json index 0898ad390f3..64e856c63d8 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -21,8 +21,15 @@ "skipLibCheck": true, "emitDeclarationOnly": true, "sourceMap": true, - "lib": ["DOM", "DOM.Iterable", "ES2022"], - "types": ["node", "jest"], + "lib": [ + "DOM", + "DOM.Iterable", + "ES2022" + ], + "types": [ + "node", + "jest" + ], "incremental": true, "isolatedModules": true, "plugins": [ @@ -31,36 +38,72 @@ } ], "paths": { - "@payload-config": ["./test/_community/config.ts"], - "@payloadcms/admin-bar": ["./packages/admin-bar/src"], - "@payloadcms/live-preview": ["./packages/live-preview/src"], - "@payloadcms/live-preview-react": ["./packages/live-preview-react/src/index.ts"], - "@payloadcms/live-preview-vue": ["./packages/live-preview-vue/src/index.ts"], - "@payloadcms/ui": ["./packages/ui/src/exports/client/index.ts"], - "@payloadcms/ui/shared": ["./packages/ui/src/exports/shared/index.ts"], - "@payloadcms/ui/rsc": ["./packages/ui/src/exports/rsc/index.ts"], - "@payloadcms/ui/scss": ["./packages/ui/src/scss.scss"], - "@payloadcms/ui/scss/app.scss": ["./packages/ui/src/scss/app.scss"], - "@payloadcms/next/*": ["./packages/next/src/exports/*.ts"], + "@payload-config": [ + "./test/live-preview/config.ts" + ], + "@payloadcms/admin-bar": [ + "./packages/admin-bar/src" + ], + "@payloadcms/live-preview": [ + "./packages/live-preview/src" + ], + "@payloadcms/live-preview-react": [ + "./packages/live-preview-react/src/index.ts" + ], + "@payloadcms/live-preview-vue": [ + "./packages/live-preview-vue/src/index.ts" + ], + "@payloadcms/ui": [ + "./packages/ui/src/exports/client/index.ts" + ], + "@payloadcms/ui/shared": [ + "./packages/ui/src/exports/shared/index.ts" + ], + "@payloadcms/ui/rsc": [ + "./packages/ui/src/exports/rsc/index.ts" + ], + "@payloadcms/ui/scss": [ + "./packages/ui/src/scss.scss" + ], + "@payloadcms/ui/scss/app.scss": [ + "./packages/ui/src/scss/app.scss" + ], + "@payloadcms/next/*": [ + "./packages/next/src/exports/*.ts" + ], "@payloadcms/richtext-lexical/client": [ "./packages/richtext-lexical/src/exports/client/index.ts" ], - "@payloadcms/richtext-lexical/rsc": ["./packages/richtext-lexical/src/exports/server/rsc.ts"], - "@payloadcms/richtext-slate/rsc": ["./packages/richtext-slate/src/exports/server/rsc.ts"], + "@payloadcms/richtext-lexical/rsc": [ + "./packages/richtext-lexical/src/exports/server/rsc.ts" + ], + "@payloadcms/richtext-slate/rsc": [ + "./packages/richtext-slate/src/exports/server/rsc.ts" + ], "@payloadcms/richtext-slate/client": [ "./packages/richtext-slate/src/exports/client/index.ts" ], - "@payloadcms/plugin-seo/client": ["./packages/plugin-seo/src/exports/client.ts"], - "@payloadcms/plugin-sentry/client": ["./packages/plugin-sentry/src/exports/client.ts"], - "@payloadcms/plugin-stripe/client": ["./packages/plugin-stripe/src/exports/client.ts"], - "@payloadcms/plugin-search/client": ["./packages/plugin-search/src/exports/client.ts"], + "@payloadcms/plugin-seo/client": [ + "./packages/plugin-seo/src/exports/client.ts" + ], + "@payloadcms/plugin-sentry/client": [ + "./packages/plugin-sentry/src/exports/client.ts" + ], + "@payloadcms/plugin-stripe/client": [ + "./packages/plugin-stripe/src/exports/client.ts" + ], + "@payloadcms/plugin-search/client": [ + "./packages/plugin-search/src/exports/client.ts" + ], "@payloadcms/plugin-form-builder/client": [ "./packages/plugin-form-builder/src/exports/client.ts" ], "@payloadcms/plugin-import-export/rsc": [ "./packages/plugin-import-export/src/exports/rsc.ts" ], - "@payloadcms/plugin-multi-tenant/rsc": ["./packages/plugin-multi-tenant/src/exports/rsc.ts"], + "@payloadcms/plugin-multi-tenant/rsc": [ + "./packages/plugin-multi-tenant/src/exports/rsc.ts" + ], "@payloadcms/plugin-multi-tenant/utilities": [ "./packages/plugin-multi-tenant/src/exports/utilities.ts" ], @@ -70,25 +113,42 @@ "@payloadcms/plugin-multi-tenant/client": [ "./packages/plugin-multi-tenant/src/exports/client.ts" ], - "@payloadcms/plugin-multi-tenant": ["./packages/plugin-multi-tenant/src/index.ts"], + "@payloadcms/plugin-multi-tenant": [ + "./packages/plugin-multi-tenant/src/index.ts" + ], "@payloadcms/plugin-multi-tenant/translations/languages/all": [ "./packages/plugin-multi-tenant/src/translations/index.ts" ], "@payloadcms/plugin-multi-tenant/translations/languages/*": [ "./packages/plugin-multi-tenant/src/translations/languages/*.ts" ], - "@payloadcms/next": ["./packages/next/src/exports/*"], - "@payloadcms/storage-azure/client": ["./packages/storage-azure/src/exports/client.ts"], - "@payloadcms/storage-s3/client": ["./packages/storage-s3/src/exports/client.ts"], + "@payloadcms/next": [ + "./packages/next/src/exports/*" + ], + "@payloadcms/storage-azure/client": [ + "./packages/storage-azure/src/exports/client.ts" + ], + "@payloadcms/storage-s3/client": [ + "./packages/storage-s3/src/exports/client.ts" + ], "@payloadcms/storage-vercel-blob/client": [ "./packages/storage-vercel-blob/src/exports/client.ts" ], - "@payloadcms/storage-gcs/client": ["./packages/storage-gcs/src/exports/client.ts"], + "@payloadcms/storage-gcs/client": [ + "./packages/storage-gcs/src/exports/client.ts" + ], "@payloadcms/storage-uploadthing/client": [ "./packages/storage-uploadthing/src/exports/client.ts" ] } }, - "include": ["${configDir}/src"], - "exclude": ["${configDir}/dist", "${configDir}/build", "${configDir}/temp", "**/*.spec.ts"] + "include": [ + "${configDir}/src" + ], + "exclude": [ + "${configDir}/dist", + "${configDir}/build", + "${configDir}/temp", + "**/*.spec.ts" + ] }