fix(richtext-lexical): get sub-block-lexical fields to work 4 out of 5 times

This commit is contained in:
Alessio Gravili
2024-03-14 16:42:08 -04:00
parent 2dc98f682f
commit ca27748799
7 changed files with 33 additions and 18 deletions

View File

@@ -48,11 +48,13 @@
"@types/react-dom": "18.2.7", "@types/react-dom": "18.2.7",
"payload": "workspace:*", "payload": "workspace:*",
"@payloadcms/translations": "workspace:*", "@payloadcms/translations": "workspace:*",
"@payloadcms/ui": "workspace:*" "@payloadcms/ui": "workspace:*",
"@payloadcms/next": "workspace:*"
}, },
"peerDependencies": { "peerDependencies": {
"@payloadcms/translations": "workspace:*", "@payloadcms/translations": "workspace:*",
"@payloadcms/ui": "workspace:*", "@payloadcms/ui": "workspace:*",
"@payloadcms/next": "workspace:*",
"payload": "workspace:*" "payload": "workspace:*"
}, },
"exports": { "exports": {

View File

@@ -55,23 +55,13 @@ export const BlocksFeature: FeatureProviderProviderServer<
return { return {
ClientComponent: BlocksFeatureClientComponent, ClientComponent: BlocksFeatureClientComponent,
clientFeatureProps: clientProps, clientFeatureProps: clientProps,
generateSchemaMap: ({ config, props }) => { generateSchemaMap: ({ props }) => {
const validRelationships = config.collections.map((c) => c.slug) || []
const schemaMap: { const schemaMap: {
[key: string]: Field[] [key: string]: Field[]
} = {} } = {}
for (const block of props.blocks) { for (const block of props.blocks) {
const unSanitizedFormSchema = block.fields || [] schemaMap[block.slug] = block.fields || []
const formSchema = sanitizeFields({
config,
fields: unSanitizedFormSchema,
validRelationships,
})
schemaMap[block.slug] = formSchema
} }
return schemaMap return schemaMap

View File

@@ -1,5 +1,6 @@
import type { RichTextAdapter } from 'payload/types' import type { RichTextAdapter } from 'payload/types'
import { DefaultCell } from '@payloadcms/next/views/List/Default/Cell/index.js'
import { mapFields } from '@payloadcms/ui/utilities' import { mapFields } from '@payloadcms/ui/utilities'
import { sanitizeFields } from 'payload/config' import { sanitizeFields } from 'payload/config'
import React from 'react' import React from 'react'
@@ -7,6 +8,8 @@ import React from 'react'
import type { ResolvedServerFeatureMap } from './field/features/types.js' import type { ResolvedServerFeatureMap } from './field/features/types.js'
import type { GeneratedFeatureProviderComponent } from './types.js' import type { GeneratedFeatureProviderComponent } from './types.js'
import { cloneDeep } from './field/lexical/utils/cloneDeep.js'
export const getGenerateComponentMap = export const getGenerateComponentMap =
(args: { (args: {
resolvedFeatureMap: ResolvedServerFeatureMap resolvedFeatureMap: ResolvedServerFeatureMap
@@ -75,13 +78,16 @@ export const getGenerateComponentMap =
const sanitizedFields = sanitizeFields({ const sanitizedFields = sanitizeFields({
config, config,
fields, fields: cloneDeep(fields),
validRelationships, validRelationships,
}) })
const mappedFields = mapFields({ const mappedFields = mapFields({
DefaultCell,
config, config,
disableAddingID: true,
fieldSchema: sanitizedFields, fieldSchema: sanitizedFields,
parentPath: `${schemaPath}.feature.${featureKey}.fields.${schemaKey}`,
readOnly: false, readOnly: false,
}) })

View File

@@ -4,6 +4,8 @@ import { sanitizeFields } from 'payload/config'
import type { ResolvedServerFeatureMap } from './field/features/types.js' import type { ResolvedServerFeatureMap } from './field/features/types.js'
import { cloneDeep } from './field/lexical/utils/cloneDeep.js'
export const getGenerateSchemaMap = export const getGenerateSchemaMap =
(args: { resolvedFeatureMap: ResolvedServerFeatureMap }): RichTextAdapter['generateSchemaMap'] => (args: { resolvedFeatureMap: ResolvedServerFeatureMap }): RichTextAdapter['generateSchemaMap'] =>
({ config, schemaMap, schemaPath }) => { ({ config, schemaMap, schemaPath }) => {
@@ -28,7 +30,7 @@ export const getGenerateSchemaMap =
const sanitizedFields = sanitizeFields({ const sanitizedFields = sanitizeFields({
config, config,
fields, fields: cloneDeep(fields),
validRelationships, validRelationships,
}) })

View File

@@ -21,5 +21,5 @@
"src/**/*.spec.tsx" "src/**/*.spec.tsx"
], ],
"include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.d.ts", "src/**/*.json"], "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" }]
} }

View File

@@ -19,12 +19,24 @@ import { fieldTypes } from '../../forms/fields/index.js'
export const mapFields = (args: { export const mapFields = (args: {
DefaultCell?: React.FC<any> DefaultCell?: React.FC<any>
config: SanitizedConfig config: SanitizedConfig
/**
* If mapFields is used outside of collections, you might not want it to add an id field
*/
disableAddingID?: boolean
fieldSchema: FieldWithPath[] fieldSchema: FieldWithPath[]
filter?: (field: Field) => boolean filter?: (field: Field) => boolean
parentPath?: string parentPath?: string
readOnly?: boolean readOnly?: boolean
}): FieldMap => { }): 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 result: FieldMap = fieldSchema.reduce((acc, field): FieldMap => {
const fieldIsPresentational = fieldIsPresentationalOnly(field) const fieldIsPresentational = fieldIsPresentationalOnly(field)
@@ -355,7 +367,7 @@ export const mapFields = (args: {
const hasID = const hasID =
result.findIndex(({ name, isFieldAffectingData }) => isFieldAffectingData && name === 'id') > -1 result.findIndex(({ name, isFieldAffectingData }) => isFieldAffectingData && name === 'id') > -1
if (!hasID) { if (!disableAddingID && !hasID) {
result.push({ result.push({
name: 'id', name: 'id',
type: 'text', type: 'text',

3
pnpm-lock.yaml generated
View File

@@ -1224,6 +1224,9 @@ importers:
'@payloadcms/eslint-config': '@payloadcms/eslint-config':
specifier: workspace:* specifier: workspace:*
version: link:../eslint-config-payload version: link:../eslint-config-payload
'@payloadcms/next':
specifier: workspace:*
version: link:../next
'@payloadcms/translations': '@payloadcms/translations':
specifier: workspace:* specifier: workspace:*
version: link:../translations version: link:../translations