@contentful/field-editor-rich-text 3.16.8 → 3.16.10
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
|
@@ -3,27 +3,7 @@ import { normalize } from './transforms';
|
|
|
3
3
|
export const createPlateEditor = (options = {})=>{
|
|
4
4
|
return p.createPlateEditor(options);
|
|
5
5
|
};
|
|
6
|
-
|
|
7
|
-
* The only reason for this helper to exist is to run the initial normalization
|
|
8
|
-
* before mounting the Plate editor component which in turn avoids the false
|
|
9
|
-
* trigger of `onChange`.
|
|
10
|
-
*
|
|
11
|
-
* Background:
|
|
12
|
-
*
|
|
13
|
-
* Due to legacy behavior, it's possible to have "valid" RT document (based on
|
|
14
|
-
* the schema from rich-text-types) that doesn't make sense. For example, links
|
|
15
|
-
* with no text nodes?[1]. Solving that requires an initial normalization pass
|
|
16
|
-
* which modifies the slate tree by definition -> triggering onChange.
|
|
17
|
-
*
|
|
18
|
-
* The initial onChange trigger is undesirable as the user may not have touched
|
|
19
|
-
* the RT content yet or the editor is rendered as readonly.
|
|
20
|
-
*
|
|
21
|
-
* Ideally, we should not initialize the editor twice but that's the only
|
|
22
|
-
* way that I could get this to work. Improvements are welcome.
|
|
23
|
-
*
|
|
24
|
-
* [1]: See cypress/e2e/rich-text/.../invalidDocumentNormalizable.js for more
|
|
25
|
-
* examples.
|
|
26
|
-
*/ export const normalizeInitialValue = (options, initialValue)=>{
|
|
6
|
+
export const normalizeInitialValue = (options, initialValue)=>{
|
|
27
7
|
const editor = createPlateEditor(options);
|
|
28
8
|
if (initialValue) {
|
|
29
9
|
editor.children = initialValue;
|
|
@@ -49,6 +29,5 @@ export const fromDOMPoint = (editor, domPoint, opts = {
|
|
|
49
29
|
return p.toSlatePoint(editor, domPoint, opts);
|
|
50
30
|
};
|
|
51
31
|
export const mockPlugin = (plugin)=>{
|
|
52
|
-
return p.mockPlugin(
|
|
53
|
-
plugin);
|
|
32
|
+
return p.mockPlugin(plugin);
|
|
54
33
|
};
|
|
@@ -1,11 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
* Re-exporting Plate/Slate queries (aka selectors) to reduce
|
|
3
|
-
* the blast radius of version upgrades
|
|
4
|
-
*/ import * as p from '@udecode/plate-common';
|
|
1
|
+
import * as p from '@udecode/plate-common';
|
|
5
2
|
import * as s from 'slate';
|
|
6
|
-
|
|
7
|
-
* Get text content at location
|
|
8
|
-
*/ export const getText = (editor, at)=>{
|
|
3
|
+
export const getText = (editor, at)=>{
|
|
9
4
|
return p.getEditorString(editor, at);
|
|
10
5
|
};
|
|
11
6
|
export const isText = (value)=>{
|
|
@@ -35,7 +30,6 @@ export const getNodeEntry = (editor, at, options)=>{
|
|
|
35
30
|
export const getNodeEntries = (editor, options)=>{
|
|
36
31
|
return p.getNodeEntries(editor, options);
|
|
37
32
|
};
|
|
38
|
-
// TODO: Ancestor may not be the correct type for root
|
|
39
33
|
export const getNodeChildren = (root, path, options)=>{
|
|
40
34
|
return p.getNodeChildren(root, path, options);
|
|
41
35
|
};
|
|
@@ -46,7 +40,6 @@ export const someNode = (editor, options)=>{
|
|
|
46
40
|
return p.someNode(editor, options);
|
|
47
41
|
};
|
|
48
42
|
export const getChildren = (entry)=>{
|
|
49
|
-
// Node.children crashes when given a text node
|
|
50
43
|
if (s.Text.isText(entry[0])) {
|
|
51
44
|
return [];
|
|
52
45
|
}
|
|
@@ -56,7 +49,6 @@ export const isFirstChild = (path)=>{
|
|
|
56
49
|
return p.isFirstChild(path);
|
|
57
50
|
};
|
|
58
51
|
export const getDescendantNodeByPath = (root, path)=>{
|
|
59
|
-
// @ts-expect-error
|
|
60
52
|
return s.Node.get(root, path);
|
|
61
53
|
};
|
|
62
54
|
export const getNodeDescendants = (root, options)=>{
|
|
@@ -68,7 +60,6 @@ export const getNodeDescendants = (root, options)=>{
|
|
|
68
60
|
export const isRangeCollapsed = (range)=>{
|
|
69
61
|
return p.isCollapsed(range);
|
|
70
62
|
};
|
|
71
|
-
// TODO: simplify
|
|
72
63
|
export const isRangeAcrossBlocks = (editor, options)=>{
|
|
73
64
|
return p.isRangeAcrossBlocks(editor, options);
|
|
74
65
|
};
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import * as p from '@udecode/plate-common';
|
|
2
2
|
import { getEndPoint, isNode } from './queries';
|
|
3
|
-
|
|
4
|
-
* Apply editor normalization rules
|
|
5
|
-
*/ export const normalize = (editor, options = {
|
|
3
|
+
export const normalize = (editor, options = {
|
|
6
4
|
force: true
|
|
7
5
|
})=>{
|
|
8
6
|
return p.normalizeEditor(editor, options);
|
|
@@ -10,9 +8,7 @@ import { getEndPoint, isNode } from './queries';
|
|
|
10
8
|
export const withoutNormalizing = (editor, fn)=>{
|
|
11
9
|
return p.withoutNormalizing(editor, fn);
|
|
12
10
|
};
|
|
13
|
-
|
|
14
|
-
* Set the selection to a location
|
|
15
|
-
*/ export const setSelection = (editor, props)=>{
|
|
11
|
+
export const setSelection = (editor, props)=>{
|
|
16
12
|
return p.setSelection(editor, props);
|
|
17
13
|
};
|
|
18
14
|
export const select = (editor, location)=>{
|
|
@@ -81,14 +77,7 @@ export const moveNodes = (editor, opts)=>{
|
|
|
81
77
|
export const deleteFragment = (editor, options)=>{
|
|
82
78
|
return p.deleteFragment(editor, options);
|
|
83
79
|
};
|
|
84
|
-
|
|
85
|
-
* Plate api doesn't allow to modify (easily) the editor value
|
|
86
|
-
* programmatically after the editor instance is created.
|
|
87
|
-
*
|
|
88
|
-
* This function is inspired by:
|
|
89
|
-
* https://github.com/udecode/plate/issues/1269#issuecomment-1057643622
|
|
90
|
-
*/ export const setEditorValue = (editor, nodes)=>{
|
|
91
|
-
// Replaces editor content while keeping change history
|
|
80
|
+
export const setEditorValue = (editor, nodes)=>{
|
|
92
81
|
withoutNormalizing(editor, ()=>{
|
|
93
82
|
const children = [
|
|
94
83
|
...editor.children
|
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
|
|
1
|
+
import { KEY_EXIT_BREAK } from '@udecode/plate-break';
|
|
2
2
|
import { jsx, createTestEditor, mockPlugin } from '../../test-utils';
|
|
3
3
|
import { createExitBreakPlugin } from './createExitBreakPlugin';
|
|
4
4
|
describe('Exit Break', ()=>{
|
|
5
|
-
// https://slate-js.slack.com/archives/C013QHXSCG1/p1640853996467300
|
|
6
5
|
it('derives its config from other plugins', ()=>{
|
|
7
|
-
const input =
|
|
6
|
+
const input = jsx("editor", null, jsx("hp", null, jsx("htext", null)));
|
|
8
7
|
const rules = [
|
|
9
8
|
{
|
|
10
9
|
hotkey: 'enter',
|
|
@@ -15,7 +14,7 @@ describe('Exit Break', ()=>{
|
|
|
15
14
|
}
|
|
16
15
|
}
|
|
17
16
|
];
|
|
18
|
-
const { editor
|
|
17
|
+
const { editor } = createTestEditor({
|
|
19
18
|
input,
|
|
20
19
|
plugins: [
|
|
21
20
|
mockPlugin({}),
|
|
@@ -8,7 +8,6 @@ export const createResetNodePlugin = ()=>createDefaultResetNodePlugin({
|
|
|
8
8
|
const rules = editor.plugins.flatMap((p)=>{
|
|
9
9
|
return p.resetNode || [];
|
|
10
10
|
});
|
|
11
|
-
// set defaultType to Paragraph if not set
|
|
12
11
|
for (const rule of rules){
|
|
13
12
|
if (!rule.defaultType) {
|
|
14
13
|
rule.defaultType = BLOCKS.PARAGRAPH;
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
|
|
1
|
+
import { KEY_SOFT_BREAK } from '@udecode/plate-break';
|
|
2
2
|
import { jsx, createTestEditor, mockPlugin } from '../../test-utils';
|
|
3
3
|
import { createSoftBreakPlugin } from './createSoftBreakPlugin';
|
|
4
4
|
describe('Soft Break', ()=>{
|
|
5
5
|
it('derives its config from other plugins', ()=>{
|
|
6
|
-
const input =
|
|
6
|
+
const input = jsx("editor", null, jsx("hp", null, jsx("htext", null)));
|
|
7
7
|
const rules = [
|
|
8
8
|
{
|
|
9
9
|
hotkey: 'ctrl+enter',
|
|
@@ -18,7 +18,7 @@ describe('Soft Break', ()=>{
|
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
20
|
];
|
|
21
|
-
const { editor
|
|
21
|
+
const { editor } = createTestEditor({
|
|
22
22
|
input,
|
|
23
23
|
plugins: [
|
|
24
24
|
mockPlugin({
|
|
@@ -7,47 +7,47 @@ import { useSdkContext } from '../../../SdkProvider';
|
|
|
7
7
|
import { useCommandList } from '../hooks/useCommandList';
|
|
8
8
|
import { useCommands } from '../useCommands';
|
|
9
9
|
import styles from './CommandList.styles';
|
|
10
|
-
const Group = ({ commandGroup, selectedItem
|
|
10
|
+
const Group = ({ commandGroup , selectedItem })=>React.createElement("section", {
|
|
11
11
|
key: commandGroup.group
|
|
12
|
-
},
|
|
12
|
+
}, React.createElement(SectionHeading, {
|
|
13
13
|
as: "h3",
|
|
14
14
|
marginBottom: "spacingS",
|
|
15
15
|
marginTop: "spacingS",
|
|
16
16
|
marginLeft: "spacingM",
|
|
17
17
|
marginRight: "spacingM"
|
|
18
|
-
}, commandGroup.group), commandGroup.commands.map((command)
|
|
18
|
+
}, commandGroup.group), commandGroup.commands.map((command)=>React.createElement("button", {
|
|
19
19
|
key: command.id,
|
|
20
20
|
id: command.id,
|
|
21
21
|
className: cx(styles.menuItem, {
|
|
22
22
|
[styles.menuItemSelected]: command.id === selectedItem
|
|
23
23
|
}),
|
|
24
24
|
onClick: command.callback
|
|
25
|
-
}, command.label)),
|
|
25
|
+
}, command.label)), React.createElement("hr", {
|
|
26
26
|
className: styles.menuDivider,
|
|
27
27
|
"aria-orientation": "horizontal"
|
|
28
28
|
}));
|
|
29
|
-
const Asset = ({ command, selectedItem
|
|
29
|
+
const Asset = ({ command , selectedItem })=>React.createElement("button", {
|
|
30
30
|
key: command.id,
|
|
31
31
|
id: command.id,
|
|
32
32
|
className: cx(styles.menuItem, {
|
|
33
33
|
[styles.menuItemSelected]: command.id === selectedItem
|
|
34
34
|
}),
|
|
35
35
|
onClick: command.callback
|
|
36
|
-
},
|
|
36
|
+
}, React.createElement(Flex, {
|
|
37
37
|
alignItems: "center",
|
|
38
38
|
gap: "spacingS"
|
|
39
|
-
}, command.thumbnail ?
|
|
39
|
+
}, command.thumbnail ? React.createElement("img", {
|
|
40
40
|
width: "30",
|
|
41
41
|
height: "30",
|
|
42
42
|
src: command.thumbnail,
|
|
43
43
|
alt: "",
|
|
44
44
|
className: styles.thumbnail
|
|
45
|
-
}) :
|
|
45
|
+
}) : React.createElement(AssetIcon, {
|
|
46
46
|
width: "30",
|
|
47
47
|
height: "30",
|
|
48
48
|
className: styles.thumbnail
|
|
49
|
-
}),
|
|
50
|
-
const Item = ({ command, selectedItem
|
|
49
|
+
}), React.createElement("span", null, command.label)));
|
|
50
|
+
const Item = ({ command , selectedItem })=>React.createElement("button", {
|
|
51
51
|
key: command.id,
|
|
52
52
|
id: command.id,
|
|
53
53
|
className: cx(styles.menuItem, {
|
|
@@ -55,70 +55,70 @@ const Item = ({ command, selectedItem })=>/*#__PURE__*/ React.createElement("but
|
|
|
55
55
|
}),
|
|
56
56
|
onClick: command.callback
|
|
57
57
|
}, command.label);
|
|
58
|
-
const CommandListItems = ({ commandItems, selectedItem
|
|
59
|
-
return
|
|
60
|
-
return 'group' in command ?
|
|
58
|
+
const CommandListItems = ({ commandItems , selectedItem })=>{
|
|
59
|
+
return React.createElement(React.Fragment, null, commandItems.map((command)=>{
|
|
60
|
+
return 'group' in command ? React.createElement(Group, {
|
|
61
61
|
key: command.group,
|
|
62
62
|
commandGroup: command,
|
|
63
63
|
selectedItem: selectedItem
|
|
64
|
-
}) : command.asset ?
|
|
64
|
+
}) : command.asset ? React.createElement(Asset, {
|
|
65
65
|
key: command.id,
|
|
66
66
|
command: command,
|
|
67
67
|
selectedItem: selectedItem
|
|
68
|
-
}) :
|
|
68
|
+
}) : React.createElement(Item, {
|
|
69
69
|
key: command.id,
|
|
70
70
|
command: command,
|
|
71
71
|
selectedItem: selectedItem
|
|
72
72
|
});
|
|
73
73
|
}));
|
|
74
74
|
};
|
|
75
|
-
export const CommandList = ({ query, editor, textContainer
|
|
75
|
+
export const CommandList = ({ query , editor , textContainer })=>{
|
|
76
76
|
const sdk = useSdkContext();
|
|
77
77
|
const popoverContainer = React.useRef(null);
|
|
78
78
|
const popper = usePopper(textContainer, popoverContainer?.current, {
|
|
79
79
|
placement: 'bottom-start'
|
|
80
80
|
});
|
|
81
81
|
const commandItems = useCommands(sdk, query, editor);
|
|
82
|
-
const { selectedItem, isOpen
|
|
82
|
+
const { selectedItem , isOpen } = useCommandList(commandItems, popoverContainer);
|
|
83
83
|
if (!commandItems.length) {
|
|
84
84
|
return null;
|
|
85
85
|
}
|
|
86
|
-
return
|
|
86
|
+
return React.createElement("div", {
|
|
87
87
|
className: styles.container,
|
|
88
88
|
tabIndex: -1,
|
|
89
89
|
contentEditable: false
|
|
90
|
-
},
|
|
90
|
+
}, React.createElement("div", {
|
|
91
91
|
role: "alert"
|
|
92
|
-
},
|
|
92
|
+
}, React.createElement(ScreenReaderOnly, null, "Richtext commands. Currently focused item: ", selectedItem, ". Press ", React.createElement("kbd", null, "enter"), " to select, ", React.createElement("kbd", null, "arrows"), " to navigate, ", React.createElement("kbd", null, "escape"), " to close.")), React.createElement(Portal, null, React.createElement("div", {
|
|
93
93
|
"aria-hidden": true,
|
|
94
94
|
ref: popoverContainer,
|
|
95
95
|
className: styles.menuPoper,
|
|
96
96
|
style: popper.styles.popper,
|
|
97
97
|
...popper.attributes.popper
|
|
98
|
-
},
|
|
98
|
+
}, React.createElement(Popover, {
|
|
99
99
|
isOpen: isOpen,
|
|
100
100
|
usePortal: false,
|
|
101
|
-
|
|
102
|
-
},
|
|
101
|
+
autoFocus: false
|
|
102
|
+
}, React.createElement(Popover.Trigger, null, React.createElement("span", null)), React.createElement(Popover.Content, {
|
|
103
103
|
className: styles.menuContent,
|
|
104
104
|
testId: "rich-text-commands"
|
|
105
|
-
},
|
|
105
|
+
}, React.createElement("header", {
|
|
106
106
|
className: styles.menuHeader
|
|
107
|
-
},
|
|
107
|
+
}, React.createElement(SectionHeading, {
|
|
108
108
|
marginBottom: "none"
|
|
109
|
-
}, "Richtext commands")),
|
|
109
|
+
}, "Richtext commands")), React.createElement("div", {
|
|
110
110
|
className: styles.menuList,
|
|
111
111
|
"data-test-id": "rich-text-commands-list"
|
|
112
|
-
},
|
|
112
|
+
}, React.createElement(CommandListItems, {
|
|
113
113
|
commandItems: commandItems,
|
|
114
114
|
selectedItem: selectedItem
|
|
115
|
-
})),
|
|
115
|
+
})), React.createElement("footer", {
|
|
116
116
|
className: styles.menuFooter
|
|
117
|
-
},
|
|
117
|
+
}, React.createElement(Stack, {
|
|
118
118
|
as: "ul",
|
|
119
119
|
margin: "none",
|
|
120
120
|
padding: "none",
|
|
121
121
|
spacing: "spacingS",
|
|
122
122
|
className: styles.footerList
|
|
123
|
-
},
|
|
123
|
+
}, React.createElement("li", null, React.createElement("kbd", null, "↑"), React.createElement("kbd", null, "↓"), " to navigate"), React.createElement("li", null, React.createElement("kbd", null, "↵"), " to confirm"), React.createElement("li", null, React.createElement("kbd", null, "esc"), " to close"))))))));
|
|
124
124
|
};
|
|
@@ -14,13 +14,13 @@ export const CommandPrompt = (props)=>{
|
|
|
14
14
|
]);
|
|
15
15
|
const editor = props.editor;
|
|
16
16
|
const [textElement, setTextElement] = React.useState();
|
|
17
|
-
return
|
|
17
|
+
return React.createElement("span", {
|
|
18
18
|
className: styles.commandPrompt,
|
|
19
19
|
ref: (e)=>{
|
|
20
20
|
setTextElement(e);
|
|
21
21
|
},
|
|
22
22
|
...props.attributes
|
|
23
|
-
}, props.children,
|
|
23
|
+
}, props.children, React.createElement(CommandList, {
|
|
24
24
|
query: query,
|
|
25
25
|
editor: editor,
|
|
26
26
|
textContainer: textElement
|
|
@@ -1,17 +1,7 @@
|
|
|
1
1
|
import { CommandPrompt } from './components/CommandPrompt';
|
|
2
2
|
import { COMMAND_PROMPT } from './constants';
|
|
3
3
|
import { createOnKeyDown } from './onKeyDown';
|
|
4
|
-
|
|
5
|
-
* A command palette plugin (aka slash commands)
|
|
6
|
-
*
|
|
7
|
-
* How does it work?
|
|
8
|
-
* * When the user presses the slash key, the editor will show a command palette
|
|
9
|
-
* * When the user presses a key, the command palette will show the command suggestions
|
|
10
|
-
* * When the user presses enter, the command palette will execute the command
|
|
11
|
-
* * When the user presses escape, the command palette will hide
|
|
12
|
-
* * When the user presses a letter, number, or space, the command palette will show the command suggestions
|
|
13
|
-
* * When the user presses backspace, the command palette will remove the last character from the command string
|
|
14
|
-
*/ export const createCommandPalettePlugin = ()=>{
|
|
4
|
+
export const createCommandPalettePlugin = ()=>{
|
|
15
5
|
return {
|
|
16
6
|
key: COMMAND_PROMPT,
|
|
17
7
|
type: COMMAND_PROMPT,
|
|
@@ -2,7 +2,6 @@ import * as React from 'react';
|
|
|
2
2
|
import isHotkey from 'is-hotkey';
|
|
3
3
|
export const useCommandList = (commandItems, container)=>{
|
|
4
4
|
const [selectedItem, setSelectedItem] = React.useState(()=>{
|
|
5
|
-
// select the first item on initial render
|
|
6
5
|
if (!commandItems.length) {
|
|
7
6
|
return '';
|
|
8
7
|
}
|
|
@@ -55,7 +54,6 @@ export const useCommandList = (commandItems, container)=>{
|
|
|
55
54
|
currBtn.click();
|
|
56
55
|
}
|
|
57
56
|
}
|
|
58
|
-
//TODO: handle shift+enter, which must be detected using separate events
|
|
59
57
|
}
|
|
60
58
|
if (commandItems.length) {
|
|
61
59
|
window.addEventListener('keydown', handleKeyDown);
|
|
@@ -5,10 +5,6 @@ import { COMMAND_PROMPT } from './constants';
|
|
|
5
5
|
export const createOnKeyDown = ()=>{
|
|
6
6
|
return (editor)=>{
|
|
7
7
|
return (event)=>{
|
|
8
|
-
// Support for different keyboard layouts:
|
|
9
|
-
// `isHotKey` uses by default `event.which`, which will never generates a match for all layouts (QWERTY: `/`, QWERTZ: `shift+7`)
|
|
10
|
-
// with `byKey: true` `isHotKey` uses `event.key` which will return the interpreted key '/'
|
|
11
|
-
// It would still fail without the the optional `shift?` param, as it first checks the modKeys (`shiftKey` would be true on QWERTZ)
|
|
12
8
|
if (isHotkey('shift?+/', {
|
|
13
9
|
byKey: true
|
|
14
10
|
}, event)) {
|
|
@@ -25,7 +21,6 @@ export const createOnKeyDown = ()=>{
|
|
|
25
21
|
const [, path] = getAboveNode(editor);
|
|
26
22
|
const range = getRange(editor, path);
|
|
27
23
|
if (isHotkey('backspace', event)) {
|
|
28
|
-
// if it is the last character in the command string
|
|
29
24
|
if (range.focus.offset - range.anchor.offset === 1) {
|
|
30
25
|
removeMark(editor, COMMAND_PROMPT, range);
|
|
31
26
|
}
|
|
@@ -9,7 +9,7 @@ jest.mock('../../internal/transforms', ()=>{
|
|
|
9
9
|
};
|
|
10
10
|
});
|
|
11
11
|
describe('onKeyDown', ()=>{
|
|
12
|
-
const { editor
|
|
12
|
+
const { editor } = createTestEditor({});
|
|
13
13
|
const addMark = jest.spyOn(internal, 'addMark');
|
|
14
14
|
const onCommandPaletteAction = jest.spyOn(editor.tracking, 'onCommandPaletteAction');
|
|
15
15
|
afterEach(()=>{
|
|
@@ -27,7 +27,7 @@ describe('onKeyDown', ()=>{
|
|
|
27
27
|
which: 55,
|
|
28
28
|
shiftKey: true
|
|
29
29
|
}}
|
|
30
|
-
`('supports hotKeys for every keyboard layout #{layout}', ({ key
|
|
30
|
+
`('supports hotKeys for every keyboard layout #{layout}', ({ key })=>{
|
|
31
31
|
createOnKeyDown()(editor, {})({
|
|
32
32
|
type: 'keydown',
|
|
33
33
|
...key
|
|
@@ -39,7 +39,7 @@ export function isCommandPromptPluginEnabled(sdk) {
|
|
|
39
39
|
}
|
|
40
40
|
function getCommandPermissions(sdk, editor) {
|
|
41
41
|
const canInsertBlocks = !isNodeTypeSelected(editor, BLOCKS.TABLE);
|
|
42
|
-
const { inlineAllowed, entriesAllowed, assetsAllowed
|
|
42
|
+
const { inlineAllowed , entriesAllowed , assetsAllowed } = isCommandPromptPluginEnabled(sdk);
|
|
43
43
|
return {
|
|
44
44
|
inlineAllowed,
|
|
45
45
|
entriesAllowed: entriesAllowed && canInsertBlocks,
|
|
@@ -68,7 +68,7 @@ const getAllowedContentTypesFromValidation = (validations)=>{
|
|
|
68
68
|
};
|
|
69
69
|
export const useCommands = (sdk, query, editor)=>{
|
|
70
70
|
const contentTypes = sdk.space.getCachedContentTypes();
|
|
71
|
-
const { inlineAllowed, entriesAllowed, assetsAllowed
|
|
71
|
+
const { inlineAllowed , entriesAllowed , assetsAllowed } = getCommandPermissions(sdk, editor);
|
|
72
72
|
const allowedContentTypesFromValidation = getAllowedContentTypesFromValidation(sdk.field.validations);
|
|
73
73
|
const filterContentTypesByValidation = (type)=>contentTypes.filter((contentType)=>allowedContentTypesFromValidation[type]?.[contentType.sys.id]);
|
|
74
74
|
const filteredBlockContentTypes = filterContentTypesByValidation(BLOCKS.EMBEDDED_ENTRY);
|
|
@@ -217,7 +217,7 @@ export const useCommands = (sdk, query, editor)=>{
|
|
|
217
217
|
}
|
|
218
218
|
return contentTypeCommands;
|
|
219
219
|
});
|
|
220
|
-
|
|
220
|
+
return query ? commands.reduce((list, nextItem)=>{
|
|
221
221
|
if ('group' in nextItem) {
|
|
222
222
|
const subcommands = nextItem.commands.filter((command)=>{
|
|
223
223
|
return command.label.toLowerCase().includes(query.toLowerCase());
|
|
@@ -7,13 +7,11 @@ export async function fetchEntries(sdk, contentType, query) {
|
|
|
7
7
|
return entries.items.map((entry)=>{
|
|
8
8
|
const description = entityHelpers.getEntityDescription({
|
|
9
9
|
contentType,
|
|
10
|
-
// @ts-expect-error inconsistent in typing between app-sdk & field-editors-shared
|
|
11
10
|
entity: entry,
|
|
12
11
|
localeCode: sdk.field.locale,
|
|
13
12
|
defaultLocaleCode: sdk.locales.default
|
|
14
13
|
});
|
|
15
14
|
const displayTitle = entityHelpers.getEntryTitle({
|
|
16
|
-
// @ts-expect-error inconsistent in typing between app-sdk & field-editors-shared
|
|
17
15
|
entry,
|
|
18
16
|
contentType,
|
|
19
17
|
localeCode: sdk.field.locale,
|
|
@@ -1,9 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
* Trim leading slash character if found. Bails otherwise.
|
|
3
|
-
*
|
|
4
|
-
* @example
|
|
5
|
-
* trimLeadingSlash("/my query") // --> "my query"
|
|
6
|
-
*/ export function trimLeadingSlash(text) {
|
|
1
|
+
export function trimLeadingSlash(text) {
|
|
7
2
|
if (!text.startsWith('/')) {
|
|
8
3
|
return text;
|
|
9
4
|
}
|
|
@@ -9,11 +9,7 @@ export function createDragAndDropPlugin() {
|
|
|
9
9
|
INLINES.EMBEDDED_ENTRY,
|
|
10
10
|
INLINES.EMBEDDED_RESOURCE
|
|
11
11
|
];
|
|
12
|
-
|
|
13
|
-
* HTML node names where dropping should be allowed
|
|
14
|
-
* Usually for elements where `Transforms.removeNodes` is needed
|
|
15
|
-
* TODO: looking up for html nodes is not the best solution and it won't scale but it works fine for our current cases/elements
|
|
16
|
-
*/ const ON_DROP_ALLOWED_TYPES = {
|
|
12
|
+
const ON_DROP_ALLOWED_TYPES = {
|
|
17
13
|
TABLE: [
|
|
18
14
|
INLINES.EMBEDDED_ENTRY,
|
|
19
15
|
INLINES.EMBEDDED_RESOURCE
|
|
@@ -22,7 +18,6 @@ export function createDragAndDropPlugin() {
|
|
|
22
18
|
return {
|
|
23
19
|
key: 'DragAndDropPlugin',
|
|
24
20
|
handlers: {
|
|
25
|
-
// If true, the next handlers will be skipped.
|
|
26
21
|
onDrop: (editor)=>(event)=>{
|
|
27
22
|
const [draggingBlock] = Array.from(getNodeEntries(editor, {
|
|
28
23
|
match: (node)=>DRAGGABLE_TYPES.includes(node.type)
|
|
@@ -30,13 +25,10 @@ export function createDragAndDropPlugin() {
|
|
|
30
25
|
if (!draggingBlock) return false;
|
|
31
26
|
const [draggingNode] = draggingBlock;
|
|
32
27
|
if (!event.nativeEvent.target) return false;
|
|
33
|
-
// TODO: looking up for html nodes is not the best solution and it won't scale, we need to find a way to know the dropping target slate element
|
|
34
28
|
const dropDisallowed = getParents(event.nativeEvent.target).some((node)=>{
|
|
35
29
|
return ON_DROP_ALLOWED_TYPES[node.nodeName] ? !ON_DROP_ALLOWED_TYPES[node.nodeName]?.includes(draggingNode.type) : false;
|
|
36
30
|
});
|
|
37
31
|
if (!dropDisallowed) {
|
|
38
|
-
// Move the drop event to a new undo batch mitigating the bug where undo not only moves it back,
|
|
39
|
-
// but also undoes a previous action: https://github.com/ianstormtaylor/slate/issues/4694
|
|
40
32
|
editor.history.undos.push([]);
|
|
41
33
|
}
|
|
42
34
|
return dropDisallowed;
|
|
@@ -9,13 +9,13 @@ import { FetchingWrappedAssetCard } from '../shared/FetchingWrappedAssetCard';
|
|
|
9
9
|
import { FetchingWrappedEntryCard } from '../shared/FetchingWrappedEntryCard';
|
|
10
10
|
import { LinkedBlockWrapper } from '../shared/LinkedBlockWrapper';
|
|
11
11
|
export function LinkedEntityBlock(props) {
|
|
12
|
-
const { attributes, children, element
|
|
13
|
-
const { onEntityFetchComplete
|
|
12
|
+
const { attributes , children , element } = props;
|
|
13
|
+
const { onEntityFetchComplete } = useLinkTracking();
|
|
14
14
|
const isSelected = useSelected();
|
|
15
15
|
const editor = useContentfulEditor();
|
|
16
16
|
const sdk = useSdkContext();
|
|
17
17
|
const isDisabled = useReadOnly();
|
|
18
|
-
const { id: entityId, linkType: entityType
|
|
18
|
+
const { id: entityId , linkType: entityType } = element.data.target.sys;
|
|
19
19
|
const handleEditClick = React.useCallback(()=>{
|
|
20
20
|
const openEntity = entityType === 'Asset' ? sdk.navigator.openAsset : sdk.navigator.openEntry;
|
|
21
21
|
return openEntity(entityId, {
|
|
@@ -36,9 +36,9 @@ export function LinkedEntityBlock(props) {
|
|
|
36
36
|
editor,
|
|
37
37
|
element
|
|
38
38
|
]);
|
|
39
|
-
return
|
|
39
|
+
return React.createElement(LinkedBlockWrapper, {
|
|
40
40
|
attributes: attributes,
|
|
41
|
-
card:
|
|
41
|
+
card: React.createElement(React.Fragment, null, entityType === 'Entry' && React.createElement(FetchingWrappedEntryCard, {
|
|
42
42
|
sdk: sdk,
|
|
43
43
|
entryId: entityId,
|
|
44
44
|
locale: sdk.field.locale,
|
|
@@ -47,7 +47,7 @@ export function LinkedEntityBlock(props) {
|
|
|
47
47
|
onRemove: handleRemoveClick,
|
|
48
48
|
onEdit: handleEditClick,
|
|
49
49
|
onEntityFetchComplete: onEntityFetchComplete
|
|
50
|
-
}), entityType === 'Asset' &&
|
|
50
|
+
}), entityType === 'Asset' && React.createElement(FetchingWrappedAssetCard, {
|
|
51
51
|
sdk: sdk,
|
|
52
52
|
assetId: entityId,
|
|
53
53
|
locale: sdk.field.locale,
|
|
@@ -6,7 +6,7 @@ import { ScheduledIconWithTooltip, useEntity, useEntityLoader } from '@contentfu
|
|
|
6
6
|
import { entityHelpers } from '@contentful/field-editor-shared';
|
|
7
7
|
import { INLINES } from '@contentful/rich-text-types';
|
|
8
8
|
import { css } from 'emotion';
|
|
9
|
-
const { getEntryTitle, getEntryStatus
|
|
9
|
+
const { getEntryTitle , getEntryStatus } = entityHelpers;
|
|
10
10
|
const styles = {
|
|
11
11
|
scheduledIcon: css({
|
|
12
12
|
verticalAlign: 'text-bottom',
|
|
@@ -14,11 +14,11 @@ const styles = {
|
|
|
14
14
|
})
|
|
15
15
|
};
|
|
16
16
|
export function FetchingWrappedInlineEntryCard(props) {
|
|
17
|
-
const { data: entry, status: requestStatus
|
|
18
|
-
const { getEntityScheduledActions
|
|
17
|
+
const { data: entry , status: requestStatus } = useEntity('Entry', props.entryId);
|
|
18
|
+
const { getEntityScheduledActions } = useEntityLoader();
|
|
19
19
|
const loadEntityScheduledActions = ()=>getEntityScheduledActions('Entry', props.entryId);
|
|
20
20
|
const allContentTypes = props.sdk.space.getCachedContentTypes();
|
|
21
|
-
const { onEntityFetchComplete
|
|
21
|
+
const { onEntityFetchComplete } = props;
|
|
22
22
|
const contentType = React.useMemo(()=>{
|
|
23
23
|
if (!entry || !allContentTypes) return undefined;
|
|
24
24
|
return allContentTypes.find((contentType)=>contentType.sys.id === entry.sys.contentType.sys.id);
|
|
@@ -49,25 +49,25 @@ export function FetchingWrappedInlineEntryCard(props) {
|
|
|
49
49
|
props.sdk.locales.default
|
|
50
50
|
]);
|
|
51
51
|
if (requestStatus === 'error') {
|
|
52
|
-
return
|
|
52
|
+
return React.createElement(InlineEntryCard, {
|
|
53
53
|
title: "Entry missing or inaccessible",
|
|
54
54
|
testId: INLINES.EMBEDDED_ENTRY,
|
|
55
55
|
isSelected: props.isSelected
|
|
56
56
|
});
|
|
57
57
|
}
|
|
58
58
|
if (requestStatus === 'loading') {
|
|
59
|
-
return
|
|
59
|
+
return React.createElement(InlineEntryCard, {
|
|
60
60
|
isLoading: true
|
|
61
61
|
});
|
|
62
62
|
}
|
|
63
63
|
const entryStatus = getEntryStatus(entry.sys);
|
|
64
64
|
if (entryStatus === 'deleted') {
|
|
65
|
-
return
|
|
65
|
+
return React.createElement(InlineEntryCard, {
|
|
66
66
|
title: "Entry missing or inaccessible",
|
|
67
67
|
testId: INLINES.EMBEDDED_ENTRY,
|
|
68
68
|
isSelected: props.isSelected,
|
|
69
69
|
actions: [
|
|
70
|
-
|
|
70
|
+
React.createElement(MenuItem, {
|
|
71
71
|
key: "remove",
|
|
72
72
|
onClick: props.onRemove,
|
|
73
73
|
testId: "delete"
|
|
@@ -75,30 +75,30 @@ export function FetchingWrappedInlineEntryCard(props) {
|
|
|
75
75
|
]
|
|
76
76
|
});
|
|
77
77
|
}
|
|
78
|
-
return
|
|
78
|
+
return React.createElement(InlineEntryCard, {
|
|
79
79
|
testId: INLINES.EMBEDDED_ENTRY,
|
|
80
80
|
isSelected: props.isSelected,
|
|
81
81
|
title: `${contentTypeName}: ${title}`,
|
|
82
82
|
status: entryStatus,
|
|
83
83
|
actions: [
|
|
84
|
-
|
|
84
|
+
React.createElement(MenuItem, {
|
|
85
85
|
key: "edit",
|
|
86
86
|
onClick: props.onEdit
|
|
87
87
|
}, "Edit"),
|
|
88
|
-
|
|
88
|
+
React.createElement(MenuItem, {
|
|
89
89
|
key: "remove",
|
|
90
90
|
onClick: props.onRemove,
|
|
91
91
|
disabled: props.isDisabled,
|
|
92
92
|
testId: "delete"
|
|
93
93
|
}, "Remove")
|
|
94
94
|
]
|
|
95
|
-
},
|
|
95
|
+
}, React.createElement(ScheduledIconWithTooltip, {
|
|
96
96
|
getEntityScheduledActions: loadEntityScheduledActions,
|
|
97
97
|
entityType: "Entry",
|
|
98
98
|
entityId: entry.sys.id
|
|
99
|
-
},
|
|
99
|
+
}, React.createElement(ClockIcon, {
|
|
100
100
|
className: styles.scheduledIcon,
|
|
101
101
|
variant: "muted",
|
|
102
102
|
testId: "scheduled-icon"
|
|
103
|
-
})),
|
|
103
|
+
})), React.createElement(Text, null, title));
|
|
104
104
|
}
|