From ca27748799a3e9e517163e210efe7c00b44af3fa Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Thu, 14 Mar 2024 16:42:08 -0400 Subject: [PATCH] fix(richtext-lexical): get sub-block-lexical fields to work 4 out of 5 times --- packages/richtext-lexical/package.json | 4 +++- .../src/field/features/blocks/feature.server.ts | 14 ++------------ .../src/generateComponentMap.tsx | 8 +++++++- .../richtext-lexical/src/generateSchemaMap.ts | 4 +++- packages/richtext-lexical/tsconfig.json | 2 +- .../utilities/buildComponentMap/mapFields.tsx | 16 ++++++++++++++-- pnpm-lock.yaml | 3 +++ 7 files changed, 33 insertions(+), 18 deletions(-) diff --git a/packages/richtext-lexical/package.json b/packages/richtext-lexical/package.json index 811719999..dc2511117 100644 --- a/packages/richtext-lexical/package.json +++ b/packages/richtext-lexical/package.json @@ -48,11 +48,13 @@ "@types/react-dom": "18.2.7", "payload": "workspace:*", "@payloadcms/translations": "workspace:*", - "@payloadcms/ui": "workspace:*" + "@payloadcms/ui": "workspace:*", + "@payloadcms/next": "workspace:*" }, "peerDependencies": { "@payloadcms/translations": "workspace:*", "@payloadcms/ui": "workspace:*", + "@payloadcms/next": "workspace:*", "payload": "workspace:*" }, "exports": { diff --git a/packages/richtext-lexical/src/field/features/blocks/feature.server.ts b/packages/richtext-lexical/src/field/features/blocks/feature.server.ts index 086d4aa45..55b3b4216 100644 --- a/packages/richtext-lexical/src/field/features/blocks/feature.server.ts +++ b/packages/richtext-lexical/src/field/features/blocks/feature.server.ts @@ -55,23 +55,13 @@ export const BlocksFeature: FeatureProviderProviderServer< return { ClientComponent: BlocksFeatureClientComponent, clientFeatureProps: clientProps, - generateSchemaMap: ({ config, props }) => { - const validRelationships = config.collections.map((c) => c.slug) || [] - + generateSchemaMap: ({ props }) => { const schemaMap: { [key: string]: Field[] } = {} for (const block of props.blocks) { - const unSanitizedFormSchema = block.fields || [] - - const formSchema = sanitizeFields({ - config, - fields: unSanitizedFormSchema, - validRelationships, - }) - - schemaMap[block.slug] = formSchema + schemaMap[block.slug] = block.fields || [] } return schemaMap diff --git a/packages/richtext-lexical/src/generateComponentMap.tsx b/packages/richtext-lexical/src/generateComponentMap.tsx index 639ef17bc..804348bd0 100644 --- a/packages/richtext-lexical/src/generateComponentMap.tsx +++ b/packages/richtext-lexical/src/generateComponentMap.tsx @@ -1,5 +1,6 @@ import type { RichTextAdapter } from 'payload/types' +import { DefaultCell } from '@payloadcms/next/views/List/Default/Cell/index.js' import { mapFields } from '@payloadcms/ui/utilities' import { sanitizeFields } from 'payload/config' import React from 'react' @@ -7,6 +8,8 @@ import React from 'react' import type { ResolvedServerFeatureMap } from './field/features/types.js' import type { GeneratedFeatureProviderComponent } from './types.js' +import { cloneDeep } from './field/lexical/utils/cloneDeep.js' + export const getGenerateComponentMap = (args: { resolvedFeatureMap: ResolvedServerFeatureMap @@ -75,13 +78,16 @@ export const getGenerateComponentMap = const sanitizedFields = sanitizeFields({ config, - fields, + fields: cloneDeep(fields), validRelationships, }) const mappedFields = mapFields({ + DefaultCell, config, + disableAddingID: true, fieldSchema: sanitizedFields, + parentPath: `${schemaPath}.feature.${featureKey}.fields.${schemaKey}`, readOnly: false, }) diff --git a/packages/richtext-lexical/src/generateSchemaMap.ts b/packages/richtext-lexical/src/generateSchemaMap.ts index 86f57a51b..2cd6ce029 100644 --- a/packages/richtext-lexical/src/generateSchemaMap.ts +++ b/packages/richtext-lexical/src/generateSchemaMap.ts @@ -4,6 +4,8 @@ import { sanitizeFields } from 'payload/config' import type { ResolvedServerFeatureMap } from './field/features/types.js' +import { cloneDeep } from './field/lexical/utils/cloneDeep.js' + export const getGenerateSchemaMap = (args: { resolvedFeatureMap: ResolvedServerFeatureMap }): RichTextAdapter['generateSchemaMap'] => ({ config, schemaMap, schemaPath }) => { @@ -28,7 +30,7 @@ export const getGenerateSchemaMap = const sanitizedFields = sanitizeFields({ config, - fields, + fields: cloneDeep(fields), validRelationships, }) diff --git a/packages/richtext-lexical/tsconfig.json b/packages/richtext-lexical/tsconfig.json index 2c7c70f41..978bb548a 100644 --- a/packages/richtext-lexical/tsconfig.json +++ b/packages/richtext-lexical/tsconfig.json @@ -21,5 +21,5 @@ "src/**/*.spec.tsx" ], "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.d.ts", "src/**/*.json"], - "references": [{ "path": "../payload" }, { "path": "../translations" }, { "path": "../ui" }] + "references": [{ "path": "../payload" }, { "path": "../translations" }, { "path": "../ui" }, { "path": "../next" }] } diff --git a/packages/ui/src/utilities/buildComponentMap/mapFields.tsx b/packages/ui/src/utilities/buildComponentMap/mapFields.tsx index ed8af02ee..6f85b8530 100644 --- a/packages/ui/src/utilities/buildComponentMap/mapFields.tsx +++ b/packages/ui/src/utilities/buildComponentMap/mapFields.tsx @@ -19,12 +19,24 @@ import { fieldTypes } from '../../forms/fields/index.js' export const mapFields = (args: { DefaultCell?: React.FC config: SanitizedConfig + /** + * If mapFields is used outside of collections, you might not want it to add an id field + */ + disableAddingID?: boolean fieldSchema: FieldWithPath[] filter?: (field: Field) => boolean parentPath?: string readOnly?: boolean }): FieldMap => { - const { DefaultCell, config, fieldSchema, filter, parentPath, readOnly: readOnlyOverride } = args + const { + DefaultCell, + config, + disableAddingID, + fieldSchema, + filter, + parentPath, + readOnly: readOnlyOverride, + } = args const result: FieldMap = fieldSchema.reduce((acc, field): FieldMap => { const fieldIsPresentational = fieldIsPresentationalOnly(field) @@ -355,7 +367,7 @@ export const mapFields = (args: { const hasID = result.findIndex(({ name, isFieldAffectingData }) => isFieldAffectingData && name === 'id') > -1 - if (!hasID) { + if (!disableAddingID && !hasID) { result.push({ name: 'id', type: 'text', diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 27f5ecf54..0e587b531 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1224,6 +1224,9 @@ importers: '@payloadcms/eslint-config': specifier: workspace:* version: link:../eslint-config-payload + '@payloadcms/next': + specifier: workspace:* + version: link:../next '@payloadcms/translations': specifier: workspace:* version: link:../translations