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

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 (297) hide show
  1. package/.yarn/install-state.gz +0 -0
  2. package/CHANGELOG.md +530 -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 +56 -4
  8. package/cypress/support/volto-slate.js +4 -5
  9. package/docker-compose.yml +1 -1
  10. package/locales/ca/LC_MESSAGES/volto.po +272 -6
  11. package/locales/ca.json +1 -1
  12. package/locales/de/LC_MESSAGES/volto.po +291 -25
  13. package/locales/de.json +1 -1
  14. package/locales/en/LC_MESSAGES/volto.po +271 -5
  15. package/locales/en.json +1 -1
  16. package/locales/es/LC_MESSAGES/volto.po +281 -15
  17. package/locales/es.json +1 -1
  18. package/locales/eu/LC_MESSAGES/volto.po +272 -6
  19. package/locales/eu.json +1 -1
  20. package/locales/fi/LC_MESSAGES/volto.po +4882 -0
  21. package/locales/fi.json +1 -1
  22. package/locales/fr/LC_MESSAGES/volto.po +272 -6
  23. package/locales/fr.json +1 -1
  24. package/locales/it/LC_MESSAGES/volto.po +273 -7
  25. package/locales/it.json +1 -1
  26. package/locales/ja/LC_MESSAGES/volto.po +272 -6
  27. package/locales/ja.json +1 -1
  28. package/locales/nl/LC_MESSAGES/volto.po +927 -649
  29. package/locales/nl.json +1 -1
  30. package/locales/pt/LC_MESSAGES/volto.po +272 -6
  31. package/locales/pt.json +1 -1
  32. package/locales/pt_BR/LC_MESSAGES/volto.po +281 -15
  33. package/locales/pt_BR.json +1 -1
  34. package/locales/ro/LC_MESSAGES/volto.po +272 -6
  35. package/locales/ro.json +1 -1
  36. package/locales/volto.pot +272 -6
  37. package/locales/zh_CN/LC_MESSAGES/volto.po +272 -6
  38. package/locales/zh_CN.json +1 -1
  39. package/package.json +5 -3
  40. package/packages/volto-slate/build/messages/src/blocks/Table/TableBlockEdit.json +1 -1
  41. package/packages/volto-slate/build/messages/src/blocks/Text/DefaultTextBlockEditor.json +1 -1
  42. package/packages/volto-slate/build/messages/src/blocks/Text/DetachedTextBlockEditor.json +1 -1
  43. package/packages/volto-slate/build/messages/src/blocks/Text/SlashMenu.json +1 -1
  44. package/packages/volto-slate/build/messages/src/editor/plugins/AdvancedLink/index.json +1 -1
  45. package/packages/volto-slate/build/messages/src/editor/plugins/Link/index.json +1 -1
  46. package/packages/volto-slate/build/messages/src/editor/plugins/Table/index.json +1 -1
  47. package/packages/volto-slate/build/messages/src/elementEditor/messages.json +1 -1
  48. package/packages/volto-slate/build/messages/src/widgets/HtmlSlateWidget.json +1 -1
  49. package/packages/volto-slate/build/messages/src/widgets/RichTextWidgetView.json +1 -1
  50. package/packages/volto-slate/package.json +1 -1
  51. package/packages/volto-slate/src/actions/index.js +1 -1
  52. package/packages/volto-slate/src/blocks/Table/TableBlockEdit.jsx +21 -212
  53. package/packages/volto-slate/src/blocks/Table/schema.js +122 -0
  54. package/packages/volto-slate/src/blocks/Text/DefaultTextBlockEditor.jsx +8 -3
  55. package/packages/volto-slate/src/blocks/Text/SlashMenu.jsx +4 -3
  56. package/packages/volto-slate/src/blocks/Text/TextBlockView.jsx +20 -16
  57. package/packages/volto-slate/src/blocks/Text/extensions/withDeserializers.js +3 -1
  58. package/packages/volto-slate/src/blocks/Text/index.js +10 -2
  59. package/packages/volto-slate/src/editor/config.jsx +5 -4
  60. package/packages/volto-slate/src/editor/deserialize.js +0 -1
  61. package/packages/volto-slate/src/editor/index.js +4 -4
  62. package/packages/volto-slate/src/editor/less/slate.less +28 -0
  63. package/packages/volto-slate/src/editor/plugins/StyleMenu/StyleMenu.jsx +14 -4
  64. package/packages/volto-slate/src/editor/plugins/StyleMenu/utils.js +14 -5
  65. package/packages/volto-slate/src/editor/render.jsx +68 -8
  66. package/packages/volto-slate/src/editor/ui/SlateContextToolbar.jsx +2 -2
  67. package/packages/volto-slate/src/editor/ui/index.js +15 -15
  68. package/packages/volto-slate/src/index.js +2 -2
  69. package/packages/volto-slate/src/utils/blocks.js +7 -0
  70. package/packages/volto-slate/src/widgets/RichTextWidget.jsx +15 -8
  71. package/razzle.config.js +28 -0
  72. package/src/actions/index.js +6 -0
  73. package/src/actions/language/language.js +9 -8
  74. package/src/actions/querystringsearch/querystringsearch.js +20 -14
  75. package/src/actions/relations/rebuild.js +25 -0
  76. package/src/actions/relations/relations.js +86 -0
  77. package/src/actions/relations/relations.test.js +15 -0
  78. package/src/components/index.js +2 -0
  79. package/src/components/manage/Add/Add.jsx +2 -2
  80. package/src/components/manage/AnchorPlugin/index.jsx +2 -2
  81. package/src/components/manage/AnchorPlugin/utils/EditorUtils.js +3 -1
  82. package/src/components/manage/BlockChooser/BlockChooser.jsx +14 -5
  83. package/src/components/manage/BlockChooser/BlockChooser.test.jsx +5 -0
  84. package/src/components/manage/Blocks/Block/BlocksForm.jsx +19 -2
  85. package/src/components/manage/Blocks/Block/Edit.jsx +1 -1
  86. package/src/components/manage/Blocks/Block/Style.jsx +2 -2
  87. package/src/components/manage/Blocks/Container/Data.jsx +32 -0
  88. package/src/components/manage/Blocks/Container/Edit.jsx +174 -0
  89. package/src/components/manage/Blocks/Container/EditBlockWrapper.jsx +120 -0
  90. package/src/components/manage/Blocks/Container/NewBlockAddButton.jsx +84 -0
  91. package/src/components/manage/Blocks/Container/SimpleContainerToolbar.jsx +54 -0
  92. package/src/components/manage/Blocks/Grid/Edit.jsx +33 -0
  93. package/src/components/manage/Blocks/Grid/View.jsx +43 -0
  94. package/src/components/manage/Blocks/Grid/adapter.js +14 -0
  95. package/src/components/manage/Blocks/Grid/grid-1.svg +6 -0
  96. package/src/components/manage/Blocks/Grid/grid-2.svg +9 -0
  97. package/src/components/manage/Blocks/Grid/grid-3.svg +10 -0
  98. package/src/components/manage/Blocks/Grid/grid-4.svg +11 -0
  99. package/src/components/manage/Blocks/Grid/schema.js +35 -0
  100. package/src/components/manage/Blocks/Grid/templates.js +47 -0
  101. package/src/components/manage/Blocks/HeroImageLeft/Edit.jsx +6 -1
  102. package/src/components/manage/Blocks/Image/Edit.jsx +11 -7
  103. package/src/components/manage/Blocks/Image/ImageSidebar.jsx +2 -1
  104. package/src/components/manage/Blocks/Image/schema.js +11 -0
  105. package/src/components/manage/Blocks/Listing/DefaultTemplate.jsx +18 -3
  106. package/src/components/manage/Blocks/Listing/Edit.jsx +0 -14
  107. package/src/components/manage/Blocks/Listing/ListingBody.jsx +30 -8
  108. package/src/components/manage/Blocks/Listing/ListingBody.test.jsx +20 -0
  109. package/src/components/manage/Blocks/Listing/getAsyncData.js +9 -3
  110. package/src/components/manage/Blocks/Listing/withQuerystringResults.jsx +26 -18
  111. package/src/components/manage/Blocks/Search/SearchBlockEdit.jsx +5 -4
  112. package/src/components/manage/Blocks/Search/SearchBlockView.jsx +2 -1
  113. package/src/components/manage/Blocks/Search/components/DateRangeFacet.jsx +4 -1
  114. package/src/components/manage/Blocks/Search/components/Facets.jsx +64 -4
  115. package/src/components/manage/Blocks/Search/components/SearchInput.jsx +9 -2
  116. package/src/components/manage/Blocks/Search/components/index.js +13 -13
  117. package/src/components/manage/Blocks/Search/hocs/index.js +2 -2
  118. package/src/components/manage/Blocks/Search/hocs/withQueryString.jsx +2 -2
  119. package/src/components/manage/Blocks/Search/hocs/withSearch.jsx +43 -15
  120. package/src/components/manage/Blocks/Search/layout/LeftColumnFacets.jsx +17 -5
  121. package/src/components/manage/Blocks/Search/layout/RightColumnFacets.jsx +17 -5
  122. package/src/components/manage/Blocks/Search/layout/TopSideFacets.jsx +21 -5
  123. package/src/components/manage/Blocks/Search/schema.js +16 -1
  124. package/src/components/manage/Blocks/Teaser/Body.jsx +0 -1
  125. package/src/components/manage/Blocks/Teaser/DefaultBody.jsx +20 -15
  126. package/src/components/manage/Blocks/Teaser/schema.js +5 -0
  127. package/src/components/manage/Blocks/Title/View.jsx +15 -5
  128. package/src/components/manage/Blocks/Title/View.test.jsx +16 -1
  129. package/src/components/manage/Blocks/ToC/Schema.jsx +5 -1
  130. package/src/components/manage/Blocks/ToC/View.jsx +8 -1
  131. package/src/components/manage/Blocks/ToC/variations/DefaultTocRenderer.jsx +17 -4
  132. package/src/components/manage/Blocks/ToC/variations/HorizontalMenu.jsx +148 -10
  133. package/src/components/manage/Blocks/ToC/variations/index.js +3 -1
  134. package/src/components/manage/Contents/Contents.jsx +39 -26
  135. package/src/components/manage/Contents/ContentsItem.jsx +6 -0
  136. package/src/components/manage/Contents/ContentsUploadModal.jsx +10 -5
  137. package/src/components/manage/Controlpanels/AddonsControlpanel.jsx +3 -3
  138. package/src/components/manage/Controlpanels/Controlpanels.jsx +199 -224
  139. package/src/components/manage/Controlpanels/Controlpanels.test.jsx +46 -7
  140. package/src/components/manage/Controlpanels/Relations/BrokenRelations.jsx +66 -0
  141. package/src/components/manage/Controlpanels/Relations/Relations.jsx +114 -0
  142. package/src/components/manage/Controlpanels/Relations/RelationsListing.jsx +479 -0
  143. package/src/components/manage/Controlpanels/Relations/RelationsMatrix.jsx +531 -0
  144. package/src/components/manage/Controlpanels/Users/UserGroupMembershipControlPanel.jsx +3 -3
  145. package/src/components/manage/Controlpanels/Users/UserGroupMembershipListing.jsx +51 -82
  146. package/src/components/manage/Controlpanels/Users/UserGroupMembershipMatrix.jsx +79 -75
  147. package/src/components/manage/DragDropList/DragDropList.jsx +18 -13
  148. package/src/components/manage/Form/Form.jsx +5 -3
  149. package/src/components/manage/Form/InlineForm.jsx +39 -9
  150. package/src/components/manage/Form/InlineFormState.js +8 -0
  151. package/src/components/manage/History/History.jsx +11 -1
  152. package/src/components/manage/LinksToItem/LinksToItem.jsx +209 -0
  153. package/src/components/manage/LinksToItem/LinksToItem.test.jsx +97 -0
  154. package/src/components/manage/Multilingual/CreateTranslation.jsx +2 -2
  155. package/src/components/manage/Multilingual/TranslationObject.jsx +4 -3
  156. package/src/components/manage/Preferences/ChangePassword.jsx +2 -2
  157. package/src/components/manage/Preferences/PersonalPreferences.jsx +2 -2
  158. package/src/components/manage/Sharing/Sharing.jsx +5 -1
  159. package/src/components/manage/TemplateChooser/TemplateChooser.jsx +38 -0
  160. package/src/components/manage/TemplateChooser/TemplateChooser.test.jsx +34 -0
  161. package/src/components/manage/TemplateChooser/template.svg +10 -0
  162. package/src/components/manage/Toast/Toast.jsx +2 -2
  163. package/src/components/manage/Toolbar/More.jsx +15 -0
  164. package/src/components/manage/Toolbar/Types.jsx +2 -2
  165. package/src/components/manage/UniversalLink/UniversalLink.jsx +2 -6
  166. package/src/components/manage/UniversalLink/UniversalLink.test.jsx +36 -0
  167. package/src/components/manage/Widgets/ColorPickerWidget.jsx +6 -1
  168. package/src/components/manage/Widgets/DatetimeWidget.jsx +9 -5
  169. package/src/components/manage/Widgets/FileWidget.jsx +2 -1
  170. package/src/components/manage/Widgets/ObjectListWidget.jsx +3 -8
  171. package/src/components/manage/Widgets/RecurrenceWidget/ByDayField.jsx +2 -1
  172. package/src/components/manage/Widgets/RecurrenceWidget/MonthOfTheYearField.jsx +2 -1
  173. package/src/components/manage/Widgets/RecurrenceWidget/Occurences.jsx +2 -1
  174. package/src/components/manage/Widgets/RecurrenceWidget/RecurrenceWidget.jsx +8 -3
  175. package/src/components/manage/Widgets/RecurrenceWidget/WeekdayOfTheMonthField.jsx +2 -1
  176. package/src/components/manage/Widgets/SelectUtils.js +1 -1
  177. package/src/components/manage/Widgets/SelectWidget.jsx +1 -1
  178. package/src/components/theme/Anontools/Anontools.jsx +44 -72
  179. package/src/components/theme/Anontools/Anontools.stories.jsx +16 -6
  180. package/src/components/theme/Anontools/Anontools.test.jsx +16 -2
  181. package/src/components/theme/Breadcrumbs/Breadcrumbs.jsx +52 -99
  182. package/src/components/theme/Breadcrumbs/Breadcrumbs.stories.jsx +14 -13
  183. package/src/components/theme/Comments/CommentEditModal.jsx +63 -115
  184. package/src/components/theme/Component/Component.jsx +1 -1
  185. package/src/components/theme/ContactForm/ContactForm.jsx +108 -192
  186. package/src/components/theme/ContactForm/ContactForm.stories.jsx +1 -1
  187. package/src/components/theme/ContactForm/ContactForm.test.jsx +2 -3
  188. package/src/components/theme/Footer/Footer.jsx +2 -13
  189. package/src/components/theme/Header/Header.jsx +37 -63
  190. package/src/components/theme/Header/Header.test.jsx +18 -0
  191. package/src/components/theme/Icon/Icon.jsx +2 -2
  192. package/src/components/theme/LanguageSelector/LanguageSelector.js +8 -3
  193. package/src/components/theme/Login/Login.jsx +1 -0
  194. package/src/components/theme/Logo/Logo.jsx +2 -1
  195. package/src/components/theme/MultilingualRedirector/MultilingualRedirector.jsx +2 -2
  196. package/src/components/theme/Navigation/NavItem.jsx +4 -2
  197. package/src/components/theme/NotFound/NotFound.jsx +55 -41
  198. package/src/components/theme/PasswordReset/PasswordReset.jsx +7 -4
  199. package/src/components/theme/PasswordReset/RequestPasswordReset.jsx +1 -1
  200. package/src/components/theme/SearchWidget/SearchWidget.jsx +38 -98
  201. package/src/components/theme/Sitemap/Sitemap.jsx +5 -3
  202. package/src/components/theme/View/AlbumView.jsx +9 -1
  203. package/src/components/theme/View/DefaultView.jsx +1 -1
  204. package/src/components/theme/View/EventDatesInfo.jsx +2 -1
  205. package/src/components/theme/View/EventView.jsx +6 -2
  206. package/src/components/theme/View/FileView.jsx +23 -18
  207. package/src/components/theme/View/ImageView.jsx +37 -32
  208. package/src/components/theme/View/LinkView.jsx +53 -78
  209. package/src/components/theme/View/ListingView.jsx +33 -27
  210. package/src/components/theme/View/NewsItemView.jsx +10 -5
  211. package/src/components/theme/View/RenderBlocks.jsx +56 -21
  212. package/src/components/theme/View/RenderEmptyBlock.jsx +5 -0
  213. package/src/components/theme/View/SummaryView.jsx +47 -38
  214. package/src/components/theme/View/TabularView.jsx +59 -53
  215. package/src/components/theme/Widgets/DateWidget.jsx +2 -1
  216. package/src/components/theme/Widgets/DatetimeWidget.jsx +2 -1
  217. package/src/components/theme/Widgets/RelationsWidget.jsx +13 -11
  218. package/src/config/Blocks.jsx +44 -0
  219. package/src/config/ControlPanels.js +2 -0
  220. package/src/config/NonContentRoutes.jsx +1 -0
  221. package/src/config/RichTextEditor/Blocks.jsx +2 -2
  222. package/src/config/RichTextEditor/FromHTML.jsx +2 -2
  223. package/src/config/RichTextEditor/Styles.jsx +1 -1
  224. package/src/config/Widgets.jsx +2 -0
  225. package/src/config/index.js +24 -0
  226. package/src/config/server.js +2 -0
  227. package/src/constants/ActionTypes.js +4 -0
  228. package/src/constants/Indexes.js +3 -1
  229. package/src/constants/Languages.js +8 -4
  230. package/src/express-middleware/devproxy.js +1 -1
  231. package/src/express-middleware/files.js +3 -3
  232. package/src/express-middleware/images.js +4 -4
  233. package/src/express-middleware/ok.js +16 -0
  234. package/src/express-middleware/robotstxt.js +1 -1
  235. package/src/express-middleware/sitemap.js +37 -5
  236. package/src/express-middleware/static.js +3 -3
  237. package/src/helpers/Api/Api.js +1 -1
  238. package/src/helpers/Blocks/Blocks.js +48 -0
  239. package/src/helpers/Blocks/Blocks.test.js +79 -0
  240. package/src/helpers/Extensions/index.js +2 -1
  241. package/src/helpers/Extensions/withBlockSchemaEnhancer.js +15 -11
  242. package/src/helpers/Extensions/withBlockSchemaEnhancer.test.js +145 -0
  243. package/src/helpers/FormValidation/FormValidation.js +40 -2
  244. package/src/helpers/FormValidation/FormValidation.test.js +73 -0
  245. package/src/helpers/Html/Html.jsx +3 -1
  246. package/src/helpers/Html/Html.test.jsx +5 -0
  247. package/src/helpers/MessageLabels/MessageLabels.js +80 -0
  248. package/src/helpers/Robots/Robots.js +24 -6
  249. package/src/helpers/ScrollToTop/ScrollToTop.jsx +5 -3
  250. package/src/helpers/Sitemap/Sitemap.js +44 -2
  251. package/src/helpers/Url/Url.js +27 -6
  252. package/src/helpers/Url/Url.test.js +26 -0
  253. package/src/helpers/Utils/UseDetectClickOutside.stories.jsx +191 -0
  254. package/src/helpers/Utils/Utils.js +63 -13
  255. package/src/helpers/Utils/Utils.test.js +4 -4
  256. package/src/helpers/Utils/usePagination.js +67 -14
  257. package/src/helpers/Utils/usePagination.test.js +115 -0
  258. package/src/helpers/index.js +20 -10
  259. package/src/hooks/client/useClient.js +11 -0
  260. package/src/hooks/clipboard/useClipboard.js +26 -0
  261. package/src/hooks/index.js +2 -0
  262. package/src/icons/grid-block.svg +11 -0
  263. package/src/middleware/Api.test.js +54 -0
  264. package/src/middleware/api.js +24 -6
  265. package/src/middleware/index.js +2 -2
  266. package/src/reducers/actions/actions.js +8 -6
  267. package/src/reducers/actions/actions.test.js +70 -0
  268. package/src/reducers/breadcrumbs/breadcrumbs.js +1 -1
  269. package/src/reducers/index.js +2 -0
  270. package/src/reducers/navigation/navigation.js +1 -1
  271. package/src/reducers/relations/relations.js +173 -0
  272. package/src/reducers/types/types.js +1 -1
  273. package/src/routes.js +14 -0
  274. package/src/server.jsx +28 -23
  275. package/src/start-server.js +2 -2
  276. package/test-setup-config.js +2 -0
  277. package/theme/themes/pastanaga/extras/blocks.less +3 -1
  278. package/theme/themes/pastanaga/extras/contents.less +1 -0
  279. package/theme/themes/pastanaga/extras/grid.less +426 -0
  280. package/theme/themes/pastanaga/extras/main.less +3 -1
  281. package/theme/themes/pastanaga/extras/search.less +6 -0
  282. package/theme/themes/pastanaga/extras/sidebar.less +4 -0
  283. package/theme/themes/pastanaga/extras/toc.less +29 -0
  284. package/theme/themes/pastanaga/extras/userscontrolpanel.less +99 -76
  285. package/.changelog.draft +0 -31
  286. package/.editorconfig +0 -36
  287. package/.storybook/main.js +0 -127
  288. package/.storybook/manager.js +0 -15
  289. package/.storybook/preview.js +0 -21
  290. package/.storybook/static/previewImage.svg +0 -48
  291. package/.yarnrc.yml +0 -5
  292. package/jsdoc.json +0 -16
  293. package/netlify.toml +0 -5
  294. package/pyvenv.cfg +0 -3
  295. package/share/man/man1/ttx.1 +0 -225
  296. package/src/components/theme/Header/Header.md +0 -27
  297. package/towncrier.toml +0 -33
@@ -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,42 @@ 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 Container =
22
+ config.getComponent({ name: 'Container' }).component || SemanticContainer;
23
+
24
+ return (
25
+ <Container className="view-wrapper">
26
+ <h1 className="documentFirstHeading">
27
+ {content.title}
28
+ {content.subtitle && ` - ${content.subtitle}`}
29
+ </h1>
30
+ {content.description && (
31
+ <p className="documentDescription">{content.description}</p>
32
+ )}
33
+ {content?.image?.download && (
34
+ <a href={flattenToAppURL(content.image.download)}>
35
+ <img
36
+ alt={content.title}
37
+ src={flattenToAppURL(content.image.scales.preview.download)}
45
38
  />
46
- </figcaption>
47
- </a>
48
- )}
49
- </Container>
50
- );
39
+ <figcaption>
40
+ <FormattedMessage
41
+ id="Size: {size}"
42
+ defaultMessage="Size: {size}"
43
+ values={{ size: prettybytes(content.image.size) }}
44
+ />
45
+ &nbsp; &mdash; &nbsp;
46
+ <FormattedMessage
47
+ id="Click to download full sized image"
48
+ defaultMessage="Click to download full sized image"
49
+ />
50
+ </figcaption>
51
+ </a>
52
+ )}
53
+ </Container>
54
+ );
55
+ };
51
56
 
52
57
  /**
53
58
  * Property types.
@@ -1,92 +1,67 @@
1
- /**
2
- * Link View.
3
- * @module components/theme/View/LinkView
4
- */
5
-
6
- import React, { Component } from 'react';
1
+ import { useEffect } from 'react';
7
2
  import PropTypes from 'prop-types';
3
+ import { useHistory } from 'react-router-dom';
8
4
  import { isInternalURL, flattenToAppURL } from '@plone/volto/helpers';
9
- import { Container } from 'semantic-ui-react';
5
+ import { Container as SemanticContainer } from 'semantic-ui-react';
10
6
  import { UniversalLink } from '@plone/volto/components';
11
7
  import { FormattedMessage } from 'react-intl';
12
8
  import config from '@plone/volto/registry';
13
9
 
14
- /**
15
- * View container class.
16
- * @class View
17
- * @extends Component
18
- */
19
- class LinkView extends Component {
20
- /**
21
- * Property types.
22
- * @property {Object} propTypes Property types.
23
- * @static
24
- */
25
- static propTypes = {
26
- content: PropTypes.shape({
27
- title: PropTypes.string,
28
- description: PropTypes.string,
29
- remoteUrl: PropTypes.string,
30
- }),
31
- token: PropTypes.string,
32
- };
33
-
34
- /**
35
- * Default properties.
36
- * @property {Object} defaultProps Default properties.
37
- * @static
38
- */
39
- static defaultProps = {
40
- content: null,
41
- token: null,
42
- };
43
-
44
- componentDidMount() {
45
- if (!this.props.token) {
46
- const { remoteUrl } = this.props.content;
10
+ const LinkView = ({ token, content }) => {
11
+ const history = useHistory();
12
+ useEffect(() => {
13
+ if (!token) {
14
+ const { remoteUrl } = content;
47
15
  if (isInternalURL(remoteUrl)) {
48
- this.props.history.replace(flattenToAppURL(remoteUrl));
16
+ history.replace(flattenToAppURL(remoteUrl));
49
17
  } else if (!__SERVER__) {
50
18
  window.location.href = flattenToAppURL(remoteUrl);
51
19
  }
52
20
  }
53
- }
21
+ }, [content, history, token]);
22
+ const { title, description, remoteUrl } = content;
23
+ const { openExternalLinkInNewTab } = config.settings;
24
+ const Container =
25
+ config.getComponent({ name: 'Container' }).component || SemanticContainer;
26
+
27
+ return (
28
+ <Container id="page-document">
29
+ <h1 className="documentFirstHeading">{title}</h1>
30
+ {content.description && (
31
+ <p className="documentDescription">{description}</p>
32
+ )}
33
+ {remoteUrl && (
34
+ <p>
35
+ <FormattedMessage
36
+ id="The link address is:"
37
+ defaultMessage="The link address is:"
38
+ />{' '}
39
+ <UniversalLink
40
+ href={remoteUrl}
41
+ openLinkInNewTab={
42
+ openExternalLinkInNewTab && !isInternalURL(remoteUrl)
43
+ }
44
+ >
45
+ {flattenToAppURL(remoteUrl)}
46
+ </UniversalLink>
47
+ </p>
48
+ )}
49
+ </Container>
50
+ );
51
+ };
52
+
53
+ LinkView.propTypes = {
54
+ content: PropTypes.shape({
55
+ title: PropTypes.string,
56
+ description: PropTypes.string,
57
+ remoteUrl: PropTypes.string,
58
+ }),
59
+ token: PropTypes.string,
60
+ };
54
61
 
55
- /**
56
- * Render method.
57
- * @method render
58
- * @returns {string} Markup for the component.
59
- */
60
- render() {
61
- const { remoteUrl } = this.props.content;
62
- const { openExternalLinkInNewTab } = config.settings;
63
- return (
64
- <Container id="page-document">
65
- <h1 className="documentFirstHeading">{this.props.content.title}</h1>
66
- {this.props.content.description && (
67
- <p className="documentDescription">
68
- {this.props.content.description}
69
- </p>
70
- )}
71
- {remoteUrl && (
72
- <p>
73
- <FormattedMessage
74
- id="The link address is:"
75
- defaultMessage="The link address is:"
76
- />{' '}
77
- <UniversalLink
78
- href={remoteUrl}
79
- openLinkInNewTab={
80
- openExternalLinkInNewTab && !isInternalURL(remoteUrl)
81
- }
82
- >
83
- {flattenToAppURL(remoteUrl)}
84
- </UniversalLink>
85
- </p>
86
- )}
87
- </Container>
88
- );
89
- }
90
- }
62
+ LinkView.defaultProps = {
63
+ content: null,
64
+ token: null,
65
+ };
91
66
 
92
67
  export default LinkView;
@@ -5,8 +5,9 @@
5
5
 
6
6
  import React from 'react';
7
7
  import PropTypes from 'prop-types';
8
- import { Segment, Container } from 'semantic-ui-react';
8
+ import { Segment, Container as SemanticContainer } from 'semantic-ui-react';
9
9
  import { UniversalLink, PreviewImage } from '@plone/volto/components';
10
+ import config from '@plone/volto/registry';
10
11
 
11
12
  /**
12
13
  * List view component class.
@@ -14,32 +15,37 @@ import { UniversalLink, PreviewImage } from '@plone/volto/components';
14
15
  * @params {object} content Content object.
15
16
  * @returns {string} Markup of the component.
16
17
  */
17
- const ListingView = ({ content }) => (
18
- <Container id="page-home">
19
- <section id="content-core">
20
- {content.items.map((item) => (
21
- <Segment key={item.url} className="listing-item">
22
- <Container>
23
- <h2>
24
- <UniversalLink item={item} title={item['@type']}>
25
- {item.title}
26
- </UniversalLink>
27
- </h2>
28
- {item.description && <p>{item.description}</p>}
29
- </Container>
30
- {item.image_field && (
31
- <PreviewImage
32
- item={item}
33
- size="thumb"
34
- alt={item.image_caption ? item.image_caption : item.title}
35
- className="ui image"
36
- />
37
- )}
38
- </Segment>
39
- ))}
40
- </section>
41
- </Container>
42
- );
18
+ const ListingView = ({ content }) => {
19
+ const Container =
20
+ config.getComponent({ name: 'Container' }).component || SemanticContainer;
21
+
22
+ return (
23
+ <Container id="page-home">
24
+ <section id="content-core">
25
+ {content.items.map((item) => (
26
+ <Segment key={item.url} className="listing-item">
27
+ <Container>
28
+ <h2>
29
+ <UniversalLink item={item} title={item['@type']}>
30
+ {item.title}
31
+ </UniversalLink>
32
+ </h2>
33
+ {item.description && <p>{item.description}</p>}
34
+ </Container>
35
+ {item.image_field && (
36
+ <PreviewImage
37
+ item={item}
38
+ size="thumb"
39
+ alt={item.image_caption ? item.image_caption : item.title}
40
+ className="ui image"
41
+ />
42
+ )}
43
+ </Segment>
44
+ ))}
45
+ </section>
46
+ </Container>
47
+ );
48
+ };
43
49
 
44
50
  /**
45
51
  * Property types.
@@ -5,13 +5,14 @@
5
5
 
6
6
  import React from 'react';
7
7
  import PropTypes from 'prop-types';
8
- import { Container, Image } from 'semantic-ui-react';
8
+ import { Container as SemanticContainer, Image } from 'semantic-ui-react';
9
9
  import {
10
10
  hasBlocksData,
11
11
  flattenToAppURL,
12
12
  flattenHTMLToAppURL,
13
13
  } from '@plone/volto/helpers';
14
14
  import RenderBlocks from '@plone/volto/components/theme/View/RenderBlocks';
15
+ import config from '@plone/volto/registry';
15
16
 
16
17
  /**
17
18
  * NewsItemView view component class.
@@ -19,11 +20,14 @@ import RenderBlocks from '@plone/volto/components/theme/View/RenderBlocks';
19
20
  * @params {object} content Content object.
20
21
  * @returns {string} Markup of the component.
21
22
  */
22
- const NewsItemView = ({ content }) =>
23
- hasBlocksData(content) ? (
24
- <div id="page-document" className="ui container view-wrapper newsitem-view">
23
+ const NewsItemView = ({ content }) => {
24
+ const Container =
25
+ config.getComponent({ name: 'Container' }).component || SemanticContainer;
26
+
27
+ return hasBlocksData(content) ? (
28
+ <Container id="page-document" className="view-wrapper newsitem-view">
25
29
  <RenderBlocks content={content} />
26
- </div>
30
+ </Container>
27
31
  ) : (
28
32
  <Container className="view-wrapper">
29
33
  {content.title && (
@@ -57,6 +61,7 @@ const NewsItemView = ({ content }) =>
57
61
  )}
58
62
  </Container>
59
63
  );
64
+ };
60
65
 
61
66
  /**
62
67
  * Property types.
@@ -1,7 +1,8 @@
1
1
  import React from 'react';
2
2
  import { getBaseUrl, applyBlockDefaults } from '@plone/volto/helpers';
3
- import { defineMessages, injectIntl } from 'react-intl';
3
+ import { defineMessages, useIntl } from 'react-intl';
4
4
  import { map } from 'lodash';
5
+ import { MaybeWrap } from '@plone/volto/components';
5
6
  import {
6
7
  getBlocksFieldname,
7
8
  getBlocksLayoutFieldname,
@@ -10,6 +11,7 @@ import {
10
11
  import StyleWrapper from '@plone/volto/components/manage/Blocks/Block/StyleWrapper';
11
12
  import config from '@plone/volto/registry';
12
13
  import { ViewDefaultBlock } from '@plone/volto/components';
14
+ import RenderEmptyBlock from './RenderEmptyBlock';
13
15
 
14
16
  const messages = defineMessages({
15
17
  unknownBlock: {
@@ -23,7 +25,8 @@ const messages = defineMessages({
23
25
  });
24
26
 
25
27
  const RenderBlocks = (props) => {
26
- const { content, intl, location, metadata } = props;
28
+ const { content, location, metadata, blockWrapperTag } = props;
29
+ const intl = useIntl();
27
30
  const blocksFieldname = getBlocksFieldname(content);
28
31
  const blocksLayoutFieldname = getBlocksLayoutFieldname(content);
29
32
  const blocksConfig = props.blocksConfig || config.blocks.blocksConfig;
@@ -43,24 +46,56 @@ const RenderBlocks = (props) => {
43
46
  properties: content,
44
47
  });
45
48
 
46
- return Block ? (
47
- <StyleWrapper key={block} {...props} id={block} data={blockData}>
48
- <Block
49
- id={block}
50
- metadata={metadata}
51
- properties={content}
52
- data={blockData}
53
- path={getBaseUrl(location?.pathname || '')}
54
- blocksConfig={blocksConfig}
55
- />
56
- </StyleWrapper>
57
- ) : blockData ? (
58
- <div key={block}>
59
- {intl.formatMessage(messages.unknownBlock, {
60
- block: content[blocksFieldname]?.[block]?.['@type'],
61
- })}
62
- </div>
63
- ) : (
49
+ if (content[blocksFieldname]?.[block]?.['@type'] === 'empty') {
50
+ return (
51
+ <MaybeWrap
52
+ key={block}
53
+ condition={blockWrapperTag}
54
+ as={blockWrapperTag}
55
+ >
56
+ <RenderEmptyBlock />
57
+ </MaybeWrap>
58
+ );
59
+ }
60
+
61
+ if (Block) {
62
+ return (
63
+ <MaybeWrap
64
+ key={block}
65
+ condition={blockWrapperTag}
66
+ as={blockWrapperTag}
67
+ >
68
+ <StyleWrapper
69
+ key={block}
70
+ {...props}
71
+ id={block}
72
+ block={block}
73
+ data={blockData}
74
+ >
75
+ <Block
76
+ id={block}
77
+ metadata={metadata}
78
+ properties={content}
79
+ data={blockData}
80
+ path={getBaseUrl(location?.pathname || '')}
81
+ blocksConfig={blocksConfig}
82
+ />
83
+ </StyleWrapper>
84
+ </MaybeWrap>
85
+ );
86
+ }
87
+
88
+ if (blockData) {
89
+ return (
90
+ <div key={block}>
91
+ {intl.formatMessage(messages.unknownBlock, {
92
+ block: content[blocksFieldname]?.[block]?.['@type'],
93
+ })}
94
+ </div>
95
+ );
96
+ }
97
+
98
+ return (
64
99
  <div key={block}>{intl.formatMessage(messages.invalidBlock)}</div>
65
100
  );
66
101
  })}
@@ -70,4 +105,4 @@ const RenderBlocks = (props) => {
70
105
  );
71
106
  };
72
107
 
73
- export default injectIntl(RenderBlocks);
108
+ export default RenderBlocks;
@@ -0,0 +1,5 @@
1
+ const RenderEmptyBlock = () => {
2
+ return null;
3
+ };
4
+
5
+ export default RenderEmptyBlock;
@@ -6,9 +6,10 @@
6
6
  import React from 'react';
7
7
  import PropTypes from 'prop-types';
8
8
  import { UniversalLink } from '@plone/volto/components';
9
- import { Container } from 'semantic-ui-react';
9
+ import { Container as SemanticContainer } from 'semantic-ui-react';
10
10
  import { FormattedMessage } from 'react-intl';
11
11
  import PreviewImage from '../PreviewImage/PreviewImage';
12
+ import config from '@plone/volto/registry';
12
13
 
13
14
  /**
14
15
  * Summary view component class.
@@ -16,43 +17,51 @@ import PreviewImage from '../PreviewImage/PreviewImage';
16
17
  * @param {Object} content Content object.
17
18
  * @returns {string} Markup of the component.
18
19
  */
19
- const SummaryView = ({ content }) => (
20
- <Container className="view-wrapper summary-view">
21
- <article id="content">
22
- <header>
23
- <h1 className="documentFirstHeading">{content.title}</h1>
24
- {content.description && (
25
- <p className="documentDescription">{content.description}</p>
26
- )}
27
- </header>
28
- <section id="content-core">
29
- {content.items.map((item) => (
30
- <article key={item.url}>
31
- <h2>
32
- <UniversalLink item={item} title={item['@type']}>
33
- {item.title}
34
- </UniversalLink>
35
- </h2>
36
- {item.image_field && (
37
- <PreviewImage
38
- item={item}
39
- alt={item.image_caption ? item.image_caption : item.title}
40
- size="thumb"
41
- className="ui image floated right clear"
42
- />
43
- )}
44
- {item.description && <p>{item.description}</p>}
45
- <p>
46
- <UniversalLink item={item}>
47
- <FormattedMessage id="Read More…" defaultMessage="Read More…" />
48
- </UniversalLink>
49
- </p>
50
- </article>
51
- ))}
52
- </section>
53
- </article>
54
- </Container>
55
- );
20
+ const SummaryView = ({ content }) => {
21
+ const Container =
22
+ config.getComponent({ name: 'Container' }).component || SemanticContainer;
23
+
24
+ return (
25
+ <Container className="view-wrapper summary-view">
26
+ <article id="content">
27
+ <header>
28
+ <h1 className="documentFirstHeading">{content.title}</h1>
29
+ {content.description && (
30
+ <p className="documentDescription">{content.description}</p>
31
+ )}
32
+ </header>
33
+ <section id="content-core">
34
+ {content.items.map((item) => (
35
+ <article key={item.url}>
36
+ <h2>
37
+ <UniversalLink item={item} title={item['@type']}>
38
+ {item.title}
39
+ </UniversalLink>
40
+ </h2>
41
+ {item.image_field && (
42
+ <PreviewImage
43
+ item={item}
44
+ alt={item.image_caption ? item.image_caption : item.title}
45
+ size="thumb"
46
+ className="ui image floated right clear"
47
+ />
48
+ )}
49
+ {item.description && <p>{item.description}</p>}
50
+ <p>
51
+ <UniversalLink item={item}>
52
+ <FormattedMessage
53
+ id="Read More…"
54
+ defaultMessage="Read More…"
55
+ />
56
+ </UniversalLink>
57
+ </p>
58
+ </article>
59
+ ))}
60
+ </section>
61
+ </article>
62
+ </Container>
63
+ );
64
+ };
56
65
 
57
66
  /**
58
67
  * Property types.