@plone/volto 17.0.0-alpha.26 → 17.0.0-alpha.28

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 (154) hide show
  1. package/.eslintrc +26 -3
  2. package/.yarn/install-state.gz +0 -0
  3. package/.yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs +541 -0
  4. package/.yarn/releases/yarn-3.6.3.cjs +874 -0
  5. package/CHANGELOG.md +60 -0
  6. package/addon-registry.js +10 -1
  7. package/create-addons-loader.js +1 -1
  8. package/locales/ca/LC_MESSAGES/volto.po +57 -31
  9. package/locales/ca.json +1 -1
  10. package/locales/de/LC_MESSAGES/volto.po +58 -32
  11. package/locales/de.json +1 -1
  12. package/locales/en/LC_MESSAGES/volto.po +57 -31
  13. package/locales/en.json +1 -1
  14. package/locales/es/LC_MESSAGES/volto.po +65 -39
  15. package/locales/es.json +1 -1
  16. package/locales/eu/LC_MESSAGES/volto.po +57 -31
  17. package/locales/eu.json +1 -1
  18. package/locales/fi/LC_MESSAGES/volto.po +57 -31
  19. package/locales/fi.json +1 -1
  20. package/locales/fr/LC_MESSAGES/volto.po +57 -31
  21. package/locales/fr.json +1 -1
  22. package/locales/it/LC_MESSAGES/volto.po +57 -31
  23. package/locales/it.json +1 -1
  24. package/locales/ja/LC_MESSAGES/volto.po +57 -31
  25. package/locales/ja.json +1 -1
  26. package/locales/nl/LC_MESSAGES/volto.po +57 -31
  27. package/locales/nl.json +1 -1
  28. package/locales/pt/LC_MESSAGES/volto.po +57 -31
  29. package/locales/pt.json +1 -1
  30. package/locales/pt_BR/LC_MESSAGES/volto.po +57 -31
  31. package/locales/pt_BR.json +1 -1
  32. package/locales/ro/LC_MESSAGES/volto.po +57 -31
  33. package/locales/ro.json +1 -1
  34. package/locales/volto.pot +62 -32
  35. package/locales/zh_CN/LC_MESSAGES/volto.po +57 -31
  36. package/locales/zh_CN.json +1 -1
  37. package/package.json +35 -26
  38. package/packages/volto-slate/package.json +1 -1
  39. package/packages/volto-slate/src/blocks/Text/TextBlockView.jsx +2 -1
  40. package/packages/volto-slate/src/blocks/Text/index.js +0 -5
  41. package/packages/volto-slate/src/editor/plugins/Link/render.jsx +5 -6
  42. package/packages/volto-slate/src/editor/render.jsx +11 -1
  43. package/razzle.config.js +4 -6
  44. package/src/components/index.js +194 -194
  45. package/src/components/manage/Add/Add.jsx +7 -8
  46. package/src/components/manage/Blocks/Block/Settings.test.jsx +17 -15
  47. package/src/components/manage/Blocks/HTML/Edit.jsx +8 -8
  48. package/src/components/manage/Blocks/HeroImageLeft/Edit.jsx +30 -25
  49. package/src/components/manage/Blocks/Listing/ListingBody.jsx +6 -4
  50. package/src/components/manage/Blocks/Maps/Edit.test.jsx +1 -2
  51. package/src/components/manage/Blocks/Maps/View.test.jsx +1 -2
  52. package/src/components/manage/Blocks/Search/components/Facets.jsx +2 -3
  53. package/src/components/manage/Blocks/Search/components/FilterList.jsx +4 -6
  54. package/src/components/manage/Blocks/Search/components/SelectFacet.jsx +2 -9
  55. package/src/components/manage/Blocks/Search/hocs/withQueryString.jsx +3 -0
  56. package/src/components/manage/Blocks/Search/hocs/withSearch.jsx +8 -6
  57. package/src/components/manage/Blocks/Search/schema.js +13 -13
  58. package/src/components/manage/Blocks/Table/Cell.jsx +2 -3
  59. package/src/components/manage/Blocks/Text/Edit.jsx +2 -3
  60. package/src/components/manage/Blocks/Title/View.jsx +4 -37
  61. package/src/components/manage/Blocks/ToC/View.jsx +1 -0
  62. package/src/components/manage/Blocks/ToC/variations/DefaultTocRenderer.jsx +3 -2
  63. package/src/components/manage/Blocks/ToC/variations/HorizontalMenu.jsx +3 -2
  64. package/src/components/manage/Contents/Contents.jsx +252 -114
  65. package/src/components/manage/Contents/ContentsPropertiesModal.jsx +90 -154
  66. package/src/components/manage/Contents/ContentsRenameModal.jsx +88 -139
  67. package/src/components/manage/Contents/ContentsRenameModal.stories.jsx +61 -0
  68. package/src/components/manage/Contents/ContentsTagsModal.jsx +83 -130
  69. package/src/components/manage/Contents/ContentsTagsModal.stories.jsx +68 -0
  70. package/src/components/manage/Contents/ContentsUploadModal.jsx +1 -2
  71. package/src/components/manage/Contents/ContentsWorkflowModal.jsx +87 -154
  72. package/src/components/manage/Controlpanels/Aliases.jsx +4 -12
  73. package/src/components/manage/Controlpanels/Rules/AddRule.jsx +2 -9
  74. package/src/components/manage/Controlpanels/UndoControlpanel.jsx +6 -9
  75. package/src/components/manage/Form/BlockDataForm.test.jsx +17 -15
  76. package/src/components/manage/Form/Form.jsx +2 -3
  77. package/src/components/manage/Form/InlineForm.test.jsx +16 -14
  78. package/src/components/manage/LockingToastsFactory/LockingToastsFactory.jsx +1 -2
  79. package/src/components/manage/Sharing/Sharing.jsx +7 -0
  80. package/src/components/manage/Sidebar/Sidebar.jsx +139 -220
  81. package/src/components/manage/Toolbar/More.jsx +12 -12
  82. package/src/components/manage/Toolbar/PersonalTools.jsx +97 -155
  83. package/src/components/manage/Toolbar/Toolbar.jsx +2 -2
  84. package/src/components/manage/UniversalLink/UniversalLink.test.jsx +2 -1
  85. package/src/components/manage/Widgets/AlignWidget.jsx +2 -4
  86. package/src/components/manage/Widgets/ColorPickerWidget.test.jsx +9 -7
  87. package/src/components/manage/Widgets/DatetimeWidget.jsx +2 -8
  88. package/src/components/manage/Widgets/IdWidget.jsx +1 -2
  89. package/src/components/manage/Widgets/ObjectBrowserWidget.jsx +2 -9
  90. package/src/components/manage/Widgets/RecurrenceWidget/RecurrenceWidget.jsx +2 -9
  91. package/src/components/manage/Widgets/RecurrenceWidget/WeekdayOfTheMonthIndexField.jsx +4 -4
  92. package/src/components/manage/Widgets/SchemaWidget.jsx +6 -9
  93. package/src/components/manage/Widgets/WysiwygWidget.jsx +2 -9
  94. package/src/components/theme/Comments/Comments.jsx +3 -10
  95. package/src/components/theme/ContentMetadataTags/ContentMetadataTags.jsx +4 -0
  96. package/src/components/theme/Login/Login.jsx +1 -2
  97. package/src/components/theme/PasswordReset/PasswordReset.jsx +1 -2
  98. package/src/components/theme/PreviewImage/PreviewImage.jsx +10 -5
  99. package/src/components/theme/PreviewImage/PreviewImage.test.js +17 -0
  100. package/src/components/theme/Register/Register.jsx +2 -4
  101. package/src/components/theme/TsTest/TsTest.test.tsx +11 -0
  102. package/src/components/theme/TsTest/TsTest.tsx +15 -0
  103. package/src/components/theme/View/AlbumView.jsx +3 -2
  104. package/src/components/theme/Widgets/ImageWidget.stories.jsx +1 -2
  105. package/src/config/Loadables.jsx +1 -1
  106. package/src/config/RichTextEditor/Blocks.jsx +2 -3
  107. package/src/config/RichTextEditor/Plugins.jsx +2 -3
  108. package/src/config/RichTextEditor/ToHTML.jsx +12 -10
  109. package/src/config/RichTextEditor/index.js +2 -3
  110. package/src/config/Views.jsx +5 -5
  111. package/src/express-middleware/ok.js +1 -1
  112. package/src/helpers/Blocks/Blocks.js +4 -6
  113. package/src/helpers/Blocks/Blocks.test.js +35 -35
  114. package/src/helpers/Extensions/withBlockSchemaEnhancer.js +48 -50
  115. package/src/helpers/FormValidation/FormValidation.js +7 -6
  116. package/src/helpers/Html/Html.jsx +2 -8
  117. package/src/helpers/Loadable/__mocks__/Loadable.js +18 -18
  118. package/src/helpers/MessageLabels/MessageLabels.js +2 -3
  119. package/src/helpers/Utils/UseDetectClickOutside.stories.jsx +2 -3
  120. package/src/helpers/Utils/Utils.js +10 -0
  121. package/src/helpers/Utils/Utils.test.js +13 -0
  122. package/src/helpers/index.js +1 -0
  123. package/src/hooks/index.js +1 -1
  124. package/src/middleware/api.js +194 -190
  125. package/src/middleware/blacklistRoutes.js +25 -22
  126. package/src/middleware/storeProtectLoadUtils.js +61 -62
  127. package/src/middleware/storeProtectLoadUtils.test.js +47 -43
  128. package/src/reducers/content/content.test.js +4 -4
  129. package/src/reducers/navigation/navigation.js +5 -5
  130. package/src/reducers/navigation/navigation.test.js +30 -0
  131. package/src/registry.js +2 -2
  132. package/src/storybook.jsx +24 -38
  133. package/theme/themes/pastanaga/collections/menu.overrides +3 -2
  134. package/theme/themes/pastanaga/elements/container.overrides +5 -2
  135. package/theme/themes/pastanaga/elements/input.overrides +1 -1
  136. package/theme/themes/pastanaga/elements/step.overrides +2 -1
  137. package/theme/themes/pastanaga/extras/blocks.less +20 -14
  138. package/theme/themes/pastanaga/extras/color-picker-widget.less +1 -1
  139. package/theme/themes/pastanaga/extras/contents.less +5 -1
  140. package/theme/themes/pastanaga/extras/draftjs.less +4 -4
  141. package/theme/themes/pastanaga/extras/grid.less +5 -4
  142. package/theme/themes/pastanaga/extras/main.less +6 -6
  143. package/theme/themes/pastanaga/extras/react-dates-overrides.less +4 -2
  144. package/theme/themes/pastanaga/extras/search.less +2 -2
  145. package/theme/themes/pastanaga/extras/sidebar.less +5 -4
  146. package/theme/themes/pastanaga/extras/time-picker-overrides.less +5 -3
  147. package/theme/themes/pastanaga/extras/toolbar.less +6 -2
  148. package/theme/themes/pastanaga/extras/userscontrolpanel.less +17 -9
  149. package/theme/themes/pastanaga/extras/widgets.less +1 -1
  150. package/theme/themes/pastanaga/modules/rating.overrides +2 -1
  151. package/theme/themes/pastanaga-cms-ui/elements/container.overrides +2 -1
  152. package/theme/themes/pastanaga-cms-ui/extras/cms-ui.elements.container.less +6 -2
  153. package/theme/themes/pastanaga-cms-ui/extras/cms-ui.site.less +2 -2
  154. package/tsconfig.json +33 -0
@@ -1,15 +1,10 @@
1
- /**
2
- * Contents tags modal.
3
- * @module components/manage/Contents/ContentsTagsModal
4
- */
5
-
6
- import React, { Component } from 'react';
1
+ import React, { useCallback, useEffect, useMemo } from 'react';
7
2
  import PropTypes from 'prop-types';
8
- import { connect } from 'react-redux';
9
- import { compose } from 'redux';
3
+ import { useDispatch, useSelector } from 'react-redux';
10
4
  import { map } from 'lodash';
11
- import { defineMessages, injectIntl } from 'react-intl';
5
+ import { defineMessages, useIntl } from 'react-intl';
12
6
 
7
+ import { usePrevious } from '@plone/volto/helpers';
13
8
  import { updateContent } from '@plone/volto/actions';
14
9
  import { ModalForm } from '@plone/volto/components';
15
10
 
@@ -32,133 +27,91 @@ const messages = defineMessages({
32
27
  },
33
28
  });
34
29
 
35
- /**
36
- * ContentsTagsModal class.
37
- * @class ContentsTagsModal
38
- * @extends Component
39
- */
40
- class ContentsTagsModal extends Component {
41
- /**
42
- * Property types.
43
- * @property {Object} propTypes Property types.
44
- * @static
45
- */
46
- static propTypes = {
47
- updateContent: PropTypes.func.isRequired,
48
- items: PropTypes.arrayOf(
49
- PropTypes.shape({
50
- subjects: PropTypes.arrayOf(PropTypes.string),
51
- url: PropTypes.string,
52
- }),
53
- ).isRequired,
54
- request: PropTypes.shape({
55
- loading: PropTypes.bool,
56
- loaded: PropTypes.bool,
57
- }).isRequired,
58
- open: PropTypes.bool.isRequired,
59
- onOk: PropTypes.func.isRequired,
60
- onCancel: PropTypes.func.isRequired,
61
- };
62
-
63
- /**
64
- * Constructor
65
- * @method constructor
66
- * @param {Object} props Component properties
67
- * @constructs ContentsUploadModal
68
- */
69
- constructor(props) {
70
- super(props);
71
- this.onSubmit = this.onSubmit.bind(this);
72
- }
30
+ const ContentsTagsModal = (props) => {
31
+ const { items, open, onCancel, onOk } = props;
32
+ const intl = useIntl();
33
+ const dispatch = useDispatch();
34
+ const request = useSelector((state) => state.content.update);
35
+ const prevrequestloading = usePrevious(request.loading);
73
36
 
74
- /**
75
- * Component will receive props
76
- * @method componentWillReceiveProps
77
- * @param {Object} nextProps Next properties
78
- * @returns {undefined}
79
- */
80
- UNSAFE_componentWillReceiveProps(nextProps) {
81
- if (this.props.request.loading && nextProps.request.loaded) {
82
- this.props.onOk();
37
+ useEffect(() => {
38
+ if (prevrequestloading && request.loaded) {
39
+ onOk();
83
40
  }
84
- }
41
+ }, [onOk, prevrequestloading, request.loaded]);
85
42
 
86
- /**
87
- * Submit handler
88
- * @method onSubmit
89
- * @param {Object} data Form data
90
- * @returns {undefined}
91
- */
92
- onSubmit({ tags_to_add = [], tags_to_remove = [] }) {
93
- this.props.updateContent(
94
- map(this.props.items, (item) => item.url),
95
- map(this.props.items, (item) => ({
96
- subjects: [
97
- ...new Set(
98
- (item.subjects ?? [])
99
- .filter((s) => !tags_to_remove.includes(s))
100
- .concat(tags_to_add),
101
- ),
102
- ],
103
- })),
104
- );
105
- }
43
+ const onSubmit = useCallback(
44
+ ({ tags_to_add = [], tags_to_remove = [] }) => {
45
+ dispatch(
46
+ updateContent(
47
+ map(items, (item) => item.url),
48
+ map(items, (item) => ({
49
+ subjects: [
50
+ ...new Set(
51
+ (item.subjects ?? [])
52
+ .filter((s) => !tags_to_remove.includes(s))
53
+ .concat(tags_to_add),
54
+ ),
55
+ ],
56
+ })),
57
+ ),
58
+ );
59
+ },
60
+ [dispatch, items],
61
+ );
106
62
 
107
- /**
108
- * Render method.
109
- * @method render
110
- * @returns {string} Markup for the component.
111
- */
112
- render() {
113
- const currentSetTags = [
114
- ...new Set(this.props.items.map((item) => item.subjects).flat()),
115
- ];
63
+ const currentSetTags = useMemo(
64
+ () => [...new Set(items.map((item) => item.subjects).flat())],
65
+ [items],
66
+ );
116
67
 
117
- return (
118
- this.props.open && (
119
- <ModalForm
120
- open={this.props.open}
121
- onSubmit={this.onSubmit}
122
- onCancel={this.props.onCancel}
123
- title={this.props.intl.formatMessage(messages.tags)}
124
- schema={{
125
- fieldsets: [
126
- {
127
- id: 'default',
128
- title: this.props.intl.formatMessage(messages.default),
129
- fields: ['tags_to_remove', 'tags_to_add'],
130
- },
131
- ],
132
- properties: {
133
- tags_to_remove: {
134
- type: 'array',
135
- widget: 'array',
136
- title: this.props.intl.formatMessage(messages.tagsToRemove),
137
- choices: currentSetTags.map((tag) => [tag, tag]),
138
- },
139
- tags_to_add: {
140
- type: 'array',
141
- widget: 'token',
142
- title: this.props.intl.formatMessage(messages.tagsToAdd),
143
- items: {
144
- vocabulary: { '@id': 'plone.app.vocabularies.Keywords' },
145
- },
68
+ return (
69
+ open && (
70
+ <ModalForm
71
+ open={open}
72
+ onSubmit={onSubmit}
73
+ onCancel={onCancel}
74
+ title={intl.formatMessage(messages.tags)}
75
+ schema={{
76
+ fieldsets: [
77
+ {
78
+ id: 'default',
79
+ title: intl.formatMessage(messages.default),
80
+ fields: ['tags_to_remove', 'tags_to_add'],
81
+ },
82
+ ],
83
+ properties: {
84
+ tags_to_remove: {
85
+ type: 'array',
86
+ widget: 'array',
87
+ title: intl.formatMessage(messages.tagsToRemove),
88
+ choices: currentSetTags.map((tag) => [tag, tag]),
89
+ },
90
+ tags_to_add: {
91
+ type: 'array',
92
+ widget: 'token',
93
+ title: intl.formatMessage(messages.tagsToAdd),
94
+ items: {
95
+ vocabulary: { '@id': 'plone.app.vocabularies.Keywords' },
146
96
  },
147
97
  },
148
- required: [],
149
- }}
150
- />
151
- )
152
- );
153
- }
154
- }
98
+ },
99
+ required: [],
100
+ }}
101
+ />
102
+ )
103
+ );
104
+ };
155
105
 
156
- export default compose(
157
- injectIntl,
158
- connect(
159
- (state) => ({
160
- request: state.content.update,
106
+ ContentsTagsModal.propTypes = {
107
+ items: PropTypes.arrayOf(
108
+ PropTypes.shape({
109
+ subjects: PropTypes.arrayOf(PropTypes.string),
110
+ url: PropTypes.string,
161
111
  }),
162
- { updateContent },
163
- ),
164
- )(ContentsTagsModal);
112
+ ).isRequired,
113
+ open: PropTypes.bool.isRequired,
114
+ onOk: PropTypes.func.isRequired,
115
+ onCancel: PropTypes.func.isRequired,
116
+ };
117
+ export default ContentsTagsModal;
@@ -0,0 +1,68 @@
1
+ import { injectIntl } from 'react-intl';
2
+ import React from 'react';
3
+ import ContentsTagsModalComponent from './ContentsTagsModal';
4
+ import { RealStoreWrapper as Wrapper } from '@plone/volto/storybook';
5
+ import { bool } from 'prop-types';
6
+
7
+ const IntlContentTagsModalComponent = injectIntl(ContentsTagsModalComponent);
8
+
9
+ function StoryComponent(args) {
10
+ return (
11
+ <Wrapper
12
+ customStore={{
13
+ content: {
14
+ update: {
15
+ loading: false,
16
+ loaded: true,
17
+ },
18
+ },
19
+ intl: {
20
+ locale: 'en',
21
+ messages: {},
22
+ },
23
+ }}
24
+ >
25
+ <div id="toolbar" style={{ display: 'none' }} />
26
+ <IntlContentTagsModalComponent
27
+ {...args}
28
+ onOk={() => {}}
29
+ onCancel={() => {}}
30
+ items={[
31
+ {
32
+ ...args,
33
+ url: '/blog',
34
+ },
35
+ ]}
36
+ />
37
+ </Wrapper>
38
+ );
39
+ }
40
+
41
+ export const ContentTagsModal = StoryComponent.bind({});
42
+
43
+ ContentTagsModal.args = {
44
+ subjects: ['plone 6 ', 'plone 5', 'plone'],
45
+ open: true,
46
+ };
47
+
48
+ export default {
49
+ title: 'Public components/Contents/Content Tags Modal',
50
+ component: ContentTagsModal,
51
+ decorators: [
52
+ (Story) => (
53
+ <div className="ui segment form attached" style={{ width: '400px' }}>
54
+ <Story />
55
+ </div>
56
+ ),
57
+ ],
58
+ argTypes: {
59
+ subjects: {
60
+ context: 'json',
61
+ description: 'Added tags',
62
+ },
63
+ open: {
64
+ context: bool,
65
+ description: 'open/close modal',
66
+ },
67
+ },
68
+ };
@@ -35,8 +35,7 @@ const messages = defineMessages({
35
35
  defaultMessage: 'Cancel',
36
36
  },
37
37
  upload: {
38
- id:
39
- '{count, plural, one {Upload {count} file} other {Upload {count} files}}',
38
+ id: '{count, plural, one {Upload {count} file} other {Upload {count} files}}',
40
39
  defaultMessage:
41
40
  '{count, plural, one {Upload {count} file} other {Upload {count} files}}',
42
41
  },
@@ -1,15 +1,10 @@
1
- /**
2
- * Contents workflow modal.
3
- * @module components/manage/Contents/ContentsWorkflowModal
4
- */
5
-
6
- import React, { Component } from 'react';
1
+ import React, { useCallback, useEffect } from 'react';
7
2
  import PropTypes from 'prop-types';
8
- import { connect } from 'react-redux';
9
- import { compose } from 'redux';
3
+ import { shallowEqual, useDispatch, useSelector } from 'react-redux';
10
4
  import { concat, filter, last, map, uniqBy } from 'lodash';
11
- import { defineMessages, injectIntl } from 'react-intl';
5
+ import { defineMessages, useIntl } from 'react-intl';
12
6
 
7
+ import { usePrevious } from '@plone/volto/helpers';
13
8
  import { getWorkflow, transitionWorkflow } from '@plone/volto/actions';
14
9
  import { ModalForm } from '@plone/volto/components';
15
10
 
@@ -37,158 +32,96 @@ const messages = defineMessages({
37
32
  },
38
33
  });
39
34
 
40
- /**
41
- * ContentsWorkflowModal class.
42
- * @class ContentsWorkflowModal
43
- * @extends Component
44
- */
45
- class ContentsWorkflowModal extends Component {
46
- /**
47
- * Property types.
48
- * @property {Object} propTypes Property types.
49
- * @static
50
- */
51
- static propTypes = {
52
- getWorkflow: PropTypes.func.isRequired,
53
- transitionWorkflow: PropTypes.func.isRequired,
54
- items: PropTypes.arrayOf(PropTypes.string).isRequired,
55
- request: PropTypes.shape({
56
- loading: PropTypes.bool,
57
- loaded: PropTypes.bool,
58
- }).isRequired,
59
- workflows: PropTypes.arrayOf(
60
- PropTypes.shape({
61
- transition: PropTypes.shape({
62
- '@id': PropTypes.string,
63
- title: PropTypes.string,
64
- }),
65
- }),
66
- ).isRequired,
67
- open: PropTypes.bool.isRequired,
68
- onOk: PropTypes.func.isRequired,
69
- onCancel: PropTypes.func.isRequired,
70
- };
71
-
72
- /**
73
- * Constructor
74
- * @method constructor
75
- * @param {Object} props Component properties
76
- * @constructs ContentsUploadModal
77
- */
78
- constructor(props) {
79
- super(props);
80
- this.onSubmit = this.onSubmit.bind(this);
81
- }
35
+ const ContentsWorkflowModal = (props) => {
36
+ const { onOk, items, open, onCancel } = props;
37
+ const intl = useIntl();
38
+ const dispatch = useDispatch();
39
+ const request = useSelector((state) => state.workflow.transition);
40
+ const workflows = useSelector(
41
+ (state) => state.workflow.multiple,
42
+ shallowEqual,
43
+ );
44
+ const prevrequestloading = usePrevious(request.loading);
82
45
 
83
- componentDidMount() {
84
- this.props.getWorkflow(this.props.items);
85
- }
46
+ useEffect(() => {
47
+ dispatch(getWorkflow(items));
48
+ }, [dispatch, items]);
86
49
 
87
- /**
88
- * Component will receive props
89
- * @method componentWillReceiveProps
90
- * @param {Object} nextProps Next properties
91
- * @returns {undefined}
92
- */
93
- UNSAFE_componentWillReceiveProps(nextProps) {
94
- if (this.props.request.loading && nextProps.request.loaded) {
95
- this.props.onOk();
50
+ useEffect(() => {
51
+ if (prevrequestloading && request.loaded) {
52
+ onOk();
96
53
  }
97
- }
54
+ }, [onOk, prevrequestloading, request.loaded]);
98
55
 
99
- /**
100
- * Submit handler
101
- * @method onSubmit
102
- * @param {string} state New state
103
- * @returns {undefined}
104
- */
105
- onSubmit({ state, include_children }) {
106
- if (!state) {
107
- return;
108
- }
109
-
110
- this.props.transitionWorkflow(
111
- filter(
112
- map(
113
- concat(
114
- ...map(this.props.workflows, (workflow) => workflow.transitions),
56
+ const onSubmit = useCallback(
57
+ ({ state, include_children }) => {
58
+ if (!state) {
59
+ return;
60
+ }
61
+ dispatch(
62
+ transitionWorkflow(
63
+ filter(
64
+ map(
65
+ concat(...map(workflows, (workflow) => workflow.transitions)),
66
+ (item) => item['@id'],
67
+ ),
68
+ (x) => last(x.split('/')) === state,
115
69
  ),
116
- (item) => item['@id'],
70
+ include_children,
117
71
  ),
118
- (x) => last(x.split('/')) === state,
119
- ),
120
- include_children,
121
- );
122
- }
72
+ );
73
+ },
74
+ [dispatch, workflows],
75
+ );
123
76
 
124
- /**
125
- * Render method.
126
- * @method render
127
- * @returns {string} Markup for the component.
128
- */
129
- render() {
130
- return (
131
- this.props.open &&
132
- this.props.workflows.length > 0 && (
133
- <ModalForm
134
- open={this.props.open}
135
- loading={this.props.request.loading}
136
- loadingMessage={this.props.intl.formatMessage(
137
- messages.loadingMessage,
138
- )}
139
- onSubmit={this.onSubmit}
140
- onCancel={this.props.onCancel}
141
- title={this.props.intl.formatMessage(messages.stateTitle)}
142
- schema={{
143
- fieldsets: [
144
- {
145
- id: 'default',
146
- title: this.props.intl.formatMessage(messages.default),
147
- fields: ['state', 'include_children'],
148
- },
149
- ],
150
- properties: {
151
- state: {
152
- description: this.props.intl.formatMessage(
153
- messages.stateDescription,
154
- ),
155
- title: this.props.intl.formatMessage(messages.stateTitle),
156
- type: 'string',
157
- choices: map(
158
- uniqBy(
159
- concat(
160
- ...map(
161
- this.props.workflows,
162
- (workflow) => workflow.transitions,
163
- ),
164
- ),
165
- (x) => x.title,
166
- ),
167
- (y) => [last(y['@id'].split('/')), y.title],
168
- ),
169
- },
170
- include_children: {
171
- title: this.props.intl.formatMessage(
172
- messages.includeChildrenTitle,
77
+ return (
78
+ open &&
79
+ workflows.length > 0 && (
80
+ <ModalForm
81
+ open={open}
82
+ loading={request.loading}
83
+ loadingMessage={intl.formatMessage(messages.loadingMessage)}
84
+ onSubmit={onSubmit}
85
+ onCancel={onCancel}
86
+ title={intl.formatMessage(messages.stateTitle)}
87
+ schema={{
88
+ fieldsets: [
89
+ {
90
+ id: 'default',
91
+ title: intl.formatMessage(messages.default),
92
+ fields: ['state', 'include_children'],
93
+ },
94
+ ],
95
+ properties: {
96
+ state: {
97
+ description: intl.formatMessage(messages.stateDescription),
98
+ title: intl.formatMessage(messages.stateTitle),
99
+ type: 'string',
100
+ choices: map(
101
+ uniqBy(
102
+ concat(...map(workflows, (workflow) => workflow.transitions)),
103
+ (x) => x.title,
173
104
  ),
174
- type: 'boolean',
175
- },
105
+ (y) => [last(y['@id'].split('/')), y.title],
106
+ ),
176
107
  },
177
- required: [],
178
- }}
179
- />
180
- )
181
- );
182
- }
183
- }
108
+ include_children: {
109
+ title: intl.formatMessage(messages.includeChildrenTitle),
110
+ type: 'boolean',
111
+ },
112
+ },
113
+ required: [],
114
+ }}
115
+ />
116
+ )
117
+ );
118
+ };
119
+
120
+ ContentsWorkflowModal.propTypes = {
121
+ items: PropTypes.arrayOf(PropTypes.string).isRequired,
122
+ open: PropTypes.bool.isRequired,
123
+ onOk: PropTypes.func.isRequired,
124
+ onCancel: PropTypes.func.isRequired,
125
+ };
184
126
 
185
- export default compose(
186
- injectIntl,
187
- connect(
188
- (state) => ({
189
- request: state.workflow.transition,
190
- workflows: state.workflow.multiple,
191
- }),
192
- { getWorkflow, transitionWorkflow },
193
- ),
194
- )(ContentsWorkflowModal);
127
+ export default ContentsWorkflowModal;
@@ -185,12 +185,8 @@ class Aliases extends Component {
185
185
  }
186
186
  }
187
187
  if (this.props.aliases.add.loading && nextProps.aliases.add.loaded) {
188
- const {
189
- filterQuery,
190
- filterType,
191
- createdBefore,
192
- itemsPerPage,
193
- } = this.state;
188
+ const { filterQuery, filterType, createdBefore, itemsPerPage } =
189
+ this.state;
194
190
 
195
191
  this.props.getAliases(getBaseUrl(this.props.pathname), {
196
192
  query: filterQuery,
@@ -212,12 +208,8 @@ class Aliases extends Component {
212
208
  }
213
209
  }
214
210
  if (this.props.aliases.remove.loading && nextProps.aliases.remove.loaded) {
215
- const {
216
- filterQuery,
217
- filterType,
218
- createdBefore,
219
- itemsPerPage,
220
- } = this.state;
211
+ const { filterQuery, filterType, createdBefore, itemsPerPage } =
212
+ this.state;
221
213
 
222
214
  this.props.getAliases(getBaseUrl(this.props.pathname), {
223
215
  query: filterQuery,
@@ -155,15 +155,8 @@ class AddRule extends Component {
155
155
  * @returns {undefined}
156
156
  */
157
157
  handleAdd() {
158
- const {
159
- title,
160
- description,
161
- event,
162
- cascading,
163
- stop,
164
- enabled,
165
- invalidForm,
166
- } = this.state;
158
+ const { title, description, event, cascading, stop, enabled, invalidForm } =
159
+ this.state;
167
160
  const data = { title, description, event, cascading, enabled, stop };
168
161
  if (!invalidForm) {
169
162
  this.props.addNewRule(getBaseUrl(this.props.pathname), data);
@@ -141,15 +141,12 @@ class UndoControlpanel extends Component {
141
141
  this.onNext = this.onNext.bind(this);
142
142
  this.onUndo = this.onUndo.bind(this);
143
143
  this.handleTableVisiblity = this.handleTableVisiblity.bind(this);
144
- this.handleNotSortedNextPrevButtons = this.handleNotSortedNextPrevButtons.bind(
145
- this,
146
- );
147
- this.handleSortedNextPrevButtons = this.handleSortedNextPrevButtons.bind(
148
- this,
149
- );
150
- this.checkTransactionsUndoneStatus = this.checkTransactionsUndoneStatus.bind(
151
- this,
152
- );
144
+ this.handleNotSortedNextPrevButtons =
145
+ this.handleNotSortedNextPrevButtons.bind(this);
146
+ this.handleSortedNextPrevButtons =
147
+ this.handleSortedNextPrevButtons.bind(this);
148
+ this.checkTransactionsUndoneStatus =
149
+ this.checkTransactionsUndoneStatus.bind(this);
153
150
  }
154
151
 
155
152
  /**