@plone/volto 18.0.0-alpha.3 → 18.0.0-alpha.5
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/.eslintignore +1 -0
- package/.eslintrc +3 -3
- package/.prettierignore +8 -0
- package/.prettierrc +12 -0
- package/{packages/registry/.release-it.json → .release-it.json} +12 -6
- package/CHANGELOG.md +50 -4
- package/package.json +60 -127
- package/razzle.config.js +4 -7
- package/src/components/manage/Add/Add.jsx +6 -0
- package/src/components/manage/BlockChooser/BlockChooser.jsx +3 -1
- package/src/components/manage/BlockChooser/BlockChooserButton.jsx +5 -0
- package/src/components/manage/Blocks/Block/BlocksForm.jsx +4 -0
- package/src/components/manage/Blocks/Block/DefaultEdit.jsx +3 -1
- package/src/components/manage/Blocks/Block/EditBlockWrapper.jsx +5 -0
- package/src/components/manage/Blocks/Block/Settings.jsx +10 -1
- package/src/components/manage/Blocks/Container/Data.jsx +4 -1
- package/src/components/manage/Blocks/HeroImageLeft/Data.jsx +3 -1
- package/src/components/manage/Blocks/Image/ImageSidebar.jsx +4 -1
- package/src/components/manage/Blocks/Listing/ListingData.jsx +4 -1
- package/src/components/manage/Blocks/Maps/MapsSidebar.jsx +3 -1
- package/src/components/manage/Blocks/Search/SearchBlockEdit.jsx +4 -0
- package/src/components/manage/Blocks/Teaser/Data.jsx +4 -1
- package/src/components/manage/Blocks/ToC/Edit.jsx +2 -0
- package/src/components/manage/Blocks/Video/VideoSidebar.jsx +3 -1
- package/src/components/manage/Controlpanels/Users/UserGroupMembershipControlPanel.jsx +2 -2
- package/src/components/manage/Edit/Edit.jsx +1 -0
- package/src/components/manage/Form/Form.jsx +14 -3
- package/src/components/theme/Image/Image.jsx +4 -2
- package/src/components/theme/Image/Image.test.jsx +32 -0
- package/src/config/index.js +0 -4
- package/src/helpers/Blocks/Blocks.js +11 -2
- package/src/helpers/Extensions/withBlockSchemaEnhancer.js +20 -9
- package/src/helpers/Url/Url.js +5 -4
- package/src/helpers/Url/Url.test.js +52 -0
- package/src/icons/divide-horizontal.svg +0 -0
- package/src/icons/divide-vertical.svg +0 -0
- package/src/icons/hero.svg +0 -0
- package/src/icons/slider.svg +0 -0
- package/src/icons/summary.svg +0 -0
- package/src/middleware/api.js +1 -1
- package/theme/themes/default/elements/icon.overrides +0 -0
- package/theme/themes/default/globals/reset.overrides +0 -0
- package/theme/themes/default/globals/site.variables +0 -0
- package/theme/themes/default/modules/dropdown.overrides +0 -0
- package/theme/themes/default/modules/dropdown.variables +0 -0
- package/theme/themes/default/modules/modal.variables +0 -0
- package/theme/themes/default/modules/video.overrides +0 -0
- package/theme/themes/default/modules/video.variables +0 -0
- package/theme/themes/pastanaga/assets/fonts/icons.eot +0 -0
- package/theme/themes/pastanaga/assets/fonts/icons.svg +0 -0
- package/theme/themes/pastanaga/assets/fonts/icons.ttf +0 -0
- package/theme/themes/pastanaga/assets/fonts/icons.woff +0 -0
- package/theme/themes/pastanaga/globals/reset.overrides +0 -0
- package/theme/themes/pastanaga/globals/site.variables +0 -0
- package/theme/themes/pastanaga/modules/dropdown.variables +0 -0
- package/theme/themes/pastanaga/modules/modal.variables +0 -0
- package/theme/themes/pastanaga/modules/video.overrides +0 -0
- package/theme/themes/pastanaga/modules/video.variables +0 -0
- package/tsconfig.json +1 -4
- package/types/config/RichTextEditor/index.d.ts +5 -8
- package/types/helpers/AsyncConnect/index.d.ts +2 -2
- package/types/helpers/Extensions/withBlockSchemaEnhancer.d.ts +3 -1
- package/types/helpers/Url/Url.d.ts +3 -3
- package/types/icons/load-icons.d.ts +1 -1
- package/webpack-plugins/webpack-less-plugin.js +1 -0
- package/CODE_OF_CONDUCT.md +0 -13
- package/CONTRIBUTING.md +0 -7
- package/README.md +0 -154
- package/RELEASING.md +0 -73
- package/ROADMAP.md +0 -30
- package/SECURITY.md +0 -14
- package/apps/plone/node_modules/.bin/acorn +0 -17
- package/apps/plone/node_modules/.bin/addon +0 -17
- package/apps/plone/node_modules/.bin/autoprefixer +0 -17
- package/apps/plone/node_modules/.bin/browserslist +0 -17
- package/apps/plone/node_modules/.bin/build-storybook +0 -17
- package/apps/plone/node_modules/.bin/changelogupdater +0 -17
- package/apps/plone/node_modules/.bin/eslint +0 -17
- package/apps/plone/node_modules/.bin/eslint-config-prettier +0 -17
- package/apps/plone/node_modules/.bin/i18n +0 -17
- package/apps/plone/node_modules/.bin/jest +0 -17
- package/apps/plone/node_modules/.bin/lessc +0 -17
- package/apps/plone/node_modules/.bin/missdev +0 -17
- package/apps/plone/node_modules/.bin/prettier +0 -17
- package/apps/plone/node_modules/.bin/razzle +0 -17
- package/apps/plone/node_modules/.bin/server-test +0 -17
- package/apps/plone/node_modules/.bin/start-server-and-test +0 -17
- package/apps/plone/node_modules/.bin/start-storybook +0 -17
- package/apps/plone/node_modules/.bin/start-test +0 -17
- package/apps/plone/node_modules/.bin/storybook-server +0 -17
- package/apps/plone/node_modules/.bin/stylelint +0 -17
- package/apps/plone/node_modules/.bin/tlds +0 -17
- package/apps/plone/node_modules/.bin/ts-jest +0 -17
- package/apps/plone/node_modules/.bin/tsc +0 -17
- package/apps/plone/node_modules/.bin/tsserver +0 -17
- package/apps/plone/node_modules/.bin/uuid +0 -17
- package/apps/plone/node_modules/.bin/webpack +0 -17
- package/apps/plone/node_modules/.bin/webpack-dev-server +0 -17
- package/apps/plone/src/addons/volto-volto-project/node_modules/.bin/acorn +0 -17
- package/apps/plone/src/addons/volto-volto-project/node_modules/.bin/addon +0 -17
- package/apps/plone/src/addons/volto-volto-project/node_modules/.bin/browserslist +0 -17
- package/apps/plone/src/addons/volto-volto-project/node_modules/.bin/changelogupdater +0 -17
- package/apps/plone/src/addons/volto-volto-project/node_modules/.bin/eslint +0 -17
- package/apps/plone/src/addons/volto-volto-project/node_modules/.bin/eslint-config-prettier +0 -17
- package/apps/plone/src/addons/volto-volto-project/node_modules/.bin/i18n +0 -17
- package/apps/plone/src/addons/volto-volto-project/node_modules/.bin/prettier +0 -17
- package/apps/plone/src/addons/volto-volto-project/node_modules/.bin/release-it +0 -17
- package/apps/plone/src/addons/volto-volto-project/node_modules/.bin/stylelint +0 -17
- package/apps/plone/src/addons/volto-volto-project/node_modules/.bin/tsc +0 -17
- package/apps/plone/src/addons/volto-volto-project/node_modules/.bin/tsserver +0 -17
- package/logos/Logo.png +0 -0
- package/logos/VoltoLogoEra2-dark-mode.png +0 -0
- package/logos/VoltoLogoEra2.png +0 -0
- package/logos/volto-colorful.png +0 -0
- package/logos/volto-colorful.svg +0 -35
- package/logos/volto-guide.png +0 -0
- package/logos/volto-h-transparent.svg +0 -6
- package/logos/volto-transparent.png +0 -0
- package/logos/volto-transparent.svg +0 -19
- package/logos/volto-transparent2.svg +0 -5
- package/logos/volto-yellow.svg +0 -29
- package/logos/volto.sketch +0 -0
- package/packages/README.md +0 -7
- package/packages/registry/.towncrier/towncrier_template.jinja +0 -10
- package/packages/registry/CHANGELOG.md +0 -16
- package/packages/registry/README.md +0 -207
- package/packages/registry/addon-registry.js +0 -603
- package/packages/registry/create-addons-loader.js +0 -116
- package/packages/registry/create-theme-addons-loader.js +0 -78
- package/packages/registry/news/.gitkeep +0 -0
- package/packages/registry/node_modules/.bin/browserslist +0 -17
- package/packages/registry/node_modules/.bin/parcel +0 -17
- package/packages/registry/node_modules/.bin/release-it +0 -17
- package/packages/registry/node_modules/.bin/tsc +0 -17
- package/packages/registry/node_modules/.bin/tsserver +0 -17
- package/packages/registry/node_modules/.bin/vitest +0 -17
- package/packages/registry/package.json +0 -76
- package/packages/registry/src/index.ts +0 -174
- package/packages/registry/src/registry.test.js +0 -111
- package/packages/registry/tsconfig.json +0 -32
- package/packages/scripts/CHANGELOG.md +0 -173
- package/packages/scripts/README.md +0 -128
- package/packages/scripts/addon/consolidate.js +0 -28
- package/packages/scripts/addon/generators.js +0 -213
- package/packages/scripts/addon/getAddonInfo.js +0 -65
- package/packages/scripts/addon/index.js +0 -88
- package/packages/scripts/addon/utils.js +0 -44
- package/packages/scripts/backportpr.js +0 -75
- package/packages/scripts/changelogupdater.cjs +0 -94
- package/packages/scripts/corepackagebump.js +0 -20
- package/packages/scripts/i18n.cjs +0 -310
- package/packages/scripts/package.json +0 -76
- package/packages/scripts/templates/towncrier_template.jinja +0 -10
- package/packages/types/Blocks/View.ts +0 -11
- package/packages/types/actions.ts +0 -15
- package/packages/types/breadcrumbs.ts +0 -10
- package/packages/types/config/Blocks.ts +0 -153
- package/packages/types/config/Content.ts +0 -62
- package/packages/types/config/Settings.ts +0 -86
- package/packages/types/config/Views.ts +0 -15
- package/packages/types/config/Widgets.ts +0 -7
- package/packages/types/config/index.ts +0 -21
- package/packages/types/content/common.ts +0 -60
- package/packages/types/content/get.ts +0 -66
- package/packages/types/index.ts +0 -0
- package/packages/types/navigation.ts +0 -12
- package/packages/types/node_modules/.bin/browserslist +0 -17
- package/packages/types/node_modules/.bin/parcel +0 -17
- package/packages/types/node_modules/.bin/release-it +0 -17
- package/packages/types/node_modules/.bin/tsc +0 -17
- package/packages/types/node_modules/.bin/tsserver +0 -17
- package/packages/types/package.json +0 -64
- package/packages/types/types.ts +0 -61
- package/packages/volto-slate/.i18n.babel.config.js +0 -1
- package/packages/volto-slate/README.md +0 -4
- package/packages/volto-slate/build/messages/src/blocks/Table/TableBlockEdit.json +0 -90
- package/packages/volto-slate/build/messages/src/blocks/Text/DefaultTextBlockEditor.json +0 -6
- package/packages/volto-slate/build/messages/src/blocks/Text/DetachedTextBlockEditor.json +0 -6
- package/packages/volto-slate/build/messages/src/blocks/Text/SlashMenu.json +0 -6
- package/packages/volto-slate/build/messages/src/editor/plugins/AdvancedLink/index.json +0 -10
- package/packages/volto-slate/build/messages/src/editor/plugins/Link/index.json +0 -10
- package/packages/volto-slate/build/messages/src/editor/plugins/Table/index.json +0 -30
- package/packages/volto-slate/build/messages/src/elementEditor/messages.json +0 -10
- package/packages/volto-slate/build/messages/src/widgets/HtmlSlateWidget.json +0 -6
- package/packages/volto-slate/build/messages/src/widgets/RichTextWidgetView.json +0 -6
- package/packages/volto-slate/locales/de/LC_MESSAGES/volto.po +0 -148
- package/packages/volto-slate/locales/en/LC_MESSAGES/volto.po +0 -148
- package/packages/volto-slate/locales/volto.pot +0 -182
- package/packages/volto-slate/package.json +0 -43
- package/packages/volto-slate/src/actions/content.js +0 -30
- package/packages/volto-slate/src/actions/index.js +0 -3
- package/packages/volto-slate/src/actions/plugins.js +0 -9
- package/packages/volto-slate/src/actions/selection.js +0 -22
- package/packages/volto-slate/src/blocks/Table/Cell.jsx +0 -87
- package/packages/volto-slate/src/blocks/Table/Cell.test.js +0 -54
- package/packages/volto-slate/src/blocks/Table/TableBlockEdit.jsx +0 -694
- package/packages/volto-slate/src/blocks/Table/TableBlockEdit.test.js +0 -40
- package/packages/volto-slate/src/blocks/Table/TableBlockView.jsx +0 -150
- package/packages/volto-slate/src/blocks/Table/TableBlockView.test.js +0 -49
- package/packages/volto-slate/src/blocks/Table/deconstruct.js +0 -113
- package/packages/volto-slate/src/blocks/Table/extensions/normalizeTable.js +0 -5
- package/packages/volto-slate/src/blocks/Table/index.js +0 -60
- package/packages/volto-slate/src/blocks/Table/schema.js +0 -122
- package/packages/volto-slate/src/blocks/Text/DefaultTextBlockEditor.jsx +0 -304
- package/packages/volto-slate/src/blocks/Text/DetachedTextBlockEditor.jsx +0 -77
- package/packages/volto-slate/src/blocks/Text/MarkdownIntroduction.jsx +0 -59
- package/packages/volto-slate/src/blocks/Text/PluginSidebar.jsx +0 -18
- package/packages/volto-slate/src/blocks/Text/ShortcutListing.jsx +0 -28
- package/packages/volto-slate/src/blocks/Text/SlashMenu.jsx +0 -203
- package/packages/volto-slate/src/blocks/Text/TextBlockEdit.jsx +0 -38
- package/packages/volto-slate/src/blocks/Text/TextBlockEdit.test.js +0 -107
- package/packages/volto-slate/src/blocks/Text/TextBlockSchema.js +0 -54
- package/packages/volto-slate/src/blocks/Text/TextBlockView.jsx +0 -31
- package/packages/volto-slate/src/blocks/Text/css/editor.css +0 -18
- package/packages/volto-slate/src/blocks/Text/extensions/Readme.md +0 -49
- package/packages/volto-slate/src/blocks/Text/extensions/breakList.js +0 -100
- package/packages/volto-slate/src/blocks/Text/extensions/index.js +0 -6
- package/packages/volto-slate/src/blocks/Text/extensions/insertBreak.js +0 -57
- package/packages/volto-slate/src/blocks/Text/extensions/isSelected.js +0 -7
- package/packages/volto-slate/src/blocks/Text/extensions/normalizeExternalData.js +0 -7
- package/packages/volto-slate/src/blocks/Text/extensions/withDeserializers.js +0 -87
- package/packages/volto-slate/src/blocks/Text/extensions/withLists.js +0 -5
- package/packages/volto-slate/src/blocks/Text/index.js +0 -171
- package/packages/volto-slate/src/blocks/Text/keyboard/backspaceInList.js +0 -58
- package/packages/volto-slate/src/blocks/Text/keyboard/breakBlocks.js +0 -3
- package/packages/volto-slate/src/blocks/Text/keyboard/cancelEsc.js +0 -7
- package/packages/volto-slate/src/blocks/Text/keyboard/indentListItems.js +0 -240
- package/packages/volto-slate/src/blocks/Text/keyboard/index.js +0 -52
- package/packages/volto-slate/src/blocks/Text/keyboard/joinBlocks.js +0 -180
- package/packages/volto-slate/src/blocks/Text/keyboard/moveListItems.js +0 -124
- package/packages/volto-slate/src/blocks/Text/keyboard/slashMenu.js +0 -19
- package/packages/volto-slate/src/blocks/Text/keyboard/softBreak.js +0 -7
- package/packages/volto-slate/src/blocks/Text/keyboard/traverseBlocks.js +0 -81
- package/packages/volto-slate/src/blocks/Text/keyboard/unwrapEmptyString.js +0 -26
- package/packages/volto-slate/src/blocks/Text/schema.js +0 -39
- package/packages/volto-slate/src/constants.js +0 -123
- package/packages/volto-slate/src/editor/EditorContext.jsx +0 -5
- package/packages/volto-slate/src/editor/EditorReference.jsx +0 -22
- package/packages/volto-slate/src/editor/SlateEditor.jsx +0 -375
- package/packages/volto-slate/src/editor/config.jsx +0 -344
- package/packages/volto-slate/src/editor/decorate.js +0 -68
- package/packages/volto-slate/src/editor/deserialize.js +0 -185
- package/packages/volto-slate/src/editor/extensions/index.js +0 -6
- package/packages/volto-slate/src/editor/extensions/insertBreak.js +0 -15
- package/packages/volto-slate/src/editor/extensions/insertData.js +0 -159
- package/packages/volto-slate/src/editor/extensions/isInline.js +0 -14
- package/packages/volto-slate/src/editor/extensions/normalizeExternalData.js +0 -8
- package/packages/volto-slate/src/editor/extensions/normalizeNode.js +0 -48
- package/packages/volto-slate/src/editor/extensions/withDeserializers.js +0 -15
- package/packages/volto-slate/src/editor/extensions/withTestingFeatures.jsx +0 -84
- package/packages/volto-slate/src/editor/index.js +0 -14
- package/packages/volto-slate/src/editor/less/editor.less +0 -173
- package/packages/volto-slate/src/editor/less/globals.less +0 -18
- package/packages/volto-slate/src/editor/less/slate.less +0 -28
- package/packages/volto-slate/src/editor/plugins/AdvancedLink/deserialize.js +0 -90
- package/packages/volto-slate/src/editor/plugins/AdvancedLink/extensions.js +0 -32
- package/packages/volto-slate/src/editor/plugins/AdvancedLink/index.js +0 -50
- package/packages/volto-slate/src/editor/plugins/AdvancedLink/render.jsx +0 -37
- package/packages/volto-slate/src/editor/plugins/AdvancedLink/schema.js +0 -114
- package/packages/volto-slate/src/editor/plugins/AdvancedLink/styles.less +0 -8
- package/packages/volto-slate/src/editor/plugins/Blockquote/index.js +0 -30
- package/packages/volto-slate/src/editor/plugins/Callout/index.js +0 -34
- package/packages/volto-slate/src/editor/plugins/Image/deconstruct.js +0 -30
- package/packages/volto-slate/src/editor/plugins/Image/extensions.js +0 -51
- package/packages/volto-slate/src/editor/plugins/Image/index.js +0 -11
- package/packages/volto-slate/src/editor/plugins/Image/render.jsx +0 -22
- package/packages/volto-slate/src/editor/plugins/Link/extensions.js +0 -58
- package/packages/volto-slate/src/editor/plugins/Link/index.js +0 -164
- package/packages/volto-slate/src/editor/plugins/Link/render.jsx +0 -54
- package/packages/volto-slate/src/editor/plugins/Markdown/constants.js +0 -81
- package/packages/volto-slate/src/editor/plugins/Markdown/extensions.js +0 -334
- package/packages/volto-slate/src/editor/plugins/Markdown/index.js +0 -28
- package/packages/volto-slate/src/editor/plugins/Markdown/utils.js +0 -198
- package/packages/volto-slate/src/editor/plugins/StyleMenu/StyleMenu.jsx +0 -153
- package/packages/volto-slate/src/editor/plugins/StyleMenu/index.js +0 -19
- package/packages/volto-slate/src/editor/plugins/StyleMenu/style.less +0 -29
- package/packages/volto-slate/src/editor/plugins/StyleMenu/utils.js +0 -168
- package/packages/volto-slate/src/editor/plugins/Table/TableButton.jsx +0 -142
- package/packages/volto-slate/src/editor/plugins/Table/TableCell.jsx +0 -44
- package/packages/volto-slate/src/editor/plugins/Table/TableContainer.jsx +0 -37
- package/packages/volto-slate/src/editor/plugins/Table/TableSizePicker.jsx +0 -83
- package/packages/volto-slate/src/editor/plugins/Table/extensions.js +0 -87
- package/packages/volto-slate/src/editor/plugins/Table/index.js +0 -390
- package/packages/volto-slate/src/editor/plugins/Table/less/public.less +0 -29
- package/packages/volto-slate/src/editor/plugins/Table/less/table.less +0 -28
- package/packages/volto-slate/src/editor/plugins/Table/render.jsx +0 -30
- package/packages/volto-slate/src/editor/plugins/index.js +0 -19
- package/packages/volto-slate/src/editor/render.jsx +0 -224
- package/packages/volto-slate/src/editor/ui/BasicToolbar.jsx +0 -11
- package/packages/volto-slate/src/editor/ui/BlockButton.jsx +0 -31
- package/packages/volto-slate/src/editor/ui/ClearFormattingButton.jsx +0 -21
- package/packages/volto-slate/src/editor/ui/ExpandedToolbar.jsx +0 -18
- package/packages/volto-slate/src/editor/ui/Expando.jsx +0 -5
- package/packages/volto-slate/src/editor/ui/InlineToolbar.jsx +0 -73
- package/packages/volto-slate/src/editor/ui/MarkButton.jsx +0 -23
- package/packages/volto-slate/src/editor/ui/MarkElementButton.jsx +0 -30
- package/packages/volto-slate/src/editor/ui/Menu.jsx +0 -13
- package/packages/volto-slate/src/editor/ui/PositionedToolbar.jsx +0 -32
- package/packages/volto-slate/src/editor/ui/Separator.jsx +0 -7
- package/packages/volto-slate/src/editor/ui/SlateContextToolbar.jsx +0 -13
- package/packages/volto-slate/src/editor/ui/SlateToolbar.jsx +0 -96
- package/packages/volto-slate/src/editor/ui/Toolbar.jsx +0 -103
- package/packages/volto-slate/src/editor/ui/ToolbarButton.jsx +0 -33
- package/packages/volto-slate/src/editor/ui/ToolbarButton.test.js +0 -25
- package/packages/volto-slate/src/editor/ui/index.js +0 -15
- package/packages/volto-slate/src/editor/utils.js +0 -248
- package/packages/volto-slate/src/elementEditor/ContextButtons.jsx +0 -56
- package/packages/volto-slate/src/elementEditor/PluginEditor.jsx +0 -124
- package/packages/volto-slate/src/elementEditor/Readme.md +0 -6
- package/packages/volto-slate/src/elementEditor/SchemaProvider.jsx +0 -3
- package/packages/volto-slate/src/elementEditor/SidebarEditor.jsx +0 -46
- package/packages/volto-slate/src/elementEditor/ToolbarButton.jsx +0 -44
- package/packages/volto-slate/src/elementEditor/index.js +0 -5
- package/packages/volto-slate/src/elementEditor/makeInlineElementPlugin.js +0 -100
- package/packages/volto-slate/src/elementEditor/messages.js +0 -14
- package/packages/volto-slate/src/elementEditor/utils.js +0 -226
- package/packages/volto-slate/src/hooks/index.js +0 -3
- package/packages/volto-slate/src/hooks/useEditorContext.js +0 -6
- package/packages/volto-slate/src/hooks/useIsomorphicLayoutEffect.js +0 -7
- package/packages/volto-slate/src/hooks/useSelectionPosition.js +0 -25
- package/packages/volto-slate/src/i18n.js +0 -180
- package/packages/volto-slate/src/icons/hashlink.svg +0 -57
- package/packages/volto-slate/src/index.js +0 -61
- package/packages/volto-slate/src/reducers/content.js +0 -74
- package/packages/volto-slate/src/reducers/index.js +0 -3
- package/packages/volto-slate/src/reducers/plugins.js +0 -17
- package/packages/volto-slate/src/reducers/selection.js +0 -16
- package/packages/volto-slate/src/utils/blocks.js +0 -375
- package/packages/volto-slate/src/utils/blocks.test.js +0 -138
- package/packages/volto-slate/src/utils/editor.js +0 -31
- package/packages/volto-slate/src/utils/image.js +0 -25
- package/packages/volto-slate/src/utils/index.js +0 -11
- package/packages/volto-slate/src/utils/internals.js +0 -46
- package/packages/volto-slate/src/utils/lists.js +0 -92
- package/packages/volto-slate/src/utils/marks.js +0 -104
- package/packages/volto-slate/src/utils/mime-types.js +0 -24
- package/packages/volto-slate/src/utils/nodes.js +0 -4
- package/packages/volto-slate/src/utils/ops.js +0 -20
- package/packages/volto-slate/src/utils/random.js +0 -17
- package/packages/volto-slate/src/utils/selection.js +0 -236
- package/packages/volto-slate/src/utils/slate-string-utils.js +0 -408
- package/packages/volto-slate/src/utils/volto-blocks.js +0 -314
- package/packages/volto-slate/src/widgets/ErrorBoundary.jsx +0 -27
- package/packages/volto-slate/src/widgets/HtmlSlateWidget.jsx +0 -139
- package/packages/volto-slate/src/widgets/ObjectByTypeWidget.jsx +0 -49
- package/packages/volto-slate/src/widgets/RichTextWidget.jsx +0 -72
- package/packages/volto-slate/src/widgets/RichTextWidgetView.jsx +0 -37
- package/packages/volto-slate/src/widgets/style.css +0 -21
- package/types/components/manage/Blocks/Video/Body.test.d.ts +0 -1
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
import cx from 'classnames';
|
|
2
|
-
import React, { useRef, useEffect } from 'react';
|
|
3
|
-
import { Portal } from 'react-portal';
|
|
4
|
-
import { useSlate } from 'slate-react';
|
|
5
|
-
import Separator from './Separator';
|
|
6
|
-
import BasicToolbar from './BasicToolbar';
|
|
7
|
-
import { Editor, Node } from 'slate';
|
|
8
|
-
import { ReactEditor } from 'slate-react';
|
|
9
|
-
|
|
10
|
-
const Toolbar = ({
|
|
11
|
-
elementType,
|
|
12
|
-
enableExpando = false,
|
|
13
|
-
toggleButton,
|
|
14
|
-
className,
|
|
15
|
-
children,
|
|
16
|
-
show = true,
|
|
17
|
-
}) => {
|
|
18
|
-
const ref = useRef();
|
|
19
|
-
const editor = useSlate();
|
|
20
|
-
|
|
21
|
-
useEffect(() => {
|
|
22
|
-
const domNode = ref.current;
|
|
23
|
-
let rect = { width: 1, top: 0, left: 0 };
|
|
24
|
-
|
|
25
|
-
if ((children || []).length === 0) {
|
|
26
|
-
domNode.removeAttribute('style');
|
|
27
|
-
return;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
if (!show) {
|
|
31
|
-
domNode.removeAttribute('style');
|
|
32
|
-
return;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
const { selection } = editor;
|
|
36
|
-
// const savedSelection = editor.getSavedSelection();
|
|
37
|
-
if (!selection) {
|
|
38
|
-
domNode.removeAttribute('style');
|
|
39
|
-
return;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
if (editor.isSidebarOpen) {
|
|
43
|
-
domNode.removeAttribute('style');
|
|
44
|
-
return;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
if (elementType) {
|
|
48
|
-
const [element] = Editor.nodes(editor, {
|
|
49
|
-
at: editor.selection || editor.getSavedSelection(),
|
|
50
|
-
match: (n) => n.type === elementType,
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
if (!element) {
|
|
54
|
-
domNode.removeAttribute('style');
|
|
55
|
-
return;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
const [node] = element;
|
|
59
|
-
const domEl = ReactEditor.toDOMNode(editor, node);
|
|
60
|
-
|
|
61
|
-
rect = domEl.getBoundingClientRect();
|
|
62
|
-
} else {
|
|
63
|
-
// TODO: should we fallback to editor.getSelection()?
|
|
64
|
-
// TODO: test with third party plugins
|
|
65
|
-
const slateNode = Node.get(editor, selection.anchor.path);
|
|
66
|
-
try {
|
|
67
|
-
const domEl = ReactEditor.toDOMNode(editor, slateNode);
|
|
68
|
-
rect = domEl.getBoundingClientRect();
|
|
69
|
-
} catch {
|
|
70
|
-
// ignoring error here is safe, editor is out of sync and the selection
|
|
71
|
-
// is actually none, so no toolbar should be shown
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
domNode.style.opacity = 1;
|
|
76
|
-
domNode.style.top = `${
|
|
77
|
-
rect.top + window.pageYOffset - domNode.offsetHeight - 6
|
|
78
|
-
}px`;
|
|
79
|
-
domNode.style.left = `${Math.max(
|
|
80
|
-
rect.left + window.pageXOffset - domNode.offsetWidth / 2 + rect.width / 2,
|
|
81
|
-
0, // if the left edge of the toolbar should be otherwise offscreen
|
|
82
|
-
)}px`;
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
return (
|
|
86
|
-
<Portal>
|
|
87
|
-
<BasicToolbar
|
|
88
|
-
className={cx('slate-inline-toolbar', { [className]: className })}
|
|
89
|
-
ref={ref}
|
|
90
|
-
>
|
|
91
|
-
{children}
|
|
92
|
-
{enableExpando && toggleButton && (
|
|
93
|
-
<>
|
|
94
|
-
<Separator />
|
|
95
|
-
{toggleButton}
|
|
96
|
-
</>
|
|
97
|
-
)}
|
|
98
|
-
</BasicToolbar>
|
|
99
|
-
</Portal>
|
|
100
|
-
);
|
|
101
|
-
};
|
|
102
|
-
|
|
103
|
-
export default Toolbar;
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import cx from 'classnames';
|
|
2
|
-
import React from 'react';
|
|
3
|
-
import { Icon } from '@plone/volto/components';
|
|
4
|
-
import { Button } from 'semantic-ui-react';
|
|
5
|
-
import { useIntl } from 'react-intl';
|
|
6
|
-
|
|
7
|
-
const ToolbarButton = React.forwardRef(
|
|
8
|
-
({ className, active, reversed, icon, style, title = '', ...props }, ref) => {
|
|
9
|
-
const intl = useIntl();
|
|
10
|
-
const i18ntitle =
|
|
11
|
-
typeof title !== 'string' ? intl.formatMessage(title) : title;
|
|
12
|
-
return (
|
|
13
|
-
<div className="button-wrapper">
|
|
14
|
-
<Button
|
|
15
|
-
as="a"
|
|
16
|
-
{...props}
|
|
17
|
-
title={i18ntitle}
|
|
18
|
-
ref={ref}
|
|
19
|
-
style={style}
|
|
20
|
-
className={cx(className)}
|
|
21
|
-
active={active}
|
|
22
|
-
inverted={reversed}
|
|
23
|
-
compact
|
|
24
|
-
toggle
|
|
25
|
-
size="tiny"
|
|
26
|
-
icon={icon && <Icon name={icon} size="24px" />}
|
|
27
|
-
></Button>
|
|
28
|
-
</div>
|
|
29
|
-
);
|
|
30
|
-
},
|
|
31
|
-
);
|
|
32
|
-
|
|
33
|
-
export default ToolbarButton;
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import configureStore from 'redux-mock-store';
|
|
3
|
-
import { Provider } from 'react-intl-redux';
|
|
4
|
-
import { waitFor, render } from '@testing-library/react';
|
|
5
|
-
|
|
6
|
-
import ToolbarButton from './ToolbarButton';
|
|
7
|
-
|
|
8
|
-
const mockStore = configureStore();
|
|
9
|
-
|
|
10
|
-
describe('ToolbarButton', () => {
|
|
11
|
-
it('renders a toolbar button', async () => {
|
|
12
|
-
const store = mockStore({
|
|
13
|
-
intl: {
|
|
14
|
-
locale: 'en',
|
|
15
|
-
messages: {},
|
|
16
|
-
},
|
|
17
|
-
});
|
|
18
|
-
const { asFragment } = render(
|
|
19
|
-
<Provider store={store}>
|
|
20
|
-
<ToolbarButton />
|
|
21
|
-
</Provider>,
|
|
22
|
-
);
|
|
23
|
-
await waitFor(() => expect(asFragment()).toMatchSnapshot());
|
|
24
|
-
});
|
|
25
|
-
});
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
export { default as BasicToolbar } from './BasicToolbar';
|
|
2
|
-
export { default as BlockButton } from './BlockButton';
|
|
3
|
-
export { default as ClearFormattingButton } from './ClearFormattingButton';
|
|
4
|
-
export { default as ExpandedToolbar } from './ExpandedToolbar';
|
|
5
|
-
export { default as Expando } from './Expando';
|
|
6
|
-
export { default as MarkButton } from './MarkButton';
|
|
7
|
-
export { default as Menu } from './Menu';
|
|
8
|
-
export { default as Separator } from './Separator';
|
|
9
|
-
export { default as SlateContextToolbar } from './SlateContextToolbar';
|
|
10
|
-
export { default as SlateToolbar } from './SlateToolbar';
|
|
11
|
-
export { default as Toolbar } from './Toolbar';
|
|
12
|
-
export { default as ToolbarButton } from './ToolbarButton';
|
|
13
|
-
export { default as MarkElementButton } from './MarkElementButton';
|
|
14
|
-
export { default as PositionedToolbar } from './PositionedToolbar';
|
|
15
|
-
export { default as InlineToolbar } from './InlineToolbar';
|
|
@@ -1,248 +0,0 @@
|
|
|
1
|
-
import { INLINE_ELEMENTS, TEXT_NODE } from '../constants';
|
|
2
|
-
|
|
3
|
-
// Original at https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model/Whitespace
|
|
4
|
-
/**
|
|
5
|
-
* Throughout, whitespace is defined as one of the characters
|
|
6
|
-
* "\t" TAB \u0009
|
|
7
|
-
* "\n" LF \u000A
|
|
8
|
-
* "\r" CR \u000D
|
|
9
|
-
* " " SPC \u0020
|
|
10
|
-
*
|
|
11
|
-
* This does not use JavaScript's "\s" because that includes non-breaking
|
|
12
|
-
* spaces (and also some other characters).
|
|
13
|
-
*/
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Determine whether a node's text content is entirely whitespace.
|
|
17
|
-
*
|
|
18
|
-
* @param nod A node implementing the |CharacterData| interface (i.e.,
|
|
19
|
-
* a |Text|, |Comment|, or |CDATASection| node
|
|
20
|
-
* @return True if all of the text content of |nod| is whitespace,
|
|
21
|
-
* otherwise false.
|
|
22
|
-
*/
|
|
23
|
-
export function is_all_ws(text) {
|
|
24
|
-
return !/[^\t\n\r ]/.test(text);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Version of |data| that doesn't include whitespace at the beginning
|
|
29
|
-
* and end and normalizes all whitespace to a single space. (Normally
|
|
30
|
-
* |data| is a property of text nodes that gives the text of the node.)
|
|
31
|
-
*
|
|
32
|
-
* @param txt The text node whose data should be returned
|
|
33
|
-
* @return A string giving the contents of the text node with
|
|
34
|
-
* whitespace collapsed.
|
|
35
|
-
*/
|
|
36
|
-
export function data_of(txt) {
|
|
37
|
-
let data = txt.textContent;
|
|
38
|
-
data = data.replace(/[\t\n\r ]+/g, ' ');
|
|
39
|
-
if (data[0] === ' ') {
|
|
40
|
-
data = data.substring(1, data.length);
|
|
41
|
-
}
|
|
42
|
-
if (data[data.length - 1] === ' ') {
|
|
43
|
-
data = data.substring(0, data.length - 1);
|
|
44
|
-
}
|
|
45
|
-
return data;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* Determine if a node should be ignored by the iterator functions.
|
|
50
|
-
*
|
|
51
|
-
* @param nod An object implementing the DOM1 |Node| interface.
|
|
52
|
-
* @return true if the node is:
|
|
53
|
-
* 1) A |Text| node that is all whitespace
|
|
54
|
-
* 2) A |Comment| node
|
|
55
|
-
* and otherwise false.
|
|
56
|
-
*/
|
|
57
|
-
|
|
58
|
-
export function is_ignorable(nod) {
|
|
59
|
-
return (
|
|
60
|
-
nod.nodeType === 8 || // A comment node
|
|
61
|
-
(nod.nodeType === 3 && is_all_ws(nod.textContent))
|
|
62
|
-
); // a text node, all ws
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* Version of |previousSibling| that skips nodes that are entirely
|
|
67
|
-
* whitespace or comments. (Normally |previousSibling| is a property
|
|
68
|
-
* of all DOM nodes that gives the sibling node, the node that is
|
|
69
|
-
* a child of the same parent, that occurs immediately before the
|
|
70
|
-
* reference node.)
|
|
71
|
-
*
|
|
72
|
-
* @param sib The reference node.
|
|
73
|
-
* @return Either:
|
|
74
|
-
* 1) The closest previous sibling to |sib| that is not
|
|
75
|
-
* ignorable according to |is_ignorable|, or
|
|
76
|
-
* 2) null if no such node exists.
|
|
77
|
-
*/
|
|
78
|
-
export function node_before(sib) {
|
|
79
|
-
while ((sib = sib.previousSibling)) {
|
|
80
|
-
if (!is_ignorable(sib)) {
|
|
81
|
-
return sib;
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
return null;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
* Version of |nextSibling| that skips nodes that are entirely
|
|
89
|
-
* whitespace or comments.
|
|
90
|
-
*
|
|
91
|
-
* @param sib The reference node.
|
|
92
|
-
* @return Either:
|
|
93
|
-
* 1) The closest next sibling to |sib| that is not
|
|
94
|
-
* ignorable according to |is_ignorable|, or
|
|
95
|
-
* 2) null if no such node exists.
|
|
96
|
-
*/
|
|
97
|
-
export function node_after(sib) {
|
|
98
|
-
while ((sib = sib.nextSibling)) {
|
|
99
|
-
if (!is_ignorable(sib)) {
|
|
100
|
-
return sib;
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
return null;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
/**
|
|
107
|
-
* Version of |lastChild| that skips nodes that are entirely
|
|
108
|
-
* whitespace or comments. (Normally |lastChild| is a property
|
|
109
|
-
* of all DOM nodes that gives the last of the nodes contained
|
|
110
|
-
* directly in the reference node.)
|
|
111
|
-
*
|
|
112
|
-
* @param sib The reference node.
|
|
113
|
-
* @return Either:
|
|
114
|
-
* 1) The last child of |sib| that is not
|
|
115
|
-
* ignorable according to |is_ignorable|, or
|
|
116
|
-
* 2) null if no such node exists.
|
|
117
|
-
*/
|
|
118
|
-
export function last_child(par) {
|
|
119
|
-
let res = par.lastChild;
|
|
120
|
-
while (res) {
|
|
121
|
-
if (!is_ignorable(res)) {
|
|
122
|
-
return res;
|
|
123
|
-
}
|
|
124
|
-
res = res.previousSibling;
|
|
125
|
-
}
|
|
126
|
-
return null;
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
/**
|
|
130
|
-
* Version of |firstChild| that skips nodes that are entirely
|
|
131
|
-
* whitespace and comments.
|
|
132
|
-
*
|
|
133
|
-
* @param sib The reference node.
|
|
134
|
-
* @return Either:
|
|
135
|
-
* 1) The first child of |sib| that is not
|
|
136
|
-
* ignorable according to |is_ignorable|, or
|
|
137
|
-
* 2) null if no such node exists.
|
|
138
|
-
*/
|
|
139
|
-
export function first_child(par) {
|
|
140
|
-
let res = par.firstChild;
|
|
141
|
-
while (res) {
|
|
142
|
-
if (!is_ignorable(res)) {
|
|
143
|
-
return res;
|
|
144
|
-
}
|
|
145
|
-
res = res.nextSibling;
|
|
146
|
-
}
|
|
147
|
-
return null;
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
export const removeSpaceBeforeAfterEndLine = (text) => {
|
|
151
|
-
text = text.replace(/\s+\n/gm, '\n'); // space before endline
|
|
152
|
-
text = text.replace(/\n\s+/gm, '\n'); // space after endline
|
|
153
|
-
return text;
|
|
154
|
-
};
|
|
155
|
-
|
|
156
|
-
export const convertTabsToSpaces = (text) => text.replace(/\t/gm, ' ');
|
|
157
|
-
export const convertLineBreaksToSpaces = (text) => text.replace(/\n/gm, ' ');
|
|
158
|
-
|
|
159
|
-
export const isInline = (node) =>
|
|
160
|
-
node &&
|
|
161
|
-
(node.nodeType === TEXT_NODE || INLINE_ELEMENTS.includes(node.nodeName));
|
|
162
|
-
|
|
163
|
-
export const removeSpaceFollowSpace = (text, node) => {
|
|
164
|
-
// Any space immediately following another space (even across two separate
|
|
165
|
-
// inline elements) is ignored (rule 4)
|
|
166
|
-
text = text.replace(/ ( +)/gm, ' ');
|
|
167
|
-
if (!text.startsWith(' ')) return text;
|
|
168
|
-
|
|
169
|
-
if (node.previousSibling) {
|
|
170
|
-
if (node.previousSibling.nodeType === TEXT_NODE) {
|
|
171
|
-
if (node.previousSibling.textContent.endsWith(' ')) {
|
|
172
|
-
return text.replace(/^ /, '');
|
|
173
|
-
}
|
|
174
|
-
} else if (isInline(node.previousSibling)) {
|
|
175
|
-
const prevText = collapseInlineSpace(node.previousSibling);
|
|
176
|
-
if (prevText.endsWith(' ')) {
|
|
177
|
-
return text.replace(/^ /, '');
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
} else {
|
|
181
|
-
const parent = node.parentNode;
|
|
182
|
-
if (parent.previousSibling) {
|
|
183
|
-
// && isInline(parent.previousSibling)
|
|
184
|
-
const prevText = collapseInlineSpace(parent.previousSibling);
|
|
185
|
-
if (prevText && prevText.endsWith(' ')) {
|
|
186
|
-
return text.replace(/^ /, '');
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
return text;
|
|
192
|
-
};
|
|
193
|
-
|
|
194
|
-
export const removeElementEdges = (text, node) => {
|
|
195
|
-
if (
|
|
196
|
-
!isInline(node.parentNode) &&
|
|
197
|
-
!node.previousSibling &&
|
|
198
|
-
text.match(/^\s/)
|
|
199
|
-
) {
|
|
200
|
-
text = text.replace(/^\s+/, '');
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
if (text.match(/\s$/) && !node.nextSibling && !isInline(node.parentNode)) {
|
|
204
|
-
text = text.replace(/\s$/, '');
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
return text;
|
|
208
|
-
};
|
|
209
|
-
|
|
210
|
-
export const collapseInlineSpace = (node) => {
|
|
211
|
-
let text = node.textContent;
|
|
212
|
-
|
|
213
|
-
// See https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model/Whitespace
|
|
214
|
-
|
|
215
|
-
// 1. all spaces and tabs immediately before and after a line break are ignored
|
|
216
|
-
|
|
217
|
-
text = removeSpaceBeforeAfterEndLine(text);
|
|
218
|
-
|
|
219
|
-
// 2. Next, all tab characters are handled as space characters
|
|
220
|
-
text = convertTabsToSpaces(text);
|
|
221
|
-
|
|
222
|
-
// 3. Convert all line breaks to spaces
|
|
223
|
-
text = convertLineBreaksToSpaces(text);
|
|
224
|
-
|
|
225
|
-
// 4. Any space immediately following another space
|
|
226
|
-
// (even across two separate inline elements) is ignored
|
|
227
|
-
text = removeSpaceFollowSpace(text, node);
|
|
228
|
-
|
|
229
|
-
// 5. Sequences of spaces at the beginning and end of an element are removed
|
|
230
|
-
text = removeElementEdges(text, node);
|
|
231
|
-
|
|
232
|
-
// (volto) Return null if the element is not adjacent to an inline node
|
|
233
|
-
// This will cause the element to be ignored in the deserialization
|
|
234
|
-
// TODO: use the node traverse functions defined here
|
|
235
|
-
if (
|
|
236
|
-
is_all_ws(text) &&
|
|
237
|
-
!(
|
|
238
|
-
isInline(node.previousSibling) ||
|
|
239
|
-
isInline(node.nextSibling) ||
|
|
240
|
-
isInline(node.parentNode.nextSibling) ||
|
|
241
|
-
isInline(node.parentNode.previousSibling)
|
|
242
|
-
)
|
|
243
|
-
) {
|
|
244
|
-
return null;
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
return text;
|
|
248
|
-
};
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { useDispatch, useSelector } from 'react-redux';
|
|
3
|
-
import { useIntl } from 'react-intl'; // , defineMessages
|
|
4
|
-
|
|
5
|
-
import clearSVG from '@plone/volto/icons/delete.svg';
|
|
6
|
-
|
|
7
|
-
import { ToolbarButton } from '@plone/volto-slate/editor/ui';
|
|
8
|
-
import { setPluginOptions } from '@plone/volto-slate/actions';
|
|
9
|
-
|
|
10
|
-
/*
|
|
11
|
-
* Note: this is a weirder component, it should be called as a native function
|
|
12
|
-
*/
|
|
13
|
-
export default (options) => (editor) => {
|
|
14
|
-
const {
|
|
15
|
-
isActiveElement,
|
|
16
|
-
unwrapElement,
|
|
17
|
-
pluginId,
|
|
18
|
-
messages,
|
|
19
|
-
toolbarButtonIcon,
|
|
20
|
-
} = options;
|
|
21
|
-
const intl = useIntl();
|
|
22
|
-
const dispatch = useDispatch();
|
|
23
|
-
const pid = `${editor.uid}-${pluginId}`;
|
|
24
|
-
const showEditor = useSelector(
|
|
25
|
-
(state) => state['slate_plugins']?.[pid]?.show_sidebar_editor,
|
|
26
|
-
);
|
|
27
|
-
|
|
28
|
-
return isActiveElement(editor) ? (
|
|
29
|
-
<React.Fragment key={pluginId}>
|
|
30
|
-
<ToolbarButton
|
|
31
|
-
title={intl.formatMessage(messages.edit)}
|
|
32
|
-
icon={toolbarButtonIcon}
|
|
33
|
-
active={showEditor}
|
|
34
|
-
aria-label={intl.formatMessage(messages.edit)}
|
|
35
|
-
onMouseDown={() => {
|
|
36
|
-
dispatch(
|
|
37
|
-
setPluginOptions(pid, {
|
|
38
|
-
show_sidebar_editor: true,
|
|
39
|
-
}),
|
|
40
|
-
);
|
|
41
|
-
}}
|
|
42
|
-
/>
|
|
43
|
-
<ToolbarButton
|
|
44
|
-
title={intl.formatMessage(messages.delete)}
|
|
45
|
-
icon={clearSVG}
|
|
46
|
-
aria-label={intl.formatMessage(messages.delete)}
|
|
47
|
-
alt={intl.formatMessage(messages.delete)}
|
|
48
|
-
onMouseDown={() => {
|
|
49
|
-
unwrapElement(editor);
|
|
50
|
-
}}
|
|
51
|
-
/>
|
|
52
|
-
</React.Fragment>
|
|
53
|
-
) : (
|
|
54
|
-
''
|
|
55
|
-
);
|
|
56
|
-
};
|
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
/* eslint no-console: ["error", { allow: ["error"] }] */
|
|
2
|
-
import { isEqual } from 'lodash';
|
|
3
|
-
import React from 'react';
|
|
4
|
-
import { useDispatch } from 'react-redux';
|
|
5
|
-
import { ReactEditor } from 'slate-react';
|
|
6
|
-
import { Icon as VoltoIcon, BlockDataForm } from '@plone/volto/components';
|
|
7
|
-
import { setPluginOptions } from '@plone/volto-slate/actions';
|
|
8
|
-
import BaseSchemaProvider from './SchemaProvider';
|
|
9
|
-
|
|
10
|
-
import briefcaseSVG from '@plone/volto/icons/briefcase.svg';
|
|
11
|
-
import checkSVG from '@plone/volto/icons/check.svg';
|
|
12
|
-
import clearSVG from '@plone/volto/icons/clear.svg';
|
|
13
|
-
|
|
14
|
-
const PluginEditor = (props) => {
|
|
15
|
-
const {
|
|
16
|
-
editor,
|
|
17
|
-
schemaProvider,
|
|
18
|
-
pluginId,
|
|
19
|
-
getActiveElement,
|
|
20
|
-
isActiveElement,
|
|
21
|
-
insertElement,
|
|
22
|
-
unwrapElement,
|
|
23
|
-
hasValue,
|
|
24
|
-
onChangeValues,
|
|
25
|
-
} = props;
|
|
26
|
-
|
|
27
|
-
const dispatch = useDispatch();
|
|
28
|
-
const [formData, setFormData] = React.useState({});
|
|
29
|
-
|
|
30
|
-
const active = getActiveElement(editor);
|
|
31
|
-
|
|
32
|
-
if (!active) {
|
|
33
|
-
console.error('Active element not found, this will crash');
|
|
34
|
-
}
|
|
35
|
-
const [elementNode] = active;
|
|
36
|
-
const isElement = isActiveElement(editor);
|
|
37
|
-
|
|
38
|
-
// Update the form data based on the current element
|
|
39
|
-
const elRef = React.useRef(null);
|
|
40
|
-
|
|
41
|
-
if (isElement && !isEqual(elementNode, elRef.current)) {
|
|
42
|
-
elRef.current = elementNode;
|
|
43
|
-
setFormData(elementNode.data || {});
|
|
44
|
-
} else if (!isElement) {
|
|
45
|
-
elRef.current = null;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
const saveDataToEditor = React.useCallback(
|
|
49
|
-
(formData) => {
|
|
50
|
-
if (hasValue(formData)) {
|
|
51
|
-
// hasValue(formData) = !!formData.footnote
|
|
52
|
-
insertElement(editor, formData);
|
|
53
|
-
} else {
|
|
54
|
-
unwrapElement(editor);
|
|
55
|
-
}
|
|
56
|
-
},
|
|
57
|
-
[editor, insertElement, unwrapElement, hasValue],
|
|
58
|
-
);
|
|
59
|
-
|
|
60
|
-
const checkForCancel = () => {
|
|
61
|
-
if (!hasValue(elementNode.data)) {
|
|
62
|
-
unwrapElement(editor);
|
|
63
|
-
}
|
|
64
|
-
};
|
|
65
|
-
|
|
66
|
-
const SchemaProvider = schemaProvider ? schemaProvider : BaseSchemaProvider;
|
|
67
|
-
|
|
68
|
-
const pid = `${editor.uid}-${pluginId}`;
|
|
69
|
-
return (
|
|
70
|
-
<SchemaProvider {...props} data={formData}>
|
|
71
|
-
{(schema) => (
|
|
72
|
-
<BlockDataForm
|
|
73
|
-
schema={schema}
|
|
74
|
-
title={schema.title}
|
|
75
|
-
icon={<VoltoIcon size="24px" name={briefcaseSVG} />}
|
|
76
|
-
onChangeField={(id, value) => {
|
|
77
|
-
if (!onChangeValues) {
|
|
78
|
-
return setFormData({
|
|
79
|
-
...formData,
|
|
80
|
-
[id]: value,
|
|
81
|
-
});
|
|
82
|
-
}
|
|
83
|
-
return onChangeValues(id, value, formData, setFormData);
|
|
84
|
-
}}
|
|
85
|
-
onChangeFormData={setFormData}
|
|
86
|
-
formData={formData}
|
|
87
|
-
headerActions={
|
|
88
|
-
<>
|
|
89
|
-
<button
|
|
90
|
-
onClick={() => {
|
|
91
|
-
saveDataToEditor(formData);
|
|
92
|
-
dispatch(
|
|
93
|
-
setPluginOptions(pid, {
|
|
94
|
-
show_sidebar_editor: false,
|
|
95
|
-
}),
|
|
96
|
-
);
|
|
97
|
-
ReactEditor.focus(editor);
|
|
98
|
-
}}
|
|
99
|
-
>
|
|
100
|
-
<VoltoIcon size="24px" name={checkSVG} />
|
|
101
|
-
</button>
|
|
102
|
-
<button
|
|
103
|
-
onClick={() => {
|
|
104
|
-
checkForCancel();
|
|
105
|
-
dispatch(
|
|
106
|
-
setPluginOptions(pid, {
|
|
107
|
-
show_sidebar_editor: false,
|
|
108
|
-
}),
|
|
109
|
-
);
|
|
110
|
-
setFormData({});
|
|
111
|
-
ReactEditor.focus(editor);
|
|
112
|
-
}}
|
|
113
|
-
>
|
|
114
|
-
<VoltoIcon size="24px" name={clearSVG} />
|
|
115
|
-
</button>
|
|
116
|
-
</>
|
|
117
|
-
}
|
|
118
|
-
/>
|
|
119
|
-
)}
|
|
120
|
-
</SchemaProvider>
|
|
121
|
-
);
|
|
122
|
-
};
|
|
123
|
-
|
|
124
|
-
export default PluginEditor;
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
A generic plugin that can be used to create other editor interactions that
|
|
2
|
-
follow the following pattern:
|
|
3
|
-
|
|
4
|
-
- the plugin needs a button that toggles a format (an inline element)
|
|
5
|
-
- the plugin needs a separate edit form for advanced customization of the data
|
|
6
|
-
attached to the element
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* A small wrapper around PluginEditor. Its purpose it to allow for clearer
|
|
3
|
-
* code, otherwise it would mix too many hooks and it's not possible to render
|
|
4
|
-
* a variable number of hooks in a component
|
|
5
|
-
*/
|
|
6
|
-
import React from 'react';
|
|
7
|
-
import { useSelector, useDispatch } from 'react-redux';
|
|
8
|
-
import { SidebarPopup } from '@plone/volto/components';
|
|
9
|
-
import { setPluginOptions } from '@plone/volto-slate/actions';
|
|
10
|
-
|
|
11
|
-
const SidebarEditor = (props) => {
|
|
12
|
-
const { editor, pluginId, getActiveElement, pluginEditor } = props;
|
|
13
|
-
const pid = `${editor.uid}-${pluginId}`;
|
|
14
|
-
const PluginEditor = pluginEditor;
|
|
15
|
-
const showEditor = useSelector((state) => {
|
|
16
|
-
return state['slate_plugins']?.[pid]?.show_sidebar_editor;
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
const dispatch = useDispatch();
|
|
20
|
-
|
|
21
|
-
let active;
|
|
22
|
-
try {
|
|
23
|
-
active = getActiveElement(editor);
|
|
24
|
-
} catch (error) {
|
|
25
|
-
// eslint-disable-next-line
|
|
26
|
-
console.warn('Error in getting active element', error);
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
// Hide the editor when switching to another text element
|
|
30
|
-
React.useEffect(() => {
|
|
31
|
-
if (!active)
|
|
32
|
-
dispatch(setPluginOptions(pid, { show_sidebar_editor: false }));
|
|
33
|
-
}, [active, dispatch, pluginId, pid]);
|
|
34
|
-
|
|
35
|
-
editor.isSidebarOpen = showEditor && active;
|
|
36
|
-
|
|
37
|
-
return editor.isSidebarOpen ? (
|
|
38
|
-
<SidebarPopup open={true}>
|
|
39
|
-
<PluginEditor {...props} />
|
|
40
|
-
</SidebarPopup>
|
|
41
|
-
) : (
|
|
42
|
-
''
|
|
43
|
-
);
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
export default SidebarEditor;
|