From 3ad56cd86f7c9010ecef4d980b619abd64975e7a Mon Sep 17 00:00:00 2001 From: Sasha <64744993+r1tsuu@users.noreply.github.com> Date: Thu, 6 Feb 2025 23:47:53 +0200 Subject: [PATCH] fix(db-postgres): select `hasMany: true` with autosave doesn't work properly (#11012) Previously, select fields with `hasMany: true` didn't save properly in Postgres on autosave. --- packages/drizzle/src/transform/write/array.ts | 1 + .../drizzle/src/transform/write/blocks.ts | 1 + .../src/transform/write/traverseFields.ts | 11 ++++-- .../collections/SelectVersions/index.ts | 4 +-- test/fields/int.spec.ts | 34 +++++++++++++++++++ test/fields/payload-types.ts | 4 ++- 6 files changed, 50 insertions(+), 5 deletions(-) diff --git a/packages/drizzle/src/transform/write/array.ts b/packages/drizzle/src/transform/write/array.ts index e99e5b3c7..e0071d4d1 100644 --- a/packages/drizzle/src/transform/write/array.ts +++ b/packages/drizzle/src/transform/write/array.ts @@ -97,6 +97,7 @@ export const transformArray = ({ data: arrayRow, fieldPrefix: '', fields: field.flattenedFields, + insideArrayOrBlock: true, locales: newRow.locales, numbers, parentTableName: arrayTableName, diff --git a/packages/drizzle/src/transform/write/blocks.ts b/packages/drizzle/src/transform/write/blocks.ts index 74f41625e..136eb7a38 100644 --- a/packages/drizzle/src/transform/write/blocks.ts +++ b/packages/drizzle/src/transform/write/blocks.ts @@ -101,6 +101,7 @@ export const transformBlocks = ({ data: blockRow, fieldPrefix: '', fields: matchedBlock.flattenedFields, + insideArrayOrBlock: true, locales: newRow.locales, numbers, parentTableName: blockTableName, diff --git a/packages/drizzle/src/transform/write/traverseFields.ts b/packages/drizzle/src/transform/write/traverseFields.ts index 03d040b06..928432837 100644 --- a/packages/drizzle/src/transform/write/traverseFields.ts +++ b/packages/drizzle/src/transform/write/traverseFields.ts @@ -42,6 +42,10 @@ type Args = { fieldPrefix: string fields: FlattenedField[] forcedLocale?: string + /** + * Tracks whether the current traversion context is from array or block. + */ + insideArrayOrBlock?: boolean locales: { [locale: string]: Record } @@ -77,6 +81,7 @@ export const traverseFields = ({ fieldPrefix, fields, forcedLocale, + insideArrayOrBlock = false, locales, numbers, parentTableName, @@ -230,6 +235,7 @@ export const traverseFields = ({ fieldPrefix: `${fieldName}_`, fields: field.flattenedFields, forcedLocale: localeKey, + insideArrayOrBlock, locales, numbers, parentTableName, @@ -258,6 +264,7 @@ export const traverseFields = ({ existingLocales, fieldPrefix: `${fieldName}_`, fields: field.flattenedFields, + insideArrayOrBlock, locales, numbers, parentTableName, @@ -420,7 +427,7 @@ export const traverseFields = ({ Object.entries(data[field.name]).forEach(([localeKey, localeData]) => { if (Array.isArray(localeData)) { const newRows = transformSelects({ - id: data._uuid || data.id, + id: insideArrayOrBlock ? data._uuid || data.id : undefined, data: localeData, locale: localeKey, }) @@ -431,7 +438,7 @@ export const traverseFields = ({ } } else if (Array.isArray(data[field.name])) { const newRows = transformSelects({ - id: data._uuid || data.id, + id: insideArrayOrBlock ? data._uuid || data.id : undefined, data: data[field.name], locale: withinArrayOrBlockLocale, }) diff --git a/test/fields/collections/SelectVersions/index.ts b/test/fields/collections/SelectVersions/index.ts index ceb0fa064..553440ee4 100644 --- a/test/fields/collections/SelectVersions/index.ts +++ b/test/fields/collections/SelectVersions/index.ts @@ -4,12 +4,12 @@ import { selectVersionsFieldsSlug } from '../../slugs.js' const SelectVersionsFields: CollectionConfig = { slug: selectVersionsFieldsSlug, - versions: true, + versions: { drafts: { autosave: true } }, fields: [ { type: 'select', hasMany: true, - options: ['a', 'b', 'c'], + options: ['a', 'b', 'c', 'd'], name: 'hasMany', }, { diff --git a/test/fields/int.spec.ts b/test/fields/int.spec.ts index 5409945ab..5a8b1fef3 100644 --- a/test/fields/int.spec.ts +++ b/test/fields/int.spec.ts @@ -702,6 +702,40 @@ describe('Fields', () => { expect(block.blocks[0]?.hasManyBlocks).toStrictEqual(['a', 'b']) }) + + it('should work with autosave ', async () => { + let data = await payload.create({ + collection: 'select-versions-fields', + data: { hasMany: ['a', 'b', 'c'] }, + }) + expect(data.hasMany).toStrictEqual(['a', 'b', 'c']) + + data = await payload.update({ + id: data.id, + collection: 'select-versions-fields', + data: { hasMany: ['a'] }, + draft: true, + }) + expect(data.hasMany).toStrictEqual(['a']) + + data = await payload.update({ + id: data.id, + collection: 'select-versions-fields', + data: { hasMany: ['a', 'b', 'c', 'd'] }, + draft: true, + autosave: true, + }) + expect(data.hasMany).toStrictEqual(['a', 'b', 'c', 'd']) + + data = await payload.update({ + id: data.id, + collection: 'select-versions-fields', + data: { hasMany: ['a'] }, + draft: true, + autosave: true, + }) + expect(data.hasMany).toStrictEqual(['a']) + }) }) describe('number', () => { diff --git a/test/fields/payload-types.ts b/test/fields/payload-types.ts index 25952d77a..81ec226d3 100644 --- a/test/fields/payload-types.ts +++ b/test/fields/payload-types.ts @@ -487,7 +487,7 @@ export interface LexicalAccessControl { */ export interface SelectVersionsField { id: string; - hasMany?: ('a' | 'b' | 'c')[] | null; + hasMany?: ('a' | 'b' | 'c' | 'd')[] | null; array?: | { hasManyArr?: ('a' | 'b' | 'c')[] | null; @@ -504,6 +504,7 @@ export interface SelectVersionsField { | null; updatedAt: string; createdAt: string; + _status?: ('draft' | 'published') | null; } /** * This interface was referenced by `Config`'s JSON-Schema @@ -2170,6 +2171,7 @@ export interface SelectVersionsFieldsSelect { }; updatedAt?: T; createdAt?: T; + _status?: T; } /** * This interface was referenced by `Config`'s JSON-Schema