@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
@@ -10,7 +10,7 @@ import { connect } from 'react-redux';
10
10
  import loadable from '@loadable/component';
11
11
  import cx from 'classnames';
12
12
  import { Icon, FormFieldWrapper } from '@plone/volto/components';
13
- import { parseDateTime } from '@plone/volto/helpers';
13
+ import { parseDateTime, toBackendLang } from '@plone/volto/helpers';
14
14
  import { injectLazyLibs } from '@plone/volto/helpers/Loadable/Loadable';
15
15
 
16
16
  import leftKey from '@plone/volto/icons/left-key.svg';
@@ -101,7 +101,7 @@ export class DatetimeWidgetComponent extends Component {
101
101
  // if passed value matches the construction time, we guess it's a default
102
102
  isDefault:
103
103
  parseDateTime(
104
- this.props.lang,
104
+ toBackendLang(this.props.lang),
105
105
  this.props.value,
106
106
  undefined,
107
107
  this.moment,
@@ -111,7 +111,7 @@ export class DatetimeWidgetComponent extends Component {
111
111
 
112
112
  getInternalValue() {
113
113
  return parseDateTime(
114
- this.props.lang,
114
+ toBackendLang(this.props.lang),
115
115
  this.props.value,
116
116
  undefined,
117
117
  this.moment,
@@ -211,7 +211,9 @@ export class DatetimeWidgetComponent extends Component {
211
211
  {...(noPastDates ? {} : { isOutsideRange: () => false })}
212
212
  onFocusChange={this.onFocusChange}
213
213
  noBorder
214
- displayFormat={moment.localeData(lang).longDateFormat('L')}
214
+ displayFormat={moment
215
+ .localeData(toBackendLang(lang))
216
+ .longDateFormat('L')}
215
217
  navPrev={<PrevIcon />}
216
218
  navNext={<NextIcon />}
217
219
  id={`${id}-date`}
@@ -233,7 +235,9 @@ export class DatetimeWidgetComponent extends Component {
233
235
  showSecond={false}
234
236
  use12Hours={lang === 'en'}
235
237
  id={`${id}-time`}
236
- format={moment.localeData(lang).longDateFormat('LT')}
238
+ format={moment
239
+ .localeData(toBackendLang(lang))
240
+ .longDateFormat('LT')}
237
241
  placeholder={intl.formatMessage(messages.time)}
238
242
  focusOnOpen
239
243
  placement="bottomRight"
@@ -11,7 +11,7 @@ import { injectIntl } from 'react-intl';
11
11
  import deleteSVG from '@plone/volto/icons/delete.svg';
12
12
  import { Icon, FormFieldWrapper } from '@plone/volto/components';
13
13
  import loadable from '@loadable/component';
14
- import { flattenToAppURL } from '@plone/volto/helpers';
14
+ import { flattenToAppURL, validateFileUploadSize } from '@plone/volto/helpers';
15
15
  import { defineMessages, useIntl } from 'react-intl';
16
16
 
17
17
  const imageMimetypes = [
@@ -95,6 +95,7 @@ const FileWidget = (props) => {
95
95
  */
96
96
  const onDrop = (files) => {
97
97
  const file = files[0];
98
+ if (!validateFileUploadSize(file, intl.formatMessage)) return;
98
99
  readAsDataURL(file).then((data) => {
99
100
  const fields = data.match(/^data:(.*);(.*),(.*)$/);
100
101
  onChange(id, {
@@ -2,7 +2,7 @@ import React from 'react';
2
2
  import { defineMessages, useIntl } from 'react-intl';
3
3
  import { Accordion, Button, Segment } from 'semantic-ui-react';
4
4
  import { DragDropList, FormFieldWrapper, Icon } from '@plone/volto/components';
5
- import { applySchemaDefaults } from '@plone/volto/helpers';
5
+ import { applySchemaDefaults, reorderArray } from '@plone/volto/helpers';
6
6
  import ObjectWidget from '@plone/volto/components/manage/Widgets/ObjectWidget';
7
7
 
8
8
  import upSVG from '@plone/volto/icons/up-key.svg';
@@ -164,13 +164,8 @@ const ObjectListWidget = (props) => {
164
164
  if (!destination) {
165
165
  return;
166
166
  }
167
-
168
- const first = value[source.index];
169
- const second = value[destination.index];
170
- value[destination.index] = first;
171
- value[source.index] = second;
172
-
173
- onChange(id, value);
167
+ const newValue = reorderArray(value, source.index, destination.index);
168
+ onChange(id, newValue);
174
169
  return true;
175
170
  }}
176
171
  >
@@ -7,6 +7,7 @@ import React from 'react';
7
7
  import PropTypes from 'prop-types';
8
8
  import { Form, Grid, Button } from 'semantic-ui-react';
9
9
  import { Days } from './Utils';
10
+ import { toBackendLang } from '@plone/volto/helpers';
10
11
  import { injectLazyLibs } from '@plone/volto/helpers/Loadable/Loadable';
11
12
  import { useSelector } from 'react-redux';
12
13
 
@@ -18,7 +19,7 @@ import { useSelector } from 'react-redux';
18
19
  const ByDayField = ({ label, value, onChange, moment: momentlib }) => {
19
20
  const lang = useSelector((state) => state.intl.locale);
20
21
  const moment = momentlib.default;
21
- moment.locale(lang);
22
+ moment.locale(toBackendLang(lang));
22
23
 
23
24
  const toggleWeekDay = (dayName) => {
24
25
  var day = Days[dayName];
@@ -8,6 +8,7 @@ import PropTypes from 'prop-types';
8
8
  import { map } from 'lodash';
9
9
  import { Form } from 'semantic-ui-react';
10
10
  import SelectInput from './SelectInput';
11
+ import { toBackendLang } from '@plone/volto/helpers';
11
12
  import { injectLazyLibs } from '@plone/volto/helpers/Loadable/Loadable';
12
13
  import { useSelector } from 'react-redux';
13
14
 
@@ -25,7 +26,7 @@ const MonthOfTheYearField = ({
25
26
  }) => {
26
27
  const moment = momentlib.default;
27
28
  const lang = useSelector((state) => state.intl.locale);
28
- moment.locale(lang);
29
+ moment.locale(toBackendLang(lang));
29
30
  const monthList = [
30
31
  ...map(moment.months(), (m, i) => ({
31
32
  value: i + 1,
@@ -11,6 +11,7 @@ import { List, Button, Header, Label } from 'semantic-ui-react';
11
11
  import { Icon } from '@plone/volto/components';
12
12
  import addSVG from '@plone/volto/icons/circle-plus.svg';
13
13
  import trashSVG from '@plone/volto/icons/delete.svg';
14
+ import { toBackendLang } from '@plone/volto/helpers';
14
15
  import { injectLazyLibs } from '@plone/volto/helpers/Loadable/Loadable';
15
16
 
16
17
  import { useSelector } from 'react-redux';
@@ -68,7 +69,7 @@ const Occurences_ = ({
68
69
  }) => {
69
70
  const moment = momentlib.default;
70
71
  const lang = useSelector((state) => state.intl.locale);
71
- moment.locale(lang);
72
+ moment.locale(toBackendLang(lang));
72
73
  let all = [];
73
74
  const isExcluded = (date) => {
74
75
  var dateISO = toISOString(date);
@@ -23,6 +23,7 @@ import {
23
23
  } from 'semantic-ui-react';
24
24
 
25
25
  import { SelectWidget, Icon, DatetimeWidget } from '@plone/volto/components';
26
+ import { toBackendLang } from '@plone/volto/helpers';
26
27
  import { injectLazyLibs } from '@plone/volto/helpers/Loadable/Loadable';
27
28
 
28
29
  import saveSVG from '@plone/volto/icons/save.svg';
@@ -183,7 +184,7 @@ class RecurrenceWidget extends Component {
183
184
  const { RRuleSet, rrulestr } = props.rrule;
184
185
 
185
186
  this.moment = this.props.moment.default;
186
- this.moment.locale(this.props.lang);
187
+ this.moment.locale(toBackendLang(this.props.lang));
187
188
 
188
189
  let rruleSet = this.props.value
189
190
  ? rrulestr(props.value, {
@@ -201,7 +202,11 @@ class RecurrenceWidget extends Component {
201
202
  open: false,
202
203
  rruleSet: rruleSet,
203
204
  formValues: this.getFormValues(rruleSet),
204
- RRULE_LANGUAGE: rrulei18n(this.props.intl, this.moment, this.props.lang),
205
+ RRULE_LANGUAGE: rrulei18n(
206
+ this.props.intl,
207
+ this.moment,
208
+ toBackendLang(this.props.lang),
209
+ ),
205
210
  };
206
211
  }
207
212
 
@@ -422,7 +427,7 @@ class RecurrenceWidget extends Component {
422
427
  break;
423
428
  }
424
429
 
425
- if (value) {
430
+ if (value === 0 || value) {
426
431
  //set value
427
432
  values[field] = value;
428
433
  } else {
@@ -8,6 +8,7 @@ import { map } from 'lodash';
8
8
  import { Days } from './Utils';
9
9
  import SelectInput from './SelectInput';
10
10
  import { Form } from 'semantic-ui-react';
11
+ import { toBackendLang } from '@plone/volto/helpers';
11
12
  import { injectLazyLibs } from '@plone/volto/helpers/Loadable/Loadable';
12
13
  import { useSelector } from 'react-redux';
13
14
 
@@ -22,7 +23,7 @@ const WeekdayOfTheMonthField = (props) => {
22
23
  const lang = useSelector((state) => state.intl.locale);
23
24
 
24
25
  const moment = momentlib.default;
25
- moment.locale(lang);
26
+ moment.locale(toBackendLang(lang));
26
27
 
27
28
  const weekdayOfTheMonthList = [
28
29
  ...map(Object.keys(Days), (d) => ({
@@ -54,7 +54,7 @@ export function normalizeSingleSelectOption(value, intl) {
54
54
  throw new Error(`Unknown value type of select widget: ${value}`);
55
55
  }
56
56
 
57
- const token = value.token ?? value.value ?? 'no-value';
57
+ const token = value.token ?? value.value ?? value.UID ?? 'no-value';
58
58
  const label =
59
59
  (value.title && value.title !== 'None' ? value.title : undefined) ??
60
60
  value.label ??
@@ -202,7 +202,7 @@ class SelectWidget extends Component {
202
202
 
203
203
  const isMulti = this.props.isMulti
204
204
  ? this.props.isMulti
205
- : id === 'roles' || id === 'groups';
205
+ : id === 'roles' || id === 'groups' || this.props.type === 'array';
206
206
 
207
207
  return (
208
208
  <FormFieldWrapper {...this.props}>
@@ -1,83 +1,55 @@
1
- /**
2
- * Anontools component.
3
- * @module components/theme/Anontools/Anontools
4
- */
5
-
6
- import React, { Component } from 'react';
7
1
  import PropTypes from 'prop-types';
8
- import { connect } from 'react-redux';
9
2
  import { Link } from 'react-router-dom';
10
3
  import { Menu } from 'semantic-ui-react';
11
4
  import { FormattedMessage } from 'react-intl';
5
+ import { flattenToAppURL } from '@plone/volto/helpers';
12
6
  import config from '@plone/volto/registry';
7
+ import { useSelector, shallowEqual } from 'react-redux';
13
8
 
14
- /**
15
- * Anontools container class.
16
- */
17
- export class Anontools extends Component {
18
- /**
19
- * Property types.
20
- * @property {Object} propTypes Property types.
21
- * @static
22
- */
23
- static propTypes = {
24
- token: PropTypes.string,
25
- content: PropTypes.shape({
26
- '@id': PropTypes.string,
27
- }),
28
- };
29
-
30
- /**
31
- * Default properties.
32
- * @property {Object} defaultProps Default properties.
33
- * @static
34
- */
35
- static defaultProps = {
36
- token: null,
37
- content: {
38
- '@id': null,
39
- },
40
- };
9
+ const Anontools = () => {
10
+ const token = useSelector((state) => state.userSession.token, shallowEqual);
11
+ const content = useSelector((state) => state.content.data, shallowEqual);
41
12
 
42
- /**
43
- * Render method.
44
- * @method render
45
- * @returns {string} Markup for the component.
46
- */
47
- render() {
48
- const { settings } = config;
49
- return (
50
- !this.props.token && (
51
- <Menu pointing secondary floated="right">
13
+ const { settings } = config;
14
+ return (
15
+ !token && (
16
+ <Menu pointing secondary floated="right">
17
+ <Menu.Item>
18
+ <Link
19
+ aria-label="login"
20
+ to={`/login${
21
+ content?.['@id']
22
+ ? `?return_url=${flattenToAppURL(content['@id'])}`
23
+ : ''
24
+ }`}
25
+ >
26
+ <FormattedMessage id="Log in" defaultMessage="Log in" />
27
+ </Link>
28
+ </Menu.Item>
29
+ {settings.showSelfRegistration && (
52
30
  <Menu.Item>
53
- <Link
54
- aria-label="login"
55
- to={`/login${
56
- this.props.content?.['@id']
57
- ? `?return_url=${this.props.content['@id'].replace(
58
- settings.apiPath,
59
- '',
60
- )}`
61
- : ''
62
- }`}
63
- >
64
- <FormattedMessage id="Log in" defaultMessage="Log in" />
31
+ <Link aria-label="register" to="/register">
32
+ <FormattedMessage id="Register" defaultMessage="Register" />
65
33
  </Link>
66
34
  </Menu.Item>
67
- {settings.showSelfRegistration && (
68
- <Menu.Item>
69
- <Link aria-label="register" to="/register">
70
- <FormattedMessage id="Register" defaultMessage="Register" />
71
- </Link>
72
- </Menu.Item>
73
- )}
74
- </Menu>
75
- )
76
- );
77
- }
78
- }
35
+ )}
36
+ </Menu>
37
+ )
38
+ );
39
+ };
40
+
41
+ export default Anontools;
42
+
43
+ Anontools.propTypes = {
44
+ token: PropTypes.string,
45
+ content: PropTypes.shape({
46
+ '@id': PropTypes.string,
47
+ }),
48
+ };
79
49
 
80
- export default connect((state) => ({
81
- token: state.userSession.token,
82
- content: state.content.data,
83
- }))(Anontools);
50
+ Anontools.defaultProps = {
51
+ token: null,
52
+ content: {
53
+ '@id': null,
54
+ },
55
+ };
@@ -1,15 +1,25 @@
1
1
  import React from 'react';
2
- import { Anontools as AnontoolsDefault } from './Anontools';
2
+ import AnontoolsDefault from './Anontools';
3
3
  import Wrapper from '@plone/volto/storybook';
4
4
 
5
5
  const AnontoolsComponent = ({ children, ...args }) => {
6
6
  return (
7
- <Wrapper location={{ pathname: '/folder2/folder21/doc212' }}>
7
+ <Wrapper
8
+ anonymous
9
+ location={{ pathname: '/folder2/folder21/doc212' }}
10
+ customStore={{
11
+ content: {
12
+ data: { '@id': 'http://myreturnURL' },
13
+ get: {
14
+ loaded: false,
15
+ loading: false,
16
+ error: null,
17
+ },
18
+ },
19
+ }}
20
+ >
8
21
  <div className="ui segment form attached" style={{ width: '400px' }}>
9
- <AnontoolsDefault
10
- userSession={{ token: null }}
11
- content={{ '@id': 'myid' }}
12
- />
22
+ <AnontoolsDefault />
13
23
  </div>
14
24
  </Wrapper>
15
25
  );
@@ -12,7 +12,14 @@ describe('Anontools', () => {
12
12
  it('renders an anontools component when no token is specified', () => {
13
13
  const store = mockStore({
14
14
  userSession: { token: null },
15
- content: { data: { '@id': 'myid' } },
15
+ content: {
16
+ data: { '@id': 'myid' },
17
+ get: {
18
+ loading: false,
19
+ loaded: true,
20
+ error: null,
21
+ },
22
+ },
16
23
  intl: {
17
24
  locale: 'en',
18
25
  messages: {},
@@ -32,7 +39,14 @@ describe('Anontools', () => {
32
39
  it('should not render an anontools component when a token is specified', () => {
33
40
  const store = mockStore({
34
41
  userSession: { token: '1234' },
35
- content: { data: {} },
42
+ content: {
43
+ data: {},
44
+ get: {
45
+ loading: false,
46
+ loaded: true,
47
+ error: null,
48
+ },
49
+ },
36
50
  intl: {
37
51
  locale: 'en',
38
52
  messages: {},
@@ -1,20 +1,13 @@
1
- /**
2
- * Breadcrumbs components.
3
- * @module components/theme/Breadcrumbs/Breadcrumbs
4
- */
5
-
6
- import React, { Component } from 'react';
1
+ import { useEffect } from 'react';
7
2
  import PropTypes from 'prop-types';
8
- import { connect } from 'react-redux';
9
- import { compose } from 'redux';
10
3
  import { Link } from 'react-router-dom';
11
4
  import { Breadcrumb, Container, Segment } from 'semantic-ui-react';
12
- import { defineMessages, injectIntl } from 'react-intl';
5
+ import { defineMessages, useIntl } from 'react-intl';
6
+ import { useDispatch, useSelector, shallowEqual } from 'react-redux';
13
7
 
14
- import { Icon } from '@plone/volto/components';
15
8
  import { getBreadcrumbs } from '@plone/volto/actions';
16
9
  import { getBaseUrl, hasApiExpander } from '@plone/volto/helpers';
17
-
10
+ import { Icon } from '@plone/volto/components';
18
11
  import homeSVG from '@plone/volto/icons/home.svg';
19
12
 
20
13
  const messages = defineMessages({
@@ -28,96 +21,56 @@ const messages = defineMessages({
28
21
  },
29
22
  });
30
23
 
31
- /**
32
- * Breadcrumbs container class.
33
- */
34
- export class BreadcrumbsComponent extends Component {
35
- /**
36
- * Property types.
37
- * @property {Object} propTypes Property types.
38
- * @static
39
- */
40
- static propTypes = {
41
- getBreadcrumbs: PropTypes.func.isRequired,
42
- pathname: PropTypes.string.isRequired,
43
- root: PropTypes.string,
44
- items: PropTypes.arrayOf(
45
- PropTypes.shape({
46
- title: PropTypes.string,
47
- url: PropTypes.string,
48
- }),
49
- ).isRequired,
50
- };
24
+ const BreadcrumbsComponent = ({ pathname }) => {
25
+ const intl = useIntl();
26
+ const dispatch = useDispatch();
51
27
 
52
- componentDidMount() {
53
- if (!hasApiExpander('breadcrumbs', getBaseUrl(this.props.pathname))) {
54
- this.props.getBreadcrumbs(getBaseUrl(this.props.pathname));
55
- }
56
- }
28
+ const items = useSelector((state) => state.breadcrumbs.items, shallowEqual);
29
+ const root = useSelector((state) => state.breadcrumbs.root);
57
30
 
58
- /**
59
- * Component will receive props
60
- * @method componentWillReceiveProps
61
- * @param {Object} nextProps Next properties
62
- * @returns {undefined}
63
- */
64
- UNSAFE_componentWillReceiveProps(nextProps) {
65
- if (nextProps.pathname !== this.props.pathname) {
66
- if (!hasApiExpander('breadcrumbs', getBaseUrl(this.props.pathname))) {
67
- this.props.getBreadcrumbs(getBaseUrl(nextProps.pathname));
68
- }
31
+ useEffect(() => {
32
+ if (!hasApiExpander('breadcrumbs', getBaseUrl(pathname))) {
33
+ dispatch(getBreadcrumbs(getBaseUrl(pathname)));
69
34
  }
70
- }
35
+ }, [dispatch, pathname]);
36
+
37
+ return (
38
+ <Segment
39
+ role="navigation"
40
+ aria-label={intl.formatMessage(messages.breadcrumbs)}
41
+ className="breadcrumbs"
42
+ secondary
43
+ vertical
44
+ >
45
+ <Container>
46
+ <Breadcrumb>
47
+ <Link
48
+ to={root || '/'}
49
+ className="section"
50
+ title={intl.formatMessage(messages.home)}
51
+ >
52
+ <Icon name={homeSVG} size="18px" />
53
+ </Link>
54
+ {items.map((item, index, items) => [
55
+ <Breadcrumb.Divider key={`divider-${item.url}`} />,
56
+ index < items.length - 1 ? (
57
+ <Link key={item.url} to={item.url} className="section">
58
+ {item.title}
59
+ </Link>
60
+ ) : (
61
+ <Breadcrumb.Section key={item.url} active>
62
+ {item.title}
63
+ </Breadcrumb.Section>
64
+ ),
65
+ ])}
66
+ </Breadcrumb>
67
+ </Container>
68
+ </Segment>
69
+ );
70
+ };
71
71
 
72
- /**
73
- * Render method.
74
- * @method render
75
- * @returns {string} Markup for the component.
76
- */
77
- render() {
78
- return (
79
- <Segment
80
- role="navigation"
81
- aria-label={this.props.intl.formatMessage(messages.breadcrumbs)}
82
- className="breadcrumbs"
83
- secondary
84
- vertical
85
- >
86
- <Container>
87
- <Breadcrumb>
88
- <Link
89
- to={this.props.root || '/'}
90
- className="section"
91
- title={this.props.intl.formatMessage(messages.home)}
92
- >
93
- <Icon name={homeSVG} size="18px" />
94
- </Link>
95
- {this.props.items.map((item, index, items) => [
96
- <Breadcrumb.Divider key={`divider-${item.url}`} />,
97
- index < items.length - 1 ? (
98
- <Link key={item.url} to={item.url} className="section">
99
- {item.title}
100
- </Link>
101
- ) : (
102
- <Breadcrumb.Section key={item.url} active>
103
- {item.title}
104
- </Breadcrumb.Section>
105
- ),
106
- ])}
107
- </Breadcrumb>
108
- </Container>
109
- </Segment>
110
- );
111
- }
112
- }
72
+ BreadcrumbsComponent.propTypes = {
73
+ pathname: PropTypes.string.isRequired,
74
+ };
113
75
 
114
- export default compose(
115
- injectIntl,
116
- connect(
117
- (state) => ({
118
- items: state.breadcrumbs.items,
119
- root: state.breadcrumbs.root,
120
- }),
121
- { getBreadcrumbs },
122
- ),
123
- )(BreadcrumbsComponent);
76
+ export default BreadcrumbsComponent;
@@ -1,23 +1,24 @@
1
1
  import { injectIntl } from 'react-intl';
2
2
  import React from 'react';
3
- import { BreadcrumbsComponent } from './Breadcrumbs';
3
+ import BreadcrumbsComponent from './Breadcrumbs';
4
4
  import Wrapper from '@plone/volto/storybook';
5
5
 
6
6
  export const Breadcrumb = injectIntl(({ children, ...args }) => {
7
7
  return (
8
- <Wrapper location={{ pathname: '/folder2/folder21/doc212' }}>
8
+ <Wrapper
9
+ anonymous
10
+ location={{ pathname: '/folder2/folder21/doc212' }}
11
+ customStore={{
12
+ breadcrumbs: {
13
+ items: [
14
+ { title: 'Blog', url: '/blog' },
15
+ { title: 'My first blog', url: '/blog/my-first-blog' },
16
+ ],
17
+ },
18
+ }}
19
+ >
9
20
  <div className="ui segment form attached" style={{ width: '400px' }}>
10
- <BreadcrumbsComponent
11
- pathname=""
12
- items={[
13
- {
14
- '@id': 'https://volto.kitconcept.com/api/Members',
15
- title: 'Users',
16
- },
17
- ]}
18
- getBreadcrumbs={() => {}}
19
- {...args}
20
- />
21
+ <BreadcrumbsComponent pathname="" />
21
22
  </div>
22
23
  </Wrapper>
23
24
  );