@plone/volto 18.0.0-alpha.42 → 18.0.0-alpha.43

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 (137) hide show
  1. package/CHANGELOG.md +72 -0
  2. package/finalreleasechangelog.py +48 -0
  3. package/locales/ca/LC_MESSAGES/volto.po +8 -12
  4. package/locales/ca.json +1 -1
  5. package/locales/de/LC_MESSAGES/volto.po +9 -13
  6. package/locales/de.json +1 -1
  7. package/locales/en/LC_MESSAGES/volto.po +8 -12
  8. package/locales/en.json +1 -1
  9. package/locales/es/LC_MESSAGES/volto.po +9 -13
  10. package/locales/es.json +1 -1
  11. package/locales/eu/LC_MESSAGES/volto.po +9 -13
  12. package/locales/eu.json +1 -1
  13. package/locales/fi/LC_MESSAGES/volto.po +9 -13
  14. package/locales/fi.json +1 -1
  15. package/locales/fr/LC_MESSAGES/volto.po +9 -13
  16. package/locales/fr.json +1 -1
  17. package/locales/hi/LC_MESSAGES/volto.po +9 -13
  18. package/locales/hi.json +1 -1
  19. package/locales/it/LC_MESSAGES/volto.po +9 -13
  20. package/locales/it.json +1 -1
  21. package/locales/ja/LC_MESSAGES/volto.po +8 -12
  22. package/locales/ja.json +1 -1
  23. package/locales/nl/LC_MESSAGES/volto.po +8 -12
  24. package/locales/nl.json +1 -1
  25. package/locales/pt/LC_MESSAGES/volto.po +8 -12
  26. package/locales/pt.json +1 -1
  27. package/locales/pt_BR/LC_MESSAGES/volto.po +9 -13
  28. package/locales/pt_BR.json +1 -1
  29. package/locales/ro/LC_MESSAGES/volto.po +8 -12
  30. package/locales/ro.json +1 -1
  31. package/locales/volto.pot +9 -13
  32. package/locales/zh_CN/LC_MESSAGES/volto.po +9 -13
  33. package/locales/zh_CN.json +1 -1
  34. package/package.json +3 -3
  35. package/razzle.config.js +1 -1
  36. package/src/components/manage/Actions/Actions.stories.jsx +138 -0
  37. package/src/components/manage/Add/Add.jsx +7 -4
  38. package/src/components/manage/BlockChooser/BlockChooser.jsx +9 -1
  39. package/src/components/manage/Blocks/Block/Edit.jsx +24 -8
  40. package/src/components/manage/Blocks/Block/EditBlockWrapper.jsx +17 -1
  41. package/src/components/manage/Blocks/Block/Order/Item.jsx +3 -1
  42. package/src/components/manage/Blocks/Grid/View.jsx +3 -0
  43. package/src/components/manage/Blocks/LeadImage/Edit.jsx +74 -126
  44. package/src/components/manage/Blocks/Search/components/SortOn.jsx +82 -55
  45. package/src/components/manage/Blocks/Search/widgets/SelectMetadataField.jsx +107 -176
  46. package/src/components/manage/Blocks/Teaser/DefaultBody.jsx +15 -8
  47. package/src/components/manage/Blocks/ToC/Edit.jsx +36 -29
  48. package/src/components/manage/Blocks/Video/Edit.jsx +105 -172
  49. package/src/components/manage/Blocks/Video/Edit.stories.jsx +57 -0
  50. package/src/components/manage/Contents/Contents.jsx +3 -0
  51. package/src/components/manage/Contents/ContentsBreadcrumbs.stories.jsx +46 -0
  52. package/src/components/manage/Contents/ContentsPropertiesModal.jsx +85 -52
  53. package/src/components/manage/Contents/ContentsUploadModal.jsx +230 -323
  54. package/src/components/manage/Contents/ContentsUploadModal.stories.jsx +56 -0
  55. package/src/components/manage/Controlpanels/AddonsControlpanel.jsx +323 -441
  56. package/src/components/manage/Controlpanels/Aliases.jsx +452 -580
  57. package/src/components/manage/Controlpanels/Aliases.stories.jsx +74 -0
  58. package/src/components/manage/Controlpanels/Controlpanel.jsx +41 -2
  59. package/src/components/manage/Controlpanels/Controlpanel.test.jsx +55 -24
  60. package/src/components/manage/Controlpanels/DatabaseInformation.jsx +162 -229
  61. package/src/components/manage/Controlpanels/Groups/RenderGroups.jsx +74 -122
  62. package/src/components/manage/Display/Display.jsx +92 -148
  63. package/src/components/manage/Display/Display.stories.jsx +46 -0
  64. package/src/components/manage/Edit/Edit.jsx +2 -4
  65. package/src/components/manage/Preferences/ChangePassword.jsx +94 -172
  66. package/src/components/manage/Preferences/ChangePassword.stories.jsx +41 -0
  67. package/src/components/manage/Preferences/PersonalInformation.jsx +50 -115
  68. package/src/components/manage/Preferences/PersonalPreferences.jsx +46 -100
  69. package/src/components/manage/Preferences/PersonalPreferences.stories.jsx +48 -0
  70. package/src/components/manage/Toolbar/More.jsx +308 -399
  71. package/src/components/manage/Widgets/DatetimeWidget.jsx +121 -175
  72. package/src/components/manage/Widgets/ReferenceWidget.jsx +134 -210
  73. package/src/components/theme/Register/Register.jsx +70 -142
  74. package/src/components/theme/Register/Register.stories.jsx +49 -0
  75. package/src/components/theme/Tags/Tags.jsx +19 -10
  76. package/src/components/theme/Tags/Tags.test.jsx +9 -11
  77. package/src/components/theme/View/AlbumView.jsx +122 -167
  78. package/src/components/theme/View/LinkView.jsx +4 -0
  79. package/src/components/theme/View/LinkView.test.jsx +2 -0
  80. package/src/components/theme/View/View.jsx +0 -6
  81. package/src/config/ControlPanels.js +49 -43
  82. package/src/config/config.test.js +1 -0
  83. package/src/config/index.js +16 -0
  84. package/src/config/slots.js +12 -0
  85. package/src/helpers/Blocks/Blocks.js +12 -7
  86. package/src/helpers/Blocks/Blocks.test.js +15 -0
  87. package/src/helpers/Blocks/cloneBlocks.ts +1 -1
  88. package/src/helpers/FormValidation/FormValidation.jsx +19 -2
  89. package/src/helpers/FormValidation/validators.ts +1 -1
  90. package/src/helpers/Url/Url.test.js +15 -2
  91. package/src/helpers/Url/urlRegex.js +1 -1
  92. package/src/helpers/index.js +2 -0
  93. package/src/middleware/api.js +4 -2
  94. package/src/middleware/index.js +1 -0
  95. package/src/middleware/userSessionReset.js +46 -0
  96. package/src/store.js +2 -0
  97. package/test-setup-config.jsx +3 -0
  98. package/theme/themes/pastanaga/extras/blocks.less +6 -0
  99. package/types/components/manage/Actions/Actions.stories.d.ts +8 -0
  100. package/types/components/manage/Blocks/LeadImage/Edit.d.ts +14 -5
  101. package/types/components/manage/Blocks/Search/widgets/SelectMetadataField.d.ts +0 -5
  102. package/types/components/manage/Blocks/ToC/Edit.d.ts +1 -6
  103. package/types/components/manage/Blocks/Video/Edit.d.ts +1 -1
  104. package/types/components/manage/Blocks/Video/Edit.stories.d.ts +8 -0
  105. package/types/components/manage/Contents/ContentsBreadcrumbs.stories.d.ts +8 -0
  106. package/types/components/manage/Contents/ContentsUploadModal.d.ts +14 -2
  107. package/types/components/manage/Contents/ContentsUploadModal.stories.d.ts +8 -0
  108. package/types/components/manage/Contents/index.d.ts +1 -1
  109. package/types/components/manage/Controlpanels/AddonsControlpanel.d.ts +2 -2
  110. package/types/components/manage/Controlpanels/Aliases.d.ts +2 -2
  111. package/types/components/manage/Controlpanels/Aliases.stories.d.ts +8 -0
  112. package/types/components/manage/Controlpanels/DatabaseInformation.d.ts +2 -2
  113. package/types/components/manage/Controlpanels/Groups/RenderGroups.d.ts +10 -5
  114. package/types/components/manage/Controlpanels/index.d.ts +4 -4
  115. package/types/components/manage/Display/Display.stories.d.ts +8 -0
  116. package/types/components/manage/Preferences/ChangePassword.d.ts +2 -2
  117. package/types/components/manage/Preferences/ChangePassword.stories.d.ts +8 -0
  118. package/types/components/manage/Preferences/PersonalInformation.d.ts +7 -2
  119. package/types/components/manage/Preferences/PersonalPreferences.d.ts +5 -1
  120. package/types/components/manage/Preferences/PersonalPreferences.stories.d.ts +8 -0
  121. package/types/components/manage/Toolbar/More.d.ts +8 -5
  122. package/types/components/manage/Widgets/DatetimeWidget.d.ts +0 -85
  123. package/types/components/manage/Widgets/DatetimeWidget.stories.d.ts +0 -1
  124. package/types/components/manage/Widgets/ReferenceWidget.d.ts +27 -2
  125. package/types/components/manage/Widgets/index.d.ts +1 -1
  126. package/types/components/theme/Register/Register.d.ts +2 -2
  127. package/types/components/theme/Register/Register.stories.d.ts +9 -0
  128. package/types/components/theme/Tags/Tags.d.ts +15 -7
  129. package/types/components/theme/View/AlbumView.d.ts +3 -17
  130. package/types/config/ControlPanels.d.ts +8 -0
  131. package/types/config/Widgets.d.ts +1 -1
  132. package/types/config/slots.d.ts +21 -0
  133. package/types/helpers/Blocks/Blocks.d.ts +6 -0
  134. package/types/helpers/FormValidation/FormValidation.d.ts +1 -0
  135. package/types/helpers/index.d.ts +2 -2
  136. package/types/middleware/index.d.ts +1 -0
  137. package/types/middleware/userSessionReset.d.ts +5 -0
@@ -1,12 +1,6 @@
1
- /**
2
- * DatetimeWidget component.
3
- * @module components/manage/Widgets/DatetimeWidget
4
- */
5
- import React, { Component } from 'react';
6
- import { compose } from 'redux';
1
+ import React, { useState, useEffect } from 'react';
7
2
  import PropTypes from 'prop-types';
8
- import { defineMessages, injectIntl } from 'react-intl';
9
- import { connect } from 'react-redux';
3
+ import { defineMessages, useIntl } from 'react-intl';
10
4
  import loadable from '@loadable/component';
11
5
  import cx from 'classnames';
12
6
  import { Icon } from '@plone/volto/components';
@@ -50,6 +44,7 @@ const PrevIcon = () => (
50
44
  <Icon name={leftKey} size="30px" />
51
45
  </div>
52
46
  );
47
+
53
48
  const NextIcon = () => (
54
49
  <div
55
50
  style={{
@@ -72,68 +67,53 @@ const defaultTimeDateOnly = {
72
67
  second: 0,
73
68
  };
74
69
 
75
- /**
76
- * DatetimeWidget component class
77
- * @class DatetimeWidget
78
- * @extends Component
79
- *
80
- * To use it, in schema properties, declare a field like:
81
- *
82
- * ```jsx
83
- * {
84
- * title: "Publish date",
85
- * type: 'datetime',
86
- * }
87
- * ```
88
- */
89
- export class DatetimeWidgetComponent extends Component {
90
- /**
91
- * Constructor
92
- * @method constructor
93
- * @param {Object} props Component properties
94
- * @constructs DatetimeWidget
95
- */
96
- constructor(props) {
97
- super(props);
98
- this.moment = props.moment.default;
99
-
100
- this.state = {
101
- focused: false,
102
- // if passed value matches the construction time, we guess it's a default
103
- isDefault:
104
- parseDateTime(
105
- toBackendLang(this.props.lang),
106
- this.props.value,
107
- undefined,
108
- this.moment,
109
- )?.toISOString() === this.moment().utc().toISOString(),
110
- };
111
- }
112
-
113
- getInternalValue() {
114
- return parseDateTime(
115
- toBackendLang(this.props.lang),
116
- this.props.value,
70
+ const DatetimeWidgetComponent = (props) => {
71
+ const {
72
+ id,
73
+ resettable,
74
+ reactDates,
75
+ widgetOptions,
76
+ moment,
77
+ value,
78
+ onChange,
79
+ dateOnly,
80
+ widget,
81
+ noPastDates: propNoPastDates,
82
+ isDisabled,
83
+ } = props;
84
+
85
+ const intl = useIntl();
86
+ const lang = intl.locale;
87
+
88
+ const [focused, setFocused] = useState(false);
89
+ const [isDefault, setIsDefault] = useState(false);
90
+
91
+ const { SingleDatePicker } = reactDates;
92
+
93
+ useEffect(() => {
94
+ const parsedDateTime = parseDateTime(
95
+ toBackendLang(lang),
96
+ value,
117
97
  undefined,
118
- this.moment,
98
+ moment.default,
99
+ );
100
+ setIsDefault(
101
+ parsedDateTime?.toISOString() === moment.default().utc().toISOString(),
119
102
  );
120
- }
103
+ }, [value, lang, moment]);
121
104
 
122
- getDateOnly() {
123
- return this.props.dateOnly || this.props.widget === 'date';
124
- }
105
+ const getInternalValue = () => {
106
+ return parseDateTime(toBackendLang(lang), value, undefined, moment.default);
107
+ };
108
+
109
+ const getDateOnly = () => {
110
+ return dateOnly || widget === 'date';
111
+ };
125
112
 
126
- /**
127
- * Update date storage
128
- * @method onDateChange
129
- * @param {Object} date updated momentjs Object for date
130
- * @returns {undefined}
131
- */
132
- onDateChange = (date) => {
113
+ const onDateChange = (date) => {
133
114
  if (date) {
134
- const moment = this.props.moment.default;
135
- const isDateOnly = this.getDateOnly();
136
- const base = (this.getInternalValue() || moment()).set({
115
+ const isDateOnly = getDateOnly();
116
+ const base = (getInternalValue() || moment.default()).set({
137
117
  year: date.year(),
138
118
  month: date.month(),
139
119
  date: date.date(),
@@ -142,125 +122,100 @@ export class DatetimeWidgetComponent extends Component {
142
122
  const dateValue = isDateOnly
143
123
  ? base.format('YYYY-MM-DD')
144
124
  : base.toISOString();
145
- this.props.onChange(this.props.id, dateValue);
125
+ onChange(id, dateValue);
146
126
  }
147
- this.setState({ isDefault: false });
127
+ setIsDefault(false);
148
128
  };
149
129
 
150
- /**
151
- * Update date storage
152
- * @method onTimeChange
153
- * @param {Object} time updated momentjs Object for time
154
- * @returns {undefined}
155
- */
156
- onTimeChange = (time) => {
157
- const moment = this.props.moment.default;
130
+ const onTimeChange = (time) => {
158
131
  if (time) {
159
- const base = (this.getInternalValue() || moment()).set({
132
+ const base = (getInternalValue() || moment.default()).set({
160
133
  hours: time?.hours() ?? 0,
161
134
  minutes: time?.minutes() ?? 0,
162
135
  seconds: 0,
163
136
  });
164
137
  const dateValue = base.toISOString();
165
- this.props.onChange(this.props.id, dateValue);
138
+ onChange(id, dateValue);
166
139
  }
167
140
  };
168
141
 
169
- onResetDates = () => {
170
- this.setState({ isDefault: false });
171
- this.props.onChange(this.props.id, null);
142
+ const onResetDates = () => {
143
+ setIsDefault(false);
144
+ onChange(id, null);
172
145
  };
173
146
 
174
- /**
175
- * Handle SingleDatePicker focus
176
- * @method onFocusChange
177
- * @param {boolean} focused component focus state.
178
- * @returns {undefined}
179
- */
180
- onFocusChange = ({ focused }) => this.setState({ focused });
181
-
182
- render() {
183
- const { id, resettable, intl, reactDates, widgetOptions, lang } =
184
- this.props;
185
- const noPastDates =
186
- this.props.noPastDates || widgetOptions?.pattern_options?.noPastDates;
187
- const moment = this.props.moment.default;
188
- const datetime = this.getInternalValue();
189
- const dateOnly = this.getDateOnly();
190
- const { SingleDatePicker } = reactDates;
191
-
192
- return (
193
- <FormFieldWrapper {...this.props}>
194
- <div className="date-time-widget-wrapper">
147
+ const onFocusChange = ({ focused }) => setFocused(focused);
148
+
149
+ const noPastDates =
150
+ propNoPastDates || widgetOptions?.pattern_options?.noPastDates;
151
+ const datetime = getInternalValue();
152
+ const isDateOnly = getDateOnly();
153
+
154
+ return (
155
+ <FormFieldWrapper {...props}>
156
+ <div className="date-time-widget-wrapper">
157
+ <div
158
+ className={cx('ui input date-input', {
159
+ 'default-date': isDefault,
160
+ })}
161
+ >
162
+ <SingleDatePicker
163
+ date={datetime}
164
+ disabled={isDisabled}
165
+ onDateChange={onDateChange}
166
+ focused={focused}
167
+ numberOfMonths={1}
168
+ {...(noPastDates ? {} : { isOutsideRange: () => false })}
169
+ onFocusChange={onFocusChange}
170
+ noBorder
171
+ displayFormat={moment.default
172
+ .localeData(toBackendLang(lang))
173
+ .longDateFormat('L')}
174
+ navPrev={<PrevIcon />}
175
+ navNext={<NextIcon />}
176
+ id={`${id}-date`}
177
+ placeholder={intl.formatMessage(messages.date)}
178
+ />
179
+ </div>
180
+ {!isDateOnly && (
195
181
  <div
196
- className={cx('ui input date-input', {
197
- 'default-date': this.state.isDefault,
182
+ className={cx('ui input time-input', {
183
+ 'default-date': isDefault,
198
184
  })}
199
185
  >
200
- <SingleDatePicker
201
- date={datetime}
202
- disabled={this.props.isDisabled}
203
- onDateChange={this.onDateChange}
204
- focused={this.state.focused}
205
- numberOfMonths={1}
206
- {...(noPastDates ? {} : { isOutsideRange: () => false })}
207
- onFocusChange={this.onFocusChange}
208
- noBorder
209
- displayFormat={moment
186
+ <TimePicker
187
+ disabled={isDisabled}
188
+ defaultValue={datetime}
189
+ value={datetime}
190
+ onChange={onTimeChange}
191
+ allowEmpty={false}
192
+ showSecond={false}
193
+ use12Hours={lang === 'en'}
194
+ id={`${id}-time`}
195
+ format={moment.default
210
196
  .localeData(toBackendLang(lang))
211
- .longDateFormat('L')}
212
- navPrev={<PrevIcon />}
213
- navNext={<NextIcon />}
214
- id={`${id}-date`}
215
- placeholder={intl.formatMessage(messages.date)}
197
+ .longDateFormat('LT')}
198
+ placeholder={intl.formatMessage(messages.time)}
199
+ focusOnOpen
200
+ placement="bottomRight"
216
201
  />
217
202
  </div>
218
- {!dateOnly && (
219
- <div
220
- className={cx('ui input time-input', {
221
- 'default-date': this.state.isDefault,
222
- })}
223
- >
224
- <TimePicker
225
- disabled={this.props.isDisabled}
226
- defaultValue={datetime}
227
- value={datetime}
228
- onChange={this.onTimeChange}
229
- allowEmpty={false}
230
- showSecond={false}
231
- use12Hours={lang === 'en'}
232
- id={`${id}-time`}
233
- format={moment
234
- .localeData(toBackendLang(lang))
235
- .longDateFormat('LT')}
236
- placeholder={intl.formatMessage(messages.time)}
237
- focusOnOpen
238
- placement="bottomRight"
239
- />
240
- </div>
241
- )}
242
- {resettable && (
243
- <button
244
- // FF needs that the type is "button" in order to not POST the form
245
- type="button"
246
- disabled={this.props.isDisabled || !datetime}
247
- onClick={() => this.onResetDates()}
248
- className="item ui noborder button"
249
- >
250
- <Icon name={clearSVG} size="24px" className="close" />
251
- </button>
252
- )}
253
- </div>
254
- </FormFieldWrapper>
255
- );
256
- }
257
- }
203
+ )}
204
+ {resettable && (
205
+ <button
206
+ type="button"
207
+ disabled={isDisabled || !datetime}
208
+ onClick={onResetDates}
209
+ className="item ui noborder button"
210
+ >
211
+ <Icon name={clearSVG} size="24px" className="close" />
212
+ </button>
213
+ )}
214
+ </div>
215
+ </FormFieldWrapper>
216
+ );
217
+ };
258
218
 
259
- /**
260
- * Property types.
261
- * @property {Object} propTypes Property types.
262
- * @static
263
- */
264
219
  DatetimeWidgetComponent.propTypes = {
265
220
  id: PropTypes.string.isRequired,
266
221
  title: PropTypes.string.isRequired,
@@ -275,11 +230,6 @@ DatetimeWidgetComponent.propTypes = {
275
230
  resettable: PropTypes.bool,
276
231
  };
277
232
 
278
- /**
279
- * Default properties.
280
- * @property {Object} defaultProps Default properties.
281
- * @static
282
- */
283
233
  DatetimeWidgetComponent.defaultProps = {
284
234
  description: null,
285
235
  required: false,
@@ -290,10 +240,6 @@ DatetimeWidgetComponent.defaultProps = {
290
240
  resettable: true,
291
241
  };
292
242
 
293
- export default compose(
294
- injectLazyLibs(['reactDates', 'moment']),
295
- connect((state) => ({
296
- lang: state.intl.locale,
297
- })),
298
- injectIntl,
299
- )(DatetimeWidgetComponent);
243
+ export default injectLazyLibs(['reactDates', 'moment'])(
244
+ DatetimeWidgetComponent,
245
+ );