@strapi/admin 4.10.2 → 4.11.0-alpha.0

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 (66) hide show
  1. package/admin/src/content-manager/components/DynamicTable/BulkActionsBar/index.js +307 -0
  2. package/admin/src/content-manager/components/DynamicTable/index.js +20 -4
  3. package/admin/src/content-manager/components/EditViewDataManagerProvider/index.js +3 -2
  4. package/admin/src/content-manager/components/EditViewDataManagerProvider/utils/index.js +0 -1
  5. package/admin/src/content-manager/components/Wysiwyg/WysiwygNav.js +156 -155
  6. package/admin/src/content-manager/pages/ListSettingsView/{utils/excludedSortOptions.js → constants.js} +1 -1
  7. package/admin/src/content-manager/pages/ListSettingsView/index.js +33 -36
  8. package/admin/src/content-manager/pages/ListView/index.js +118 -2
  9. package/admin/src/content-manager/utils/index.js +2 -0
  10. package/admin/src/content-manager/{components/EditViewDataManagerProvider/utils → utils}/schema.js +1 -1
  11. package/admin/src/injectionZones.js +6 -1
  12. package/admin/src/pages/Admin/index.js +3 -0
  13. package/admin/src/pages/AuthPage/components/Register/index.js +1 -1
  14. package/admin/src/pages/MarketplacePage/components/NpmPackagesFilters/FilterSelect.js +1 -1
  15. package/admin/src/pages/MarketplacePage/components/NpmPackagesFilters/FiltersPopover.js +52 -41
  16. package/admin/src/pages/MarketplacePage/components/SortSelect/index.js +16 -0
  17. package/admin/src/pages/SettingsPage/pages/Users/components/SelectRoles/index.js +2 -2
  18. package/admin/src/translations/en.json +6 -1
  19. package/admin/src/translations/ru.json +7 -0
  20. package/build/3562.57745ccd.chunk.js +50 -0
  21. package/build/6970.5159b068.chunk.js +1 -0
  22. package/build/{Admin-authenticatedApp.a8373103.chunk.js → Admin-authenticatedApp.27a2329f.chunk.js} +2 -2
  23. package/build/{Admin_marketplace.a60cde15.chunk.js → Admin_marketplace.5f7b89e5.chunk.js} +32 -8
  24. package/build/{Admin_settingsPage.5e045f42.chunk.js → Admin_settingsPage.9d0419bc.chunk.js} +1 -1
  25. package/build/Upload_ConfigureTheView.d429a7fc.chunk.js +1 -0
  26. package/build/{admin-app.9bfe4ec7.chunk.js → admin-app.8e1f56bc.chunk.js} +2 -2
  27. package/build/{admin-edit-users.ba27c532.chunk.js → admin-edit-users.2aae89f5.chunk.js} +4 -4
  28. package/build/{admin-users.ad5dd832.chunk.js → admin-users.04a823ca.chunk.js} +5 -5
  29. package/build/content-manager.cf467ecc.chunk.js +1123 -0
  30. package/build/{content-type-builder-translation-en-json.446b611d.chunk.js → content-type-builder-translation-en-json.5e5f8607.chunk.js} +1 -1
  31. package/build/en-json.7edb00f6.chunk.js +1 -0
  32. package/build/i18n-translation-en-json.1ec7becf.chunk.js +1 -0
  33. package/build/i18n-translation-ru-json.401bc498.chunk.js +1 -0
  34. package/build/index.html +1 -1
  35. package/build/{main.41970e4c.js → main.14dca275.js} +183 -188
  36. package/build/review-workflows-settings.6a662ebd.chunk.js +61 -0
  37. package/build/ru-json.678cd48b.chunk.js +1 -0
  38. package/build/{runtime~main.c20330f1.js → runtime~main.1074f2bb.js} +1 -1
  39. package/build/users-permissions-translation-ru-json.8e883c67.chunk.js +1 -0
  40. package/ee/admin/content-manager/components/DynamicTable/CellContent/ReviewWorkflowsStage/ReviewWorkflowsStageEE.js +12 -1
  41. package/ee/admin/content-manager/components/DynamicTable/CellContent/ReviewWorkflowsStage/getTableColumn.js +6 -1
  42. package/ee/admin/content-manager/pages/EditView/InformationBox/InformationBoxEE.js +4 -1
  43. package/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/Stages/Stage/Stage.js +10 -7
  44. package/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/Stages/Stage/components/OptionColor/OptionColor.js +11 -1
  45. package/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/components/Stages/Stage/components/SingleValueColor/SingleValueColor.js +14 -1
  46. package/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/utils/colors.js +7 -1
  47. package/ee/server/routes/audit-logs.js +43 -0
  48. package/ee/server/routes/index.js +5 -226
  49. package/ee/server/routes/license-limit.js +29 -0
  50. package/ee/server/routes/review-workflows.js +112 -0
  51. package/ee/server/routes/sso.js +60 -0
  52. package/ee/server/routes/utils.js +15 -0
  53. package/package.json +16 -16
  54. package/server/routes/index.js +16 -11
  55. package/webpack.alias.js +0 -1
  56. package/admin/src/content-manager/components/DynamicTable/ConfirmDialogDeleteAll/index.js +0 -73
  57. package/admin/src/content-manager/pages/ListSettingsView/utils/api.js +0 -10
  58. package/build/6858.56d4d528.chunk.js +0 -50
  59. package/build/9703.e590889d.chunk.js +0 -1
  60. package/build/Upload_ConfigureTheView.4fc648b5.chunk.js +0 -1
  61. package/build/content-manager.d28eb183.chunk.js +0 -1111
  62. package/build/en-json.c7fc79af.chunk.js +0 -1
  63. package/build/i18n-translation-en-json.60af6722.chunk.js +0 -1
  64. package/build/review-workflows-settings.7c0b4e73.chunk.js +0 -61
  65. package/build/ru-json.e0662702.chunk.js +0 -1
  66. package/build/users-permissions-translation-ru-json.20e177db.chunk.js +0 -1
@@ -0,0 +1,307 @@
1
+ import React, { useState } from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { Button, Dialog, DialogBody, DialogFooter, Flex, Typography } from '@strapi/design-system';
4
+ import { Check, ExclamationMarkCircle, Trash } from '@strapi/icons';
5
+ import { useIntl } from 'react-intl';
6
+ import { useSelector } from 'react-redux';
7
+ import { useTracking } from '@strapi/helper-plugin';
8
+ import { getTrad } from '../../../utils';
9
+ import InjectionZoneList from '../../InjectionZoneList';
10
+ import { listViewDomain } from '../../../pages/ListView/selectors';
11
+
12
+ const ConfirmBulkActionDialog = ({ onToggleDialog, isOpen, dialogBody, endAction }) => {
13
+ const { formatMessage } = useIntl();
14
+
15
+ return (
16
+ <Dialog
17
+ onClose={onToggleDialog}
18
+ title={formatMessage({
19
+ id: 'app.components.ConfirmDialog.title',
20
+ defaultMessage: 'Confirmation',
21
+ })}
22
+ labelledBy="confirmation"
23
+ describedBy="confirm-description"
24
+ isOpen={isOpen}
25
+ >
26
+ <DialogBody icon={<ExclamationMarkCircle />}>
27
+ <Flex direction="column" alignItems="stretch" gap={2}>
28
+ {dialogBody}
29
+ </Flex>
30
+ </DialogBody>
31
+ <DialogFooter
32
+ startAction={
33
+ <Button onClick={onToggleDialog} variant="tertiary">
34
+ {formatMessage({
35
+ id: 'app.components.Button.cancel',
36
+ defaultMessage: 'Cancel',
37
+ })}
38
+ </Button>
39
+ }
40
+ endAction={endAction}
41
+ />
42
+ </Dialog>
43
+ );
44
+ };
45
+
46
+ ConfirmBulkActionDialog.propTypes = {
47
+ isOpen: PropTypes.bool.isRequired,
48
+ onToggleDialog: PropTypes.func.isRequired,
49
+ dialogBody: PropTypes.node.isRequired,
50
+ endAction: PropTypes.node.isRequired,
51
+ };
52
+
53
+ const confirmDialogsPropTypes = {
54
+ isConfirmButtonLoading: PropTypes.bool.isRequired,
55
+ isOpen: PropTypes.bool.isRequired,
56
+ onConfirm: PropTypes.func.isRequired,
57
+ onToggleDialog: PropTypes.func.isRequired,
58
+ };
59
+
60
+ const ConfirmDialogPublishAll = ({ isOpen, onToggleDialog, isConfirmButtonLoading, onConfirm }) => {
61
+ const { formatMessage } = useIntl();
62
+
63
+ return (
64
+ <ConfirmBulkActionDialog
65
+ isOpen={isOpen}
66
+ onToggleDialog={onToggleDialog}
67
+ dialogBody={
68
+ <>
69
+ <Typography id="confirm-description" textAlign="center">
70
+ {formatMessage({
71
+ id: getTrad('popUpWarning.bodyMessage.contentType.publish.all'),
72
+ defaultMessage: 'Are you sure you want to publish these entries?',
73
+ })}
74
+ </Typography>
75
+ <InjectionZoneList area="contentManager.listView.publishModalAdditionalInfos" />
76
+ </>
77
+ }
78
+ endAction={
79
+ <Button
80
+ onClick={onConfirm}
81
+ variant="secondary"
82
+ startIcon={<Check />}
83
+ loading={isConfirmButtonLoading}
84
+ >
85
+ {formatMessage({
86
+ id: 'app.utils.publish',
87
+ defaultMessage: 'Publish',
88
+ })}
89
+ </Button>
90
+ }
91
+ />
92
+ );
93
+ };
94
+
95
+ ConfirmDialogPublishAll.propTypes = confirmDialogsPropTypes;
96
+
97
+ const ConfirmDialogUnpublishAll = ({
98
+ isOpen,
99
+ onToggleDialog,
100
+ isConfirmButtonLoading,
101
+ onConfirm,
102
+ }) => {
103
+ const { formatMessage } = useIntl();
104
+
105
+ return (
106
+ <ConfirmBulkActionDialog
107
+ isOpen={isOpen}
108
+ onToggleDialog={onToggleDialog}
109
+ dialogBody={
110
+ <>
111
+ <Typography id="confirm-description" textAlign="center">
112
+ {formatMessage({
113
+ id: getTrad('popUpWarning.bodyMessage.contentType.unpublish.all'),
114
+ defaultMessage: 'Are you sure you want to unpublish these entries?',
115
+ })}
116
+ </Typography>
117
+ <InjectionZoneList area="contentManager.listView.unpublishModalAdditionalInfos" />
118
+ </>
119
+ }
120
+ endAction={
121
+ <Button
122
+ onClick={onConfirm}
123
+ variant="secondary"
124
+ startIcon={<Check />}
125
+ loading={isConfirmButtonLoading}
126
+ >
127
+ {formatMessage({
128
+ id: 'app.utils.unpublish',
129
+ defaultMessage: 'Unpublish',
130
+ })}
131
+ </Button>
132
+ }
133
+ />
134
+ );
135
+ };
136
+
137
+ ConfirmDialogUnpublishAll.propTypes = confirmDialogsPropTypes;
138
+
139
+ const ConfirmDialogDeleteAll = ({ isOpen, onToggleDialog, isConfirmButtonLoading, onConfirm }) => {
140
+ const { formatMessage } = useIntl();
141
+
142
+ return (
143
+ <ConfirmBulkActionDialog
144
+ isOpen={isOpen}
145
+ onToggleDialog={onToggleDialog}
146
+ dialogBody={
147
+ <>
148
+ <Typography id="confirm-description" textAlign="center">
149
+ {formatMessage({
150
+ id: getTrad('popUpWarning.bodyMessage.contentType.delete.all'),
151
+ defaultMessage: 'Are you sure you want to delete these entries?',
152
+ })}
153
+ </Typography>
154
+ <InjectionZoneList area="contentManager.listView.deleteModalAdditionalInfos" />
155
+ </>
156
+ }
157
+ endAction={
158
+ <Button
159
+ onClick={onConfirm}
160
+ variant="danger-light"
161
+ startIcon={<Trash />}
162
+ id="confirm-delete"
163
+ loading={isConfirmButtonLoading}
164
+ >
165
+ {formatMessage({
166
+ id: 'app.components.Button.confirm',
167
+ defaultMessage: 'Confirm',
168
+ })}
169
+ </Button>
170
+ }
171
+ />
172
+ );
173
+ };
174
+
175
+ ConfirmDialogDeleteAll.propTypes = confirmDialogsPropTypes;
176
+
177
+ const BulkActionsBar = ({
178
+ showPublish,
179
+ showDelete,
180
+ onConfirmDeleteAll,
181
+ onConfirmPublishAll,
182
+ onConfirmUnpublishAll,
183
+ selectedEntries,
184
+ clearSelectedEntries,
185
+ }) => {
186
+ const { formatMessage } = useIntl();
187
+ const { trackUsage } = useTracking();
188
+ const { data } = useSelector(listViewDomain());
189
+
190
+ const [isConfirmButtonLoading, setIsConfirmButtonLoading] = useState(false);
191
+ const [dialogToOpen, setDialogToOpen] = useState(null);
192
+
193
+ // Filters for Bulk actions
194
+ const selectedEntriesObjects = data.filter((entry) => selectedEntries.includes(entry.id));
195
+ const publishButtonIsShown =
196
+ showPublish && selectedEntriesObjects.some((entry) => !entry.publishedAt);
197
+ const unpublishButtonIsShown =
198
+ showPublish && selectedEntriesObjects.some((entry) => entry.publishedAt);
199
+
200
+ const toggleDeleteModal = () => {
201
+ if (dialogToOpen === 'delete') {
202
+ setDialogToOpen(null);
203
+ } else {
204
+ setDialogToOpen('delete');
205
+ trackUsage('willBulkDeleteEntries');
206
+ }
207
+ };
208
+
209
+ const togglePublishModal = () => {
210
+ if (dialogToOpen === 'publish') {
211
+ setDialogToOpen(null);
212
+ } else {
213
+ setDialogToOpen('publish');
214
+ trackUsage('willBulkPublishEntries');
215
+ }
216
+ };
217
+
218
+ const toggleUnpublishModal = () => {
219
+ if (dialogToOpen === 'unpublish') {
220
+ setDialogToOpen(null);
221
+ } else {
222
+ setDialogToOpen('unpublish');
223
+ trackUsage('willBulkUnpublishEntries');
224
+ }
225
+ };
226
+
227
+ const handleBulkAction = async (confirmAction, toggleModal) => {
228
+ try {
229
+ setIsConfirmButtonLoading(true);
230
+ await confirmAction(selectedEntries);
231
+ setIsConfirmButtonLoading(false);
232
+ toggleModal();
233
+ clearSelectedEntries();
234
+ } catch (error) {
235
+ setIsConfirmButtonLoading(false);
236
+ toggleModal();
237
+ }
238
+ };
239
+
240
+ const handleBulkDelete = () => handleBulkAction(onConfirmDeleteAll, toggleDeleteModal);
241
+ const handleBulkPublish = () => handleBulkAction(onConfirmPublishAll, togglePublishModal);
242
+ const handleBulkUnpublish = () => handleBulkAction(onConfirmUnpublishAll, toggleUnpublishModal);
243
+
244
+ return (
245
+ <>
246
+ {publishButtonIsShown && (
247
+ <>
248
+ <Button variant="tertiary" onClick={togglePublishModal}>
249
+ {formatMessage({ id: 'app.utils.publish', defaultMessage: 'Publish' })}
250
+ </Button>
251
+ <ConfirmDialogPublishAll
252
+ isOpen={dialogToOpen === 'publish'}
253
+ onToggleDialog={togglePublishModal}
254
+ isConfirmButtonLoading={isConfirmButtonLoading}
255
+ onConfirm={handleBulkPublish}
256
+ />
257
+ </>
258
+ )}
259
+ {unpublishButtonIsShown && (
260
+ <>
261
+ <Button variant="tertiary" onClick={toggleUnpublishModal}>
262
+ {formatMessage({ id: 'app.utils.unpublish', defaultMessage: 'Unpublish' })}
263
+ </Button>
264
+ <ConfirmDialogUnpublishAll
265
+ isOpen={dialogToOpen === 'unpublish'}
266
+ onToggleDialog={toggleUnpublishModal}
267
+ isConfirmButtonLoading={isConfirmButtonLoading}
268
+ onConfirm={handleBulkUnpublish}
269
+ />
270
+ </>
271
+ )}
272
+ {showDelete && (
273
+ <>
274
+ <Button variant="danger-light" onClick={toggleDeleteModal}>
275
+ {formatMessage({ id: 'global.delete', defaultMessage: 'Delete' })}
276
+ </Button>
277
+ <ConfirmDialogDeleteAll
278
+ isOpen={dialogToOpen === 'delete'}
279
+ onToggleDialog={toggleDeleteModal}
280
+ isConfirmButtonLoading={isConfirmButtonLoading}
281
+ onConfirm={handleBulkDelete}
282
+ />
283
+ </>
284
+ )}
285
+ </>
286
+ );
287
+ };
288
+
289
+ BulkActionsBar.defaultProps = {
290
+ showPublish: false,
291
+ showDelete: false,
292
+ onConfirmDeleteAll() {},
293
+ onConfirmPublishAll() {},
294
+ onConfirmUnpublishAll() {},
295
+ };
296
+
297
+ BulkActionsBar.propTypes = {
298
+ showPublish: PropTypes.bool,
299
+ showDelete: PropTypes.bool,
300
+ onConfirmDeleteAll: PropTypes.func,
301
+ onConfirmPublishAll: PropTypes.func,
302
+ onConfirmUnpublishAll: PropTypes.func,
303
+ selectedEntries: PropTypes.array.isRequired,
304
+ clearSelectedEntries: PropTypes.func.isRequired,
305
+ };
306
+
307
+ export default BulkActionsBar;
@@ -9,19 +9,22 @@ import { INJECT_COLUMN_IN_TABLE } from '../../../exposedHooks';
9
9
  import { selectDisplayedHeaders } from '../../pages/ListView/selectors';
10
10
  import { getTrad } from '../../utils';
11
11
  import TableRows from './TableRows';
12
- import ConfirmDialogDeleteAll from './ConfirmDialogDeleteAll';
13
12
  import ConfirmDialogDelete from './ConfirmDialogDelete';
14
13
  import { PublicationState } from './CellContent/PublicationState/PublicationState';
14
+ import BulkActionsBar from './BulkActionsBar';
15
15
 
16
16
  const DynamicTable = ({
17
17
  canCreate,
18
18
  canDelete,
19
+ canPublish,
19
20
  contentTypeName,
20
21
  action,
21
22
  isBulkable,
22
23
  isLoading,
23
24
  onConfirmDelete,
24
25
  onConfirmDeleteAll,
26
+ onConfirmPublishAll,
27
+ onConfirmUnpublishAll,
25
28
  layout,
26
29
  rows,
27
30
  }) => {
@@ -89,17 +92,27 @@ const DynamicTable = ({
89
92
 
90
93
  return (
91
94
  <Table
92
- components={{ ConfirmDialogDelete, ConfirmDialogDeleteAll }}
95
+ components={{ ConfirmDialogDelete }}
93
96
  contentType={contentTypeName}
94
97
  action={action}
95
98
  isLoading={isLoading}
96
99
  headers={tableHeaders}
97
100
  onConfirmDelete={onConfirmDelete}
98
- onConfirmDeleteAll={onConfirmDeleteAll}
99
101
  onOpenDeleteAllModalTrackedEvent="willBulkDeleteEntries"
100
102
  rows={rows}
101
103
  withBulkActions
102
- withMainAction={canDelete && isBulkable}
104
+ withMainAction={(canDelete || canPublish) && isBulkable}
105
+ renderBulkActionsBar={({ selectedEntries, clearSelectedEntries }) => (
106
+ <BulkActionsBar
107
+ showPublish={canPublish && hasDraftAndPublish}
108
+ showDelete={canDelete}
109
+ onConfirmDeleteAll={onConfirmDeleteAll}
110
+ onConfirmPublishAll={onConfirmPublishAll}
111
+ onConfirmUnpublishAll={onConfirmUnpublishAll}
112
+ selectedEntries={selectedEntries}
113
+ clearSelectedEntries={clearSelectedEntries}
114
+ />
115
+ )}
103
116
  >
104
117
  <TableRows
105
118
  canCreate={canCreate}
@@ -121,6 +134,7 @@ DynamicTable.defaultProps = {
121
134
  DynamicTable.propTypes = {
122
135
  canCreate: PropTypes.bool.isRequired,
123
136
  canDelete: PropTypes.bool.isRequired,
137
+ canPublish: PropTypes.bool.isRequired,
124
138
  contentTypeName: PropTypes.string.isRequired,
125
139
  action: PropTypes.node,
126
140
  isBulkable: PropTypes.bool.isRequired,
@@ -139,6 +153,8 @@ DynamicTable.propTypes = {
139
153
  }).isRequired,
140
154
  onConfirmDelete: PropTypes.func.isRequired,
141
155
  onConfirmDeleteAll: PropTypes.func.isRequired,
156
+ onConfirmPublishAll: PropTypes.func.isRequired,
157
+ onConfirmUnpublishAll: PropTypes.func.isRequired,
142
158
  rows: PropTypes.array.isRequired,
143
159
  };
144
160
 
@@ -21,12 +21,13 @@ import {
21
21
  getAPIInnerErrors,
22
22
  } from '@strapi/helper-plugin';
23
23
 
24
- import { getTrad } from '../../utils';
24
+ import { createYupSchema, getTrad } from '../../utils';
25
25
 
26
26
  import selectCrudReducer from '../../sharedReducers/crudReducer/selectors';
27
27
 
28
28
  import reducer, { initialState } from './reducer';
29
- import { cleanData, createYupSchema } from './utils';
29
+ import { cleanData } from './utils';
30
+
30
31
  import { clearSetModifiedDataOnly } from '../../sharedReducers/crudReducer/actions';
31
32
  import { usePrev } from '../../hooks';
32
33
 
@@ -1,4 +1,3 @@
1
1
  export { default as moveFields } from './moveFields';
2
2
  export { default as cleanData } from './cleanData';
3
- export { default as createYupSchema } from './schema';
4
3
  export { findAllAndReplace } from './findAllAndReplace';