@plone/volto-slate 18.0.0-alpha.4
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/.eslintrc.js +6 -0
- package/.release-it.json +25 -0
- package/CHANGELOG.md +19 -0
- package/LICENSE.md +21 -0
- package/README.md +10 -0
- package/build/messages/src/blocks/Table/TableBlockEdit.json +90 -0
- package/build/messages/src/blocks/Text/DefaultTextBlockEditor.json +6 -0
- package/build/messages/src/blocks/Text/DetachedTextBlockEditor.json +6 -0
- package/build/messages/src/blocks/Text/SlashMenu.json +6 -0
- package/build/messages/src/editor/plugins/AdvancedLink/index.json +10 -0
- package/build/messages/src/editor/plugins/Link/index.json +10 -0
- package/build/messages/src/editor/plugins/Table/index.json +30 -0
- package/build/messages/src/elementEditor/messages.json +10 -0
- package/build/messages/src/widgets/HtmlSlateWidget.json +6 -0
- package/build/messages/src/widgets/RichTextWidgetView.json +6 -0
- package/locales/de/LC_MESSAGES/volto.po +148 -0
- package/locales/en/LC_MESSAGES/volto.po +148 -0
- package/locales/volto.pot +182 -0
- package/package.json +42 -0
- package/src/actions/content.js +30 -0
- package/src/actions/index.js +3 -0
- package/src/actions/plugins.js +9 -0
- package/src/actions/selection.js +22 -0
- package/src/blocks/Table/Cell.jsx +87 -0
- package/src/blocks/Table/Cell.test.js +54 -0
- package/src/blocks/Table/TableBlockEdit.jsx +694 -0
- package/src/blocks/Table/TableBlockEdit.test.js +40 -0
- package/src/blocks/Table/TableBlockView.jsx +150 -0
- package/src/blocks/Table/TableBlockView.test.js +49 -0
- package/src/blocks/Table/__snapshots__/Cell.test.js.snap +3 -0
- package/src/blocks/Table/__snapshots__/TableBlockEdit.test.js.snap +22 -0
- package/src/blocks/Table/__snapshots__/TableBlockView.test.js.snap +27 -0
- package/src/blocks/Table/deconstruct.js +113 -0
- package/src/blocks/Table/extensions/normalizeTable.js +5 -0
- package/src/blocks/Table/index.js +60 -0
- package/src/blocks/Table/schema.js +122 -0
- package/src/blocks/Text/DefaultTextBlockEditor.jsx +304 -0
- package/src/blocks/Text/DetachedTextBlockEditor.jsx +77 -0
- package/src/blocks/Text/MarkdownIntroduction.jsx +59 -0
- package/src/blocks/Text/PluginSidebar.jsx +18 -0
- package/src/blocks/Text/ShortcutListing.jsx +28 -0
- package/src/blocks/Text/SlashMenu.jsx +203 -0
- package/src/blocks/Text/TextBlockEdit.jsx +38 -0
- package/src/blocks/Text/TextBlockEdit.test.js +107 -0
- package/src/blocks/Text/TextBlockSchema.js +54 -0
- package/src/blocks/Text/TextBlockView.jsx +31 -0
- package/src/blocks/Text/__snapshots__/TextBlockEdit.test.js.snap +62 -0
- package/src/blocks/Text/css/editor.css +18 -0
- package/src/blocks/Text/extensions/Readme.md +49 -0
- package/src/blocks/Text/extensions/breakList.js +100 -0
- package/src/blocks/Text/extensions/index.js +6 -0
- package/src/blocks/Text/extensions/insertBreak.js +57 -0
- package/src/blocks/Text/extensions/isSelected.js +7 -0
- package/src/blocks/Text/extensions/normalizeExternalData.js +7 -0
- package/src/blocks/Text/extensions/withDeserializers.js +87 -0
- package/src/blocks/Text/extensions/withLists.js +5 -0
- package/src/blocks/Text/index.js +171 -0
- package/src/blocks/Text/keyboard/backspaceInList.js +58 -0
- package/src/blocks/Text/keyboard/breakBlocks.js +3 -0
- package/src/blocks/Text/keyboard/cancelEsc.js +7 -0
- package/src/blocks/Text/keyboard/indentListItems.js +240 -0
- package/src/blocks/Text/keyboard/index.js +52 -0
- package/src/blocks/Text/keyboard/joinBlocks.js +180 -0
- package/src/blocks/Text/keyboard/moveListItems.js +124 -0
- package/src/blocks/Text/keyboard/slashMenu.js +19 -0
- package/src/blocks/Text/keyboard/softBreak.js +7 -0
- package/src/blocks/Text/keyboard/traverseBlocks.js +81 -0
- package/src/blocks/Text/keyboard/unwrapEmptyString.js +26 -0
- package/src/blocks/Text/schema.js +39 -0
- package/src/constants.js +123 -0
- package/src/editor/EditorContext.jsx +5 -0
- package/src/editor/EditorReference.jsx +22 -0
- package/src/editor/SlateEditor.jsx +375 -0
- package/src/editor/config.jsx +344 -0
- package/src/editor/decorate.js +68 -0
- package/src/editor/deserialize.js +185 -0
- package/src/editor/extensions/index.js +6 -0
- package/src/editor/extensions/insertBreak.js +15 -0
- package/src/editor/extensions/insertData.js +161 -0
- package/src/editor/extensions/isInline.js +14 -0
- package/src/editor/extensions/normalizeExternalData.js +8 -0
- package/src/editor/extensions/normalizeNode.js +48 -0
- package/src/editor/extensions/withDeserializers.js +15 -0
- package/src/editor/extensions/withTestingFeatures.jsx +84 -0
- package/src/editor/index.js +14 -0
- package/src/editor/less/editor.less +173 -0
- package/src/editor/less/globals.less +18 -0
- package/src/editor/less/slate.less +28 -0
- package/src/editor/plugins/AdvancedLink/deserialize.js +90 -0
- package/src/editor/plugins/AdvancedLink/extensions.js +32 -0
- package/src/editor/plugins/AdvancedLink/index.js +50 -0
- package/src/editor/plugins/AdvancedLink/render.jsx +37 -0
- package/src/editor/plugins/AdvancedLink/schema.js +114 -0
- package/src/editor/plugins/AdvancedLink/styles.less +8 -0
- package/src/editor/plugins/Blockquote/index.js +30 -0
- package/src/editor/plugins/Callout/index.js +34 -0
- package/src/editor/plugins/Image/deconstruct.js +30 -0
- package/src/editor/plugins/Image/extensions.js +51 -0
- package/src/editor/plugins/Image/index.js +11 -0
- package/src/editor/plugins/Image/render.jsx +22 -0
- package/src/editor/plugins/Link/extensions.js +58 -0
- package/src/editor/plugins/Link/index.js +159 -0
- package/src/editor/plugins/Link/render.jsx +54 -0
- package/src/editor/plugins/Markdown/constants.js +81 -0
- package/src/editor/plugins/Markdown/extensions.js +336 -0
- package/src/editor/plugins/Markdown/index.js +28 -0
- package/src/editor/plugins/Markdown/utils.js +198 -0
- package/src/editor/plugins/StyleMenu/StyleMenu.jsx +153 -0
- package/src/editor/plugins/StyleMenu/index.js +19 -0
- package/src/editor/plugins/StyleMenu/style.less +29 -0
- package/src/editor/plugins/StyleMenu/utils.js +168 -0
- package/src/editor/plugins/Table/TableButton.jsx +142 -0
- package/src/editor/plugins/Table/TableCell.jsx +44 -0
- package/src/editor/plugins/Table/TableContainer.jsx +37 -0
- package/src/editor/plugins/Table/TableSizePicker.jsx +83 -0
- package/src/editor/plugins/Table/extensions.js +87 -0
- package/src/editor/plugins/Table/index.js +390 -0
- package/src/editor/plugins/Table/less/public.less +29 -0
- package/src/editor/plugins/Table/less/table.less +28 -0
- package/src/editor/plugins/Table/render.jsx +30 -0
- package/src/editor/plugins/index.js +19 -0
- package/src/editor/render.jsx +224 -0
- package/src/editor/ui/BasicToolbar.jsx +11 -0
- package/src/editor/ui/BlockButton.jsx +31 -0
- package/src/editor/ui/ClearFormattingButton.jsx +21 -0
- package/src/editor/ui/ExpandedToolbar.jsx +18 -0
- package/src/editor/ui/Expando.jsx +5 -0
- package/src/editor/ui/InlineToolbar.jsx +69 -0
- package/src/editor/ui/MarkButton.jsx +23 -0
- package/src/editor/ui/MarkElementButton.jsx +30 -0
- package/src/editor/ui/Menu.jsx +13 -0
- package/src/editor/ui/PositionedToolbar.jsx +32 -0
- package/src/editor/ui/Separator.jsx +7 -0
- package/src/editor/ui/SlateContextToolbar.jsx +13 -0
- package/src/editor/ui/SlateToolbar.jsx +96 -0
- package/src/editor/ui/Toolbar.jsx +103 -0
- package/src/editor/ui/ToolbarButton.jsx +33 -0
- package/src/editor/ui/ToolbarButton.test.js +25 -0
- package/src/editor/ui/__snapshots__/ToolbarButton.test.js.snap +16 -0
- package/src/editor/ui/index.js +15 -0
- package/src/editor/utils.js +248 -0
- package/src/elementEditor/ContextButtons.jsx +57 -0
- package/src/elementEditor/PluginEditor.jsx +124 -0
- package/src/elementEditor/Readme.md +6 -0
- package/src/elementEditor/SchemaProvider.jsx +4 -0
- package/src/elementEditor/SidebarEditor.jsx +46 -0
- package/src/elementEditor/ToolbarButton.jsx +44 -0
- package/src/elementEditor/index.js +5 -0
- package/src/elementEditor/makeInlineElementPlugin.js +100 -0
- package/src/elementEditor/messages.js +14 -0
- package/src/elementEditor/utils.js +227 -0
- package/src/hooks/index.js +3 -0
- package/src/hooks/useEditorContext.js +6 -0
- package/src/hooks/useIsomorphicLayoutEffect.js +7 -0
- package/src/hooks/useSelectionPosition.js +25 -0
- package/src/i18n.js +180 -0
- package/src/icons/hashlink.svg +57 -0
- package/src/index.js +61 -0
- package/src/reducers/content.js +74 -0
- package/src/reducers/index.js +3 -0
- package/src/reducers/plugins.js +17 -0
- package/src/reducers/selection.js +16 -0
- package/src/utils/blocks.js +379 -0
- package/src/utils/blocks.test.js +138 -0
- package/src/utils/editor.js +31 -0
- package/src/utils/image.js +25 -0
- package/src/utils/index.js +11 -0
- package/src/utils/internals.js +46 -0
- package/src/utils/lists.js +92 -0
- package/src/utils/marks.js +104 -0
- package/src/utils/mime-types.js +24 -0
- package/src/utils/nodes.js +4 -0
- package/src/utils/ops.js +20 -0
- package/src/utils/random.js +17 -0
- package/src/utils/selection.js +236 -0
- package/src/utils/slate-string-utils.js +409 -0
- package/src/utils/volto-blocks.js +314 -0
- package/src/widgets/ErrorBoundary.jsx +27 -0
- package/src/widgets/HtmlSlateWidget.jsx +138 -0
- package/src/widgets/ObjectByTypeWidget.jsx +49 -0
- package/src/widgets/RichTextWidget.jsx +72 -0
- package/src/widgets/RichTextWidgetView.jsx +36 -0
- package/src/widgets/style.css +21 -0
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
msgid ""
|
|
2
|
+
msgstr ""
|
|
3
|
+
"Project-Id-Version: Plone\n"
|
|
4
|
+
"POT-Creation-Date: 2022-07-20T12:45:09.681Z\n"
|
|
5
|
+
"Last-Translator: Plone i18n <plone-i18n@lists.sourceforge.net>\n"
|
|
6
|
+
"Language-Team: Plone i18n <plone-i18n@lists.sourceforge.net>\n"
|
|
7
|
+
"MIME-Version: 1.0\n"
|
|
8
|
+
"Content-Type: text/plain; charset=utf-8\n"
|
|
9
|
+
"Content-Transfer-Encoding: 8bit\n"
|
|
10
|
+
"Plural-Forms: nplurals=1; plural=0;\n"
|
|
11
|
+
"Language-Code: en\n"
|
|
12
|
+
"Language-Name: English\n"
|
|
13
|
+
"Preferred-Encodings: utf-8\n"
|
|
14
|
+
"Domain: volto\n"
|
|
15
|
+
|
|
16
|
+
#: editor/plugins/Link/index
|
|
17
|
+
# defaultMessage: Add link
|
|
18
|
+
msgid "Add link"
|
|
19
|
+
msgstr ""
|
|
20
|
+
|
|
21
|
+
#: widgets/HtmlSlateWidget
|
|
22
|
+
# defaultMessage: An error has occurred while editing "{name}" field. We have been notified and we are looking into it. Please save your work and retry. If the issue persists please contact the site administrator.
|
|
23
|
+
msgid "An error has occurred while editing "{name}" field. We have been notified and we are looking into it. Please save your work and retry. If the issue persists please contact the site administrator."
|
|
24
|
+
msgstr ""
|
|
25
|
+
|
|
26
|
+
#: widgets/RichTextWidgetView
|
|
27
|
+
# defaultMessage: An error has occurred while rendering "{name}" field. We have been notified and we are looking into it. If the issue persists please contact the site administrator.
|
|
28
|
+
msgid "An error has occurred while rendering "{name}" field. We have been notified and we are looking into it. If the issue persists please contact the site administrator."
|
|
29
|
+
msgstr ""
|
|
30
|
+
|
|
31
|
+
#: blocks/Table/TableBlockEdit
|
|
32
|
+
# defaultMessage: Bottom
|
|
33
|
+
msgid "Bottom"
|
|
34
|
+
msgstr ""
|
|
35
|
+
|
|
36
|
+
#: blocks/Table/TableBlockEdit
|
|
37
|
+
# defaultMessage: Center
|
|
38
|
+
msgid "Center"
|
|
39
|
+
msgstr ""
|
|
40
|
+
|
|
41
|
+
#: blocks/Table/TableBlockEdit
|
|
42
|
+
#: editor/plugins/Table/index
|
|
43
|
+
# defaultMessage: Delete col
|
|
44
|
+
msgid "Delete col"
|
|
45
|
+
msgstr ""
|
|
46
|
+
|
|
47
|
+
#: blocks/Table/TableBlockEdit
|
|
48
|
+
#: editor/plugins/Table/index
|
|
49
|
+
# defaultMessage: Delete row
|
|
50
|
+
msgid "Delete row"
|
|
51
|
+
msgstr ""
|
|
52
|
+
|
|
53
|
+
#: editor/plugins/Table/index
|
|
54
|
+
# defaultMessage: Delete table
|
|
55
|
+
msgid "Delete table"
|
|
56
|
+
msgstr ""
|
|
57
|
+
|
|
58
|
+
#: blocks/Table/TableBlockEdit
|
|
59
|
+
# defaultMessage: Divide each row into separate cells
|
|
60
|
+
msgid "Divide each row into separate cells"
|
|
61
|
+
msgstr ""
|
|
62
|
+
|
|
63
|
+
#: elementEditor/messages
|
|
64
|
+
# defaultMessage: Edit element
|
|
65
|
+
msgid "Edit element"
|
|
66
|
+
msgstr ""
|
|
67
|
+
|
|
68
|
+
#: editor/plugins/AdvancedLink/index
|
|
69
|
+
#: editor/plugins/Link/index
|
|
70
|
+
# defaultMessage: Edit link
|
|
71
|
+
msgid "Edit link"
|
|
72
|
+
msgstr ""
|
|
73
|
+
|
|
74
|
+
#: blocks/Table/TableBlockEdit
|
|
75
|
+
# defaultMessage: Fixed width table cells
|
|
76
|
+
msgid "Fixed width table cells"
|
|
77
|
+
msgstr ""
|
|
78
|
+
|
|
79
|
+
#: blocks/Table/TableBlockEdit
|
|
80
|
+
# defaultMessage: Hide headers
|
|
81
|
+
msgid "Hide headers"
|
|
82
|
+
msgstr ""
|
|
83
|
+
|
|
84
|
+
#: blocks/Table/TableBlockEdit
|
|
85
|
+
#: editor/plugins/Table/index
|
|
86
|
+
# defaultMessage: Insert col after
|
|
87
|
+
msgid "Insert col after"
|
|
88
|
+
msgstr ""
|
|
89
|
+
|
|
90
|
+
#: blocks/Table/TableBlockEdit
|
|
91
|
+
#: editor/plugins/Table/index
|
|
92
|
+
# defaultMessage: Insert col before
|
|
93
|
+
msgid "Insert col before"
|
|
94
|
+
msgstr ""
|
|
95
|
+
|
|
96
|
+
#: blocks/Table/TableBlockEdit
|
|
97
|
+
#: editor/plugins/Table/index
|
|
98
|
+
# defaultMessage: Insert row after
|
|
99
|
+
msgid "Insert row after"
|
|
100
|
+
msgstr ""
|
|
101
|
+
|
|
102
|
+
#: blocks/Table/TableBlockEdit
|
|
103
|
+
#: editor/plugins/Table/index
|
|
104
|
+
# defaultMessage: Insert row before
|
|
105
|
+
msgid "Insert row before"
|
|
106
|
+
msgstr ""
|
|
107
|
+
|
|
108
|
+
#: blocks/Table/TableBlockEdit
|
|
109
|
+
# defaultMessage: Left
|
|
110
|
+
msgid "Left"
|
|
111
|
+
msgstr ""
|
|
112
|
+
|
|
113
|
+
#: blocks/Table/TableBlockEdit
|
|
114
|
+
# defaultMessage: Make the table compact
|
|
115
|
+
msgid "Make the table compact"
|
|
116
|
+
msgstr ""
|
|
117
|
+
|
|
118
|
+
#: blocks/Table/TableBlockEdit
|
|
119
|
+
# defaultMessage: Make the table sortable
|
|
120
|
+
msgid "Make the table sortable"
|
|
121
|
+
msgstr ""
|
|
122
|
+
|
|
123
|
+
#: blocks/Table/TableBlockEdit
|
|
124
|
+
# defaultMessage: Middle
|
|
125
|
+
msgid "Middle"
|
|
126
|
+
msgstr ""
|
|
127
|
+
|
|
128
|
+
#: blocks/Text/SlashMenu
|
|
129
|
+
# defaultMessage: No matching blocks
|
|
130
|
+
msgid "No matching blocks"
|
|
131
|
+
msgstr ""
|
|
132
|
+
|
|
133
|
+
#: blocks/Table/TableBlockEdit
|
|
134
|
+
# defaultMessage: Reduce complexity
|
|
135
|
+
msgid "Reduce complexity"
|
|
136
|
+
msgstr ""
|
|
137
|
+
|
|
138
|
+
#: elementEditor/messages
|
|
139
|
+
# defaultMessage: Remove element
|
|
140
|
+
msgid "Remove element"
|
|
141
|
+
msgstr ""
|
|
142
|
+
|
|
143
|
+
#: editor/plugins/AdvancedLink/index
|
|
144
|
+
# defaultMessage: Remove link
|
|
145
|
+
msgid "Remove link"
|
|
146
|
+
msgstr ""
|
|
147
|
+
|
|
148
|
+
#: blocks/Table/TableBlockEdit
|
|
149
|
+
# defaultMessage: Right
|
|
150
|
+
msgid "Right"
|
|
151
|
+
msgstr ""
|
|
152
|
+
|
|
153
|
+
#: blocks/Table/TableBlockEdit
|
|
154
|
+
# defaultMessage: Stripe alternate rows with color
|
|
155
|
+
msgid "Stripe alternate rows with color"
|
|
156
|
+
msgstr ""
|
|
157
|
+
|
|
158
|
+
#: blocks/Table/TableBlockEdit
|
|
159
|
+
# defaultMessage: Table
|
|
160
|
+
msgid "Table"
|
|
161
|
+
msgstr ""
|
|
162
|
+
|
|
163
|
+
#: blocks/Table/TableBlockEdit
|
|
164
|
+
# defaultMessage: Table color inverted
|
|
165
|
+
msgid "Table color inverted"
|
|
166
|
+
msgstr ""
|
|
167
|
+
|
|
168
|
+
#: blocks/Table/TableBlockEdit
|
|
169
|
+
# defaultMessage: Top
|
|
170
|
+
msgid "Top"
|
|
171
|
+
msgstr ""
|
|
172
|
+
|
|
173
|
+
#: blocks/Text/DefaultTextBlockEditor
|
|
174
|
+
#: blocks/Text/DetachedTextBlockEditor
|
|
175
|
+
# defaultMessage: Type text…
|
|
176
|
+
msgid "Type text…"
|
|
177
|
+
msgstr ""
|
|
178
|
+
|
|
179
|
+
#: blocks/Table/TableBlockEdit
|
|
180
|
+
# defaultMessage: Visible only in view mode
|
|
181
|
+
msgid "Visible only in view mode"
|
|
182
|
+
msgstr ""
|
package/package.json
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@plone/volto-slate",
|
|
3
|
+
"version": "18.0.0-alpha.4",
|
|
4
|
+
"description": "Slate.js integration with Volto",
|
|
5
|
+
"main": "src/index.js",
|
|
6
|
+
"author": "European Environment Agency: IDM2 A-Team",
|
|
7
|
+
"license": "MIT",
|
|
8
|
+
"keywords": [
|
|
9
|
+
"volto-core-addon",
|
|
10
|
+
"volto-addon",
|
|
11
|
+
"volto-slate",
|
|
12
|
+
"volto-slate-addon",
|
|
13
|
+
"volto",
|
|
14
|
+
"plone",
|
|
15
|
+
"react"
|
|
16
|
+
],
|
|
17
|
+
"publishConfig": {
|
|
18
|
+
"access": "public"
|
|
19
|
+
},
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"image-extensions": "1.1.0",
|
|
22
|
+
"is-url": "1.2.4",
|
|
23
|
+
"jsdom": "^16.6.0",
|
|
24
|
+
"react-intersection-observer": "^8.32.0",
|
|
25
|
+
"slate": "0.100.0",
|
|
26
|
+
"slate-history": "0.100.0",
|
|
27
|
+
"slate-hyperscript": "0.100.0",
|
|
28
|
+
"slate-react": "0.98.4",
|
|
29
|
+
"weak-key": "^1.0.2"
|
|
30
|
+
},
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"@testing-library/react": "9.5.0",
|
|
33
|
+
"babel-plugin-transform-class-properties": "^6.24.1",
|
|
34
|
+
"release-it": "^17.0.0"
|
|
35
|
+
},
|
|
36
|
+
"scripts": {
|
|
37
|
+
"dry-release": "release-it --dry-run",
|
|
38
|
+
"release": "release-it",
|
|
39
|
+
"release-major-alpha": "release-it major --preRelease=alpha",
|
|
40
|
+
"release-alpha": "release-it --preRelease=alpha"
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { nestContent } from '@plone/volto/helpers';
|
|
2
|
+
import { UPLOAD_CONTENT } from '@plone/volto-slate/constants';
|
|
3
|
+
|
|
4
|
+
// TODO: the PR has been merged into Volto, so this should be cleaned up
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* @summary Upload content function.
|
|
8
|
+
*
|
|
9
|
+
* @description A custom version of Volto's `createContent` that can take an
|
|
10
|
+
* `origin` block ID. There is an issue on making this a builtin variant of the
|
|
11
|
+
* Volto's `createContent` action: https://github.com/plone/volto/issues/1654.
|
|
12
|
+
*
|
|
13
|
+
* @param {string} url Parent URL.
|
|
14
|
+
* @param {Object|Array} content Content data.
|
|
15
|
+
* @param {string} origin The ID of the block into which the content should be
|
|
16
|
+
* uploaded.
|
|
17
|
+
*
|
|
18
|
+
* @todo Clarify if the parameter `origin` is optional or remove this TODO.
|
|
19
|
+
*
|
|
20
|
+
* @returns {Object} Upload content action.
|
|
21
|
+
*/
|
|
22
|
+
export function uploadContent(url, content, origin) {
|
|
23
|
+
return {
|
|
24
|
+
type: UPLOAD_CONTENT,
|
|
25
|
+
origin,
|
|
26
|
+
request: Array.isArray(content)
|
|
27
|
+
? content.map((item) => ({ op: 'post', path: url, data: item }))
|
|
28
|
+
: { op: 'post', path: url, data: nestContent(content) },
|
|
29
|
+
};
|
|
30
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { SAVE_SLATE_BLOCK_SELECTION } from '@plone/volto-slate/constants';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Action creator for the action to save the selection of a Slate block. The
|
|
5
|
+
* selection is saved into the form's data for later usage.
|
|
6
|
+
*
|
|
7
|
+
* @param {string} blockid The ID of the block that should have its selection
|
|
8
|
+
* saved.
|
|
9
|
+
* @param {object} selection An object implementing the Slate's `Range`
|
|
10
|
+
* interface or a string: 'start', 'end'.
|
|
11
|
+
*
|
|
12
|
+
* @todo Clarify here if the `selection` parameter can be `null` or `undefined`.
|
|
13
|
+
*
|
|
14
|
+
* @returns The action object.
|
|
15
|
+
*/
|
|
16
|
+
export default function saveSlateBlockSelection(blockid, selection) {
|
|
17
|
+
return {
|
|
18
|
+
type: SAVE_SLATE_BLOCK_SELECTION,
|
|
19
|
+
blockid,
|
|
20
|
+
selection,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import React, { Component } from 'react';
|
|
2
|
+
import PropTypes from 'prop-types';
|
|
3
|
+
import { EditorReference, SlateEditor } from '@plone/volto-slate/editor';
|
|
4
|
+
import { ReactEditor } from 'slate-react';
|
|
5
|
+
import config from '@plone/volto/registry';
|
|
6
|
+
|
|
7
|
+
class Cell extends Component {
|
|
8
|
+
static propTypes = {
|
|
9
|
+
onSelectCell: PropTypes.func.isRequired,
|
|
10
|
+
row: PropTypes.number,
|
|
11
|
+
cell: PropTypes.number,
|
|
12
|
+
value: PropTypes.array,
|
|
13
|
+
selected: PropTypes.bool,
|
|
14
|
+
onChange: PropTypes.func.isRequired,
|
|
15
|
+
isTableBlockSelected: PropTypes.bool,
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
static defaultProps = {};
|
|
19
|
+
|
|
20
|
+
constructor(props) {
|
|
21
|
+
super(props);
|
|
22
|
+
|
|
23
|
+
this.onChange = this.onChange.bind(this);
|
|
24
|
+
this.handleContainerFocus = this.handleContainerFocus.bind(this);
|
|
25
|
+
this.state = { editor: null };
|
|
26
|
+
this.tableblockExtensions = config.settings.slate.tableblockExtensions;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
componentWillUnmount() {
|
|
30
|
+
this.isUnmounted = true;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
componentDidUpdate(prevProps) {
|
|
34
|
+
if (
|
|
35
|
+
prevProps.isTableBlockSelected !== this.props.isTableBlockSelected &&
|
|
36
|
+
this.props.isTableBlockSelected &&
|
|
37
|
+
this.props.cell === 0 &&
|
|
38
|
+
this.props.row === 0 &&
|
|
39
|
+
(!this.props.selectedCell ||
|
|
40
|
+
(this.props.selectedCell.row === 0 &&
|
|
41
|
+
this.props.selectedCell.cell === 0))
|
|
42
|
+
) {
|
|
43
|
+
this.props.onSelectCell(this.props.row, this.props.cell);
|
|
44
|
+
|
|
45
|
+
// Wait for Slate to initialize before asking it to focus
|
|
46
|
+
if (this.state.editor) {
|
|
47
|
+
setTimeout(
|
|
48
|
+
() => !this.isUnmounted && ReactEditor.focus(this.state.editor),
|
|
49
|
+
0,
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
onChange(val) {
|
|
56
|
+
this.props.onChange(this.props.row, this.props.cell, [...val]);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
handleContainerFocus() {
|
|
60
|
+
this.props.onSelectCell(this.props.row, this.props.cell);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
render() {
|
|
64
|
+
return (
|
|
65
|
+
__CLIENT__ && (
|
|
66
|
+
<SlateEditor
|
|
67
|
+
tabIndex={0}
|
|
68
|
+
onChange={this.onChange}
|
|
69
|
+
extensions={this.tableblockExtensions}
|
|
70
|
+
value={this.props.value}
|
|
71
|
+
selected={this.props.selected}
|
|
72
|
+
onFocus={this.handleContainerFocus}
|
|
73
|
+
onClick={this.handleContainerFocus}
|
|
74
|
+
debug={false}
|
|
75
|
+
>
|
|
76
|
+
<EditorReference
|
|
77
|
+
onHasEditor={(editor) =>
|
|
78
|
+
!this.state.editor && this.setState({ editor })
|
|
79
|
+
}
|
|
80
|
+
/>
|
|
81
|
+
</SlateEditor>
|
|
82
|
+
)
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export default Cell;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import renderer from 'react-test-renderer';
|
|
3
|
+
import Cell from './Cell';
|
|
4
|
+
import configureStore from 'redux-mock-store';
|
|
5
|
+
import { Provider } from 'react-intl-redux';
|
|
6
|
+
import config from '@plone/volto/registry';
|
|
7
|
+
|
|
8
|
+
const mockStore = configureStore();
|
|
9
|
+
|
|
10
|
+
global.__SERVER__ = true; // eslint-disable-line no-underscore-dangle
|
|
11
|
+
global.__CLIENT__ = false; // eslint-disable-line no-underscore-dangle
|
|
12
|
+
|
|
13
|
+
beforeAll(() => {
|
|
14
|
+
const createEmptyParagraph = () => {
|
|
15
|
+
return {
|
|
16
|
+
type: 'p',
|
|
17
|
+
children: [{ text: '' }],
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
config.settings = {
|
|
22
|
+
supportedLanguages: [],
|
|
23
|
+
slate: {
|
|
24
|
+
elements: {
|
|
25
|
+
default: ({ attributes, children }) => (
|
|
26
|
+
<p {...attributes}>{children}</p>
|
|
27
|
+
),
|
|
28
|
+
},
|
|
29
|
+
leafs: {},
|
|
30
|
+
defaultBlockType: 'p',
|
|
31
|
+
textblockExtensions: [],
|
|
32
|
+
extensions: [],
|
|
33
|
+
defaultValue: () => {
|
|
34
|
+
return [createEmptyParagraph()];
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
test('renders a cell component', () => {
|
|
41
|
+
const store = mockStore({
|
|
42
|
+
intl: {
|
|
43
|
+
locale: 'en',
|
|
44
|
+
messages: {},
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
const component = renderer.create(
|
|
48
|
+
<Provider store={store}>
|
|
49
|
+
<Cell onChange={() => {}} onSelectCell={() => {}} />
|
|
50
|
+
</Provider>,
|
|
51
|
+
);
|
|
52
|
+
const json = component.toJSON();
|
|
53
|
+
expect(json).toMatchSnapshot();
|
|
54
|
+
});
|