@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
@@ -1,4 +1,4 @@
1
- import React from 'react';
1
+ import React, { useRef } from 'react';
2
2
  import { useDispatch, useSelector } from 'react-redux';
3
3
  import hoistNonReactStatics from 'hoist-non-react-statics';
4
4
  import useDeepCompareEffect from 'use-deep-compare-effect';
@@ -14,18 +14,23 @@ function getDisplayName(WrappedComponent) {
14
14
 
15
15
  export default function withQuerystringResults(WrappedComponent) {
16
16
  function WithQuerystringResults(props) {
17
- const { data = {}, properties: content, path, variation } = props;
17
+ const {
18
+ data = {},
19
+ id = data.block,
20
+ properties: content,
21
+ path,
22
+ variation,
23
+ } = props;
18
24
  const { settings } = config;
19
25
  const querystring = data.querystring || data; // For backwards compat with data saved before Blocks schema. Note, this is also how the Search block passes data to ListingBody
20
-
21
- const { block } = data;
26
+ const subrequestID = content?.UID ? `${content?.UID}-${id}` : id;
22
27
  const { b_size = settings.defaultPageSize } = querystring; // batchsize
23
28
 
24
29
  // save the path so it won't trigger dispatch on eager router location change
25
30
  const [initialPath] = React.useState(getBaseUrl(path));
26
31
 
27
32
  const copyFields = ['limit', 'query', 'sort_on', 'sort_order', 'depth'];
28
-
33
+ const { currentPage, setCurrentPage } = usePagination(id, 1);
29
34
  const adaptedQuery = Object.assign(
30
35
  variation?.fullobjects ? { fullobjects: 1 } : { metadata_fields: '_all' },
31
36
  {
@@ -37,7 +42,9 @@ export default function withQuerystringResults(WrappedComponent) {
37
42
  : {},
38
43
  ),
39
44
  );
40
- const { currentPage, setCurrentPage } = usePagination(querystring, 1);
45
+ const adaptedQueryRef = useRef(adaptedQuery);
46
+ const currentPageRef = useRef(currentPage);
47
+
41
48
  const querystringResults = useSelector(
42
49
  (state) => state.querystringsearch.subrequests,
43
50
  );
@@ -45,32 +52,33 @@ export default function withQuerystringResults(WrappedComponent) {
45
52
 
46
53
  const folderItems = content?.is_folderish ? content.items : [];
47
54
  const hasQuery = querystring?.query?.length > 0;
48
- const hasLoaded = hasQuery ? !querystringResults?.[block]?.loading : true;
55
+ const hasLoaded = hasQuery
56
+ ? querystringResults?.[subrequestID]?.loaded
57
+ : true;
49
58
 
50
- const listingItems =
51
- querystring?.query?.length > 0 && querystringResults?.[block]
52
- ? querystringResults?.[block]?.items || []
53
- : folderItems;
59
+ const listingItems = hasQuery
60
+ ? querystringResults?.[subrequestID]?.items || []
61
+ : folderItems;
54
62
 
55
63
  const showAsFolderListing = !hasQuery && content?.items_total > b_size;
56
64
  const showAsQueryListing =
57
- hasQuery && querystringResults?.[block]?.total > b_size;
65
+ hasQuery && querystringResults?.[subrequestID]?.total > b_size;
58
66
 
59
67
  const totalPages = showAsFolderListing
60
68
  ? Math.ceil(content.items_total / b_size)
61
69
  : showAsQueryListing
62
- ? Math.ceil(querystringResults[block].total / b_size)
70
+ ? Math.ceil(querystringResults[subrequestID].total / b_size)
63
71
  : 0;
64
72
 
65
73
  const prevBatch = showAsFolderListing
66
74
  ? content.batching?.prev
67
75
  : showAsQueryListing
68
- ? querystringResults[block].batching?.prev
76
+ ? querystringResults[subrequestID].batching?.prev
69
77
  : null;
70
78
  const nextBatch = showAsFolderListing
71
79
  ? content.batching?.next
72
80
  : showAsQueryListing
73
- ? querystringResults[block].batching?.next
81
+ ? querystringResults[subrequestID].batching?.next
74
82
  : null;
75
83
 
76
84
  const isImageGallery =
@@ -80,7 +88,12 @@ export default function withQuerystringResults(WrappedComponent) {
80
88
  useDeepCompareEffect(() => {
81
89
  if (hasQuery) {
82
90
  dispatch(
83
- getQueryStringResults(initialPath, adaptedQuery, block, currentPage),
91
+ getQueryStringResults(
92
+ initialPath,
93
+ adaptedQuery,
94
+ subrequestID,
95
+ currentPage,
96
+ ),
84
97
  );
85
98
  } else if (isImageGallery && !hasQuery) {
86
99
  // when used as image gallery, it doesn't need a query to list children
@@ -98,14 +111,16 @@ export default function withQuerystringResults(WrappedComponent) {
98
111
  },
99
112
  ],
100
113
  },
101
- block,
114
+ subrequestID,
102
115
  ),
103
116
  );
104
117
  } else {
105
118
  dispatch(getContent(initialPath, null, null, currentPage));
106
119
  }
120
+ adaptedQueryRef.current = adaptedQuery;
121
+ currentPageRef.current = currentPage;
107
122
  }, [
108
- block,
123
+ subrequestID,
109
124
  isImageGallery,
110
125
  adaptedQuery,
111
126
  hasQuery,
@@ -118,7 +133,7 @@ export default function withQuerystringResults(WrappedComponent) {
118
133
  <WrappedComponent
119
134
  {...props}
120
135
  onPaginationChange={(e, { activePage }) => setCurrentPage(activePage)}
121
- total={querystringResults?.[block]?.total}
136
+ total={querystringResults?.[subrequestID]?.total}
122
137
  batch_size={b_size}
123
138
  currentPage={currentPage}
124
139
  totalPages={totalPages}
@@ -1,14 +1,8 @@
1
- /**
2
- * Edit map block.
3
- * @module components/manage/Blocks/Maps/Edit
4
- */
5
-
6
- import React, { Component } from 'react';
1
+ import React, { useState, useCallback, useMemo } from 'react';
7
2
  import PropTypes from 'prop-types';
8
3
  import { Button, Input, Message } from 'semantic-ui-react';
9
- import { defineMessages, FormattedMessage, injectIntl } from 'react-intl';
4
+ import { defineMessages, FormattedMessage, useIntl } from 'react-intl';
10
5
  import cx from 'classnames';
11
- import { isEqual } from 'lodash';
12
6
  import { withBlockExtensions } from '@plone/volto/helpers';
13
7
  import { compose } from 'redux';
14
8
  import { Icon, SidebarPortal, MapsSidebar } from '@plone/volto/components';
@@ -43,230 +37,162 @@ const messages = defineMessages({
43
37
  },
44
38
  });
45
39
 
46
- /**
47
- * Edit image block class.
48
- * @class Edit
49
- * @extends Component
50
- */
51
- class Edit extends Component {
52
- /**
53
- * Property types.
54
- * @property {Object} propTypes Property types.
55
- * @static
56
- */
57
- static propTypes = {
58
- selected: PropTypes.bool.isRequired,
59
- block: PropTypes.string.isRequired,
60
- index: PropTypes.number.isRequired,
61
- data: PropTypes.objectOf(PropTypes.any).isRequired,
62
- pathname: PropTypes.string.isRequired,
63
- onChangeBlock: PropTypes.func.isRequired,
64
- onSelectBlock: PropTypes.func.isRequired,
65
- onDeleteBlock: PropTypes.func.isRequired,
66
- onFocusPreviousBlock: PropTypes.func.isRequired,
67
- onFocusNextBlock: PropTypes.func.isRequired,
68
- handleKeyDown: PropTypes.func.isRequired,
69
- };
70
-
71
- /**
72
- * Constructor
73
- * @method constructor
74
- * @param {Object} props Component properties
75
- * @constructs WysiwygEditor
76
- */
77
- constructor(props) {
78
- super(props);
79
- this.getSrc = this.getSrc.bind(this);
80
- this.state = {
81
- url: '',
82
- error: null,
83
- };
84
- this.onSubmitUrl = this.onSubmitUrl.bind(this);
85
- this.onKeyDownVariantMenuForm = this.onKeyDownVariantMenuForm.bind(this);
86
- }
87
-
88
- /**
89
- * @param {*} nextProps
90
- * @returns {boolean}
91
- * @memberof Edit
92
- */
93
- shouldComponentUpdate(nextProps) {
94
- return (
95
- this.props.selected ||
96
- nextProps.selected ||
97
- !isEqual(this.props.data, nextProps.data)
98
- );
99
- }
40
+ const Edit = React.memo((props) => {
41
+ const intl = useIntl();
42
+ const [url, setUrl] = useState('');
43
+ const [error, setError] = useState(null);
100
44
 
101
- /**
102
- * Change url handler
103
- * @method onChangeUrl
104
- * @param {Object} target Target object
105
- * @returns {undefined}
106
- */
107
- onChangeUrl = ({ target }) => {
108
- this.setState({
109
- url: target.value,
110
- });
45
+ const { onChangeBlock, data, block, selected } = props;
46
+ const onChangeUrl = ({ target }) => {
47
+ setUrl(target.value);
111
48
  };
112
49
 
113
- /**
114
- * Submit url handler
115
- * @method onSubmitUrl
116
- * @param {string} e event
117
- * @returns {undefined}
118
- */
119
- onSubmitUrl() {
120
- this.props.onChangeBlock(this.props.block, {
121
- ...this.props.data,
122
- url: this.getSrc(this.state.url),
50
+ const onSubmitUrl = useCallback(() => {
51
+ onChangeBlock(block, {
52
+ ...data,
53
+ url: getSrc(url),
123
54
  });
124
- }
55
+ }, [onChangeBlock, block, data, url]);
125
56
 
126
- /**
127
- * Keydown handler on Variant Menu Form
128
- * This is required since the ENTER key is already mapped to a onKeyDown
129
- * event and needs to be overriden with a child onKeyDown.
130
- * @method onKeyDownVariantMenuForm
131
- * @param {Object} e Event object
132
- * @returns {undefined}
133
- */
134
- onKeyDownVariantMenuForm(e) {
135
- if (e.key === 'Enter') {
136
- e.preventDefault();
137
- e.stopPropagation();
138
- this.onSubmitUrl();
139
- } else if (e.key === 'Escape') {
140
- e.preventDefault();
141
- e.stopPropagation();
142
- // TODO: Do something on ESC key
143
- }
144
- }
57
+ const onKeyDownVariantMenuForm = useCallback(
58
+ (e) => {
59
+ if (e.key === 'Enter') {
60
+ e.preventDefault();
61
+ e.stopPropagation();
62
+ onSubmitUrl();
63
+ } else if (e.key === 'Escape') {
64
+ e.preventDefault();
65
+ e.stopPropagation();
66
+ // TODO: Do something on ESC key
67
+ }
68
+ },
69
+ [onSubmitUrl],
70
+ );
145
71
 
146
- /**
147
- * get getSrc handler
148
- * @method getSrc
149
- * @param {string} embed Embed HTML code from Google Maps share option
150
- * @returns {string} Source URL
151
- */
152
- getSrc(embed) {
72
+ const getSrc = (embed) => {
153
73
  const parser = new DOMParser();
154
74
  const doc = parser.parseFromString(embed, 'text/html');
155
75
  const iframe = doc.getElementsByTagName('iframe');
156
76
  if (iframe.length === 0) {
157
- this.setState({ error: true });
77
+ setError(true);
158
78
  return '';
159
79
  }
160
- this.setState({ error: false });
80
+ setError(false);
161
81
  return iframe[0].src;
162
- }
82
+ };
163
83
 
164
- resetSubmitUrl = () => {
165
- this.setState({
166
- url: '',
167
- });
84
+ const resetSubmitUrl = () => {
85
+ setUrl('');
168
86
  };
169
87
 
170
- /**
171
- * Render method.
172
- * @method render
173
- * @returns {string} Markup for the component.
174
- */
175
- render() {
176
- const placeholder =
177
- this.props.data.placeholder ||
178
- this.props.intl.formatMessage(messages.MapsBlockInputPlaceholder);
179
- return (
180
- <div
181
- className={cx(
182
- 'block maps align',
183
- {
184
- center: !Boolean(this.props.data.align),
185
- },
186
- this.props.data.align,
187
- )}
188
- >
189
- {this.props.data.url ? (
190
- <div
191
- className={cx('maps-inner', {
192
- 'full-width': this.props.data.align === 'full',
193
- })}
194
- >
195
- <iframe
196
- title={this.props.intl.formatMessage(
197
- messages.GoogleMapsEmbeddedBlock,
198
- )}
199
- src={this.props.data.url}
200
- className="google-map"
201
- frameBorder="0"
202
- allowFullScreen
203
- />
204
- </div>
205
- ) : (
206
- <Message>
207
- <center>
208
- <img src={mapsBlockSVG} alt="" />
209
- <div className="toolbar-inner">
210
- <Input
211
- onKeyDown={this.onKeyDownVariantMenuForm}
212
- onChange={this.onChangeUrl}
213
- placeholder={placeholder}
214
- value={this.state.url}
215
- // Prevents propagation to the Dropzone and the opening
216
- // of the upload browser dialog
217
- onClick={(e) => e.stopPropagation()}
218
- />
219
- {this.state.url && (
220
- <Button.Group>
221
- <Button
222
- basic
223
- className="cancel"
224
- onClick={(e) => {
225
- e.stopPropagation();
226
- this.setState({ url: '' });
227
- }}
228
- >
229
- <Icon name={clearSVG} size="30px" />
230
- </Button>
231
- </Button.Group>
232
- )}
88
+ const placeholder = useMemo(
89
+ () =>
90
+ data.placeholder ||
91
+ intl.formatMessage(messages.MapsBlockInputPlaceholder),
92
+ [data, intl],
93
+ );
94
+
95
+ return (
96
+ <div
97
+ className={cx(
98
+ 'block maps align',
99
+ {
100
+ center: !Boolean(data.align),
101
+ },
102
+ data.align,
103
+ )}
104
+ >
105
+ {data.url ? (
106
+ <div
107
+ className={cx('maps-inner', {
108
+ 'full-width': data.align === 'full',
109
+ })}
110
+ >
111
+ <iframe
112
+ title={intl.formatMessage(messages.GoogleMapsEmbeddedBlock)}
113
+ src={data.url}
114
+ className="google-map"
115
+ frameBorder="0"
116
+ allowFullScreen
117
+ />
118
+ </div>
119
+ ) : (
120
+ <Message>
121
+ <center>
122
+ <img src={mapsBlockSVG} alt="" />
123
+ <div className="toolbar-inner">
124
+ <Input
125
+ onKeyDown={onKeyDownVariantMenuForm}
126
+ onChange={onChangeUrl}
127
+ placeholder={placeholder}
128
+ value={url}
129
+ // Prevents propagation to the Dropzone and the opening
130
+ // of the upload browser dialog
131
+ onClick={(e) => e.stopPropagation()}
132
+ />
133
+ {url && (
233
134
  <Button.Group>
234
135
  <Button
235
136
  basic
236
- primary
137
+ className="cancel"
237
138
  onClick={(e) => {
238
139
  e.stopPropagation();
239
- this.onSubmitUrl();
140
+ setUrl('');
240
141
  }}
241
142
  >
242
- <Icon name={aheadSVG} size="30px" />
143
+ <Icon name={clearSVG} size="30px" />
243
144
  </Button>
244
145
  </Button.Group>
245
- </div>
246
- <div className="message-text">
247
- <FormattedMessage
248
- id="Please enter the Embed Code provided by Google Maps -> Share -> Embed map. It should contain the <iframe> code on it."
249
- defaultMessage="Please enter the Embed Code provided by Google Maps -> Share -> Embed map. It should contain the <iframe> code on it."
250
- />
251
- {this.state.error && (
252
- <div style={{ color: 'red' }}>
253
- <FormattedMessage
254
- id="Embed code error, please follow the instructions and try again."
255
- defaultMessage="Embed code error, please follow the instructions and try again."
256
- />
257
- </div>
258
- )}
259
- </div>
260
- </center>
261
- </Message>
262
- )}
263
- {!this.props.selected && <div className="map-overlay" />}
264
- <SidebarPortal selected={this.props.selected}>
265
- <MapsSidebar {...this.props} resetSubmitUrl={this.resetSubmitUrl} />
266
- </SidebarPortal>
267
- </div>
268
- );
269
- }
270
- }
146
+ )}
147
+ <Button.Group>
148
+ <Button
149
+ basic
150
+ primary
151
+ onClick={(e) => {
152
+ e.stopPropagation();
153
+ onSubmitUrl();
154
+ }}
155
+ >
156
+ <Icon name={aheadSVG} size="30px" />
157
+ </Button>
158
+ </Button.Group>
159
+ </div>
160
+ <div className="message-text">
161
+ <FormattedMessage
162
+ id="Please enter the Embed Code provided by Google Maps -> Share -> Embed map. It should contain the <iframe> code on it."
163
+ defaultMessage="Please enter the Embed Code provided by Google Maps -> Share -> Embed map. It should contain the <iframe> code on it."
164
+ />
165
+ {error && (
166
+ <div style={{ color: 'red' }}>
167
+ <FormattedMessage
168
+ id="Embed code error, please follow the instructions and try again."
169
+ defaultMessage="Embed code error, please follow the instructions and try again."
170
+ />
171
+ </div>
172
+ )}
173
+ </div>
174
+ </center>
175
+ </Message>
176
+ )}
177
+ {!selected && <div className="map-overlay" />}
178
+ <SidebarPortal selected={selected}>
179
+ <MapsSidebar {...props} resetSubmitUrl={resetSubmitUrl} />
180
+ </SidebarPortal>
181
+ </div>
182
+ );
183
+ });
271
184
 
272
- export default compose(injectIntl, withBlockExtensions)(Edit);
185
+ Edit.propTypes = {
186
+ selected: PropTypes.bool.isRequired,
187
+ block: PropTypes.string.isRequired,
188
+ index: PropTypes.number.isRequired,
189
+ data: PropTypes.objectOf(PropTypes.any).isRequired,
190
+ pathname: PropTypes.string.isRequired,
191
+ onChangeBlock: PropTypes.func.isRequired,
192
+ onSelectBlock: PropTypes.func.isRequired,
193
+ onDeleteBlock: PropTypes.func.isRequired,
194
+ onFocusPreviousBlock: PropTypes.func.isRequired,
195
+ onFocusNextBlock: PropTypes.func.isRequired,
196
+ handleKeyDown: PropTypes.func.isRequired,
197
+ };
198
+ export default compose(withBlockExtensions)(Edit);
@@ -40,8 +40,7 @@ test('renders an edit map block component', () => {
40
40
  <Edit
41
41
  data={{
42
42
  '@type': 'maps',
43
- url:
44
- 'https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3027.7835278268726!2d14.38842915203974!3d40.634655679238854!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x133b994881d943cb%3A0x6ab93db57d3272f0!2sHotel+Mediterraneo+Sorrento!5e0!3m2!1sen!2ses!4v1550168740166',
43
+ url: 'https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3027.7835278268726!2d14.38842915203974!3d40.634655679238854!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x133b994881d943cb%3A0x6ab93db57d3272f0!2sHotel+Mediterraneo+Sorrento!5e0!3m2!1sen!2ses!4v1550168740166',
45
44
  }}
46
45
  selected={false}
47
46
  block="1234"
@@ -36,8 +36,7 @@ test('renders a view map component', () => {
36
36
  <View
37
37
  data={{
38
38
  '@type': 'maps',
39
- url:
40
- 'https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3027.7835278268726!2d14.38842915203974!3d40.634655679238854!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x133b994881d943cb%3A0x6ab93db57d3272f0!2sHotel+Mediterraneo+Sorrento!5e0!3m2!1sen!2ses!4v1550168740166',
39
+ url: 'https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3027.7835278268726!2d14.38842915203974!3d40.634655679238854!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x133b994881d943cb%3A0x6ab93db57d3272f0!2sHotel+Mediterraneo+Sorrento!5e0!3m2!1sen!2ses!4v1550168740166',
41
40
  }}
42
41
  />
43
42
  </Provider>,
@@ -1,5 +1,4 @@
1
- import React from 'react';
2
- import useDeepCompareEffect from 'use-deep-compare-effect';
1
+ import React, { useEffect } from 'react';
3
2
  import { defineMessages } from 'react-intl';
4
3
  import { compose } from 'redux';
5
4
 
@@ -60,9 +59,11 @@ const SearchBlockEdit = (props) => {
60
59
  };
61
60
 
62
61
  const { query = {} } = data || {};
63
- useDeepCompareEffect(() => {
62
+ // We don't need deep compare here, as this is just json serializable data.
63
+ const deepQuery = JSON.stringify(query);
64
+ useEffect(() => {
64
65
  onTriggerSearch();
65
- }, [query, onTriggerSearch]);
66
+ }, [deepQuery, onTriggerSearch]);
66
67
 
67
68
  return (
68
69
  <>
@@ -9,6 +9,7 @@ import { withSearch, withQueryString } from './hocs';
9
9
  import { compose } from 'redux';
10
10
  import { useSelector } from 'react-redux';
11
11
  import { isEqual, isFunction } from 'lodash';
12
+ import cx from 'classnames';
12
13
 
13
14
  const getListingBodyVariation = (data) => {
14
15
  const { variations } = config.blocks.blocksConfig.listing;
@@ -57,7 +58,7 @@ const applyDefaults = (data, root) => {
57
58
  };
58
59
 
59
60
  const SearchBlockView = (props) => {
60
- const { data, searchData, mode = 'view', variation } = props;
61
+ const { id, data, searchData, mode = 'view', variation, className } = props;
61
62
 
62
63
  const Layout = variation.view;
63
64
 
@@ -81,7 +82,7 @@ const SearchBlockView = (props) => {
81
82
  const listingBodyVariation = variations.find(({ id }) => id === selectedView);
82
83
 
83
84
  return (
84
- <div className="block search">
85
+ <div className={cx('block search', selectedView, className)}>
85
86
  <Layout
86
87
  {...props}
87
88
  isEditMode={mode === 'edit'}
@@ -89,6 +90,7 @@ const SearchBlockView = (props) => {
89
90
  setSelectedView={setSelectedView}
90
91
  >
91
92
  <ListingBody
93
+ id={id}
92
94
  variation={{ ...data, ...listingBodyVariation }}
93
95
  data={listingBodyData}
94
96
  path={props.path}
@@ -4,6 +4,7 @@ import { defineMessages, injectIntl } from 'react-intl';
4
4
  import { injectLazyLibs } from '@plone/volto/helpers/Loadable/Loadable';
5
5
  import { compose } from 'redux';
6
6
  import { Icon } from '@plone/volto/components';
7
+ import { toBackendLang } from '@plone/volto/helpers/Utils/Utils';
7
8
  import { connect } from 'react-redux';
8
9
 
9
10
  import leftKey from '@plone/volto/icons/left-key.svg';
@@ -82,7 +83,9 @@ const DateRangeFacet = (props) => {
82
83
  noBorder
83
84
  showClearDates
84
85
  customCloseIcon={<CloseIcon />}
85
- displayFormat={moment.localeData(lang).longDateFormat('L')}
86
+ displayFormat={moment
87
+ .localeData(toBackendLang(lang))
88
+ .longDateFormat('L')}
86
89
  focusedInput={focused}
87
90
  onFocusChange={(focusedInput) => setFocused(focusedInput)}
88
91
  onDatesChange={({ startDate, endDate }) => {