fix(richtext-lexical): get sub-block-lexical fields to work 4 out of 5 times
This commit is contained in:
@@ -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": {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -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" }]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
3
pnpm-lock.yaml
generated
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user