@strapi/content-releases 4.16.2 → 4.18.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 (87) hide show
  1. package/dist/_chunks/{App-b83f4a97.mjs → App-g2P5kbSm.mjs} +341 -171
  2. package/dist/_chunks/App-g2P5kbSm.mjs.map +1 -0
  3. package/dist/_chunks/{App-b6df6b60.js → App-o5_WfqR-.js} +337 -167
  4. package/dist/_chunks/App-o5_WfqR-.js.map +1 -0
  5. package/dist/_chunks/{en-b5dfabe6.js → en-haKSQIo8.js} +19 -4
  6. package/dist/_chunks/en-haKSQIo8.js.map +1 -0
  7. package/dist/_chunks/{en-d837b82d.mjs → en-ngTk74JV.mjs} +19 -4
  8. package/dist/_chunks/en-ngTk74JV.mjs.map +1 -0
  9. package/dist/_chunks/{index-28e99164.js → index-EdBmRHRU.js} +96 -31
  10. package/dist/_chunks/index-EdBmRHRU.js.map +1 -0
  11. package/dist/_chunks/{index-c39292e3.mjs → index-XAQOX_IB.mjs} +101 -36
  12. package/dist/_chunks/index-XAQOX_IB.mjs.map +1 -0
  13. package/dist/admin/index.js +2 -2
  14. package/dist/admin/index.mjs +3 -3
  15. package/dist/server/index.js +60 -35
  16. package/dist/server/index.js.map +1 -1
  17. package/dist/server/index.mjs +58 -35
  18. package/dist/server/index.mjs.map +1 -1
  19. package/package.json +11 -10
  20. package/dist/_chunks/App-b6df6b60.js.map +0 -1
  21. package/dist/_chunks/App-b83f4a97.mjs.map +0 -1
  22. package/dist/_chunks/en-b5dfabe6.js.map +0 -1
  23. package/dist/_chunks/en-d837b82d.mjs.map +0 -1
  24. package/dist/_chunks/index-28e99164.js.map +0 -1
  25. package/dist/_chunks/index-c39292e3.mjs.map +0 -1
  26. package/dist/admin/src/components/CMReleasesContainer.d.ts +0 -1
  27. package/dist/admin/src/components/ReleaseActionMenu.d.ts +0 -7
  28. package/dist/admin/src/components/ReleaseActionOptions.d.ts +0 -8
  29. package/dist/admin/src/components/ReleaseModal.d.ts +0 -11
  30. package/dist/admin/src/constants.d.ts +0 -13
  31. package/dist/admin/src/index.d.ts +0 -3
  32. package/dist/admin/src/pages/App.d.ts +0 -1
  33. package/dist/admin/src/pages/ReleaseDetailsPage.d.ts +0 -10
  34. package/dist/admin/src/pages/ReleasesPage.d.ts +0 -11
  35. package/dist/admin/src/pages/tests/mockReleaseDetailsPageData.d.ts +0 -104
  36. package/dist/admin/src/pages/tests/mockReleasesPageData.d.ts +0 -38
  37. package/dist/admin/src/pluginId.d.ts +0 -1
  38. package/dist/admin/src/services/axios.d.ts +0 -29
  39. package/dist/admin/src/services/release.d.ts +0 -348
  40. package/dist/server/src/constants.d.ts +0 -9
  41. package/dist/server/src/constants.d.ts.map +0 -1
  42. package/dist/server/src/content-types/index.d.ts +0 -82
  43. package/dist/server/src/content-types/index.d.ts.map +0 -1
  44. package/dist/server/src/content-types/release/index.d.ts +0 -37
  45. package/dist/server/src/content-types/release/index.d.ts.map +0 -1
  46. package/dist/server/src/content-types/release/schema.d.ts +0 -36
  47. package/dist/server/src/content-types/release/schema.d.ts.map +0 -1
  48. package/dist/server/src/content-types/release-action/index.d.ts +0 -44
  49. package/dist/server/src/content-types/release-action/index.d.ts.map +0 -1
  50. package/dist/server/src/content-types/release-action/schema.d.ts +0 -43
  51. package/dist/server/src/content-types/release-action/schema.d.ts.map +0 -1
  52. package/dist/server/src/controllers/index.d.ts +0 -18
  53. package/dist/server/src/controllers/index.d.ts.map +0 -1
  54. package/dist/server/src/controllers/release-action.d.ts +0 -9
  55. package/dist/server/src/controllers/release-action.d.ts.map +0 -1
  56. package/dist/server/src/controllers/release.d.ts +0 -11
  57. package/dist/server/src/controllers/release.d.ts.map +0 -1
  58. package/dist/server/src/controllers/validation/release-action.d.ts +0 -3
  59. package/dist/server/src/controllers/validation/release-action.d.ts.map +0 -1
  60. package/dist/server/src/controllers/validation/release.d.ts +0 -2
  61. package/dist/server/src/controllers/validation/release.d.ts.map +0 -1
  62. package/dist/server/src/index.d.ts +0 -301
  63. package/dist/server/src/index.d.ts.map +0 -1
  64. package/dist/server/src/register.d.ts +0 -5
  65. package/dist/server/src/register.d.ts.map +0 -1
  66. package/dist/server/src/routes/index.d.ts +0 -35
  67. package/dist/server/src/routes/index.d.ts.map +0 -1
  68. package/dist/server/src/routes/release-action.d.ts +0 -18
  69. package/dist/server/src/routes/release-action.d.ts.map +0 -1
  70. package/dist/server/src/routes/release.d.ts +0 -18
  71. package/dist/server/src/routes/release.d.ts.map +0 -1
  72. package/dist/server/src/services/index.d.ts +0 -77
  73. package/dist/server/src/services/index.d.ts.map +0 -1
  74. package/dist/server/src/services/release.d.ts +0 -55
  75. package/dist/server/src/services/release.d.ts.map +0 -1
  76. package/dist/server/src/services/validation.d.ts +0 -10
  77. package/dist/server/src/services/validation.d.ts.map +0 -1
  78. package/dist/server/src/utils/index.d.ts +0 -4
  79. package/dist/server/src/utils/index.d.ts.map +0 -1
  80. package/dist/shared/contracts/release-actions.d.ts +0 -95
  81. package/dist/shared/contracts/release-actions.d.ts.map +0 -1
  82. package/dist/shared/contracts/releases.d.ts +0 -153
  83. package/dist/shared/contracts/releases.d.ts.map +0 -1
  84. package/dist/shared/types.d.ts +0 -24
  85. package/dist/shared/types.d.ts.map +0 -1
  86. package/dist/shared/validation-schemas.d.ts +0 -2
  87. package/dist/shared/validation-schemas.d.ts.map +0 -1
@@ -1,17 +1,17 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
+ const helperPlugin = require("@strapi/helper-plugin");
4
5
  const reactRouterDom = require("react-router-dom");
5
- const index = require("./index-28e99164.js");
6
+ const index = require("./index-EdBmRHRU.js");
6
7
  const React = require("react");
7
8
  const designSystem = require("@strapi/design-system");
8
- const helperPlugin = require("@strapi/helper-plugin");
9
+ const v2 = require("@strapi/design-system/v2");
9
10
  const icons = require("@strapi/icons");
10
11
  const reactIntl = require("react-intl");
11
12
  const styled = require("styled-components");
12
13
  const formik = require("formik");
13
14
  const yup = require("yup");
14
- const v2 = require("@strapi/design-system/v2");
15
15
  require("@reduxjs/toolkit/query");
16
16
  require("axios");
17
17
  require("@reduxjs/toolkit/query/react");
@@ -47,11 +47,16 @@ const ReleaseModal = ({
47
47
  isLoading = false
48
48
  }) => {
49
49
  const { formatMessage } = reactIntl.useIntl();
50
+ const { pathname } = reactRouterDom.useLocation();
51
+ const isCreatingRelease = pathname === `/plugins/${index.pluginId}`;
50
52
  return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.ModalLayout, { onClose: handleClose, labelledBy: "title", children: [
51
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.ModalHeader, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { id: "title", fontWeight: "bold", textColor: "neutral800", children: formatMessage({
52
- id: "content-releases.modal.add-release-title",
53
- defaultMessage: "New release"
54
- }) }) }),
53
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.ModalHeader, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { id: "title", fontWeight: "bold", textColor: "neutral800", children: formatMessage(
54
+ {
55
+ id: "content-releases.modal.title",
56
+ defaultMessage: "{isCreatingRelease, select, true {New release} other {Edit release}}"
57
+ },
58
+ { isCreatingRelease }
59
+ ) }) }),
55
60
  /* @__PURE__ */ jsxRuntime.jsx(
56
61
  formik.Formik,
57
62
  {
@@ -78,10 +83,22 @@ const ReleaseModal = ({
78
83
  designSystem.ModalFooter,
79
84
  {
80
85
  startActions: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { onClick: handleClose, variant: "tertiary", name: "cancel", children: formatMessage({ id: "cancel", defaultMessage: "Cancel" }) }),
81
- endActions: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { name: "submit", loading: isLoading, disabled: !values.name, type: "submit", children: formatMessage({
82
- id: "content-releases.modal.form.button.submit",
83
- defaultMessage: "Continue"
84
- }) })
86
+ endActions: /* @__PURE__ */ jsxRuntime.jsx(
87
+ designSystem.Button,
88
+ {
89
+ name: "submit",
90
+ loading: isLoading,
91
+ disabled: !values.name || values.name === initialValues.name,
92
+ type: "submit",
93
+ children: formatMessage(
94
+ {
95
+ id: "content-releases.modal.form.button.submit",
96
+ defaultMessage: "{isCreatingRelease, select, true {Continue} other {Save}}"
97
+ },
98
+ { isCreatingRelease }
99
+ )
100
+ }
101
+ )
85
102
  }
86
103
  )
87
104
  ] })
@@ -97,6 +114,14 @@ const ReleaseInfoWrapper = styled__default.default(designSystem.Flex)`
97
114
  `;
98
115
  const StyledFlex = styled__default.default(designSystem.Flex)`
99
116
  align-self: stretch;
117
+ cursor: ${({ disabled }) => disabled ? "not-allowed" : "pointer"};
118
+
119
+ svg path {
120
+ fill: ${({ theme, disabled }) => disabled && theme.colors.neutral500};
121
+ }
122
+ span {
123
+ color: ${({ theme, disabled }) => disabled && theme.colors.neutral500};
124
+ }
100
125
  `;
101
126
  const PencilIcon = styled__default.default(icons.Pencil)`
102
127
  width: ${({ theme }) => theme.spaces[4]};
@@ -112,7 +137,7 @@ const TrashIcon = styled__default.default(icons.Trash)`
112
137
  fill: ${({ theme }) => theme.colors.danger600};
113
138
  }
114
139
  `;
115
- const PopoverButton = ({ onClick, children }) => {
140
+ const PopoverButton = ({ onClick, disabled, children }) => {
116
141
  return /* @__PURE__ */ jsxRuntime.jsx(
117
142
  StyledFlex,
118
143
  {
@@ -125,10 +150,36 @@ const PopoverButton = ({ onClick, children }) => {
125
150
  as: "button",
126
151
  hasRadius: true,
127
152
  onClick,
153
+ disabled,
128
154
  children
129
155
  }
130
156
  );
131
157
  };
158
+ const EntryValidationText = ({ status, action }) => {
159
+ const { formatMessage } = reactIntl.useIntl();
160
+ if (action == "publish") {
161
+ return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 2, children: [
162
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Icon, { color: "success600", as: icons.CheckCircle }),
163
+ status === "published" ? /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "success600", fontWeight: "bold", children: formatMessage({
164
+ id: "content-releases.pages.ReleaseDetails.entry-validation.already-published",
165
+ defaultMessage: "Already published"
166
+ }) }) : /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { children: formatMessage({
167
+ id: "content-releases.pages.ReleaseDetails.entry-validation.ready-to-publish",
168
+ defaultMessage: "Ready to publish"
169
+ }) })
170
+ ] });
171
+ }
172
+ return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 2, children: [
173
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Icon, { color: "success600", as: icons.CheckCircle }),
174
+ status === "draft" ? /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "success600", fontWeight: "bold", children: formatMessage({
175
+ id: "content-releases.pages.ReleaseDetails.entry-validation.already-unpublished",
176
+ defaultMessage: "Already unpublished"
177
+ }) }) : /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { children: formatMessage({
178
+ id: "content-releases.pages.ReleaseDetails.entry-validation.ready-to-unpublish",
179
+ defaultMessage: "Ready to unpublish"
180
+ }) })
181
+ ] });
182
+ };
132
183
  const ReleaseDetailsLayout = ({
133
184
  toggleEditReleaseModal,
134
185
  toggleWarningSubmit,
@@ -138,10 +189,18 @@ const ReleaseDetailsLayout = ({
138
189
  const { releaseId } = reactRouterDom.useParams();
139
190
  const [isPopoverVisible, setIsPopoverVisible] = React__namespace.useState(false);
140
191
  const moreButtonRef = React__namespace.useRef(null);
141
- const { data, isLoading: isLoadingDetails, isError } = index.useGetReleaseQuery({ id: releaseId });
192
+ const {
193
+ data,
194
+ isLoading: isLoadingDetails,
195
+ isError,
196
+ error
197
+ } = index.useGetReleaseQuery({ id: releaseId });
142
198
  const [publishRelease, { isLoading: isPublishing }] = index.usePublishReleaseMutation();
143
199
  const toggleNotification = helperPlugin.useNotification();
144
200
  const { formatAPIError } = helperPlugin.useAPIErrorHandler();
201
+ const {
202
+ allowedActions: { canUpdate, canDelete }
203
+ } = helperPlugin.useRBAC(index.PERMISSIONS);
145
204
  const release = data?.data;
146
205
  const handleTogglePopover = () => {
147
206
  setIsPopoverVisible((prev) => !prev);
@@ -177,15 +236,29 @@ const ReleaseDetailsLayout = ({
177
236
  handleTogglePopover();
178
237
  };
179
238
  if (isLoadingDetails) {
180
- return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Main, { "aria-busy": isLoadingDetails, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { paddingBottom: 8, children: /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.LoadingIndicatorPage, {}) }) });
239
+ return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Main, { "aria-busy": isLoadingDetails, children: /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.LoadingIndicatorPage, {}) });
181
240
  }
182
241
  if (isError || !release) {
183
- return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Main, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { paddingBottom: 8, children: /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.AnErrorOccurred, {}) }) });
242
+ return /* @__PURE__ */ jsxRuntime.jsx(
243
+ reactRouterDom.Redirect,
244
+ {
245
+ to: {
246
+ pathname: "/plugins/content-releases",
247
+ state: {
248
+ errors: [
249
+ {
250
+ code: error?.code
251
+ }
252
+ ]
253
+ }
254
+ }
255
+ }
256
+ );
184
257
  }
185
258
  const totalEntries = release.actions.meta.count || 0;
186
- const createdBy = `${release.createdBy.firstname} ${release.createdBy.lastname}`;
259
+ const createdBy = release.createdBy.lastname ? `${release.createdBy.firstname} ${release.createdBy.lastname}` : `${release.createdBy.firstname}`;
187
260
  return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Main, { "aria-busy": isLoadingDetails, children: [
188
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { paddingBottom: 8, children: /* @__PURE__ */ jsxRuntime.jsx(
261
+ /* @__PURE__ */ jsxRuntime.jsx(
189
262
  designSystem.HeaderLayout,
190
263
  {
191
264
  title: release.name,
@@ -222,31 +295,22 @@ const ReleaseDetailsLayout = ({
222
295
  spacing: 4,
223
296
  minWidth: "242px",
224
297
  children: [
225
- /* @__PURE__ */ jsxRuntime.jsxs(
226
- designSystem.Flex,
227
- {
228
- alignItems: "center",
229
- justifyContent: "center",
230
- direction: "column",
231
- padding: 1,
232
- children: [
233
- /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.CheckPermissions, { permissions: index.PERMISSIONS.update, children: /* @__PURE__ */ jsxRuntime.jsxs(PopoverButton, { onClick: openReleaseModal, children: [
234
- /* @__PURE__ */ jsxRuntime.jsx(PencilIcon, {}),
235
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { ellipsis: true, children: formatMessage({
236
- id: "content-releases.header.actions.edit",
237
- defaultMessage: "Edit"
238
- }) })
239
- ] }) }),
240
- /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.CheckPermissions, { permissions: index.PERMISSIONS.delete, children: /* @__PURE__ */ jsxRuntime.jsxs(PopoverButton, { onClick: openWarningConfirmDialog, children: [
241
- /* @__PURE__ */ jsxRuntime.jsx(TrashIcon, {}),
242
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { ellipsis: true, textColor: "danger600", children: formatMessage({
243
- id: "content-releases.header.actions.delete",
244
- defaultMessage: "Delete"
245
- }) })
246
- ] }) })
247
- ]
248
- }
249
- ),
298
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { alignItems: "center", justifyContent: "center", direction: "column", padding: 1, children: [
299
+ /* @__PURE__ */ jsxRuntime.jsxs(PopoverButton, { disabled: !canUpdate, onClick: openReleaseModal, children: [
300
+ /* @__PURE__ */ jsxRuntime.jsx(PencilIcon, {}),
301
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { ellipsis: true, children: formatMessage({
302
+ id: "content-releases.header.actions.edit",
303
+ defaultMessage: "Edit"
304
+ }) })
305
+ ] }),
306
+ /* @__PURE__ */ jsxRuntime.jsxs(PopoverButton, { disabled: !canDelete, onClick: openWarningConfirmDialog, children: [
307
+ /* @__PURE__ */ jsxRuntime.jsx(TrashIcon, {}),
308
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { ellipsis: true, textColor: "danger600", children: formatMessage({
309
+ id: "content-releases.header.actions.delete",
310
+ defaultMessage: "Delete"
311
+ }) })
312
+ ] })
313
+ ] }),
250
314
  /* @__PURE__ */ jsxRuntime.jsxs(
251
315
  ReleaseInfoWrapper,
252
316
  {
@@ -276,10 +340,6 @@ const ReleaseDetailsLayout = ({
276
340
  ]
277
341
  }
278
342
  ),
279
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { size: "S", variant: "tertiary", children: formatMessage({
280
- id: "content-releases.header.actions.refresh",
281
- defaultMessage: "Refresh"
282
- }) }),
283
343
  /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.CheckPermissions, { permissions: index.PERMISSIONS.publish, children: /* @__PURE__ */ jsxRuntime.jsx(
284
344
  designSystem.Button,
285
345
  {
@@ -296,23 +356,50 @@ const ReleaseDetailsLayout = ({
296
356
  ) })
297
357
  ] })
298
358
  }
299
- ) }),
359
+ ),
300
360
  children
301
361
  ] });
302
362
  };
363
+ const GROUP_BY_OPTIONS = ["contentType", "locale", "action"];
364
+ const getGroupByOptionLabel = (value) => {
365
+ if (value === "locale") {
366
+ return {
367
+ id: "content-releases.pages.ReleaseDetails.groupBy.option.locales",
368
+ defaultMessage: "Locales"
369
+ };
370
+ }
371
+ if (value === "action") {
372
+ return {
373
+ id: "content-releases.pages.ReleaseDetails.groupBy.option.actions",
374
+ defaultMessage: "Actions"
375
+ };
376
+ }
377
+ return {
378
+ id: "content-releases.pages.ReleaseDetails.groupBy.option.content-type",
379
+ defaultMessage: "Content-Types"
380
+ };
381
+ };
303
382
  const ReleaseDetailsBody = () => {
304
383
  const { formatMessage } = reactIntl.useIntl();
305
384
  const { releaseId } = reactRouterDom.useParams();
306
- const [{ query }] = helperPlugin.useQueryParams();
385
+ const [{ query }, setQuery] = helperPlugin.useQueryParams();
307
386
  const toggleNotification = helperPlugin.useNotification();
308
387
  const { formatAPIError } = helperPlugin.useAPIErrorHandler();
309
388
  const {
310
389
  data: releaseData,
311
390
  isLoading: isReleaseLoading,
312
- isError: isReleaseError
391
+ isError: isReleaseError,
392
+ error: releaseError
313
393
  } = index.useGetReleaseQuery({ id: releaseId });
314
394
  const release = releaseData?.data;
315
- const { isLoading, isFetching, isError, data } = index.useGetReleaseActionsQuery({
395
+ const selectedGroupBy = query?.groupBy || "contentType";
396
+ const {
397
+ isLoading,
398
+ isFetching,
399
+ isError,
400
+ data,
401
+ error: releaseActionsError
402
+ } = index.useGetReleaseActionsQuery({
316
403
  ...query,
317
404
  releaseId
318
405
  });
@@ -344,107 +431,179 @@ const ReleaseDetailsBody = () => {
344
431
  if (isLoading || isReleaseLoading) {
345
432
  return /* @__PURE__ */ jsxRuntime.jsx(designSystem.ContentLayout, { children: /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.LoadingIndicatorPage, {}) });
346
433
  }
347
- if (isError || isReleaseError || !release) {
348
- return /* @__PURE__ */ jsxRuntime.jsx(designSystem.ContentLayout, { children: /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.AnErrorOccurred, {}) });
349
- }
350
434
  const releaseActions = data?.data;
351
435
  const releaseMeta = data?.meta;
352
- if (!releaseActions || !releaseActions.length) {
436
+ if (isError || isReleaseError || !release || !releaseActions) {
437
+ const errorsArray = [];
438
+ if (releaseError) {
439
+ errorsArray.push({
440
+ code: releaseError.code
441
+ });
442
+ }
443
+ if (releaseActionsError) {
444
+ errorsArray.push({
445
+ code: releaseActionsError.code
446
+ });
447
+ }
448
+ return /* @__PURE__ */ jsxRuntime.jsx(
449
+ reactRouterDom.Redirect,
450
+ {
451
+ to: {
452
+ pathname: "/plugins/content-releases",
453
+ state: {
454
+ errors: errorsArray
455
+ }
456
+ }
457
+ }
458
+ );
459
+ }
460
+ if (Object.keys(releaseActions).length === 0) {
353
461
  return /* @__PURE__ */ jsxRuntime.jsx(designSystem.ContentLayout, { children: /* @__PURE__ */ jsxRuntime.jsx(
354
- designSystem.EmptyStateLayout,
462
+ helperPlugin.NoContent,
355
463
  {
356
- content: formatMessage({
357
- id: "content-releases.pages.Details.empty-state.content",
358
- defaultMessage: "This release is empty."
359
- }),
360
- icon: /* @__PURE__ */ jsxRuntime.jsx(icons.EmptyDocuments, { width: "10rem" })
464
+ content: {
465
+ id: "content-releases.pages.Details.tab.emptyEntries",
466
+ defaultMessage: "This release is empty. Open the Content Manager, select an entry and add it to the release."
467
+ },
468
+ action: /* @__PURE__ */ jsxRuntime.jsx(
469
+ v2.LinkButton,
470
+ {
471
+ as: reactRouterDom.Link,
472
+ to: {
473
+ pathname: "/content-manager"
474
+ },
475
+ style: { textDecoration: "none" },
476
+ variant: "secondary",
477
+ children: formatMessage({
478
+ id: "content-releases.page.Details.button.openContentManager",
479
+ defaultMessage: "Open the Content Manager"
480
+ })
481
+ }
482
+ )
361
483
  }
362
484
  ) });
363
485
  }
364
- return /* @__PURE__ */ jsxRuntime.jsx(designSystem.ContentLayout, { children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 4, direction: "column", alignItems: "stretch", children: [
365
- /* @__PURE__ */ jsxRuntime.jsx(
366
- helperPlugin.Table.Root,
486
+ return /* @__PURE__ */ jsxRuntime.jsx(designSystem.ContentLayout, { children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 8, direction: "column", alignItems: "stretch", children: [
487
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { children: /* @__PURE__ */ jsxRuntime.jsx(
488
+ designSystem.SingleSelect,
367
489
  {
368
- rows: releaseActions.map((item) => ({
369
- ...item,
370
- id: Number(item.entry.id)
371
- })),
372
- colCount: releaseActions.length,
373
- isLoading,
374
- isFetching,
375
- children: /* @__PURE__ */ jsxRuntime.jsxs(helperPlugin.Table.Content, { children: [
376
- /* @__PURE__ */ jsxRuntime.jsxs(helperPlugin.Table.Head, { children: [
377
- /* @__PURE__ */ jsxRuntime.jsx(
378
- helperPlugin.Table.HeaderCell,
379
- {
380
- fieldSchemaType: "string",
381
- label: formatMessage({
382
- id: "content-releases.page.ReleaseDetails.table.header.label.name",
383
- defaultMessage: "name"
384
- }),
385
- name: "name"
386
- }
387
- ),
388
- /* @__PURE__ */ jsxRuntime.jsx(
389
- helperPlugin.Table.HeaderCell,
390
- {
391
- fieldSchemaType: "string",
392
- label: formatMessage({
393
- id: "content-releases.page.ReleaseDetails.table.header.label.locale",
394
- defaultMessage: "locale"
395
- }),
396
- name: "locale"
397
- }
398
- ),
399
- /* @__PURE__ */ jsxRuntime.jsx(
400
- helperPlugin.Table.HeaderCell,
401
- {
402
- fieldSchemaType: "string",
403
- label: formatMessage({
404
- id: "content-releases.page.ReleaseDetails.table.header.label.content-type",
405
- defaultMessage: "content-type"
406
- }),
407
- name: "content-type"
408
- }
409
- ),
410
- /* @__PURE__ */ jsxRuntime.jsx(
411
- helperPlugin.Table.HeaderCell,
412
- {
413
- fieldSchemaType: "string",
414
- label: formatMessage({
415
- id: "content-releases.page.ReleaseDetails.table.header.label.action",
416
- defaultMessage: "action"
417
- }),
418
- name: "action"
419
- }
420
- )
421
- ] }),
422
- /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.Table.LoadingBody, {}),
423
- /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.Table.Body, { children: releaseActions.map(({ id, type, entry }) => /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Tr, { children: [
424
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Td, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { children: `${entry.contentType.mainFieldValue || entry.id}` }) }),
425
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Td, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { children: `${entry?.locale?.name ? entry.locale.name : "-"}` }) }),
426
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Td, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { children: entry.contentType.displayName || "" }) }),
427
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Td, { children: release.releasedAt ? /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { children: formatMessage(
428
- {
429
- id: "content-releases.page.ReleaseDetails.table.action-published",
430
- defaultMessage: "This entry was <b>{isPublish, select, true {published} other {unpublished}}</b>."
431
- },
432
- {
433
- isPublish: type === "publish",
434
- b: (children) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { fontWeight: "bold", children })
435
- }
436
- ) }) : /* @__PURE__ */ jsxRuntime.jsx(
437
- index.ReleaseActionOptions,
438
- {
439
- selected: type,
440
- handleChange: (e) => handleChangeType(e, id),
441
- name: `release-action-${id}-type`
442
- }
443
- ) })
444
- ] }, id)) })
445
- ] })
490
+ "aria-label": formatMessage({
491
+ id: "content-releases.pages.ReleaseDetails.groupBy.label",
492
+ defaultMessage: "Group by"
493
+ }),
494
+ customizeContent: (value) => formatMessage(
495
+ {
496
+ id: `content-releases.pages.ReleaseDetails.groupBy.label`,
497
+ defaultMessage: `Group by {groupBy}`
498
+ },
499
+ {
500
+ groupBy: value
501
+ }
502
+ ),
503
+ value: formatMessage(getGroupByOptionLabel(selectedGroupBy)),
504
+ onChange: (value) => setQuery({ groupBy: value }),
505
+ children: GROUP_BY_OPTIONS.map((option) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: option, children: formatMessage(getGroupByOptionLabel(option)) }, option))
446
506
  }
447
- ),
507
+ ) }),
508
+ Object.keys(releaseActions).map((key) => /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 4, direction: "column", alignItems: "stretch", children: [
509
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Badge, { children: key }) }),
510
+ /* @__PURE__ */ jsxRuntime.jsx(
511
+ helperPlugin.Table.Root,
512
+ {
513
+ rows: releaseActions[key].map((item) => ({
514
+ ...item,
515
+ id: Number(item.entry.id)
516
+ })),
517
+ colCount: releaseActions[key].length,
518
+ isLoading,
519
+ isFetching,
520
+ children: /* @__PURE__ */ jsxRuntime.jsxs(helperPlugin.Table.Content, { children: [
521
+ /* @__PURE__ */ jsxRuntime.jsxs(helperPlugin.Table.Head, { children: [
522
+ /* @__PURE__ */ jsxRuntime.jsx(
523
+ helperPlugin.Table.HeaderCell,
524
+ {
525
+ fieldSchemaType: "string",
526
+ label: formatMessage({
527
+ id: "content-releases.page.ReleaseDetails.table.header.label.name",
528
+ defaultMessage: "name"
529
+ }),
530
+ name: "name"
531
+ }
532
+ ),
533
+ /* @__PURE__ */ jsxRuntime.jsx(
534
+ helperPlugin.Table.HeaderCell,
535
+ {
536
+ fieldSchemaType: "string",
537
+ label: formatMessage({
538
+ id: "content-releases.page.ReleaseDetails.table.header.label.locale",
539
+ defaultMessage: "locale"
540
+ }),
541
+ name: "locale"
542
+ }
543
+ ),
544
+ /* @__PURE__ */ jsxRuntime.jsx(
545
+ helperPlugin.Table.HeaderCell,
546
+ {
547
+ fieldSchemaType: "string",
548
+ label: formatMessage({
549
+ id: "content-releases.page.ReleaseDetails.table.header.label.content-type",
550
+ defaultMessage: "content-type"
551
+ }),
552
+ name: "content-type"
553
+ }
554
+ ),
555
+ /* @__PURE__ */ jsxRuntime.jsx(
556
+ helperPlugin.Table.HeaderCell,
557
+ {
558
+ fieldSchemaType: "string",
559
+ label: formatMessage({
560
+ id: "content-releases.page.ReleaseDetails.table.header.label.action",
561
+ defaultMessage: "action"
562
+ }),
563
+ name: "action"
564
+ }
565
+ ),
566
+ !release.releasedAt && /* @__PURE__ */ jsxRuntime.jsx(
567
+ helperPlugin.Table.HeaderCell,
568
+ {
569
+ fieldSchemaType: "string",
570
+ label: formatMessage({
571
+ id: "content-releases.page.ReleaseDetails.table.header.label.status",
572
+ defaultMessage: "status"
573
+ }),
574
+ name: "status"
575
+ }
576
+ )
577
+ ] }),
578
+ /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.Table.LoadingBody, {}),
579
+ /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.Table.Body, { children: releaseActions[key].map(({ id, type, entry }) => /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Tr, { children: [
580
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Td, { width: "25%", children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { ellipsis: true, children: `${entry.contentType.mainFieldValue || entry.id}` }) }),
581
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Td, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { children: `${entry?.locale?.name ? entry.locale.name : "-"}` }) }),
582
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Td, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { children: entry.contentType.displayName || "" }) }),
583
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Td, { children: release.releasedAt ? /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { children: formatMessage(
584
+ {
585
+ id: "content-releases.page.ReleaseDetails.table.action-published",
586
+ defaultMessage: "This entry was <b>{isPublish, select, true {published} other {unpublished}}</b>."
587
+ },
588
+ {
589
+ isPublish: type === "publish",
590
+ b: (children) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { fontWeight: "bold", children })
591
+ }
592
+ ) }) : /* @__PURE__ */ jsxRuntime.jsx(
593
+ index.ReleaseActionOptions,
594
+ {
595
+ selected: type,
596
+ handleChange: (e) => handleChangeType(e, id),
597
+ name: `release-action-${id}-type`
598
+ }
599
+ ) }),
600
+ !release.releasedAt && /* @__PURE__ */ jsxRuntime.jsx(designSystem.Td, { children: /* @__PURE__ */ jsxRuntime.jsx(EntryValidationText, { status: entry.status, action: type }) }),
601
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Td, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "flex-end", children: /* @__PURE__ */ jsxRuntime.jsx(index.ReleaseActionMenu, { releaseId, actionId: id }) }) })
602
+ ] }, id)) })
603
+ ] })
604
+ }
605
+ )
606
+ ] }, `releases-group-${key}`)),
448
607
  /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { paddingTop: 4, alignItems: "flex-end", justifyContent: "space-between", children: [
449
608
  /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.PageSizeURLQuery, { defaultValue: releaseMeta?.pagination?.pageSize.toString() }),
450
609
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -565,7 +724,6 @@ const ReleaseDetailsPage = () => {
565
724
  }
566
725
  );
567
726
  };
568
- const ProtectedReleaseDetailsPage = () => /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.CheckPermissions, { permissions: index.PERMISSIONS.main, children: /* @__PURE__ */ jsxRuntime.jsx(ReleaseDetailsPage, {}) });
569
727
  const ReleasesLayout = ({
570
728
  isLoading,
571
729
  totalReleases,
@@ -652,15 +810,32 @@ const INITIAL_FORM_VALUES = {
652
810
  name: ""
653
811
  };
654
812
  const ReleasesPage = () => {
813
+ const location = reactRouterDom.useLocation();
655
814
  const [releaseModalShown, setReleaseModalShown] = React__namespace.useState(false);
656
815
  const toggleNotification = helperPlugin.useNotification();
657
816
  const { formatMessage } = reactIntl.useIntl();
658
- const { push } = reactRouterDom.useHistory();
817
+ const { push, replace } = reactRouterDom.useHistory();
659
818
  const { formatAPIError } = helperPlugin.useAPIErrorHandler();
660
819
  const [{ query }, setQuery] = helperPlugin.useQueryParams();
661
820
  const response = index.useGetReleasesQuery(query);
662
821
  const [createRelease, { isLoading: isSubmittingForm }] = index.useCreateReleaseMutation();
663
822
  const { isLoading, isSuccess, isError } = response;
823
+ React__namespace.useEffect(() => {
824
+ if (location?.state?.errors) {
825
+ toggleNotification({
826
+ type: "warning",
827
+ title: formatMessage({
828
+ id: "content-releases.pages.Releases.notification.error.title",
829
+ defaultMessage: "Your request could not be processed."
830
+ }),
831
+ message: formatMessage({
832
+ id: "content-releases.pages.Releases.notification.error.message",
833
+ defaultMessage: "Please try again or open another release."
834
+ })
835
+ });
836
+ replace({ state: null });
837
+ }
838
+ }, [formatMessage, location?.state?.errors, replace, toggleNotification]);
664
839
  const toggleAddReleaseModal = () => {
665
840
  setReleaseModalShown((prev) => !prev);
666
841
  };
@@ -719,16 +894,19 @@ const ReleasesPage = () => {
719
894
  initialSelectedTabIndex: ["pending", "done"].indexOf(activeTab),
720
895
  onTabChange: handleTabChange,
721
896
  children: [
722
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { paddingBottom: 8, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Tabs, { children: [
723
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Tab, { children: formatMessage({
724
- id: "content-releases.pages.Releases.tab.pending",
725
- defaultMessage: "Pending"
726
- }) }),
727
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Tab, { children: formatMessage({
728
- id: "content-releases.pages.Releases.tab.done",
729
- defaultMessage: "Done"
730
- }) })
731
- ] }) }),
897
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Box, { paddingBottom: 8, children: [
898
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Tabs, { children: [
899
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Tab, { children: formatMessage({
900
+ id: "content-releases.pages.Releases.tab.pending",
901
+ defaultMessage: "Pending"
902
+ }) }),
903
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Tab, { children: formatMessage({
904
+ id: "content-releases.pages.Releases.tab.done",
905
+ defaultMessage: "Done"
906
+ }) })
907
+ ] }),
908
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Divider, {})
909
+ ] }),
732
910
  /* @__PURE__ */ jsxRuntime.jsxs(designSystem.TabPanels, { children: [
733
911
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.TabPanel, { children: /* @__PURE__ */ jsxRuntime.jsx(
734
912
  ReleasesGrid,
@@ -779,19 +957,11 @@ const ReleasesPage = () => {
779
957
  )
780
958
  ] });
781
959
  };
782
- const ProtectedReleasesPage = () => /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.CheckPermissions, { permissions: index.PERMISSIONS.main, children: /* @__PURE__ */ jsxRuntime.jsx(ReleasesPage, {}) });
783
960
  const App = () => {
784
- return /* @__PURE__ */ jsxRuntime.jsxs(reactRouterDom.Switch, { children: [
785
- /* @__PURE__ */ jsxRuntime.jsx(reactRouterDom.Route, { exact: true, path: `/plugins/${index.pluginId}`, component: ProtectedReleasesPage }),
786
- /* @__PURE__ */ jsxRuntime.jsx(
787
- reactRouterDom.Route,
788
- {
789
- exact: true,
790
- path: `/plugins/${index.pluginId}/:releaseId`,
791
- component: ProtectedReleaseDetailsPage
792
- }
793
- )
794
- ] });
961
+ return /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.CheckPagePermissions, { permissions: index.PERMISSIONS.main, children: /* @__PURE__ */ jsxRuntime.jsxs(reactRouterDom.Switch, { children: [
962
+ /* @__PURE__ */ jsxRuntime.jsx(reactRouterDom.Route, { exact: true, path: `/plugins/${index.pluginId}`, component: ReleasesPage }),
963
+ /* @__PURE__ */ jsxRuntime.jsx(reactRouterDom.Route, { exact: true, path: `/plugins/${index.pluginId}/:releaseId`, component: ReleaseDetailsPage })
964
+ ] }) });
795
965
  };
796
966
  exports.App = App;
797
- //# sourceMappingURL=App-b6df6b60.js.map
967
+ //# sourceMappingURL=App-o5_WfqR-.js.map