@contentful/field-editor-rich-text 3.16.8 → 3.16.11
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/cjs/ContentfulEditorProvider.js +8 -8
- package/dist/cjs/RichTextEditor.js +20 -22
- package/dist/cjs/RichTextEditor.styles.js +1 -2
- package/dist/cjs/SdkProvider.js +5 -7
- package/dist/cjs/SyncEditorChanges.js +6 -15
- package/dist/cjs/Toolbar/_tests_/toolbar.test.js +15 -17
- package/dist/cjs/Toolbar/components/EmbedEntityWidget.js +9 -13
- package/dist/cjs/Toolbar/components/EmbeddedEntityDropdownButton.js +8 -10
- package/dist/cjs/Toolbar/components/StickyToolbarWrapper.js +2 -2
- package/dist/cjs/Toolbar/index.js +30 -33
- package/dist/cjs/__fixtures__/FakeSdk.js +3 -3
- package/dist/cjs/__fixtures__/asset/index.js +10 -10
- package/dist/cjs/__fixtures__/content-type/index.js +1 -1
- package/dist/cjs/__fixtures__/entry/index.js +7 -7
- package/dist/cjs/__fixtures__/fixtures.js +6 -8
- package/dist/cjs/__fixtures__/locale/index.js +2 -2
- package/dist/cjs/__fixtures__/space/index.js +1 -1
- package/dist/cjs/constants/Schema.js +0 -1
- package/dist/cjs/dialogs/HypelinkDialog/HyperlinkDialog.js +38 -43
- package/dist/cjs/dialogs/openRichTextDialog.js +4 -6
- package/dist/cjs/dialogs/renderRichTextDialog.js +4 -6
- package/dist/cjs/helpers/__tests__/removeInternalMarks.test.js +10 -10
- package/dist/cjs/helpers/callbacks.js +3 -3
- package/dist/cjs/helpers/config.js +2 -2
- package/dist/cjs/helpers/editor.js +44 -53
- package/dist/cjs/helpers/environment.js +3 -3
- package/dist/cjs/helpers/formatDateAndTime.js +4 -5
- package/dist/cjs/helpers/getAllowedResourcesForNodeType.js +5 -22
- package/dist/cjs/helpers/getLinkedContentTypeIdsForNodeType.js +5 -29
- package/dist/cjs/helpers/nodeFactory.js +6 -6
- package/dist/cjs/helpers/sdkNavigatorSlideIn.js +6 -14
- package/dist/cjs/helpers/sdkNavigatorSlideIn.spec.js +2 -3
- package/dist/cjs/helpers/toSlateValue.js +3 -14
- package/dist/cjs/helpers/transformers.js +5 -5
- package/dist/cjs/helpers/validations.js +9 -12
- package/dist/cjs/index.js +5 -7
- package/dist/cjs/internal/constants.js +2 -4
- package/dist/cjs/internal/hooks.js +7 -9
- package/dist/cjs/internal/misc.js +12 -15
- package/dist/cjs/internal/queries.js +108 -115
- package/dist/cjs/internal/transforms.js +48 -51
- package/dist/cjs/internal/types/editor.js +1 -3
- package/dist/cjs/plugins/Break/createExitBreakPlugin.test.js +3 -4
- package/dist/cjs/plugins/Break/createResetNodePlugin.js +0 -1
- package/dist/cjs/plugins/Break/createSoftBreakPlugin.test.js +3 -3
- package/dist/cjs/plugins/CommandPalette/components/CommandList.js +33 -35
- package/dist/cjs/plugins/CommandPalette/components/CommandList.styles.js +1 -1
- package/dist/cjs/plugins/CommandPalette/components/CommandPrompt.js +5 -7
- package/dist/cjs/plugins/CommandPalette/hooks/useCommandList.js +3 -7
- package/dist/cjs/plugins/CommandPalette/onKeyDown.js +1 -6
- package/dist/cjs/plugins/CommandPalette/onKeyDown.spec.js +4 -6
- package/dist/cjs/plugins/CommandPalette/useCommands.js +3 -3
- package/dist/cjs/plugins/CommandPalette/utils/fetchEntries.js +0 -2
- package/dist/cjs/plugins/CommandPalette/utils/trimLeadingSlash.js +1 -6
- package/dist/cjs/plugins/DragAndDrop/index.js +1 -9
- package/dist/cjs/plugins/EmbeddedEntityBlock/LinkedEntityBlock.js +8 -10
- package/dist/cjs/plugins/EmbeddedEntityBlock/index.js +3 -3
- package/dist/cjs/plugins/EmbeddedEntityInline/FetchingWrappedInlineEntryCard.js +17 -19
- package/dist/cjs/plugins/EmbeddedEntityInline/LinkedEntityInline.js +7 -9
- package/dist/cjs/plugins/EmbeddedResourceBlock/LinkedResourceBlock.js +5 -5
- package/dist/cjs/plugins/EmbeddedResourceInline/FetchingWrappedResourceInlineCard.js +11 -13
- package/dist/cjs/plugins/EmbeddedResourceInline/LinkedResourceInline.js +5 -5
- package/dist/cjs/plugins/Heading/__tests__/createHeadingPlugin.test.js +32 -32
- package/dist/cjs/plugins/Heading/components/Heading.js +10 -13
- package/dist/cjs/plugins/Heading/components/ToolbarHeadingButton.js +29 -23
- package/dist/cjs/plugins/Heading/createHeadingPlugin.js +2 -7
- package/dist/cjs/plugins/Hr/index.js +14 -19
- package/dist/cjs/plugins/Hyperlink/HyperlinkModal.js +28 -32
- package/dist/cjs/plugins/Hyperlink/__tests__/createHyperlinkPlugin.test.js +8 -8
- package/dist/cjs/plugins/Hyperlink/components/EntityHyperlink.js +8 -10
- package/dist/cjs/plugins/Hyperlink/components/LinkPopover.js +17 -23
- package/dist/cjs/plugins/Hyperlink/components/ResourceHyperlink.js +8 -10
- package/dist/cjs/plugins/Hyperlink/components/ToolbarHyperlinkButton.js +4 -6
- package/dist/cjs/plugins/Hyperlink/components/UrlHyperlink.js +6 -8
- package/dist/cjs/plugins/Hyperlink/components/linkHandlers.js +3 -3
- package/dist/cjs/plugins/Hyperlink/components/styles.js +1 -1
- package/dist/cjs/plugins/Hyperlink/createHyperlinkPlugin.js +4 -10
- package/dist/cjs/plugins/Hyperlink/useEntityInfo.js +3 -6
- package/dist/cjs/plugins/Hyperlink/useResourceEntityInfo.js +4 -6
- package/dist/cjs/plugins/Hyperlink/utils.js +4 -4
- package/dist/cjs/plugins/List/__tests__/createListPlugin.test.js +13 -13
- package/dist/cjs/plugins/List/__tests__/insertListBreak.test.js +25 -29
- package/dist/cjs/plugins/List/__tests__/insertListFragment.test.js +22 -22
- package/dist/cjs/plugins/List/components/List.js +7 -9
- package/dist/cjs/plugins/List/components/ListItem.js +4 -6
- package/dist/cjs/plugins/List/components/ToolbarListButton.js +5 -7
- package/dist/cjs/plugins/List/createListPlugin.js +0 -4
- package/dist/cjs/plugins/List/insertListBreak.js +4 -13
- package/dist/cjs/plugins/List/insertListFragment.js +5 -18
- package/dist/cjs/plugins/List/onKeyDownList.js +6 -8
- package/dist/cjs/plugins/List/transforms/insertListItem.js +2 -17
- package/dist/cjs/plugins/List/transforms/moveListItemDown.js +2 -8
- package/dist/cjs/plugins/List/transforms/moveListItems.js +2 -7
- package/dist/cjs/plugins/List/transforms/moveListItems.test.js +14 -15
- package/dist/cjs/plugins/List/transforms/toggleList.js +3 -8
- package/dist/cjs/plugins/List/transforms/toggleList.spec.js +28 -28
- package/dist/cjs/plugins/List/transforms/unwrapList.js +2 -7
- package/dist/cjs/plugins/List/utils.js +11 -12
- package/dist/cjs/plugins/List/withList.js +2 -6
- package/dist/cjs/plugins/Marks/Bold.js +7 -9
- package/dist/cjs/plugins/Marks/Code.js +7 -15
- package/dist/cjs/plugins/Marks/Italic.js +7 -9
- package/dist/cjs/plugins/Marks/Subscript.js +8 -10
- package/dist/cjs/plugins/Marks/Superscript.js +8 -10
- package/dist/cjs/plugins/Marks/Underline.js +4 -6
- package/dist/cjs/plugins/Marks/components/MarkToolbarButton.js +7 -9
- package/dist/cjs/plugins/Marks/helpers.js +5 -5
- package/dist/cjs/plugins/Normalizer/baseRules.js +0 -2
- package/dist/cjs/plugins/Normalizer/createNormalizerPlugin.test.js +12 -12
- package/dist/cjs/plugins/Normalizer/utils.js +3 -4
- package/dist/cjs/plugins/Normalizer/withNormalizer.js +3 -23
- package/dist/cjs/plugins/Paragraph/Paragraph.js +4 -6
- package/dist/cjs/plugins/Paragraph/__tests__/createParagraphPlugin.test.js +32 -32
- package/dist/cjs/plugins/Paragraph/createParagraphPlugin.js +2 -3
- package/dist/cjs/plugins/PasteHTML/createPasteHTMLPlugin.js +6 -9
- package/dist/cjs/plugins/PasteHTML/utils/__tests__/sanitizeHTML.test.js +0 -2
- package/dist/cjs/plugins/PasteHTML/utils/sanitizeAnchors.js +0 -9
- package/dist/cjs/plugins/PasteHTML/utils/sanitizeHTML.js +2 -17
- package/dist/cjs/plugins/PasteHTML/utils/sanitizeSheets.js +1 -13
- package/dist/cjs/plugins/Quote/__test__/createQuotePlugin.test.js +21 -21
- package/dist/cjs/plugins/Quote/components/Quote.js +4 -6
- package/dist/cjs/plugins/Quote/components/ToolbarQuoteButton.js +4 -6
- package/dist/cjs/plugins/Quote/createQuotePlugin.js +0 -1
- package/dist/cjs/plugins/Quote/toggleQuote.js +5 -5
- package/dist/cjs/plugins/Quote/withQuote.js +2 -4
- package/dist/cjs/plugins/SelectOnBackspace/createSelectOnBackspacePlugin.js +0 -1
- package/dist/cjs/plugins/Table/__tests__/createTablePlugin.test.js +22 -22
- package/dist/cjs/plugins/Table/__tests__/helpers.test.js +4 -4
- package/dist/cjs/plugins/Table/actions/addColumn.js +4 -5
- package/dist/cjs/plugins/Table/actions/addRow.js +3 -6
- package/dist/cjs/plugins/Table/components/Cell.js +5 -7
- package/dist/cjs/plugins/Table/components/HeaderCell.js +5 -7
- package/dist/cjs/plugins/Table/components/Row.js +4 -6
- package/dist/cjs/plugins/Table/components/Table.js +6 -8
- package/dist/cjs/plugins/Table/components/TableActions.js +16 -19
- package/dist/cjs/plugins/Table/components/ToolbarButton.js +4 -7
- package/dist/cjs/plugins/Table/createTablePlugin.js +1 -11
- package/dist/cjs/plugins/Table/helpers.js +12 -16
- package/dist/cjs/plugins/Table/insertTableFragment.js +2 -15
- package/dist/cjs/plugins/Table/onKeyDownTable.js +2 -11
- package/dist/cjs/plugins/Table/tableTracking.js +6 -6
- package/dist/cjs/plugins/Text/__tests__/createTextPlugin.test.js +17 -19
- package/dist/cjs/plugins/Text/createTextPlugin.js +5 -22
- package/dist/cjs/plugins/Tracking/createTrackingPlugin.js +4 -5
- package/dist/cjs/plugins/Tracking/utils.js +3 -6
- package/dist/cjs/plugins/Voids/createVoidsPlugin.js +0 -5
- package/dist/cjs/plugins/Voids/transformVoid.js +0 -1
- package/dist/cjs/plugins/index.js +3 -15
- package/dist/cjs/plugins/shared/EmbeddedBlockToolbarIcon.js +10 -12
- package/dist/cjs/plugins/shared/EmbeddedBlockUtil.js +6 -16
- package/dist/cjs/plugins/shared/EmbeddedInlineToolbarIcon.js +8 -10
- package/dist/cjs/plugins/shared/EmbeddedInlineUtil.js +5 -9
- package/dist/cjs/plugins/shared/FetchingWrappedAssetCard.js +11 -13
- package/dist/cjs/plugins/shared/FetchingWrappedEntryCard.js +12 -14
- package/dist/cjs/plugins/shared/FetchingWrappedResourceCard.js +11 -14
- package/dist/cjs/plugins/shared/LinkedBlockWrapper.js +4 -8
- package/dist/cjs/plugins/shared/LinkedInlineWrapper.js +6 -10
- package/dist/cjs/plugins/shared/ResourceNewBadge.js +3 -5
- package/dist/cjs/plugins/shared/ToolbarButton.js +6 -8
- package/dist/cjs/plugins/shared/__tests__/FetchingWrappedAssetCard.test.js +5 -10
- package/dist/cjs/plugins/shared/__tests__/FetchingWrappedEntryCard.test.js +6 -11
- package/dist/cjs/plugins/shared/__tests__/FetchingWrappedResourceCard.test.js +13 -15
- package/dist/cjs/plugins/shared/utils.js +1 -4
- package/dist/cjs/test-utils/assertOutput.js +0 -1
- package/dist/cjs/test-utils/hyperscript.d.js +0 -1
- package/dist/cjs/test-utils/randomId.js +1 -3
- package/dist/cjs/test-utils/validation.js +5 -8
- package/dist/esm/ContentfulEditorProvider.js +1 -4
- package/dist/esm/RichTextEditor.js +13 -13
- package/dist/esm/RichTextEditor.styles.js +0 -1
- package/dist/esm/SdkProvider.js +2 -2
- package/dist/esm/SyncEditorChanges.js +3 -18
- package/dist/esm/Toolbar/_tests_/toolbar.test.js +12 -12
- package/dist/esm/Toolbar/components/EmbedEntityWidget.js +7 -9
- package/dist/esm/Toolbar/components/EmbeddedEntityDropdownButton.js +6 -6
- package/dist/esm/Toolbar/components/StickyToolbarWrapper.js +1 -1
- package/dist/esm/Toolbar/index.js +27 -28
- package/dist/esm/__fixtures__/FakeSdk.js +3 -3
- package/dist/esm/constants/Schema.js +0 -1
- package/dist/esm/dialogs/HypelinkDialog/HyperlinkDialog.js +31 -34
- package/dist/esm/dialogs/openRichTextDialog.js +2 -2
- package/dist/esm/dialogs/renderRichTextDialog.js +2 -2
- package/dist/esm/helpers/__tests__/removeInternalMarks.test.js +10 -10
- package/dist/esm/helpers/callbacks.js +1 -1
- package/dist/esm/helpers/config.js +1 -9
- package/dist/esm/helpers/editor.js +6 -22
- package/dist/esm/helpers/extractNodes.js +1 -3
- package/dist/esm/helpers/formatDateAndTime.js +2 -11
- package/dist/esm/helpers/getAllowedResourcesForNodeType.js +2 -19
- package/dist/esm/helpers/getLinkedContentTypeIdsForNodeType.js +2 -26
- package/dist/esm/helpers/sdkNavigatorSlideIn.js +6 -20
- package/dist/esm/helpers/sdkNavigatorSlideIn.spec.js +0 -1
- package/dist/esm/helpers/toSlateValue.js +3 -17
- package/dist/esm/helpers/validations.js +1 -5
- package/dist/esm/internal/misc.js +2 -23
- package/dist/esm/internal/queries.js +2 -11
- package/dist/esm/internal/transforms.js +3 -14
- package/dist/esm/internal/types/editor.js +1 -3
- package/dist/esm/plugins/Break/createExitBreakPlugin.test.js +3 -4
- package/dist/esm/plugins/Break/createResetNodePlugin.js +0 -1
- package/dist/esm/plugins/Break/createSoftBreakPlugin.test.js +3 -3
- package/dist/esm/plugins/CommandPalette/components/CommandList.js +30 -30
- package/dist/esm/plugins/CommandPalette/components/CommandPrompt.js +2 -2
- package/dist/esm/plugins/CommandPalette/createCommandPalettePlugin.js +1 -11
- package/dist/esm/plugins/CommandPalette/hooks/useCommandList.js +0 -2
- package/dist/esm/plugins/CommandPalette/onKeyDown.js +0 -5
- package/dist/esm/plugins/CommandPalette/onKeyDown.spec.js +2 -2
- package/dist/esm/plugins/CommandPalette/useCommands.js +3 -3
- package/dist/esm/plugins/CommandPalette/utils/fetchEntries.js +0 -2
- package/dist/esm/plugins/CommandPalette/utils/trimLeadingSlash.js +1 -6
- package/dist/esm/plugins/DragAndDrop/index.js +1 -9
- package/dist/esm/plugins/EmbeddedEntityBlock/LinkedEntityBlock.js +6 -6
- package/dist/esm/plugins/EmbeddedEntityInline/FetchingWrappedInlineEntryCard.js +14 -14
- package/dist/esm/plugins/EmbeddedEntityInline/LinkedEntityInline.js +5 -5
- package/dist/esm/plugins/EmbeddedResourceBlock/LinkedResourceBlock.js +4 -4
- package/dist/esm/plugins/EmbeddedResourceInline/FetchingWrappedResourceInlineCard.js +9 -9
- package/dist/esm/plugins/EmbeddedResourceInline/LinkedResourceInline.js +4 -4
- package/dist/esm/plugins/Heading/__tests__/createHeadingPlugin.test.js +32 -32
- package/dist/esm/plugins/Heading/components/Heading.js +7 -8
- package/dist/esm/plugins/Heading/components/ToolbarHeadingButton.js +26 -18
- package/dist/esm/plugins/Heading/createHeadingPlugin.js +1 -6
- package/dist/esm/plugins/Hr/index.js +5 -8
- package/dist/esm/plugins/Hyperlink/HyperlinkModal.js +23 -25
- package/dist/esm/plugins/Hyperlink/__tests__/createHyperlinkPlugin.test.js +8 -8
- package/dist/esm/plugins/Hyperlink/components/EntityHyperlink.js +6 -6
- package/dist/esm/plugins/Hyperlink/components/LinkPopover.js +15 -19
- package/dist/esm/plugins/Hyperlink/components/ResourceHyperlink.js +6 -6
- package/dist/esm/plugins/Hyperlink/components/ToolbarHyperlinkButton.js +2 -2
- package/dist/esm/plugins/Hyperlink/components/UrlHyperlink.js +4 -4
- package/dist/esm/plugins/Hyperlink/createHyperlinkPlugin.js +1 -5
- package/dist/esm/plugins/Hyperlink/useEntityInfo.js +3 -6
- package/dist/esm/plugins/Hyperlink/useResourceEntityInfo.js +2 -2
- package/dist/esm/plugins/Hyperlink/utils.js +1 -1
- package/dist/esm/plugins/List/__tests__/createListPlugin.test.js +13 -13
- package/dist/esm/plugins/List/__tests__/insertListBreak.test.js +25 -29
- package/dist/esm/plugins/List/__tests__/insertListFragment.test.js +22 -22
- package/dist/esm/plugins/List/components/List.js +1 -1
- package/dist/esm/plugins/List/components/ListItem.js +1 -1
- package/dist/esm/plugins/List/components/ToolbarListButton.js +3 -3
- package/dist/esm/plugins/List/createListPlugin.js +0 -4
- package/dist/esm/plugins/List/insertListBreak.js +4 -13
- package/dist/esm/plugins/List/insertListFragment.js +5 -18
- package/dist/esm/plugins/List/onKeyDownList.js +5 -7
- package/dist/esm/plugins/List/transforms/insertListItem.js +3 -20
- package/dist/esm/plugins/List/transforms/moveListItemDown.js +2 -8
- package/dist/esm/plugins/List/transforms/moveListItems.js +2 -7
- package/dist/esm/plugins/List/transforms/moveListItems.test.js +14 -15
- package/dist/esm/plugins/List/transforms/toggleList.js +3 -8
- package/dist/esm/plugins/List/transforms/toggleList.spec.js +28 -28
- package/dist/esm/plugins/List/transforms/unwrapList.js +2 -7
- package/dist/esm/plugins/List/utils.js +2 -7
- package/dist/esm/plugins/List/withList.js +2 -6
- package/dist/esm/plugins/Marks/Bold.js +2 -2
- package/dist/esm/plugins/Marks/Code.js +2 -8
- package/dist/esm/plugins/Marks/Italic.js +2 -2
- package/dist/esm/plugins/Marks/Subscript.js +2 -2
- package/dist/esm/plugins/Marks/Superscript.js +2 -2
- package/dist/esm/plugins/Marks/Underline.js +2 -2
- package/dist/esm/plugins/Marks/components/MarkToolbarButton.js +4 -4
- package/dist/esm/plugins/Marks/helpers.js +1 -1
- package/dist/esm/plugins/Normalizer/baseRules.js +0 -4
- package/dist/esm/plugins/Normalizer/createNormalizerPlugin.test.js +12 -12
- package/dist/esm/plugins/Normalizer/utils.js +0 -1
- package/dist/esm/plugins/Normalizer/withNormalizer.js +2 -22
- package/dist/esm/plugins/Paragraph/Paragraph.js +1 -1
- package/dist/esm/plugins/Paragraph/__tests__/createParagraphPlugin.test.js +32 -32
- package/dist/esm/plugins/Paragraph/createParagraphPlugin.js +1 -2
- package/dist/esm/plugins/PasteHTML/createPasteHTMLPlugin.js +3 -9
- package/dist/esm/plugins/PasteHTML/utils/__tests__/sanitizeHTML.test.js +0 -2
- package/dist/esm/plugins/PasteHTML/utils/sanitizeAnchors.js +1 -27
- package/dist/esm/plugins/PasteHTML/utils/sanitizeHTML.js +2 -17
- package/dist/esm/plugins/PasteHTML/utils/sanitizeSheets.js +1 -13
- package/dist/esm/plugins/Quote/__test__/createQuotePlugin.test.js +21 -21
- package/dist/esm/plugins/Quote/components/Quote.js +1 -1
- package/dist/esm/plugins/Quote/components/ToolbarQuoteButton.js +2 -2
- package/dist/esm/plugins/Quote/createQuotePlugin.js +0 -1
- package/dist/esm/plugins/Quote/shouldResetQuote.js +1 -6
- package/dist/esm/plugins/Quote/toggleQuote.js +1 -1
- package/dist/esm/plugins/Quote/withQuote.js +2 -4
- package/dist/esm/plugins/SelectOnBackspace/createSelectOnBackspacePlugin.js +0 -1
- package/dist/esm/plugins/Table/__tests__/createTablePlugin.test.js +22 -22
- package/dist/esm/plugins/Table/__tests__/helpers.test.js +4 -4
- package/dist/esm/plugins/Table/actions/addColumn.js +1 -2
- package/dist/esm/plugins/Table/actions/addRow.js +0 -3
- package/dist/esm/plugins/Table/components/Cell.js +2 -2
- package/dist/esm/plugins/Table/components/HeaderCell.js +2 -2
- package/dist/esm/plugins/Table/components/Row.js +1 -1
- package/dist/esm/plugins/Table/components/Table.js +3 -3
- package/dist/esm/plugins/Table/components/TableActions.js +11 -12
- package/dist/esm/plugins/Table/components/ToolbarButton.js +2 -3
- package/dist/esm/plugins/Table/createTablePlugin.js +1 -11
- package/dist/esm/plugins/Table/helpers.js +1 -10
- package/dist/esm/plugins/Table/insertTableFragment.js +2 -15
- package/dist/esm/plugins/Table/onKeyDownTable.js +2 -11
- package/dist/esm/plugins/Table/tableTracking.js +6 -6
- package/dist/esm/plugins/Text/__tests__/createTextPlugin.test.js +17 -19
- package/dist/esm/plugins/Text/createTextPlugin.js +5 -22
- package/dist/esm/plugins/Tracking/createTrackingPlugin.js +1 -2
- package/dist/esm/plugins/Tracking/utils.js +0 -1
- package/dist/esm/plugins/Voids/createVoidsPlugin.js +0 -5
- package/dist/esm/plugins/Voids/transformVoid.js +1 -4
- package/dist/esm/plugins/index.js +0 -12
- package/dist/esm/plugins/shared/EmbeddedBlockToolbarIcon.js +5 -5
- package/dist/esm/plugins/shared/EmbeddedBlockUtil.js +5 -15
- package/dist/esm/plugins/shared/EmbeddedInlineToolbarIcon.js +5 -5
- package/dist/esm/plugins/shared/EmbeddedInlineUtil.js +4 -8
- package/dist/esm/plugins/shared/FetchingWrappedAssetCard.js +8 -8
- package/dist/esm/plugins/shared/FetchingWrappedEntryCard.js +9 -9
- package/dist/esm/plugins/shared/FetchingWrappedResourceCard.js +8 -9
- package/dist/esm/plugins/shared/LinkedBlockWrapper.js +3 -7
- package/dist/esm/plugins/shared/LinkedInlineWrapper.js +3 -5
- package/dist/esm/plugins/shared/ResourceNewBadge.js +1 -1
- package/dist/esm/plugins/shared/ToolbarButton.js +3 -3
- package/dist/esm/plugins/shared/__tests__/FetchingWrappedAssetCard.test.js +2 -5
- package/dist/esm/plugins/shared/__tests__/FetchingWrappedEntryCard.test.js +2 -5
- package/dist/esm/plugins/shared/__tests__/FetchingWrappedResourceCard.test.js +8 -8
- package/dist/esm/plugins/shared/utils.js +1 -4
- package/dist/esm/test-utils/assertOutput.js +0 -1
- package/dist/esm/test-utils/hyperscript.d.js +0 -1
- package/dist/esm/test-utils/jsx.js +1 -5
- package/dist/esm/test-utils/randomId.js +1 -3
- package/dist/esm/test-utils/setEmptyDataAttribute.js +1 -4
- package/dist/esm/test-utils/validation.js +4 -7
- package/dist/types/RichTextEditor.d.ts +2 -3
- package/dist/types/Toolbar/components/EmbedEntityWidget.d.ts +1 -2
- package/dist/types/Toolbar/components/EmbeddedEntityDropdownButton.d.ts +1 -1
- package/dist/types/Toolbar/components/StickyToolbarWrapper.d.ts +2 -2
- package/dist/types/Toolbar/index.d.ts +1 -2
- package/dist/types/dialogs/HypelinkDialog/HyperlinkDialog.d.ts +4 -4
- package/dist/types/dialogs/renderRichTextDialog.d.ts +1 -2
- package/dist/types/plugins/CommandPalette/components/CommandList.d.ts +1 -2
- package/dist/types/plugins/CommandPalette/components/CommandPrompt.d.ts +1 -2
- package/dist/types/plugins/EmbeddedEntityBlock/LinkedEntityBlock.d.ts +1 -2
- package/dist/types/plugins/EmbeddedEntityInline/FetchingWrappedInlineEntryCard.d.ts +1 -1
- package/dist/types/plugins/EmbeddedEntityInline/LinkedEntityInline.d.ts +1 -2
- package/dist/types/plugins/EmbeddedResourceBlock/LinkedResourceBlock.d.ts +1 -2
- package/dist/types/plugins/EmbeddedResourceInline/FetchingWrappedResourceInlineCard.d.ts +1 -1
- package/dist/types/plugins/EmbeddedResourceInline/LinkedResourceInline.d.ts +1 -2
- package/dist/types/plugins/Heading/components/Heading.d.ts +6 -6
- package/dist/types/plugins/Heading/components/ToolbarHeadingButton.d.ts +1 -2
- package/dist/types/plugins/Hr/index.d.ts +2 -2
- package/dist/types/plugins/Hyperlink/HyperlinkModal.d.ts +1 -2
- package/dist/types/plugins/Hyperlink/components/EntityHyperlink.d.ts +1 -2
- package/dist/types/plugins/Hyperlink/components/LinkPopover.d.ts +1 -1
- package/dist/types/plugins/Hyperlink/components/ResourceHyperlink.d.ts +1 -2
- package/dist/types/plugins/Hyperlink/components/ToolbarHyperlinkButton.d.ts +1 -2
- package/dist/types/plugins/Hyperlink/components/UrlHyperlink.d.ts +1 -2
- package/dist/types/plugins/List/components/List.d.ts +2 -3
- package/dist/types/plugins/List/components/ListItem.d.ts +1 -2
- package/dist/types/plugins/List/components/ToolbarListButton.d.ts +1 -2
- package/dist/types/plugins/Marks/Bold.d.ts +2 -3
- package/dist/types/plugins/Marks/Code.d.ts +3 -4
- package/dist/types/plugins/Marks/Italic.d.ts +2 -3
- package/dist/types/plugins/Marks/Subscript.d.ts +3 -4
- package/dist/types/plugins/Marks/Superscript.d.ts +3 -4
- package/dist/types/plugins/Marks/Underline.d.ts +2 -3
- package/dist/types/plugins/Marks/components/MarkToolbarButton.d.ts +1 -1
- package/dist/types/plugins/Paragraph/Paragraph.d.ts +1 -2
- package/dist/types/plugins/Quote/components/Quote.d.ts +1 -2
- package/dist/types/plugins/Quote/components/ToolbarQuoteButton.d.ts +1 -2
- package/dist/types/plugins/Table/components/Cell.d.ts +1 -2
- package/dist/types/plugins/Table/components/HeaderCell.d.ts +1 -2
- package/dist/types/plugins/Table/components/Row.d.ts +1 -2
- package/dist/types/plugins/Table/components/Table.d.ts +1 -2
- package/dist/types/plugins/Table/components/TableActions.d.ts +1 -2
- package/dist/types/plugins/Table/components/ToolbarButton.d.ts +1 -2
- package/dist/types/plugins/shared/EmbeddedBlockToolbarIcon.d.ts +1 -2
- package/dist/types/plugins/shared/EmbeddedInlineToolbarIcon.d.ts +1 -2
- package/dist/types/plugins/shared/FetchingWrappedAssetCard.d.ts +1 -2
- package/dist/types/plugins/shared/FetchingWrappedEntryCard.d.ts +1 -2
- package/dist/types/plugins/shared/FetchingWrappedResourceCard.d.ts +1 -2
- package/dist/types/plugins/shared/LinkedBlockWrapper.d.ts +1 -1
- package/dist/types/plugins/shared/LinkedInlineWrapper.d.ts +1 -1
- package/dist/types/plugins/shared/ResourceNewBadge.d.ts +1 -2
- package/dist/types/plugins/shared/ToolbarButton.d.ts +1 -2
- package/package.json +8 -5
|
@@ -14,12 +14,11 @@ export function ToolbarTableButton(props) {
|
|
|
14
14
|
focus(editor);
|
|
15
15
|
}
|
|
16
16
|
if (!editor) return null;
|
|
17
|
-
return
|
|
17
|
+
return React.createElement(ToolbarButton, {
|
|
18
18
|
title: "Table",
|
|
19
19
|
testId: "table-toolbar-button",
|
|
20
20
|
onClick: handleClick,
|
|
21
|
-
// TODO: active state looks off since the button will be disabled. Do we still need it?
|
|
22
21
|
isActive: !!isActive,
|
|
23
22
|
isDisabled: props.isDisabled
|
|
24
|
-
},
|
|
23
|
+
}, React.createElement(TableIcon, null));
|
|
25
24
|
}
|
|
@@ -15,15 +15,11 @@ import { addTableTrackingEvents, withInvalidCellChildrenTracking } from './table
|
|
|
15
15
|
export const createTablePlugin = ()=>createDefaultTablePlugin({
|
|
16
16
|
type: BLOCKS.TABLE,
|
|
17
17
|
handlers: {
|
|
18
|
-
// @ts-expect-error
|
|
19
18
|
onKeyDown: onKeyDownTable
|
|
20
19
|
},
|
|
21
20
|
withOverrides: (editor, plugin)=>{
|
|
22
|
-
const { normalizeNode
|
|
23
|
-
// injects important fixes from plate's original table plugin
|
|
21
|
+
const { normalizeNode } = editor;
|
|
24
22
|
withTable(editor, plugin);
|
|
25
|
-
// Resets all normalization rules added by @udecode/plate-table as
|
|
26
|
-
// they conflict with our own
|
|
27
23
|
editor.normalizeNode = normalizeNode;
|
|
28
24
|
addTableTrackingEvents(editor);
|
|
29
25
|
editor.insertFragment = insertTableFragment(editor);
|
|
@@ -38,10 +34,7 @@ export const createTablePlugin = ()=>createDefaultTablePlugin({
|
|
|
38
34
|
validNode: isNotEmpty
|
|
39
35
|
},
|
|
40
36
|
{
|
|
41
|
-
// Move to root level unless nested
|
|
42
37
|
validNode: (editor, [, path])=>{
|
|
43
|
-
// Nested tables are handled by another normalization
|
|
44
|
-
// rule in a the table cell level
|
|
45
38
|
const isNestedTable = !!getBlockAbove(editor, {
|
|
46
39
|
at: path,
|
|
47
40
|
match: {
|
|
@@ -69,11 +62,9 @@ export const createTablePlugin = ()=>createDefaultTablePlugin({
|
|
|
69
62
|
transform: transformWrapIn(BLOCKS.TABLE_CELL)
|
|
70
63
|
},
|
|
71
64
|
{
|
|
72
|
-
// Remove empty rows
|
|
73
65
|
validNode: isNotEmpty
|
|
74
66
|
},
|
|
75
67
|
{
|
|
76
|
-
// Parent must be a table
|
|
77
68
|
validNode: (editor, [, path])=>{
|
|
78
69
|
const parent = getParentNode(editor, path)?.[0];
|
|
79
70
|
return parent && parent.type === BLOCKS.TABLE;
|
|
@@ -81,7 +72,6 @@ export const createTablePlugin = ()=>createDefaultTablePlugin({
|
|
|
81
72
|
transform: transformWrapIn(BLOCKS.TABLE)
|
|
82
73
|
},
|
|
83
74
|
{
|
|
84
|
-
// ensure consistent number of cells in each row
|
|
85
75
|
validNode: (editor, entry)=>{
|
|
86
76
|
return getNoOfMissingTableCellsInRow(editor, entry) === 0;
|
|
87
77
|
},
|
|
@@ -71,30 +71,21 @@ export function replaceEmptyParagraphWithTable(editor) {
|
|
|
71
71
|
const [previousNode] = nodes;
|
|
72
72
|
const isPreviousNodeTextEmpty = isAncestorEmpty(editor, previousNode);
|
|
73
73
|
if (isPreviousNodeTextEmpty) {
|
|
74
|
-
// Switch table with previous empty paragraph
|
|
75
74
|
moveNodes(editor, {
|
|
76
75
|
at: tablePath,
|
|
77
76
|
to: previousPath
|
|
78
77
|
});
|
|
79
|
-
// Remove previous paragraph that now is under the table
|
|
80
78
|
removeNodes(editor, {
|
|
81
79
|
at: tablePath
|
|
82
80
|
});
|
|
83
81
|
}
|
|
84
82
|
}
|
|
85
|
-
|
|
86
|
-
* Returns the number of cells in a given row vs the table width
|
|
87
|
-
*
|
|
88
|
-
* Note: We should only get different table rows cell counts in between
|
|
89
|
-
* normalization cycles.
|
|
90
|
-
*/ export const getNoOfMissingTableCellsInRow = (editor, rowEntry)=>{
|
|
83
|
+
export const getNoOfMissingTableCellsInRow = (editor, rowEntry)=>{
|
|
91
84
|
const [, rowPath] = rowEntry;
|
|
92
85
|
const parent = getParentNode(editor, rowPath);
|
|
93
|
-
// This is ensured by normalization. The error is here just in case
|
|
94
86
|
if (!parent) {
|
|
95
87
|
throw new Error('table rows must be wrapped in a table node');
|
|
96
88
|
}
|
|
97
|
-
// The longest table row determines its width
|
|
98
89
|
const tableWidth = Math.max(...getChildren(parent).map((entry)=>getChildren(entry).length));
|
|
99
90
|
const rowWidth = getChildren(rowEntry).length;
|
|
100
91
|
return tableWidth - rowWidth;
|
|
@@ -2,29 +2,18 @@ import { BLOCKS } from '@contentful/rich-text-types';
|
|
|
2
2
|
import { insertEmptyParagraph } from '../../helpers/editor';
|
|
3
3
|
import { getText, isElement } from '../../internal/queries';
|
|
4
4
|
import { isTable } from './helpers';
|
|
5
|
-
|
|
6
|
-
* Removes table wrappers when pasting a single table cell
|
|
7
|
-
*
|
|
8
|
-
* In Plate/Slate, copying the content of a table cell wraps
|
|
9
|
-
* it in a <table><tr><td>{content}</td></tr></table> even
|
|
10
|
-
* when copying partial cell content.
|
|
11
|
-
*
|
|
12
|
-
* That's really annoying as there is no way to remove the table
|
|
13
|
-
* wrappers in that case.
|
|
14
|
-
*/ const trimUnnecessaryTableWrapper = (node)=>{
|
|
5
|
+
const trimUnnecessaryTableWrapper = (node)=>{
|
|
15
6
|
if (!isElement(node)) {
|
|
16
7
|
return [
|
|
17
8
|
node
|
|
18
9
|
];
|
|
19
10
|
}
|
|
20
|
-
// must be a table with a single row
|
|
21
11
|
if (node.type !== BLOCKS.TABLE || node.children?.length !== 1) {
|
|
22
12
|
return [
|
|
23
13
|
node
|
|
24
14
|
];
|
|
25
15
|
}
|
|
26
16
|
const row = node.children[0];
|
|
27
|
-
// the row must contain a single cell
|
|
28
17
|
if (row?.children?.length !== 1) {
|
|
29
18
|
return [
|
|
30
19
|
node
|
|
@@ -34,14 +23,12 @@ import { isTable } from './helpers';
|
|
|
34
23
|
return cell.children;
|
|
35
24
|
};
|
|
36
25
|
export const insertTableFragment = (editor)=>{
|
|
37
|
-
const { insertFragment
|
|
26
|
+
const { insertFragment } = editor;
|
|
38
27
|
return (fragments)=>{
|
|
39
28
|
if (!editor.selection) {
|
|
40
29
|
return;
|
|
41
30
|
}
|
|
42
31
|
fragments = fragments.flatMap(trimUnnecessaryTableWrapper);
|
|
43
|
-
// We need to make sure we have a new, empty and clean paragraph in order to paste tables as-is due to how Slate behaves
|
|
44
|
-
// More info: https://github.com/ianstormtaylor/slate/pull/4489 and https://github.com/ianstormtaylor/slate/issues/4542
|
|
45
32
|
const isInsertingTable = fragments.some((fragment)=>isTable(fragment));
|
|
46
33
|
const isTableFirstFragment = fragments.findIndex((fragment)=>isTable(fragment)) === 0;
|
|
47
34
|
const currentLineHasText = getText(editor, editor.selection?.focus.path) !== '';
|
|
@@ -7,13 +7,8 @@ import { addRowBelow } from './actions';
|
|
|
7
7
|
export const onKeyDownTable = (editor, plugin)=>{
|
|
8
8
|
const defaultHandler = defaultKeyDownTable(editor, plugin);
|
|
9
9
|
return (event)=>{
|
|
10
|
-
// This fixes `Cannot resolve a Slate point from DOM point:
|
|
11
|
-
// [object HTMLDivElement]` when typing while the cursor is before table
|
|
12
10
|
const windowSelection = window.getSelection();
|
|
13
|
-
// @ts-expect-error
|
|
14
|
-
// this attribute comes from `plugins/Table/components/Table.tsx`
|
|
15
11
|
if (windowSelection?.anchorNode?.attributes) {
|
|
16
|
-
// @ts-expect-error
|
|
17
12
|
const blockType = windowSelection.anchorNode.attributes?.['data-block-type']?.value;
|
|
18
13
|
const isBeforeTable = blockType === BLOCKS.TABLE;
|
|
19
14
|
if (isBeforeTable) {
|
|
@@ -35,11 +30,10 @@ export const onKeyDownTable = (editor, plugin)=>{
|
|
|
35
30
|
return;
|
|
36
31
|
}
|
|
37
32
|
}
|
|
38
|
-
// TODO clean this up
|
|
39
33
|
if (event.key === 'Backspace') {
|
|
40
34
|
const entry = getTableEntries(editor, {});
|
|
41
35
|
if (entry) {
|
|
42
|
-
const { table, row, cell
|
|
36
|
+
const { table , row , cell } = entry;
|
|
43
37
|
const cellText = getText(editor, cell[1]);
|
|
44
38
|
const isFirstCell = isFirstChild(row[1]);
|
|
45
39
|
const isFirstRow = isFirstChild(table[1]);
|
|
@@ -50,18 +44,15 @@ export const onKeyDownTable = (editor, plugin)=>{
|
|
|
50
44
|
}
|
|
51
45
|
}
|
|
52
46
|
}
|
|
53
|
-
// Pressing Tab on the last cell creates a new row
|
|
54
|
-
// Otherwise, jumping between cells is handled in the defaultKeyDownTable
|
|
55
47
|
if (event.key === 'Tab' && !event.shiftKey) {
|
|
56
48
|
event.preventDefault();
|
|
57
49
|
const entry = getTableEntries(editor, {});
|
|
58
50
|
if (entry) {
|
|
59
|
-
const { table, row, cell
|
|
51
|
+
const { table , row , cell } = entry;
|
|
60
52
|
const isLastCell = isLastChildPath(row, cell[1]);
|
|
61
53
|
const isLastRow = isLastChildPath(table, row[1]);
|
|
62
54
|
if (isLastRow && isLastCell) {
|
|
63
55
|
addRowBelow(editor);
|
|
64
|
-
// skip default handler
|
|
65
56
|
return;
|
|
66
57
|
} else {
|
|
67
58
|
defaultHandler(event);
|
|
@@ -2,22 +2,22 @@ import { BLOCKS } from '@contentful/rich-text-types';
|
|
|
2
2
|
import { isElement } from '../../internal/queries';
|
|
3
3
|
import { getPastingSource } from '../../plugins/Tracking';
|
|
4
4
|
function hasTables(nodes) {
|
|
5
|
-
return nodes.some(({ type
|
|
5
|
+
return nodes.some(({ type })=>{
|
|
6
6
|
return type === BLOCKS.TABLE;
|
|
7
7
|
});
|
|
8
8
|
}
|
|
9
|
-
const isTableHeaderCell = ({ type
|
|
9
|
+
const isTableHeaderCell = ({ type })=>type === BLOCKS.TABLE_HEADER_CELL;
|
|
10
10
|
function hasHeadersOutsideFirstRow(nodes) {
|
|
11
|
-
return nodes.filter(({ type
|
|
11
|
+
return nodes.filter(({ type })=>type === BLOCKS.TABLE).flatMap(({ children })=>children.slice(1)).some(({ children })=>children.some(isTableHeaderCell));
|
|
12
12
|
}
|
|
13
13
|
export function addTableTrackingEvents(editor) {
|
|
14
|
-
const { insertData
|
|
14
|
+
const { insertData } = editor;
|
|
15
15
|
editor.insertData = (data)=>{
|
|
16
16
|
const html = data.getData('text/html');
|
|
17
17
|
if (html) {
|
|
18
|
-
const { children: markupBefore
|
|
18
|
+
const { children: markupBefore } = editor;
|
|
19
19
|
insertData(data);
|
|
20
|
-
const { children: markupAfter
|
|
20
|
+
const { children: markupAfter } = editor;
|
|
21
21
|
setTimeout(()=>{
|
|
22
22
|
if (hasTables(markupBefore)) return;
|
|
23
23
|
if (hasTables(markupAfter)) {
|
|
@@ -1,24 +1,23 @@
|
|
|
1
|
-
|
|
1
|
+
import { jsx, assertOutput, createTestEditor } from '../../../test-utils';
|
|
2
2
|
describe('delete backward', ()=>{
|
|
3
3
|
const tests = [
|
|
4
4
|
{
|
|
5
5
|
title: 'deletes a character of the text inside li',
|
|
6
|
-
input:
|
|
7
|
-
expected:
|
|
6
|
+
input: jsx("hul", null, jsx("hli", null, jsx("hp", null, "p1", jsx("cursor", null)))),
|
|
7
|
+
expected: jsx("hul", null, jsx("hli", null, jsx("hp", null, "p", jsx("cursor", null))))
|
|
8
8
|
},
|
|
9
9
|
{
|
|
10
10
|
title: 'does not delete the very first paragraph',
|
|
11
|
-
input:
|
|
12
|
-
expected:
|
|
11
|
+
input: jsx("fragment", null, jsx("hp", null, jsx("cursor", null)), jsx("hp", null, "text")),
|
|
12
|
+
expected: jsx("fragment", null, jsx("hp", null, jsx("cursor", null)), jsx("hp", null, "text"))
|
|
13
13
|
}
|
|
14
14
|
];
|
|
15
|
-
const render = (children)
|
|
15
|
+
const render = (children)=>jsx("editor", null, children, jsx("hp", null, jsx("htext", null)));
|
|
16
16
|
for (const t of tests){
|
|
17
17
|
test(t.title, ()=>{
|
|
18
|
-
const { editor
|
|
18
|
+
const { editor } = createTestEditor({
|
|
19
19
|
input: render(t.input)
|
|
20
20
|
});
|
|
21
|
-
// Equivalent of pressing backspace
|
|
22
21
|
editor.deleteBackward('character');
|
|
23
22
|
assertOutput({
|
|
24
23
|
editor,
|
|
@@ -31,32 +30,31 @@ describe('delete forward', ()=>{
|
|
|
31
30
|
const tests = [
|
|
32
31
|
{
|
|
33
32
|
title: 'deletes a character of the text inside li',
|
|
34
|
-
input:
|
|
35
|
-
expected:
|
|
33
|
+
input: jsx("hul", null, jsx("hli", null, jsx("hp", null, jsx("cursor", null), "p1"))),
|
|
34
|
+
expected: jsx("hul", null, jsx("hli", null, jsx("hp", null, jsx("cursor", null), "1")))
|
|
36
35
|
},
|
|
37
36
|
{
|
|
38
37
|
title: 'deletes the first paragraph when followed by another paragraph',
|
|
39
|
-
input:
|
|
40
|
-
expected:
|
|
38
|
+
input: jsx("fragment", null, jsx("hp", null, jsx("cursor", null)), jsx("hp", null, "text")),
|
|
39
|
+
expected: jsx("hp", null, jsx("cursor", null), "text")
|
|
41
40
|
},
|
|
42
41
|
{
|
|
43
42
|
title: 'deletes the first paragraph when followed by li',
|
|
44
|
-
input:
|
|
45
|
-
expected:
|
|
43
|
+
input: jsx("fragment", null, jsx("hp", null, jsx("cursor", null)), jsx("hul", null, jsx("hli", null, jsx("hp", null, "p1")))),
|
|
44
|
+
expected: jsx("hul", null, jsx("hli", null, jsx("hp", null, jsx("cursor", null), "p1")))
|
|
46
45
|
},
|
|
47
46
|
{
|
|
48
47
|
title: 'deletes the first paragraph when followed by a blockquote',
|
|
49
|
-
input:
|
|
50
|
-
expected:
|
|
48
|
+
input: jsx("fragment", null, jsx("hp", null, jsx("cursor", null)), jsx("hquote", null, jsx("hp", null, "p1"))),
|
|
49
|
+
expected: jsx("hquote", null, jsx("hp", null, jsx("cursor", null), "p1"))
|
|
51
50
|
}
|
|
52
51
|
];
|
|
53
|
-
const render = (children)
|
|
52
|
+
const render = (children)=>jsx("editor", null, children, jsx("hp", null, jsx("htext", null)));
|
|
54
53
|
for (const t of tests){
|
|
55
54
|
test(t.title, ()=>{
|
|
56
|
-
const { editor
|
|
55
|
+
const { editor } = createTestEditor({
|
|
57
56
|
input: render(t.input)
|
|
58
57
|
});
|
|
59
|
-
// Equivalent of pressing backspace
|
|
60
58
|
editor.deleteForward('character');
|
|
61
59
|
assertOutput({
|
|
62
60
|
editor,
|
|
@@ -5,9 +5,6 @@ export function createTextPlugin(restrictedMarks = []) {
|
|
|
5
5
|
return {
|
|
6
6
|
key: 'TextPlugin',
|
|
7
7
|
handlers: {
|
|
8
|
-
// Triple selection in a non-Firefox browser undesirably selects
|
|
9
|
-
// the start of the next block. Editor.unhangRange helps removing
|
|
10
|
-
// the extra block at the end.
|
|
11
8
|
onMouseUp: (editor)=>()=>{
|
|
12
9
|
if (!editor.selection) {
|
|
13
10
|
return;
|
|
@@ -16,16 +13,9 @@ export function createTextPlugin(restrictedMarks = []) {
|
|
|
16
13
|
}
|
|
17
14
|
},
|
|
18
15
|
withOverrides: (editor)=>{
|
|
19
|
-
|
|
20
|
-
// to be trapped inside inline elements.
|
|
21
|
-
//
|
|
22
|
-
// Reverts https://github.com/ianstormtaylor/slate/pull/4578/
|
|
23
|
-
// Related https://github.com/ianstormtaylor/slate/issues/4704
|
|
24
|
-
const { insertText } = editor;
|
|
16
|
+
const { insertText } = editor;
|
|
25
17
|
editor.insertText = (text)=>{
|
|
26
|
-
const { selection
|
|
27
|
-
// If the cursor is at the end of an inline, move it outside
|
|
28
|
-
// before inserting
|
|
18
|
+
const { selection } = editor;
|
|
29
19
|
if (selection && isRangeCollapsed(selection)) {
|
|
30
20
|
const inlinePath = getAboveNode(editor, {
|
|
31
21
|
match: (n)=>isInline(editor, n),
|
|
@@ -41,8 +31,7 @@ export function createTextPlugin(restrictedMarks = []) {
|
|
|
41
31
|
}
|
|
42
32
|
return insertText(text);
|
|
43
33
|
};
|
|
44
|
-
|
|
45
|
-
const { deleteForward, deleteBackward } = editor;
|
|
34
|
+
const { deleteForward , deleteBackward } = editor;
|
|
46
35
|
editor.deleteBackward = (unit)=>{
|
|
47
36
|
deleteEmptyParagraph(unit, editor, deleteBackward);
|
|
48
37
|
};
|
|
@@ -78,9 +67,8 @@ function deleteEmptyParagraph(unit, editor, deleteFunction) {
|
|
|
78
67
|
if (entry) {
|
|
79
68
|
const [paragraphOrHeading, path] = entry;
|
|
80
69
|
const isTextEmpty = isAncestorEmpty(editor, paragraphOrHeading);
|
|
81
|
-
// We ignore paragraphs/headings that are children of ul, ol, blockquote, tables, etc
|
|
82
70
|
const isRootLevel = path.length === 1;
|
|
83
|
-
const hasSiblings = editor.children.length > 1;
|
|
71
|
+
const hasSiblings = editor.children.length > 1;
|
|
84
72
|
if (isTextEmpty && isRootLevel && hasSiblings) {
|
|
85
73
|
removeNodes(editor, {
|
|
86
74
|
at: path
|
|
@@ -114,11 +102,7 @@ function deleteEmptyParagraph(unit, editor, deleteFunction) {
|
|
|
114
102
|
deleteFunction(unit);
|
|
115
103
|
}
|
|
116
104
|
}
|
|
117
|
-
|
|
118
|
-
* To be compatible with the old behavior we need to treat each 2 consecutive
|
|
119
|
-
* line breaks as a new paragraph when pasting as plain text (also known as
|
|
120
|
-
* paste and match style in macOS)
|
|
121
|
-
*/ function fixPasteAsPlainText(editor) {
|
|
105
|
+
function fixPasteAsPlainText(editor) {
|
|
122
106
|
editor.insertTextData = (data)=>{
|
|
123
107
|
const text = data.getData('text/plain');
|
|
124
108
|
if (!text) {
|
|
@@ -127,7 +111,6 @@ function deleteEmptyParagraph(unit, editor, deleteFunction) {
|
|
|
127
111
|
const lines = text.split(/\n{2}/);
|
|
128
112
|
let split = false;
|
|
129
113
|
for (const line of lines){
|
|
130
|
-
// empty lines
|
|
131
114
|
if (/^(\r\n?|\n)$/.test(line)) {
|
|
132
115
|
continue;
|
|
133
116
|
}
|
|
@@ -21,7 +21,6 @@ export function getPastingSource(data) {
|
|
|
21
21
|
if (doc.querySelector('meta[content*="Microsoft Word"]')) {
|
|
22
22
|
return 'Microsoft Word';
|
|
23
23
|
}
|
|
24
|
-
// TODO: MS Word Online doesn't give us specific tags, we might need to have a closer look at its tracking result since we are using generic values to identify it
|
|
25
24
|
if (doc.querySelector('[style*="Arial_MSFontService"]') && (doc.querySelector('.TextRun') || doc.querySelector('.OutlineElement'))) {
|
|
26
25
|
return 'Microsoft Word Online';
|
|
27
26
|
}
|
|
@@ -59,7 +58,7 @@ export const createTrackingPlugin = (onAction)=>{
|
|
|
59
58
|
return {
|
|
60
59
|
key: 'TrackingPlugin',
|
|
61
60
|
withOverrides: (editor)=>{
|
|
62
|
-
const { insertData
|
|
61
|
+
const { insertData } = editor;
|
|
63
62
|
editor.tracking = trackingActions;
|
|
64
63
|
editor.insertData = (data)=>{
|
|
65
64
|
const isCopyAndPaste = data.types.length !== 0;
|
|
@@ -3,7 +3,6 @@ import { documentToPlainTextString } from '@contentful/rich-text-plain-text-rend
|
|
|
3
3
|
import Schema from '../../constants/Schema';
|
|
4
4
|
export function getCharacterCount(editor) {
|
|
5
5
|
const document = contentfulSlateJSAdapter.toContentfulDocument({
|
|
6
|
-
// eslint-disable-next-line -- parameter type is not exported @typescript-eslint/no-explicit-any
|
|
7
6
|
document: editor.children,
|
|
8
7
|
schema: Schema
|
|
9
8
|
});
|
|
@@ -4,8 +4,6 @@ export const createVoidsPlugin = ()=>({
|
|
|
4
4
|
key: 'VoidsPlugin',
|
|
5
5
|
exitBreak: [
|
|
6
6
|
{
|
|
7
|
-
// Inserts a new paragraph *before* a void element if it's the very first
|
|
8
|
-
// node on the editor
|
|
9
7
|
hotkey: 'enter',
|
|
10
8
|
before: true,
|
|
11
9
|
query: {
|
|
@@ -13,10 +11,7 @@ export const createVoidsPlugin = ()=>({
|
|
|
13
11
|
}
|
|
14
12
|
},
|
|
15
13
|
{
|
|
16
|
-
// Inserts a new paragraph on enter when a void element is focused
|
|
17
14
|
hotkey: 'enter',
|
|
18
|
-
// exploit the internal use of Array.slice(0, level + 1) by the exitBreak plugin
|
|
19
|
-
// to stay in the parent element
|
|
20
15
|
level: -2,
|
|
21
16
|
query: {
|
|
22
17
|
filter: ([node, path])=>!(isRootLevel(path) && isFirstChildPath(path)) && !!node.isVoid
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import { insertNodes, removeNodes } from '../../internal/transforms';
|
|
2
|
-
|
|
3
|
-
* Re-creates a void node with valid children.
|
|
4
|
-
*/ export const transformVoid = (editor, [node, path])=>{
|
|
2
|
+
export const transformVoid = (editor, [node, path])=>{
|
|
5
3
|
const validVoid = {
|
|
6
4
|
...node,
|
|
7
5
|
children: [
|
|
@@ -10,7 +8,6 @@ import { insertNodes, removeNodes } from '../../internal/transforms';
|
|
|
10
8
|
}
|
|
11
9
|
]
|
|
12
10
|
};
|
|
13
|
-
// A workaround because Slate doesn't allow adjusting void nodes children
|
|
14
11
|
removeNodes(editor, {
|
|
15
12
|
at: path
|
|
16
13
|
});
|
|
@@ -24,15 +24,11 @@ import { createTrailingParagraphPlugin } from './TrailingParagraph';
|
|
|
24
24
|
import { createVoidsPlugin } from './Voids';
|
|
25
25
|
export const getPlugins = (sdk, onAction, restrictedMarks)=>[
|
|
26
26
|
createDeserializeDocxPlugin(),
|
|
27
|
-
// Tracking - This should come first so all plugins below will have access to `editor.tracking`
|
|
28
27
|
createTrackingPlugin(onAction),
|
|
29
|
-
// Global / Global shortcuts
|
|
30
28
|
createDragAndDropPlugin(),
|
|
31
|
-
// Enable command palette plugin only, if at least action type is allowed
|
|
32
29
|
...Object.values(isCommandPromptPluginEnabled(sdk)).some(Boolean) ? [
|
|
33
30
|
createCommandPalettePlugin()
|
|
34
31
|
] : [],
|
|
35
|
-
// Block Elements
|
|
36
32
|
createParagraphPlugin(),
|
|
37
33
|
createListPlugin(),
|
|
38
34
|
createHrPlugin(),
|
|
@@ -42,28 +38,20 @@ export const getPlugins = (sdk, onAction, restrictedMarks)=>[
|
|
|
42
38
|
createEmbeddedEntryBlockPlugin(sdk),
|
|
43
39
|
createEmbeddedAssetBlockPlugin(sdk),
|
|
44
40
|
createEmbeddedResourceBlockPlugin(sdk),
|
|
45
|
-
// Inline elements
|
|
46
41
|
createHyperlinkPlugin(sdk),
|
|
47
42
|
createEmbeddedEntityInlinePlugin(sdk),
|
|
48
43
|
createEmbeddedResourceInlinePlugin(sdk),
|
|
49
|
-
// Marks
|
|
50
44
|
createMarksPlugin(),
|
|
51
|
-
// Other
|
|
52
45
|
createTrailingParagraphPlugin(),
|
|
53
46
|
createTextPlugin(restrictedMarks),
|
|
54
47
|
createVoidsPlugin(),
|
|
55
48
|
createSelectOnBackspacePlugin(),
|
|
56
|
-
// Pasting content from other sources
|
|
57
49
|
createPasteHTMLPlugin(),
|
|
58
|
-
// These plugins drive their configurations from the list of plugins
|
|
59
|
-
// above. They MUST come last.
|
|
60
50
|
createSoftBreakPlugin(),
|
|
61
51
|
createExitBreakPlugin(),
|
|
62
52
|
createResetNodePlugin(),
|
|
63
53
|
createNormalizerPlugin()
|
|
64
54
|
];
|
|
65
55
|
export const disableCorePlugins = {
|
|
66
|
-
// Note: Enabled by default since v9.0.0 but it causes Cypress's
|
|
67
|
-
// .click() command to fail
|
|
68
56
|
eventEditor: true
|
|
69
57
|
};
|
|
@@ -12,7 +12,7 @@ export const styles = {
|
|
|
12
12
|
marginRight: '10px'
|
|
13
13
|
})
|
|
14
14
|
};
|
|
15
|
-
export function EmbeddedBlockToolbarIcon({ isDisabled, nodeType, onClose
|
|
15
|
+
export function EmbeddedBlockToolbarIcon({ isDisabled , nodeType , onClose }) {
|
|
16
16
|
const editor = useContentfulEditor();
|
|
17
17
|
const sdk = useSdkContext();
|
|
18
18
|
const handleClick = async (event)=>{
|
|
@@ -29,19 +29,19 @@ export function EmbeddedBlockToolbarIcon({ isDisabled, nodeType, onClose }) {
|
|
|
29
29
|
};
|
|
30
30
|
const type = getEntityTypeFromNodeType(nodeType);
|
|
31
31
|
const baseClass = `rich-text__${nodeType}`;
|
|
32
|
-
return
|
|
32
|
+
return React.createElement(Menu.Item, {
|
|
33
33
|
disabled: isDisabled,
|
|
34
34
|
className: `${baseClass}-list-item`,
|
|
35
35
|
onClick: handleClick,
|
|
36
36
|
testId: `toolbar-toggle-${nodeType}`
|
|
37
|
-
},
|
|
37
|
+
}, React.createElement(Flex, {
|
|
38
38
|
alignItems: "center",
|
|
39
39
|
flexDirection: "row"
|
|
40
|
-
},
|
|
40
|
+
}, React.createElement(Icon, {
|
|
41
41
|
as: type === 'Asset' ? AssetIcon : EmbeddedEntryBlockIcon,
|
|
42
42
|
className: `rich-text__embedded-entry-list-icon ${styles.icon}`,
|
|
43
43
|
variant: "secondary"
|
|
44
|
-
}),
|
|
44
|
+
}), React.createElement("span", null, type, nodeType == BLOCKS.EMBEDDED_RESOURCE && React.createElement(ResourceNewBadge, null))));
|
|
45
45
|
}
|
|
46
46
|
function getEntityTypeFromNodeType(nodeType) {
|
|
47
47
|
const words = nodeType.toLowerCase().split('-');
|
|
@@ -5,7 +5,7 @@ import { focus, getNodeEntryFromSelection, insertEmptyParagraph, moveToTheNextCh
|
|
|
5
5
|
import { watchCurrentSlide } from '../../helpers/sdkNavigatorSlideIn';
|
|
6
6
|
import { getText, getAboveNode, getLastNodeByLevel, insertNodes, setNodes, select, removeNodes } from '../../internal';
|
|
7
7
|
export function getWithEmbeddedBlockEvents(nodeType, sdk) {
|
|
8
|
-
return (editor, { options: { hotkey
|
|
8
|
+
return (editor, { options: { hotkey } })=>(event)=>{
|
|
9
9
|
const [, pathToSelectedElement] = getNodeEntryFromSelection(editor, nodeType);
|
|
10
10
|
if (pathToSelectedElement) {
|
|
11
11
|
const isDelete = event.key === 'Delete';
|
|
@@ -31,14 +31,14 @@ export async function selectEntityAndInsert(nodeType, sdk, editor, logAction) {
|
|
|
31
31
|
logAction('openCreateEmbedDialog', {
|
|
32
32
|
nodeType
|
|
33
33
|
});
|
|
34
|
-
const { field, dialogs
|
|
34
|
+
const { field , dialogs } = sdk;
|
|
35
35
|
const baseConfig = newEntitySelectorConfigFromRichTextField(field, nodeType);
|
|
36
36
|
const selectEntity = baseConfig.entityType === 'Asset' ? dialogs.selectSingleAsset : dialogs.selectSingleEntry;
|
|
37
37
|
const config = {
|
|
38
38
|
...baseConfig,
|
|
39
39
|
withCreate: true
|
|
40
40
|
};
|
|
41
|
-
const { selection
|
|
41
|
+
const { selection } = editor;
|
|
42
42
|
const rteSlide = watchCurrentSlide(sdk.navigator);
|
|
43
43
|
const entity = await selectEntity(config);
|
|
44
44
|
if (!entity) {
|
|
@@ -46,8 +46,6 @@ export async function selectEntityAndInsert(nodeType, sdk, editor, logAction) {
|
|
|
46
46
|
nodeType
|
|
47
47
|
});
|
|
48
48
|
} else {
|
|
49
|
-
// Selection prevents incorrect position of inserted ref when RTE doesn't have focus
|
|
50
|
-
// (i.e. when using hotkeys and slide-in)
|
|
51
49
|
select(editor, selection);
|
|
52
50
|
insertBlock(editor, nodeType, entity);
|
|
53
51
|
ensureFollowingParagraph(editor, [
|
|
@@ -58,8 +56,6 @@ export async function selectEntityAndInsert(nodeType, sdk, editor, logAction) {
|
|
|
58
56
|
nodeType
|
|
59
57
|
});
|
|
60
58
|
}
|
|
61
|
-
// If user chose to create a new entity, this might open slide-in to edit the
|
|
62
|
-
// entity. In this case, no point in focusing RTE which is now in the slide below.
|
|
63
59
|
rteSlide.onActive(()=>{
|
|
64
60
|
rteSlide.unwatch();
|
|
65
61
|
focus(editor);
|
|
@@ -69,17 +65,15 @@ export async function selectResourceEntityAndInsert(sdk, editor, logAction) {
|
|
|
69
65
|
logAction('openCreateEmbedDialog', {
|
|
70
66
|
nodeType: BLOCKS.EMBEDDED_RESOURCE
|
|
71
67
|
});
|
|
72
|
-
const { field, dialogs
|
|
68
|
+
const { field , dialogs } = sdk;
|
|
73
69
|
const config = newResourceEntitySelectorConfigFromRichTextField(field, BLOCKS.EMBEDDED_RESOURCE);
|
|
74
|
-
const { selection
|
|
70
|
+
const { selection } = editor;
|
|
75
71
|
const entity = await dialogs.selectSingleResourceEntry(config);
|
|
76
72
|
if (!entity) {
|
|
77
73
|
logAction('cancelCreateEmbedDialog', {
|
|
78
74
|
nodeType: BLOCKS.EMBEDDED_RESOURCE
|
|
79
75
|
});
|
|
80
76
|
} else {
|
|
81
|
-
// Selection prevents incorrect position of inserted ref when RTE doesn't have focus
|
|
82
|
-
// (i.e. when using hotkeys and slide-in)
|
|
83
77
|
select(editor, selection);
|
|
84
78
|
insertBlock(editor, BLOCKS.EMBEDDED_RESOURCE, entity);
|
|
85
79
|
ensureFollowingParagraph(editor, [
|
|
@@ -90,7 +84,6 @@ export async function selectResourceEntityAndInsert(sdk, editor, logAction) {
|
|
|
90
84
|
});
|
|
91
85
|
}
|
|
92
86
|
}
|
|
93
|
-
// TODO: incorporate this logic inside the trailingParagraph plugin instead
|
|
94
87
|
function ensureFollowingParagraph(editor, nodeTypes) {
|
|
95
88
|
const entityBlock = getAboveNode(editor, {
|
|
96
89
|
match: {
|
|
@@ -103,8 +96,6 @@ function ensureFollowingParagraph(editor, nodeTypes) {
|
|
|
103
96
|
const level = entityBlock[1].length - 1;
|
|
104
97
|
const lastNode = getLastNodeByLevel(editor, level);
|
|
105
98
|
const isTextContainer = TEXT_CONTAINERS.includes(lastNode?.[0].type ?? '');
|
|
106
|
-
// If the new block isn't followed by a sibling text container (e.g. paragraph)
|
|
107
|
-
// we insert a new empty one. Level 0 is handled by the trailingParagraph plugin
|
|
108
99
|
if (level !== 0 && !isTextContainer) {
|
|
109
100
|
insertEmptyParagraph(editor);
|
|
110
101
|
}
|
|
@@ -140,7 +131,6 @@ const createNode = (nodeType, entity)=>{
|
|
|
140
131
|
isVoid: true
|
|
141
132
|
};
|
|
142
133
|
};
|
|
143
|
-
// TODO: DRY up copied code from HR
|
|
144
134
|
function insertBlock(editor, nodeType, entity) {
|
|
145
135
|
if (!editor?.selection) return;
|
|
146
136
|
const linkedEntityBlock = createNode(nodeType, entity);
|
|
@@ -22,7 +22,7 @@ const styles = {
|
|
|
22
22
|
}
|
|
23
23
|
})
|
|
24
24
|
};
|
|
25
|
-
export function EmbeddedInlineToolbarIcon({ onClose, nodeType, isDisabled
|
|
25
|
+
export function EmbeddedInlineToolbarIcon({ onClose , nodeType , isDisabled }) {
|
|
26
26
|
const editor = useContentfulEditor();
|
|
27
27
|
const sdk = useSdkContext();
|
|
28
28
|
async function handleClick(event) {
|
|
@@ -36,16 +36,16 @@ export function EmbeddedInlineToolbarIcon({ onClose, nodeType, isDisabled }) {
|
|
|
36
36
|
}
|
|
37
37
|
moveToTheNextChar(editor);
|
|
38
38
|
}
|
|
39
|
-
return
|
|
39
|
+
return React.createElement(Menu.Item, {
|
|
40
40
|
disabled: isDisabled,
|
|
41
41
|
className: "rich-text__entry-link-block-button",
|
|
42
42
|
testId: `toolbar-toggle-${nodeType}`,
|
|
43
43
|
onClick: handleClick
|
|
44
|
-
},
|
|
44
|
+
}, React.createElement(Flex, {
|
|
45
45
|
alignItems: "center",
|
|
46
46
|
flexDirection: "row"
|
|
47
|
-
},
|
|
47
|
+
}, React.createElement(EmbeddedEntryInlineIcon, {
|
|
48
48
|
variant: "secondary",
|
|
49
49
|
className: `rich-text__embedded-entry-list-icon ${styles.icon}`
|
|
50
|
-
}),
|
|
50
|
+
}), React.createElement("span", null, "Inline entry", nodeType == INLINES.EMBEDDED_RESOURCE && React.createElement(ResourceNewBadge, null))));
|
|
51
51
|
}
|