@plone/volto 18.0.0-alpha.2 → 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.
Files changed (293) hide show
  1. package/.eslintrc +3 -3
  2. package/.prettierignore +8 -0
  3. package/.prettierrc +12 -0
  4. package/{packages/registry/.release-it.json → .release-it.json} +11 -6
  5. package/CHANGELOG.md +44 -4
  6. package/locales/ca/LC_MESSAGES/volto.po +1 -0
  7. package/locales/de/LC_MESSAGES/volto.po +1 -0
  8. package/locales/en/LC_MESSAGES/volto.po +1 -0
  9. package/locales/es/LC_MESSAGES/volto.po +1 -0
  10. package/locales/eu/LC_MESSAGES/volto.po +1 -0
  11. package/locales/fi/LC_MESSAGES/volto.po +1 -0
  12. package/locales/fr/LC_MESSAGES/volto.po +1 -0
  13. package/locales/it/LC_MESSAGES/volto.po +1 -0
  14. package/locales/ja/LC_MESSAGES/volto.po +1 -0
  15. package/locales/nl/LC_MESSAGES/volto.po +1 -0
  16. package/locales/pt/LC_MESSAGES/volto.po +1 -0
  17. package/locales/pt_BR/LC_MESSAGES/volto.po +1 -0
  18. package/locales/ro/LC_MESSAGES/volto.po +1 -0
  19. package/locales/volto.pot +2 -1
  20. package/locales/zh_CN/LC_MESSAGES/volto.po +1 -0
  21. package/package.json +57 -127
  22. package/razzle.config.js +4 -7
  23. package/src/components/manage/Blocks/Video/Body.jsx +52 -22
  24. package/src/components/manage/Blocks/Video/Body.test.jsx +167 -0
  25. package/src/components/manage/Controlpanels/Users/UserGroupMembershipControlPanel.jsx +2 -2
  26. package/src/components/manage/Form/Form.jsx +5 -2
  27. package/src/components/theme/Breadcrumbs/Breadcrumbs.jsx +19 -2
  28. package/src/components/theme/ContentMetadataTags/ContentMetadataTags.jsx +46 -39
  29. package/src/config/index.js +0 -4
  30. package/src/icons/divide-horizontal.svg +0 -0
  31. package/src/icons/divide-vertical.svg +0 -0
  32. package/src/icons/hero.svg +0 -0
  33. package/src/icons/slider.svg +0 -0
  34. package/src/icons/summary.svg +0 -0
  35. package/src/middleware/api.js +1 -1
  36. package/theme/themes/default/elements/icon.overrides +0 -0
  37. package/theme/themes/default/globals/reset.overrides +0 -0
  38. package/theme/themes/default/globals/site.variables +0 -0
  39. package/theme/themes/default/modules/dropdown.overrides +0 -0
  40. package/theme/themes/default/modules/dropdown.variables +0 -0
  41. package/theme/themes/default/modules/modal.variables +0 -0
  42. package/theme/themes/default/modules/video.overrides +0 -0
  43. package/theme/themes/default/modules/video.variables +0 -0
  44. package/theme/themes/pastanaga/assets/fonts/icons.eot +0 -0
  45. package/theme/themes/pastanaga/assets/fonts/icons.svg +0 -0
  46. package/theme/themes/pastanaga/assets/fonts/icons.ttf +0 -0
  47. package/theme/themes/pastanaga/assets/fonts/icons.woff +0 -0
  48. package/theme/themes/pastanaga/globals/reset.overrides +0 -0
  49. package/theme/themes/pastanaga/globals/site.variables +0 -0
  50. package/theme/themes/pastanaga/modules/dropdown.variables +0 -0
  51. package/theme/themes/pastanaga/modules/modal.variables +0 -0
  52. package/theme/themes/pastanaga/modules/video.overrides +0 -0
  53. package/theme/themes/pastanaga/modules/video.variables +0 -0
  54. package/tsconfig.json +1 -4
  55. package/types/components/manage/Blocks/Video/Body.d.ts +5 -0
  56. package/types/config/RichTextEditor/index.d.ts +5 -8
  57. package/types/helpers/AsyncConnect/index.d.ts +2 -2
  58. package/types/helpers/Url/Url.d.ts +3 -3
  59. package/types/icons/load-icons.d.ts +1 -1
  60. package/webpack-plugins/webpack-less-plugin.js +1 -0
  61. package/CODE_OF_CONDUCT.md +0 -13
  62. package/CONTRIBUTING.md +0 -7
  63. package/README.md +0 -154
  64. package/RELEASING.md +0 -73
  65. package/ROADMAP.md +0 -30
  66. package/SECURITY.md +0 -14
  67. package/logos/Logo.png +0 -0
  68. package/logos/VoltoLogoEra2-dark-mode.png +0 -0
  69. package/logos/VoltoLogoEra2.png +0 -0
  70. package/logos/volto-colorful.png +0 -0
  71. package/logos/volto-colorful.svg +0 -35
  72. package/logos/volto-guide.png +0 -0
  73. package/logos/volto-h-transparent.svg +0 -6
  74. package/logos/volto-transparent.png +0 -0
  75. package/logos/volto-transparent.svg +0 -19
  76. package/logos/volto-transparent2.svg +0 -5
  77. package/logos/volto-yellow.svg +0 -29
  78. package/logos/volto.sketch +0 -0
  79. package/packages/README.md +0 -7
  80. package/packages/registry/.towncrier/towncrier_template.jinja +0 -10
  81. package/packages/registry/CHANGELOG.md +0 -16
  82. package/packages/registry/README.md +0 -207
  83. package/packages/registry/addon-registry.js +0 -603
  84. package/packages/registry/create-addons-loader.js +0 -116
  85. package/packages/registry/create-theme-addons-loader.js +0 -78
  86. package/packages/registry/news/.gitkeep +0 -0
  87. package/packages/registry/package.json +0 -76
  88. package/packages/registry/src/index.ts +0 -174
  89. package/packages/registry/src/registry.test.js +0 -111
  90. package/packages/registry/tsconfig.json +0 -32
  91. package/packages/scripts/CHANGELOG.md +0 -173
  92. package/packages/scripts/README.md +0 -128
  93. package/packages/scripts/addon/consolidate.js +0 -28
  94. package/packages/scripts/addon/generators.js +0 -213
  95. package/packages/scripts/addon/getAddonInfo.js +0 -65
  96. package/packages/scripts/addon/index.js +0 -88
  97. package/packages/scripts/addon/utils.js +0 -44
  98. package/packages/scripts/backportpr.js +0 -75
  99. package/packages/scripts/changelogupdater.cjs +0 -94
  100. package/packages/scripts/corepackagebump.js +0 -20
  101. package/packages/scripts/i18n.cjs +0 -310
  102. package/packages/scripts/package.json +0 -76
  103. package/packages/scripts/templates/towncrier_template.jinja +0 -10
  104. package/packages/types/Blocks/View.ts +0 -11
  105. package/packages/types/actions.ts +0 -15
  106. package/packages/types/breadcrumbs.ts +0 -10
  107. package/packages/types/config/Blocks.ts +0 -153
  108. package/packages/types/config/Content.ts +0 -62
  109. package/packages/types/config/Settings.ts +0 -86
  110. package/packages/types/config/Views.ts +0 -15
  111. package/packages/types/config/Widgets.ts +0 -7
  112. package/packages/types/config/index.ts +0 -21
  113. package/packages/types/content/common.ts +0 -60
  114. package/packages/types/content/get.ts +0 -66
  115. package/packages/types/index.ts +0 -0
  116. package/packages/types/navigation.ts +0 -12
  117. package/packages/types/package.json +0 -64
  118. package/packages/types/types.ts +0 -61
  119. package/packages/volto-slate/.i18n.babel.config.js +0 -1
  120. package/packages/volto-slate/README.md +0 -4
  121. package/packages/volto-slate/build/messages/src/blocks/Table/TableBlockEdit.json +0 -90
  122. package/packages/volto-slate/build/messages/src/blocks/Text/DefaultTextBlockEditor.json +0 -6
  123. package/packages/volto-slate/build/messages/src/blocks/Text/DetachedTextBlockEditor.json +0 -6
  124. package/packages/volto-slate/build/messages/src/blocks/Text/SlashMenu.json +0 -6
  125. package/packages/volto-slate/build/messages/src/editor/plugins/AdvancedLink/index.json +0 -10
  126. package/packages/volto-slate/build/messages/src/editor/plugins/Link/index.json +0 -10
  127. package/packages/volto-slate/build/messages/src/editor/plugins/Table/index.json +0 -30
  128. package/packages/volto-slate/build/messages/src/elementEditor/messages.json +0 -10
  129. package/packages/volto-slate/build/messages/src/widgets/HtmlSlateWidget.json +0 -6
  130. package/packages/volto-slate/build/messages/src/widgets/RichTextWidgetView.json +0 -6
  131. package/packages/volto-slate/locales/de/LC_MESSAGES/volto.po +0 -148
  132. package/packages/volto-slate/locales/en/LC_MESSAGES/volto.po +0 -148
  133. package/packages/volto-slate/locales/volto.pot +0 -182
  134. package/packages/volto-slate/package.json +0 -43
  135. package/packages/volto-slate/src/actions/content.js +0 -30
  136. package/packages/volto-slate/src/actions/index.js +0 -3
  137. package/packages/volto-slate/src/actions/plugins.js +0 -9
  138. package/packages/volto-slate/src/actions/selection.js +0 -22
  139. package/packages/volto-slate/src/blocks/Table/Cell.jsx +0 -87
  140. package/packages/volto-slate/src/blocks/Table/Cell.test.js +0 -54
  141. package/packages/volto-slate/src/blocks/Table/TableBlockEdit.jsx +0 -694
  142. package/packages/volto-slate/src/blocks/Table/TableBlockEdit.test.js +0 -40
  143. package/packages/volto-slate/src/blocks/Table/TableBlockView.jsx +0 -150
  144. package/packages/volto-slate/src/blocks/Table/TableBlockView.test.js +0 -49
  145. package/packages/volto-slate/src/blocks/Table/deconstruct.js +0 -113
  146. package/packages/volto-slate/src/blocks/Table/extensions/normalizeTable.js +0 -5
  147. package/packages/volto-slate/src/blocks/Table/index.js +0 -60
  148. package/packages/volto-slate/src/blocks/Table/schema.js +0 -122
  149. package/packages/volto-slate/src/blocks/Text/DefaultTextBlockEditor.jsx +0 -304
  150. package/packages/volto-slate/src/blocks/Text/DetachedTextBlockEditor.jsx +0 -77
  151. package/packages/volto-slate/src/blocks/Text/MarkdownIntroduction.jsx +0 -59
  152. package/packages/volto-slate/src/blocks/Text/PluginSidebar.jsx +0 -18
  153. package/packages/volto-slate/src/blocks/Text/ShortcutListing.jsx +0 -28
  154. package/packages/volto-slate/src/blocks/Text/SlashMenu.jsx +0 -203
  155. package/packages/volto-slate/src/blocks/Text/TextBlockEdit.jsx +0 -38
  156. package/packages/volto-slate/src/blocks/Text/TextBlockEdit.test.js +0 -107
  157. package/packages/volto-slate/src/blocks/Text/TextBlockSchema.js +0 -54
  158. package/packages/volto-slate/src/blocks/Text/TextBlockView.jsx +0 -31
  159. package/packages/volto-slate/src/blocks/Text/css/editor.css +0 -18
  160. package/packages/volto-slate/src/blocks/Text/extensions/Readme.md +0 -49
  161. package/packages/volto-slate/src/blocks/Text/extensions/breakList.js +0 -100
  162. package/packages/volto-slate/src/blocks/Text/extensions/index.js +0 -6
  163. package/packages/volto-slate/src/blocks/Text/extensions/insertBreak.js +0 -57
  164. package/packages/volto-slate/src/blocks/Text/extensions/isSelected.js +0 -7
  165. package/packages/volto-slate/src/blocks/Text/extensions/normalizeExternalData.js +0 -7
  166. package/packages/volto-slate/src/blocks/Text/extensions/withDeserializers.js +0 -87
  167. package/packages/volto-slate/src/blocks/Text/extensions/withLists.js +0 -5
  168. package/packages/volto-slate/src/blocks/Text/index.js +0 -171
  169. package/packages/volto-slate/src/blocks/Text/keyboard/backspaceInList.js +0 -58
  170. package/packages/volto-slate/src/blocks/Text/keyboard/breakBlocks.js +0 -3
  171. package/packages/volto-slate/src/blocks/Text/keyboard/cancelEsc.js +0 -7
  172. package/packages/volto-slate/src/blocks/Text/keyboard/indentListItems.js +0 -240
  173. package/packages/volto-slate/src/blocks/Text/keyboard/index.js +0 -52
  174. package/packages/volto-slate/src/blocks/Text/keyboard/joinBlocks.js +0 -180
  175. package/packages/volto-slate/src/blocks/Text/keyboard/moveListItems.js +0 -124
  176. package/packages/volto-slate/src/blocks/Text/keyboard/slashMenu.js +0 -19
  177. package/packages/volto-slate/src/blocks/Text/keyboard/softBreak.js +0 -7
  178. package/packages/volto-slate/src/blocks/Text/keyboard/traverseBlocks.js +0 -81
  179. package/packages/volto-slate/src/blocks/Text/keyboard/unwrapEmptyString.js +0 -26
  180. package/packages/volto-slate/src/blocks/Text/schema.js +0 -39
  181. package/packages/volto-slate/src/constants.js +0 -123
  182. package/packages/volto-slate/src/editor/EditorContext.jsx +0 -5
  183. package/packages/volto-slate/src/editor/EditorReference.jsx +0 -22
  184. package/packages/volto-slate/src/editor/SlateEditor.jsx +0 -375
  185. package/packages/volto-slate/src/editor/config.jsx +0 -344
  186. package/packages/volto-slate/src/editor/decorate.js +0 -68
  187. package/packages/volto-slate/src/editor/deserialize.js +0 -185
  188. package/packages/volto-slate/src/editor/extensions/index.js +0 -6
  189. package/packages/volto-slate/src/editor/extensions/insertBreak.js +0 -15
  190. package/packages/volto-slate/src/editor/extensions/insertData.js +0 -159
  191. package/packages/volto-slate/src/editor/extensions/isInline.js +0 -14
  192. package/packages/volto-slate/src/editor/extensions/normalizeExternalData.js +0 -8
  193. package/packages/volto-slate/src/editor/extensions/normalizeNode.js +0 -48
  194. package/packages/volto-slate/src/editor/extensions/withDeserializers.js +0 -15
  195. package/packages/volto-slate/src/editor/extensions/withTestingFeatures.jsx +0 -84
  196. package/packages/volto-slate/src/editor/index.js +0 -14
  197. package/packages/volto-slate/src/editor/less/editor.less +0 -173
  198. package/packages/volto-slate/src/editor/less/globals.less +0 -18
  199. package/packages/volto-slate/src/editor/less/slate.less +0 -28
  200. package/packages/volto-slate/src/editor/plugins/AdvancedLink/deserialize.js +0 -90
  201. package/packages/volto-slate/src/editor/plugins/AdvancedLink/extensions.js +0 -32
  202. package/packages/volto-slate/src/editor/plugins/AdvancedLink/index.js +0 -50
  203. package/packages/volto-slate/src/editor/plugins/AdvancedLink/render.jsx +0 -37
  204. package/packages/volto-slate/src/editor/plugins/AdvancedLink/schema.js +0 -114
  205. package/packages/volto-slate/src/editor/plugins/AdvancedLink/styles.less +0 -8
  206. package/packages/volto-slate/src/editor/plugins/Blockquote/index.js +0 -30
  207. package/packages/volto-slate/src/editor/plugins/Callout/index.js +0 -34
  208. package/packages/volto-slate/src/editor/plugins/Image/deconstruct.js +0 -30
  209. package/packages/volto-slate/src/editor/plugins/Image/extensions.js +0 -51
  210. package/packages/volto-slate/src/editor/plugins/Image/index.js +0 -11
  211. package/packages/volto-slate/src/editor/plugins/Image/render.jsx +0 -22
  212. package/packages/volto-slate/src/editor/plugins/Link/extensions.js +0 -58
  213. package/packages/volto-slate/src/editor/plugins/Link/index.js +0 -164
  214. package/packages/volto-slate/src/editor/plugins/Link/render.jsx +0 -54
  215. package/packages/volto-slate/src/editor/plugins/Markdown/constants.js +0 -81
  216. package/packages/volto-slate/src/editor/plugins/Markdown/extensions.js +0 -334
  217. package/packages/volto-slate/src/editor/plugins/Markdown/index.js +0 -28
  218. package/packages/volto-slate/src/editor/plugins/Markdown/utils.js +0 -198
  219. package/packages/volto-slate/src/editor/plugins/StyleMenu/StyleMenu.jsx +0 -153
  220. package/packages/volto-slate/src/editor/plugins/StyleMenu/index.js +0 -19
  221. package/packages/volto-slate/src/editor/plugins/StyleMenu/style.less +0 -29
  222. package/packages/volto-slate/src/editor/plugins/StyleMenu/utils.js +0 -168
  223. package/packages/volto-slate/src/editor/plugins/Table/TableButton.jsx +0 -142
  224. package/packages/volto-slate/src/editor/plugins/Table/TableCell.jsx +0 -44
  225. package/packages/volto-slate/src/editor/plugins/Table/TableContainer.jsx +0 -37
  226. package/packages/volto-slate/src/editor/plugins/Table/TableSizePicker.jsx +0 -83
  227. package/packages/volto-slate/src/editor/plugins/Table/extensions.js +0 -87
  228. package/packages/volto-slate/src/editor/plugins/Table/index.js +0 -390
  229. package/packages/volto-slate/src/editor/plugins/Table/less/public.less +0 -29
  230. package/packages/volto-slate/src/editor/plugins/Table/less/table.less +0 -28
  231. package/packages/volto-slate/src/editor/plugins/Table/render.jsx +0 -30
  232. package/packages/volto-slate/src/editor/plugins/index.js +0 -19
  233. package/packages/volto-slate/src/editor/render.jsx +0 -224
  234. package/packages/volto-slate/src/editor/ui/BasicToolbar.jsx +0 -11
  235. package/packages/volto-slate/src/editor/ui/BlockButton.jsx +0 -31
  236. package/packages/volto-slate/src/editor/ui/ClearFormattingButton.jsx +0 -21
  237. package/packages/volto-slate/src/editor/ui/ExpandedToolbar.jsx +0 -18
  238. package/packages/volto-slate/src/editor/ui/Expando.jsx +0 -5
  239. package/packages/volto-slate/src/editor/ui/InlineToolbar.jsx +0 -73
  240. package/packages/volto-slate/src/editor/ui/MarkButton.jsx +0 -23
  241. package/packages/volto-slate/src/editor/ui/MarkElementButton.jsx +0 -30
  242. package/packages/volto-slate/src/editor/ui/Menu.jsx +0 -13
  243. package/packages/volto-slate/src/editor/ui/PositionedToolbar.jsx +0 -32
  244. package/packages/volto-slate/src/editor/ui/Separator.jsx +0 -7
  245. package/packages/volto-slate/src/editor/ui/SlateContextToolbar.jsx +0 -13
  246. package/packages/volto-slate/src/editor/ui/SlateToolbar.jsx +0 -96
  247. package/packages/volto-slate/src/editor/ui/Toolbar.jsx +0 -103
  248. package/packages/volto-slate/src/editor/ui/ToolbarButton.jsx +0 -33
  249. package/packages/volto-slate/src/editor/ui/ToolbarButton.test.js +0 -25
  250. package/packages/volto-slate/src/editor/ui/index.js +0 -15
  251. package/packages/volto-slate/src/editor/utils.js +0 -248
  252. package/packages/volto-slate/src/elementEditor/ContextButtons.jsx +0 -56
  253. package/packages/volto-slate/src/elementEditor/PluginEditor.jsx +0 -124
  254. package/packages/volto-slate/src/elementEditor/Readme.md +0 -6
  255. package/packages/volto-slate/src/elementEditor/SchemaProvider.jsx +0 -3
  256. package/packages/volto-slate/src/elementEditor/SidebarEditor.jsx +0 -46
  257. package/packages/volto-slate/src/elementEditor/ToolbarButton.jsx +0 -44
  258. package/packages/volto-slate/src/elementEditor/index.js +0 -5
  259. package/packages/volto-slate/src/elementEditor/makeInlineElementPlugin.js +0 -100
  260. package/packages/volto-slate/src/elementEditor/messages.js +0 -14
  261. package/packages/volto-slate/src/elementEditor/utils.js +0 -226
  262. package/packages/volto-slate/src/hooks/index.js +0 -3
  263. package/packages/volto-slate/src/hooks/useEditorContext.js +0 -6
  264. package/packages/volto-slate/src/hooks/useIsomorphicLayoutEffect.js +0 -7
  265. package/packages/volto-slate/src/hooks/useSelectionPosition.js +0 -25
  266. package/packages/volto-slate/src/i18n.js +0 -180
  267. package/packages/volto-slate/src/icons/hashlink.svg +0 -57
  268. package/packages/volto-slate/src/index.js +0 -61
  269. package/packages/volto-slate/src/reducers/content.js +0 -74
  270. package/packages/volto-slate/src/reducers/index.js +0 -3
  271. package/packages/volto-slate/src/reducers/plugins.js +0 -17
  272. package/packages/volto-slate/src/reducers/selection.js +0 -16
  273. package/packages/volto-slate/src/utils/blocks.js +0 -375
  274. package/packages/volto-slate/src/utils/blocks.test.js +0 -138
  275. package/packages/volto-slate/src/utils/editor.js +0 -31
  276. package/packages/volto-slate/src/utils/image.js +0 -25
  277. package/packages/volto-slate/src/utils/index.js +0 -11
  278. package/packages/volto-slate/src/utils/internals.js +0 -46
  279. package/packages/volto-slate/src/utils/lists.js +0 -92
  280. package/packages/volto-slate/src/utils/marks.js +0 -104
  281. package/packages/volto-slate/src/utils/mime-types.js +0 -24
  282. package/packages/volto-slate/src/utils/nodes.js +0 -4
  283. package/packages/volto-slate/src/utils/ops.js +0 -20
  284. package/packages/volto-slate/src/utils/random.js +0 -17
  285. package/packages/volto-slate/src/utils/selection.js +0 -236
  286. package/packages/volto-slate/src/utils/slate-string-utils.js +0 -408
  287. package/packages/volto-slate/src/utils/volto-blocks.js +0 -314
  288. package/packages/volto-slate/src/widgets/ErrorBoundary.jsx +0 -27
  289. package/packages/volto-slate/src/widgets/HtmlSlateWidget.jsx +0 -139
  290. package/packages/volto-slate/src/widgets/ObjectByTypeWidget.jsx +0 -49
  291. package/packages/volto-slate/src/widgets/RichTextWidget.jsx +0 -72
  292. package/packages/volto-slate/src/widgets/RichTextWidgetView.jsx +0 -37
  293. package/packages/volto-slate/src/widgets/style.css +0 -21
@@ -1,694 +0,0 @@
1
- /**
2
- * Slate Table block editor.
3
- * @module volto-slate/blocks/Table/Edit
4
- */
5
-
6
- import React, { Component } from 'react';
7
- import PropTypes from 'prop-types';
8
- import { map, remove } from 'lodash';
9
- import { Button, Table } from 'semantic-ui-react';
10
- import cx from 'classnames';
11
- import { defineMessages, injectIntl } from 'react-intl';
12
-
13
- import Cell from './Cell';
14
- import { BlockDataForm, Icon, SidebarPortal } from '@plone/volto/components';
15
- import TableSchema from './schema';
16
-
17
- import rowBeforeSVG from '@plone/volto/icons/row-before.svg';
18
- import rowAfterSVG from '@plone/volto/icons/row-after.svg';
19
- import colBeforeSVG from '@plone/volto/icons/column-before.svg';
20
- import colAfterSVG from '@plone/volto/icons/column-after.svg';
21
- import rowDeleteSVG from '@plone/volto/icons/row-delete.svg';
22
- import colDeleteSVG from '@plone/volto/icons/column-delete.svg';
23
-
24
- /**
25
- * Returns a random string of 32 digits.
26
- */
27
- const getId = () => Math.floor(Math.random() * Math.pow(2, 24)).toString(32);
28
-
29
- /**
30
- * @returns {object} An empty Slate paragraph (a simple Slate block node with
31
- * type set to "p" and a `Text` child with an empty string).
32
- */
33
- function getEmptyParagraph() {
34
- return [{ type: 'p', children: [{ text: '' }] }];
35
- }
36
-
37
- /**
38
- * @param {string} type The type of the newly created cell: either 'header' or
39
- * 'data', by default it is 'data'.
40
- * @returns {object} A new cell object containing three properties: `key`,
41
- * `type` and `value`.
42
- */
43
- const emptyCell = (type = 'data') => ({
44
- key: getId(),
45
- type: type,
46
- value: getEmptyParagraph(),
47
- });
48
-
49
- /**
50
- * @param {Array[object]} cells Array of placeholders, each of them will be
51
- * replaced in the newly created row with an empty cell. (Practically, just the
52
- * length of the array matters.)
53
- * @returns {object} A new row object containing the keys `key` and `cells`.
54
- */
55
- const emptyRow = (cells) => ({
56
- key: getId(),
57
- cells: map(cells, () => emptyCell()),
58
- });
59
-
60
- /**
61
- * The initial value for the displayed table's data. The IDs of the rows and
62
- * cells are computed here only once, so each new table has the same IDs
63
- * initially, but this does not have bad consequences since the key has
64
- * relevance only in the context in which it is used.
65
- */
66
- const initialTable = {
67
- hideHeaders: false,
68
- fixed: true,
69
- compact: false,
70
- basic: false,
71
- celled: true,
72
- inverted: false,
73
- striped: false,
74
- rows: [
75
- {
76
- key: getId(),
77
- cells: [
78
- {
79
- key: getId(),
80
- type: 'header',
81
- value: getEmptyParagraph(),
82
- },
83
- {
84
- key: getId(),
85
- type: 'header',
86
- value: getEmptyParagraph(),
87
- },
88
- ],
89
- },
90
- {
91
- key: getId(),
92
- cells: [
93
- {
94
- key: getId(),
95
- type: 'data',
96
- value: getEmptyParagraph(),
97
- },
98
- {
99
- key: getId(),
100
- type: 'data',
101
- value: getEmptyParagraph(),
102
- },
103
- ],
104
- },
105
- ],
106
- };
107
-
108
- const messages = defineMessages({
109
- insertRowBefore: {
110
- id: 'Insert row before',
111
- defaultMessage: 'Insert row before',
112
- },
113
- insertRowAfter: {
114
- id: 'Insert row after',
115
- defaultMessage: 'Insert row after',
116
- },
117
- deleteRow: {
118
- id: 'Delete row',
119
- defaultMessage: 'Delete row',
120
- },
121
- insertColBefore: {
122
- id: 'Insert col before',
123
- defaultMessage: 'Insert col before',
124
- },
125
- insertColAfter: {
126
- id: 'Insert col after',
127
- defaultMessage: 'Insert col after',
128
- },
129
- deleteCol: {
130
- id: 'Delete col',
131
- defaultMessage: 'Delete col',
132
- },
133
- left: {
134
- id: 'Left',
135
- defaultMessage: 'Left',
136
- },
137
- center: {
138
- id: 'Center',
139
- defaultMessage: 'Center',
140
- },
141
- right: {
142
- id: 'Right',
143
- defaultMessage: 'Right',
144
- },
145
- bottom: {
146
- id: 'Bottom',
147
- defaultMessage: 'Bottom',
148
- },
149
- middle: {
150
- id: 'Middle',
151
- defaultMessage: 'Middle',
152
- },
153
- top: {
154
- id: 'Top',
155
- defaultMessage: 'Top',
156
- },
157
- });
158
-
159
- /**
160
- * Edit component for the Slate Table block type in Volto.
161
- * @class Edit
162
- * @extends Component
163
- */
164
- class Edit extends Component {
165
- /**
166
- * Property types.
167
- * @property {Object} propTypes Property types.
168
- * @static
169
- */
170
- static propTypes = {
171
- data: PropTypes.objectOf(PropTypes.any).isRequired,
172
- detached: PropTypes.bool,
173
- index: PropTypes.number.isRequired,
174
- selected: PropTypes.bool.isRequired,
175
- block: PropTypes.string.isRequired,
176
- onAddBlock: PropTypes.func.isRequired,
177
- onChangeBlock: PropTypes.func.isRequired,
178
- onDeleteBlock: PropTypes.func.isRequired,
179
- onInsertBlock: PropTypes.func.isRequired,
180
- onMutateBlock: PropTypes.func.isRequired,
181
- onFocusPreviousBlock: PropTypes.func.isRequired,
182
- onFocusNextBlock: PropTypes.func.isRequired,
183
- onSelectBlock: PropTypes.func.isRequired,
184
- };
185
-
186
- /**
187
- * Default properties
188
- * @property {Object} defaultProps Default properties.
189
- * @static
190
- */
191
- static defaultProps = {
192
- detached: false,
193
- };
194
-
195
- /**
196
- * Constructor
197
- * @method constructor
198
- * @param {Object} props Component properties
199
- * @constructs WysiwygEditor
200
- */
201
- constructor(props) {
202
- super(props);
203
- this.state = {
204
- headers: [],
205
- rows: {},
206
- selected: {
207
- row: 0,
208
- cell: 0,
209
- },
210
- isClient: false,
211
- };
212
- this.onChange = this.onChange.bind(this);
213
- this.onSelectCell = this.onSelectCell.bind(this);
214
- this.onInsertRowBefore = this.onInsertRowBefore.bind(this);
215
- this.onInsertRowAfter = this.onInsertRowAfter.bind(this);
216
- this.onInsertColBefore = this.onInsertColBefore.bind(this);
217
- this.onInsertColAfter = this.onInsertColAfter.bind(this);
218
- this.onDeleteRow = this.onDeleteRow.bind(this);
219
- this.onDeleteCol = this.onDeleteCol.bind(this);
220
- this.onChangeCell = this.onChangeCell.bind(this);
221
- this.toggleCellType = this.toggleCellType.bind(this);
222
- }
223
-
224
- /**
225
- * Component did mount lifecycle method
226
- * @method componentDidMount
227
- * @returns {undefined}
228
- */
229
- componentDidMount() {
230
- if (!this.props.data.table) {
231
- this.props.onChangeBlock(this.props.block, {
232
- ...this.props.data,
233
- table: initialTable,
234
- });
235
- }
236
- this.setState({ isClient: true });
237
- }
238
-
239
- /**
240
- * Component will receive props lifecycle method
241
- * @method componentWillReceiveProps
242
- * @param {Object} nextProps Next properties
243
- * @returns {undefined}
244
- */
245
- UNSAFE_componentWillReceiveProps(nextProps) {
246
- if (!nextProps.data.table) {
247
- this.props.onChangeBlock(nextProps.block, {
248
- ...nextProps.data,
249
- table: initialTable,
250
- });
251
- }
252
- }
253
-
254
- /**
255
- * On change
256
- * @method onChange
257
- * @param {string} id Id of modified property.
258
- * @param {any} value New value of modified property.
259
- * @returns {undefined}
260
- */
261
- onChange(id, value) {
262
- const table = this.props.data.table;
263
- this.props.onChangeBlock(this.props.block, {
264
- ...this.props.data,
265
- table: {
266
- ...table,
267
- [id]: value,
268
- },
269
- });
270
- }
271
-
272
- /**
273
- * Select cell handler
274
- * @method onSelectCell
275
- * @param {Number} row Row index.
276
- * @param {Number} cell Cell index.
277
- * @returns {undefined}
278
- */
279
- onSelectCell(row, cell) {
280
- this.setState({ selected: { row, cell } });
281
- }
282
-
283
- /**
284
- * Change cell handler
285
- * @param {Number} row Row index.
286
- * @param {Number} cell Cell index.
287
- * @param {Array} slateValue Value of the `SlateEditor` in the cell.
288
- * @returns {undefined}
289
- */
290
- onChangeCell(row, cell, slateValue) {
291
- const table = JSON.parse(JSON.stringify(this.props.data.table));
292
- table.rows[row].cells[cell] = {
293
- ...table.rows[row].cells[cell],
294
- value: JSON.parse(JSON.stringify(slateValue)),
295
- };
296
- this.props.onChangeBlock(this.props.block, {
297
- ...this.props.data,
298
- table,
299
- });
300
- }
301
-
302
- /**
303
- * Toggle cell type (from header to data or reverse)
304
- * @method toggleCellType
305
- * @returns {undefined}
306
- */
307
- toggleCellType() {
308
- const table = { ...this.props.data.table };
309
- let type =
310
- table.rows[this.state.selected.row].cells[this.state.selected.cell].type;
311
- table.rows[this.state.selected.row].cells[this.state.selected.cell].type =
312
- type === 'header' ? 'data' : 'header';
313
- this.props.onChangeBlock(this.props.block, {
314
- ...this.props.data,
315
- table,
316
- });
317
- }
318
-
319
- /**
320
- * Insert row before handler. Keeps the selected cell as selected after the
321
- * operation is done.
322
- * @returns {undefined}
323
- */
324
- onInsertRowBefore() {
325
- const table = this.props.data.table;
326
- this.props.onChangeBlock(this.props.block, {
327
- ...this.props.data,
328
- table: {
329
- ...table,
330
- rows: [
331
- ...table.rows.slice(0, this.state.selected.row),
332
- emptyRow(table.rows[0].cells),
333
- ...table.rows.slice(this.state.selected.row),
334
- ],
335
- },
336
- });
337
- this.setState({
338
- selected: {
339
- row: this.state.selected.row + 1,
340
- cell: this.state.selected.cell,
341
- },
342
- });
343
- }
344
-
345
- /**
346
- * Insert row after handler
347
- * @returns {undefined}
348
- */
349
- onInsertRowAfter() {
350
- const table = this.props.data.table;
351
- this.props.onChangeBlock(this.props.block, {
352
- ...this.props.data,
353
- table: {
354
- ...table,
355
- rows: [
356
- ...table.rows.slice(0, this.state.selected.row + 1),
357
- emptyRow(table.rows[0].cells),
358
- ...table.rows.slice(this.state.selected.row + 1),
359
- ],
360
- },
361
- });
362
- }
363
-
364
- /**
365
- * Insert column before handler. Keeps the selected cell as selected after the
366
- * operation is done.
367
- * @returns {undefined}
368
- */
369
- onInsertColBefore() {
370
- const table = this.props.data.table;
371
- this.props.onChangeBlock(this.props.block, {
372
- ...this.props.data,
373
- table: {
374
- ...table,
375
- rows: map(table.rows, (row, index) => ({
376
- ...row,
377
- cells: [
378
- ...row.cells.slice(0, this.state.selected.cell),
379
- emptyCell(table.rows[index].cells[this.state.selected.cell].type),
380
- ...row.cells.slice(this.state.selected.cell),
381
- ],
382
- })),
383
- },
384
- });
385
- this.setState({
386
- selected: {
387
- row: this.state.selected.row,
388
- cell: this.state.selected.cell + 1,
389
- },
390
- });
391
- }
392
-
393
- /**
394
- * Insert column after handler
395
- * @returns {undefined}
396
- */
397
- onInsertColAfter() {
398
- const table = this.props.data.table;
399
- this.props.onChangeBlock(this.props.block, {
400
- ...this.props.data,
401
- table: {
402
- ...table,
403
- rows: map(table.rows, (row, index) => ({
404
- ...row,
405
- cells: [
406
- ...row.cells.slice(0, this.state.selected.cell + 1),
407
- emptyCell(table.rows[index].cells[this.state.selected.cell].type),
408
- ...row.cells.slice(this.state.selected.cell + 1),
409
- ],
410
- })),
411
- },
412
- });
413
- }
414
-
415
- /**
416
- * Delete column handler. Changes the selected cell if the last table column
417
- * is selected.
418
- * @returns {undefined}
419
- */
420
- onDeleteCol() {
421
- const table = this.props.data.table;
422
-
423
- if (this.state.selected.cell === table.rows[0].cells.length - 1) {
424
- this.setState({
425
- selected: {
426
- row: this.state.selected.row,
427
- cell: this.state.selected.cell - 1,
428
- },
429
- });
430
- }
431
-
432
- this.props.onChangeBlock(this.props.block, {
433
- ...this.props.data,
434
- table: {
435
- ...table,
436
- rows: map(table.rows, (row) => ({
437
- ...row,
438
- cells: remove(
439
- row.cells,
440
- (cell, index) => index !== this.state.selected.cell,
441
- ),
442
- })),
443
- },
444
- });
445
- }
446
-
447
- /**
448
- * Delete row handler. Changes the selected cell if the last table row is
449
- * selected.
450
- * @method onDeleteRow
451
- * @returns {undefined}
452
- */
453
- onDeleteRow() {
454
- const table = this.props.data.table;
455
-
456
- if (this.state.selected.row === table.rows.length - 1) {
457
- this.setState({
458
- selected: {
459
- row: this.state.selected.row - 1,
460
- cell: this.state.selected.cell,
461
- },
462
- });
463
- }
464
-
465
- this.props.onChangeBlock(this.props.block, {
466
- ...this.props.data,
467
- table: {
468
- ...table,
469
- rows: remove(
470
- table.rows,
471
- (row, index) => index !== this.state.selected.row,
472
- ),
473
- },
474
- });
475
- }
476
-
477
- componentDidUpdate(prevProps) {
478
- if (prevProps.selected && !this.props.selected) {
479
- this.setState({ selected: null });
480
- }
481
- }
482
-
483
- /**
484
- * Render method.
485
- * @method render
486
- * @returns {string} Markup for the component.
487
- */
488
- render() {
489
- const headers = this.props.data.table?.rows?.[0]?.cells || [];
490
- const rows =
491
- this.props.data.table?.rows?.filter((_, index) => index > 0) || [];
492
- const schema = TableSchema(this.props);
493
-
494
- return (
495
- // TODO: use slate-table instead of table, but first copy the CSS styles
496
- // to the new name
497
- <div className={cx('block table', { selected: this.props.selected })}>
498
- {this.props.selected && (
499
- <div className="toolbar">
500
- <Button.Group>
501
- <Button
502
- icon
503
- basic
504
- onClick={this.onInsertRowBefore}
505
- title={this.props.intl.formatMessage(messages.insertRowBefore)}
506
- aria-label={this.props.intl.formatMessage(
507
- messages.insertRowBefore,
508
- )}
509
- >
510
- <Icon name={rowBeforeSVG} size="24px" />
511
- </Button>
512
- </Button.Group>
513
- <Button.Group>
514
- <Button
515
- icon
516
- basic
517
- onClick={this.onInsertRowAfter}
518
- title={this.props.intl.formatMessage(messages.insertRowAfter)}
519
- aria-label={this.props.intl.formatMessage(
520
- messages.insertRowAfter,
521
- )}
522
- >
523
- <Icon name={rowAfterSVG} size="24px" />
524
- </Button>
525
- </Button.Group>
526
- <Button.Group>
527
- <Button
528
- icon
529
- basic
530
- onClick={this.onDeleteRow}
531
- disabled={
532
- this.props.data.table &&
533
- this.props.data.table.rows.length === 1
534
- }
535
- title={this.props.intl.formatMessage(messages.deleteRow)}
536
- aria-label={this.props.intl.formatMessage(messages.deleteRow)}
537
- >
538
- <Icon name={rowDeleteSVG} size="24px" />
539
- </Button>
540
- </Button.Group>
541
- <Button.Group>
542
- <Button
543
- icon
544
- basic
545
- onClick={this.onInsertColBefore}
546
- title={this.props.intl.formatMessage(messages.insertColBefore)}
547
- aria-label={this.props.intl.formatMessage(
548
- messages.insertColBefore,
549
- )}
550
- >
551
- <Icon name={colBeforeSVG} size="24px" />
552
- </Button>
553
- </Button.Group>
554
- <Button.Group>
555
- <Button
556
- icon
557
- basic
558
- onClick={this.onInsertColAfter}
559
- title={this.props.intl.formatMessage(messages.insertColAfter)}
560
- aria-label={this.props.intl.formatMessage(
561
- messages.insertColAfter,
562
- )}
563
- >
564
- <Icon name={colAfterSVG} size="24px" />
565
- </Button>
566
- </Button.Group>
567
- <Button.Group>
568
- <Button
569
- icon
570
- basic
571
- onClick={this.onDeleteCol}
572
- disabled={
573
- this.props.data.table &&
574
- this.props.data.table.rows[0].cells.length === 1
575
- }
576
- title={this.props.intl.formatMessage(messages.deleteCol)}
577
- aria-label={this.props.intl.formatMessage(messages.deleteCol)}
578
- >
579
- <Icon name={colDeleteSVG} size="24px" />
580
- </Button>
581
- </Button.Group>
582
- </div>
583
- )}
584
- {this.props.data.table && (
585
- <Table
586
- fixed={this.props.data.table.fixed}
587
- compact={this.props.data.table.compact}
588
- basic={this.props.data.table.basic ? 'very' : false}
589
- celled={this.props.data.table.celled}
590
- inverted={this.props.data.table.inverted}
591
- striped={this.props.data.table.striped}
592
- className="slate-table-block"
593
- >
594
- {!this.props.data.table.hideHeaders ? (
595
- <Table.Header>
596
- <Table.Row textAlign="left">
597
- {headers.map((cell, cellIndex) => (
598
- <Table.HeaderCell
599
- key={cell.key}
600
- textAlign="left"
601
- verticalAlign="middle"
602
- >
603
- <Cell
604
- value={cell.value}
605
- row={0}
606
- cell={cellIndex}
607
- onSelectCell={this.onSelectCell}
608
- selected={
609
- this.props.selected &&
610
- this.state.selected &&
611
- 0 === this.state.selected.row &&
612
- cellIndex === this.state.selected.cell
613
- }
614
- selectedCell={this.state.selected}
615
- isTableBlockSelected={this.props.selected}
616
- onAddBlock={this.props.onAddBlock}
617
- onSelectBlock={this.props.onSelectBlock}
618
- onChange={this.onChangeCell}
619
- index={this.props.index}
620
- />
621
- </Table.HeaderCell>
622
- ))}
623
- </Table.Row>
624
- </Table.Header>
625
- ) : (
626
- ''
627
- )}
628
- <Table.Body>
629
- {map(rows, (row, rowIndex) => (
630
- <Table.Row key={row.key}>
631
- {map(row.cells, (cell, cellIndex) => (
632
- <Table.Cell
633
- key={cell.key}
634
- textAlign="left"
635
- verticalAlign="middle"
636
- className={
637
- this.props.selected &&
638
- this.state.selected &&
639
- rowIndex + 1 === this.state.selected.row &&
640
- cellIndex === this.state.selected.cell &&
641
- this.props.selected
642
- ? 'selected'
643
- : ''
644
- }
645
- >
646
- <Cell
647
- value={cell.value}
648
- row={rowIndex + 1}
649
- cell={cellIndex}
650
- onSelectCell={this.onSelectCell}
651
- selected={
652
- this.props.selected &&
653
- this.state.selected &&
654
- rowIndex + 1 === this.state.selected.row &&
655
- cellIndex === this.state.selected.cell
656
- }
657
- selectedCell={this.state.selected}
658
- isTableBlockSelected={this.props.selected}
659
- onAddBlock={this.props.onAddBlock}
660
- onSelectBlock={this.props.onSelectBlock}
661
- onChange={this.onChangeCell}
662
- index={this.props.index}
663
- />
664
- </Table.Cell>
665
- ))}
666
- </Table.Row>
667
- ))}
668
- </Table.Body>
669
- </Table>
670
- )}
671
- {this.props.selected && this.state.selected && this.state.isClient && (
672
- <SidebarPortal selected={this.props.selected}>
673
- <BlockDataForm
674
- schema={schema}
675
- title={schema.title}
676
- onChangeField={(id, value) => {
677
- this.props.onChangeBlock(this.props.block, {
678
- ...this.props.data,
679
- [id]: value,
680
- });
681
- }}
682
- onChangeBlock={this.props.onChangeBlock}
683
- formData={this.props.data}
684
- block={this.props.block}
685
- blocksConfig={this.props.blocksConfig}
686
- />
687
- </SidebarPortal>
688
- )}
689
- </div>
690
- );
691
- }
692
- }
693
-
694
- export default injectIntl(Edit);