From 516ada5d2362ba57a200e359d0d19c610cb3fa6a Mon Sep 17 00:00:00 2001 From: Per-Kristian Nordnes Date: Thu, 9 May 2024 11:18:45 +0200 Subject: [PATCH] fix(core/form): prevent onFocus for root object paths being called by editing form (#6610) This will prevent any input calling element.onFocus() on any opened block or inline-object inside the PT-input, as that will close the editing modal for them (through DocumentPaneProvider) --- .../hooks/usePortableTextMembers.tsx | 23 ++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/packages/sanity/src/core/form/inputs/PortableText/hooks/usePortableTextMembers.tsx b/packages/sanity/src/core/form/inputs/PortableText/hooks/usePortableTextMembers.tsx index a29af365b32..f64a1f3aa02 100644 --- a/packages/sanity/src/core/form/inputs/PortableText/hooks/usePortableTextMembers.tsx +++ b/packages/sanity/src/core/form/inputs/PortableText/hooks/usePortableTextMembers.tsx @@ -1,4 +1,4 @@ -import {pathFor} from '@sanity/util/paths' +import {isEqual, pathFor} from '@sanity/util/paths' import {createRef, type MutableRefObject, type ReactNode, useContext, useRef} from 'react' import {PortableTextMemberItemsContext} from 'sanity/_singletons' @@ -7,7 +7,7 @@ import {type FIXME} from '../../../../FIXME' import {FormInput} from '../../../components' import {isMemberArrayOfObjects} from '../../../members/object/fields/asserters' import {type ArrayOfObjectsItemMember, type ObjectFormNode} from '../../../store' -import {type PortableTextInputProps} from '../../../types' +import {type ObjectInputProps, type PortableTextInputProps} from '../../../types' import {isArrayOfObjectsFieldMember, isBlockType} from '../_helpers' import {type PortableTextEditorElement} from '../Compositor' import {type PortableTextMemberItem} from '../PortableTextInput' @@ -130,6 +130,23 @@ const reconcilePortableTextMembers = ({ let input: ReactNode = null if ((isObject && item.member !== existingItem?.member) || item.node !== existingItem?.node) { + // Render input with onFocus noop for calling elementProps.onFocus directly on the editor nodes themselves + // This is to avoid closing the editing modal for them in the PT-input setting. + const _renderInput = (renderInputProps: ObjectInputProps) => { + const isObjectInputPath = isEqual(renderInputProps.path, item.member.item.path) + if (isObjectInputPath) { + return renderInput({ + ...renderInputProps, + elementProps: { + ...renderInputProps.elementProps, + onFocus: () => { + // no-op + }, + }, + }) + } + return renderInput(renderInputProps) + } const inputProps = { absolutePath: pathFor(item.node.path), includeField: false, @@ -139,7 +156,7 @@ const reconcilePortableTextMembers = ({ renderBlock, renderField, renderInlineBlock, - renderInput, + renderInput: _renderInput, renderItem, renderPreview, schemaType,