@strapi/content-releases 4.16.1 → 4.17.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 (85) hide show
  1. package/dist/_chunks/{App-b83f4a97.mjs → App-a4843fda.mjs} +143 -63
  2. package/dist/_chunks/App-a4843fda.mjs.map +1 -0
  3. package/dist/_chunks/{App-b6df6b60.js → App-f2cafd81.js} +138 -58
  4. package/dist/_chunks/App-f2cafd81.js.map +1 -0
  5. package/dist/_chunks/{en-b5dfabe6.js → en-13576ce2.js} +8 -2
  6. package/dist/_chunks/en-13576ce2.js.map +1 -0
  7. package/dist/_chunks/{en-d837b82d.mjs → en-e98d8b57.mjs} +8 -2
  8. package/dist/_chunks/en-e98d8b57.mjs.map +1 -0
  9. package/dist/_chunks/{index-28e99164.js → index-66d129ac.js} +66 -12
  10. package/dist/_chunks/index-66d129ac.js.map +1 -0
  11. package/dist/_chunks/{index-c39292e3.mjs → index-937f8179.mjs} +68 -14
  12. package/dist/_chunks/index-937f8179.mjs.map +1 -0
  13. package/dist/admin/index.js +2 -2
  14. package/dist/admin/index.mjs +2 -2
  15. package/dist/server/index.js.map +1 -1
  16. package/dist/server/index.mjs.map +1 -1
  17. package/package.json +10 -10
  18. package/dist/_chunks/App-b6df6b60.js.map +0 -1
  19. package/dist/_chunks/App-b83f4a97.mjs.map +0 -1
  20. package/dist/_chunks/en-b5dfabe6.js.map +0 -1
  21. package/dist/_chunks/en-d837b82d.mjs.map +0 -1
  22. package/dist/_chunks/index-28e99164.js.map +0 -1
  23. package/dist/_chunks/index-c39292e3.mjs.map +0 -1
  24. package/dist/admin/src/components/CMReleasesContainer.d.ts +0 -1
  25. package/dist/admin/src/components/ReleaseActionMenu.d.ts +0 -7
  26. package/dist/admin/src/components/ReleaseActionOptions.d.ts +0 -8
  27. package/dist/admin/src/components/ReleaseModal.d.ts +0 -11
  28. package/dist/admin/src/constants.d.ts +0 -13
  29. package/dist/admin/src/index.d.ts +0 -3
  30. package/dist/admin/src/pages/App.d.ts +0 -1
  31. package/dist/admin/src/pages/ReleaseDetailsPage.d.ts +0 -10
  32. package/dist/admin/src/pages/ReleasesPage.d.ts +0 -11
  33. package/dist/admin/src/pages/tests/mockReleaseDetailsPageData.d.ts +0 -104
  34. package/dist/admin/src/pages/tests/mockReleasesPageData.d.ts +0 -38
  35. package/dist/admin/src/pluginId.d.ts +0 -1
  36. package/dist/admin/src/services/axios.d.ts +0 -29
  37. package/dist/admin/src/services/release.d.ts +0 -348
  38. package/dist/server/src/constants.d.ts +0 -9
  39. package/dist/server/src/constants.d.ts.map +0 -1
  40. package/dist/server/src/content-types/index.d.ts +0 -82
  41. package/dist/server/src/content-types/index.d.ts.map +0 -1
  42. package/dist/server/src/content-types/release/index.d.ts +0 -37
  43. package/dist/server/src/content-types/release/index.d.ts.map +0 -1
  44. package/dist/server/src/content-types/release/schema.d.ts +0 -36
  45. package/dist/server/src/content-types/release/schema.d.ts.map +0 -1
  46. package/dist/server/src/content-types/release-action/index.d.ts +0 -44
  47. package/dist/server/src/content-types/release-action/index.d.ts.map +0 -1
  48. package/dist/server/src/content-types/release-action/schema.d.ts +0 -43
  49. package/dist/server/src/content-types/release-action/schema.d.ts.map +0 -1
  50. package/dist/server/src/controllers/index.d.ts +0 -18
  51. package/dist/server/src/controllers/index.d.ts.map +0 -1
  52. package/dist/server/src/controllers/release-action.d.ts +0 -9
  53. package/dist/server/src/controllers/release-action.d.ts.map +0 -1
  54. package/dist/server/src/controllers/release.d.ts +0 -11
  55. package/dist/server/src/controllers/release.d.ts.map +0 -1
  56. package/dist/server/src/controllers/validation/release-action.d.ts +0 -3
  57. package/dist/server/src/controllers/validation/release-action.d.ts.map +0 -1
  58. package/dist/server/src/controllers/validation/release.d.ts +0 -2
  59. package/dist/server/src/controllers/validation/release.d.ts.map +0 -1
  60. package/dist/server/src/index.d.ts +0 -301
  61. package/dist/server/src/index.d.ts.map +0 -1
  62. package/dist/server/src/register.d.ts +0 -5
  63. package/dist/server/src/register.d.ts.map +0 -1
  64. package/dist/server/src/routes/index.d.ts +0 -35
  65. package/dist/server/src/routes/index.d.ts.map +0 -1
  66. package/dist/server/src/routes/release-action.d.ts +0 -18
  67. package/dist/server/src/routes/release-action.d.ts.map +0 -1
  68. package/dist/server/src/routes/release.d.ts +0 -18
  69. package/dist/server/src/routes/release.d.ts.map +0 -1
  70. package/dist/server/src/services/index.d.ts +0 -77
  71. package/dist/server/src/services/index.d.ts.map +0 -1
  72. package/dist/server/src/services/release.d.ts +0 -55
  73. package/dist/server/src/services/release.d.ts.map +0 -1
  74. package/dist/server/src/services/validation.d.ts +0 -10
  75. package/dist/server/src/services/validation.d.ts.map +0 -1
  76. package/dist/server/src/utils/index.d.ts +0 -4
  77. package/dist/server/src/utils/index.d.ts.map +0 -1
  78. package/dist/shared/contracts/release-actions.d.ts +0 -95
  79. package/dist/shared/contracts/release-actions.d.ts.map +0 -1
  80. package/dist/shared/contracts/releases.d.ts +0 -153
  81. package/dist/shared/contracts/releases.d.ts.map +0 -1
  82. package/dist/shared/types.d.ts +0 -24
  83. package/dist/shared/types.d.ts.map +0 -1
  84. package/dist/shared/validation-schemas.d.ts +0 -2
  85. package/dist/shared/validation-schemas.d.ts.map +0 -1
@@ -2,16 +2,16 @@
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
4
  const reactRouterDom = require("react-router-dom");
5
- const index = require("./index-28e99164.js");
5
+ const index = require("./index-66d129ac.js");
6
6
  const React = require("react");
7
7
  const designSystem = require("@strapi/design-system");
8
+ const v2 = require("@strapi/design-system/v2");
8
9
  const helperPlugin = require("@strapi/helper-plugin");
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");
@@ -97,6 +97,14 @@ const ReleaseInfoWrapper = styled__default.default(designSystem.Flex)`
97
97
  `;
98
98
  const StyledFlex = styled__default.default(designSystem.Flex)`
99
99
  align-self: stretch;
100
+ cursor: ${({ disabled }) => disabled ? "not-allowed" : "pointer"};
101
+
102
+ svg path {
103
+ fill: ${({ theme, disabled }) => disabled && theme.colors.neutral500};
104
+ }
105
+ span {
106
+ color: ${({ theme, disabled }) => disabled && theme.colors.neutral500};
107
+ }
100
108
  `;
101
109
  const PencilIcon = styled__default.default(icons.Pencil)`
102
110
  width: ${({ theme }) => theme.spaces[4]};
@@ -112,7 +120,7 @@ const TrashIcon = styled__default.default(icons.Trash)`
112
120
  fill: ${({ theme }) => theme.colors.danger600};
113
121
  }
114
122
  `;
115
- const PopoverButton = ({ onClick, children }) => {
123
+ const PopoverButton = ({ onClick, disabled, children }) => {
116
124
  return /* @__PURE__ */ jsxRuntime.jsx(
117
125
  StyledFlex,
118
126
  {
@@ -125,6 +133,7 @@ const PopoverButton = ({ onClick, children }) => {
125
133
  as: "button",
126
134
  hasRadius: true,
127
135
  onClick,
136
+ disabled,
128
137
  children
129
138
  }
130
139
  );
@@ -138,10 +147,18 @@ const ReleaseDetailsLayout = ({
138
147
  const { releaseId } = reactRouterDom.useParams();
139
148
  const [isPopoverVisible, setIsPopoverVisible] = React__namespace.useState(false);
140
149
  const moreButtonRef = React__namespace.useRef(null);
141
- const { data, isLoading: isLoadingDetails, isError } = index.useGetReleaseQuery({ id: releaseId });
150
+ const {
151
+ data,
152
+ isLoading: isLoadingDetails,
153
+ isError,
154
+ error
155
+ } = index.useGetReleaseQuery({ id: releaseId });
142
156
  const [publishRelease, { isLoading: isPublishing }] = index.usePublishReleaseMutation();
143
157
  const toggleNotification = helperPlugin.useNotification();
144
158
  const { formatAPIError } = helperPlugin.useAPIErrorHandler();
159
+ const {
160
+ allowedActions: { canUpdate, canDelete }
161
+ } = helperPlugin.useRBAC(index.PERMISSIONS);
145
162
  const release = data?.data;
146
163
  const handleTogglePopover = () => {
147
164
  setIsPopoverVisible((prev) => !prev);
@@ -177,15 +194,29 @@ const ReleaseDetailsLayout = ({
177
194
  handleTogglePopover();
178
195
  };
179
196
  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, {}) }) });
197
+ return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Main, { "aria-busy": isLoadingDetails, children: /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.LoadingIndicatorPage, {}) });
181
198
  }
182
199
  if (isError || !release) {
183
- return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Main, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { paddingBottom: 8, children: /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.AnErrorOccurred, {}) }) });
200
+ return /* @__PURE__ */ jsxRuntime.jsx(
201
+ reactRouterDom.Redirect,
202
+ {
203
+ to: {
204
+ pathname: "/plugins/content-releases",
205
+ state: {
206
+ errors: [
207
+ {
208
+ code: error?.code
209
+ }
210
+ ]
211
+ }
212
+ }
213
+ }
214
+ );
184
215
  }
185
216
  const totalEntries = release.actions.meta.count || 0;
186
217
  const createdBy = `${release.createdBy.firstname} ${release.createdBy.lastname}`;
187
218
  return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Main, { "aria-busy": isLoadingDetails, children: [
188
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { paddingBottom: 8, children: /* @__PURE__ */ jsxRuntime.jsx(
219
+ /* @__PURE__ */ jsxRuntime.jsx(
189
220
  designSystem.HeaderLayout,
190
221
  {
191
222
  title: release.name,
@@ -222,31 +253,22 @@ const ReleaseDetailsLayout = ({
222
253
  spacing: 4,
223
254
  minWidth: "242px",
224
255
  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
- ),
256
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { alignItems: "center", justifyContent: "center", direction: "column", padding: 1, children: [
257
+ /* @__PURE__ */ jsxRuntime.jsxs(PopoverButton, { disabled: !canUpdate, onClick: openReleaseModal, children: [
258
+ /* @__PURE__ */ jsxRuntime.jsx(PencilIcon, {}),
259
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { ellipsis: true, children: formatMessage({
260
+ id: "content-releases.header.actions.edit",
261
+ defaultMessage: "Edit"
262
+ }) })
263
+ ] }),
264
+ /* @__PURE__ */ jsxRuntime.jsxs(PopoverButton, { disabled: !canDelete, onClick: openWarningConfirmDialog, children: [
265
+ /* @__PURE__ */ jsxRuntime.jsx(TrashIcon, {}),
266
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { ellipsis: true, textColor: "danger600", children: formatMessage({
267
+ id: "content-releases.header.actions.delete",
268
+ defaultMessage: "Delete"
269
+ }) })
270
+ ] })
271
+ ] }),
250
272
  /* @__PURE__ */ jsxRuntime.jsxs(
251
273
  ReleaseInfoWrapper,
252
274
  {
@@ -276,10 +298,6 @@ const ReleaseDetailsLayout = ({
276
298
  ]
277
299
  }
278
300
  ),
279
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { size: "S", variant: "tertiary", children: formatMessage({
280
- id: "content-releases.header.actions.refresh",
281
- defaultMessage: "Refresh"
282
- }) }),
283
301
  /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.CheckPermissions, { permissions: index.PERMISSIONS.publish, children: /* @__PURE__ */ jsxRuntime.jsx(
284
302
  designSystem.Button,
285
303
  {
@@ -296,7 +314,7 @@ const ReleaseDetailsLayout = ({
296
314
  ) })
297
315
  ] })
298
316
  }
299
- ) }),
317
+ ),
300
318
  children
301
319
  ] });
302
320
  };
@@ -309,10 +327,17 @@ const ReleaseDetailsBody = () => {
309
327
  const {
310
328
  data: releaseData,
311
329
  isLoading: isReleaseLoading,
312
- isError: isReleaseError
330
+ isError: isReleaseError,
331
+ error: releaseError
313
332
  } = index.useGetReleaseQuery({ id: releaseId });
314
333
  const release = releaseData?.data;
315
- const { isLoading, isFetching, isError, data } = index.useGetReleaseActionsQuery({
334
+ const {
335
+ isLoading,
336
+ isFetching,
337
+ isError,
338
+ data,
339
+ error: releaseActionsError
340
+ } = index.useGetReleaseActionsQuery({
316
341
  ...query,
317
342
  releaseId
318
343
  });
@@ -345,19 +370,54 @@ const ReleaseDetailsBody = () => {
345
370
  return /* @__PURE__ */ jsxRuntime.jsx(designSystem.ContentLayout, { children: /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.LoadingIndicatorPage, {}) });
346
371
  }
347
372
  if (isError || isReleaseError || !release) {
348
- return /* @__PURE__ */ jsxRuntime.jsx(designSystem.ContentLayout, { children: /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.AnErrorOccurred, {}) });
373
+ const errorsArray = [];
374
+ if (releaseError) {
375
+ errorsArray.push({
376
+ code: releaseError.code
377
+ });
378
+ }
379
+ if (releaseActionsError) {
380
+ errorsArray.push({
381
+ code: releaseActionsError.code
382
+ });
383
+ }
384
+ return /* @__PURE__ */ jsxRuntime.jsx(
385
+ reactRouterDom.Redirect,
386
+ {
387
+ to: {
388
+ pathname: "/plugins/content-releases",
389
+ state: {
390
+ errors: errorsArray
391
+ }
392
+ }
393
+ }
394
+ );
349
395
  }
350
396
  const releaseActions = data?.data;
351
397
  const releaseMeta = data?.meta;
352
398
  if (!releaseActions || !releaseActions.length) {
353
399
  return /* @__PURE__ */ jsxRuntime.jsx(designSystem.ContentLayout, { children: /* @__PURE__ */ jsxRuntime.jsx(
354
- designSystem.EmptyStateLayout,
400
+ helperPlugin.NoContent,
355
401
  {
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" })
402
+ content: {
403
+ id: "content-releases.pages.Details.tab.emptyEntries",
404
+ defaultMessage: "This release is empty. Open the Content Manager, select an entry and add it to the release."
405
+ },
406
+ action: /* @__PURE__ */ jsxRuntime.jsx(
407
+ v2.LinkButton,
408
+ {
409
+ as: reactRouterDom.Link,
410
+ to: {
411
+ pathname: "/content-manager"
412
+ },
413
+ style: { textDecoration: "none" },
414
+ variant: "secondary",
415
+ children: formatMessage({
416
+ id: "content-releases.page.Details.button.openContentManager",
417
+ defaultMessage: "Open the Content Manager"
418
+ })
419
+ }
420
+ )
361
421
  }
362
422
  ) });
363
423
  }
@@ -652,15 +712,32 @@ const INITIAL_FORM_VALUES = {
652
712
  name: ""
653
713
  };
654
714
  const ReleasesPage = () => {
715
+ const location = reactRouterDom.useLocation();
655
716
  const [releaseModalShown, setReleaseModalShown] = React__namespace.useState(false);
656
717
  const toggleNotification = helperPlugin.useNotification();
657
718
  const { formatMessage } = reactIntl.useIntl();
658
- const { push } = reactRouterDom.useHistory();
719
+ const { push, replace } = reactRouterDom.useHistory();
659
720
  const { formatAPIError } = helperPlugin.useAPIErrorHandler();
660
721
  const [{ query }, setQuery] = helperPlugin.useQueryParams();
661
722
  const response = index.useGetReleasesQuery(query);
662
723
  const [createRelease, { isLoading: isSubmittingForm }] = index.useCreateReleaseMutation();
663
724
  const { isLoading, isSuccess, isError } = response;
725
+ React__namespace.useEffect(() => {
726
+ if (location?.state?.errors) {
727
+ toggleNotification({
728
+ type: "warning",
729
+ title: formatMessage({
730
+ id: "content-releases.pages.Releases.notification.error.title",
731
+ defaultMessage: "Your request could not be processed."
732
+ }),
733
+ message: formatMessage({
734
+ id: "content-releases.pages.Releases.notification.error.message",
735
+ defaultMessage: "Please try again or open another release."
736
+ })
737
+ });
738
+ replace({ state: null });
739
+ }
740
+ }, [formatMessage, location?.state?.errors, replace, toggleNotification]);
664
741
  const toggleAddReleaseModal = () => {
665
742
  setReleaseModalShown((prev) => !prev);
666
743
  };
@@ -719,16 +796,19 @@ const ReleasesPage = () => {
719
796
  initialSelectedTabIndex: ["pending", "done"].indexOf(activeTab),
720
797
  onTabChange: handleTabChange,
721
798
  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
- ] }) }),
799
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Box, { paddingBottom: 8, children: [
800
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Tabs, { children: [
801
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Tab, { children: formatMessage({
802
+ id: "content-releases.pages.Releases.tab.pending",
803
+ defaultMessage: "Pending"
804
+ }) }),
805
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Tab, { children: formatMessage({
806
+ id: "content-releases.pages.Releases.tab.done",
807
+ defaultMessage: "Done"
808
+ }) })
809
+ ] }),
810
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Divider, {})
811
+ ] }),
732
812
  /* @__PURE__ */ jsxRuntime.jsxs(designSystem.TabPanels, { children: [
733
813
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.TabPanel, { children: /* @__PURE__ */ jsxRuntime.jsx(
734
814
  ReleasesGrid,
@@ -794,4 +874,4 @@ const App = () => {
794
874
  ] });
795
875
  };
796
876
  exports.App = App;
797
- //# sourceMappingURL=App-b6df6b60.js.map
877
+ //# sourceMappingURL=App-f2cafd81.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"App-f2cafd81.js","sources":["../../shared/validation-schemas.ts","../../admin/src/components/ReleaseModal.tsx","../../admin/src/pages/ReleaseDetailsPage.tsx","../../admin/src/pages/ReleasesPage.tsx","../../admin/src/pages/App.tsx"],"sourcesContent":["import * as yup from 'yup';\n\nexport const RELEASE_SCHEMA = yup\n .object()\n .shape({\n name: yup.string().trim().required(),\n })\n .required()\n .noUnknown();\n","import {\n Button,\n ModalBody,\n ModalFooter,\n ModalLayout,\n ModalHeader,\n TextInput,\n Typography,\n} from '@strapi/design-system';\nimport { Formik, Form } from 'formik';\nimport { useIntl } from 'react-intl';\n\nimport { RELEASE_SCHEMA } from '../../../shared/validation-schemas';\n\nexport interface FormValues {\n name: string;\n}\n\ninterface ReleaseModalProps {\n handleClose: () => void;\n handleSubmit: (values: FormValues) => void;\n isLoading?: boolean;\n initialValues: FormValues;\n}\n\nexport const ReleaseModal = ({\n handleClose,\n handleSubmit,\n initialValues,\n isLoading = false,\n}: ReleaseModalProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <ModalLayout onClose={handleClose} labelledBy=\"title\">\n <ModalHeader>\n <Typography id=\"title\" fontWeight=\"bold\" textColor=\"neutral800\">\n {formatMessage({\n id: 'content-releases.modal.add-release-title',\n defaultMessage: 'New release',\n })}\n </Typography>\n </ModalHeader>\n <Formik\n validateOnChange={false}\n onSubmit={handleSubmit}\n initialValues={initialValues}\n validationSchema={RELEASE_SCHEMA}\n >\n {({ values, errors, handleChange }) => (\n <Form>\n <ModalBody>\n <TextInput\n label={formatMessage({\n id: 'content-releases.modal.form.input.label.release-name',\n defaultMessage: 'Name',\n })}\n name=\"name\"\n value={values.name}\n error={errors.name}\n onChange={handleChange}\n required\n />\n </ModalBody>\n <ModalFooter\n startActions={\n <Button onClick={handleClose} variant=\"tertiary\" name=\"cancel\">\n {formatMessage({ id: 'cancel', defaultMessage: 'Cancel' })}\n </Button>\n }\n endActions={\n <Button name=\"submit\" loading={isLoading} disabled={!values.name} type=\"submit\">\n {formatMessage({\n id: 'content-releases.modal.form.button.submit',\n defaultMessage: 'Continue',\n })}\n </Button>\n }\n />\n </Form>\n )}\n </Formik>\n </ModalLayout>\n );\n};\n","import * as React from 'react';\n\nimport {\n Button,\n ContentLayout,\n Flex,\n HeaderLayout,\n IconButton,\n Link,\n Main,\n Popover,\n Tr,\n Td,\n Typography,\n} from '@strapi/design-system';\nimport { LinkButton } from '@strapi/design-system/v2';\nimport {\n CheckPermissions,\n LoadingIndicatorPage,\n NoContent,\n PageSizeURLQuery,\n PaginationURLQuery,\n RelativeTime,\n Table,\n useAPIErrorHandler,\n useNotification,\n useQueryParams,\n ConfirmDialog,\n useRBAC,\n} from '@strapi/helper-plugin';\nimport { ArrowLeft, More, Pencil, Trash } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { useParams, useHistory, Link as ReactRouterLink, Redirect } from 'react-router-dom';\nimport styled from 'styled-components';\n\nimport { ReleaseActionOptions } from '../components/ReleaseActionOptions';\nimport { ReleaseModal, FormValues } from '../components/ReleaseModal';\nimport { PERMISSIONS } from '../constants';\nimport { isAxiosError } from '../services/axios';\nimport {\n GetReleaseActionsQueryParams,\n useGetReleaseActionsQuery,\n useGetReleaseQuery,\n useUpdateReleaseMutation,\n useUpdateReleaseActionMutation,\n usePublishReleaseMutation,\n useDeleteReleaseMutation,\n} from '../services/release';\n\nimport type { ReleaseAction } from '../../../shared/contracts/release-actions';\n\n/* -------------------------------------------------------------------------------------------------\n * ReleaseDetailsLayout\n * -----------------------------------------------------------------------------------------------*/\n// @ts-expect-error – issue with styled-components types.\nconst ReleaseInfoWrapper = styled(Flex)`\n align-self: stretch;\n border-bottom-right-radius: ${({ theme }) => theme.borderRadius};\n border-bottom-left-radius: ${({ theme }) => theme.borderRadius};\n border-top: 1px solid ${({ theme }) => theme.colors.neutral150};\n`;\n\nconst StyledFlex = styled(Flex)<{ disabled?: boolean }>`\n align-self: stretch;\n cursor: ${({ disabled }) => (disabled ? 'not-allowed' : 'pointer')};\n\n svg path {\n fill: ${({ theme, disabled }) => disabled && theme.colors.neutral500};\n }\n span {\n color: ${({ theme, disabled }) => disabled && theme.colors.neutral500};\n }\n`;\n\nconst PencilIcon = styled(Pencil)`\n width: ${({ theme }) => theme.spaces[4]};\n height: ${({ theme }) => theme.spaces[4]};\n path {\n fill: ${({ theme }) => theme.colors.neutral600};\n }\n`;\n\nconst TrashIcon = styled(Trash)`\n width: ${({ theme }) => theme.spaces[4]};\n height: ${({ theme }) => theme.spaces[4]};\n path {\n fill: ${({ theme }) => theme.colors.danger600};\n }\n`;\n\ninterface PopoverButtonProps {\n onClick?: (event: React.MouseEvent<HTMLElement>) => void;\n disabled?: boolean;\n children: React.ReactNode;\n}\n\nconst PopoverButton = ({ onClick, disabled, children }: PopoverButtonProps) => {\n return (\n <StyledFlex\n paddingTop={2}\n paddingBottom={2}\n paddingLeft={4}\n paddingRight={4}\n alignItems=\"center\"\n gap={2}\n as=\"button\"\n hasRadius\n onClick={onClick}\n disabled={disabled}\n >\n {children}\n </StyledFlex>\n );\n};\n\ninterface ReleaseDetailsLayoutProps {\n toggleEditReleaseModal: () => void;\n toggleWarningSubmit: () => void;\n children: React.ReactNode;\n}\n\nexport const ReleaseDetailsLayout = ({\n toggleEditReleaseModal,\n toggleWarningSubmit,\n children,\n}: ReleaseDetailsLayoutProps) => {\n const { formatMessage } = useIntl();\n const { releaseId } = useParams<{ releaseId: string }>();\n const [isPopoverVisible, setIsPopoverVisible] = React.useState(false);\n const moreButtonRef = React.useRef<HTMLButtonElement>(null!);\n const {\n data,\n isLoading: isLoadingDetails,\n isError,\n error,\n } = useGetReleaseQuery({ id: releaseId });\n const [publishRelease, { isLoading: isPublishing }] = usePublishReleaseMutation();\n const toggleNotification = useNotification();\n const { formatAPIError } = useAPIErrorHandler();\n const {\n allowedActions: { canUpdate, canDelete },\n } = useRBAC(PERMISSIONS);\n\n const release = data?.data;\n\n const handleTogglePopover = () => {\n setIsPopoverVisible((prev) => !prev);\n };\n\n const openReleaseModal = () => {\n toggleEditReleaseModal();\n handleTogglePopover();\n };\n\n const handlePublishRelease = async () => {\n const response = await publishRelease({ id: releaseId });\n\n if ('data' in response) {\n // When the response returns an object with 'data', handle success\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: 'content-releases.pages.ReleaseDetails.publish-notification-success',\n defaultMessage: 'Release was published successfully.',\n }),\n });\n } else if (isAxiosError(response.error)) {\n // When the response returns an object with 'error', handle axios error\n toggleNotification({\n type: 'warning',\n message: formatAPIError(response.error),\n });\n } else {\n // Otherwise, the response returns an object with 'error', handle a generic error\n toggleNotification({\n type: 'warning',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n };\n\n const openWarningConfirmDialog = () => {\n toggleWarningSubmit();\n handleTogglePopover();\n };\n\n if (isLoadingDetails) {\n return (\n <Main aria-busy={isLoadingDetails}>\n <LoadingIndicatorPage />\n </Main>\n );\n }\n\n if (isError || !release) {\n return (\n <Redirect\n to={{\n pathname: '/plugins/content-releases',\n state: {\n errors: [\n {\n code: error?.code,\n },\n ],\n },\n }}\n />\n );\n }\n\n const totalEntries = release.actions.meta.count || 0;\n const createdBy = `${release.createdBy.firstname} ${release.createdBy.lastname}`;\n\n return (\n <Main aria-busy={isLoadingDetails}>\n <HeaderLayout\n title={release.name}\n subtitle={formatMessage(\n {\n id: 'content-releases.pages.Details.header-subtitle',\n defaultMessage: '{number, plural, =0 {No entries} one {# entry} other {# entries}}',\n },\n { number: totalEntries }\n )}\n navigationAction={\n <Link startIcon={<ArrowLeft />} to=\"/plugins/content-releases\">\n {formatMessage({\n id: 'global.back',\n defaultMessage: 'Back',\n })}\n </Link>\n }\n primaryAction={\n !release.releasedAt && (\n <Flex gap={2}>\n <IconButton\n label={formatMessage({\n id: 'content-releases.header.actions.open-release-actions',\n defaultMessage: 'Release actions',\n })}\n ref={moreButtonRef}\n onClick={handleTogglePopover}\n >\n <More />\n </IconButton>\n {isPopoverVisible && (\n <Popover\n source={moreButtonRef}\n placement=\"bottom-end\"\n onDismiss={handleTogglePopover}\n spacing={4}\n minWidth=\"242px\"\n >\n <Flex alignItems=\"center\" justifyContent=\"center\" direction=\"column\" padding={1}>\n <PopoverButton disabled={!canUpdate} onClick={openReleaseModal}>\n <PencilIcon />\n <Typography ellipsis>\n {formatMessage({\n id: 'content-releases.header.actions.edit',\n defaultMessage: 'Edit',\n })}\n </Typography>\n </PopoverButton>\n <PopoverButton disabled={!canDelete} onClick={openWarningConfirmDialog}>\n <TrashIcon />\n <Typography ellipsis textColor=\"danger600\">\n {formatMessage({\n id: 'content-releases.header.actions.delete',\n defaultMessage: 'Delete',\n })}\n </Typography>\n </PopoverButton>\n </Flex>\n <ReleaseInfoWrapper\n direction=\"column\"\n justifyContent=\"center\"\n alignItems=\"flex-start\"\n gap={1}\n padding={5}\n >\n <Typography variant=\"pi\" fontWeight=\"bold\">\n {formatMessage({\n id: 'content-releases.header.actions.created',\n defaultMessage: 'Created',\n })}\n </Typography>\n <Typography variant=\"pi\" color=\"neutral300\">\n <RelativeTime timestamp={new Date(release.createdAt)} />\n {formatMessage(\n {\n id: 'content-releases.header.actions.created.description',\n defaultMessage: ' by {createdBy}',\n },\n { createdBy }\n )}\n </Typography>\n </ReleaseInfoWrapper>\n </Popover>\n )}\n <CheckPermissions permissions={PERMISSIONS.publish}>\n <Button\n size=\"S\"\n variant=\"default\"\n onClick={handlePublishRelease}\n loading={isPublishing}\n disabled={release.actions.meta.count === 0}\n >\n {formatMessage({\n id: 'content-releases.header.actions.publish',\n defaultMessage: 'Publish',\n })}\n </Button>\n </CheckPermissions>\n </Flex>\n )\n }\n />\n {children}\n </Main>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ReleaseDetailsBody\n * -----------------------------------------------------------------------------------------------*/\nconst ReleaseDetailsBody = () => {\n const { formatMessage } = useIntl();\n const { releaseId } = useParams<{ releaseId: string }>();\n const [{ query }] = useQueryParams<GetReleaseActionsQueryParams>();\n const toggleNotification = useNotification();\n const { formatAPIError } = useAPIErrorHandler();\n const {\n data: releaseData,\n isLoading: isReleaseLoading,\n isError: isReleaseError,\n error: releaseError,\n } = useGetReleaseQuery({ id: releaseId });\n const release = releaseData?.data;\n\n const {\n isLoading,\n isFetching,\n isError,\n data,\n error: releaseActionsError,\n } = useGetReleaseActionsQuery({\n ...query,\n releaseId,\n });\n\n const [updateReleaseAction] = useUpdateReleaseActionMutation();\n\n const handleChangeType = async (\n e: React.ChangeEvent<HTMLInputElement>,\n actionId: ReleaseAction['id']\n ) => {\n const response = await updateReleaseAction({\n params: {\n releaseId,\n actionId,\n },\n body: {\n type: e.target.value as ReleaseAction['type'],\n },\n });\n\n if ('error' in response) {\n if (isAxiosError(response.error)) {\n // When the response returns an object with 'error', handle axios error\n toggleNotification({\n type: 'warning',\n message: formatAPIError(response.error),\n });\n } else {\n // Otherwise, the response returns an object with 'error', handle a generic error\n toggleNotification({\n type: 'warning',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n }\n };\n\n if (isLoading || isReleaseLoading) {\n return (\n <ContentLayout>\n <LoadingIndicatorPage />\n </ContentLayout>\n );\n }\n\n if (isError || isReleaseError || !release) {\n const errorsArray = [];\n if (releaseError) {\n errorsArray.push({\n code: releaseError.code,\n });\n }\n if (releaseActionsError) {\n errorsArray.push({\n code: releaseActionsError.code,\n });\n }\n return (\n <Redirect\n to={{\n pathname: '/plugins/content-releases',\n state: {\n errors: errorsArray,\n },\n }}\n />\n );\n }\n\n const releaseActions = data?.data;\n const releaseMeta = data?.meta;\n\n if (!releaseActions || !releaseActions.length) {\n return (\n <ContentLayout>\n <NoContent\n content={{\n id: 'content-releases.pages.Details.tab.emptyEntries',\n defaultMessage:\n 'This release is empty. Open the Content Manager, select an entry and add it to the release.',\n }}\n action={\n <LinkButton\n as={ReactRouterLink}\n // @ts-expect-error - types are not inferred correctly through the as prop.\n to={{\n pathname: '/content-manager',\n }}\n style={{ textDecoration: 'none' }}\n variant=\"secondary\"\n >\n {formatMessage({\n id: 'content-releases.page.Details.button.openContentManager',\n defaultMessage: 'Open the Content Manager',\n })}\n </LinkButton>\n }\n />\n </ContentLayout>\n );\n }\n\n return (\n <ContentLayout>\n <Flex gap={4} direction=\"column\" alignItems=\"stretch\">\n <Table.Root\n rows={releaseActions.map((item) => ({\n ...item,\n id: Number(item.entry.id),\n }))}\n colCount={releaseActions.length}\n isLoading={isLoading}\n isFetching={isFetching}\n >\n <Table.Content>\n <Table.Head>\n <Table.HeaderCell\n fieldSchemaType=\"string\"\n label={formatMessage({\n id: 'content-releases.page.ReleaseDetails.table.header.label.name',\n defaultMessage: 'name',\n })}\n name=\"name\"\n />\n <Table.HeaderCell\n fieldSchemaType=\"string\"\n label={formatMessage({\n id: 'content-releases.page.ReleaseDetails.table.header.label.locale',\n defaultMessage: 'locale',\n })}\n name=\"locale\"\n />\n <Table.HeaderCell\n fieldSchemaType=\"string\"\n label={formatMessage({\n id: 'content-releases.page.ReleaseDetails.table.header.label.content-type',\n defaultMessage: 'content-type',\n })}\n name=\"content-type\"\n />\n <Table.HeaderCell\n fieldSchemaType=\"string\"\n label={formatMessage({\n id: 'content-releases.page.ReleaseDetails.table.header.label.action',\n defaultMessage: 'action',\n })}\n name=\"action\"\n />\n </Table.Head>\n <Table.LoadingBody />\n <Table.Body>\n {releaseActions.map(({ id, type, entry }) => (\n <Tr key={id}>\n <Td>\n <Typography>{`${entry.contentType.mainFieldValue || entry.id}`}</Typography>\n </Td>\n <Td>\n <Typography>{`${entry?.locale?.name ? entry.locale.name : '-'}`}</Typography>\n </Td>\n <Td>\n <Typography>{entry.contentType.displayName || ''}</Typography>\n </Td>\n <Td>\n {release.releasedAt ? (\n <Typography>\n {formatMessage(\n {\n id: 'content-releases.page.ReleaseDetails.table.action-published',\n defaultMessage:\n 'This entry was <b>{isPublish, select, true {published} other {unpublished}}</b>.',\n },\n {\n isPublish: type === 'publish',\n b: (children: React.ReactNode) => (\n <Typography fontWeight=\"bold\">{children}</Typography>\n ),\n }\n )}\n </Typography>\n ) : (\n <ReleaseActionOptions\n selected={type}\n handleChange={(e) => handleChangeType(e, id)}\n name={`release-action-${id}-type`}\n />\n )}\n </Td>\n </Tr>\n ))}\n </Table.Body>\n </Table.Content>\n </Table.Root>\n <Flex paddingTop={4} alignItems=\"flex-end\" justifyContent=\"space-between\">\n <PageSizeURLQuery defaultValue={releaseMeta?.pagination?.pageSize.toString()} />\n <PaginationURLQuery\n pagination={{\n pageCount: releaseMeta?.pagination?.pageCount || 0,\n }}\n />\n </Flex>\n </Flex>\n </ContentLayout>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ReleaseDetailsPage\n * -----------------------------------------------------------------------------------------------*/\nconst ReleaseDetailsPage = () => {\n const { formatMessage } = useIntl();\n const { releaseId } = useParams<{ releaseId: string }>();\n const toggleNotification = useNotification();\n const { formatAPIError } = useAPIErrorHandler();\n const { push } = useHistory();\n const [releaseModalShown, setReleaseModalShown] = React.useState(false);\n const [showWarningSubmit, setWarningSubmit] = React.useState(false);\n\n const {\n isLoading: isLoadingDetails,\n data,\n isSuccess: isSuccessDetails,\n } = useGetReleaseQuery({ id: releaseId });\n const [updateRelease, { isLoading: isSubmittingForm }] = useUpdateReleaseMutation();\n const [deleteRelease, { isLoading: isDeletingRelease }] = useDeleteReleaseMutation();\n\n const toggleEditReleaseModal = () => {\n setReleaseModalShown((prev) => !prev);\n };\n\n const toggleWarningSubmit = () => setWarningSubmit((prevState) => !prevState);\n\n if (isLoadingDetails) {\n return (\n <ReleaseDetailsLayout\n toggleEditReleaseModal={toggleEditReleaseModal}\n toggleWarningSubmit={toggleWarningSubmit}\n >\n <ContentLayout>\n <LoadingIndicatorPage />\n </ContentLayout>\n </ReleaseDetailsLayout>\n );\n }\n\n const title = (isSuccessDetails && data?.data?.name) || '';\n\n const handleEditRelease = async (values: FormValues) => {\n const response = await updateRelease({\n id: releaseId,\n name: values.name,\n });\n\n if ('data' in response) {\n // When the response returns an object with 'data', handle success\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: 'content-releases.modal.release-updated-notification-success',\n defaultMessage: 'Release updated.',\n }),\n });\n } else if (isAxiosError(response.error)) {\n // When the response returns an object with 'error', handle axios error\n toggleNotification({\n type: 'warning',\n message: formatAPIError(response.error),\n });\n } else {\n // Otherwise, the response returns an object with 'error', handle a generic error\n toggleNotification({\n type: 'warning',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n\n toggleEditReleaseModal();\n };\n\n const handleDeleteRelease = async () => {\n const response = await deleteRelease({\n id: releaseId,\n });\n\n if ('data' in response) {\n push('/plugins/content-releases');\n } else if (isAxiosError(response.error)) {\n // When the response returns an object with 'error', handle axios error\n toggleNotification({\n type: 'warning',\n message: formatAPIError(response.error),\n });\n } else {\n // Otherwise, the response returns an object with 'error', handle a generic error\n toggleNotification({\n type: 'warning',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n };\n\n return (\n <ReleaseDetailsLayout\n toggleEditReleaseModal={toggleEditReleaseModal}\n toggleWarningSubmit={toggleWarningSubmit}\n >\n <ReleaseDetailsBody />\n {releaseModalShown && (\n <ReleaseModal\n handleClose={toggleEditReleaseModal}\n handleSubmit={handleEditRelease}\n isLoading={isLoadingDetails || isSubmittingForm}\n initialValues={{ name: title || '' }}\n />\n )}\n <ConfirmDialog\n bodyText={{\n id: 'content-releases.dialog.confirmation-message',\n defaultMessage: 'Are you sure you want to delete this release?',\n }}\n isOpen={showWarningSubmit}\n isConfirmButtonLoading={isDeletingRelease}\n onToggleDialog={toggleWarningSubmit}\n onConfirm={handleDeleteRelease}\n />\n </ReleaseDetailsLayout>\n );\n};\n\nconst ProtectedReleaseDetailsPage = () => (\n <CheckPermissions permissions={PERMISSIONS.main}>\n <ReleaseDetailsPage />\n </CheckPermissions>\n);\n\nexport { ReleaseDetailsPage, ProtectedReleaseDetailsPage };\n","import * as React from 'react';\n\nimport {\n Box,\n Button,\n ContentLayout,\n Divider,\n EmptyStateLayout,\n Flex,\n Grid,\n GridItem,\n HeaderLayout,\n Main,\n Tab,\n TabGroup,\n TabPanel,\n TabPanels,\n Tabs,\n Typography,\n} from '@strapi/design-system';\nimport { Link } from '@strapi/design-system/v2';\nimport {\n AnErrorOccurred,\n CheckPermissions,\n LoadingIndicatorPage,\n PageSizeURLQuery,\n PaginationURLQuery,\n useQueryParams,\n useAPIErrorHandler,\n useNotification,\n} from '@strapi/helper-plugin';\nimport { EmptyDocuments, Plus } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { useHistory, useLocation } from 'react-router-dom';\nimport styled from 'styled-components';\n\nimport { GetReleases } from '../../../shared/contracts/releases';\nimport { ReleaseModal, FormValues } from '../components/ReleaseModal';\nimport { PERMISSIONS } from '../constants';\nimport { isAxiosError } from '../services/axios';\nimport {\n useGetReleasesQuery,\n GetReleasesQueryParams,\n useCreateReleaseMutation,\n} from '../services/release';\n\n/* -------------------------------------------------------------------------------------------------\n * ReleasesLayout\n * -----------------------------------------------------------------------------------------------*/\ninterface ReleasesLayoutProps {\n isLoading?: boolean;\n totalReleases?: number;\n onClickAddRelease: () => void;\n children: React.ReactNode;\n}\n\nexport const ReleasesLayout = ({\n isLoading,\n totalReleases,\n onClickAddRelease,\n children,\n}: ReleasesLayoutProps) => {\n const { formatMessage } = useIntl();\n return (\n <Main aria-busy={isLoading}>\n <HeaderLayout\n title={formatMessage({\n id: 'content-releases.pages.Releases.title',\n defaultMessage: 'Releases',\n })}\n subtitle={\n !isLoading &&\n formatMessage(\n {\n id: 'content-releases.pages.Releases.header-subtitle',\n defaultMessage:\n '{number, plural, =0 {No releases} one {# release} other {# releases}}',\n },\n { number: totalReleases }\n )\n }\n primaryAction={\n <CheckPermissions permissions={PERMISSIONS.create}>\n <Button startIcon={<Plus />} onClick={onClickAddRelease}>\n {formatMessage({\n id: 'content-releases.header.actions.add-release',\n defaultMessage: 'New release',\n })}\n </Button>\n </CheckPermissions>\n }\n />\n {children}\n </Main>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ReleasesGrid\n * -----------------------------------------------------------------------------------------------*/\ninterface ReleasesGridProps {\n sectionTitle: 'pending' | 'done';\n releases?: GetReleases.Response['data'];\n isError?: boolean;\n}\n\nconst LinkCard = styled(Link)`\n display: block;\n`;\n\nconst ReleasesGrid = ({ sectionTitle, releases = [], isError = false }: ReleasesGridProps) => {\n const { formatMessage } = useIntl();\n\n if (isError) {\n return <AnErrorOccurred />;\n }\n\n if (releases?.length === 0) {\n return (\n <EmptyStateLayout\n content={formatMessage(\n {\n id: 'content-releases.page.Releases.tab.emptyEntries',\n defaultMessage: 'No releases',\n },\n {\n target: sectionTitle,\n }\n )}\n icon={<EmptyDocuments width=\"10rem\" />}\n />\n );\n }\n\n return (\n <Grid gap={4}>\n {releases.map(({ id, name, actions }) => (\n <GridItem col={3} s={6} xs={12} key={id}>\n <LinkCard href={`content-releases/${id}`} isExternal={false}>\n <Flex\n direction=\"column\"\n justifyContent=\"space-between\"\n padding={4}\n hasRadius\n background=\"neutral0\"\n shadow=\"tableShadow\"\n height=\"100%\"\n width=\"100%\"\n alignItems=\"start\"\n gap={2}\n >\n <Typography as=\"h3\" variant=\"delta\" fontWeight=\"bold\">\n {name}\n </Typography>\n <Typography variant=\"pi\">\n {formatMessage(\n {\n id: 'content-releases.page.Releases.release-item.entries',\n defaultMessage:\n '{number, plural, =0 {No entries} one {# entry} other {# entries}}',\n },\n { number: actions.meta.count }\n )}\n </Typography>\n </Flex>\n </LinkCard>\n </GridItem>\n ))}\n </Grid>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ReleasesPage\n * -----------------------------------------------------------------------------------------------*/\ninterface CustomLocationState {\n errors?: Record<'code', string>[];\n}\n\nconst INITIAL_FORM_VALUES = {\n name: '',\n} satisfies FormValues;\n\nconst ReleasesPage = () => {\n const location = useLocation<CustomLocationState>();\n const [releaseModalShown, setReleaseModalShown] = React.useState(false);\n const toggleNotification = useNotification();\n const { formatMessage } = useIntl();\n const { push, replace } = useHistory();\n const { formatAPIError } = useAPIErrorHandler();\n const [{ query }, setQuery] = useQueryParams<GetReleasesQueryParams>();\n const response = useGetReleasesQuery(query);\n const [createRelease, { isLoading: isSubmittingForm }] = useCreateReleaseMutation();\n\n const { isLoading, isSuccess, isError } = response;\n\n // Check if we have some errors and show a notification to the user to explain the error\n React.useEffect(() => {\n if (location?.state?.errors) {\n toggleNotification({\n type: 'warning',\n title: formatMessage({\n id: 'content-releases.pages.Releases.notification.error.title',\n defaultMessage: 'Your request could not be processed.',\n }),\n message: formatMessage({\n id: 'content-releases.pages.Releases.notification.error.message',\n defaultMessage: 'Please try again or open another release.',\n }),\n });\n replace({ state: null });\n }\n }, [formatMessage, location?.state?.errors, replace, toggleNotification]);\n\n const toggleAddReleaseModal = () => {\n setReleaseModalShown((prev) => !prev);\n };\n\n if (isLoading) {\n return (\n <ReleasesLayout onClickAddRelease={toggleAddReleaseModal} isLoading>\n <ContentLayout>\n <LoadingIndicatorPage />\n </ContentLayout>\n </ReleasesLayout>\n );\n }\n\n const totalReleases = (isSuccess && response.currentData?.meta?.pagination?.total) || 0;\n\n const handleTabChange = (index: number) => {\n setQuery({\n ...query,\n page: 1,\n pageSize: response?.currentData?.meta?.pagination?.pageSize || 16,\n filters: {\n releasedAt: {\n $notNull: index === 0 ? false : true,\n },\n },\n });\n };\n\n const activeTab = response?.currentData?.meta?.activeTab || 'pending';\n\n const handleAddRelease = async (values: FormValues) => {\n const response = await createRelease({\n name: values.name,\n });\n if ('data' in response) {\n // When the response returns an object with 'data', handle success\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: 'content-releases.modal.release-created-notification-success',\n defaultMessage: 'Release created.',\n }),\n });\n\n push(`/plugins/content-releases/${response.data.data.id}`);\n } else if (isAxiosError(response.error)) {\n // When the response returns an object with 'error', handle axios error\n toggleNotification({\n type: 'warning',\n message: formatAPIError(response.error),\n });\n } else {\n // Otherwise, the response returns an object with 'error', handle a generic error\n toggleNotification({\n type: 'warning',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n };\n\n return (\n <ReleasesLayout onClickAddRelease={toggleAddReleaseModal} totalReleases={totalReleases}>\n <ContentLayout>\n <>\n <TabGroup\n label={formatMessage({\n id: 'content-releases.pages.Releases.tab-group.label',\n defaultMessage: 'Releases list',\n })}\n variant=\"simple\"\n initialSelectedTabIndex={['pending', 'done'].indexOf(activeTab)}\n onTabChange={handleTabChange}\n >\n <Box paddingBottom={8}>\n <Tabs>\n <Tab>\n {formatMessage({\n id: 'content-releases.pages.Releases.tab.pending',\n defaultMessage: 'Pending',\n })}\n </Tab>\n <Tab>\n {formatMessage({\n id: 'content-releases.pages.Releases.tab.done',\n defaultMessage: 'Done',\n })}\n </Tab>\n </Tabs>\n <Divider />\n </Box>\n <TabPanels>\n {/* Pending releases */}\n <TabPanel>\n <ReleasesGrid\n sectionTitle=\"pending\"\n releases={response?.currentData?.data}\n isError={isError}\n />\n </TabPanel>\n {/* Done releases */}\n <TabPanel>\n <ReleasesGrid\n sectionTitle=\"done\"\n releases={response?.currentData?.data}\n isError={isError}\n />\n </TabPanel>\n </TabPanels>\n </TabGroup>\n {totalReleases > 0 && (\n <Flex paddingTop={4} alignItems=\"flex-end\" justifyContent=\"space-between\">\n <PageSizeURLQuery\n options={['8', '16', '32', '64']}\n defaultValue={response?.currentData?.meta?.pagination?.pageSize.toString()}\n />\n <PaginationURLQuery\n pagination={{\n pageCount: response?.currentData?.meta?.pagination?.pageCount || 0,\n }}\n />\n </Flex>\n )}\n </>\n </ContentLayout>\n {releaseModalShown && (\n <ReleaseModal\n handleClose={toggleAddReleaseModal}\n handleSubmit={handleAddRelease}\n isLoading={isSubmittingForm}\n initialValues={INITIAL_FORM_VALUES}\n />\n )}\n </ReleasesLayout>\n );\n};\n\nconst ProtectedReleasesPage = () => (\n <CheckPermissions permissions={PERMISSIONS.main}>\n <ReleasesPage />\n </CheckPermissions>\n);\n\nexport { ReleasesPage, ProtectedReleasesPage };\n","import { Route, Switch } from 'react-router-dom';\n\nimport { pluginId } from '../pluginId';\n\nimport { ProtectedReleaseDetailsPage } from './ReleaseDetailsPage';\nimport { ProtectedReleasesPage } from './ReleasesPage';\n\nexport const App = () => {\n return (\n <Switch>\n <Route exact path={`/plugins/${pluginId}`} component={ProtectedReleasesPage} />\n <Route\n exact\n path={`/plugins/${pluginId}/:releaseId`}\n component={ProtectedReleaseDetailsPage}\n />\n </Switch>\n );\n};\n"],"names":["yup","useIntl","jsxs","ModalLayout","jsx","ModalHeader","Typography","Formik","Form","ModalBody","TextInput","ModalFooter","Button","styled","Flex","Pencil","Trash","useParams","React","useGetReleaseQuery","usePublishReleaseMutation","useNotification","useAPIErrorHandler","useRBAC","PERMISSIONS","isAxiosError","Main","LoadingIndicatorPage","Redirect","HeaderLayout","Link","ArrowLeft","IconButton","More","Popover","RelativeTime","CheckPermissions","useQueryParams","useGetReleaseActionsQuery","useUpdateReleaseActionMutation","ContentLayout","NoContent","LinkButton","ReactRouterLink","Table","Tr","Td","ReleaseActionOptions","PageSizeURLQuery","PaginationURLQuery","useHistory","useUpdateReleaseMutation","useDeleteReleaseMutation","ConfirmDialog","Plus","AnErrorOccurred","EmptyStateLayout","EmptyDocuments","Grid","GridItem","useLocation","useGetReleasesQuery","useCreateReleaseMutation","index","response","Fragment","TabGroup","Box","Tabs","Tab","Divider","TabPanels","TabPanel","Switch","Route","pluginId"],"mappings":"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"}
@@ -8,6 +8,8 @@ const en = {
8
8
  "content-manager-edit-view.add-to-release.continue-button": "Continue",
9
9
  "content-manager-edit-view.add-to-release": "Add to release",
10
10
  "content-manager-edit-view.add-to-release.notification.success": "Entry added to release",
11
+ "content-manager-edit-view.add-to-release.no-releases-message": "No available releases. Open the list of releases and create a new one from there.",
12
+ "content-manager-edit-view.add-to-release.redirect-button": "Open the list of releases",
11
13
  "content-manager-edit-view.list-releases.title": "{isPublish, select, true {Will be published in} other {Will be unpublished in}}",
12
14
  "content-manager-edit-view.remove-from-release": "Remove from release",
13
15
  "content-manager-edit-view.remove-from-release.notification.success": "Entry removed from release",
@@ -34,6 +36,7 @@ const en = {
34
36
  "pages.Releases.tab.pending": "Pending",
35
37
  "pages.Releases.tab.done": "Done",
36
38
  "page.Releases.tab.emptyEntries": "No releases",
39
+ "pages.Details.tab.emptyEntries": "This release is empty. Open the Content Manager, select an entry and add it to the release.",
37
40
  "page.Releases.release-item.entries": "{number, plural, =0 {No entries} one {# entry} other {# entries}}",
38
41
  "page.ReleaseDetails.table.header.label.name": "name",
39
42
  "page.ReleaseDetails.table.header.label.locale": "locale",
@@ -41,7 +44,10 @@ const en = {
41
44
  "page.ReleaseDetails.table.header.label.action": "action",
42
45
  "page.ReleaseDetails.table.action-published": "This entry was <b>{isPublish, select, true {published} other {unpublished}}</b>.",
43
46
  "pages.ReleaseDetails.publish-notification-success": "Release was published successfully.",
44
- "dialog.confirmation-message": "Are you sure you want to delete this release?"
47
+ "dialog.confirmation-message": "Are you sure you want to delete this release?",
48
+ "page.Details.button.openContentManager": "Open the Content Manager",
49
+ "pages.Releases.notification.error.title": "Your request could not be processed.",
50
+ "pages.Releases.notification.error.message": "Please try again or open another release."
45
51
  };
46
52
  exports.default = en;
47
- //# sourceMappingURL=en-b5dfabe6.js.map
53
+ //# sourceMappingURL=en-13576ce2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"en-13576ce2.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -6,6 +6,8 @@ const en = {
6
6
  "content-manager-edit-view.add-to-release.continue-button": "Continue",
7
7
  "content-manager-edit-view.add-to-release": "Add to release",
8
8
  "content-manager-edit-view.add-to-release.notification.success": "Entry added to release",
9
+ "content-manager-edit-view.add-to-release.no-releases-message": "No available releases. Open the list of releases and create a new one from there.",
10
+ "content-manager-edit-view.add-to-release.redirect-button": "Open the list of releases",
9
11
  "content-manager-edit-view.list-releases.title": "{isPublish, select, true {Will be published in} other {Will be unpublished in}}",
10
12
  "content-manager-edit-view.remove-from-release": "Remove from release",
11
13
  "content-manager-edit-view.remove-from-release.notification.success": "Entry removed from release",
@@ -32,6 +34,7 @@ const en = {
32
34
  "pages.Releases.tab.pending": "Pending",
33
35
  "pages.Releases.tab.done": "Done",
34
36
  "page.Releases.tab.emptyEntries": "No releases",
37
+ "pages.Details.tab.emptyEntries": "This release is empty. Open the Content Manager, select an entry and add it to the release.",
35
38
  "page.Releases.release-item.entries": "{number, plural, =0 {No entries} one {# entry} other {# entries}}",
36
39
  "page.ReleaseDetails.table.header.label.name": "name",
37
40
  "page.ReleaseDetails.table.header.label.locale": "locale",
@@ -39,9 +42,12 @@ const en = {
39
42
  "page.ReleaseDetails.table.header.label.action": "action",
40
43
  "page.ReleaseDetails.table.action-published": "This entry was <b>{isPublish, select, true {published} other {unpublished}}</b>.",
41
44
  "pages.ReleaseDetails.publish-notification-success": "Release was published successfully.",
42
- "dialog.confirmation-message": "Are you sure you want to delete this release?"
45
+ "dialog.confirmation-message": "Are you sure you want to delete this release?",
46
+ "page.Details.button.openContentManager": "Open the Content Manager",
47
+ "pages.Releases.notification.error.title": "Your request could not be processed.",
48
+ "pages.Releases.notification.error.message": "Please try again or open another release."
43
49
  };
44
50
  export {
45
51
  en as default
46
52
  };
47
- //# sourceMappingURL=en-d837b82d.mjs.map
53
+ //# sourceMappingURL=en-e98d8b57.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"en-e98d8b57.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}