@plone/volto 17.0.0-alpha.3 → 17.0.0-alpha.30

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 (438) hide show
  1. package/.eslintrc +26 -3
  2. package/.yarn/install-state.gz +0 -0
  3. package/.yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs +541 -0
  4. package/.yarn/releases/yarn-3.6.3.cjs +874 -0
  5. package/CHANGELOG.md +716 -20
  6. package/CONTRIBUTING.md +5 -1
  7. package/README.md +20 -21
  8. package/addon-registry.js +44 -1
  9. package/create-addons-loader.js +1 -1
  10. package/create-theme-addons-loader.js +79 -0
  11. package/cypress/support/commands.js +70 -14
  12. package/cypress/support/e2e.js +1 -2
  13. package/cypress/support/volto-slate.js +4 -5
  14. package/cypress.config.js +1 -0
  15. package/docker-compose.yml +1 -1
  16. package/locales/ca/LC_MESSAGES/volto.po +422 -53
  17. package/locales/ca.json +1 -1
  18. package/locales/de/LC_MESSAGES/volto.po +442 -73
  19. package/locales/de.json +1 -1
  20. package/locales/en/LC_MESSAGES/volto.po +420 -51
  21. package/locales/en.json +1 -1
  22. package/locales/es/LC_MESSAGES/volto.po +431 -62
  23. package/locales/es.json +1 -1
  24. package/locales/eu/LC_MESSAGES/volto.po +421 -52
  25. package/locales/eu.json +1 -1
  26. package/locales/fi/LC_MESSAGES/volto.po +4985 -0
  27. package/locales/fi.json +1 -1
  28. package/locales/fr/LC_MESSAGES/volto.po +422 -53
  29. package/locales/fr.json +1 -1
  30. package/locales/it/LC_MESSAGES/volto.po +589 -220
  31. package/locales/it.json +1 -1
  32. package/locales/ja/LC_MESSAGES/volto.po +421 -52
  33. package/locales/ja.json +1 -1
  34. package/locales/nl/LC_MESSAGES/volto.po +1072 -691
  35. package/locales/nl.json +1 -1
  36. package/locales/pt/LC_MESSAGES/volto.po +422 -53
  37. package/locales/pt.json +1 -1
  38. package/locales/pt_BR/LC_MESSAGES/volto.po +429 -60
  39. package/locales/pt_BR.json +1 -1
  40. package/locales/ro/LC_MESSAGES/volto.po +422 -53
  41. package/locales/ro.json +1 -1
  42. package/locales/volto.pot +425 -52
  43. package/locales/zh_CN/LC_MESSAGES/volto.po +422 -53
  44. package/locales/zh_CN.json +1 -1
  45. package/package.json +46 -35
  46. package/packages/volto-slate/build/messages/src/blocks/Table/TableBlockEdit.json +1 -1
  47. package/packages/volto-slate/build/messages/src/blocks/Text/DefaultTextBlockEditor.json +1 -1
  48. package/packages/volto-slate/build/messages/src/blocks/Text/DetachedTextBlockEditor.json +1 -1
  49. package/packages/volto-slate/build/messages/src/blocks/Text/SlashMenu.json +1 -1
  50. package/packages/volto-slate/build/messages/src/editor/plugins/AdvancedLink/index.json +1 -1
  51. package/packages/volto-slate/build/messages/src/editor/plugins/Link/index.json +1 -1
  52. package/packages/volto-slate/build/messages/src/editor/plugins/Table/index.json +1 -1
  53. package/packages/volto-slate/build/messages/src/elementEditor/messages.json +1 -1
  54. package/packages/volto-slate/build/messages/src/widgets/HtmlSlateWidget.json +1 -1
  55. package/packages/volto-slate/build/messages/src/widgets/RichTextWidgetView.json +1 -1
  56. package/packages/volto-slate/package.json +1 -1
  57. package/packages/volto-slate/src/actions/index.js +1 -1
  58. package/packages/volto-slate/src/blocks/Table/TableBlockEdit.jsx +21 -212
  59. package/packages/volto-slate/src/blocks/Table/schema.js +122 -0
  60. package/packages/volto-slate/src/blocks/Text/DefaultTextBlockEditor.jsx +8 -3
  61. package/packages/volto-slate/src/blocks/Text/SlashMenu.jsx +4 -3
  62. package/packages/volto-slate/src/blocks/Text/TextBlockView.jsx +21 -16
  63. package/packages/volto-slate/src/blocks/Text/extensions/withDeserializers.js +3 -1
  64. package/packages/volto-slate/src/blocks/Text/index.js +10 -7
  65. package/packages/volto-slate/src/editor/config.jsx +5 -4
  66. package/packages/volto-slate/src/editor/deserialize.js +0 -1
  67. package/packages/volto-slate/src/editor/index.js +4 -4
  68. package/packages/volto-slate/src/editor/less/slate.less +28 -0
  69. package/packages/volto-slate/src/editor/plugins/Link/render.jsx +5 -6
  70. package/packages/volto-slate/src/editor/plugins/StyleMenu/StyleMenu.jsx +14 -4
  71. package/packages/volto-slate/src/editor/plugins/StyleMenu/utils.js +14 -5
  72. package/packages/volto-slate/src/editor/render.jsx +77 -8
  73. package/packages/volto-slate/src/editor/ui/SlateContextToolbar.jsx +2 -2
  74. package/packages/volto-slate/src/editor/ui/index.js +15 -15
  75. package/packages/volto-slate/src/index.js +2 -2
  76. package/packages/volto-slate/src/utils/blocks.js +7 -0
  77. package/packages/volto-slate/src/widgets/RichTextWidget.jsx +15 -8
  78. package/razzle.config.js +32 -6
  79. package/src/actions/index.js +10 -0
  80. package/src/actions/language/language.js +9 -8
  81. package/src/actions/navroot/navroot.js +16 -0
  82. package/src/actions/navroot/navroot.test.js +15 -0
  83. package/src/actions/querystringsearch/querystringsearch.js +20 -14
  84. package/src/actions/relations/rebuild.js +25 -0
  85. package/src/actions/relations/relations.js +103 -0
  86. package/src/actions/relations/relations.test.js +15 -0
  87. package/src/actions/site/site.js +16 -0
  88. package/src/actions/site/site.test.js +15 -0
  89. package/src/actions/userSession/userSession.js +17 -1
  90. package/src/components/index.js +194 -191
  91. package/src/components/manage/Actions/Actions.jsx +133 -243
  92. package/src/components/manage/Add/Add.jsx +9 -10
  93. package/src/components/manage/AnchorPlugin/index.jsx +2 -2
  94. package/src/components/manage/AnchorPlugin/utils/EditorUtils.js +3 -1
  95. package/src/components/manage/BlockChooser/BlockChooser.jsx +8 -3
  96. package/src/components/manage/BlockChooser/BlockChooser.test.jsx +5 -0
  97. package/src/components/manage/Blocks/Block/BlocksForm.jsx +19 -2
  98. package/src/components/manage/Blocks/Block/Edit.jsx +1 -1
  99. package/src/components/manage/Blocks/Block/Settings.jsx +2 -0
  100. package/src/components/manage/Blocks/Block/Settings.test.jsx +92 -0
  101. package/src/components/manage/Blocks/Block/Style.jsx +2 -2
  102. package/src/components/manage/Blocks/Container/Data.jsx +32 -0
  103. package/src/components/manage/Blocks/Container/Edit.jsx +177 -0
  104. package/src/components/manage/Blocks/Container/EditBlockWrapper.jsx +121 -0
  105. package/src/components/manage/Blocks/Container/NewBlockAddButton.jsx +84 -0
  106. package/src/components/manage/Blocks/Container/SimpleContainerToolbar.jsx +54 -0
  107. package/src/components/manage/Blocks/Grid/Edit.jsx +47 -0
  108. package/src/components/manage/Blocks/Grid/View.jsx +43 -0
  109. package/src/components/manage/Blocks/Grid/adapter.js +14 -0
  110. package/src/components/manage/Blocks/Grid/grid-1.svg +6 -0
  111. package/src/components/manage/Blocks/Grid/grid-2.svg +9 -0
  112. package/src/components/manage/Blocks/Grid/grid-3.svg +10 -0
  113. package/src/components/manage/Blocks/Grid/grid-4.svg +11 -0
  114. package/src/components/manage/Blocks/Grid/schema.js +35 -0
  115. package/src/components/manage/Blocks/Grid/templates.js +47 -0
  116. package/src/components/manage/Blocks/HTML/Edit.jsx +8 -8
  117. package/src/components/manage/Blocks/HeroImageLeft/Edit.jsx +36 -26
  118. package/src/components/manage/Blocks/Image/Edit.jsx +51 -12
  119. package/src/components/manage/Blocks/Image/Edit.test.jsx +2 -0
  120. package/src/components/manage/Blocks/Image/ImageSidebar.jsx +66 -16
  121. package/src/components/manage/Blocks/Image/View.jsx +26 -5
  122. package/src/components/manage/Blocks/Image/View.test.jsx +20 -0
  123. package/src/components/manage/Blocks/Image/schema.js +17 -10
  124. package/src/components/manage/Blocks/Image/utils.js +14 -0
  125. package/src/components/manage/Blocks/LeadImage/Edit.jsx +32 -10
  126. package/src/components/manage/Blocks/LeadImage/Edit.test.jsx +11 -1
  127. package/src/components/manage/Blocks/LeadImage/LeadImageSidebar.jsx +28 -9
  128. package/src/components/manage/Blocks/LeadImage/LeadImageSidebar.test.jsx +8 -2
  129. package/src/components/manage/Blocks/LeadImage/View.jsx +50 -38
  130. package/src/components/manage/Blocks/LeadImage/View.test.jsx +11 -1
  131. package/src/components/manage/Blocks/Listing/DefaultTemplate.jsx +18 -3
  132. package/src/components/manage/Blocks/Listing/Edit.jsx +0 -14
  133. package/src/components/manage/Blocks/Listing/ListingBody.jsx +32 -8
  134. package/src/components/manage/Blocks/Listing/ListingBody.test.jsx +20 -0
  135. package/src/components/manage/Blocks/Listing/SummaryTemplate.jsx +1 -1
  136. package/src/components/manage/Blocks/Listing/getAsyncData.js +9 -3
  137. package/src/components/manage/Blocks/Listing/withQuerystringResults.jsx +34 -19
  138. package/src/components/manage/Blocks/Maps/Edit.jsx +135 -209
  139. package/src/components/manage/Blocks/Maps/Edit.test.jsx +1 -2
  140. package/src/components/manage/Blocks/Maps/View.test.jsx +1 -2
  141. package/src/components/manage/Blocks/Search/SearchBlockEdit.jsx +5 -4
  142. package/src/components/manage/Blocks/Search/SearchBlockView.jsx +4 -2
  143. package/src/components/manage/Blocks/Search/components/DateRangeFacet.jsx +4 -1
  144. package/src/components/manage/Blocks/Search/components/Facets.jsx +66 -7
  145. package/src/components/manage/Blocks/Search/components/FilterList.jsx +4 -6
  146. package/src/components/manage/Blocks/Search/components/SearchInput.jsx +9 -2
  147. package/src/components/manage/Blocks/Search/components/SelectFacet.jsx +2 -9
  148. package/src/components/manage/Blocks/Search/components/index.js +13 -13
  149. package/src/components/manage/Blocks/Search/hocs/index.js +2 -2
  150. package/src/components/manage/Blocks/Search/hocs/withQueryString.jsx +5 -2
  151. package/src/components/manage/Blocks/Search/hocs/withSearch.jsx +93 -46
  152. package/src/components/manage/Blocks/Search/layout/LeftColumnFacets.jsx +17 -5
  153. package/src/components/manage/Blocks/Search/layout/RightColumnFacets.jsx +17 -5
  154. package/src/components/manage/Blocks/Search/layout/TopSideFacets.jsx +21 -5
  155. package/src/components/manage/Blocks/Search/schema.js +29 -14
  156. package/src/components/manage/Blocks/Table/Cell.jsx +2 -3
  157. package/src/components/manage/Blocks/Teaser/Body.jsx +0 -1
  158. package/src/components/manage/Blocks/Teaser/DefaultBody.jsx +5 -10
  159. package/src/components/manage/Blocks/Teaser/schema.js +5 -0
  160. package/src/components/manage/Blocks/Text/Edit.jsx +2 -3
  161. package/src/components/manage/Blocks/Title/View.jsx +0 -23
  162. package/src/components/manage/Blocks/Title/View.test.jsx +16 -1
  163. package/src/components/manage/Blocks/ToC/Schema.jsx +40 -7
  164. package/src/components/manage/Blocks/ToC/View.jsx +84 -14
  165. package/src/components/manage/Blocks/ToC/variations/DefaultTocRenderer.jsx +8 -3
  166. package/src/components/manage/Blocks/ToC/variations/DefaultTocRenderer.test.jsx +44 -0
  167. package/src/components/manage/Blocks/ToC/variations/HorizontalMenu.jsx +149 -10
  168. package/src/components/manage/Blocks/ToC/variations/index.js +3 -1
  169. package/src/components/manage/Contents/Contents.jsx +319 -139
  170. package/src/components/manage/Contents/ContentsItem.jsx +6 -0
  171. package/src/components/manage/Contents/ContentsPropertiesModal.jsx +90 -166
  172. package/src/components/manage/Contents/ContentsRenameModal.jsx +88 -139
  173. package/src/components/manage/Contents/ContentsRenameModal.stories.jsx +61 -0
  174. package/src/components/manage/Contents/ContentsTagsModal.jsx +83 -130
  175. package/src/components/manage/Contents/ContentsTagsModal.stories.jsx +68 -0
  176. package/src/components/manage/Contents/ContentsUploadModal.jsx +11 -7
  177. package/src/components/manage/Contents/ContentsWorkflowModal.jsx +87 -154
  178. package/src/components/manage/Controlpanels/Aliases.jsx +4 -12
  179. package/src/components/manage/Controlpanels/Controlpanels.jsx +199 -224
  180. package/src/components/manage/Controlpanels/Controlpanels.test.jsx +46 -7
  181. package/src/components/manage/Controlpanels/Groups/GroupsControlpanel.jsx +65 -38
  182. package/src/components/manage/Controlpanels/Groups/RenderGroups.jsx +2 -2
  183. package/src/components/manage/Controlpanels/Relations/BrokenRelations.jsx +91 -0
  184. package/src/components/manage/Controlpanels/Relations/Relations.jsx +114 -0
  185. package/src/components/manage/Controlpanels/Relations/RelationsListing.jsx +480 -0
  186. package/src/components/manage/Controlpanels/Relations/RelationsMatrix.jsx +531 -0
  187. package/src/components/manage/Controlpanels/Rules/AddRule.jsx +3 -10
  188. package/src/components/manage/Controlpanels/Rules/EditRule.jsx +1 -1
  189. package/src/components/manage/Controlpanels/UndoControlpanel.jsx +6 -9
  190. package/src/components/manage/Controlpanels/Users/RenderUsers.jsx +97 -7
  191. package/src/components/manage/Controlpanels/Users/UserGroupMembershipControlPanel.jsx +3 -3
  192. package/src/components/manage/Controlpanels/Users/UserGroupMembershipListing.jsx +51 -82
  193. package/src/components/manage/Controlpanels/Users/UserGroupMembershipMatrix.jsx +79 -75
  194. package/src/components/manage/Controlpanels/Users/UsersControlpanel.jsx +127 -99
  195. package/src/components/manage/Delete/Delete.jsx +96 -171
  196. package/src/components/manage/Diff/DiffField.jsx +25 -1
  197. package/src/components/manage/DragDropList/DragDropList.jsx +18 -13
  198. package/src/components/manage/Form/BlockDataForm.jsx +3 -2
  199. package/src/components/manage/Form/BlockDataForm.test.jsx +51 -17
  200. package/src/components/manage/Form/Form.jsx +7 -6
  201. package/src/components/manage/Form/InlineForm.jsx +39 -9
  202. package/src/components/manage/Form/InlineForm.test.jsx +16 -14
  203. package/src/components/manage/Form/InlineFormState.js +8 -0
  204. package/src/components/manage/History/History.jsx +11 -1
  205. package/src/components/manage/LinksToItem/LinksToItem.jsx +209 -0
  206. package/src/components/manage/LinksToItem/LinksToItem.test.jsx +100 -0
  207. package/src/components/manage/LockingToastsFactory/LockingToastsFactory.jsx +1 -2
  208. package/src/components/manage/Messages/Messages.jsx +32 -99
  209. package/src/components/manage/Messages/Messages.test.jsx +0 -1
  210. package/src/components/manage/Multilingual/CreateTranslation.jsx +2 -2
  211. package/src/components/manage/Multilingual/TranslationObject.jsx +4 -3
  212. package/src/components/manage/Preferences/ChangePassword.jsx +2 -2
  213. package/src/components/manage/Preferences/PersonalPreferences.jsx +2 -2
  214. package/src/components/manage/Sharing/Sharing.jsx +62 -22
  215. package/src/components/manage/Sidebar/AlignBlock.jsx +1 -1
  216. package/src/components/manage/Sidebar/Sidebar.jsx +139 -220
  217. package/src/components/manage/TemplateChooser/TemplateChooser.jsx +38 -0
  218. package/src/components/manage/TemplateChooser/TemplateChooser.test.jsx +34 -0
  219. package/src/components/manage/TemplateChooser/template.svg +10 -0
  220. package/src/components/manage/Toast/Toast.jsx +2 -2
  221. package/src/components/manage/Toolbar/More.jsx +17 -2
  222. package/src/components/manage/Toolbar/PersonalTools.jsx +97 -155
  223. package/src/components/manage/Toolbar/Toolbar.jsx +2 -2
  224. package/src/components/manage/Toolbar/Types.jsx +2 -2
  225. package/src/components/manage/UniversalLink/UniversalLink.jsx +6 -12
  226. package/src/components/manage/UniversalLink/UniversalLink.test.jsx +37 -0
  227. package/src/components/manage/Widgets/AlignWidget.jsx +2 -4
  228. package/src/components/manage/Widgets/ArrayWidget.jsx +3 -1
  229. package/src/components/manage/Widgets/ArrayWidget.test.jsx +45 -1
  230. package/src/components/manage/Widgets/ColorPickerWidget.jsx +6 -1
  231. package/src/components/manage/Widgets/ColorPickerWidget.test.jsx +9 -7
  232. package/src/components/manage/Widgets/DatetimeWidget.jsx +11 -13
  233. package/src/components/manage/Widgets/FileWidget.jsx +2 -1
  234. package/src/components/manage/Widgets/FormFieldWrapper.jsx +1 -1
  235. package/src/components/manage/Widgets/IdWidget.jsx +1 -2
  236. package/src/components/manage/Widgets/ObjectBrowserWidget.jsx +2 -9
  237. package/src/components/manage/Widgets/ObjectListWidget.jsx +3 -8
  238. package/src/components/manage/Widgets/RecurrenceWidget/ByDayField.jsx +2 -1
  239. package/src/components/manage/Widgets/RecurrenceWidget/MonthOfTheYearField.jsx +2 -1
  240. package/src/components/manage/Widgets/RecurrenceWidget/Occurences.jsx +2 -1
  241. package/src/components/manage/Widgets/RecurrenceWidget/RecurrenceWidget.jsx +10 -12
  242. package/src/components/manage/Widgets/RecurrenceWidget/WeekdayOfTheMonthField.jsx +2 -1
  243. package/src/components/manage/Widgets/RecurrenceWidget/WeekdayOfTheMonthIndexField.jsx +4 -4
  244. package/src/components/manage/Widgets/RegistryImageWidget.jsx +210 -0
  245. package/src/components/manage/Widgets/RegistryImageWidget.test.jsx +91 -0
  246. package/src/components/manage/Widgets/SchemaWidget.jsx +6 -9
  247. package/src/components/manage/Widgets/SelectUtils.js +2 -2
  248. package/src/components/manage/Widgets/SelectWidget.jsx +16 -2
  249. package/src/components/manage/Widgets/SelectWidget.test.jsx +45 -1
  250. package/src/components/manage/Widgets/WysiwygWidget.jsx +2 -9
  251. package/src/components/manage/Workflow/Workflow.jsx +75 -184
  252. package/src/components/theme/Anontools/Anontools.jsx +44 -72
  253. package/src/components/theme/Anontools/Anontools.stories.jsx +16 -6
  254. package/src/components/theme/Anontools/Anontools.test.jsx +16 -2
  255. package/src/components/theme/Breadcrumbs/Breadcrumbs.jsx +52 -99
  256. package/src/components/theme/Breadcrumbs/Breadcrumbs.stories.jsx +14 -13
  257. package/src/components/theme/Comments/Comment.stories.jsx +84 -0
  258. package/src/components/theme/Comments/CommentEditModal.jsx +63 -115
  259. package/src/components/theme/Comments/Comments.jsx +268 -380
  260. package/src/components/theme/Component/Component.jsx +1 -1
  261. package/src/components/theme/ContactForm/ContactForm.jsx +108 -192
  262. package/src/components/theme/ContactForm/ContactForm.stories.jsx +1 -1
  263. package/src/components/theme/ContactForm/ContactForm.test.jsx +2 -3
  264. package/src/components/theme/ContentMetadataTags/ContentMetadataTags.jsx +41 -3
  265. package/src/components/theme/Error/ServerError.jsx +29 -0
  266. package/src/components/theme/Footer/Footer.jsx +2 -13
  267. package/src/components/theme/Header/Header.jsx +37 -63
  268. package/src/components/theme/Header/Header.test.jsx +18 -0
  269. package/src/components/theme/Icon/Icon.jsx +2 -2
  270. package/src/components/theme/Image/Image.jsx +96 -0
  271. package/src/components/theme/Image/Image.test.jsx +125 -0
  272. package/src/components/theme/LanguageSelector/LanguageSelector.js +8 -3
  273. package/src/components/theme/Login/Login.jsx +160 -242
  274. package/src/components/theme/Logo/Logo.Multilingual.test.jsx +131 -1
  275. package/src/components/theme/Logo/Logo.jsx +35 -26
  276. package/src/components/theme/Logo/Logo.test.jsx +135 -1
  277. package/src/components/theme/Logout/Logout.jsx +36 -83
  278. package/src/components/theme/MultilingualRedirector/MultilingualRedirector.jsx +2 -2
  279. package/src/components/theme/Navigation/NavItem.jsx +4 -2
  280. package/src/components/theme/Navigation/Navigation.jsx +86 -171
  281. package/src/components/theme/NotFound/NotFound.jsx +55 -41
  282. package/src/components/theme/PasswordReset/PasswordReset.jsx +8 -6
  283. package/src/components/theme/PasswordReset/RequestPasswordReset.jsx +96 -171
  284. package/src/components/theme/PreviewImage/PreviewImage.jsx +31 -15
  285. package/src/components/theme/PreviewImage/PreviewImage.test.js +53 -13
  286. package/src/components/theme/Register/Register.jsx +2 -4
  287. package/src/components/theme/Search/SearchTags.jsx +30 -60
  288. package/src/components/theme/SearchWidget/SearchWidget.jsx +49 -97
  289. package/src/components/theme/SearchWidget/SearchWidget.test.jsx +8 -0
  290. package/src/components/theme/Sitemap/Sitemap.jsx +25 -12
  291. package/src/components/theme/Sitemap/Sitemap.test.jsx +23 -2
  292. package/src/components/theme/TsTest/TsTest.test.tsx +11 -0
  293. package/src/components/theme/TsTest/TsTest.tsx +15 -0
  294. package/src/components/theme/View/AlbumView.jsx +21 -16
  295. package/src/components/theme/View/DefaultView.jsx +1 -1
  296. package/src/components/theme/View/EventDatesInfo.jsx +2 -1
  297. package/src/components/theme/View/EventView.jsx +36 -25
  298. package/src/components/theme/View/FileView.jsx +23 -18
  299. package/src/components/theme/View/ImageView.jsx +40 -32
  300. package/src/components/theme/View/ImageView.test.jsx +4 -0
  301. package/src/components/theme/View/LinkView.jsx +53 -78
  302. package/src/components/theme/View/ListingView.jsx +36 -28
  303. package/src/components/theme/View/NewsItemView.jsx +16 -17
  304. package/src/components/theme/View/RenderBlocks.jsx +56 -21
  305. package/src/components/theme/View/RenderEmptyBlock.jsx +5 -0
  306. package/src/components/theme/View/SummaryView.jsx +49 -39
  307. package/src/components/theme/View/TabularView.jsx +59 -53
  308. package/src/components/theme/View/View.jsx +2 -0
  309. package/src/components/theme/Widgets/DateWidget.jsx +2 -1
  310. package/src/components/theme/Widgets/DatetimeWidget.jsx +2 -1
  311. package/src/components/theme/Widgets/ImageWidget.stories.jsx +1 -2
  312. package/src/components/theme/Widgets/RelationsWidget.jsx +13 -11
  313. package/src/config/Blocks.jsx +46 -0
  314. package/src/config/Components.jsx +3 -1
  315. package/src/config/ControlPanels.js +2 -1
  316. package/src/config/Loadables.jsx +1 -1
  317. package/src/config/NonContentRoutes.jsx +1 -0
  318. package/src/config/RichTextEditor/Blocks.jsx +4 -5
  319. package/src/config/RichTextEditor/FromHTML.jsx +2 -2
  320. package/src/config/RichTextEditor/Plugins.jsx +2 -3
  321. package/src/config/RichTextEditor/Styles.jsx +1 -1
  322. package/src/config/RichTextEditor/ToHTML.jsx +12 -10
  323. package/src/config/RichTextEditor/index.js +2 -3
  324. package/src/config/Views.jsx +6 -4
  325. package/src/config/Widgets.jsx +4 -0
  326. package/src/config/index.js +38 -2
  327. package/src/config/server.js +2 -0
  328. package/src/constants/ActionTypes.js +8 -0
  329. package/src/constants/Indexes.js +3 -1
  330. package/src/constants/Languages.js +8 -4
  331. package/src/express-middleware/devproxy.js +1 -1
  332. package/src/express-middleware/files.js +11 -9
  333. package/src/express-middleware/images.js +12 -5
  334. package/src/express-middleware/ok.js +16 -0
  335. package/src/express-middleware/robotstxt.js +1 -1
  336. package/src/express-middleware/sitemap.js +37 -5
  337. package/src/express-middleware/static.js +3 -3
  338. package/src/helpers/Api/Api.js +1 -1
  339. package/src/helpers/Blocks/Blocks.js +52 -6
  340. package/src/helpers/Blocks/Blocks.test.js +92 -13
  341. package/src/helpers/Extensions/index.js +2 -1
  342. package/src/helpers/Extensions/withBlockSchemaEnhancer.js +63 -61
  343. package/src/helpers/Extensions/withBlockSchemaEnhancer.test.js +145 -0
  344. package/src/helpers/FormValidation/FormValidation.js +42 -3
  345. package/src/helpers/FormValidation/FormValidation.test.js +73 -0
  346. package/src/helpers/Html/Html.jsx +5 -9
  347. package/src/helpers/Html/Html.test.jsx +5 -0
  348. package/src/helpers/Loadable/__mocks__/Loadable.js +18 -18
  349. package/src/helpers/MessageLabels/MessageLabels.js +111 -4
  350. package/src/helpers/Robots/Robots.js +24 -6
  351. package/src/helpers/ScrollToTop/ScrollToTop.jsx +5 -3
  352. package/src/helpers/Site/index.js +21 -0
  353. package/src/helpers/Sitemap/Sitemap.js +44 -2
  354. package/src/helpers/Url/Url.js +30 -4
  355. package/src/helpers/Url/Url.test.js +55 -0
  356. package/src/helpers/Utils/UseDetectClickOutside.stories.jsx +190 -0
  357. package/src/helpers/Utils/Utils.js +73 -13
  358. package/src/helpers/Utils/Utils.test.js +17 -4
  359. package/src/helpers/Utils/usePagination.js +67 -14
  360. package/src/helpers/Utils/usePagination.test.js +115 -0
  361. package/src/helpers/index.js +22 -10
  362. package/src/hooks/client/useClient.js +11 -0
  363. package/src/hooks/clipboard/useClipboard.js +26 -0
  364. package/src/hooks/index.js +2 -0
  365. package/src/icons/grid-block.svg +11 -0
  366. package/src/middleware/Api.test.js +54 -0
  367. package/src/middleware/api.js +209 -175
  368. package/src/middleware/blacklistRoutes.js +25 -22
  369. package/src/middleware/index.js +2 -2
  370. package/src/middleware/storeProtectLoadUtils.js +61 -62
  371. package/src/middleware/storeProtectLoadUtils.test.js +47 -43
  372. package/src/reducers/actions/actions.js +8 -6
  373. package/src/reducers/actions/actions.test.js +70 -0
  374. package/src/reducers/breadcrumbs/breadcrumbs.js +1 -1
  375. package/src/reducers/content/content.test.js +4 -4
  376. package/src/reducers/index.js +6 -0
  377. package/src/reducers/navigation/navigation.js +6 -6
  378. package/src/reducers/navigation/navigation.test.js +30 -0
  379. package/src/reducers/navroot/navroot.js +79 -0
  380. package/src/reducers/navroot/navroot.test.js +110 -0
  381. package/src/reducers/relations/relations.js +201 -0
  382. package/src/reducers/site/site.js +51 -0
  383. package/src/reducers/site/site.test.js +67 -0
  384. package/src/reducers/types/types.js +1 -1
  385. package/src/reducers/userSession/userSession.js +15 -1
  386. package/src/registry.js +2 -2
  387. package/src/routes.js +14 -0
  388. package/src/server.jsx +37 -23
  389. package/src/start-server.js +2 -2
  390. package/src/storybook.jsx +24 -38
  391. package/test-setup-config.js +12 -1
  392. package/theme/themes/pastanaga/collections/form.overrides +46 -0
  393. package/theme/themes/pastanaga/collections/menu.overrides +3 -2
  394. package/theme/themes/pastanaga/elements/container.overrides +5 -2
  395. package/theme/themes/pastanaga/elements/input.overrides +11 -1
  396. package/theme/themes/pastanaga/elements/label.overrides +10 -0
  397. package/theme/themes/pastanaga/elements/step.overrides +2 -1
  398. package/theme/themes/pastanaga/extras/blocks.less +25 -15
  399. package/theme/themes/pastanaga/extras/color-picker-widget.less +1 -1
  400. package/theme/themes/pastanaga/extras/contents.less +6 -1
  401. package/theme/themes/pastanaga/extras/draftjs.less +4 -4
  402. package/theme/themes/pastanaga/extras/grid.less +427 -0
  403. package/theme/themes/pastanaga/extras/login.less +3 -0
  404. package/theme/themes/pastanaga/extras/main.less +14 -7
  405. package/theme/themes/pastanaga/extras/react-dates-overrides.less +4 -2
  406. package/theme/themes/pastanaga/extras/search.less +7 -1
  407. package/theme/themes/pastanaga/extras/sidebar.less +9 -4
  408. package/theme/themes/pastanaga/extras/time-picker-overrides.less +5 -3
  409. package/theme/themes/pastanaga/extras/toc.less +29 -0
  410. package/theme/themes/pastanaga/extras/toolbar.less +6 -2
  411. package/theme/themes/pastanaga/extras/userscontrolpanel.less +104 -73
  412. package/theme/themes/pastanaga/extras/widgets.less +1 -1
  413. package/theme/themes/pastanaga/modules/rating.overrides +2 -1
  414. package/theme/themes/pastanaga-cms-ui/elements/container.overrides +2 -1
  415. package/theme/themes/pastanaga-cms-ui/extras/cms-ui.elements.container.less +6 -2
  416. package/theme/themes/pastanaga-cms-ui/extras/cms-ui.site.less +2 -2
  417. package/tsconfig.json +33 -0
  418. package/webpack-plugins/webpack-less-plugin.js +19 -0
  419. package/.changelog.draft +0 -19
  420. package/.editorconfig +0 -36
  421. package/.storybook/main.js +0 -127
  422. package/.storybook/manager.js +0 -15
  423. package/.storybook/preview.js +0 -21
  424. package/.storybook/static/previewImage.svg +0 -48
  425. package/.vale.ini +0 -10
  426. package/.yarnrc.yml +0 -5
  427. package/jsdoc.json +0 -16
  428. package/netlify.toml +0 -5
  429. package/pyvenv.cfg +0 -3
  430. package/share/man/man1/ttx.1 +0 -225
  431. package/src/components/manage/Blocks/Teaser/utils.js +0 -44
  432. package/src/components/manage/Blocks/Teaser/utils.test.jsx +0 -229
  433. package/src/components/theme/Header/Header.md +0 -27
  434. package/styles/Vocab/Base/accept.txt +0 -0
  435. package/styles/Vocab/Base/reject.txt +0 -0
  436. package/styles/Vocab/Plone/accept.txt +0 -8
  437. package/styles/Vocab/Plone/reject.txt +0 -0
  438. package/towncrier.toml +0 -33
@@ -6,13 +6,13 @@
6
6
  import React, { Component } from 'react';
7
7
  import PropTypes from 'prop-types';
8
8
  import { map, remove } from 'lodash';
9
- import { Button, Segment, Table, Form } from 'semantic-ui-react';
10
- import { Portal } from 'react-portal';
9
+ import { Button, Table } from 'semantic-ui-react';
11
10
  import cx from 'classnames';
12
- import { FormattedMessage, defineMessages, injectIntl } from 'react-intl';
11
+ import { defineMessages, injectIntl } from 'react-intl';
13
12
 
14
13
  import Cell from './Cell';
15
- import { Field, Icon } from '@plone/volto/components';
14
+ import { BlockDataForm, Icon, SidebarPortal } from '@plone/volto/components';
15
+ import TableSchema from './schema';
16
16
 
17
17
  import rowBeforeSVG from '@plone/volto/icons/row-before.svg';
18
18
  import rowAfterSVG from '@plone/volto/icons/row-after.svg';
@@ -130,42 +130,6 @@ const messages = defineMessages({
130
130
  id: 'Delete col',
131
131
  defaultMessage: 'Delete col',
132
132
  },
133
- hideHeaders: {
134
- id: 'Hide headers',
135
- defaultMessage: 'Hide headers',
136
- },
137
- sortable: {
138
- id: 'Make the table sortable',
139
- defaultMessage: 'Make the table sortable',
140
- },
141
- sortableDescription: {
142
- id: 'Visible only in view mode',
143
- defaultMessage: 'Visible only in view mode',
144
- },
145
- fixed: {
146
- id: 'Fixed width table cells',
147
- defaultMessage: 'Fixed width table cells',
148
- },
149
- compact: {
150
- id: 'Make the table compact',
151
- defaultMessage: 'Make the table compact',
152
- },
153
- basic: {
154
- id: 'Reduce complexity',
155
- defaultMessage: 'Reduce complexity',
156
- },
157
- celled: {
158
- id: 'Divide each row into separate cells',
159
- defaultMessage: 'Divide each row into separate cells',
160
- },
161
- inverted: {
162
- id: 'Table color inverted',
163
- defaultMessage: 'Table color inverted',
164
- },
165
- striped: {
166
- id: 'Stripe alternate rows with color',
167
- defaultMessage: 'Stripe alternate rows with color',
168
- },
169
133
  left: {
170
134
  id: 'Left',
171
135
  defaultMessage: 'Left',
@@ -255,15 +219,6 @@ class Edit extends Component {
255
219
  this.onDeleteCol = this.onDeleteCol.bind(this);
256
220
  this.onChangeCell = this.onChangeCell.bind(this);
257
221
  this.toggleCellType = this.toggleCellType.bind(this);
258
- this.toggleBool = this.toggleBool.bind(this);
259
- this.toggleHideHeaders = this.toggleHideHeaders.bind(this);
260
- this.toggleSortable = this.toggleSortable.bind(this);
261
- this.toggleFixed = this.toggleFixed.bind(this);
262
- this.toggleCompact = this.toggleCompact.bind(this);
263
- this.toggleBasic = this.toggleBasic.bind(this);
264
- this.toggleCelled = this.toggleCelled.bind(this);
265
- this.toggleInverted = this.toggleInverted.bind(this);
266
- this.toggleStriped = this.toggleStriped.bind(this);
267
222
  }
268
223
 
269
224
  /**
@@ -519,95 +474,6 @@ class Edit extends Component {
519
474
  });
520
475
  }
521
476
 
522
- /**
523
- * Toggles bool state data ('fixed', 'compact' etc. can be true or false).
524
- * @method toggleBool
525
- * @param {string} value Key in the table state to toggle.
526
- * @returns {undefined}
527
- */
528
- toggleBool(value) {
529
- const table = this.props.data.table;
530
- this.props.onChangeBlock(this.props.block, {
531
- ...this.props.data,
532
- table: {
533
- ...table,
534
- [value]: !table[value],
535
- },
536
- });
537
- }
538
-
539
- /**
540
- * Toggle fixed
541
- * @method toggleHideHeaders
542
- * @returns {undefined}
543
- */
544
- toggleHideHeaders() {
545
- this.toggleBool('hideHeaders');
546
- }
547
-
548
- /**
549
- * Toggle sortable
550
- * @method toggleSortable
551
- * @returns {undefined}
552
- */
553
- toggleSortable() {
554
- this.toggleBool('sortable');
555
- }
556
-
557
- /**
558
- * Toggle fixed
559
- * @method toggleFixed
560
- * @returns {undefined}
561
- */
562
- toggleFixed() {
563
- this.toggleBool('fixed');
564
- }
565
-
566
- /**
567
- * Toggle compact
568
- * @method toggleCompact
569
- * @returns {undefined}
570
- */
571
- toggleCompact() {
572
- this.toggleBool('compact');
573
- }
574
-
575
- /**
576
- * Toggle basic
577
- * @method toggleBasic
578
- * @returns {undefined}
579
- */
580
- toggleBasic() {
581
- this.toggleBool('basic');
582
- }
583
-
584
- /**
585
- * Toggle celled
586
- * @method toggleCelled
587
- * @returns {undefined}
588
- */
589
- toggleCelled() {
590
- this.toggleBool('celled');
591
- }
592
-
593
- /**
594
- * Toggle inverted
595
- * @method toggleInverted
596
- * @returns {undefined}
597
- */
598
- toggleInverted() {
599
- this.toggleBool('inverted');
600
- }
601
-
602
- /**
603
- * Toggle striped
604
- * @method toggleStriped
605
- * @returns {undefined}
606
- */
607
- toggleStriped() {
608
- this.toggleBool('striped');
609
- }
610
-
611
477
  componentDidUpdate(prevProps) {
612
478
  if (prevProps.selected && !this.props.selected) {
613
479
  this.setState({ selected: null });
@@ -623,6 +489,7 @@ class Edit extends Component {
623
489
  const headers = this.props.data.table?.rows?.[0]?.cells || [];
624
490
  const rows =
625
491
  this.props.data.table?.rows?.filter((_, index) => index > 0) || [];
492
+ const schema = TableSchema(this.props);
626
493
 
627
494
  return (
628
495
  // TODO: use slate-table instead of table, but first copy the CSS styles
@@ -802,80 +669,22 @@ class Edit extends Component {
802
669
  </Table>
803
670
  )}
804
671
  {this.props.selected && this.state.selected && this.state.isClient && (
805
- <Portal node={document.getElementById('sidebar-properties')}>
806
- <Form method="post" onSubmit={(event) => event.preventDefault()}>
807
- <Segment secondary attached>
808
- <FormattedMessage id="Table" defaultMessage="Table" />
809
- </Segment>
810
- <Segment attached>
811
- <Field
812
- id="hideHeaders"
813
- title={this.props.intl.formatMessage(messages.hideHeaders)}
814
- type="boolean"
815
- value={
816
- this.props.data.table && this.props.data.table.hideHeaders
817
- }
818
- onChange={() => this.toggleHideHeaders()}
819
- />
820
- <Field
821
- id="sortable"
822
- title={this.props.intl.formatMessage(messages.sortable)}
823
- description={this.props.intl.formatMessage(
824
- messages.sortableDescription,
825
- )}
826
- type="boolean"
827
- value={
828
- this.props.data.table && this.props.data.table.sortable
829
- }
830
- onChange={() => this.toggleSortable()}
831
- />
832
- <Field
833
- id="fixed"
834
- title={this.props.intl.formatMessage(messages.fixed)}
835
- type="boolean"
836
- value={this.props.data.table && this.props.data.table.fixed}
837
- onChange={() => this.toggleFixed()}
838
- />
839
- <Field
840
- id="celled"
841
- title={this.props.intl.formatMessage(messages.celled)}
842
- type="boolean"
843
- value={this.props.data.table && this.props.data.table.celled}
844
- onChange={this.toggleCelled}
845
- />
846
- <Field
847
- id="striped"
848
- title={this.props.intl.formatMessage(messages.striped)}
849
- type="boolean"
850
- value={this.props.data.table && this.props.data.table.striped}
851
- onChange={this.toggleStriped}
852
- />
853
- <Field
854
- id="compact"
855
- title={this.props.intl.formatMessage(messages.compact)}
856
- type="boolean"
857
- value={this.props.data.table && this.props.data.table.compact}
858
- onChange={() => this.toggleCompact()}
859
- />
860
- <Field
861
- id="basic"
862
- title={this.props.intl.formatMessage(messages.basic)}
863
- type="boolean"
864
- value={this.props.data.table && this.props.data.table.basic}
865
- onChange={this.toggleBasic}
866
- />
867
- <Field
868
- id="inverted"
869
- title={this.props.intl.formatMessage(messages.inverted)}
870
- type="boolean"
871
- value={
872
- this.props.data.table && this.props.data.table.inverted
873
- }
874
- onChange={this.toggleInverted}
875
- />
876
- </Segment>
877
- </Form>
878
- </Portal>
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>
879
688
  )}
880
689
  </div>
881
690
  );
@@ -0,0 +1,122 @@
1
+ import { defineMessages } from 'react-intl';
2
+
3
+ const messages = defineMessages({
4
+ hideHeaders: {
5
+ id: 'Hide headers',
6
+ defaultMessage: 'Hide headers',
7
+ },
8
+ sortable: {
9
+ id: 'Make the table sortable',
10
+ defaultMessage: 'Make the table sortable',
11
+ },
12
+ sortableDescription: {
13
+ id: 'Visible only in view mode',
14
+ defaultMessage: 'Visible only in view mode',
15
+ },
16
+ fixed: {
17
+ id: 'Fixed width table cells',
18
+ defaultMessage: 'Fixed width table cells',
19
+ },
20
+ compact: {
21
+ id: 'Make the table compact',
22
+ defaultMessage: 'Make the table compact',
23
+ },
24
+ basic: {
25
+ id: 'Reduce complexity',
26
+ defaultMessage: 'Reduce complexity',
27
+ },
28
+ celled: {
29
+ id: 'Divide each row into separate cells',
30
+ defaultMessage: 'Divide each row into separate cells',
31
+ },
32
+ inverted: {
33
+ id: 'Table color inverted',
34
+ defaultMessage: 'Table color inverted',
35
+ },
36
+ striped: {
37
+ id: 'Stripe alternate rows with color',
38
+ defaultMessage: 'Stripe alternate rows with color',
39
+ },
40
+ });
41
+
42
+ function TableSchema(props) {
43
+ const { intl } = props;
44
+ return {
45
+ title: 'Table block',
46
+ fieldsets: [
47
+ {
48
+ id: 'default',
49
+ title: 'Default',
50
+ fields: [
51
+ 'hideHeaders',
52
+ 'sortable',
53
+ 'fixed',
54
+ 'celled',
55
+ 'striped',
56
+ 'compact',
57
+ 'basic',
58
+ 'inverted',
59
+ ],
60
+ },
61
+ ],
62
+ properties: {
63
+ hideHeaders: {
64
+ title: intl.formatMessage(messages.hideHeaders),
65
+ type: 'boolean',
66
+ },
67
+ sortable: {
68
+ title: intl.formatMessage(messages.sortable),
69
+ type: 'boolean',
70
+ },
71
+ fixed: {
72
+ title: intl.formatMessage(messages.fixed),
73
+ type: 'boolean',
74
+ },
75
+ celled: {
76
+ title: intl.formatMessage(messages.celled),
77
+ type: 'boolean',
78
+ },
79
+ striped: {
80
+ title: intl.formatMessage(messages.striped),
81
+ type: 'boolean',
82
+ },
83
+ compact: {
84
+ title: intl.formatMessage(messages.compact),
85
+ type: 'boolean',
86
+ },
87
+ basic: {
88
+ title: intl.formatMessage(messages.basic),
89
+ type: 'boolean',
90
+ },
91
+ inverted: {
92
+ title: intl.formatMessage(messages.inverted),
93
+ type: 'boolean',
94
+ },
95
+ },
96
+ required: [],
97
+ };
98
+ }
99
+
100
+ export function TableBlockSchema(props) {
101
+ return {
102
+ title: 'Table block',
103
+ fieldsets: [
104
+ {
105
+ id: 'default',
106
+ title: 'Default',
107
+ fields: ['table'],
108
+ },
109
+ ],
110
+ properties: {
111
+ table: {
112
+ title: 'Table block',
113
+ widget: 'object',
114
+ schema: TableSchema(props),
115
+ },
116
+ },
117
+
118
+ required: [],
119
+ };
120
+ }
121
+
122
+ export default TableBlockSchema;
@@ -6,7 +6,11 @@ import { defineMessages, useIntl } from 'react-intl';
6
6
  import { useInView } from 'react-intersection-observer';
7
7
  import { Dimmer, Loader, Message, Segment } from 'semantic-ui-react';
8
8
 
9
- import { flattenToAppURL, getBaseUrl } from '@plone/volto/helpers';
9
+ import {
10
+ flattenToAppURL,
11
+ getBaseUrl,
12
+ validateFileUploadSize,
13
+ } from '@plone/volto/helpers';
10
14
  import config from '@plone/volto/registry';
11
15
  import {
12
16
  BlockDataForm,
@@ -71,6 +75,7 @@ export const DefaultTextBlockEditor = (props) => {
71
75
  const { slate } = config.settings;
72
76
  const { textblockExtensions } = slate;
73
77
  const { value } = data;
78
+ const intl = useIntl();
74
79
 
75
80
  // const [addNewBlockOpened, setAddNewBlockOpened] = React.useState();
76
81
  const [showDropzone, setShowDropzone] = React.useState(false);
@@ -106,6 +111,7 @@ export const DefaultTextBlockEditor = (props) => {
106
111
  files.forEach((file) => {
107
112
  const [mime] = file.type.split('/');
108
113
  if (mime !== 'image') return;
114
+ if (!validateFileUploadSize(file, intl.formatMessage)) return;
109
115
 
110
116
  readAsDataURL(file).then((data) => {
111
117
  const fields = data.match(/^data:(.*);(.*),(.*)$/);
@@ -127,7 +133,7 @@ export const DefaultTextBlockEditor = (props) => {
127
133
  });
128
134
  setShowDropzone(false);
129
135
  },
130
- [pathname, uploadContent, block],
136
+ [pathname, uploadContent, block, intl.formatMessage],
131
137
  );
132
138
 
133
139
  const { loaded, loading } = uploadRequest;
@@ -178,7 +184,6 @@ export const DefaultTextBlockEditor = (props) => {
178
184
  instructions = formDescription;
179
185
  }
180
186
 
181
- const intl = useIntl();
182
187
  const placeholder =
183
188
  data.placeholder || formTitle || intl.formatMessage(messages.text);
184
189
  const schema = TextBlockSchema(data);
@@ -110,7 +110,7 @@ const PersistentSlashMenu = ({ editor }) => {
110
110
 
111
111
  const [slashMenuSelected, setSlashMenuSelected] = React.useState(0);
112
112
 
113
- const useAllowedBlocks = !isEmpty(allowedBlocks);
113
+ const hasAllowedBlocks = !isEmpty(allowedBlocks);
114
114
  const slashCommand = data.plaintext
115
115
  ?.toLowerCase()
116
116
  .trim()
@@ -119,12 +119,13 @@ const PersistentSlashMenu = ({ editor }) => {
119
119
  const availableBlocks = React.useMemo(
120
120
  () =>
121
121
  filter(blocksConfig, (item) =>
122
- useAllowedBlocks
122
+ hasAllowedBlocks
123
123
  ? allowedBlocks.includes(item.id)
124
124
  : typeof item.restricted === 'function'
125
125
  ? !item.restricted({ properties, block: item })
126
126
  : !item.restricted,
127
127
  )
128
+ .filter((block) => Boolean(block.title && block.id))
128
129
  .filter((block) => {
129
130
  // typed text is a substring of the title or id
130
131
  const title = translateBlockTitle(block, intl).toLowerCase();
@@ -150,7 +151,7 @@ const PersistentSlashMenu = ({ editor }) => {
150
151
  intl,
151
152
  properties,
152
153
  slashCommand,
153
- useAllowedBlocks,
154
+ hasAllowedBlocks,
154
155
  ],
155
156
  );
156
157
 
@@ -1,26 +1,31 @@
1
- import { serializeNodes } from '@plone/volto-slate/editor/render';
1
+ import {
2
+ serializeNodes,
3
+ serializeNodesToText,
4
+ } from '@plone/volto-slate/editor/render';
2
5
  import config from '@plone/volto/registry';
6
+ import { isEqual } from 'lodash';
7
+ import Slugger from 'github-slugger';
8
+ import { normalizeString } from '@plone/volto/helpers';
3
9
 
4
10
  const TextBlockView = (props) => {
5
11
  const { id, data, styling = {} } = props;
6
12
  const { value, override_toc } = data;
7
13
  const metadata = props.metadata || props.properties;
8
- return serializeNodes(
9
- value,
10
- (node, path) => {
11
- const res = { ...styling };
12
- if (node.type) {
13
- if (
14
- config.settings.slate.topLevelTargetElements.includes(node.type) ||
15
- override_toc
16
- ) {
17
- res.id = id;
18
- }
14
+ const { topLevelTargetElements } = config.settings.slate;
15
+
16
+ const getAttributes = (node, path) => {
17
+ const res = { ...styling };
18
+ if (node.type && isEqual(path, [0])) {
19
+ if (topLevelTargetElements.includes(node.type) || override_toc) {
20
+ const text = serializeNodesToText(node?.children || []);
21
+ const slug = Slugger.slug(normalizeString(text));
22
+ res.id = slug || id;
19
23
  }
20
- return res;
21
- },
22
- { metadata: metadata },
23
- );
24
+ }
25
+ return res;
26
+ };
27
+
28
+ return serializeNodes(value, getAttributes, { metadata: metadata });
24
29
  };
25
30
 
26
31
  export default TextBlockView;
@@ -1,7 +1,7 @@
1
1
  import isUrl from 'is-url';
2
2
  import imageExtensions from 'image-extensions';
3
3
  import { blockTagDeserializer } from '@plone/volto-slate/editor/deserialize';
4
- import { getBaseUrl } from '@plone/volto/helpers';
4
+ import { getBaseUrl, validateFileUploadSize } from '@plone/volto/helpers';
5
5
  import { v4 as uuid } from 'uuid';
6
6
  import { Transforms } from 'slate';
7
7
 
@@ -66,7 +66,9 @@ export const withDeserializers = (editor) => {
66
66
  ...editor.dataTransferHandlers,
67
67
  files: (files) => {
68
68
  const unprocessed = [];
69
+ const { intl } = editor.getBlockProps();
69
70
  for (const file of files) {
71
+ if (!validateFileUploadSize(file, intl.formatMessage)) return;
70
72
  const reader = new FileReader();
71
73
  const [mime] = file.type.split('/');
72
74
  if (mime === 'image') {
@@ -35,7 +35,7 @@ import textSVG from '@plone/volto/icons/subtext.svg';
35
35
 
36
36
  export { TextBlockView, TextBlockEdit, TextBlockSchema };
37
37
 
38
- export default (config) => {
38
+ export default function applyConfig(config) {
39
39
  config.settings.slate = {
40
40
  // TODO: should we inverse order? First here gets executed last
41
41
  textblockExtensions: [
@@ -102,11 +102,6 @@ export default (config) => {
102
102
  ...config.settings.slate, // TODO: is this correct for volto-slate addons?
103
103
  };
104
104
 
105
- config.settings.integratesBlockStyles = [
106
- ...(config.settings.integratesBlockStyles || []),
107
- 'slate',
108
- ];
109
-
110
105
  const slateBlockConfig = {
111
106
  id: 'slate',
112
107
  title: 'Text',
@@ -164,5 +159,13 @@ export default (config) => {
164
159
  edit: (props) => <TextBlockEdit {...props} detached />,
165
160
  restricted: true,
166
161
  };
162
+
163
+ if (config.blocks.blocksConfig.gridBlock) {
164
+ // This is required in order to initialize the inner blocksConfig
165
+ // for the grid block, since the slate block lives in an add-on
166
+ // it should be responsible to fill itself into the grid configuration
167
+ config.blocks.blocksConfig.gridBlock.blocksConfig.slate = slateBlockConfig;
168
+ }
169
+
167
170
  return config;
168
- };
171
+ }
@@ -43,6 +43,7 @@ import {
43
43
  bTagDeserializer,
44
44
  codeTagDeserializer,
45
45
  } from './deserialize';
46
+ import { renderLinkElement } from './render';
46
47
 
47
48
  // Registry of available buttons
48
49
  export const buttons = {
@@ -234,10 +235,10 @@ export const defaultBlockType = 'p';
234
235
  export const elements = {
235
236
  default: ({ attributes, children }) => <p {...attributes}>{children}</p>,
236
237
 
237
- h1: ({ attributes, children }) => <h1 {...attributes}>{children}</h1>,
238
- h2: ({ attributes, children }) => <h2 {...attributes}>{children}</h2>,
239
- h3: ({ attributes, children }) => <h3 {...attributes}>{children}</h3>,
240
- h4: ({ attributes, children }) => <h4 {...attributes}>{children}</h4>,
238
+ h1: renderLinkElement('h1'),
239
+ h2: renderLinkElement('h2'),
240
+ h3: renderLinkElement('h3'),
241
+ h4: renderLinkElement('h4'),
241
242
 
242
243
  li: ({ attributes, children }) => <li {...attributes}>{children}</li>,
243
244
  ol: ({ attributes, children }) => <ol {...attributes}>{children}</ol>,
@@ -95,7 +95,6 @@ export const blockTagDeserializer = (tagname) => (editor, el, options) => {
95
95
  children = [{ text: '' }];
96
96
  }
97
97
 
98
- console.log('children', children);
99
98
  return jsx('element', { type: tagname }, children);
100
99
  };
101
100
 
@@ -1,9 +1,9 @@
1
1
  import * as slateConfig from './config';
2
2
  import installDefaultPlugins from './plugins';
3
- export SlateEditor from './SlateEditor';
4
- export EditorReference from './EditorReference';
3
+ export { default as SlateEditor } from './SlateEditor';
4
+ export { default as EditorReference } from './EditorReference';
5
5
 
6
- export default (config) => {
6
+ export default function applyConfig(config) {
7
7
  config.settings.slate = {
8
8
  ...slateConfig,
9
9
  // showExpandedToolbar: false,
@@ -11,4 +11,4 @@ export default (config) => {
11
11
  };
12
12
  config = installDefaultPlugins(config);
13
13
  return config;
14
- };
14
+ }
@@ -0,0 +1,28 @@
1
+ h1,
2
+ h2,
3
+ h3,
4
+ h4 {
5
+ &:hover {
6
+ a.anchor {
7
+ svg {
8
+ opacity: 1;
9
+ transform: rotate(15deg);
10
+ }
11
+ }
12
+ }
13
+
14
+ a.anchor {
15
+ position: absolute;
16
+ display: inline-block;
17
+ margin-left: 5px;
18
+ vertical-align: middle;
19
+
20
+ svg {
21
+ width: 1.6ch;
22
+ fill: #42526e;
23
+ opacity: 0;
24
+ transform: rotate(15deg) translate(-8px, 2px);
25
+ transition: opacity 0.2s ease 0s, transform 0.2s ease 0s;
26
+ }
27
+ }
28
+ }
@@ -1,4 +1,5 @@
1
1
  import React from 'react';
2
+ import cx from 'classnames';
2
3
  import { UniversalLink } from '@plone/volto/components';
3
4
  import config from '@plone/volto/registry';
4
5
  import { isInternalURL, flattenToAppURL } from '@plone/volto/helpers';
@@ -20,18 +21,16 @@ const ViewLink = ({ url, target, download, children }) => {
20
21
 
21
22
  export const LinkElement = (props) => {
22
23
  const { attributes, children, element, mode = 'edit' } = props;
24
+ const isInternalUrl = isInternalURL(element.data?.url);
25
+ const linkUrl = element.data?.url;
23
26
 
24
27
  return mode === 'view' ? (
25
28
  <ViewLink {...(element.data || {})}>{children}</ViewLink>
26
29
  ) : (
27
30
  <a
28
31
  {...attributes}
29
- className="slate-editor-link"
30
- href={
31
- isInternalURL(element.data?.url)
32
- ? flattenToAppURL(element.data?.url)
33
- : element.data?.url
34
- }
32
+ className={cx('slate-editor-link', { external: !isInternalUrl })}
33
+ href={isInternalUrl ? flattenToAppURL(linkUrl) : linkUrl}
35
34
  onClick={(e) => e.preventDefault()}
36
35
  >
37
36
  {Array.isArray(children)