@strapi/content-manager 5.31.2 → 5.32.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/components/ConfigurationForm/EditFieldForm.js +1 -0
- package/dist/admin/components/ConfigurationForm/EditFieldForm.js.map +1 -1
- package/dist/admin/components/ConfigurationForm/EditFieldForm.mjs +1 -0
- package/dist/admin/components/ConfigurationForm/EditFieldForm.mjs.map +1 -1
- package/dist/admin/components/ConfigurationForm/Fields.js +2 -0
- package/dist/admin/components/ConfigurationForm/Fields.js.map +1 -1
- package/dist/admin/components/ConfigurationForm/Fields.mjs +2 -0
- package/dist/admin/components/ConfigurationForm/Fields.mjs.map +1 -1
- package/dist/admin/components/ConfigurationForm/Form.js +1 -1
- package/dist/admin/components/ConfigurationForm/Form.js.map +1 -1
- package/dist/admin/components/ConfigurationForm/Form.mjs +1 -1
- package/dist/admin/components/ConfigurationForm/Form.mjs.map +1 -1
- package/dist/admin/history/components/VersionContent.js +0 -3
- package/dist/admin/history/components/VersionContent.js.map +1 -1
- package/dist/admin/history/components/VersionContent.mjs +0 -3
- package/dist/admin/history/components/VersionContent.mjs.map +1 -1
- package/dist/admin/pages/EditView/EditViewPage.js +2 -2
- package/dist/admin/pages/EditView/EditViewPage.js.map +1 -1
- package/dist/admin/pages/EditView/EditViewPage.mjs +2 -2
- package/dist/admin/pages/EditView/EditViewPage.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/DocumentActions.js +52 -64
- package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
- package/dist/admin/pages/EditView/components/DocumentActions.mjs +54 -66
- package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js +4 -4
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs +4 -4
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js +16 -4
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.mjs +17 -6
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.mjs +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/AddComponentButton.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/AddComponentButton.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +0 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +0 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/InputRenderer.js +3 -1
- package/dist/admin/pages/EditView/components/InputRenderer.js.map +1 -1
- package/dist/admin/pages/EditView/components/InputRenderer.mjs +3 -1
- package/dist/admin/pages/EditView/components/InputRenderer.mjs.map +1 -1
- package/dist/admin/pages/EditView/utils/data.js +3 -11
- package/dist/admin/pages/EditView/utils/data.js.map +1 -1
- package/dist/admin/pages/EditView/utils/data.mjs +3 -11
- package/dist/admin/pages/EditView/utils/data.mjs.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/DraggableCard.js +1 -0
- package/dist/admin/pages/ListConfiguration/components/DraggableCard.js.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/DraggableCard.mjs +1 -0
- package/dist/admin/pages/ListConfiguration/components/DraggableCard.mjs.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/EditFieldForm.js +1 -1
- package/dist/admin/pages/ListConfiguration/components/EditFieldForm.js.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/EditFieldForm.mjs +1 -1
- package/dist/admin/pages/ListConfiguration/components/EditFieldForm.mjs.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/Settings.js +1 -1
- package/dist/admin/pages/ListConfiguration/components/Settings.js.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/Settings.mjs +1 -1
- package/dist/admin/pages/ListConfiguration/components/Settings.mjs.map +1 -1
- package/dist/admin/pages/ListView/components/TableCells/Media.js +4 -2
- package/dist/admin/pages/ListView/components/TableCells/Media.js.map +1 -1
- package/dist/admin/pages/ListView/components/TableCells/Media.mjs +4 -2
- package/dist/admin/pages/ListView/components/TableCells/Media.mjs.map +1 -1
- package/dist/admin/preview/components/PreviewHeader.js +0 -1
- package/dist/admin/preview/components/PreviewHeader.js.map +1 -1
- package/dist/admin/preview/components/PreviewHeader.mjs +0 -1
- package/dist/admin/preview/components/PreviewHeader.mjs.map +1 -1
- package/dist/admin/src/pages/EditView/components/DocumentActions.d.ts +2 -1
- package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.d.ts +7 -2
- package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/WysiwygStyles.d.ts +1 -1
- package/dist/admin/translations/en.json.js +1 -0
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +1 -0
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/admin/translations/es.json.js +1 -0
- package/dist/admin/translations/es.json.js.map +1 -1
- package/dist/admin/translations/es.json.mjs +1 -0
- package/dist/admin/translations/es.json.mjs.map +1 -1
- package/dist/admin/translations/fr.json.js +1 -0
- package/dist/admin/translations/fr.json.js.map +1 -1
- package/dist/admin/translations/fr.json.mjs +1 -0
- package/dist/admin/translations/fr.json.mjs.map +1 -1
- package/dist/admin/utils/validation.js +1 -1
- package/dist/admin/utils/validation.js.map +1 -1
- package/dist/admin/utils/validation.mjs +1 -1
- package/dist/admin/utils/validation.mjs.map +1 -1
- package/dist/server/services/document-metadata.js +17 -4
- package/dist/server/services/document-metadata.js.map +1 -1
- package/dist/server/services/document-metadata.mjs +17 -4
- package/dist/server/services/document-metadata.mjs.map +1 -1
- package/dist/server/src/services/document-metadata.d.ts.map +1 -1
- package/package.json +8 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BlocksContent.js","sources":["../../../../../../../admin/src/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Box,\n BoxComponent,\n Flex,\n FlexComponent,\n IconButton,\n IconButtonComponent,\n useComposedRefs,\n} from '@strapi/design-system';\nimport { Drag } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { Editor, Range, Transforms } from 'slate';\nimport { ReactEditor, type RenderElementProps, type RenderLeafProps, Editable } from 'slate-react';\nimport { styled, CSSProperties, css } from 'styled-components';\n\nimport { ItemTypes } from '../../../../../constants/dragAndDrop';\nimport { useDragAndDrop, DIRECTIONS } from '../../../../../hooks/useDragAndDrop';\nimport { getTranslation } from '../../../../../utils/translations';\n\nimport { decorateCode } from './Blocks/Code';\nimport { type BlocksStore, useBlocksEditorContext } from './BlocksEditor';\nimport { useConversionModal } from './BlocksToolbar';\nimport { type ModifiersStore } from './Modifiers';\nimport { getEntries, isLinkNode, isListNode } from './utils/types';\n\nconst StyledEditable = styled(Editable)<{ isExpandedMode: boolean }>`\n // The outline style is set on the wrapper with :focus-within\n outline: none;\n display: flex;\n flex-direction: column;\n gap: ${({ theme }) => theme.spaces[3]};\n height: 100%;\n // For fullscreen align input in the center with fixed width\n width: ${(props) => (props.isExpandedMode ? '512px' : '100%')};\n margin: auto;\n\n > *:last-child {\n padding-bottom: ${({ theme }) => theme.spaces[3]};\n }\n`;\n\nconst Wrapper = styled<BoxComponent>(Box)<{ isOverDropTarget: boolean }>`\n position: ${({ isOverDropTarget }) => isOverDropTarget && 'relative'};\n`;\n\ntype DragDirection = (typeof DIRECTIONS)[keyof typeof DIRECTIONS];\n\nconst DropPlaceholder = styled<BoxComponent>(Box)<{\n dragDirection: DragDirection | null;\n placeholderMargin: 1 | 2;\n}>`\n position: absolute;\n right: 0;\n\n // Show drop placeholder 8px above or below the drop target\n ${({ dragDirection, theme, placeholderMargin }) => css`\n top: ${dragDirection === DIRECTIONS.UPWARD && `-${theme.spaces[placeholderMargin]}`};\n bottom: ${dragDirection === DIRECTIONS.DOWNWARD && `-${theme.spaces[placeholderMargin]}`};\n `}\n`;\n\nconst DragItem = styled<FlexComponent>(Flex)<{ $dragVisibility: CSSProperties['visibility'] }>`\n // Style each block rendered using renderElement()\n & > [data-slate-node='element'] {\n width: 100%;\n opacity: inherit;\n }\n\n // Set the visibility of drag button\n [role='button'] {\n visibility: ${(props) => props.$dragVisibility};\n opacity: inherit;\n }\n &[aria-disabled='true'] {\n user-drag: none;\n }\n`;\n\nconst DragIconButton = styled<IconButtonComponent<'div'>>(IconButton)<{\n $dragHandleTopMargin?: CSSProperties['marginTop'];\n}>`\n user-select: none;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n border-radius: ${({ theme }) => theme.borderRadius};\n padding-left: ${({ theme }) => theme.spaces[0]};\n padding-right: ${({ theme }) => theme.spaces[0]};\n padding-top: ${({ theme }) => theme.spaces[1]};\n padding-bottom: ${({ theme }) => theme.spaces[1]};\n visibility: hidden;\n cursor: grab;\n opacity: inherit;\n margin-top: ${(props) => props.$dragHandleTopMargin ?? 0};\n\n &:hover {\n background: ${({ theme }) => theme.colors.neutral100};\n }\n &:active {\n cursor: grabbing;\n background: ${({ theme }) => theme.colors.neutral150};\n }\n &[aria-disabled='true'] {\n visibility: hidden;\n }\n svg {\n min-width: ${({ theme }) => theme.spaces[3]};\n\n path {\n fill: ${({ theme }) => theme.colors.neutral500};\n }\n }\n`;\n\ntype Direction = {\n setDragDirection: (direction: DragDirection) => void;\n dragDirection: DragDirection | null;\n};\n\ntype DragAndDropElementProps = Direction & {\n children: RenderElementProps['children'];\n index: Array<number>;\n dragHandleTopMargin?: CSSProperties['marginTop'];\n};\n\nconst DragAndDropElement = ({\n children,\n index,\n setDragDirection,\n dragDirection,\n dragHandleTopMargin,\n}: DragAndDropElementProps) => {\n const { editor, disabled, name, setLiveText } = useBlocksEditorContext('drag-and-drop');\n const { formatMessage } = useIntl();\n const [dragVisibility, setDragVisibility] = React.useState<CSSProperties['visibility']>('hidden');\n\n const handleMoveBlock = React.useCallback(\n (newIndex: Array<number>, currentIndex: Array<number>) => {\n Transforms.moveNodes(editor, {\n at: currentIndex,\n to: newIndex,\n });\n\n // Add 1 to the index for the live text message\n const currentIndexPosition = [currentIndex[0] + 1, ...currentIndex.slice(1)];\n const newIndexPosition = [newIndex[0] + 1, ...newIndex.slice(1)];\n\n setLiveText(\n formatMessage(\n {\n id: getTranslation('components.Blocks.dnd.reorder'),\n defaultMessage: '{item}, moved. New position in the editor: {position}.',\n },\n {\n item: `${name}.${currentIndexPosition.join(',')}`,\n position: `${newIndexPosition.join(',')} of ${editor.children.length}`,\n }\n )\n );\n },\n [editor, formatMessage, name, setLiveText]\n );\n\n const [{ handlerId, isDragging, isOverDropTarget, direction }, blockRef, dropRef, dragRef] =\n useDragAndDrop(!disabled, {\n type: `${ItemTypes.BLOCKS}_${name}`,\n index,\n item: {\n index,\n displayedValue: children,\n },\n onDropItem(currentIndex, newIndex) {\n if (newIndex) handleMoveBlock(newIndex, currentIndex);\n },\n });\n\n const composedBoxRefs = useComposedRefs(blockRef, dropRef);\n\n // Set Drag direction before loosing state while dragging\n React.useEffect(() => {\n if (direction) {\n setDragDirection(direction);\n }\n }, [direction, setDragDirection]);\n\n // On selection change hide drag handle\n React.useEffect(() => {\n setDragVisibility('hidden');\n }, [editor.selection]);\n\n return (\n <Wrapper ref={composedBoxRefs} isOverDropTarget={isOverDropTarget}>\n {isOverDropTarget && (\n <DropPlaceholder\n borderStyle=\"solid\"\n borderColor=\"secondary200\"\n borderWidth=\"2px\"\n width=\"calc(100% - 24px)\"\n marginLeft=\"auto\"\n dragDirection={dragDirection}\n // For list items placeholder reduce the margin around\n placeholderMargin={children.props.as && children.props.as === 'li' ? 1 : 2}\n />\n )}\n {isDragging ? (\n <CloneDragItem dragHandleTopMargin={dragHandleTopMargin}>{children}</CloneDragItem>\n ) : (\n <DragItem\n ref={dragRef}\n data-handler-id={handlerId}\n gap={2}\n paddingLeft={2}\n alignItems=\"start\"\n onDragStart={(event) => {\n const target = event.target as HTMLElement;\n const currentTarget = event.currentTarget as HTMLElement;\n\n // Dragging action should only trigger drag event when button is dragged, however update styles on the whole dragItem.\n if (target.getAttribute('role') !== 'button') {\n event.preventDefault();\n } else {\n // Setting styles using dragging state is not working, so set it on current target element as nodes get dragged\n currentTarget.style.opacity = '0.5';\n }\n }}\n onDragEnd={(event) => {\n const currentTarget = event.currentTarget as HTMLElement;\n currentTarget.style.opacity = '1';\n }}\n onMouseMove={() => setDragVisibility('visible')}\n onSelect={() => setDragVisibility('visible')}\n onMouseLeave={() => setDragVisibility('hidden')}\n aria-disabled={disabled}\n $dragVisibility={dragVisibility}\n >\n <DragIconButton\n tag=\"div\"\n contentEditable={false}\n role=\"button\"\n tabIndex={0}\n withTooltip={false}\n label={formatMessage({\n id: getTranslation('components.DragHandle-label'),\n defaultMessage: 'Drag',\n })}\n onClick={(e) => e.stopPropagation()}\n aria-disabled={disabled}\n disabled={disabled}\n draggable\n // For some blocks top margin added to drag handle to align at the text level\n $dragHandleTopMargin={dragHandleTopMargin}\n >\n <Drag color=\"primary500\" />\n </DragIconButton>\n {children}\n </DragItem>\n )}\n </Wrapper>\n );\n};\n\ninterface CloneDragItemProps {\n children: RenderElementProps['children'];\n dragHandleTopMargin?: CSSProperties['marginTop'];\n}\n\n// To prevent applying opacity to the original item being dragged, display a cloned element without opacity.\nconst CloneDragItem = ({ children, dragHandleTopMargin }: CloneDragItemProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <DragItem gap={2} paddingLeft={2} alignItems=\"start\" $dragVisibility=\"visible\">\n <DragIconButton\n tag=\"div\"\n role=\"button\"\n withTooltip={false}\n label={formatMessage({\n id: getTranslation('components.DragHandle-label'),\n defaultMessage: 'Drag',\n })}\n $dragHandleTopMargin={dragHandleTopMargin}\n >\n <Drag color=\"neutral600\" />\n </DragIconButton>\n {children}\n </DragItem>\n );\n};\n\ninterface ExtendedRenderLeafProps extends RenderLeafProps {\n leaf: RenderLeafProps['leaf'] & { className?: string };\n}\n\nconst baseRenderLeaf = (props: ExtendedRenderLeafProps, modifiers: ModifiersStore) => {\n // Recursively wrap the children for each active modifier\n const wrappedChildren = getEntries(modifiers).reduce((currentChildren, modifierEntry) => {\n const [name, modifier] = modifierEntry;\n\n if (props.leaf[name]) {\n return modifier.renderLeaf(currentChildren);\n }\n\n return currentChildren;\n }, props.children);\n\n return (\n <span {...props.attributes} className={props.leaf.className}>\n {wrappedChildren}\n </span>\n );\n};\n\ntype BaseRenderElementProps = Direction & {\n props: RenderElementProps['children'];\n blocks: BlocksStore;\n editor: Editor;\n};\n\nconst baseRenderElement = ({\n props,\n blocks,\n editor,\n setDragDirection,\n dragDirection,\n}: BaseRenderElementProps) => {\n const { element } = props;\n\n const blockMatch = Object.values(blocks).find((block) => block.matchNode(element));\n const block = blockMatch || blocks.paragraph;\n const nodePath = ReactEditor.findPath(editor, element);\n\n // Link is inline block so it cannot be dragged\n // List items and nested list blocks i.e. lists with indent level higher than 0 are skipped from dragged items\n if (\n isLinkNode(element) ||\n (isListNode(element) && element.indentLevel && element.indentLevel > 0) ||\n element.type === 'list-item'\n ) {\n return block.renderElement(props);\n }\n\n return (\n <DragAndDropElement\n index={nodePath}\n setDragDirection={setDragDirection}\n dragDirection={dragDirection}\n dragHandleTopMargin={block.dragHandleTopMargin}\n >\n {block.renderElement(props)}\n </DragAndDropElement>\n );\n};\n\nconst dragNoop = () => true;\n\ninterface BlocksContentProps {\n placeholder?: string;\n ariaLabelId: string;\n}\n\nconst BlocksContent = ({ placeholder, ariaLabelId }: BlocksContentProps) => {\n const { editor, disabled, blocks, modifiers, setLiveText, isExpandedMode } =\n useBlocksEditorContext('BlocksContent');\n const blocksRef = React.useRef<HTMLDivElement>(null);\n const { formatMessage } = useIntl();\n const [dragDirection, setDragDirection] = React.useState<DragDirection | null>(null);\n const { modalElement, handleConversionResult } = useConversionModal();\n\n // Create renderLeaf function based on the modifiers store\n const renderLeaf = React.useCallback(\n (props: ExtendedRenderLeafProps) => baseRenderLeaf(props, modifiers),\n [modifiers]\n );\n\n const handleMoveBlocks = (editor: Editor, event: React.KeyboardEvent<HTMLElement>) => {\n if (!editor.selection) return;\n\n const start = Range.start(editor.selection);\n const currentIndex = [start.path[0]];\n let newIndexPosition = 0;\n\n if (event.key === 'ArrowUp') {\n newIndexPosition = currentIndex[0] > 0 ? currentIndex[0] - 1 : currentIndex[0];\n } else {\n newIndexPosition =\n currentIndex[0] < editor.children.length - 1 ? currentIndex[0] + 1 : currentIndex[0];\n }\n\n const newIndex = [newIndexPosition];\n\n if (newIndexPosition !== currentIndex[0]) {\n Transforms.moveNodes(editor, {\n at: currentIndex,\n to: newIndex,\n });\n\n setLiveText(\n formatMessage(\n {\n id: getTranslation('components.Blocks.dnd.reorder'),\n defaultMessage: '{item}, moved. New position in the editor: {position}.',\n },\n {\n item: `${name}.${currentIndex[0] + 1}`,\n position: `${newIndex[0] + 1} of ${editor.children.length}`,\n }\n )\n );\n\n event.preventDefault();\n }\n };\n\n // Create renderElement function base on the blocks store\n const renderElement = React.useCallback(\n (props: RenderElementProps) =>\n baseRenderElement({ props, blocks, editor, dragDirection, setDragDirection }),\n [blocks, editor, dragDirection, setDragDirection]\n );\n\n const checkSnippet = (event: React.KeyboardEvent<HTMLElement>) => {\n // Get current text block\n if (!editor.selection) {\n return;\n }\n\n const [textNode, textNodePath] = Editor.node(editor, editor.selection.anchor.path);\n\n // Narrow the type to a text node\n if (Editor.isEditor(textNode) || textNode.type !== 'text') {\n return;\n }\n\n // Don't check for snippets if we're not at the start of a block\n if (textNodePath.at(-1) !== 0) {\n return;\n }\n\n // Check if the text node starts with a known snippet\n const blockMatchingSnippet = Object.values(blocks).find((block) => {\n return block.snippets?.includes(textNode.text);\n });\n\n if (blockMatchingSnippet?.handleConvert) {\n // Prevent the space from being created and delete the snippet\n event.preventDefault();\n Transforms.delete(editor, {\n distance: textNode.text.length,\n unit: 'character',\n reverse: true,\n });\n\n // Convert the selected block\n const maybeRenderModal = blockMatchingSnippet.handleConvert(editor);\n handleConversionResult(maybeRenderModal);\n }\n };\n\n const handleEnter = (event: React.KeyboardEvent<HTMLElement>) => {\n if (!editor.selection) {\n return;\n }\n\n const selectedNode = editor.children[editor.selection.anchor.path[0]];\n const selectedBlock = Object.values(blocks).find((block) => block.matchNode(selectedNode));\n if (!selectedBlock) {\n return;\n }\n\n // Allow forced line breaks when shift is pressed\n if (event.shiftKey && selectedNode.type !== 'image') {\n Transforms.insertText(editor, '\\n');\n return;\n }\n\n // Check if there's an enter handler for the selected block\n if (selectedBlock.handleEnterKey) {\n selectedBlock.handleEnterKey(editor);\n } else {\n blocks.paragraph.handleEnterKey!(editor);\n }\n };\n\n const handleBackspaceEvent = (event: React.KeyboardEvent<HTMLElement>) => {\n if (!editor.selection) {\n return;\n }\n\n const selectedNode = editor.children[editor.selection.anchor.path[0]];\n const selectedBlock = Object.values(blocks).find((block) => block.matchNode(selectedNode));\n\n if (!selectedBlock) {\n return;\n }\n\n if (selectedBlock.handleBackspaceKey) {\n selectedBlock.handleBackspaceKey(editor, event);\n }\n };\n\n const handleTab = (event: React.KeyboardEvent<HTMLElement>) => {\n if (!editor.selection) {\n return;\n }\n\n const selectedNode = editor.children[editor.selection.anchor.path[0]];\n const selectedBlock = Object.values(blocks).find((block) => block.matchNode(selectedNode));\n if (!selectedBlock) {\n return;\n }\n\n if (selectedBlock.handleTab) {\n event.preventDefault();\n selectedBlock.handleTab(editor);\n }\n };\n\n const handleKeyboardShortcuts = (event: React.KeyboardEvent<HTMLElement>) => {\n const isCtrlOrCmd = event.metaKey || event.ctrlKey;\n\n if (isCtrlOrCmd) {\n // Check if there's a modifier to toggle\n Object.values(modifiers).forEach((value) => {\n if (value.isValidEventKey(event)) {\n value.handleToggle(editor);\n return;\n }\n });\n if (event.shiftKey && ['ArrowUp', 'ArrowDown'].includes(event.key)) {\n handleMoveBlocks(editor, event);\n }\n }\n };\n\n const handleKeyDown: React.KeyboardEventHandler<HTMLElement> = (event) => {\n // Find the right block-specific handlers for enter and backspace key presses\n switch (event.key) {\n case 'Enter':\n event.preventDefault();\n return handleEnter(event);\n case 'Backspace':\n return handleBackspaceEvent(event);\n case 'Tab':\n return handleTab(event);\n case 'Escape':\n return ReactEditor.blur(editor);\n }\n handleKeyboardShortcuts(event);\n // Check if a snippet was triggered\n if (event.key === ' ') {\n checkSnippet(event);\n }\n };\n\n /**\n * scrollSelectionIntoView : Slate's default method to scroll a DOM selection into the view,\n * thats shifting layout for us when there is a overflowY:scroll on the viewport.\n * We are overriding it to check if the selection is not fully within the visible area of the editor,\n * we use scrollBy one line to the bottom\n */\n\n const handleScrollSelectionIntoView = React.useCallback(() => {\n if (!editor.selection || !blocksRef.current) {\n return;\n }\n\n const domRange = ReactEditor.toDOMRange(editor, editor.selection);\n const domRect = domRange.getBoundingClientRect();\n\n const editorRect = blocksRef.current.getBoundingClientRect();\n\n // Check if the selection is not fully within the visible area of the editor\n if (domRect.top < editorRect.top || domRect.bottom > editorRect.bottom) {\n // Scroll by one line to the bottom\n blocksRef.current.scrollBy({\n top: 28, // 20px is the line-height + 8px line gap\n behavior: 'smooth',\n });\n }\n }, [editor]);\n\n return (\n <Box\n ref={blocksRef}\n grow={1}\n width=\"100%\"\n overflow=\"auto\"\n fontSize={2}\n background=\"neutral0\"\n color=\"neutral800\"\n lineHeight={6}\n paddingRight={7}\n paddingTop={6}\n paddingBottom={3}\n >\n <StyledEditable\n aria-labelledby={ariaLabelId}\n readOnly={disabled}\n placeholder={placeholder}\n isExpandedMode={isExpandedMode}\n decorate={decorateCode}\n renderElement={renderElement}\n renderLeaf={renderLeaf}\n onKeyDown={handleKeyDown}\n scrollSelectionIntoView={handleScrollSelectionIntoView}\n // As we have our own handler to drag and drop the elements returing true will skip slate's own event handler\n onDrop={dragNoop}\n onDragStart={dragNoop}\n />\n {modalElement}\n </Box>\n );\n};\n\nexport { BlocksContent, BlocksContentProps };\n"],"names":["StyledEditable","styled","Editable","theme","spaces","props","isExpandedMode","Wrapper","Box","isOverDropTarget","DropPlaceholder","dragDirection","placeholderMargin","css","DIRECTIONS","UPWARD","DOWNWARD","DragItem","Flex","$dragVisibility","DragIconButton","IconButton","borderRadius","$dragHandleTopMargin","colors","neutral100","neutral150","neutral500","DragAndDropElement","children","index","setDragDirection","dragHandleTopMargin","editor","disabled","name","setLiveText","useBlocksEditorContext","formatMessage","useIntl","dragVisibility","setDragVisibility","React","useState","handleMoveBlock","useCallback","newIndex","currentIndex","Transforms","moveNodes","at","to","currentIndexPosition","slice","newIndexPosition","id","getTranslation","defaultMessage","item","join","position","length","handlerId","isDragging","direction","blockRef","dropRef","dragRef","useDragAndDrop","type","ItemTypes","BLOCKS","displayedValue","onDropItem","composedBoxRefs","useComposedRefs","useEffect","selection","_jsxs","ref","_jsx","borderStyle","borderColor","borderWidth","width","marginLeft","as","CloneDragItem","data-handler-id","gap","paddingLeft","alignItems","onDragStart","event","target","currentTarget","getAttribute","preventDefault","style","opacity","onDragEnd","onMouseMove","onSelect","onMouseLeave","aria-disabled","tag","contentEditable","role","tabIndex","withTooltip","label","onClick","e","stopPropagation","draggable","Drag","color","baseRenderLeaf","modifiers","wrappedChildren","getEntries","reduce","currentChildren","modifierEntry","modifier","leaf","renderLeaf","span","attributes","className","baseRenderElement","blocks","element","blockMatch","Object","values","find","block","matchNode","paragraph","nodePath","ReactEditor","findPath","isLinkNode","isListNode","indentLevel","renderElement","dragNoop","BlocksContent","placeholder","ariaLabelId","blocksRef","useRef","modalElement","handleConversionResult","useConversionModal","handleMoveBlocks","start","Range","path","key","checkSnippet","textNode","textNodePath","Editor","node","anchor","isEditor","blockMatchingSnippet","snippets","includes","text","handleConvert","delete","distance","unit","reverse","maybeRenderModal","handleEnter","selectedNode","selectedBlock","shiftKey","insertText","handleEnterKey","handleBackspaceEvent","handleBackspaceKey","handleTab","handleKeyboardShortcuts","isCtrlOrCmd","metaKey","ctrlKey","forEach","value","isValidEventKey","handleToggle","handleKeyDown","blur","handleScrollSelectionIntoView","current","domRange","toDOMRange","domRect","getBoundingClientRect","editorRect","top","bottom","scrollBy","behavior","grow","overflow","fontSize","background","lineHeight","paddingRight","paddingTop","paddingBottom","aria-labelledby","readOnly","decorate","decorateCode","onKeyDown","scrollSelectionIntoView","onDrop"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BlocksContent.js","sources":["../../../../../../../admin/src/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Box,\n BoxComponent,\n Flex,\n FlexComponent,\n IconButton,\n IconButtonComponent,\n useComposedRefs,\n} from '@strapi/design-system';\nimport { Drag } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { Editor, Range, Transforms } from 'slate';\nimport { ReactEditor, type RenderElementProps, type RenderLeafProps, Editable } from 'slate-react';\nimport { styled, CSSProperties, css } from 'styled-components';\n\nimport { ItemTypes } from '../../../../../constants/dragAndDrop';\nimport { useDragAndDrop, DIRECTIONS } from '../../../../../hooks/useDragAndDrop';\nimport { getTranslation } from '../../../../../utils/translations';\n\nimport { decorateCode } from './Blocks/Code';\nimport { type BlocksStore, useBlocksEditorContext } from './BlocksEditor';\nimport { useConversionModal } from './BlocksToolbar';\nimport { type ModifiersStore } from './Modifiers';\nimport { getEntries, isLinkNode, isListNode } from './utils/types';\n\nconst StyledEditable = styled(Editable)<{ $isExpandedMode: boolean }>`\n // The outline style is set on the wrapper with :focus-within\n outline: none;\n display: flex;\n flex-direction: column;\n gap: ${({ theme }) => theme.spaces[3]};\n height: 100%;\n // For fullscreen align input in the center with fixed width\n width: ${(props) => (props.$isExpandedMode ? '512px' : '100%')};\n margin: auto;\n\n > *:last-child {\n padding-bottom: ${({ theme }) => theme.spaces[3]};\n }\n`;\n\nconst Wrapper = styled<BoxComponent>(Box)<{ $isOverDropTarget: boolean }>`\n position: ${({ $isOverDropTarget }) => $isOverDropTarget && 'relative'};\n`;\n\ntype DragDirection = (typeof DIRECTIONS)[keyof typeof DIRECTIONS];\n\nconst DropPlaceholder = styled<BoxComponent>(Box)<{\n dragDirection: DragDirection | null;\n placeholderMargin: 1 | 2;\n}>`\n position: absolute;\n right: 0;\n\n // Show drop placeholder 8px above or below the drop target\n ${({ dragDirection, theme, placeholderMargin }) => css`\n top: ${dragDirection === DIRECTIONS.UPWARD && `-${theme.spaces[placeholderMargin]}`};\n bottom: ${dragDirection === DIRECTIONS.DOWNWARD && `-${theme.spaces[placeholderMargin]}`};\n `}\n`;\n\nconst DragItem = styled<FlexComponent>(Flex)<{ $dragVisibility: CSSProperties['visibility'] }>`\n // Style each block rendered using renderElement()\n & > [data-slate-node='element'] {\n width: 100%;\n opacity: inherit;\n }\n\n // Set the visibility of drag button\n [role='button'] {\n visibility: ${(props) => props.$dragVisibility};\n opacity: inherit;\n }\n &[aria-disabled='true'] {\n user-drag: none;\n }\n`;\n\nconst DragIconButton = styled<IconButtonComponent<'div'>>(IconButton)<{\n $dragHandleTopMargin?: CSSProperties['marginTop'];\n}>`\n user-select: none;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n border-radius: ${({ theme }) => theme.borderRadius};\n padding-left: ${({ theme }) => theme.spaces[0]};\n padding-right: ${({ theme }) => theme.spaces[0]};\n padding-top: ${({ theme }) => theme.spaces[1]};\n padding-bottom: ${({ theme }) => theme.spaces[1]};\n visibility: hidden;\n cursor: grab;\n opacity: inherit;\n margin-top: ${(props) => props.$dragHandleTopMargin ?? 0};\n\n &:hover {\n background: ${({ theme }) => theme.colors.neutral100};\n }\n &:active {\n cursor: grabbing;\n background: ${({ theme }) => theme.colors.neutral150};\n }\n &[aria-disabled='true'] {\n visibility: hidden;\n }\n svg {\n min-width: ${({ theme }) => theme.spaces[3]};\n\n path {\n fill: ${({ theme }) => theme.colors.neutral500};\n }\n }\n`;\n\ntype Direction = {\n setDragDirection: (direction: DragDirection) => void;\n dragDirection: DragDirection | null;\n};\n\ntype DragAndDropElementProps = Direction & {\n children: RenderElementProps['children'];\n index: Array<number>;\n dragHandleTopMargin?: CSSProperties['marginTop'];\n};\n\nconst DragAndDropElement = ({\n children,\n index,\n setDragDirection,\n dragDirection,\n dragHandleTopMargin,\n}: DragAndDropElementProps) => {\n const { editor, disabled, name, setLiveText } = useBlocksEditorContext('drag-and-drop');\n const { formatMessage } = useIntl();\n const [dragVisibility, setDragVisibility] = React.useState<CSSProperties['visibility']>('hidden');\n\n const handleMoveBlock = React.useCallback(\n (newIndex: Array<number>, currentIndex: Array<number>) => {\n Transforms.moveNodes(editor, {\n at: currentIndex,\n to: newIndex,\n });\n\n // Add 1 to the index for the live text message\n const currentIndexPosition = [currentIndex[0] + 1, ...currentIndex.slice(1)];\n const newIndexPosition = [newIndex[0] + 1, ...newIndex.slice(1)];\n\n setLiveText(\n formatMessage(\n {\n id: getTranslation('components.Blocks.dnd.reorder'),\n defaultMessage: '{item}, moved. New position in the editor: {position}.',\n },\n {\n item: `${name}.${currentIndexPosition.join(',')}`,\n position: `${newIndexPosition.join(',')} of ${editor.children.length}`,\n }\n )\n );\n },\n [editor, formatMessage, name, setLiveText]\n );\n\n const [{ handlerId, isDragging, isOverDropTarget, direction }, blockRef, dropRef, dragRef] =\n useDragAndDrop(!disabled, {\n type: `${ItemTypes.BLOCKS}_${name}`,\n index,\n item: {\n index,\n displayedValue: children,\n },\n onDropItem(currentIndex, newIndex) {\n if (newIndex) handleMoveBlock(newIndex, currentIndex);\n },\n });\n\n const composedBoxRefs = useComposedRefs(blockRef, dropRef);\n\n // Set Drag direction before loosing state while dragging\n React.useEffect(() => {\n if (direction) {\n setDragDirection(direction);\n }\n }, [direction, setDragDirection]);\n\n // On selection change hide drag handle\n React.useEffect(() => {\n setDragVisibility('hidden');\n }, [editor.selection]);\n\n return (\n <Wrapper ref={composedBoxRefs} $isOverDropTarget={isOverDropTarget}>\n {isOverDropTarget && (\n <DropPlaceholder\n borderStyle=\"solid\"\n borderColor=\"secondary200\"\n borderWidth=\"2px\"\n width=\"calc(100% - 24px)\"\n marginLeft=\"auto\"\n dragDirection={dragDirection}\n // For list items placeholder reduce the margin around\n placeholderMargin={children.props.as && children.props.as === 'li' ? 1 : 2}\n />\n )}\n {isDragging ? (\n <CloneDragItem dragHandleTopMargin={dragHandleTopMargin}>{children}</CloneDragItem>\n ) : (\n <DragItem\n ref={dragRef}\n data-handler-id={handlerId}\n gap={2}\n paddingLeft={2}\n alignItems=\"start\"\n onDragStart={(event) => {\n const target = event.target as HTMLElement;\n const currentTarget = event.currentTarget as HTMLElement;\n\n // Dragging action should only trigger drag event when button is dragged, however update styles on the whole dragItem.\n if (target.getAttribute('role') !== 'button') {\n event.preventDefault();\n } else {\n // Setting styles using dragging state is not working, so set it on current target element as nodes get dragged\n currentTarget.style.opacity = '0.5';\n }\n }}\n onDragEnd={(event) => {\n const currentTarget = event.currentTarget as HTMLElement;\n currentTarget.style.opacity = '1';\n }}\n onMouseMove={() => setDragVisibility('visible')}\n onSelect={() => setDragVisibility('visible')}\n onMouseLeave={() => setDragVisibility('hidden')}\n aria-disabled={disabled}\n $dragVisibility={dragVisibility}\n >\n <DragIconButton\n tag=\"div\"\n contentEditable={false}\n role=\"button\"\n tabIndex={0}\n withTooltip={false}\n label={formatMessage({\n id: getTranslation('components.DragHandle-label'),\n defaultMessage: 'Drag',\n })}\n onClick={(e) => e.stopPropagation()}\n aria-disabled={disabled}\n disabled={disabled}\n draggable\n // For some blocks top margin added to drag handle to align at the text level\n $dragHandleTopMargin={dragHandleTopMargin}\n >\n <Drag color=\"primary500\" />\n </DragIconButton>\n {children}\n </DragItem>\n )}\n </Wrapper>\n );\n};\n\ninterface CloneDragItemProps {\n children: RenderElementProps['children'];\n dragHandleTopMargin?: CSSProperties['marginTop'];\n}\n\n// To prevent applying opacity to the original item being dragged, display a cloned element without opacity.\nconst CloneDragItem = ({ children, dragHandleTopMargin }: CloneDragItemProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <DragItem gap={2} paddingLeft={2} alignItems=\"start\" $dragVisibility=\"visible\">\n <DragIconButton\n tag=\"div\"\n role=\"button\"\n withTooltip={false}\n label={formatMessage({\n id: getTranslation('components.DragHandle-label'),\n defaultMessage: 'Drag',\n })}\n $dragHandleTopMargin={dragHandleTopMargin}\n >\n <Drag color=\"neutral600\" />\n </DragIconButton>\n {children}\n </DragItem>\n );\n};\n\ninterface ExtendedRenderLeafProps extends RenderLeafProps {\n leaf: RenderLeafProps['leaf'] & { className?: string };\n}\n\nconst baseRenderLeaf = (props: ExtendedRenderLeafProps, modifiers: ModifiersStore) => {\n // Recursively wrap the children for each active modifier\n const wrappedChildren = getEntries(modifiers).reduce((currentChildren, modifierEntry) => {\n const [name, modifier] = modifierEntry;\n\n if (props.leaf[name]) {\n return modifier.renderLeaf(currentChildren);\n }\n\n return currentChildren;\n }, props.children);\n\n return (\n <span {...props.attributes} className={props.leaf.className}>\n {wrappedChildren}\n </span>\n );\n};\n\ntype BaseRenderElementProps = Direction & {\n props: RenderElementProps['children'];\n blocks: BlocksStore;\n editor: Editor;\n};\n\nconst baseRenderElement = ({\n props,\n blocks,\n editor,\n setDragDirection,\n dragDirection,\n}: BaseRenderElementProps) => {\n const { element } = props;\n\n const blockMatch = Object.values(blocks).find((block) => block.matchNode(element));\n const block = blockMatch || blocks.paragraph;\n const nodePath = ReactEditor.findPath(editor, element);\n\n // Link is inline block so it cannot be dragged\n // List items and nested list blocks i.e. lists with indent level higher than 0 are skipped from dragged items\n if (\n isLinkNode(element) ||\n (isListNode(element) && element.indentLevel && element.indentLevel > 0) ||\n element.type === 'list-item'\n ) {\n return block.renderElement(props);\n }\n\n return (\n <DragAndDropElement\n index={nodePath}\n setDragDirection={setDragDirection}\n dragDirection={dragDirection}\n dragHandleTopMargin={block.dragHandleTopMargin}\n >\n {block.renderElement(props)}\n </DragAndDropElement>\n );\n};\n\nconst dragNoop = () => true;\n\ninterface BlocksContentProps {\n placeholder?: string;\n ariaLabelId: string;\n}\n\nconst BlocksContent = ({ placeholder, ariaLabelId }: BlocksContentProps) => {\n const { editor, disabled, blocks, modifiers, setLiveText, isExpandedMode } =\n useBlocksEditorContext('BlocksContent');\n const blocksRef = React.useRef<HTMLDivElement>(null);\n const { formatMessage } = useIntl();\n const [dragDirection, setDragDirection] = React.useState<DragDirection | null>(null);\n const { modalElement, handleConversionResult } = useConversionModal();\n\n // Create renderLeaf function based on the modifiers store\n const renderLeaf = React.useCallback(\n (props: ExtendedRenderLeafProps) => baseRenderLeaf(props, modifiers),\n [modifiers]\n );\n\n const handleMoveBlocks = (editor: Editor, event: React.KeyboardEvent<HTMLElement>) => {\n if (!editor.selection) return;\n\n const start = Range.start(editor.selection);\n const currentIndex = [start.path[0]];\n let newIndexPosition = 0;\n\n if (event.key === 'ArrowUp') {\n newIndexPosition = currentIndex[0] > 0 ? currentIndex[0] - 1 : currentIndex[0];\n } else {\n newIndexPosition =\n currentIndex[0] < editor.children.length - 1 ? currentIndex[0] + 1 : currentIndex[0];\n }\n\n const newIndex = [newIndexPosition];\n\n if (newIndexPosition !== currentIndex[0]) {\n Transforms.moveNodes(editor, {\n at: currentIndex,\n to: newIndex,\n });\n\n setLiveText(\n formatMessage(\n {\n id: getTranslation('components.Blocks.dnd.reorder'),\n defaultMessage: '{item}, moved. New position in the editor: {position}.',\n },\n {\n item: `${name}.${currentIndex[0] + 1}`,\n position: `${newIndex[0] + 1} of ${editor.children.length}`,\n }\n )\n );\n\n event.preventDefault();\n }\n };\n\n // Create renderElement function base on the blocks store\n const renderElement = React.useCallback(\n (props: RenderElementProps) =>\n baseRenderElement({ props, blocks, editor, dragDirection, setDragDirection }),\n [blocks, editor, dragDirection, setDragDirection]\n );\n\n const checkSnippet = (event: React.KeyboardEvent<HTMLElement>) => {\n // Get current text block\n if (!editor.selection) {\n return;\n }\n\n const [textNode, textNodePath] = Editor.node(editor, editor.selection.anchor.path);\n\n // Narrow the type to a text node\n if (Editor.isEditor(textNode) || textNode.type !== 'text') {\n return;\n }\n\n // Don't check for snippets if we're not at the start of a block\n if (textNodePath.at(-1) !== 0) {\n return;\n }\n\n // Check if the text node starts with a known snippet\n const blockMatchingSnippet = Object.values(blocks).find((block) => {\n return block.snippets?.includes(textNode.text);\n });\n\n if (blockMatchingSnippet?.handleConvert) {\n // Prevent the space from being created and delete the snippet\n event.preventDefault();\n Transforms.delete(editor, {\n distance: textNode.text.length,\n unit: 'character',\n reverse: true,\n });\n\n // Convert the selected block\n const maybeRenderModal = blockMatchingSnippet.handleConvert(editor);\n handleConversionResult(maybeRenderModal);\n }\n };\n\n const handleEnter = (event: React.KeyboardEvent<HTMLElement>) => {\n if (!editor.selection) {\n return;\n }\n\n const selectedNode = editor.children[editor.selection.anchor.path[0]];\n const selectedBlock = Object.values(blocks).find((block) => block.matchNode(selectedNode));\n if (!selectedBlock) {\n return;\n }\n\n // Allow forced line breaks when shift is pressed\n if (event.shiftKey && selectedNode.type !== 'image') {\n Transforms.insertText(editor, '\\n');\n return;\n }\n\n // Check if there's an enter handler for the selected block\n if (selectedBlock.handleEnterKey) {\n selectedBlock.handleEnterKey(editor);\n } else {\n blocks.paragraph.handleEnterKey!(editor);\n }\n };\n\n const handleBackspaceEvent = (event: React.KeyboardEvent<HTMLElement>) => {\n if (!editor.selection) {\n return;\n }\n\n const selectedNode = editor.children[editor.selection.anchor.path[0]];\n const selectedBlock = Object.values(blocks).find((block) => block.matchNode(selectedNode));\n\n if (!selectedBlock) {\n return;\n }\n\n if (selectedBlock.handleBackspaceKey) {\n selectedBlock.handleBackspaceKey(editor, event);\n }\n };\n\n const handleTab = (event: React.KeyboardEvent<HTMLElement>) => {\n if (!editor.selection) {\n return;\n }\n\n const selectedNode = editor.children[editor.selection.anchor.path[0]];\n const selectedBlock = Object.values(blocks).find((block) => block.matchNode(selectedNode));\n if (!selectedBlock) {\n return;\n }\n\n if (selectedBlock.handleTab) {\n event.preventDefault();\n selectedBlock.handleTab(editor);\n }\n };\n\n const handleKeyboardShortcuts = (event: React.KeyboardEvent<HTMLElement>) => {\n const isCtrlOrCmd = event.metaKey || event.ctrlKey;\n\n if (isCtrlOrCmd) {\n // Check if there's a modifier to toggle\n Object.values(modifiers).forEach((value) => {\n if (value.isValidEventKey(event)) {\n value.handleToggle(editor);\n return;\n }\n });\n if (event.shiftKey && ['ArrowUp', 'ArrowDown'].includes(event.key)) {\n handleMoveBlocks(editor, event);\n }\n }\n };\n\n const handleKeyDown: React.KeyboardEventHandler<HTMLElement> = (event) => {\n // Find the right block-specific handlers for enter and backspace key presses\n switch (event.key) {\n case 'Enter':\n event.preventDefault();\n return handleEnter(event);\n case 'Backspace':\n return handleBackspaceEvent(event);\n case 'Tab':\n return handleTab(event);\n case 'Escape':\n return ReactEditor.blur(editor);\n }\n handleKeyboardShortcuts(event);\n // Check if a snippet was triggered\n if (event.key === ' ') {\n checkSnippet(event);\n }\n };\n\n /**\n * scrollSelectionIntoView : Slate's default method to scroll a DOM selection into the view,\n * thats shifting layout for us when there is a overflowY:scroll on the viewport.\n * We are overriding it to check if the selection is not fully within the visible area of the editor,\n * we use scrollBy one line to the bottom\n */\n\n const handleScrollSelectionIntoView = React.useCallback(() => {\n if (!editor.selection || !blocksRef.current) {\n return;\n }\n\n const domRange = ReactEditor.toDOMRange(editor, editor.selection);\n const domRect = domRange.getBoundingClientRect();\n\n const editorRect = blocksRef.current.getBoundingClientRect();\n\n // Check if the selection is not fully within the visible area of the editor\n if (domRect.top < editorRect.top || domRect.bottom > editorRect.bottom) {\n // Scroll by one line to the bottom\n blocksRef.current.scrollBy({\n top: 28, // 20px is the line-height + 8px line gap\n behavior: 'smooth',\n });\n }\n }, [editor]);\n\n return (\n <Box\n ref={blocksRef}\n grow={1}\n width=\"100%\"\n overflow=\"auto\"\n fontSize={2}\n background=\"neutral0\"\n color=\"neutral800\"\n lineHeight={6}\n paddingRight={7}\n paddingTop={6}\n paddingBottom={3}\n >\n <StyledEditable\n aria-labelledby={ariaLabelId}\n readOnly={disabled}\n placeholder={placeholder}\n $isExpandedMode={isExpandedMode}\n decorate={decorateCode}\n renderElement={renderElement}\n renderLeaf={renderLeaf}\n onKeyDown={handleKeyDown}\n scrollSelectionIntoView={handleScrollSelectionIntoView}\n // As we have our own handler to drag and drop the elements returing true will skip slate's own event handler\n onDrop={dragNoop}\n onDragStart={dragNoop}\n />\n {modalElement}\n </Box>\n );\n};\n\nexport { BlocksContent, BlocksContentProps };\n"],"names":["StyledEditable","styled","Editable","theme","spaces","props","$isExpandedMode","Wrapper","Box","$isOverDropTarget","DropPlaceholder","dragDirection","placeholderMargin","css","DIRECTIONS","UPWARD","DOWNWARD","DragItem","Flex","$dragVisibility","DragIconButton","IconButton","borderRadius","$dragHandleTopMargin","colors","neutral100","neutral150","neutral500","DragAndDropElement","children","index","setDragDirection","dragHandleTopMargin","editor","disabled","name","setLiveText","useBlocksEditorContext","formatMessage","useIntl","dragVisibility","setDragVisibility","React","useState","handleMoveBlock","useCallback","newIndex","currentIndex","Transforms","moveNodes","at","to","currentIndexPosition","slice","newIndexPosition","id","getTranslation","defaultMessage","item","join","position","length","handlerId","isDragging","isOverDropTarget","direction","blockRef","dropRef","dragRef","useDragAndDrop","type","ItemTypes","BLOCKS","displayedValue","onDropItem","composedBoxRefs","useComposedRefs","useEffect","selection","_jsxs","ref","_jsx","borderStyle","borderColor","borderWidth","width","marginLeft","as","CloneDragItem","data-handler-id","gap","paddingLeft","alignItems","onDragStart","event","target","currentTarget","getAttribute","preventDefault","style","opacity","onDragEnd","onMouseMove","onSelect","onMouseLeave","aria-disabled","tag","contentEditable","role","tabIndex","withTooltip","label","onClick","e","stopPropagation","draggable","Drag","color","baseRenderLeaf","modifiers","wrappedChildren","getEntries","reduce","currentChildren","modifierEntry","modifier","leaf","renderLeaf","span","attributes","className","baseRenderElement","blocks","element","blockMatch","Object","values","find","block","matchNode","paragraph","nodePath","ReactEditor","findPath","isLinkNode","isListNode","indentLevel","renderElement","dragNoop","BlocksContent","placeholder","ariaLabelId","isExpandedMode","blocksRef","useRef","modalElement","handleConversionResult","useConversionModal","handleMoveBlocks","start","Range","path","key","checkSnippet","textNode","textNodePath","Editor","node","anchor","isEditor","blockMatchingSnippet","snippets","includes","text","handleConvert","delete","distance","unit","reverse","maybeRenderModal","handleEnter","selectedNode","selectedBlock","shiftKey","insertText","handleEnterKey","handleBackspaceEvent","handleBackspaceKey","handleTab","handleKeyboardShortcuts","isCtrlOrCmd","metaKey","ctrlKey","forEach","value","isValidEventKey","handleToggle","handleKeyDown","blur","handleScrollSelectionIntoView","current","domRange","toDOMRange","domRect","getBoundingClientRect","editorRect","top","bottom","scrollBy","behavior","grow","overflow","fontSize","background","lineHeight","paddingRight","paddingTop","paddingBottom","aria-labelledby","readOnly","decorate","decorateCode","onKeyDown","scrollSelectionIntoView","onDrop"],"mappings":"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"}
|
|
@@ -22,7 +22,7 @@ const StyledEditable = styled(Editable)`
|
|
|
22
22
|
gap: ${({ theme })=>theme.spaces[3]};
|
|
23
23
|
height: 100%;
|
|
24
24
|
// For fullscreen align input in the center with fixed width
|
|
25
|
-
width: ${(props)=>props
|
|
25
|
+
width: ${(props)=>props.$isExpandedMode ? '512px' : '100%'};
|
|
26
26
|
margin: auto;
|
|
27
27
|
|
|
28
28
|
> *:last-child {
|
|
@@ -30,7 +30,7 @@ const StyledEditable = styled(Editable)`
|
|
|
30
30
|
}
|
|
31
31
|
`;
|
|
32
32
|
const Wrapper = styled(Box)`
|
|
33
|
-
position: ${({ isOverDropTarget })
|
|
33
|
+
position: ${({ $isOverDropTarget })=>$isOverDropTarget && 'relative'};
|
|
34
34
|
`;
|
|
35
35
|
const DropPlaceholder = styled(Box)`
|
|
36
36
|
position: absolute;
|
|
@@ -152,7 +152,7 @@ const DragAndDropElement = ({ children, index, setDragDirection, dragDirection,
|
|
|
152
152
|
]);
|
|
153
153
|
return /*#__PURE__*/ jsxs(Wrapper, {
|
|
154
154
|
ref: composedBoxRefs,
|
|
155
|
-
isOverDropTarget: isOverDropTarget,
|
|
155
|
+
$isOverDropTarget: isOverDropTarget,
|
|
156
156
|
children: [
|
|
157
157
|
isOverDropTarget && /*#__PURE__*/ jsx(DropPlaceholder, {
|
|
158
158
|
borderStyle: "solid",
|
|
@@ -489,7 +489,7 @@ const BlocksContent = ({ placeholder, ariaLabelId })=>{
|
|
|
489
489
|
"aria-labelledby": ariaLabelId,
|
|
490
490
|
readOnly: disabled,
|
|
491
491
|
placeholder: placeholder,
|
|
492
|
-
isExpandedMode: isExpandedMode,
|
|
492
|
+
$isExpandedMode: isExpandedMode,
|
|
493
493
|
decorate: decorateCode,
|
|
494
494
|
renderElement: renderElement,
|
|
495
495
|
renderLeaf: renderLeaf,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BlocksContent.mjs","sources":["../../../../../../../admin/src/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Box,\n BoxComponent,\n Flex,\n FlexComponent,\n IconButton,\n IconButtonComponent,\n useComposedRefs,\n} from '@strapi/design-system';\nimport { Drag } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { Editor, Range, Transforms } from 'slate';\nimport { ReactEditor, type RenderElementProps, type RenderLeafProps, Editable } from 'slate-react';\nimport { styled, CSSProperties, css } from 'styled-components';\n\nimport { ItemTypes } from '../../../../../constants/dragAndDrop';\nimport { useDragAndDrop, DIRECTIONS } from '../../../../../hooks/useDragAndDrop';\nimport { getTranslation } from '../../../../../utils/translations';\n\nimport { decorateCode } from './Blocks/Code';\nimport { type BlocksStore, useBlocksEditorContext } from './BlocksEditor';\nimport { useConversionModal } from './BlocksToolbar';\nimport { type ModifiersStore } from './Modifiers';\nimport { getEntries, isLinkNode, isListNode } from './utils/types';\n\nconst StyledEditable = styled(Editable)<{ isExpandedMode: boolean }>`\n // The outline style is set on the wrapper with :focus-within\n outline: none;\n display: flex;\n flex-direction: column;\n gap: ${({ theme }) => theme.spaces[3]};\n height: 100%;\n // For fullscreen align input in the center with fixed width\n width: ${(props) => (props.isExpandedMode ? '512px' : '100%')};\n margin: auto;\n\n > *:last-child {\n padding-bottom: ${({ theme }) => theme.spaces[3]};\n }\n`;\n\nconst Wrapper = styled<BoxComponent>(Box)<{ isOverDropTarget: boolean }>`\n position: ${({ isOverDropTarget }) => isOverDropTarget && 'relative'};\n`;\n\ntype DragDirection = (typeof DIRECTIONS)[keyof typeof DIRECTIONS];\n\nconst DropPlaceholder = styled<BoxComponent>(Box)<{\n dragDirection: DragDirection | null;\n placeholderMargin: 1 | 2;\n}>`\n position: absolute;\n right: 0;\n\n // Show drop placeholder 8px above or below the drop target\n ${({ dragDirection, theme, placeholderMargin }) => css`\n top: ${dragDirection === DIRECTIONS.UPWARD && `-${theme.spaces[placeholderMargin]}`};\n bottom: ${dragDirection === DIRECTIONS.DOWNWARD && `-${theme.spaces[placeholderMargin]}`};\n `}\n`;\n\nconst DragItem = styled<FlexComponent>(Flex)<{ $dragVisibility: CSSProperties['visibility'] }>`\n // Style each block rendered using renderElement()\n & > [data-slate-node='element'] {\n width: 100%;\n opacity: inherit;\n }\n\n // Set the visibility of drag button\n [role='button'] {\n visibility: ${(props) => props.$dragVisibility};\n opacity: inherit;\n }\n &[aria-disabled='true'] {\n user-drag: none;\n }\n`;\n\nconst DragIconButton = styled<IconButtonComponent<'div'>>(IconButton)<{\n $dragHandleTopMargin?: CSSProperties['marginTop'];\n}>`\n user-select: none;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n border-radius: ${({ theme }) => theme.borderRadius};\n padding-left: ${({ theme }) => theme.spaces[0]};\n padding-right: ${({ theme }) => theme.spaces[0]};\n padding-top: ${({ theme }) => theme.spaces[1]};\n padding-bottom: ${({ theme }) => theme.spaces[1]};\n visibility: hidden;\n cursor: grab;\n opacity: inherit;\n margin-top: ${(props) => props.$dragHandleTopMargin ?? 0};\n\n &:hover {\n background: ${({ theme }) => theme.colors.neutral100};\n }\n &:active {\n cursor: grabbing;\n background: ${({ theme }) => theme.colors.neutral150};\n }\n &[aria-disabled='true'] {\n visibility: hidden;\n }\n svg {\n min-width: ${({ theme }) => theme.spaces[3]};\n\n path {\n fill: ${({ theme }) => theme.colors.neutral500};\n }\n }\n`;\n\ntype Direction = {\n setDragDirection: (direction: DragDirection) => void;\n dragDirection: DragDirection | null;\n};\n\ntype DragAndDropElementProps = Direction & {\n children: RenderElementProps['children'];\n index: Array<number>;\n dragHandleTopMargin?: CSSProperties['marginTop'];\n};\n\nconst DragAndDropElement = ({\n children,\n index,\n setDragDirection,\n dragDirection,\n dragHandleTopMargin,\n}: DragAndDropElementProps) => {\n const { editor, disabled, name, setLiveText } = useBlocksEditorContext('drag-and-drop');\n const { formatMessage } = useIntl();\n const [dragVisibility, setDragVisibility] = React.useState<CSSProperties['visibility']>('hidden');\n\n const handleMoveBlock = React.useCallback(\n (newIndex: Array<number>, currentIndex: Array<number>) => {\n Transforms.moveNodes(editor, {\n at: currentIndex,\n to: newIndex,\n });\n\n // Add 1 to the index for the live text message\n const currentIndexPosition = [currentIndex[0] + 1, ...currentIndex.slice(1)];\n const newIndexPosition = [newIndex[0] + 1, ...newIndex.slice(1)];\n\n setLiveText(\n formatMessage(\n {\n id: getTranslation('components.Blocks.dnd.reorder'),\n defaultMessage: '{item}, moved. New position in the editor: {position}.',\n },\n {\n item: `${name}.${currentIndexPosition.join(',')}`,\n position: `${newIndexPosition.join(',')} of ${editor.children.length}`,\n }\n )\n );\n },\n [editor, formatMessage, name, setLiveText]\n );\n\n const [{ handlerId, isDragging, isOverDropTarget, direction }, blockRef, dropRef, dragRef] =\n useDragAndDrop(!disabled, {\n type: `${ItemTypes.BLOCKS}_${name}`,\n index,\n item: {\n index,\n displayedValue: children,\n },\n onDropItem(currentIndex, newIndex) {\n if (newIndex) handleMoveBlock(newIndex, currentIndex);\n },\n });\n\n const composedBoxRefs = useComposedRefs(blockRef, dropRef);\n\n // Set Drag direction before loosing state while dragging\n React.useEffect(() => {\n if (direction) {\n setDragDirection(direction);\n }\n }, [direction, setDragDirection]);\n\n // On selection change hide drag handle\n React.useEffect(() => {\n setDragVisibility('hidden');\n }, [editor.selection]);\n\n return (\n <Wrapper ref={composedBoxRefs} isOverDropTarget={isOverDropTarget}>\n {isOverDropTarget && (\n <DropPlaceholder\n borderStyle=\"solid\"\n borderColor=\"secondary200\"\n borderWidth=\"2px\"\n width=\"calc(100% - 24px)\"\n marginLeft=\"auto\"\n dragDirection={dragDirection}\n // For list items placeholder reduce the margin around\n placeholderMargin={children.props.as && children.props.as === 'li' ? 1 : 2}\n />\n )}\n {isDragging ? (\n <CloneDragItem dragHandleTopMargin={dragHandleTopMargin}>{children}</CloneDragItem>\n ) : (\n <DragItem\n ref={dragRef}\n data-handler-id={handlerId}\n gap={2}\n paddingLeft={2}\n alignItems=\"start\"\n onDragStart={(event) => {\n const target = event.target as HTMLElement;\n const currentTarget = event.currentTarget as HTMLElement;\n\n // Dragging action should only trigger drag event when button is dragged, however update styles on the whole dragItem.\n if (target.getAttribute('role') !== 'button') {\n event.preventDefault();\n } else {\n // Setting styles using dragging state is not working, so set it on current target element as nodes get dragged\n currentTarget.style.opacity = '0.5';\n }\n }}\n onDragEnd={(event) => {\n const currentTarget = event.currentTarget as HTMLElement;\n currentTarget.style.opacity = '1';\n }}\n onMouseMove={() => setDragVisibility('visible')}\n onSelect={() => setDragVisibility('visible')}\n onMouseLeave={() => setDragVisibility('hidden')}\n aria-disabled={disabled}\n $dragVisibility={dragVisibility}\n >\n <DragIconButton\n tag=\"div\"\n contentEditable={false}\n role=\"button\"\n tabIndex={0}\n withTooltip={false}\n label={formatMessage({\n id: getTranslation('components.DragHandle-label'),\n defaultMessage: 'Drag',\n })}\n onClick={(e) => e.stopPropagation()}\n aria-disabled={disabled}\n disabled={disabled}\n draggable\n // For some blocks top margin added to drag handle to align at the text level\n $dragHandleTopMargin={dragHandleTopMargin}\n >\n <Drag color=\"primary500\" />\n </DragIconButton>\n {children}\n </DragItem>\n )}\n </Wrapper>\n );\n};\n\ninterface CloneDragItemProps {\n children: RenderElementProps['children'];\n dragHandleTopMargin?: CSSProperties['marginTop'];\n}\n\n// To prevent applying opacity to the original item being dragged, display a cloned element without opacity.\nconst CloneDragItem = ({ children, dragHandleTopMargin }: CloneDragItemProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <DragItem gap={2} paddingLeft={2} alignItems=\"start\" $dragVisibility=\"visible\">\n <DragIconButton\n tag=\"div\"\n role=\"button\"\n withTooltip={false}\n label={formatMessage({\n id: getTranslation('components.DragHandle-label'),\n defaultMessage: 'Drag',\n })}\n $dragHandleTopMargin={dragHandleTopMargin}\n >\n <Drag color=\"neutral600\" />\n </DragIconButton>\n {children}\n </DragItem>\n );\n};\n\ninterface ExtendedRenderLeafProps extends RenderLeafProps {\n leaf: RenderLeafProps['leaf'] & { className?: string };\n}\n\nconst baseRenderLeaf = (props: ExtendedRenderLeafProps, modifiers: ModifiersStore) => {\n // Recursively wrap the children for each active modifier\n const wrappedChildren = getEntries(modifiers).reduce((currentChildren, modifierEntry) => {\n const [name, modifier] = modifierEntry;\n\n if (props.leaf[name]) {\n return modifier.renderLeaf(currentChildren);\n }\n\n return currentChildren;\n }, props.children);\n\n return (\n <span {...props.attributes} className={props.leaf.className}>\n {wrappedChildren}\n </span>\n );\n};\n\ntype BaseRenderElementProps = Direction & {\n props: RenderElementProps['children'];\n blocks: BlocksStore;\n editor: Editor;\n};\n\nconst baseRenderElement = ({\n props,\n blocks,\n editor,\n setDragDirection,\n dragDirection,\n}: BaseRenderElementProps) => {\n const { element } = props;\n\n const blockMatch = Object.values(blocks).find((block) => block.matchNode(element));\n const block = blockMatch || blocks.paragraph;\n const nodePath = ReactEditor.findPath(editor, element);\n\n // Link is inline block so it cannot be dragged\n // List items and nested list blocks i.e. lists with indent level higher than 0 are skipped from dragged items\n if (\n isLinkNode(element) ||\n (isListNode(element) && element.indentLevel && element.indentLevel > 0) ||\n element.type === 'list-item'\n ) {\n return block.renderElement(props);\n }\n\n return (\n <DragAndDropElement\n index={nodePath}\n setDragDirection={setDragDirection}\n dragDirection={dragDirection}\n dragHandleTopMargin={block.dragHandleTopMargin}\n >\n {block.renderElement(props)}\n </DragAndDropElement>\n );\n};\n\nconst dragNoop = () => true;\n\ninterface BlocksContentProps {\n placeholder?: string;\n ariaLabelId: string;\n}\n\nconst BlocksContent = ({ placeholder, ariaLabelId }: BlocksContentProps) => {\n const { editor, disabled, blocks, modifiers, setLiveText, isExpandedMode } =\n useBlocksEditorContext('BlocksContent');\n const blocksRef = React.useRef<HTMLDivElement>(null);\n const { formatMessage } = useIntl();\n const [dragDirection, setDragDirection] = React.useState<DragDirection | null>(null);\n const { modalElement, handleConversionResult } = useConversionModal();\n\n // Create renderLeaf function based on the modifiers store\n const renderLeaf = React.useCallback(\n (props: ExtendedRenderLeafProps) => baseRenderLeaf(props, modifiers),\n [modifiers]\n );\n\n const handleMoveBlocks = (editor: Editor, event: React.KeyboardEvent<HTMLElement>) => {\n if (!editor.selection) return;\n\n const start = Range.start(editor.selection);\n const currentIndex = [start.path[0]];\n let newIndexPosition = 0;\n\n if (event.key === 'ArrowUp') {\n newIndexPosition = currentIndex[0] > 0 ? currentIndex[0] - 1 : currentIndex[0];\n } else {\n newIndexPosition =\n currentIndex[0] < editor.children.length - 1 ? currentIndex[0] + 1 : currentIndex[0];\n }\n\n const newIndex = [newIndexPosition];\n\n if (newIndexPosition !== currentIndex[0]) {\n Transforms.moveNodes(editor, {\n at: currentIndex,\n to: newIndex,\n });\n\n setLiveText(\n formatMessage(\n {\n id: getTranslation('components.Blocks.dnd.reorder'),\n defaultMessage: '{item}, moved. New position in the editor: {position}.',\n },\n {\n item: `${name}.${currentIndex[0] + 1}`,\n position: `${newIndex[0] + 1} of ${editor.children.length}`,\n }\n )\n );\n\n event.preventDefault();\n }\n };\n\n // Create renderElement function base on the blocks store\n const renderElement = React.useCallback(\n (props: RenderElementProps) =>\n baseRenderElement({ props, blocks, editor, dragDirection, setDragDirection }),\n [blocks, editor, dragDirection, setDragDirection]\n );\n\n const checkSnippet = (event: React.KeyboardEvent<HTMLElement>) => {\n // Get current text block\n if (!editor.selection) {\n return;\n }\n\n const [textNode, textNodePath] = Editor.node(editor, editor.selection.anchor.path);\n\n // Narrow the type to a text node\n if (Editor.isEditor(textNode) || textNode.type !== 'text') {\n return;\n }\n\n // Don't check for snippets if we're not at the start of a block\n if (textNodePath.at(-1) !== 0) {\n return;\n }\n\n // Check if the text node starts with a known snippet\n const blockMatchingSnippet = Object.values(blocks).find((block) => {\n return block.snippets?.includes(textNode.text);\n });\n\n if (blockMatchingSnippet?.handleConvert) {\n // Prevent the space from being created and delete the snippet\n event.preventDefault();\n Transforms.delete(editor, {\n distance: textNode.text.length,\n unit: 'character',\n reverse: true,\n });\n\n // Convert the selected block\n const maybeRenderModal = blockMatchingSnippet.handleConvert(editor);\n handleConversionResult(maybeRenderModal);\n }\n };\n\n const handleEnter = (event: React.KeyboardEvent<HTMLElement>) => {\n if (!editor.selection) {\n return;\n }\n\n const selectedNode = editor.children[editor.selection.anchor.path[0]];\n const selectedBlock = Object.values(blocks).find((block) => block.matchNode(selectedNode));\n if (!selectedBlock) {\n return;\n }\n\n // Allow forced line breaks when shift is pressed\n if (event.shiftKey && selectedNode.type !== 'image') {\n Transforms.insertText(editor, '\\n');\n return;\n }\n\n // Check if there's an enter handler for the selected block\n if (selectedBlock.handleEnterKey) {\n selectedBlock.handleEnterKey(editor);\n } else {\n blocks.paragraph.handleEnterKey!(editor);\n }\n };\n\n const handleBackspaceEvent = (event: React.KeyboardEvent<HTMLElement>) => {\n if (!editor.selection) {\n return;\n }\n\n const selectedNode = editor.children[editor.selection.anchor.path[0]];\n const selectedBlock = Object.values(blocks).find((block) => block.matchNode(selectedNode));\n\n if (!selectedBlock) {\n return;\n }\n\n if (selectedBlock.handleBackspaceKey) {\n selectedBlock.handleBackspaceKey(editor, event);\n }\n };\n\n const handleTab = (event: React.KeyboardEvent<HTMLElement>) => {\n if (!editor.selection) {\n return;\n }\n\n const selectedNode = editor.children[editor.selection.anchor.path[0]];\n const selectedBlock = Object.values(blocks).find((block) => block.matchNode(selectedNode));\n if (!selectedBlock) {\n return;\n }\n\n if (selectedBlock.handleTab) {\n event.preventDefault();\n selectedBlock.handleTab(editor);\n }\n };\n\n const handleKeyboardShortcuts = (event: React.KeyboardEvent<HTMLElement>) => {\n const isCtrlOrCmd = event.metaKey || event.ctrlKey;\n\n if (isCtrlOrCmd) {\n // Check if there's a modifier to toggle\n Object.values(modifiers).forEach((value) => {\n if (value.isValidEventKey(event)) {\n value.handleToggle(editor);\n return;\n }\n });\n if (event.shiftKey && ['ArrowUp', 'ArrowDown'].includes(event.key)) {\n handleMoveBlocks(editor, event);\n }\n }\n };\n\n const handleKeyDown: React.KeyboardEventHandler<HTMLElement> = (event) => {\n // Find the right block-specific handlers for enter and backspace key presses\n switch (event.key) {\n case 'Enter':\n event.preventDefault();\n return handleEnter(event);\n case 'Backspace':\n return handleBackspaceEvent(event);\n case 'Tab':\n return handleTab(event);\n case 'Escape':\n return ReactEditor.blur(editor);\n }\n handleKeyboardShortcuts(event);\n // Check if a snippet was triggered\n if (event.key === ' ') {\n checkSnippet(event);\n }\n };\n\n /**\n * scrollSelectionIntoView : Slate's default method to scroll a DOM selection into the view,\n * thats shifting layout for us when there is a overflowY:scroll on the viewport.\n * We are overriding it to check if the selection is not fully within the visible area of the editor,\n * we use scrollBy one line to the bottom\n */\n\n const handleScrollSelectionIntoView = React.useCallback(() => {\n if (!editor.selection || !blocksRef.current) {\n return;\n }\n\n const domRange = ReactEditor.toDOMRange(editor, editor.selection);\n const domRect = domRange.getBoundingClientRect();\n\n const editorRect = blocksRef.current.getBoundingClientRect();\n\n // Check if the selection is not fully within the visible area of the editor\n if (domRect.top < editorRect.top || domRect.bottom > editorRect.bottom) {\n // Scroll by one line to the bottom\n blocksRef.current.scrollBy({\n top: 28, // 20px is the line-height + 8px line gap\n behavior: 'smooth',\n });\n }\n }, [editor]);\n\n return (\n <Box\n ref={blocksRef}\n grow={1}\n width=\"100%\"\n overflow=\"auto\"\n fontSize={2}\n background=\"neutral0\"\n color=\"neutral800\"\n lineHeight={6}\n paddingRight={7}\n paddingTop={6}\n paddingBottom={3}\n >\n <StyledEditable\n aria-labelledby={ariaLabelId}\n readOnly={disabled}\n placeholder={placeholder}\n isExpandedMode={isExpandedMode}\n decorate={decorateCode}\n renderElement={renderElement}\n renderLeaf={renderLeaf}\n onKeyDown={handleKeyDown}\n scrollSelectionIntoView={handleScrollSelectionIntoView}\n // As we have our own handler to drag and drop the elements returing true will skip slate's own event handler\n onDrop={dragNoop}\n onDragStart={dragNoop}\n />\n {modalElement}\n </Box>\n );\n};\n\nexport { BlocksContent, BlocksContentProps };\n"],"names":["StyledEditable","styled","Editable","theme","spaces","props","isExpandedMode","Wrapper","Box","isOverDropTarget","DropPlaceholder","dragDirection","placeholderMargin","css","DIRECTIONS","UPWARD","DOWNWARD","DragItem","Flex","$dragVisibility","DragIconButton","IconButton","borderRadius","$dragHandleTopMargin","colors","neutral100","neutral150","neutral500","DragAndDropElement","children","index","setDragDirection","dragHandleTopMargin","editor","disabled","name","setLiveText","useBlocksEditorContext","formatMessage","useIntl","dragVisibility","setDragVisibility","React","useState","handleMoveBlock","useCallback","newIndex","currentIndex","Transforms","moveNodes","at","to","currentIndexPosition","slice","newIndexPosition","id","getTranslation","defaultMessage","item","join","position","length","handlerId","isDragging","direction","blockRef","dropRef","dragRef","useDragAndDrop","type","ItemTypes","BLOCKS","displayedValue","onDropItem","composedBoxRefs","useComposedRefs","useEffect","selection","_jsxs","ref","_jsx","borderStyle","borderColor","borderWidth","width","marginLeft","as","CloneDragItem","data-handler-id","gap","paddingLeft","alignItems","onDragStart","event","target","currentTarget","getAttribute","preventDefault","style","opacity","onDragEnd","onMouseMove","onSelect","onMouseLeave","aria-disabled","tag","contentEditable","role","tabIndex","withTooltip","label","onClick","e","stopPropagation","draggable","Drag","color","baseRenderLeaf","modifiers","wrappedChildren","getEntries","reduce","currentChildren","modifierEntry","modifier","leaf","renderLeaf","span","attributes","className","baseRenderElement","blocks","element","blockMatch","Object","values","find","block","matchNode","paragraph","nodePath","ReactEditor","findPath","isLinkNode","isListNode","indentLevel","renderElement","dragNoop","BlocksContent","placeholder","ariaLabelId","blocksRef","useRef","modalElement","handleConversionResult","useConversionModal","handleMoveBlocks","start","Range","path","key","checkSnippet","textNode","textNodePath","Editor","node","anchor","isEditor","blockMatchingSnippet","snippets","includes","text","handleConvert","delete","distance","unit","reverse","maybeRenderModal","handleEnter","selectedNode","selectedBlock","shiftKey","insertText","handleEnterKey","handleBackspaceEvent","handleBackspaceKey","handleTab","handleKeyboardShortcuts","isCtrlOrCmd","metaKey","ctrlKey","forEach","value","isValidEventKey","handleToggle","handleKeyDown","blur","handleScrollSelectionIntoView","current","domRange","toDOMRange","domRect","getBoundingClientRect","editorRect","top","bottom","scrollBy","behavior","grow","overflow","fontSize","background","lineHeight","paddingRight","paddingTop","paddingBottom","aria-labelledby","readOnly","decorate","decorateCode","onKeyDown","scrollSelectionIntoView","onDrop"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BlocksContent.mjs","sources":["../../../../../../../admin/src/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Box,\n BoxComponent,\n Flex,\n FlexComponent,\n IconButton,\n IconButtonComponent,\n useComposedRefs,\n} from '@strapi/design-system';\nimport { Drag } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { Editor, Range, Transforms } from 'slate';\nimport { ReactEditor, type RenderElementProps, type RenderLeafProps, Editable } from 'slate-react';\nimport { styled, CSSProperties, css } from 'styled-components';\n\nimport { ItemTypes } from '../../../../../constants/dragAndDrop';\nimport { useDragAndDrop, DIRECTIONS } from '../../../../../hooks/useDragAndDrop';\nimport { getTranslation } from '../../../../../utils/translations';\n\nimport { decorateCode } from './Blocks/Code';\nimport { type BlocksStore, useBlocksEditorContext } from './BlocksEditor';\nimport { useConversionModal } from './BlocksToolbar';\nimport { type ModifiersStore } from './Modifiers';\nimport { getEntries, isLinkNode, isListNode } from './utils/types';\n\nconst StyledEditable = styled(Editable)<{ $isExpandedMode: boolean }>`\n // The outline style is set on the wrapper with :focus-within\n outline: none;\n display: flex;\n flex-direction: column;\n gap: ${({ theme }) => theme.spaces[3]};\n height: 100%;\n // For fullscreen align input in the center with fixed width\n width: ${(props) => (props.$isExpandedMode ? '512px' : '100%')};\n margin: auto;\n\n > *:last-child {\n padding-bottom: ${({ theme }) => theme.spaces[3]};\n }\n`;\n\nconst Wrapper = styled<BoxComponent>(Box)<{ $isOverDropTarget: boolean }>`\n position: ${({ $isOverDropTarget }) => $isOverDropTarget && 'relative'};\n`;\n\ntype DragDirection = (typeof DIRECTIONS)[keyof typeof DIRECTIONS];\n\nconst DropPlaceholder = styled<BoxComponent>(Box)<{\n dragDirection: DragDirection | null;\n placeholderMargin: 1 | 2;\n}>`\n position: absolute;\n right: 0;\n\n // Show drop placeholder 8px above or below the drop target\n ${({ dragDirection, theme, placeholderMargin }) => css`\n top: ${dragDirection === DIRECTIONS.UPWARD && `-${theme.spaces[placeholderMargin]}`};\n bottom: ${dragDirection === DIRECTIONS.DOWNWARD && `-${theme.spaces[placeholderMargin]}`};\n `}\n`;\n\nconst DragItem = styled<FlexComponent>(Flex)<{ $dragVisibility: CSSProperties['visibility'] }>`\n // Style each block rendered using renderElement()\n & > [data-slate-node='element'] {\n width: 100%;\n opacity: inherit;\n }\n\n // Set the visibility of drag button\n [role='button'] {\n visibility: ${(props) => props.$dragVisibility};\n opacity: inherit;\n }\n &[aria-disabled='true'] {\n user-drag: none;\n }\n`;\n\nconst DragIconButton = styled<IconButtonComponent<'div'>>(IconButton)<{\n $dragHandleTopMargin?: CSSProperties['marginTop'];\n}>`\n user-select: none;\n display: flex;\n align-items: center;\n justify-content: center;\n border: none;\n border-radius: ${({ theme }) => theme.borderRadius};\n padding-left: ${({ theme }) => theme.spaces[0]};\n padding-right: ${({ theme }) => theme.spaces[0]};\n padding-top: ${({ theme }) => theme.spaces[1]};\n padding-bottom: ${({ theme }) => theme.spaces[1]};\n visibility: hidden;\n cursor: grab;\n opacity: inherit;\n margin-top: ${(props) => props.$dragHandleTopMargin ?? 0};\n\n &:hover {\n background: ${({ theme }) => theme.colors.neutral100};\n }\n &:active {\n cursor: grabbing;\n background: ${({ theme }) => theme.colors.neutral150};\n }\n &[aria-disabled='true'] {\n visibility: hidden;\n }\n svg {\n min-width: ${({ theme }) => theme.spaces[3]};\n\n path {\n fill: ${({ theme }) => theme.colors.neutral500};\n }\n }\n`;\n\ntype Direction = {\n setDragDirection: (direction: DragDirection) => void;\n dragDirection: DragDirection | null;\n};\n\ntype DragAndDropElementProps = Direction & {\n children: RenderElementProps['children'];\n index: Array<number>;\n dragHandleTopMargin?: CSSProperties['marginTop'];\n};\n\nconst DragAndDropElement = ({\n children,\n index,\n setDragDirection,\n dragDirection,\n dragHandleTopMargin,\n}: DragAndDropElementProps) => {\n const { editor, disabled, name, setLiveText } = useBlocksEditorContext('drag-and-drop');\n const { formatMessage } = useIntl();\n const [dragVisibility, setDragVisibility] = React.useState<CSSProperties['visibility']>('hidden');\n\n const handleMoveBlock = React.useCallback(\n (newIndex: Array<number>, currentIndex: Array<number>) => {\n Transforms.moveNodes(editor, {\n at: currentIndex,\n to: newIndex,\n });\n\n // Add 1 to the index for the live text message\n const currentIndexPosition = [currentIndex[0] + 1, ...currentIndex.slice(1)];\n const newIndexPosition = [newIndex[0] + 1, ...newIndex.slice(1)];\n\n setLiveText(\n formatMessage(\n {\n id: getTranslation('components.Blocks.dnd.reorder'),\n defaultMessage: '{item}, moved. New position in the editor: {position}.',\n },\n {\n item: `${name}.${currentIndexPosition.join(',')}`,\n position: `${newIndexPosition.join(',')} of ${editor.children.length}`,\n }\n )\n );\n },\n [editor, formatMessage, name, setLiveText]\n );\n\n const [{ handlerId, isDragging, isOverDropTarget, direction }, blockRef, dropRef, dragRef] =\n useDragAndDrop(!disabled, {\n type: `${ItemTypes.BLOCKS}_${name}`,\n index,\n item: {\n index,\n displayedValue: children,\n },\n onDropItem(currentIndex, newIndex) {\n if (newIndex) handleMoveBlock(newIndex, currentIndex);\n },\n });\n\n const composedBoxRefs = useComposedRefs(blockRef, dropRef);\n\n // Set Drag direction before loosing state while dragging\n React.useEffect(() => {\n if (direction) {\n setDragDirection(direction);\n }\n }, [direction, setDragDirection]);\n\n // On selection change hide drag handle\n React.useEffect(() => {\n setDragVisibility('hidden');\n }, [editor.selection]);\n\n return (\n <Wrapper ref={composedBoxRefs} $isOverDropTarget={isOverDropTarget}>\n {isOverDropTarget && (\n <DropPlaceholder\n borderStyle=\"solid\"\n borderColor=\"secondary200\"\n borderWidth=\"2px\"\n width=\"calc(100% - 24px)\"\n marginLeft=\"auto\"\n dragDirection={dragDirection}\n // For list items placeholder reduce the margin around\n placeholderMargin={children.props.as && children.props.as === 'li' ? 1 : 2}\n />\n )}\n {isDragging ? (\n <CloneDragItem dragHandleTopMargin={dragHandleTopMargin}>{children}</CloneDragItem>\n ) : (\n <DragItem\n ref={dragRef}\n data-handler-id={handlerId}\n gap={2}\n paddingLeft={2}\n alignItems=\"start\"\n onDragStart={(event) => {\n const target = event.target as HTMLElement;\n const currentTarget = event.currentTarget as HTMLElement;\n\n // Dragging action should only trigger drag event when button is dragged, however update styles on the whole dragItem.\n if (target.getAttribute('role') !== 'button') {\n event.preventDefault();\n } else {\n // Setting styles using dragging state is not working, so set it on current target element as nodes get dragged\n currentTarget.style.opacity = '0.5';\n }\n }}\n onDragEnd={(event) => {\n const currentTarget = event.currentTarget as HTMLElement;\n currentTarget.style.opacity = '1';\n }}\n onMouseMove={() => setDragVisibility('visible')}\n onSelect={() => setDragVisibility('visible')}\n onMouseLeave={() => setDragVisibility('hidden')}\n aria-disabled={disabled}\n $dragVisibility={dragVisibility}\n >\n <DragIconButton\n tag=\"div\"\n contentEditable={false}\n role=\"button\"\n tabIndex={0}\n withTooltip={false}\n label={formatMessage({\n id: getTranslation('components.DragHandle-label'),\n defaultMessage: 'Drag',\n })}\n onClick={(e) => e.stopPropagation()}\n aria-disabled={disabled}\n disabled={disabled}\n draggable\n // For some blocks top margin added to drag handle to align at the text level\n $dragHandleTopMargin={dragHandleTopMargin}\n >\n <Drag color=\"primary500\" />\n </DragIconButton>\n {children}\n </DragItem>\n )}\n </Wrapper>\n );\n};\n\ninterface CloneDragItemProps {\n children: RenderElementProps['children'];\n dragHandleTopMargin?: CSSProperties['marginTop'];\n}\n\n// To prevent applying opacity to the original item being dragged, display a cloned element without opacity.\nconst CloneDragItem = ({ children, dragHandleTopMargin }: CloneDragItemProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <DragItem gap={2} paddingLeft={2} alignItems=\"start\" $dragVisibility=\"visible\">\n <DragIconButton\n tag=\"div\"\n role=\"button\"\n withTooltip={false}\n label={formatMessage({\n id: getTranslation('components.DragHandle-label'),\n defaultMessage: 'Drag',\n })}\n $dragHandleTopMargin={dragHandleTopMargin}\n >\n <Drag color=\"neutral600\" />\n </DragIconButton>\n {children}\n </DragItem>\n );\n};\n\ninterface ExtendedRenderLeafProps extends RenderLeafProps {\n leaf: RenderLeafProps['leaf'] & { className?: string };\n}\n\nconst baseRenderLeaf = (props: ExtendedRenderLeafProps, modifiers: ModifiersStore) => {\n // Recursively wrap the children for each active modifier\n const wrappedChildren = getEntries(modifiers).reduce((currentChildren, modifierEntry) => {\n const [name, modifier] = modifierEntry;\n\n if (props.leaf[name]) {\n return modifier.renderLeaf(currentChildren);\n }\n\n return currentChildren;\n }, props.children);\n\n return (\n <span {...props.attributes} className={props.leaf.className}>\n {wrappedChildren}\n </span>\n );\n};\n\ntype BaseRenderElementProps = Direction & {\n props: RenderElementProps['children'];\n blocks: BlocksStore;\n editor: Editor;\n};\n\nconst baseRenderElement = ({\n props,\n blocks,\n editor,\n setDragDirection,\n dragDirection,\n}: BaseRenderElementProps) => {\n const { element } = props;\n\n const blockMatch = Object.values(blocks).find((block) => block.matchNode(element));\n const block = blockMatch || blocks.paragraph;\n const nodePath = ReactEditor.findPath(editor, element);\n\n // Link is inline block so it cannot be dragged\n // List items and nested list blocks i.e. lists with indent level higher than 0 are skipped from dragged items\n if (\n isLinkNode(element) ||\n (isListNode(element) && element.indentLevel && element.indentLevel > 0) ||\n element.type === 'list-item'\n ) {\n return block.renderElement(props);\n }\n\n return (\n <DragAndDropElement\n index={nodePath}\n setDragDirection={setDragDirection}\n dragDirection={dragDirection}\n dragHandleTopMargin={block.dragHandleTopMargin}\n >\n {block.renderElement(props)}\n </DragAndDropElement>\n );\n};\n\nconst dragNoop = () => true;\n\ninterface BlocksContentProps {\n placeholder?: string;\n ariaLabelId: string;\n}\n\nconst BlocksContent = ({ placeholder, ariaLabelId }: BlocksContentProps) => {\n const { editor, disabled, blocks, modifiers, setLiveText, isExpandedMode } =\n useBlocksEditorContext('BlocksContent');\n const blocksRef = React.useRef<HTMLDivElement>(null);\n const { formatMessage } = useIntl();\n const [dragDirection, setDragDirection] = React.useState<DragDirection | null>(null);\n const { modalElement, handleConversionResult } = useConversionModal();\n\n // Create renderLeaf function based on the modifiers store\n const renderLeaf = React.useCallback(\n (props: ExtendedRenderLeafProps) => baseRenderLeaf(props, modifiers),\n [modifiers]\n );\n\n const handleMoveBlocks = (editor: Editor, event: React.KeyboardEvent<HTMLElement>) => {\n if (!editor.selection) return;\n\n const start = Range.start(editor.selection);\n const currentIndex = [start.path[0]];\n let newIndexPosition = 0;\n\n if (event.key === 'ArrowUp') {\n newIndexPosition = currentIndex[0] > 0 ? currentIndex[0] - 1 : currentIndex[0];\n } else {\n newIndexPosition =\n currentIndex[0] < editor.children.length - 1 ? currentIndex[0] + 1 : currentIndex[0];\n }\n\n const newIndex = [newIndexPosition];\n\n if (newIndexPosition !== currentIndex[0]) {\n Transforms.moveNodes(editor, {\n at: currentIndex,\n to: newIndex,\n });\n\n setLiveText(\n formatMessage(\n {\n id: getTranslation('components.Blocks.dnd.reorder'),\n defaultMessage: '{item}, moved. New position in the editor: {position}.',\n },\n {\n item: `${name}.${currentIndex[0] + 1}`,\n position: `${newIndex[0] + 1} of ${editor.children.length}`,\n }\n )\n );\n\n event.preventDefault();\n }\n };\n\n // Create renderElement function base on the blocks store\n const renderElement = React.useCallback(\n (props: RenderElementProps) =>\n baseRenderElement({ props, blocks, editor, dragDirection, setDragDirection }),\n [blocks, editor, dragDirection, setDragDirection]\n );\n\n const checkSnippet = (event: React.KeyboardEvent<HTMLElement>) => {\n // Get current text block\n if (!editor.selection) {\n return;\n }\n\n const [textNode, textNodePath] = Editor.node(editor, editor.selection.anchor.path);\n\n // Narrow the type to a text node\n if (Editor.isEditor(textNode) || textNode.type !== 'text') {\n return;\n }\n\n // Don't check for snippets if we're not at the start of a block\n if (textNodePath.at(-1) !== 0) {\n return;\n }\n\n // Check if the text node starts with a known snippet\n const blockMatchingSnippet = Object.values(blocks).find((block) => {\n return block.snippets?.includes(textNode.text);\n });\n\n if (blockMatchingSnippet?.handleConvert) {\n // Prevent the space from being created and delete the snippet\n event.preventDefault();\n Transforms.delete(editor, {\n distance: textNode.text.length,\n unit: 'character',\n reverse: true,\n });\n\n // Convert the selected block\n const maybeRenderModal = blockMatchingSnippet.handleConvert(editor);\n handleConversionResult(maybeRenderModal);\n }\n };\n\n const handleEnter = (event: React.KeyboardEvent<HTMLElement>) => {\n if (!editor.selection) {\n return;\n }\n\n const selectedNode = editor.children[editor.selection.anchor.path[0]];\n const selectedBlock = Object.values(blocks).find((block) => block.matchNode(selectedNode));\n if (!selectedBlock) {\n return;\n }\n\n // Allow forced line breaks when shift is pressed\n if (event.shiftKey && selectedNode.type !== 'image') {\n Transforms.insertText(editor, '\\n');\n return;\n }\n\n // Check if there's an enter handler for the selected block\n if (selectedBlock.handleEnterKey) {\n selectedBlock.handleEnterKey(editor);\n } else {\n blocks.paragraph.handleEnterKey!(editor);\n }\n };\n\n const handleBackspaceEvent = (event: React.KeyboardEvent<HTMLElement>) => {\n if (!editor.selection) {\n return;\n }\n\n const selectedNode = editor.children[editor.selection.anchor.path[0]];\n const selectedBlock = Object.values(blocks).find((block) => block.matchNode(selectedNode));\n\n if (!selectedBlock) {\n return;\n }\n\n if (selectedBlock.handleBackspaceKey) {\n selectedBlock.handleBackspaceKey(editor, event);\n }\n };\n\n const handleTab = (event: React.KeyboardEvent<HTMLElement>) => {\n if (!editor.selection) {\n return;\n }\n\n const selectedNode = editor.children[editor.selection.anchor.path[0]];\n const selectedBlock = Object.values(blocks).find((block) => block.matchNode(selectedNode));\n if (!selectedBlock) {\n return;\n }\n\n if (selectedBlock.handleTab) {\n event.preventDefault();\n selectedBlock.handleTab(editor);\n }\n };\n\n const handleKeyboardShortcuts = (event: React.KeyboardEvent<HTMLElement>) => {\n const isCtrlOrCmd = event.metaKey || event.ctrlKey;\n\n if (isCtrlOrCmd) {\n // Check if there's a modifier to toggle\n Object.values(modifiers).forEach((value) => {\n if (value.isValidEventKey(event)) {\n value.handleToggle(editor);\n return;\n }\n });\n if (event.shiftKey && ['ArrowUp', 'ArrowDown'].includes(event.key)) {\n handleMoveBlocks(editor, event);\n }\n }\n };\n\n const handleKeyDown: React.KeyboardEventHandler<HTMLElement> = (event) => {\n // Find the right block-specific handlers for enter and backspace key presses\n switch (event.key) {\n case 'Enter':\n event.preventDefault();\n return handleEnter(event);\n case 'Backspace':\n return handleBackspaceEvent(event);\n case 'Tab':\n return handleTab(event);\n case 'Escape':\n return ReactEditor.blur(editor);\n }\n handleKeyboardShortcuts(event);\n // Check if a snippet was triggered\n if (event.key === ' ') {\n checkSnippet(event);\n }\n };\n\n /**\n * scrollSelectionIntoView : Slate's default method to scroll a DOM selection into the view,\n * thats shifting layout for us when there is a overflowY:scroll on the viewport.\n * We are overriding it to check if the selection is not fully within the visible area of the editor,\n * we use scrollBy one line to the bottom\n */\n\n const handleScrollSelectionIntoView = React.useCallback(() => {\n if (!editor.selection || !blocksRef.current) {\n return;\n }\n\n const domRange = ReactEditor.toDOMRange(editor, editor.selection);\n const domRect = domRange.getBoundingClientRect();\n\n const editorRect = blocksRef.current.getBoundingClientRect();\n\n // Check if the selection is not fully within the visible area of the editor\n if (domRect.top < editorRect.top || domRect.bottom > editorRect.bottom) {\n // Scroll by one line to the bottom\n blocksRef.current.scrollBy({\n top: 28, // 20px is the line-height + 8px line gap\n behavior: 'smooth',\n });\n }\n }, [editor]);\n\n return (\n <Box\n ref={blocksRef}\n grow={1}\n width=\"100%\"\n overflow=\"auto\"\n fontSize={2}\n background=\"neutral0\"\n color=\"neutral800\"\n lineHeight={6}\n paddingRight={7}\n paddingTop={6}\n paddingBottom={3}\n >\n <StyledEditable\n aria-labelledby={ariaLabelId}\n readOnly={disabled}\n placeholder={placeholder}\n $isExpandedMode={isExpandedMode}\n decorate={decorateCode}\n renderElement={renderElement}\n renderLeaf={renderLeaf}\n onKeyDown={handleKeyDown}\n scrollSelectionIntoView={handleScrollSelectionIntoView}\n // As we have our own handler to drag and drop the elements returing true will skip slate's own event handler\n onDrop={dragNoop}\n onDragStart={dragNoop}\n />\n {modalElement}\n </Box>\n );\n};\n\nexport { BlocksContent, BlocksContentProps };\n"],"names":["StyledEditable","styled","Editable","theme","spaces","props","$isExpandedMode","Wrapper","Box","$isOverDropTarget","DropPlaceholder","dragDirection","placeholderMargin","css","DIRECTIONS","UPWARD","DOWNWARD","DragItem","Flex","$dragVisibility","DragIconButton","IconButton","borderRadius","$dragHandleTopMargin","colors","neutral100","neutral150","neutral500","DragAndDropElement","children","index","setDragDirection","dragHandleTopMargin","editor","disabled","name","setLiveText","useBlocksEditorContext","formatMessage","useIntl","dragVisibility","setDragVisibility","React","useState","handleMoveBlock","useCallback","newIndex","currentIndex","Transforms","moveNodes","at","to","currentIndexPosition","slice","newIndexPosition","id","getTranslation","defaultMessage","item","join","position","length","handlerId","isDragging","isOverDropTarget","direction","blockRef","dropRef","dragRef","useDragAndDrop","type","ItemTypes","BLOCKS","displayedValue","onDropItem","composedBoxRefs","useComposedRefs","useEffect","selection","_jsxs","ref","_jsx","borderStyle","borderColor","borderWidth","width","marginLeft","as","CloneDragItem","data-handler-id","gap","paddingLeft","alignItems","onDragStart","event","target","currentTarget","getAttribute","preventDefault","style","opacity","onDragEnd","onMouseMove","onSelect","onMouseLeave","aria-disabled","tag","contentEditable","role","tabIndex","withTooltip","label","onClick","e","stopPropagation","draggable","Drag","color","baseRenderLeaf","modifiers","wrappedChildren","getEntries","reduce","currentChildren","modifierEntry","modifier","leaf","renderLeaf","span","attributes","className","baseRenderElement","blocks","element","blockMatch","Object","values","find","block","matchNode","paragraph","nodePath","ReactEditor","findPath","isLinkNode","isListNode","indentLevel","renderElement","dragNoop","BlocksContent","placeholder","ariaLabelId","isExpandedMode","blocksRef","useRef","modalElement","handleConversionResult","useConversionModal","handleMoveBlocks","start","Range","path","key","checkSnippet","textNode","textNodePath","Editor","node","anchor","isEditor","blockMatchingSnippet","snippets","includes","text","handleConvert","delete","distance","unit","reverse","maybeRenderModal","handleEnter","selectedNode","selectedBlock","shiftKey","insertText","handleEnterKey","handleBackspaceEvent","handleBackspaceKey","handleTab","handleKeyboardShortcuts","isCtrlOrCmd","metaKey","ctrlKey","forEach","value","isValidEventKey","handleToggle","handleKeyDown","blur","handleScrollSelectionIntoView","current","domRange","toDOMRange","domRect","getBoundingClientRect","editorRect","top","bottom","scrollBy","behavior","grow","overflow","fontSize","background","lineHeight","paddingRight","paddingTop","paddingBottom","aria-labelledby","readOnly","decorate","decorateCode","onKeyDown","scrollSelectionIntoView","onDrop"],"mappings":"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"}
|
|
@@ -112,6 +112,13 @@ function useBlocksEditorContext(consumerName) {
|
|
|
112
112
|
};
|
|
113
113
|
}
|
|
114
114
|
const pipe = (...fns)=>(value)=>fns.reduce((prev, fn)=>fn(prev), value);
|
|
115
|
+
/**
|
|
116
|
+
* Normalize the blocks state to null if the editor state is considered empty,
|
|
117
|
+
* otherwise return the state
|
|
118
|
+
*/ const normalizeBlocksState = (editor, value)=>{
|
|
119
|
+
const isEmpty = value.length === 1 && slate.Editor.isEmpty(editor, value[0]);
|
|
120
|
+
return isEmpty ? null : value;
|
|
121
|
+
};
|
|
115
122
|
const BlocksEditor = /*#__PURE__*/ React__namespace.forwardRef(({ disabled = false, name, onChange, value, error, ...contentProps }, forwardedRef)=>{
|
|
116
123
|
const { formatMessage } = reactIntl.useIntl();
|
|
117
124
|
const [editor] = React__namespace.useState(()=>pipe(slateHistory.withHistory, withImages.withImages, withStrapiSchema.withStrapiSchema, slateReact.withReact, withLinks.withLinks)(slate.createEditor()));
|
|
@@ -145,12 +152,13 @@ const BlocksEditor = /*#__PURE__*/ React__namespace.forwardRef(({ disabled = fal
|
|
|
145
152
|
// Set a new debounce timeout
|
|
146
153
|
debounceTimeout.current = setTimeout(()=>{
|
|
147
154
|
incrementSlateUpdatesCount();
|
|
148
|
-
|
|
155
|
+
// Normalize the state (empty editor becomes null)
|
|
156
|
+
onChange(name, normalizeBlocksState(editor, state));
|
|
149
157
|
debounceTimeout.current = null;
|
|
150
158
|
}, 300);
|
|
151
159
|
}
|
|
152
160
|
}, [
|
|
153
|
-
editor
|
|
161
|
+
editor,
|
|
154
162
|
incrementSlateUpdatesCount,
|
|
155
163
|
name,
|
|
156
164
|
onChange
|
|
@@ -165,8 +173,11 @@ const BlocksEditor = /*#__PURE__*/ React__namespace.forwardRef(({ disabled = fal
|
|
|
165
173
|
}, []);
|
|
166
174
|
// Ensure the editor is in sync after discard
|
|
167
175
|
React__namespace.useEffect(()=>{
|
|
176
|
+
// Normalize empty states for comparison to avoid losing focus on the editor when content is deleted
|
|
177
|
+
const normalizedValue = value?.length ? value : null;
|
|
178
|
+
const normalizedEditorState = normalizeBlocksState(editor, editor.children);
|
|
168
179
|
// Compare the field value with the editor state to check for a stale selection
|
|
169
|
-
if (
|
|
180
|
+
if (normalizedValue && normalizedEditorState && JSON.stringify(normalizedEditorState) !== JSON.stringify(normalizedValue)) {
|
|
170
181
|
// When there is a diff, unset selection to avoid an invalid state
|
|
171
182
|
slate.Transforms.deselect(editor);
|
|
172
183
|
}
|
|
@@ -198,7 +209,7 @@ const BlocksEditor = /*#__PURE__*/ React__namespace.forwardRef(({ disabled = fal
|
|
|
198
209
|
}),
|
|
199
210
|
/*#__PURE__*/ jsxRuntime.jsx(slateReact.Slate, {
|
|
200
211
|
editor: editor,
|
|
201
|
-
initialValue: value
|
|
212
|
+
initialValue: value?.length ? value : [
|
|
202
213
|
{
|
|
203
214
|
type: 'paragraph',
|
|
204
215
|
children: [
|
|
@@ -253,5 +264,6 @@ const BlocksEditor = /*#__PURE__*/ React__namespace.forwardRef(({ disabled = fal
|
|
|
253
264
|
exports.BlocksEditor = BlocksEditor;
|
|
254
265
|
exports.BlocksEditorProvider = BlocksEditorProvider;
|
|
255
266
|
exports.isSelectorBlockKey = isSelectorBlockKey;
|
|
267
|
+
exports.normalizeBlocksState = normalizeBlocksState;
|
|
256
268
|
exports.useBlocksEditorContext = useBlocksEditorContext;
|
|
257
269
|
//# sourceMappingURL=BlocksEditor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BlocksEditor.js","sources":["../../../../../../../admin/src/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { createContext, type FieldValue } from '@strapi/admin/strapi-admin';\nimport { IconButton, Divider, VisuallyHidden } from '@strapi/design-system';\nimport { Expand } from '@strapi/icons';\nimport { MessageDescriptor, useIntl } from 'react-intl';\nimport { Editor, type Descendant, createEditor, Transforms } from 'slate';\nimport { withHistory } from 'slate-history';\nimport { type RenderElementProps, Slate, withReact, ReactEditor, useSlate } from 'slate-react';\nimport { styled, type CSSProperties } from 'styled-components';\n\nimport { getTranslation } from '../../../../../utils/translations';\n\nimport { codeBlocks } from './Blocks/Code';\nimport { headingBlocks } from './Blocks/Heading';\nimport { imageBlocks } from './Blocks/Image';\nimport { linkBlocks } from './Blocks/Link';\nimport { listBlocks } from './Blocks/List';\nimport { paragraphBlocks } from './Blocks/Paragraph';\nimport { quoteBlocks } from './Blocks/Quote';\nimport { BlocksContent, type BlocksContentProps } from './BlocksContent';\nimport { BlocksToolbar } from './BlocksToolbar';\nimport { EditorLayout } from './EditorLayout';\nimport { type ModifiersStore, modifiers } from './Modifiers';\nimport { withImages } from './plugins/withImages';\nimport { withLinks } from './plugins/withLinks';\nimport { withStrapiSchema } from './plugins/withStrapiSchema';\n\nimport type { Schema } from '@strapi/types';\n\n/* -------------------------------------------------------------------------------------------------\n * BlocksEditorProvider\n * -----------------------------------------------------------------------------------------------*/\n\ninterface BaseBlock {\n renderElement: (props: RenderElementProps) => React.JSX.Element;\n matchNode: (node: Schema.Attribute.BlocksNode) => boolean;\n handleConvert?: (editor: Editor) => void | (() => React.JSX.Element);\n handleEnterKey?: (editor: Editor) => void;\n handleBackspaceKey?: (editor: Editor, event: React.KeyboardEvent<HTMLElement>) => void;\n handleTab?: (editor: Editor) => void;\n snippets?: string[];\n dragHandleTopMargin?: CSSProperties['marginTop'];\n}\n\ninterface NonSelectorBlock extends BaseBlock {\n isInBlocksSelector: false;\n}\n\ninterface SelectorBlock extends BaseBlock {\n isInBlocksSelector: true;\n icon: React.ComponentType;\n label: MessageDescriptor;\n}\n\ntype NonSelectorBlockKey = 'list-item' | 'link';\n\nconst selectorBlockKeys = [\n 'paragraph',\n 'heading-one',\n 'heading-two',\n 'heading-three',\n 'heading-four',\n 'heading-five',\n 'heading-six',\n 'list-ordered',\n 'list-unordered',\n 'image',\n 'quote',\n 'code',\n] as const;\n\ntype SelectorBlockKey = (typeof selectorBlockKeys)[number];\n\nconst isSelectorBlockKey = (key: unknown): key is SelectorBlockKey => {\n return typeof key === 'string' && selectorBlockKeys.includes(key as SelectorBlockKey);\n};\n\ntype BlocksStore = {\n [K in SelectorBlockKey]: SelectorBlock;\n} & {\n [K in NonSelectorBlockKey]: NonSelectorBlock;\n};\n\ninterface BlocksEditorContextValue {\n blocks: BlocksStore;\n modifiers: ModifiersStore;\n disabled: boolean;\n name: string;\n setLiveText: (text: string) => void;\n isExpandedMode: boolean;\n}\n\nconst [BlocksEditorProvider, usePartialBlocksEditorContext] =\n createContext<BlocksEditorContextValue>('BlocksEditor');\n\nfunction useBlocksEditorContext(\n consumerName: string\n): BlocksEditorContextValue & { editor: Editor } {\n const context = usePartialBlocksEditorContext(consumerName, (state) => state);\n const editor = useSlate();\n\n return {\n ...context,\n editor,\n };\n}\n\n/* -------------------------------------------------------------------------------------------------\n * BlocksEditor\n * -----------------------------------------------------------------------------------------------*/\n\nconst EditorDivider = styled(Divider)`\n background: ${({ theme }) => theme.colors.neutral200};\n`;\n\n/**\n * Forces an update of the Slate editor when the value prop changes from outside of Slate.\n * The root cause is that Slate is not a controlled component: https://github.com/ianstormtaylor/slate/issues/4612\n * Why not use JSON.stringify(value) as the key?\n * Because it would force a rerender of the entire editor every time the user types a character.\n * Why not use the entity id as the key, since it's unique for each locale?\n * Because it would not solve the problem when using the \"fill in from other locale\" feature\n */\nfunction useResetKey(value?: Schema.Attribute.BlocksValue): {\n key: number;\n incrementSlateUpdatesCount: () => void;\n} {\n // Keep track how many times Slate detected a change from a user interaction in the editor\n const slateUpdatesCount = React.useRef(0);\n // Keep track of how many times the value prop was updated, whether from within editor or from outside\n const valueUpdatesCount = React.useRef(0);\n // Use a key to force a rerender of the Slate editor when needed\n const [key, setKey] = React.useState(0);\n\n React.useEffect(() => {\n valueUpdatesCount.current += 1;\n\n // If the 2 refs are not equal, it means the value was updated from outside\n if (valueUpdatesCount.current !== slateUpdatesCount.current) {\n // So we change the key to force a rerender of the Slate editor,\n // which will pick up the new value through its initialValue prop\n setKey((previousKey) => previousKey + 1);\n\n // Then bring the 2 refs back in sync\n slateUpdatesCount.current = valueUpdatesCount.current;\n }\n }, [value]);\n\n const incrementSlateUpdatesCount = React.useCallback(() => {\n slateUpdatesCount.current += 1;\n }, []);\n\n return { key, incrementSlateUpdatesCount };\n}\n\nconst pipe =\n (...fns: ((baseEditor: Editor) => Editor)[]) =>\n (value: Editor) =>\n fns.reduce<Editor>((prev, fn) => fn(prev), value);\n\ninterface BlocksEditorProps\n extends Pick<FieldValue<Schema.Attribute.BlocksValue>, 'onChange' | 'value' | 'error'>,\n BlocksContentProps {\n disabled?: boolean;\n name: string;\n}\n\nconst BlocksEditor = React.forwardRef<{ focus: () => void }, BlocksEditorProps>(\n ({ disabled = false, name, onChange, value, error, ...contentProps }, forwardedRef) => {\n const { formatMessage } = useIntl();\n const [editor] = React.useState(() =>\n pipe(withHistory, withImages, withStrapiSchema, withReact, withLinks)(createEditor())\n );\n const [liveText, setLiveText] = React.useState('');\n const ariaDescriptionId = React.useId();\n const [isExpandedMode, handleToggleExpand] = React.useReducer((prev) => !prev, false);\n\n /**\n * Editable is not able to hold the ref, https://github.com/ianstormtaylor/slate/issues/4082\n * so with \"useImperativeHandle\" we can use ReactEditor methods to expose to the parent above\n * also not passing forwarded ref here, gives console warning.\n */\n React.useImperativeHandle(\n forwardedRef,\n () => ({\n focus() {\n ReactEditor.focus(editor);\n },\n }),\n [editor]\n );\n\n const { key, incrementSlateUpdatesCount } = useResetKey(value);\n\n const debounceTimeout = React.useRef<NodeJS.Timeout | null>(null);\n\n const handleSlateChange = React.useCallback(\n (state: Descendant[]) => {\n const isAstChange = editor.operations.some((op) => op.type !== 'set_selection');\n\n if (isAstChange) {\n /**\n * Slate handles the state of the editor internally. We just need to keep Strapi's form\n * state in sync with it in order to make sure that things like the \"modified\" state\n * isn't broken. Updating the whole state on every change is very expensive however,\n * so we debounce calls to onChange to mitigate input lag.\n */\n if (debounceTimeout.current) {\n clearTimeout(debounceTimeout.current);\n }\n\n // Set a new debounce timeout\n debounceTimeout.current = setTimeout(() => {\n incrementSlateUpdatesCount();\n onChange(name, state as Schema.Attribute.BlocksValue);\n debounceTimeout.current = null;\n }, 300);\n }\n },\n [editor.operations, incrementSlateUpdatesCount, name, onChange]\n );\n\n // Clean up the timeout on unmount\n React.useEffect(() => {\n return () => {\n if (debounceTimeout.current) {\n clearTimeout(debounceTimeout.current);\n }\n };\n }, []);\n\n // Ensure the editor is in sync after discard\n React.useEffect(() => {\n // Compare the field value with the editor state to check for a stale selection\n if (value && JSON.stringify(editor.children) !== JSON.stringify(value)) {\n // When there is a diff, unset selection to avoid an invalid state\n Transforms.deselect(editor);\n }\n }, [editor, value]);\n\n const blocks = React.useMemo(\n () => ({\n ...paragraphBlocks,\n ...headingBlocks,\n ...listBlocks,\n ...linkBlocks,\n ...imageBlocks,\n ...quoteBlocks,\n ...codeBlocks,\n }),\n []\n ) satisfies BlocksStore;\n\n return (\n <>\n <VisuallyHidden id={ariaDescriptionId}>\n {formatMessage({\n id: getTranslation('components.Blocks.dnd.instruction'),\n defaultMessage: `To reorder blocks, press Command or Control along with Shift and the Up or Down arrow keys`,\n })}\n </VisuallyHidden>\n <VisuallyHidden aria-live=\"assertive\">{liveText}</VisuallyHidden>\n <Slate\n editor={editor}\n initialValue={value || [{ type: 'paragraph', children: [{ type: 'text', text: '' }] }]}\n onChange={handleSlateChange}\n key={key}\n >\n <BlocksEditorProvider\n blocks={blocks}\n modifiers={modifiers}\n disabled={disabled}\n name={name}\n setLiveText={setLiveText}\n isExpandedMode={isExpandedMode}\n >\n <EditorLayout\n error={error}\n disabled={disabled}\n onToggleExpand={handleToggleExpand}\n ariaDescriptionId={ariaDescriptionId}\n >\n <BlocksToolbar />\n <EditorDivider width=\"100%\" />\n <BlocksContent {...contentProps} />\n {!isExpandedMode && (\n <IconButton\n position=\"absolute\"\n bottom=\"1.2rem\"\n right=\"1.2rem\"\n shadow=\"filterShadow\"\n label={formatMessage({\n id: getTranslation('components.Blocks.expand'),\n defaultMessage: 'Expand',\n })}\n onClick={handleToggleExpand}\n >\n <Expand />\n </IconButton>\n )}\n </EditorLayout>\n </BlocksEditorProvider>\n </Slate>\n </>\n );\n }\n);\n\nexport {\n type BlocksStore,\n type SelectorBlockKey,\n BlocksEditor,\n BlocksEditorProvider,\n useBlocksEditorContext,\n isSelectorBlockKey,\n};\n"],"names":["selectorBlockKeys","isSelectorBlockKey","key","includes","BlocksEditorProvider","usePartialBlocksEditorContext","createContext","useBlocksEditorContext","consumerName","context","state","editor","useSlate","EditorDivider","styled","Divider","theme","colors","neutral200","useResetKey","value","slateUpdatesCount","React","useRef","valueUpdatesCount","setKey","useState","useEffect","current","previousKey","incrementSlateUpdatesCount","useCallback","pipe","fns","reduce","prev","fn","BlocksEditor","forwardRef","disabled","name","onChange","error","contentProps","forwardedRef","formatMessage","useIntl","withHistory","withImages","withStrapiSchema","withReact","withLinks","createEditor","liveText","setLiveText","ariaDescriptionId","useId","isExpandedMode","handleToggleExpand","useReducer","useImperativeHandle","focus","ReactEditor","debounceTimeout","handleSlateChange","isAstChange","operations","some","op","type","clearTimeout","setTimeout","JSON","stringify","children","Transforms","deselect","blocks","useMemo","paragraphBlocks","headingBlocks","listBlocks","linkBlocks","imageBlocks","quoteBlocks","codeBlocks","_jsxs","_Fragment","_jsx","VisuallyHidden","id","getTranslation","defaultMessage","aria-live","Slate","initialValue","text","modifiers","EditorLayout","onToggleExpand","BlocksToolbar","width","BlocksContent","IconButton","position","bottom","right","shadow","label","onClick","Expand"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BlocksEditor.js","sources":["../../../../../../../admin/src/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { createContext, type FieldValue } from '@strapi/admin/strapi-admin';\nimport { IconButton, Divider, VisuallyHidden } from '@strapi/design-system';\nimport { Expand } from '@strapi/icons';\nimport { MessageDescriptor, useIntl } from 'react-intl';\nimport { Editor, type Descendant, createEditor, Transforms } from 'slate';\nimport { withHistory } from 'slate-history';\nimport { type RenderElementProps, Slate, withReact, ReactEditor, useSlate } from 'slate-react';\nimport { styled, type CSSProperties } from 'styled-components';\n\nimport { getTranslation } from '../../../../../utils/translations';\n\nimport { codeBlocks } from './Blocks/Code';\nimport { headingBlocks } from './Blocks/Heading';\nimport { imageBlocks } from './Blocks/Image';\nimport { linkBlocks } from './Blocks/Link';\nimport { listBlocks } from './Blocks/List';\nimport { paragraphBlocks } from './Blocks/Paragraph';\nimport { quoteBlocks } from './Blocks/Quote';\nimport { BlocksContent, type BlocksContentProps } from './BlocksContent';\nimport { BlocksToolbar } from './BlocksToolbar';\nimport { EditorLayout } from './EditorLayout';\nimport { type ModifiersStore, modifiers } from './Modifiers';\nimport { withImages } from './plugins/withImages';\nimport { withLinks } from './plugins/withLinks';\nimport { withStrapiSchema } from './plugins/withStrapiSchema';\n\nimport type { Schema } from '@strapi/types';\n\n/* -------------------------------------------------------------------------------------------------\n * BlocksEditorProvider\n * -----------------------------------------------------------------------------------------------*/\n\ninterface BaseBlock {\n renderElement: (props: RenderElementProps) => React.JSX.Element;\n matchNode: (node: Schema.Attribute.BlocksNode) => boolean;\n handleConvert?: (editor: Editor) => void | (() => React.JSX.Element);\n handleEnterKey?: (editor: Editor) => void;\n handleBackspaceKey?: (editor: Editor, event: React.KeyboardEvent<HTMLElement>) => void;\n handleTab?: (editor: Editor) => void;\n snippets?: string[];\n dragHandleTopMargin?: CSSProperties['marginTop'];\n}\n\ninterface NonSelectorBlock extends BaseBlock {\n isInBlocksSelector: false;\n}\n\ninterface SelectorBlock extends BaseBlock {\n isInBlocksSelector: true;\n icon: React.ComponentType;\n label: MessageDescriptor;\n}\n\ntype NonSelectorBlockKey = 'list-item' | 'link';\n\nconst selectorBlockKeys = [\n 'paragraph',\n 'heading-one',\n 'heading-two',\n 'heading-three',\n 'heading-four',\n 'heading-five',\n 'heading-six',\n 'list-ordered',\n 'list-unordered',\n 'image',\n 'quote',\n 'code',\n] as const;\n\ntype SelectorBlockKey = (typeof selectorBlockKeys)[number];\n\nconst isSelectorBlockKey = (key: unknown): key is SelectorBlockKey => {\n return typeof key === 'string' && selectorBlockKeys.includes(key as SelectorBlockKey);\n};\n\ntype BlocksStore = {\n [K in SelectorBlockKey]: SelectorBlock;\n} & {\n [K in NonSelectorBlockKey]: NonSelectorBlock;\n};\n\ninterface BlocksEditorContextValue {\n blocks: BlocksStore;\n modifiers: ModifiersStore;\n disabled: boolean;\n name: string;\n setLiveText: (text: string) => void;\n isExpandedMode: boolean;\n}\n\nconst [BlocksEditorProvider, usePartialBlocksEditorContext] =\n createContext<BlocksEditorContextValue>('BlocksEditor');\n\nfunction useBlocksEditorContext(\n consumerName: string\n): BlocksEditorContextValue & { editor: Editor } {\n const context = usePartialBlocksEditorContext(consumerName, (state) => state);\n const editor = useSlate();\n\n return {\n ...context,\n editor,\n };\n}\n\n/* -------------------------------------------------------------------------------------------------\n * BlocksEditor\n * -----------------------------------------------------------------------------------------------*/\n\nconst EditorDivider = styled(Divider)`\n background: ${({ theme }) => theme.colors.neutral200};\n`;\n\n/**\n * Forces an update of the Slate editor when the value prop changes from outside of Slate.\n * The root cause is that Slate is not a controlled component: https://github.com/ianstormtaylor/slate/issues/4612\n * Why not use JSON.stringify(value) as the key?\n * Because it would force a rerender of the entire editor every time the user types a character.\n * Why not use the entity id as the key, since it's unique for each locale?\n * Because it would not solve the problem when using the \"fill in from other locale\" feature\n */\nfunction useResetKey(value?: Schema.Attribute.BlocksValue): {\n key: number;\n incrementSlateUpdatesCount: () => void;\n} {\n // Keep track how many times Slate detected a change from a user interaction in the editor\n const slateUpdatesCount = React.useRef(0);\n // Keep track of how many times the value prop was updated, whether from within editor or from outside\n const valueUpdatesCount = React.useRef(0);\n // Use a key to force a rerender of the Slate editor when needed\n const [key, setKey] = React.useState(0);\n\n React.useEffect(() => {\n valueUpdatesCount.current += 1;\n\n // If the 2 refs are not equal, it means the value was updated from outside\n if (valueUpdatesCount.current !== slateUpdatesCount.current) {\n // So we change the key to force a rerender of the Slate editor,\n // which will pick up the new value through its initialValue prop\n setKey((previousKey) => previousKey + 1);\n\n // Then bring the 2 refs back in sync\n slateUpdatesCount.current = valueUpdatesCount.current;\n }\n }, [value]);\n\n const incrementSlateUpdatesCount = React.useCallback(() => {\n slateUpdatesCount.current += 1;\n }, []);\n\n return { key, incrementSlateUpdatesCount };\n}\n\nconst pipe =\n (...fns: ((baseEditor: Editor) => Editor)[]) =>\n (value: Editor) =>\n fns.reduce<Editor>((prev, fn) => fn(prev), value);\n\n/**\n * Normalize the blocks state to null if the editor state is considered empty,\n * otherwise return the state\n */\nconst normalizeBlocksState = (\n editor: Editor,\n value: Schema.Attribute.BlocksValue | Descendant[]\n): Schema.Attribute.BlocksValue | Descendant[] | null => {\n const isEmpty =\n value.length === 1 && Editor.isEmpty(editor, value[0] as Schema.Attribute.BlocksNode);\n\n return isEmpty ? null : value;\n};\n\ninterface BlocksEditorProps\n extends Pick<FieldValue<Schema.Attribute.BlocksValue>, 'onChange' | 'value' | 'error'>,\n BlocksContentProps {\n disabled?: boolean;\n name: string;\n}\n\nconst BlocksEditor = React.forwardRef<{ focus: () => void }, BlocksEditorProps>(\n ({ disabled = false, name, onChange, value, error, ...contentProps }, forwardedRef) => {\n const { formatMessage } = useIntl();\n const [editor] = React.useState(() =>\n pipe(withHistory, withImages, withStrapiSchema, withReact, withLinks)(createEditor())\n );\n const [liveText, setLiveText] = React.useState('');\n const ariaDescriptionId = React.useId();\n const [isExpandedMode, handleToggleExpand] = React.useReducer((prev) => !prev, false);\n\n /**\n * Editable is not able to hold the ref, https://github.com/ianstormtaylor/slate/issues/4082\n * so with \"useImperativeHandle\" we can use ReactEditor methods to expose to the parent above\n * also not passing forwarded ref here, gives console warning.\n */\n React.useImperativeHandle(\n forwardedRef,\n () => ({\n focus() {\n ReactEditor.focus(editor);\n },\n }),\n [editor]\n );\n\n const { key, incrementSlateUpdatesCount } = useResetKey(value);\n\n const debounceTimeout = React.useRef<NodeJS.Timeout | null>(null);\n\n const handleSlateChange = React.useCallback(\n (state: Descendant[]) => {\n const isAstChange = editor.operations.some((op) => op.type !== 'set_selection');\n\n if (isAstChange) {\n /**\n * Slate handles the state of the editor internally. We just need to keep Strapi's form\n * state in sync with it in order to make sure that things like the \"modified\" state\n * isn't broken. Updating the whole state on every change is very expensive however,\n * so we debounce calls to onChange to mitigate input lag.\n */\n if (debounceTimeout.current) {\n clearTimeout(debounceTimeout.current);\n }\n\n // Set a new debounce timeout\n debounceTimeout.current = setTimeout(() => {\n incrementSlateUpdatesCount();\n\n // Normalize the state (empty editor becomes null)\n onChange(name, normalizeBlocksState(editor, state) as Schema.Attribute.BlocksValue);\n debounceTimeout.current = null;\n }, 300);\n }\n },\n [editor, incrementSlateUpdatesCount, name, onChange]\n );\n\n // Clean up the timeout on unmount\n React.useEffect(() => {\n return () => {\n if (debounceTimeout.current) {\n clearTimeout(debounceTimeout.current);\n }\n };\n }, []);\n\n // Ensure the editor is in sync after discard\n React.useEffect(() => {\n // Normalize empty states for comparison to avoid losing focus on the editor when content is deleted\n const normalizedValue = value?.length ? value : null;\n const normalizedEditorState = normalizeBlocksState(editor, editor.children);\n\n // Compare the field value with the editor state to check for a stale selection\n if (\n normalizedValue &&\n normalizedEditorState &&\n JSON.stringify(normalizedEditorState) !== JSON.stringify(normalizedValue)\n ) {\n // When there is a diff, unset selection to avoid an invalid state\n Transforms.deselect(editor);\n }\n }, [editor, value]);\n\n const blocks = React.useMemo(\n () => ({\n ...paragraphBlocks,\n ...headingBlocks,\n ...listBlocks,\n ...linkBlocks,\n ...imageBlocks,\n ...quoteBlocks,\n ...codeBlocks,\n }),\n []\n ) satisfies BlocksStore;\n\n return (\n <>\n <VisuallyHidden id={ariaDescriptionId}>\n {formatMessage({\n id: getTranslation('components.Blocks.dnd.instruction'),\n defaultMessage: `To reorder blocks, press Command or Control along with Shift and the Up or Down arrow keys`,\n })}\n </VisuallyHidden>\n <VisuallyHidden aria-live=\"assertive\">{liveText}</VisuallyHidden>\n <Slate\n editor={editor}\n initialValue={\n value?.length ? value : [{ type: 'paragraph', children: [{ type: 'text', text: '' }] }]\n }\n onChange={handleSlateChange}\n key={key}\n >\n <BlocksEditorProvider\n blocks={blocks}\n modifiers={modifiers}\n disabled={disabled}\n name={name}\n setLiveText={setLiveText}\n isExpandedMode={isExpandedMode}\n >\n <EditorLayout\n error={error}\n disabled={disabled}\n onToggleExpand={handleToggleExpand}\n ariaDescriptionId={ariaDescriptionId}\n >\n <BlocksToolbar />\n <EditorDivider width=\"100%\" />\n <BlocksContent {...contentProps} />\n {!isExpandedMode && (\n <IconButton\n position=\"absolute\"\n bottom=\"1.2rem\"\n right=\"1.2rem\"\n shadow=\"filterShadow\"\n label={formatMessage({\n id: getTranslation('components.Blocks.expand'),\n defaultMessage: 'Expand',\n })}\n onClick={handleToggleExpand}\n >\n <Expand />\n </IconButton>\n )}\n </EditorLayout>\n </BlocksEditorProvider>\n </Slate>\n </>\n );\n }\n);\n\nexport {\n type BlocksStore,\n type SelectorBlockKey,\n BlocksEditor,\n BlocksEditorProvider,\n useBlocksEditorContext,\n isSelectorBlockKey,\n normalizeBlocksState,\n};\n"],"names":["selectorBlockKeys","isSelectorBlockKey","key","includes","BlocksEditorProvider","usePartialBlocksEditorContext","createContext","useBlocksEditorContext","consumerName","context","state","editor","useSlate","EditorDivider","styled","Divider","theme","colors","neutral200","useResetKey","value","slateUpdatesCount","React","useRef","valueUpdatesCount","setKey","useState","useEffect","current","previousKey","incrementSlateUpdatesCount","useCallback","pipe","fns","reduce","prev","fn","normalizeBlocksState","isEmpty","length","Editor","BlocksEditor","forwardRef","disabled","name","onChange","error","contentProps","forwardedRef","formatMessage","useIntl","withHistory","withImages","withStrapiSchema","withReact","withLinks","createEditor","liveText","setLiveText","ariaDescriptionId","useId","isExpandedMode","handleToggleExpand","useReducer","useImperativeHandle","focus","ReactEditor","debounceTimeout","handleSlateChange","isAstChange","operations","some","op","type","clearTimeout","setTimeout","normalizedValue","normalizedEditorState","children","JSON","stringify","Transforms","deselect","blocks","useMemo","paragraphBlocks","headingBlocks","listBlocks","linkBlocks","imageBlocks","quoteBlocks","codeBlocks","_jsxs","_Fragment","_jsx","VisuallyHidden","id","getTranslation","defaultMessage","aria-live","Slate","initialValue","text","modifiers","EditorLayout","onToggleExpand","BlocksToolbar","width","BlocksContent","IconButton","position","bottom","right","shadow","label","onClick","Expand"],"mappings":"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"}
|