diff --git a/packages/payload/src/config/orderable/index.ts b/packages/payload/src/config/orderable/index.ts index c09de82a12..26b22f7cd9 100644 --- a/packages/payload/src/config/orderable/index.ts +++ b/packages/payload/src/config/orderable/index.ts @@ -83,6 +83,13 @@ export const addOrderableFieldsAndHook = ( hidden: true, readOnly: true, }, + hooks: { + beforeDuplicate: [ + ({ siblingData }) => { + delete siblingData[orderableFieldName] + }, + ], + }, index: true, required: true, // override the schema to make order fields optional for payload.create() @@ -275,5 +282,6 @@ export const addOrderableEndpoint = (config: SanitizedConfig) => { if (!config.endpoints) { config.endpoints = [] } + config.endpoints.push(reorderEndpoint) } diff --git a/test/sort/int.spec.ts b/test/sort/int.spec.ts index 0fea47ee92..7064181cac 100644 --- a/test/sort/int.spec.ts +++ b/test/sort/int.spec.ts @@ -444,6 +444,43 @@ describe('Sort', () => { parseInt(ordered.docs[1]._order, 16), ) }) + + it('should allow to duplicate with reordable', async () => { + const doc = await payload.create({ + collection: 'orderable', + data: { title: 'new document' }, + }) + + const docDuplicated = await payload.create({ + duplicateFromID: doc.id, + collection: 'orderable', + data: {}, + }) + expect(docDuplicated.title).toBe('new document') + expect(parseInt(doc._order!, 16)).toBeLessThan(parseInt(docDuplicated._order!, 16)) + + await restClient.POST('/reorder', { + body: JSON.stringify({ + collectionSlug: orderableSlug, + docsToMove: [doc.id], + newKeyWillBe: 'greater', + orderableFieldName: '_order', + target: { + id: docDuplicated.id, + key: docDuplicated._order, + }, + }), + }) + + const docAfterReorder = await payload.findByID({ collection: 'orderable', id: doc.id }) + const docDuplicatedAfterReorder = await payload.findByID({ + collection: 'orderable', + id: docDuplicated.id, + }) + expect(parseInt(docAfterReorder._order!, 16)).toBeGreaterThan( + parseInt(docDuplicatedAfterReorder._order!, 16), + ) + }) }) describe('Orderable join', () => {