@plone/volto 17.0.0-alpha.2 → 17.0.0-alpha.21

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 (318) hide show
  1. package/.yarn/install-state.gz +0 -0
  2. package/CHANGELOG.md +549 -15
  3. package/CONTRIBUTING.md +1 -1
  4. package/README.md +11 -14
  5. package/addon-registry.js +34 -0
  6. package/create-theme-addons-loader.js +79 -0
  7. package/cypress/support/commands.js +58 -5
  8. package/cypress/support/e2e.js +1 -2
  9. package/cypress/support/volto-slate.js +4 -5
  10. package/docker-compose.yml +1 -1
  11. package/locales/ca/LC_MESSAGES/volto.po +282 -7
  12. package/locales/ca.json +1 -1
  13. package/locales/de/LC_MESSAGES/volto.po +301 -26
  14. package/locales/de.json +1 -1
  15. package/locales/en/LC_MESSAGES/volto.po +281 -6
  16. package/locales/en.json +1 -1
  17. package/locales/es/LC_MESSAGES/volto.po +291 -16
  18. package/locales/es.json +1 -1
  19. package/locales/eu/LC_MESSAGES/volto.po +282 -7
  20. package/locales/eu.json +1 -1
  21. package/locales/fi/LC_MESSAGES/volto.po +4891 -0
  22. package/locales/fi.json +1 -1
  23. package/locales/fr/LC_MESSAGES/volto.po +282 -7
  24. package/locales/fr.json +1 -1
  25. package/locales/it/LC_MESSAGES/volto.po +284 -9
  26. package/locales/it.json +1 -1
  27. package/locales/ja/LC_MESSAGES/volto.po +282 -7
  28. package/locales/ja.json +1 -1
  29. package/locales/nl/LC_MESSAGES/volto.po +937 -650
  30. package/locales/nl.json +1 -1
  31. package/locales/pt/LC_MESSAGES/volto.po +282 -7
  32. package/locales/pt.json +1 -1
  33. package/locales/pt_BR/LC_MESSAGES/volto.po +291 -16
  34. package/locales/pt_BR.json +1 -1
  35. package/locales/ro/LC_MESSAGES/volto.po +282 -7
  36. package/locales/ro.json +1 -1
  37. package/locales/volto.pot +282 -7
  38. package/locales/zh_CN/LC_MESSAGES/volto.po +282 -7
  39. package/locales/zh_CN.json +1 -1
  40. package/package.json +8 -6
  41. package/packages/volto-slate/build/messages/src/blocks/Table/TableBlockEdit.json +1 -1
  42. package/packages/volto-slate/build/messages/src/blocks/Text/DefaultTextBlockEditor.json +1 -1
  43. package/packages/volto-slate/build/messages/src/blocks/Text/DetachedTextBlockEditor.json +1 -1
  44. package/packages/volto-slate/build/messages/src/blocks/Text/SlashMenu.json +1 -1
  45. package/packages/volto-slate/build/messages/src/editor/plugins/AdvancedLink/index.json +1 -1
  46. package/packages/volto-slate/build/messages/src/editor/plugins/Link/index.json +1 -1
  47. package/packages/volto-slate/build/messages/src/editor/plugins/Table/index.json +1 -1
  48. package/packages/volto-slate/build/messages/src/elementEditor/messages.json +1 -1
  49. package/packages/volto-slate/build/messages/src/widgets/HtmlSlateWidget.json +1 -1
  50. package/packages/volto-slate/build/messages/src/widgets/RichTextWidgetView.json +1 -1
  51. package/packages/volto-slate/package.json +1 -1
  52. package/packages/volto-slate/src/actions/index.js +1 -1
  53. package/packages/volto-slate/src/blocks/Table/TableBlockEdit.jsx +21 -212
  54. package/packages/volto-slate/src/blocks/Table/schema.js +122 -0
  55. package/packages/volto-slate/src/blocks/Text/DefaultTextBlockEditor.jsx +8 -3
  56. package/packages/volto-slate/src/blocks/Text/SlashMenu.jsx +4 -3
  57. package/packages/volto-slate/src/blocks/Text/TextBlockView.jsx +20 -16
  58. package/packages/volto-slate/src/blocks/Text/extensions/withDeserializers.js +3 -1
  59. package/packages/volto-slate/src/blocks/Text/index.js +10 -2
  60. package/packages/volto-slate/src/editor/config.jsx +5 -4
  61. package/packages/volto-slate/src/editor/deserialize.js +0 -1
  62. package/packages/volto-slate/src/editor/index.js +4 -4
  63. package/packages/volto-slate/src/editor/less/slate.less +28 -0
  64. package/packages/volto-slate/src/editor/plugins/StyleMenu/StyleMenu.jsx +14 -4
  65. package/packages/volto-slate/src/editor/plugins/StyleMenu/utils.js +14 -5
  66. package/packages/volto-slate/src/editor/render.jsx +68 -8
  67. package/packages/volto-slate/src/editor/ui/SlateContextToolbar.jsx +2 -2
  68. package/packages/volto-slate/src/editor/ui/index.js +15 -15
  69. package/packages/volto-slate/src/index.js +2 -2
  70. package/packages/volto-slate/src/utils/blocks.js +7 -0
  71. package/packages/volto-slate/src/widgets/RichTextWidget.jsx +15 -8
  72. package/razzle.config.js +28 -0
  73. package/src/actions/index.js +6 -0
  74. package/src/actions/language/language.js +9 -8
  75. package/src/actions/querystringsearch/querystringsearch.js +20 -14
  76. package/src/actions/relations/rebuild.js +25 -0
  77. package/src/actions/relations/relations.js +86 -0
  78. package/src/actions/relations/relations.test.js +15 -0
  79. package/src/components/index.js +3 -0
  80. package/src/components/manage/Add/Add.jsx +2 -2
  81. package/src/components/manage/AnchorPlugin/index.jsx +2 -2
  82. package/src/components/manage/AnchorPlugin/utils/EditorUtils.js +3 -1
  83. package/src/components/manage/BlockChooser/BlockChooser.jsx +14 -5
  84. package/src/components/manage/BlockChooser/BlockChooser.test.jsx +5 -0
  85. package/src/components/manage/Blocks/Block/BlocksForm.jsx +19 -2
  86. package/src/components/manage/Blocks/Block/Edit.jsx +1 -1
  87. package/src/components/manage/Blocks/Block/Style.jsx +2 -2
  88. package/src/components/manage/Blocks/Container/Data.jsx +32 -0
  89. package/src/components/manage/Blocks/Container/Edit.jsx +174 -0
  90. package/src/components/manage/Blocks/Container/EditBlockWrapper.jsx +120 -0
  91. package/src/components/manage/Blocks/Container/NewBlockAddButton.jsx +84 -0
  92. package/src/components/manage/Blocks/Container/SimpleContainerToolbar.jsx +54 -0
  93. package/src/components/manage/Blocks/Grid/Edit.jsx +33 -0
  94. package/src/components/manage/Blocks/Grid/View.jsx +43 -0
  95. package/src/components/manage/Blocks/Grid/adapter.js +14 -0
  96. package/src/components/manage/Blocks/Grid/grid-1.svg +6 -0
  97. package/src/components/manage/Blocks/Grid/grid-2.svg +9 -0
  98. package/src/components/manage/Blocks/Grid/grid-3.svg +10 -0
  99. package/src/components/manage/Blocks/Grid/grid-4.svg +11 -0
  100. package/src/components/manage/Blocks/Grid/schema.js +35 -0
  101. package/src/components/manage/Blocks/Grid/templates.js +47 -0
  102. package/src/components/manage/Blocks/HeroImageLeft/Edit.jsx +6 -1
  103. package/src/components/manage/Blocks/Image/Edit.jsx +51 -12
  104. package/src/components/manage/Blocks/Image/Edit.test.jsx +2 -0
  105. package/src/components/manage/Blocks/Image/ImageSidebar.jsx +66 -16
  106. package/src/components/manage/Blocks/Image/View.jsx +25 -5
  107. package/src/components/manage/Blocks/Image/View.test.jsx +20 -0
  108. package/src/components/manage/Blocks/Image/schema.js +12 -9
  109. package/src/components/manage/Blocks/Image/utils.js +14 -0
  110. package/src/components/manage/Blocks/LeadImage/Edit.jsx +32 -10
  111. package/src/components/manage/Blocks/LeadImage/Edit.test.jsx +11 -1
  112. package/src/components/manage/Blocks/LeadImage/LeadImageSidebar.jsx +28 -9
  113. package/src/components/manage/Blocks/LeadImage/LeadImageSidebar.test.jsx +8 -2
  114. package/src/components/manage/Blocks/LeadImage/View.jsx +50 -38
  115. package/src/components/manage/Blocks/LeadImage/View.test.jsx +11 -1
  116. package/src/components/manage/Blocks/Listing/DefaultTemplate.jsx +18 -3
  117. package/src/components/manage/Blocks/Listing/Edit.jsx +0 -14
  118. package/src/components/manage/Blocks/Listing/ListingBody.jsx +30 -8
  119. package/src/components/manage/Blocks/Listing/ListingBody.test.jsx +20 -0
  120. package/src/components/manage/Blocks/Listing/SummaryTemplate.jsx +1 -1
  121. package/src/components/manage/Blocks/Listing/getAsyncData.js +9 -3
  122. package/src/components/manage/Blocks/Listing/withQuerystringResults.jsx +26 -18
  123. package/src/components/manage/Blocks/Search/SearchBlockEdit.jsx +5 -4
  124. package/src/components/manage/Blocks/Search/SearchBlockView.jsx +2 -1
  125. package/src/components/manage/Blocks/Search/components/DateRangeFacet.jsx +4 -1
  126. package/src/components/manage/Blocks/Search/components/Facets.jsx +64 -4
  127. package/src/components/manage/Blocks/Search/components/SearchInput.jsx +9 -2
  128. package/src/components/manage/Blocks/Search/components/index.js +13 -13
  129. package/src/components/manage/Blocks/Search/hocs/index.js +2 -2
  130. package/src/components/manage/Blocks/Search/hocs/withQueryString.jsx +2 -2
  131. package/src/components/manage/Blocks/Search/hocs/withSearch.jsx +43 -15
  132. package/src/components/manage/Blocks/Search/layout/LeftColumnFacets.jsx +17 -5
  133. package/src/components/manage/Blocks/Search/layout/RightColumnFacets.jsx +17 -5
  134. package/src/components/manage/Blocks/Search/layout/TopSideFacets.jsx +21 -5
  135. package/src/components/manage/Blocks/Search/schema.js +16 -1
  136. package/src/components/manage/Blocks/Teaser/Body.jsx +0 -1
  137. package/src/components/manage/Blocks/Teaser/DefaultBody.jsx +5 -10
  138. package/src/components/manage/Blocks/Teaser/schema.js +5 -0
  139. package/src/components/manage/Blocks/Title/View.jsx +15 -5
  140. package/src/components/manage/Blocks/Title/View.test.jsx +16 -1
  141. package/src/components/manage/Blocks/ToC/Schema.jsx +5 -1
  142. package/src/components/manage/Blocks/ToC/View.jsx +8 -1
  143. package/src/components/manage/Blocks/ToC/variations/DefaultTocRenderer.jsx +17 -4
  144. package/src/components/manage/Blocks/ToC/variations/HorizontalMenu.jsx +148 -10
  145. package/src/components/manage/Blocks/ToC/variations/index.js +3 -1
  146. package/src/components/manage/Contents/Contents.jsx +47 -32
  147. package/src/components/manage/Contents/ContentsItem.jsx +6 -0
  148. package/src/components/manage/Contents/ContentsUploadModal.jsx +10 -5
  149. package/src/components/manage/Controlpanels/AddonsControlpanel.jsx +3 -3
  150. package/src/components/manage/Controlpanels/Controlpanels.jsx +199 -224
  151. package/src/components/manage/Controlpanels/Controlpanels.test.jsx +46 -7
  152. package/src/components/manage/Controlpanels/Relations/BrokenRelations.jsx +66 -0
  153. package/src/components/manage/Controlpanels/Relations/Relations.jsx +114 -0
  154. package/src/components/manage/Controlpanels/Relations/RelationsListing.jsx +479 -0
  155. package/src/components/manage/Controlpanels/Relations/RelationsMatrix.jsx +531 -0
  156. package/src/components/manage/Controlpanels/Users/UserGroupMembershipControlPanel.jsx +3 -3
  157. package/src/components/manage/Controlpanels/Users/UserGroupMembershipListing.jsx +51 -82
  158. package/src/components/manage/Controlpanels/Users/UserGroupMembershipMatrix.jsx +79 -75
  159. package/src/components/manage/DragDropList/DragDropList.jsx +18 -13
  160. package/src/components/manage/Form/Form.jsx +5 -3
  161. package/src/components/manage/Form/InlineForm.jsx +39 -9
  162. package/src/components/manage/Form/InlineFormState.js +8 -0
  163. package/src/components/manage/History/History.jsx +11 -1
  164. package/src/components/manage/LinksToItem/LinksToItem.jsx +209 -0
  165. package/src/components/manage/LinksToItem/LinksToItem.test.jsx +97 -0
  166. package/src/components/manage/Multilingual/CreateTranslation.jsx +2 -2
  167. package/src/components/manage/Multilingual/TranslationObject.jsx +4 -3
  168. package/src/components/manage/Preferences/ChangePassword.jsx +2 -2
  169. package/src/components/manage/Preferences/PersonalPreferences.jsx +2 -2
  170. package/src/components/manage/Sharing/Sharing.jsx +5 -1
  171. package/src/components/manage/Sidebar/AlignBlock.jsx +1 -1
  172. package/src/components/manage/TemplateChooser/TemplateChooser.jsx +38 -0
  173. package/src/components/manage/TemplateChooser/TemplateChooser.test.jsx +34 -0
  174. package/src/components/manage/TemplateChooser/template.svg +10 -0
  175. package/src/components/manage/Toast/Toast.jsx +2 -2
  176. package/src/components/manage/Toolbar/More.jsx +15 -0
  177. package/src/components/manage/Toolbar/Types.jsx +2 -2
  178. package/src/components/manage/UniversalLink/UniversalLink.jsx +2 -6
  179. package/src/components/manage/UniversalLink/UniversalLink.test.jsx +36 -0
  180. package/src/components/manage/Widgets/ColorPickerWidget.jsx +6 -1
  181. package/src/components/manage/Widgets/DatetimeWidget.jsx +9 -5
  182. package/src/components/manage/Widgets/FileWidget.jsx +2 -1
  183. package/src/components/manage/Widgets/ObjectListWidget.jsx +3 -8
  184. package/src/components/manage/Widgets/RecurrenceWidget/ByDayField.jsx +2 -1
  185. package/src/components/manage/Widgets/RecurrenceWidget/MonthOfTheYearField.jsx +2 -1
  186. package/src/components/manage/Widgets/RecurrenceWidget/Occurences.jsx +2 -1
  187. package/src/components/manage/Widgets/RecurrenceWidget/RecurrenceWidget.jsx +8 -3
  188. package/src/components/manage/Widgets/RecurrenceWidget/WeekdayOfTheMonthField.jsx +2 -1
  189. package/src/components/manage/Widgets/SelectUtils.js +1 -1
  190. package/src/components/manage/Widgets/SelectWidget.jsx +1 -1
  191. package/src/components/theme/Anontools/Anontools.jsx +44 -72
  192. package/src/components/theme/Anontools/Anontools.stories.jsx +16 -6
  193. package/src/components/theme/Anontools/Anontools.test.jsx +16 -2
  194. package/src/components/theme/Breadcrumbs/Breadcrumbs.jsx +52 -99
  195. package/src/components/theme/Breadcrumbs/Breadcrumbs.stories.jsx +14 -13
  196. package/src/components/theme/Comments/CommentEditModal.jsx +63 -115
  197. package/src/components/theme/Component/Component.jsx +1 -1
  198. package/src/components/theme/ContactForm/ContactForm.jsx +108 -192
  199. package/src/components/theme/ContactForm/ContactForm.stories.jsx +1 -1
  200. package/src/components/theme/ContactForm/ContactForm.test.jsx +2 -3
  201. package/src/components/theme/Footer/Footer.jsx +2 -13
  202. package/src/components/theme/Header/Header.jsx +37 -63
  203. package/src/components/theme/Header/Header.test.jsx +18 -0
  204. package/src/components/theme/Icon/Icon.jsx +2 -2
  205. package/src/components/theme/Image/Image.jsx +96 -0
  206. package/src/components/theme/Image/Image.test.jsx +125 -0
  207. package/src/components/theme/LanguageSelector/LanguageSelector.js +8 -3
  208. package/src/components/theme/Login/Login.jsx +1 -0
  209. package/src/components/theme/Logo/Logo.jsx +4 -1
  210. package/src/components/theme/MultilingualRedirector/MultilingualRedirector.jsx +2 -2
  211. package/src/components/theme/Navigation/NavItem.jsx +4 -2
  212. package/src/components/theme/NotFound/NotFound.jsx +55 -41
  213. package/src/components/theme/PasswordReset/PasswordReset.jsx +7 -4
  214. package/src/components/theme/PasswordReset/RequestPasswordReset.jsx +1 -1
  215. package/src/components/theme/PreviewImage/PreviewImage.jsx +25 -14
  216. package/src/components/theme/PreviewImage/PreviewImage.test.js +39 -16
  217. package/src/components/theme/SearchWidget/SearchWidget.jsx +38 -98
  218. package/src/components/theme/Sitemap/Sitemap.jsx +5 -3
  219. package/src/components/theme/View/AlbumView.jsx +20 -16
  220. package/src/components/theme/View/DefaultView.jsx +1 -1
  221. package/src/components/theme/View/EventDatesInfo.jsx +2 -1
  222. package/src/components/theme/View/EventView.jsx +36 -25
  223. package/src/components/theme/View/FileView.jsx +23 -18
  224. package/src/components/theme/View/ImageView.jsx +40 -32
  225. package/src/components/theme/View/ImageView.test.jsx +4 -0
  226. package/src/components/theme/View/LinkView.jsx +53 -78
  227. package/src/components/theme/View/ListingView.jsx +36 -28
  228. package/src/components/theme/View/NewsItemView.jsx +16 -17
  229. package/src/components/theme/View/RenderBlocks.jsx +56 -21
  230. package/src/components/theme/View/RenderEmptyBlock.jsx +5 -0
  231. package/src/components/theme/View/SummaryView.jsx +49 -39
  232. package/src/components/theme/View/TabularView.jsx +59 -53
  233. package/src/components/theme/Widgets/DateWidget.jsx +2 -1
  234. package/src/components/theme/Widgets/DatetimeWidget.jsx +2 -1
  235. package/src/components/theme/Widgets/RelationsWidget.jsx +13 -11
  236. package/src/config/Blocks.jsx +46 -0
  237. package/src/config/Components.jsx +2 -1
  238. package/src/config/ControlPanels.js +2 -0
  239. package/src/config/NonContentRoutes.jsx +1 -0
  240. package/src/config/RichTextEditor/Blocks.jsx +2 -2
  241. package/src/config/RichTextEditor/FromHTML.jsx +2 -2
  242. package/src/config/RichTextEditor/Styles.jsx +1 -1
  243. package/src/config/Widgets.jsx +2 -0
  244. package/src/config/index.js +24 -0
  245. package/src/config/server.js +2 -0
  246. package/src/constants/ActionTypes.js +4 -0
  247. package/src/constants/Indexes.js +3 -1
  248. package/src/constants/Languages.js +8 -4
  249. package/src/express-middleware/devproxy.js +1 -1
  250. package/src/express-middleware/files.js +3 -3
  251. package/src/express-middleware/images.js +4 -4
  252. package/src/express-middleware/ok.js +16 -0
  253. package/src/express-middleware/robotstxt.js +1 -1
  254. package/src/express-middleware/sitemap.js +37 -5
  255. package/src/express-middleware/static.js +3 -3
  256. package/src/helpers/Api/Api.js +1 -1
  257. package/src/helpers/Blocks/Blocks.js +48 -0
  258. package/src/helpers/Blocks/Blocks.test.js +79 -0
  259. package/src/helpers/Extensions/index.js +2 -1
  260. package/src/helpers/Extensions/withBlockSchemaEnhancer.js +15 -11
  261. package/src/helpers/Extensions/withBlockSchemaEnhancer.test.js +145 -0
  262. package/src/helpers/FormValidation/FormValidation.js +40 -2
  263. package/src/helpers/FormValidation/FormValidation.test.js +73 -0
  264. package/src/helpers/Html/Html.jsx +3 -1
  265. package/src/helpers/Html/Html.test.jsx +5 -0
  266. package/src/helpers/MessageLabels/MessageLabels.js +80 -0
  267. package/src/helpers/Robots/Robots.js +24 -6
  268. package/src/helpers/ScrollToTop/ScrollToTop.jsx +5 -3
  269. package/src/helpers/Sitemap/Sitemap.js +44 -2
  270. package/src/helpers/Url/Url.js +49 -7
  271. package/src/helpers/Url/Url.test.js +67 -0
  272. package/src/helpers/Utils/UseDetectClickOutside.stories.jsx +191 -0
  273. package/src/helpers/Utils/Utils.js +63 -13
  274. package/src/helpers/Utils/Utils.test.js +4 -4
  275. package/src/helpers/Utils/usePagination.js +67 -14
  276. package/src/helpers/Utils/usePagination.test.js +115 -0
  277. package/src/helpers/index.js +20 -10
  278. package/src/hooks/client/useClient.js +11 -0
  279. package/src/hooks/clipboard/useClipboard.js +26 -0
  280. package/src/hooks/index.js +2 -0
  281. package/src/icons/grid-block.svg +11 -0
  282. package/src/middleware/Api.test.js +54 -0
  283. package/src/middleware/api.js +24 -6
  284. package/src/middleware/index.js +2 -2
  285. package/src/reducers/actions/actions.js +8 -6
  286. package/src/reducers/actions/actions.test.js +70 -0
  287. package/src/reducers/breadcrumbs/breadcrumbs.js +1 -1
  288. package/src/reducers/index.js +2 -0
  289. package/src/reducers/navigation/navigation.js +1 -1
  290. package/src/reducers/relations/relations.js +173 -0
  291. package/src/reducers/types/types.js +1 -1
  292. package/src/routes.js +14 -0
  293. package/src/server.jsx +28 -23
  294. package/src/start-server.js +2 -2
  295. package/test-setup-config.js +11 -1
  296. package/theme/themes/pastanaga/extras/blocks.less +5 -1
  297. package/theme/themes/pastanaga/extras/contents.less +1 -0
  298. package/theme/themes/pastanaga/extras/grid.less +426 -0
  299. package/theme/themes/pastanaga/extras/main.less +8 -1
  300. package/theme/themes/pastanaga/extras/search.less +6 -0
  301. package/theme/themes/pastanaga/extras/sidebar.less +4 -0
  302. package/theme/themes/pastanaga/extras/toc.less +29 -0
  303. package/theme/themes/pastanaga/extras/userscontrolpanel.less +99 -76
  304. package/.changelog.draft +0 -31
  305. package/.editorconfig +0 -36
  306. package/.storybook/main.js +0 -127
  307. package/.storybook/manager.js +0 -15
  308. package/.storybook/preview.js +0 -21
  309. package/.storybook/static/previewImage.svg +0 -48
  310. package/.yarnrc.yml +0 -5
  311. package/jsdoc.json +0 -16
  312. package/netlify.toml +0 -5
  313. package/pyvenv.cfg +0 -3
  314. package/share/man/man1/ttx.1 +0 -225
  315. package/src/components/manage/Blocks/Teaser/utils.js +0 -44
  316. package/src/components/manage/Blocks/Teaser/utils.test.jsx +0 -229
  317. package/src/components/theme/Header/Header.md +0 -27
  318. package/towncrier.toml +0 -33
@@ -1,34 +1,45 @@
1
- import React from 'react';
2
1
  import PropTypes from 'prop-types';
3
2
 
4
- import { flattenToAppURL } from '@plone/volto/helpers';
5
3
  import config from '@plone/volto/registry';
6
4
 
7
5
  import DefaultImageSVG from '@plone/volto/components/manage/Blocks/Listing/default-image.svg';
8
6
 
9
7
  /**
10
8
  * Renders a preview image for a catalog brain result item.
11
- *
12
9
  */
13
- function PreviewImage(props) {
14
- const { item, size = 'preview', alt, ...rest } = props;
15
- const src = item.image_field
16
- ? flattenToAppURL(`${item['@id']}/@@images/${item.image_field}/${size}`)
17
- : config.getComponent({
18
- name: 'DefaultImage',
19
- dependencies: ['listing', 'summary'],
20
- }).component || DefaultImageSVG;
10
+ function PreviewImage({ item, alt, ...rest }) {
11
+ const Image = config.getComponent({ name: 'Image' }).component;
21
12
 
22
- return <img src={src} alt={alt ?? item.title} {...rest} />;
13
+ if (item.image_field && item.image_scales?.[item.image_field]?.[0]) {
14
+ return (
15
+ <Image item={item} imageField={item.image_field} alt={alt} {...rest} />
16
+ );
17
+ } else {
18
+ return (
19
+ <img
20
+ src={
21
+ config.getComponent({
22
+ name: 'DefaultImage',
23
+ dependencies: ['listing', 'summary'],
24
+ }).component || DefaultImageSVG
25
+ }
26
+ alt={alt}
27
+ {...rest}
28
+ width="400"
29
+ height="300"
30
+ />
31
+ );
32
+ }
23
33
  }
24
34
 
25
35
  PreviewImage.propTypes = {
26
- size: PropTypes.string,
27
36
  item: PropTypes.shape({
28
37
  '@id': PropTypes.string.isRequired,
29
- image_field: PropTypes.string,
30
38
  title: PropTypes.string.isRequired,
39
+ image_field: PropTypes.string,
40
+ image_scales: PropTypes.object,
31
41
  }),
42
+ alt: PropTypes.string.isRequired,
32
43
  };
33
44
 
34
45
  export default PreviewImage;
@@ -7,35 +7,56 @@ describe('PreviewImage', () => {
7
7
  it('renders a preview image', () => {
8
8
  const item = {
9
9
  image_field: 'image',
10
- title: 'Item title',
11
- '@id': 'http://localhost:3000/something',
12
- };
13
- const component = renderer.create(<PreviewImage item={item} />);
14
- const json = component.toJSON();
15
- expect(json).toMatchSnapshot();
16
- });
17
-
18
- it('renders a preview image with extra props', () => {
19
- const item = {
20
- image_field: 'image',
10
+ image_scales: {
11
+ image: [
12
+ {
13
+ download: '@@images/image',
14
+ width: 400,
15
+ height: 400,
16
+ scales: {
17
+ preview: {
18
+ download: '@@images/image-400.png',
19
+ width: 400,
20
+ height: 400,
21
+ },
22
+ },
23
+ },
24
+ ],
25
+ },
21
26
  title: 'Item title',
22
27
  '@id': 'http://localhost:3000/something',
23
28
  };
24
29
  const component = renderer.create(
25
- <PreviewImage item={item} className="extra" />,
30
+ <PreviewImage item={item} alt={item.title} />,
26
31
  );
27
32
  const json = component.toJSON();
28
33
  expect(json).toMatchSnapshot();
29
34
  });
30
35
 
31
- it('renders a preview image with custom size', () => {
36
+ it('renders a preview image with extra props', () => {
32
37
  const item = {
33
38
  image_field: 'image',
39
+ image_scales: {
40
+ image: [
41
+ {
42
+ download: '@@images/image',
43
+ width: 400,
44
+ height: 400,
45
+ scales: {
46
+ preview: {
47
+ download: '@@images/image-400.png',
48
+ width: 400,
49
+ height: 400,
50
+ },
51
+ },
52
+ },
53
+ ],
54
+ },
34
55
  title: 'Item title',
35
56
  '@id': 'http://localhost:3000/something',
36
57
  };
37
58
  const component = renderer.create(
38
- <PreviewImage item={item} size="large" />,
59
+ <PreviewImage item={item} alt={item.title} className="extra" />,
39
60
  );
40
61
  const json = component.toJSON();
41
62
  expect(json).toMatchSnapshot();
@@ -46,7 +67,9 @@ describe('PreviewImage', () => {
46
67
  title: 'Item title',
47
68
  '@id': 'http://localhost:3000/something',
48
69
  };
49
- const component = renderer.create(<PreviewImage item={item} />);
70
+ const component = renderer.create(
71
+ <PreviewImage item={item} alt={item.title} />,
72
+ );
50
73
  const json = component.toJSON();
51
74
  expect(json).toMatchSnapshot();
52
75
  });
@@ -57,7 +80,7 @@ describe('PreviewImage', () => {
57
80
  '@id': 'http://localhost:3000/something',
58
81
  };
59
82
  const component = renderer.create(
60
- <PreviewImage item={item} className="extra" />,
83
+ <PreviewImage item={item} alt={item.title} className="extra" />,
61
84
  );
62
85
  const json = component.toJSON();
63
86
  expect(json).toMatchSnapshot();
@@ -1,14 +1,7 @@
1
- /**
2
- * Search widget component.
3
- * @module components/theme/SearchWidget/SearchWidget
4
- */
5
-
6
- import React, { Component } from 'react';
7
- import { withRouter } from 'react-router-dom';
1
+ import { useState } from 'react';
2
+ import { useHistory } from 'react-router-dom';
8
3
  import { Form, Input } from 'semantic-ui-react';
9
- import { compose } from 'redux';
10
- import { PropTypes } from 'prop-types';
11
- import { defineMessages, injectIntl } from 'react-intl';
4
+ import { defineMessages, useIntl } from 'react-intl';
12
5
 
13
6
  import { Icon } from '@plone/volto/components';
14
7
  import zoomSVG from '@plone/volto/icons/zoom.svg';
@@ -24,96 +17,43 @@ const messages = defineMessages({
24
17
  },
25
18
  });
26
19
 
27
- /**
28
- * SearchWidget component class.
29
- * @class SearchWidget
30
- * @extends Component
31
- */
32
- class SearchWidget extends Component {
33
- /**
34
- * Property types.
35
- * @property {Object} propTypes Property types.
36
- * @static
37
- */
38
- static propTypes = {
39
- pathname: PropTypes.string,
20
+ const SearchWidget = (props) => {
21
+ const intl = useIntl();
22
+ const [text, setText] = useState('');
23
+ const history = useHistory();
24
+ const onChangeText = (event, { value }) => {
25
+ setText(value);
40
26
  };
41
-
42
- /**
43
- * Constructor
44
- * @method constructor
45
- * @param {Object} props Component properties
46
- * @constructs WysiwygEditor
47
- */
48
- constructor(props) {
49
- super(props);
50
- this.onChangeText = this.onChangeText.bind(this);
51
- this.onSubmit = this.onSubmit.bind(this);
52
- this.state = {
53
- text: '',
54
- };
55
- }
56
-
57
- /**
58
- * On change text
59
- * @method onChangeText
60
- * @param {object} event Event object.
61
- * @param {string} value Text value.
62
- * @returns {undefined}
63
- */
64
- onChangeText(event, { value }) {
65
- this.setState({
66
- text: value,
67
- });
68
- }
69
-
70
- /**
71
- * Submit handler
72
- * @method onSubmit
73
- * @param {event} event Event object.
74
- * @returns {undefined}
75
- */
76
- onSubmit(event) {
27
+ const pathname = props.pathname;
28
+ const onSubmit = (event) => {
77
29
  const path =
78
- this.props.pathname?.length > 0
79
- ? `&path=${encodeURIComponent(this.props.pathname)}`
80
- : '';
81
- this.props.history.push(
82
- `/search?SearchableText=${encodeURIComponent(this.state.text)}${path}`,
83
- );
30
+ pathname?.length > 0 ? `&path=${encodeURIComponent(pathname)}` : '';
31
+
32
+ history.push(`/search?SearchableText=${encodeURIComponent(text)}${path}`);
84
33
  // reset input value
85
- this.setState({
86
- text: '',
87
- });
34
+ setText('');
88
35
  event.preventDefault();
89
- }
90
-
91
- /**
92
- * Render method.
93
- * @method render
94
- * @returns {string} Markup for the component.
95
- */
96
- render() {
97
- return (
98
- <Form action="/search" onSubmit={this.onSubmit}>
99
- <Form.Field className="searchbox">
100
- <Input
101
- aria-label={this.props.intl.formatMessage(messages.search)}
102
- onChange={this.onChangeText}
103
- name="SearchableText"
104
- value={this.state.text}
105
- transparent
106
- autoComplete="off"
107
- placeholder={this.props.intl.formatMessage(messages.searchSite)}
108
- title={this.props.intl.formatMessage(messages.search)}
109
- />
110
- <button aria-label={this.props.intl.formatMessage(messages.search)}>
111
- <Icon name={zoomSVG} size="18px" />
112
- </button>
113
- </Form.Field>
114
- </Form>
115
- );
116
- }
117
- }
36
+ };
118
37
 
119
- export default compose(withRouter, injectIntl)(SearchWidget);
38
+ return (
39
+ <Form action="/search" onSubmit={onSubmit}>
40
+ <Form.Field className="searchbox">
41
+ <Input
42
+ aria-label={intl.formatMessage(messages.search)}
43
+ onChange={onChangeText}
44
+ name="SearchableText"
45
+ value={text}
46
+ transparent
47
+ autoComplete="off"
48
+ placeholder={intl.formatMessage(messages.searchSite)}
49
+ title={intl.formatMessage(messages.search)}
50
+ />
51
+ <button aria-label={intl.formatMessage(messages.search)}>
52
+ <Icon name={zoomSVG} size="18px" />
53
+ </button>
54
+ </Form.Field>
55
+ </Form>
56
+ );
57
+ };
58
+
59
+ export default SearchWidget;
@@ -10,7 +10,7 @@ import { connect } from 'react-redux';
10
10
  import { asyncConnect } from '@plone/volto/helpers';
11
11
  import { defineMessages, injectIntl } from 'react-intl';
12
12
  import { Container } from 'semantic-ui-react';
13
- import { Helmet } from '@plone/volto/helpers';
13
+ import { Helmet, toBackendLang } from '@plone/volto/helpers';
14
14
  import { Link } from 'react-router-dom';
15
15
  import config from '@plone/volto/registry';
16
16
 
@@ -40,7 +40,7 @@ class Sitemap extends Component {
40
40
  componentDidMount() {
41
41
  const { settings } = config;
42
42
  if (settings.isMultilingual) {
43
- this.props.getNavigation(`${this.props.lang}`, 4);
43
+ this.props.getNavigation(`${toBackendLang(this.props.lang)}`, 4);
44
44
  } else {
45
45
  this.props.getNavigation('', 4);
46
46
  }
@@ -108,7 +108,9 @@ export default compose(
108
108
  const { settings } = config;
109
109
  const lang = getState().intl.locale;
110
110
  if (settings.isMultilingual) {
111
- return __SERVER__ && dispatch(getNavigation(`${lang}`, 4));
111
+ return (
112
+ __SERVER__ && dispatch(getNavigation(`${toBackendLang(lang)}`, 4))
113
+ );
112
114
  } else {
113
115
  return __SERVER__ && dispatch(getNavigation('', 4));
114
116
  }
@@ -3,11 +3,16 @@
3
3
  * @module components/theme/View/AlbumView
4
4
  */
5
5
 
6
- import React, { Component } from 'react';
6
+ import React from 'react';
7
7
  import PropTypes from 'prop-types';
8
- import { Container, GridColumn, Segment } from 'semantic-ui-react';
8
+ import {
9
+ Container as SemanticContainer,
10
+ GridColumn,
11
+ Segment,
12
+ } from 'semantic-ui-react';
9
13
  import { Button, Modal, Grid } from 'semantic-ui-react';
10
- import { Icon, UniversalLink, PreviewImage } from '@plone/volto/components';
14
+ import { Icon, UniversalLink } from '@plone/volto/components';
15
+ import config from '@plone/volto/registry';
11
16
 
12
17
  import openSVG from '@plone/volto/icons/open.svg';
13
18
  import aheadSVG from '@plone/volto/icons/ahead.svg';
@@ -19,7 +24,7 @@ import backSVG from '@plone/volto/icons/back.svg';
19
24
  * @param {Object} content Content object.
20
25
  * @returns {string} Markup of the component.
21
26
  */
22
- class AlbumView extends Component {
27
+ class AlbumView extends React.Component {
23
28
  constructor(props) {
24
29
  super(props);
25
30
 
@@ -56,6 +61,11 @@ class AlbumView extends Component {
56
61
 
57
62
  render() {
58
63
  const { content } = this.props;
64
+ const Container =
65
+ config.getComponent({ name: 'Container' }).component || SemanticContainer;
66
+ const PreviewImage = config.getComponent({ name: 'PreviewImage' })
67
+ .component;
68
+
59
69
  return (
60
70
  <Container className="view-wrapper">
61
71
  <article id="content">
@@ -80,17 +90,16 @@ class AlbumView extends Component {
80
90
  <Segment className="imageborder">
81
91
  <PreviewImage
82
92
  item={item}
83
- alt={
84
- item.image_caption
85
- ? item.image_caption
86
- : item.title
87
- }
93
+ alt={item.image_caption || item.title}
88
94
  onClick={() => {
89
95
  this.setState({
90
96
  openIndex: index,
91
97
  });
92
98
  }}
93
99
  className="ui middle aligned image"
100
+ responsive={true}
101
+ loading="lazy"
102
+ title={item.title}
94
103
  />
95
104
  </Segment>
96
105
  </Grid.Column>
@@ -133,20 +142,15 @@ class AlbumView extends Component {
133
142
  <Modal.Content image>
134
143
  <PreviewImage
135
144
  item={item}
136
- alt={
137
- item.image_caption
138
- ? item.image_caption
139
- : item.title
140
- }
145
+ alt={item.image_caption}
141
146
  onClick={() => {
142
147
  this.setState({
143
148
  openIndex: index,
144
149
  });
145
150
  }}
146
- size="large"
147
151
  className="ui image"
152
+ responsive={true}
148
153
  />
149
-
150
154
  <Modal.Description>
151
155
  <p>{item.description}</p>
152
156
  </Modal.Description>
@@ -87,7 +87,7 @@ const DefaultView = (props) => {
87
87
  return f !== 'title' ? (
88
88
  <Grid celled="internally" key={key}>
89
89
  <Grid.Row>
90
- <Label>{field.title}:</Label>
90
+ <Label title={field.id}>{field.title}:</Label>
91
91
  </Grid.Row>
92
92
  <Grid.Row>
93
93
  <Segment basic>
@@ -3,6 +3,7 @@ import PropTypes from 'prop-types';
3
3
  import { List } from 'semantic-ui-react';
4
4
  import cx from 'classnames';
5
5
 
6
+ import { toBackendLang } from '@plone/volto/helpers';
6
7
  import { injectLazyLibs } from '@plone/volto/helpers/Loadable/Loadable';
7
8
  import { useSelector } from 'react-redux';
8
9
 
@@ -28,7 +29,7 @@ const When_ = ({ start, end, whole_day, open_end, moment: momentlib }) => {
28
29
  const lang = useSelector((state) => state.intl.locale);
29
30
 
30
31
  const moment = momentlib.default;
31
- moment.locale(lang);
32
+ moment.locale(toBackendLang(lang));
32
33
 
33
34
  const datesInfo = datesForDisplay(start, end, moment);
34
35
  if (!datesInfo) {
@@ -6,32 +6,41 @@
6
6
  import React from 'react';
7
7
  import PropTypes from 'prop-types';
8
8
  import { hasBlocksData, flattenHTMLToAppURL } from '@plone/volto/helpers';
9
- import { Image, Grid } from 'semantic-ui-react';
9
+ import { Grid } from 'semantic-ui-react';
10
10
  import RenderBlocks from '@plone/volto/components/theme/View/RenderBlocks';
11
11
  import { EventDetails } from '@plone/volto/components';
12
+ import { Container as SemanticContainer } from 'semantic-ui-react';
13
+ import config from '@plone/volto/registry';
12
14
 
13
- const EventTextfieldView = ({ content }) => (
14
- <React.Fragment>
15
- {content.title && <h1 className="documentFirstHeading">{content.title}</h1>}
16
- {content.description && (
17
- <p className="documentDescription">{content.description}</p>
18
- )}
19
- {content.image && (
20
- <Image
21
- className="document-image"
22
- src={content.image.scales.thumb.download}
23
- floated="right"
24
- />
25
- )}
26
- {content.text && (
27
- <div
28
- dangerouslySetInnerHTML={{
29
- __html: flattenHTMLToAppURL(content.text.data),
30
- }}
31
- />
32
- )}
33
- </React.Fragment>
34
- );
15
+ const EventTextfieldView = ({ content }) => {
16
+ const Image = config.getComponent({ name: 'Image' }).component;
17
+
18
+ return (
19
+ <React.Fragment>
20
+ {content.title && (
21
+ <h1 className="documentFirstHeading">{content.title}</h1>
22
+ )}
23
+ {content.description && (
24
+ <p className="documentDescription">{content.description}</p>
25
+ )}
26
+ {content.image && (
27
+ <Image
28
+ className="document-image ui right floated image"
29
+ item={content}
30
+ imageField="image"
31
+ alt=""
32
+ />
33
+ )}
34
+ {content.text && (
35
+ <div
36
+ dangerouslySetInnerHTML={{
37
+ __html: flattenHTMLToAppURL(content.text.data),
38
+ }}
39
+ />
40
+ )}
41
+ </React.Fragment>
42
+ );
43
+ };
35
44
 
36
45
  /**
37
46
  * EventView view component class.
@@ -41,9 +50,11 @@ const EventTextfieldView = ({ content }) => (
41
50
  */
42
51
  const EventView = (props) => {
43
52
  const { content } = props;
53
+ const Container =
54
+ config.getComponent({ name: 'Container' }).component || SemanticContainer;
44
55
 
45
56
  return (
46
- <div id="page-document" className="ui container view-wrapper event-view">
57
+ <Container id="page-document" className="view-wrapper event-view">
47
58
  <Grid>
48
59
  <Grid.Column width={7} className="mobile hidden">
49
60
  {hasBlocksData(content) ? (
@@ -83,7 +94,7 @@ const EventView = (props) => {
83
94
  )}
84
95
  </Grid.Column>
85
96
  </Grid>
86
- </div>
97
+ </Container>
87
98
  );
88
99
  };
89
100
 
@@ -5,9 +5,9 @@
5
5
 
6
6
  import React from 'react';
7
7
  import PropTypes from 'prop-types';
8
- import { Container } from 'semantic-ui-react';
9
-
8
+ import { Container as SemanticContainer } from 'semantic-ui-react';
10
9
  import { flattenToAppURL } from '@plone/volto/helpers';
10
+ import config from '@plone/volto/registry';
11
11
 
12
12
  /**
13
13
  * File view component class.
@@ -15,22 +15,27 @@ import { flattenToAppURL } from '@plone/volto/helpers';
15
15
  * @params {object} content Content object.
16
16
  * @returns {string} Markup of the component.
17
17
  */
18
- const FileView = ({ content }) => (
19
- <Container className="view-wrapper">
20
- <h1 className="documentFirstHeading">
21
- {content.title}
22
- {content.subtitle && ` - ${content.subtitle}`}
23
- </h1>
24
- {content.description && (
25
- <p className="documentDescription">{content.description}</p>
26
- )}
27
- {content.file?.download && (
28
- <a href={flattenToAppURL(content.file.download)}>
29
- {content.file.filename}
30
- </a>
31
- )}
32
- </Container>
33
- );
18
+ const FileView = ({ content }) => {
19
+ const Container =
20
+ config.getComponent({ name: 'Container' }).component || SemanticContainer;
21
+
22
+ return (
23
+ <Container className="view-wrapper">
24
+ <h1 className="documentFirstHeading">
25
+ {content.title}
26
+ {content.subtitle && ` - ${content.subtitle}`}
27
+ </h1>
28
+ {content.description && (
29
+ <p className="documentDescription">{content.description}</p>
30
+ )}
31
+ {content.file?.download && (
32
+ <a href={flattenToAppURL(content.file.download)}>
33
+ {content.file.filename}
34
+ </a>
35
+ )}
36
+ </Container>
37
+ );
38
+ };
34
39
 
35
40
  /**
36
41
  * Property types.
@@ -5,11 +5,11 @@
5
5
 
6
6
  import React from 'react';
7
7
  import PropTypes from 'prop-types';
8
- import { Container } from 'semantic-ui-react';
8
+ import { Container as SemanticContainer } from 'semantic-ui-react';
9
9
  import { FormattedMessage } from 'react-intl';
10
10
  import prettybytes from 'pretty-bytes';
11
-
12
11
  import { flattenToAppURL } from '@plone/volto/helpers';
12
+ import config from '@plone/volto/registry';
13
13
 
14
14
  /**
15
15
  * Image view component class.
@@ -17,37 +17,45 @@ import { flattenToAppURL } from '@plone/volto/helpers';
17
17
  * @params {object} content Content object.
18
18
  * @returns {string} Markup of the component.
19
19
  */
20
- const ImageView = ({ content }) => (
21
- <Container className="view-wrapper">
22
- <h1 className="documentFirstHeading">
23
- {content.title}
24
- {content.subtitle && ` - ${content.subtitle}`}
25
- </h1>
26
- {content.description && (
27
- <p className="documentDescription">{content.description}</p>
28
- )}
29
- {content?.image?.download && (
30
- <a href={flattenToAppURL(content.image.download)}>
31
- <img
32
- alt={content.title}
33
- src={flattenToAppURL(content.image.scales.preview.download)}
34
- />
35
- <figcaption>
36
- <FormattedMessage
37
- id="Size: {size}"
38
- defaultMessage="Size: {size}"
39
- values={{ size: prettybytes(content.image.size) }}
40
- />
41
- &nbsp; &mdash; &nbsp;
42
- <FormattedMessage
43
- id="Click to download full sized image"
44
- defaultMessage="Click to download full sized image"
20
+ const ImageView = ({ content }) => {
21
+ const Image = config.getComponent({ name: 'Image' }).component;
22
+ const Container =
23
+ config.getComponent({ name: 'Container' }).component || SemanticContainer;
24
+
25
+ return (
26
+ <Container className="view-wrapper">
27
+ <h1 className="documentFirstHeading">
28
+ {content.title}
29
+ {content.subtitle && ` - ${content.subtitle}`}
30
+ </h1>
31
+ {content.description && (
32
+ <p className="documentDescription">{content.description}</p>
33
+ )}
34
+ {content?.image?.download && (
35
+ <a href={flattenToAppURL(content.image.download)}>
36
+ <Image
37
+ item={content}
38
+ imageField="image"
39
+ alt={content.title}
40
+ responsive={true}
45
41
  />
46
- </figcaption>
47
- </a>
48
- )}
49
- </Container>
50
- );
42
+ <figcaption>
43
+ <FormattedMessage
44
+ id="Size: {size}"
45
+ defaultMessage="Size: {size}"
46
+ values={{ size: prettybytes(content.image.size) }}
47
+ />
48
+ &nbsp; &mdash; &nbsp;
49
+ <FormattedMessage
50
+ id="Click to download full sized image"
51
+ defaultMessage="Click to download full sized image"
52
+ />
53
+ </figcaption>
54
+ </a>
55
+ )}
56
+ </Container>
57
+ );
58
+ };
51
59
 
52
60
  /**
53
61
  * Property types.