From 1ed66aae2f61e63130a2f32e65a66900a5120897 Mon Sep 17 00:00:00 2001 From: Sasha <64744993+r1tsuu@users.noreply.github.com> Date: Mon, 21 Oct 2024 15:51:26 +0300 Subject: [PATCH] fix(ui): unique ids for nested rows on row duplicate to prevent errors with postgres (#8790) Fixes https://github.com/payloadcms/payload/issues/8784 This works for any deep level, both arrays and blocks. --- .../src/admin/components/forms/Form/fieldReducer.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/payload/src/admin/components/forms/Form/fieldReducer.ts b/packages/payload/src/admin/components/forms/Form/fieldReducer.ts index 2ac8c143883..6e7ae670363 100644 --- a/packages/payload/src/admin/components/forms/Form/fieldReducer.ts +++ b/packages/payload/src/admin/components/forms/Form/fieldReducer.ts @@ -228,6 +228,15 @@ export function fieldReducer(state: Fields, action: FieldAction): Fields { const duplicateRowState = deepCopyObject(rows[rowIndex]) if (duplicateRowState.id) duplicateRowState.id = new ObjectID().toHexString() + for (const key of Object.keys(duplicateRowState).filter((key) => key.endsWith('.id'))) { + const idState = duplicateRowState[key] + + if (idState && typeof idState.value === 'string' && ObjectId.isValid(idState.value)) { + duplicateRowState[key].value = new ObjectId().toHexString() + duplicateRowState[key].initialValue = new ObjectId().toHexString() + } + } + // If there are subfields if (Object.keys(duplicateRowState).length > 0) { // Add new object containing subfield names to unflattenedRows array