From e7159c033e5b80dcbdc3f3f2f56b7b5e30d8dc2b Mon Sep 17 00:00:00 2001 From: Alessio Gravili Date: Sat, 15 Jun 2024 01:42:16 -0400 Subject: [PATCH] fix(ui,richtext-*): path from context should always have precedence over path from props, even if it's an empty string (#6782) --- packages/payload/src/admin/forms/Label.ts | 1 + packages/richtext-lexical/src/field/Field.tsx | 2 +- .../richtext-slate/src/field/RichText.tsx | 2 +- packages/ui/src/fields/Array/index.tsx | 2 +- packages/ui/src/fields/Blocks/index.tsx | 2 +- packages/ui/src/fields/Checkbox/index.tsx | 2 +- packages/ui/src/fields/Code/index.tsx | 2 +- packages/ui/src/fields/Collapsible/index.tsx | 2 +- packages/ui/src/fields/DateTime/index.tsx | 6 +- packages/ui/src/fields/Email/index.tsx | 5 +- packages/ui/src/fields/JSON/index.tsx | 6 +- packages/ui/src/fields/Number/index.tsx | 2 +- packages/ui/src/fields/Point/index.tsx | 2 +- packages/ui/src/fields/RadioGroup/index.tsx | 2 +- packages/ui/src/fields/Relationship/index.tsx | 2 +- packages/ui/src/fields/Select/index.tsx | 2 +- packages/ui/src/fields/Tabs/index.tsx | 2 +- packages/ui/src/fields/Text/index.tsx | 2 +- packages/ui/src/fields/Textarea/index.tsx | 2 +- packages/ui/src/fields/Upload/index.tsx | 2 +- packages/ui/src/forms/FieldError/index.tsx | 2 +- .../ui/src/forms/FieldPropsProvider/index.tsx | 8 +- packages/ui/src/forms/withCondition/index.tsx | 2 +- .../ComponentMap/buildComponentMap/fields.tsx | 1 + test/fields/collections/Lexical/blocks.ts | 34 +++++++- .../Lexical/e2e/blocks/e2e.spec.ts | 81 +++++++++++++++++-- .../Lexical/generateLexicalRichText.ts | 16 ++++ test/fields/collections/Lexical/index.ts | 6 +- test/fields/collections/Text/CustomLabel.tsx | 7 +- 29 files changed, 163 insertions(+), 44 deletions(-) diff --git a/packages/payload/src/admin/forms/Label.ts b/packages/payload/src/admin/forms/Label.ts index 61ed75eb6..37ac85cbe 100644 --- a/packages/payload/src/admin/forms/Label.ts +++ b/packages/payload/src/admin/forms/Label.ts @@ -4,6 +4,7 @@ export type LabelProps = { htmlFor?: string label?: Record | string required?: boolean + schemaPath?: string unstyled?: boolean } diff --git a/packages/richtext-lexical/src/field/Field.tsx b/packages/richtext-lexical/src/field/Field.tsx index ff0a381f1..b1eca441e 100644 --- a/packages/richtext-lexical/src/field/Field.tsx +++ b/packages/richtext-lexical/src/field/Field.tsx @@ -59,7 +59,7 @@ const _RichText: React.FC< const { path: pathFromContext } = useFieldProps() const fieldType = useField({ - path: pathFromContext || pathFromProps || name, + path: pathFromContext ?? pathFromProps ?? name, validate: memoizedValidate, }) diff --git a/packages/richtext-slate/src/field/RichText.tsx b/packages/richtext-slate/src/field/RichText.tsx index b96ac8ce4..35d01bbfd 100644 --- a/packages/richtext-slate/src/field/RichText.tsx +++ b/packages/richtext-slate/src/field/RichText.tsx @@ -106,7 +106,7 @@ const RichTextField: React.FC< const { formInitializing, initialValue, path, schemaPath, setValue, showError, value } = useField( { - path: pathFromContext || pathFromProps || name, + path: pathFromContext ?? pathFromProps ?? name, validate: memoizedValidate, }, ) diff --git a/packages/ui/src/fields/Array/index.tsx b/packages/ui/src/fields/Array/index.tsx index 5ae47cfea..aa5df627b 100644 --- a/packages/ui/src/fields/Array/index.tsx +++ b/packages/ui/src/fields/Array/index.tsx @@ -125,7 +125,7 @@ export const _ArrayField: React.FC = (props) => { value, } = useField({ hasRows: true, - path: pathFromContext || pathFromProps || name, + path: pathFromContext ?? pathFromProps ?? name, validate: memoizedValidate, }) diff --git a/packages/ui/src/fields/Blocks/index.tsx b/packages/ui/src/fields/Blocks/index.tsx index 416d113b6..eafbc1c95 100644 --- a/packages/ui/src/fields/Blocks/index.tsx +++ b/packages/ui/src/fields/Blocks/index.tsx @@ -128,7 +128,7 @@ const _BlocksField: React.FC = (props) => { value, } = useField({ hasRows: true, - path: pathFromContext || pathFromProps || name, + path: pathFromContext ?? pathFromProps ?? name, validate: memoizedValidate, }) diff --git a/packages/ui/src/fields/Checkbox/index.tsx b/packages/ui/src/fields/Checkbox/index.tsx index 99b207012..d349f4f44 100644 --- a/packages/ui/src/fields/Checkbox/index.tsx +++ b/packages/ui/src/fields/Checkbox/index.tsx @@ -65,7 +65,7 @@ const CheckboxField: React.FC = (props) => { const { formInitializing, formProcessing, path, setValue, showError, value } = useField({ disableFormData, - path: pathFromContext || pathFromProps || name, + path: pathFromContext ?? pathFromProps ?? name, validate: memoizedValidate, }) diff --git a/packages/ui/src/fields/Code/index.tsx b/packages/ui/src/fields/Code/index.tsx index 57d37a8c2..04810af86 100644 --- a/packages/ui/src/fields/Code/index.tsx +++ b/packages/ui/src/fields/Code/index.tsx @@ -66,7 +66,7 @@ const CodeField: React.FC = (props) => { const { path: pathFromContext, readOnly: readOnlyFromContext } = useFieldProps() const { formInitializing, formProcessing, path, setValue, showError, value } = useField({ - path: pathFromContext || pathFromProps || name, + path: pathFromContext ?? pathFromProps ?? name, validate: memoizedValidate, }) diff --git a/packages/ui/src/fields/Collapsible/index.tsx b/packages/ui/src/fields/Collapsible/index.tsx index 00b94949a..af50eb13a 100644 --- a/packages/ui/src/fields/Collapsible/index.tsx +++ b/packages/ui/src/fields/Collapsible/index.tsx @@ -57,7 +57,7 @@ const CollapsibleField: React.FC = (props) => { const formInitializing = useFormInitializing() const formProcessing = useFormProcessing() - const path = pathFromContext || pathFromProps + const path = pathFromContext ?? pathFromProps const { i18n } = useTranslation() const { getPreference, setPreference } = usePreferences() diff --git a/packages/ui/src/fields/DateTime/index.tsx b/packages/ui/src/fields/DateTime/index.tsx index 8e40520fc..9706546d3 100644 --- a/packages/ui/src/fields/DateTime/index.tsx +++ b/packages/ui/src/fields/DateTime/index.tsx @@ -1,6 +1,6 @@ /* eslint-disable react/destructuring-assignment */ 'use client' -import type { ClientValidate } from 'payload/types' +import type { ClientValidate, DateField } from 'payload/types' import { getTranslation } from '@payloadcms/translations' import React, { useCallback } from 'react' @@ -14,8 +14,6 @@ import './index.scss' const baseClass = 'date-time-field' -import type { DateField } from 'payload/types' - import type { FormFieldBase } from '../shared/index.js' import { FieldDescription } from '../../forms/FieldDescription/index.js' @@ -68,7 +66,7 @@ const DateTimeField: React.FC = (props) => { const { path: pathFromContext, readOnly: readOnlyFromContext } = useFieldProps() const { formInitializing, formProcessing, path, setValue, showError, value } = useField({ - path: pathFromContext || pathFromProps || name, + path: pathFromContext ?? pathFromProps ?? name, validate: memoizedValidate, }) diff --git a/packages/ui/src/fields/Email/index.tsx b/packages/ui/src/fields/Email/index.tsx index 0b01b597b..26520ac4b 100644 --- a/packages/ui/src/fields/Email/index.tsx +++ b/packages/ui/src/fields/Email/index.tsx @@ -1,6 +1,5 @@ 'use client' -import type { ClientValidate } from 'payload/types' -import type { EmailField as EmailFieldType } from 'payload/types' +import type { ClientValidate, EmailField as EmailFieldType } from 'payload/types' import { getTranslation } from '@payloadcms/translations' import React, { useCallback } from 'react' @@ -62,7 +61,7 @@ const EmailField: React.FC = (props) => { const { path: pathFromContext, readOnly: readOnlyFromContext } = useFieldProps() const { formInitializing, formProcessing, path, setValue, showError, value } = useField({ - path: pathFromContext || pathFromProps || name, + path: pathFromContext ?? pathFromProps ?? name, validate: memoizedValidate, }) diff --git a/packages/ui/src/fields/JSON/index.tsx b/packages/ui/src/fields/JSON/index.tsx index 8d8325b73..b96667aa4 100644 --- a/packages/ui/src/fields/JSON/index.tsx +++ b/packages/ui/src/fields/JSON/index.tsx @@ -1,5 +1,5 @@ 'use client' -import type { ClientValidate } from 'payload/types' +import type { ClientValidate, JSONField as JSONFieldType } from 'payload/types' import React, { useCallback, useEffect, useState } from 'react' @@ -12,8 +12,6 @@ import './index.scss' const baseClass = 'json-field' -import type { JSONField as JSONFieldType } from 'payload/types' - import type { FormFieldBase } from '../shared/index.js' import { FieldDescription } from '../../forms/FieldDescription/index.js' @@ -67,7 +65,7 @@ const JSONFieldComponent: React.FC = (props) => { const { formInitializing, formProcessing, initialValue, path, setValue, showError, value } = useField({ - path: pathFromContext || pathFromProps || name, + path: pathFromContext ?? pathFromProps ?? name, validate: memoizedValidate, }) diff --git a/packages/ui/src/fields/Number/index.tsx b/packages/ui/src/fields/Number/index.tsx index a052cd764..645e3b44a 100644 --- a/packages/ui/src/fields/Number/index.tsx +++ b/packages/ui/src/fields/Number/index.tsx @@ -77,7 +77,7 @@ const NumberFieldComponent: React.FC = (props) => { const { formInitializing, formProcessing, path, setValue, showError, value } = useField< number | number[] >({ - path: pathFromContext || pathFromProps || name, + path: pathFromContext ?? pathFromProps ?? name, validate: memoizedValidate, }) diff --git a/packages/ui/src/fields/Point/index.tsx b/packages/ui/src/fields/Point/index.tsx index c9e911716..686915479 100644 --- a/packages/ui/src/fields/Point/index.tsx +++ b/packages/ui/src/fields/Point/index.tsx @@ -71,7 +71,7 @@ const PointField: React.FC = (props) => { showError, value = [null, null], } = useField<[number, number]>({ - path: pathFromContext || pathFromProps || name, + path: pathFromContext ?? pathFromProps ?? name, validate: memoizedValidate, }) diff --git a/packages/ui/src/fields/RadioGroup/index.tsx b/packages/ui/src/fields/RadioGroup/index.tsx index 4d8c7edf8..ea88c5751 100644 --- a/packages/ui/src/fields/RadioGroup/index.tsx +++ b/packages/ui/src/fields/RadioGroup/index.tsx @@ -77,7 +77,7 @@ const RadioGroupField: React.FC = (props) => { showError, value: valueFromContext, } = useField({ - path: pathFromContext || pathFromProps || name, + path: pathFromContext ?? pathFromProps ?? name, validate: memoizedValidate, }) diff --git a/packages/ui/src/fields/Relationship/index.tsx b/packages/ui/src/fields/Relationship/index.tsx index c931102bf..5283478a9 100644 --- a/packages/ui/src/fields/Relationship/index.tsx +++ b/packages/ui/src/fields/Relationship/index.tsx @@ -102,7 +102,7 @@ const RelationshipField: React.FC = (props) => { showError, value, } = useField({ - path: pathFromContext || pathFromProps || name, + path: pathFromContext ?? pathFromProps ?? name, validate: memoizedValidate, }) diff --git a/packages/ui/src/fields/Select/index.tsx b/packages/ui/src/fields/Select/index.tsx index 3eddf8834..4fd3b5732 100644 --- a/packages/ui/src/fields/Select/index.tsx +++ b/packages/ui/src/fields/Select/index.tsx @@ -76,7 +76,7 @@ const SelectField: React.FC = (props) => { const { path: pathFromContext, readOnly: readOnlyFromContext } = useFieldProps() const { formInitializing, formProcessing, path, setValue, showError, value } = useField({ - path: pathFromContext || pathFromProps || name, + path: pathFromContext ?? pathFromProps ?? name, validate: memoizedValidate, }) diff --git a/packages/ui/src/fields/Tabs/index.tsx b/packages/ui/src/fields/Tabs/index.tsx index 6c10d9abb..df0357049 100644 --- a/packages/ui/src/fields/Tabs/index.tsx +++ b/packages/ui/src/fields/Tabs/index.tsx @@ -56,7 +56,7 @@ const TabsField: React.FC = (props) => { } = useFieldProps() const readOnly = readOnlyFromProps || readOnlyFromContext - const path = pathFromContext || pathFromProps || name + const path = pathFromContext ?? pathFromProps ?? name const { getPreference, setPreference } = usePreferences() const { preferencesKey } = useDocumentInfo() const { i18n } = useTranslation() diff --git a/packages/ui/src/fields/Text/index.tsx b/packages/ui/src/fields/Text/index.tsx index f3292f90f..bf9da4c96 100644 --- a/packages/ui/src/fields/Text/index.tsx +++ b/packages/ui/src/fields/Text/index.tsx @@ -62,7 +62,7 @@ const TextField: React.FC = (props) => { const { path: pathFromContext, readOnly: readOnlyFromContext } = useFieldProps() const { formInitializing, formProcessing, path, setValue, showError, value } = useField({ - path: pathFromContext || pathFromProps || name, + path: pathFromContext ?? pathFromProps ?? name, validate: memoizedValidate, }) diff --git a/packages/ui/src/fields/Textarea/index.tsx b/packages/ui/src/fields/Textarea/index.tsx index 7480482b6..b67bfb4ec 100644 --- a/packages/ui/src/fields/Textarea/index.tsx +++ b/packages/ui/src/fields/Textarea/index.tsx @@ -68,7 +68,7 @@ const TextareaField: React.FC = (props) => { const { path: pathFromContext, readOnly: readOnlyFromContext } = useFieldProps() const { formInitializing, formProcessing, path, setValue, showError, value } = useField({ - path: pathFromContext || pathFromProps || name, + path: pathFromContext ?? pathFromProps ?? name, validate: memoizedValidate, }) diff --git a/packages/ui/src/fields/Upload/index.tsx b/packages/ui/src/fields/Upload/index.tsx index 076a9fe7a..d25f0ef0c 100644 --- a/packages/ui/src/fields/Upload/index.tsx +++ b/packages/ui/src/fields/Upload/index.tsx @@ -55,7 +55,7 @@ const _Upload: React.FC = (props) => { const { filterOptions, formInitializing, formProcessing, path, setValue, showError, value } = useField({ - path: pathFromContext || pathFromProps, + path: pathFromContext ?? pathFromProps, validate: memoizedValidate, }) diff --git a/packages/ui/src/forms/FieldError/index.tsx b/packages/ui/src/forms/FieldError/index.tsx index b6ebbf7a2..a4bc80f40 100644 --- a/packages/ui/src/forms/FieldError/index.tsx +++ b/packages/ui/src/forms/FieldError/index.tsx @@ -20,7 +20,7 @@ const DefaultFieldError: React.FC = (props) => { } = props const { path: pathFromContext } = useFieldProps() - const path = pathFromContext || pathFromProps + const path = pathFromContext ?? pathFromProps const hasSubmitted = useFormSubmitted() const field = useFormFields(([fields]) => (fields && fields?.[path]) || null) diff --git a/packages/ui/src/forms/FieldPropsProvider/index.tsx b/packages/ui/src/forms/FieldPropsProvider/index.tsx index d47f92e7a..e06605fd1 100644 --- a/packages/ui/src/forms/FieldPropsProvider/index.tsx +++ b/packages/ui/src/forms/FieldPropsProvider/index.tsx @@ -18,13 +18,13 @@ export type FieldPropsContextType = { } const FieldPropsContext = React.createContext({ - type: '' as keyof FieldTypes, + type: undefined as keyof FieldTypes, custom: {}, - indexPath: '', - path: '', + indexPath: undefined, + path: undefined, permissions: {} as FieldPermissions, readOnly: false, - schemaPath: '', + schemaPath: undefined, siblingPermissions: {}, }) diff --git a/packages/ui/src/forms/withCondition/index.tsx b/packages/ui/src/forms/withCondition/index.tsx index 6c213bd07..7728a3468 100644 --- a/packages/ui/src/forms/withCondition/index.tsx +++ b/packages/ui/src/forms/withCondition/index.tsx @@ -10,7 +10,7 @@ export const withCondition =

>( const CheckForCondition: React.FC

= (props) => { const { name } = props const { type, indexPath, path: pathFromContext } = useFieldProps() - const path = pathFromContext || name + const path = pathFromContext ?? name return ( diff --git a/packages/ui/src/providers/ComponentMap/buildComponentMap/fields.tsx b/packages/ui/src/providers/ComponentMap/buildComponentMap/fields.tsx index d5a94ef1b..dc7b8fd9e 100644 --- a/packages/ui/src/providers/ComponentMap/buildComponentMap/fields.tsx +++ b/packages/ui/src/providers/ComponentMap/buildComponentMap/fields.tsx @@ -144,6 +144,7 @@ export const mapFields = (args: { const labelProps: LabelProps = { label, required: 'required' in field ? field.required : undefined, + schemaPath: path, } const CustomLabelComponent = diff --git a/test/fields/collections/Lexical/blocks.ts b/test/fields/collections/Lexical/blocks.ts index b93257995..2df81d59c 100644 --- a/test/fields/collections/Lexical/blocks.ts +++ b/test/fields/collections/Lexical/blocks.ts @@ -1,7 +1,6 @@ import type { ArrayField, Block } from 'payload/types' -import { BlocksFeature, FixedToolbarFeature } from '@payloadcms/richtext-lexical' -import { lexicalEditor } from '@payloadcms/richtext-lexical' +import { BlocksFeature, FixedToolbarFeature, lexicalEditor } from '@payloadcms/richtext-lexical' import { textFieldsSlug } from '../Text/shared.js' @@ -251,3 +250,34 @@ export const SubBlockBlock: Block = { }, ], } + +export const TabBlock: Block = { + slug: 'tabBlock', + fields: [ + { + type: 'tabs', + tabs: [ + { + label: 'Tab1', + name: 'tab1', + fields: [ + { + name: 'text1', + type: 'text', + }, + ], + }, + { + label: 'Tab2', + name: 'tab2', + fields: [ + { + name: 'text2', + type: 'text', + }, + ], + }, + ], + }, + ], +} diff --git a/test/fields/collections/Lexical/e2e/blocks/e2e.spec.ts b/test/fields/collections/Lexical/e2e/blocks/e2e.spec.ts index aed801316..4331f5399 100644 --- a/test/fields/collections/Lexical/e2e/blocks/e2e.spec.ts +++ b/test/fields/collections/Lexical/e2e/blocks/e2e.spec.ts @@ -500,7 +500,7 @@ describe('lexicalBlocks', () => { const newRichTextBlock = richTextField .locator('.lexical-block:not(.lexical-block .lexical-block)') - .last() // The :not(.lexical-block .lexical-block) makes sure this does not select sub-blocks + .nth(8) // The :not(.lexical-block .lexical-block) makes sure this does not select sub-blocks await newRichTextBlock.scrollIntoViewIfNeeded() await expect(newRichTextBlock).toBeVisible() @@ -888,13 +888,9 @@ describe('lexicalBlocks', () => { test('should respect required error state in deeply nested text field', async () => { await navigateToLexicalFields() - await wait(300) const richTextField = page.locator('.rich-text-lexical').nth(1) // second - await wait(300) await richTextField.scrollIntoViewIfNeeded() - await wait(300) - await expect(richTextField).toBeVisible() await wait(300) @@ -937,5 +933,80 @@ describe('lexicalBlocks', () => { await expect(requiredTooltip).toBeInViewport() // toBeVisible() doesn't work for some reason }) + + // Reproduces https://github.com/payloadcms/payload/issues/6631 + test('ensure tabs field within lexical block correctly loads and saves data', async () => { + await navigateToLexicalFields() + const richTextField = page.locator('.rich-text-lexical').nth(1) // second + + await richTextField.scrollIntoViewIfNeeded() + await expect(richTextField).toBeVisible() + + const tabsBlock = richTextField.locator('.lexical-block').nth(8) + await wait(300) + + await tabsBlock.scrollIntoViewIfNeeded() + await wait(300) + + await expect(tabsBlock).toBeVisible() + await wait(300) + + const tab1Text1Field = tabsBlock.locator('#field-tab1__text1') + await tab1Text1Field.scrollIntoViewIfNeeded() + await expect(tab1Text1Field).toBeVisible() + await expect(tab1Text1Field).toHaveValue('Some text1') + // change text to 'Some text1 changed' + await tab1Text1Field.fill('Some text1 changed') + + const tab1Button = tabsBlock.locator('.tabs-field__tab-button', { hasText: 'Tab1' }) + const tab2Button = tabsBlock.locator('.tabs-field__tab-button', { hasText: 'Tab2' }) + + await tab2Button.click() + await wait(300) + + const tab2Text1Field = tabsBlock.locator('#field-tab2__text2') + await tab2Text1Field.scrollIntoViewIfNeeded() + await expect(tab2Text1Field).toBeVisible() + await expect(tab2Text1Field).toHaveValue('Some text2') + // change text to 'Some text2 changed' + await tab2Text1Field.fill('Some text2 changed') + await wait(300) + + await saveDocAndAssert(page) + await wait(300) + await tabsBlock.scrollIntoViewIfNeeded() + await wait(300) + await expect(tabsBlock).toBeVisible() + await wait(300) + + await tab1Button.click() + await expect(tab1Text1Field).toHaveValue('Some text1 changed') + await tab2Button.click() + await expect(tab2Text1Field).toHaveValue('Some text2 changed') + + await expect(async () => { + const lexicalDoc: LexicalField = ( + await payload.find({ + collection: lexicalFieldsSlug, + depth: 0, + overrideAccess: true, + where: { + title: { + equals: lexicalDocData.title, + }, + }, + }) + ).docs[0] as never + + const lexicalField: SerializedEditorState = lexicalDoc.lexicalWithBlocks + const tabBlockData: SerializedBlockNode = lexicalField.root + .children[13] as SerializedBlockNode + + expect(tabBlockData.fields.tab1.text1).toBe('Some text1 changed') + expect(tabBlockData.fields.tab2.text2).toBe('Some text2 changed') + }).toPass({ + timeout: POLL_TOPASS_TIMEOUT, + }) + }) }) }) diff --git a/test/fields/collections/Lexical/generateLexicalRichText.ts b/test/fields/collections/Lexical/generateLexicalRichText.ts index 2bbd10a04..c14ed2613 100644 --- a/test/fields/collections/Lexical/generateLexicalRichText.ts +++ b/test/fields/collections/Lexical/generateLexicalRichText.ts @@ -273,6 +273,22 @@ export function generateLexicalRichText() { type: 'paragraph', version: 1, }, + { + format: '', + type: 'block', + version: 2, + fields: { + id: '666c9dfd189d72626ea301f9', + blockName: '', + tab1: { + text1: 'Some text1', + }, + tab2: { + text2: 'Some text2', + }, + blockType: 'tabBlock', + }, + }, ], direction: 'ltr', }, diff --git a/test/fields/collections/Lexical/index.ts b/test/fields/collections/Lexical/index.ts index aaedaf4c0..fcedcf93c 100644 --- a/test/fields/collections/Lexical/index.ts +++ b/test/fields/collections/Lexical/index.ts @@ -4,8 +4,6 @@ import type { CollectionConfig } from 'payload/types' import { createHeadlessEditor } from '@lexical/headless' import { $convertToMarkdownString } from '@lexical/markdown' -import { getEnabledNodes } from '@payloadcms/richtext-lexical' -import { sanitizeServerEditorConfig } from '@payloadcms/richtext-lexical' import { BlocksFeature, FixedToolbarFeature, @@ -14,7 +12,9 @@ import { TreeViewFeature, UploadFeature, defaultEditorFeatures, + getEnabledNodes, lexicalEditor, + sanitizeServerEditorConfig, } from '@payloadcms/richtext-lexical' import { lexicalFieldsSlug } from '../../slugs.js' @@ -26,6 +26,7 @@ import { RichTextBlock, SelectFieldBlock, SubBlockBlock, + TabBlock, TextBlock, UploadAndRichTextBlock, } from './blocks.js' @@ -77,6 +78,7 @@ const editorConfig: ServerEditorConfig = { SubBlockBlock, RadioButtonsBlock, ConditionalLayoutBlock, + TabBlock, ], }), ], diff --git a/test/fields/collections/Text/CustomLabel.tsx b/test/fields/collections/Text/CustomLabel.tsx index c1a80946d..02a10e595 100644 --- a/test/fields/collections/Text/CustomLabel.tsx +++ b/test/fields/collections/Text/CustomLabel.tsx @@ -3,8 +3,11 @@ import { useFieldProps } from '@payloadcms/ui/forms/FieldPropsProvider' import React from 'react' -const CustomLabel = () => { - const { path } = useFieldProps() +const CustomLabel = ({ schemaPath }) => { + const { path: pathFromContext } = useFieldProps() + + const path = pathFromContext ?? schemaPath // pathFromContext will be undefined in list view + return (