Skip to content

feat: collection-level preferences #12909

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Jun 27, 2025
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions packages/next/src/views/List/handleServerFunction.tsx
Original file line number Diff line number Diff line change
@@ -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
22 changes: 11 additions & 11 deletions packages/next/src/views/List/index.tsx
Original file line number Diff line number Diff line change
@@ -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<ListPreferences>({
key: `${collectionSlug}-list`,
const collectionPreferences = await upsertPreferences<CollectionPreferences>({
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,
6 changes: 3 additions & 3 deletions packages/payload/src/admin/views/list.ts
Original file line number Diff line number Diff line change
@@ -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
6 changes: 5 additions & 1 deletion packages/payload/src/index.ts
Original file line number Diff line number Diff line change
@@ -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,
2 changes: 1 addition & 1 deletion packages/payload/src/preferences/types.ts
Original file line number Diff line number Diff line change
@@ -34,7 +34,7 @@ export type ColumnPreference = {
active: boolean
}

export type ListPreferences = {
export type CollectionPreferences = {
columns?: ColumnPreference[]
limit?: number
preset?: DefaultDocumentIDType
4 changes: 2 additions & 2 deletions packages/payload/src/query-presets/types.ts
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -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 ?? [])
2 changes: 1 addition & 1 deletion packages/ui/src/elements/RelationshipTable/index.tsx
Original file line number Diff line number Diff line change
@@ -124,7 +124,7 @@ export const RelationshipTable: React.FC<RelationshipTableComponentProps> = (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,
2 changes: 1 addition & 1 deletion packages/ui/src/exports/client/index.ts
Original file line number Diff line number Diff line change
@@ -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'
4 changes: 2 additions & 2 deletions packages/ui/src/providers/ListQuery/types.ts
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -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
6 changes: 3 additions & 3 deletions packages/ui/src/providers/TableColumns/getInitialColumns.ts
Original file line number Diff line number Diff line change
@@ -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 = <T extends ClientField[] | Field[]>(
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 = <T extends ClientField[] | Field[]>(
fields: T,
useAsTitle: CollectionConfig['admin']['useAsTitle'],
defaultColumns: CollectionConfig['admin']['defaultColumns'],
): ListPreferences['columns'] => {
): CollectionPreferences['columns'] => {
let initialColumns = []

if (Array.isArray(defaultColumns) && defaultColumns.length >= 1) {
4 changes: 2 additions & 2 deletions packages/ui/src/providers/TableColumns/types.ts
Original file line number Diff line number Diff line change
@@ -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
*/
12 changes: 6 additions & 6 deletions packages/ui/src/utilities/buildTableState.ts
Original file line number Diff line number Diff line change
@@ -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<string, React.ReactNode>
state: Column[]
Table: React.ReactNode
@@ -142,10 +142,10 @@ const buildTableState = async (
}
}

const listPreferences = await upsertPreferences<ListPreferences>({
const collectionPreferences = await upsertPreferences<CollectionPreferences>({
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,
6 changes: 3 additions & 3 deletions packages/ui/src/utilities/renderTable.tsx
Original file line number Diff line number Diff line change
@@ -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<string, unknown>
docs: PaginatedDocs['docs']
drawerSlug?: string
114 changes: 87 additions & 27 deletions tsconfig.base.json
Original file line number Diff line number Diff line change
@@ -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"
]
}

Unchanged files with check annotations Beta

custom: {
'plugin-import-export': {
toCSV: ({ value, columnName, row, siblingDoc, doc }) => {
row[`${columnName}_id`] = value.id

Check failure on line 48 in test/plugin-import-export/collections/Pages.ts

GitHub Actions / int-postgres-uuid

@payloadcms/plugin-import-export › exports › should create a csv of all fields when fields is empty

TypeError: Cannot read properties of null (reading 'id') at Object.id [as customRelationship] (plugin-import-export/collections/Pages.ts:48:45) at ../packages/plugin-import-export/src/export/flattenObject.ts:63:48 at Array.forEach (<anonymous>) at forEach (../packages/plugin-import-export/src/export/flattenObject.ts:21:32) at flatten (../packages/plugin-import-export/src/export/flattenObject.ts:80:3) at ../packages/plugin-import-export/src/export/createExport.ts:174:62 at Array.map (<anonymous>) at map (../packages/plugin-import-export/src/export/createExport.ts:174:36) at ../packages/plugin-import-export/src/getExportCollection.ts:73:7 at createOperation (../packages/payload/src/collections/operations/create.ts:81:11) at Object.<anonymous> (plugin-import-export/int.spec.ts:372:19)
row[`${columnName}_email`] = value.email
},
},
function getIntegerPart(key) {
const integerPartLength = getIntegerLength(key[0])
if (integerPartLength > key.length) {
throw new Error('invalid order key: ' + key)

Check failure on line 105 in packages/payload/src/config/orderable/fractional-indexing.js

GitHub Actions / int-postgres-uuid

Sort › Local API › Orderable join › should sort join docs in the correct

invalid order key: AA at getIntegerPart (../packages/payload/src/config/orderable/fractional-indexing.js:105:11) at getIntegerPart (../packages/payload/src/config/orderable/fractional-indexing.js:123:13) at validateOrderKey (../packages/payload/src/config/orderable/fractional-indexing.js:220:5) at orderBeforeChangeHook (../packages/payload/src/config/orderable/index.ts:137:54) at createOperation (../packages/payload/src/collections/operations/create.ts:201:11) at Object.<anonymous> (sort/int.spec.ts:709:22)

Check failure on line 105 in packages/payload/src/config/orderable/fractional-indexing.js

GitHub Actions / int-postgres-uuid

Sort › Local API › Orderable join › should allow setting the order with the local API

invalid order key: AA at getIntegerPart (../packages/payload/src/config/orderable/fractional-indexing.js:105:11) at getIntegerPart (../packages/payload/src/config/orderable/fractional-indexing.js:123:13) at validateOrderKey (../packages/payload/src/config/orderable/fractional-indexing.js:220:5) at orderBeforeChangeHook (../packages/payload/src/config/orderable/index.ts:137:54) at createOperation (../packages/payload/src/collections/operations/create.ts:201:11) at Object.<anonymous> (sort/int.spec.ts:709:22)

Check failure on line 105 in packages/payload/src/config/orderable/fractional-indexing.js

GitHub Actions / int-postgres-uuid

Sort › Local API › Orderable join › should set order by default

invalid order key: AA at getIntegerPart (../packages/payload/src/config/orderable/fractional-indexing.js:105:11) at getIntegerPart (../packages/payload/src/config/orderable/fractional-indexing.js:123:13) at validateOrderKey (../packages/payload/src/config/orderable/fractional-indexing.js:220:5) at orderBeforeChangeHook (../packages/payload/src/config/orderable/index.ts:137:54) at createOperation (../packages/payload/src/collections/operations/create.ts:201:11) at Object.<anonymous> (sort/int.spec.ts:709:22)

Check failure on line 105 in packages/payload/src/config/orderable/fractional-indexing.js

GitHub Actions / int-postgres-uuid

Sort › Local API › Orderable › should not break with existing base 62 digits

invalid order key: AA at getIntegerPart (../packages/payload/src/config/orderable/fractional-indexing.js:105:11) at getIntegerPart (../packages/payload/src/config/orderable/fractional-indexing.js:123:13) at validateOrderKey (../packages/payload/src/config/orderable/fractional-indexing.js:220:5) at orderBeforeChangeHook (../packages/payload/src/config/orderable/index.ts:137:54) at createOperation (../packages/payload/src/collections/operations/create.ts:201:11) at Object.<anonymous> (sort/int.spec.ts:657:30)
}
return key.slice(0, integerPartLength)
}