@strapi/content-releases 0.0.0-experimental.e47108ccbbc4ad1bfaf4526fa6b70d6ace1ca7a9 → 0.0.0-experimental.e60ec1829240dae21c1e1d29076681c322288813

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 (110) hide show
  1. package/dist/_chunks/{App-XbK-TdJn.mjs → App-BsUSTHVD.mjs} +241 -210
  2. package/dist/_chunks/App-BsUSTHVD.mjs.map +1 -0
  3. package/dist/_chunks/{App-ftICpqDz.js → App-CXRpb2hi.js} +256 -225
  4. package/dist/_chunks/App-CXRpb2hi.js.map +1 -0
  5. package/dist/_chunks/{PurchaseContentReleases-bpIYXOfu.js → PurchaseContentReleases-Be3acS2L.js} +7 -6
  6. package/dist/_chunks/PurchaseContentReleases-Be3acS2L.js.map +1 -0
  7. package/dist/_chunks/{PurchaseContentReleases-3tRbmbY3.mjs → PurchaseContentReleases-_MxP6-Dt.mjs} +8 -7
  8. package/dist/_chunks/PurchaseContentReleases-_MxP6-Dt.mjs.map +1 -0
  9. package/dist/_chunks/{en-pOJ6G5fC.mjs → en-B9Ur3VsE.mjs} +10 -1
  10. package/dist/_chunks/en-B9Ur3VsE.mjs.map +1 -0
  11. package/dist/_chunks/{en-4CUzVH2g.js → en-DtFJ5ViE.js} +10 -1
  12. package/dist/_chunks/en-DtFJ5ViE.js.map +1 -0
  13. package/dist/_chunks/{index-RYVGXFeL.js → index-B6-lic1Q.js} +340 -113
  14. package/dist/_chunks/index-B6-lic1Q.js.map +1 -0
  15. package/dist/_chunks/{index-8LrruHqK.mjs → index-DJLIZdZv.mjs} +339 -112
  16. package/dist/_chunks/index-DJLIZdZv.mjs.map +1 -0
  17. package/dist/admin/index.js +1 -15
  18. package/dist/admin/index.js.map +1 -1
  19. package/dist/admin/index.mjs +2 -16
  20. package/dist/admin/index.mjs.map +1 -1
  21. package/dist/admin/src/components/CMReleasesContainer.d.ts +22 -0
  22. package/dist/admin/src/components/RelativeTime.d.ts +28 -0
  23. package/dist/admin/src/components/ReleaseAction.d.ts +3 -0
  24. package/dist/admin/src/components/ReleaseActionMenu.d.ts +26 -0
  25. package/dist/admin/src/components/ReleaseActionOptions.d.ts +9 -0
  26. package/dist/admin/src/components/ReleaseListCell.d.ts +0 -0
  27. package/dist/admin/src/components/ReleaseModal.d.ts +16 -0
  28. package/dist/admin/src/constants.d.ts +58 -0
  29. package/dist/admin/src/index.d.ts +3 -0
  30. package/dist/admin/src/pages/App.d.ts +1 -0
  31. package/dist/admin/src/pages/PurchaseContentReleases.d.ts +2 -0
  32. package/dist/admin/src/pages/ReleaseDetailsPage.d.ts +2 -0
  33. package/dist/admin/src/pages/ReleasesPage.d.ts +8 -0
  34. package/dist/admin/src/pages/tests/mockReleaseDetailsPageData.d.ts +181 -0
  35. package/dist/admin/src/pages/tests/mockReleasesPageData.d.ts +39 -0
  36. package/dist/admin/src/pluginId.d.ts +1 -0
  37. package/dist/admin/src/services/axios.d.ts +29 -0
  38. package/dist/admin/src/services/release.d.ts +429 -0
  39. package/dist/admin/src/store/hooks.d.ts +7 -0
  40. package/dist/admin/src/utils/prefixPluginTranslations.d.ts +3 -0
  41. package/dist/admin/src/utils/time.d.ts +1 -0
  42. package/dist/server/index.js +152 -93
  43. package/dist/server/index.js.map +1 -1
  44. package/dist/server/index.mjs +153 -93
  45. package/dist/server/index.mjs.map +1 -1
  46. package/dist/server/src/bootstrap.d.ts +5 -0
  47. package/dist/server/src/bootstrap.d.ts.map +1 -0
  48. package/dist/server/src/constants.d.ts +12 -0
  49. package/dist/server/src/constants.d.ts.map +1 -0
  50. package/dist/server/src/content-types/index.d.ts +99 -0
  51. package/dist/server/src/content-types/index.d.ts.map +1 -0
  52. package/dist/server/src/content-types/release/index.d.ts +48 -0
  53. package/dist/server/src/content-types/release/index.d.ts.map +1 -0
  54. package/dist/server/src/content-types/release/schema.d.ts +47 -0
  55. package/dist/server/src/content-types/release/schema.d.ts.map +1 -0
  56. package/dist/server/src/content-types/release-action/index.d.ts +50 -0
  57. package/dist/server/src/content-types/release-action/index.d.ts.map +1 -0
  58. package/dist/server/src/content-types/release-action/schema.d.ts +49 -0
  59. package/dist/server/src/content-types/release-action/schema.d.ts.map +1 -0
  60. package/dist/server/src/controllers/index.d.ts +20 -0
  61. package/dist/server/src/controllers/index.d.ts.map +1 -0
  62. package/dist/server/src/controllers/release-action.d.ts +10 -0
  63. package/dist/server/src/controllers/release-action.d.ts.map +1 -0
  64. package/dist/server/src/controllers/release.d.ts +12 -0
  65. package/dist/server/src/controllers/release.d.ts.map +1 -0
  66. package/dist/server/src/controllers/validation/release-action.d.ts +8 -0
  67. package/dist/server/src/controllers/validation/release-action.d.ts.map +1 -0
  68. package/dist/server/src/controllers/validation/release.d.ts +2 -0
  69. package/dist/server/src/controllers/validation/release.d.ts.map +1 -0
  70. package/dist/server/src/destroy.d.ts +5 -0
  71. package/dist/server/src/destroy.d.ts.map +1 -0
  72. package/dist/server/src/index.d.ts +2096 -0
  73. package/dist/server/src/index.d.ts.map +1 -0
  74. package/dist/server/src/migrations/index.d.ts +13 -0
  75. package/dist/server/src/migrations/index.d.ts.map +1 -0
  76. package/dist/server/src/register.d.ts +5 -0
  77. package/dist/server/src/register.d.ts.map +1 -0
  78. package/dist/server/src/routes/index.d.ts +35 -0
  79. package/dist/server/src/routes/index.d.ts.map +1 -0
  80. package/dist/server/src/routes/release-action.d.ts +18 -0
  81. package/dist/server/src/routes/release-action.d.ts.map +1 -0
  82. package/dist/server/src/routes/release.d.ts +18 -0
  83. package/dist/server/src/routes/release.d.ts.map +1 -0
  84. package/dist/server/src/services/index.d.ts +1826 -0
  85. package/dist/server/src/services/index.d.ts.map +1 -0
  86. package/dist/server/src/services/release.d.ts +66 -0
  87. package/dist/server/src/services/release.d.ts.map +1 -0
  88. package/dist/server/src/services/scheduling.d.ts +18 -0
  89. package/dist/server/src/services/scheduling.d.ts.map +1 -0
  90. package/dist/server/src/services/validation.d.ts +18 -0
  91. package/dist/server/src/services/validation.d.ts.map +1 -0
  92. package/dist/server/src/utils/index.d.ts +14 -0
  93. package/dist/server/src/utils/index.d.ts.map +1 -0
  94. package/dist/shared/contracts/release-actions.d.ts +131 -0
  95. package/dist/shared/contracts/release-actions.d.ts.map +1 -0
  96. package/dist/shared/contracts/releases.d.ts +182 -0
  97. package/dist/shared/contracts/releases.d.ts.map +1 -0
  98. package/dist/shared/types.d.ts +24 -0
  99. package/dist/shared/types.d.ts.map +1 -0
  100. package/dist/shared/validation-schemas.d.ts +2 -0
  101. package/dist/shared/validation-schemas.d.ts.map +1 -0
  102. package/package.json +26 -31
  103. package/dist/_chunks/App-XbK-TdJn.mjs.map +0 -1
  104. package/dist/_chunks/App-ftICpqDz.js.map +0 -1
  105. package/dist/_chunks/PurchaseContentReleases-3tRbmbY3.mjs.map +0 -1
  106. package/dist/_chunks/PurchaseContentReleases-bpIYXOfu.js.map +0 -1
  107. package/dist/_chunks/en-4CUzVH2g.js.map +0 -1
  108. package/dist/_chunks/en-pOJ6G5fC.mjs.map +0 -1
  109. package/dist/_chunks/index-8LrruHqK.mjs.map +0 -1
  110. package/dist/_chunks/index-RYVGXFeL.js.map +0 -1
@@ -1,23 +1,51 @@
1
- import { jsxs, jsx, Fragment } from "react/jsx-runtime";
2
- import { RelativeTime, useNotification, useAPIErrorHandler, useQueryParams, useTracking, LoadingIndicatorPage, CheckPermissions, PageSizeURLQuery, PaginationURLQuery, AnErrorOccurred, ConfirmDialog, useRBAC, NoContent, Table, CheckPagePermissions } from "@strapi/helper-plugin";
3
- import { useLocation, useHistory, useParams, Redirect, Link as Link$2, Switch, Route } from "react-router-dom";
4
- import { g as getTimezoneOffset, p as pluginId, u as useGetReleasesQuery, a as useCreateReleaseMutation, P as PERMISSIONS, i as isAxiosError, b as useGetReleaseQuery, c as useUpdateReleaseMutation, d as useDeleteReleaseMutation, e as usePublishReleaseMutation, f as useTypedDispatch, h as useGetReleaseActionsQuery, j as useUpdateReleaseActionMutation, R as ReleaseActionOptions, k as ReleaseActionMenu, r as releaseApi } from "./index-8LrruHqK.mjs";
1
+ import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
+ import { useNotification, useAPIErrorHandler, useQueryParams, useTracking, useRBAC, Page, Layouts, Pagination, ConfirmDialog, BackButton, useStrapiApp, Table } from "@strapi/admin/strapi-admin";
3
+ import { useLocation, useNavigate, useParams, Navigate, Link as Link$1, Routes, Route } from "react-router-dom";
4
+ import { g as getTimezoneOffset, p as pluginId, u as useGetReleasesQuery, a as useCreateReleaseMutation, P as PERMISSIONS, i as isAxiosError, b as useGetReleaseQuery, c as useUpdateReleaseMutation, d as useDeleteReleaseMutation, e as usePublishReleaseMutation, f as useGetReleaseActionsQuery, h as useUpdateReleaseActionMutation, R as ReleaseActionOptions, j as ReleaseActionMenu, r as releaseApi } from "./index-DJLIZdZv.mjs";
5
5
  import * as React from "react";
6
- import { useLicenseLimits, unstable_useDocument } from "@strapi/admin/strapi-admin";
7
- import { ModalLayout, ModalHeader, Typography, ModalBody, Flex, TextInput, Box, Checkbox, DatePicker, TimePicker, ModalFooter, Button, Combobox, ComboboxOption, Alert, Main, HeaderLayout, ContentLayout, TabGroup, Tabs, Tab, Divider, TabPanels, TabPanel, EmptyStateLayout, Grid, GridItem, Badge, Link as Link$1, IconButton, SingleSelect, SingleSelectOption, Tr, Td, Icon, Tooltip } from "@strapi/design-system";
8
- import { Link, Menu, LinkButton } from "@strapi/design-system/v2";
9
- import { Plus, EmptyDocuments, Pencil, Trash, ArrowLeft, More, CrossCircle, CheckCircle } from "@strapi/icons";
6
+ import { unstable_useDocument } from "@strapi/content-manager/strapi-admin";
7
+ import { ModalLayout, ModalHeader, Typography, ModalBody, Flex, TextInput, Box, Checkbox, DatePicker, TimePicker, ModalFooter, Button, Combobox, ComboboxOption, Link, Alert, Main, TabGroup, Tabs, Tab, Divider, TabPanels, TabPanel, EmptyStateLayout, Grid, GridItem, Badge, Menu, IconButton, LinkButton, SingleSelect, SingleSelectOption, Tr, Td, Tooltip } from "@strapi/design-system";
8
+ import { Plus, Pencil, Trash, More, CrossCircle, CheckCircle } from "@strapi/icons";
9
+ import { EmptyDocuments } from "@strapi/icons/symbols";
10
10
  import format from "date-fns/format";
11
11
  import { utcToZonedTime, zonedTimeToUtc } from "date-fns-tz";
12
12
  import { useIntl } from "react-intl";
13
13
  import styled from "styled-components";
14
- import { formatISO } from "date-fns";
14
+ import { intervalToDuration, isPast, formatISO } from "date-fns";
15
15
  import { Formik, Form, useFormikContext } from "formik";
16
16
  import * as yup from "yup";
17
- import "@reduxjs/toolkit/query";
18
- import "axios";
19
- import "@reduxjs/toolkit/query/react";
20
- import "react-redux";
17
+ import { useDispatch } from "react-redux";
18
+ import { useLicenseLimits } from "@strapi/admin/strapi-admin/ee";
19
+ const intervals = ["years", "months", "days", "hours", "minutes", "seconds"];
20
+ const RelativeTime$1 = React.forwardRef(
21
+ ({ timestamp, customIntervals = [], ...restProps }, forwardedRef) => {
22
+ const { formatRelativeTime, formatDate, formatTime } = useIntl();
23
+ const interval = intervalToDuration({
24
+ start: timestamp,
25
+ end: Date.now()
26
+ // see https://github.com/date-fns/date-fns/issues/2891 – No idea why it's all partial it returns it every time.
27
+ });
28
+ const unit = intervals.find((intervalUnit) => {
29
+ return interval[intervalUnit] > 0 && Object.keys(interval).includes(intervalUnit);
30
+ });
31
+ const relativeTime = isPast(timestamp) ? -interval[unit] : interval[unit];
32
+ const customInterval = customIntervals.find(
33
+ (custom) => interval[custom.unit] < custom.threshold
34
+ );
35
+ const displayText = customInterval ? customInterval.text : formatRelativeTime(relativeTime, unit, { numeric: "auto" });
36
+ return /* @__PURE__ */ jsx(
37
+ "time",
38
+ {
39
+ ref: forwardedRef,
40
+ dateTime: timestamp.toISOString(),
41
+ role: "time",
42
+ title: `${formatDate(timestamp)} ${formatTime(timestamp)}`,
43
+ ...restProps,
44
+ children: displayText
45
+ }
46
+ );
47
+ }
48
+ );
21
49
  const RELEASE_SCHEMA = yup.object().shape({
22
50
  name: yup.string().trim().required(),
23
51
  scheduledAt: yup.string().nullable(),
@@ -255,11 +283,15 @@ const TimezoneComponent = ({ timezoneOptions }) => {
255
283
  }
256
284
  );
257
285
  };
286
+ const useTypedDispatch = useDispatch;
258
287
  const LinkCard = styled(Link)`
259
288
  display: block;
260
289
  `;
261
- const CapitalizeRelativeTime = styled(RelativeTime)`
262
- text-transform: capitalize;
290
+ const RelativeTime = styled(RelativeTime$1)`
291
+ display: inline-block;
292
+ &::first-letter {
293
+ text-transform: uppercase;
294
+ }
263
295
  `;
264
296
  const getBadgeProps = (status) => {
265
297
  let color;
@@ -289,7 +321,7 @@ const getBadgeProps = (status) => {
289
321
  const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
290
322
  const { formatMessage } = useIntl();
291
323
  if (isError) {
292
- return /* @__PURE__ */ jsx(AnErrorOccurred, {});
324
+ return /* @__PURE__ */ jsx(Page.Error, {});
293
325
  }
294
326
  if (releases?.length === 0) {
295
327
  return /* @__PURE__ */ jsx(
@@ -304,7 +336,7 @@ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
304
336
  target: sectionTitle
305
337
  }
306
338
  ),
307
- icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "10rem" })
339
+ icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "16rem" })
308
340
  }
309
341
  );
310
342
  }
@@ -324,7 +356,7 @@ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
324
356
  children: [
325
357
  /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "start", gap: 1, children: [
326
358
  /* @__PURE__ */ jsx(Typography, { as: "h3", variant: "delta", fontWeight: "bold", children: name }),
327
- /* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: scheduledAt ? /* @__PURE__ */ jsx(CapitalizeRelativeTime, { timestamp: new Date(scheduledAt) }) : formatMessage({
359
+ /* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: scheduledAt ? /* @__PURE__ */ jsx(RelativeTime, { timestamp: new Date(scheduledAt) }) : formatMessage({
328
360
  id: "content-releases.pages.Releases.not-scheduled",
329
361
  defaultMessage: "Not scheduled"
330
362
  }) })
@@ -354,9 +386,9 @@ const ReleasesPage = () => {
354
386
  const tabRef = React.useRef(null);
355
387
  const location = useLocation();
356
388
  const [releaseModalShown, setReleaseModalShown] = React.useState(false);
357
- const toggleNotification = useNotification();
389
+ const { toggleNotification } = useNotification();
358
390
  const { formatMessage } = useIntl();
359
- const { push, replace } = useHistory();
391
+ const navigate = useNavigate();
360
392
  const { formatAPIError } = useAPIErrorHandler();
361
393
  const [{ query }, setQuery] = useQueryParams();
362
394
  const response = useGetReleasesQuery(query);
@@ -364,13 +396,16 @@ const ReleasesPage = () => {
364
396
  const { getFeature } = useLicenseLimits();
365
397
  const { maximumReleases = 3 } = getFeature("cms-content-releases");
366
398
  const { trackUsage } = useTracking();
399
+ const {
400
+ allowedActions: { canCreate }
401
+ } = useRBAC(PERMISSIONS);
367
402
  const { isLoading, isSuccess, isError } = response;
368
403
  const activeTab = response?.currentData?.meta?.activeTab || "pending";
369
404
  const activeTabIndex = ["pending", "done"].indexOf(activeTab);
370
405
  React.useEffect(() => {
371
406
  if (location?.state?.errors) {
372
407
  toggleNotification({
373
- type: "warning",
408
+ type: "danger",
374
409
  title: formatMessage({
375
410
  id: "content-releases.pages.Releases.notification.error.title",
376
411
  defaultMessage: "Your request could not be processed."
@@ -380,9 +415,9 @@ const ReleasesPage = () => {
380
415
  defaultMessage: "Please try again or open another release."
381
416
  })
382
417
  });
383
- replace({ state: null });
418
+ navigate("", { replace: true, state: null });
384
419
  }
385
- }, [formatMessage, location?.state?.errors, replace, toggleNotification]);
420
+ }, [formatMessage, location?.state?.errors, navigate, toggleNotification]);
386
421
  React.useEffect(() => {
387
422
  if (tabRef.current) {
388
423
  tabRef.current._handlers.setSelectedTabIndex(activeTabIndex);
@@ -392,7 +427,7 @@ const ReleasesPage = () => {
392
427
  setReleaseModalShown((prev) => !prev);
393
428
  };
394
429
  if (isLoading) {
395
- return /* @__PURE__ */ jsx(Main, { "aria-busy": isLoading, children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) });
430
+ return /* @__PURE__ */ jsx(Page.Loading, {});
396
431
  }
397
432
  const totalPendingReleases = isSuccess && response.currentData?.meta?.pendingReleasesCount || 0;
398
433
  const hasReachedMaximumPendingReleases = totalPendingReleases >= maximumReleases;
@@ -423,22 +458,22 @@ const ReleasesPage = () => {
423
458
  })
424
459
  });
425
460
  trackUsage("didCreateRelease");
426
- push(`/plugins/content-releases/${response2.data.data.id}`);
461
+ navigate(response2.data.data.id.toString());
427
462
  } else if (isAxiosError(response2.error)) {
428
463
  toggleNotification({
429
- type: "warning",
464
+ type: "danger",
430
465
  message: formatAPIError(response2.error)
431
466
  });
432
467
  } else {
433
468
  toggleNotification({
434
- type: "warning",
469
+ type: "danger",
435
470
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
436
471
  });
437
472
  }
438
473
  };
439
474
  return /* @__PURE__ */ jsxs(Main, { "aria-busy": isLoading, children: [
440
475
  /* @__PURE__ */ jsx(
441
- HeaderLayout,
476
+ Layouts.Header,
442
477
  {
443
478
  title: formatMessage({
444
479
  id: "content-releases.pages.Releases.title",
@@ -448,7 +483,7 @@ const ReleasesPage = () => {
448
483
  id: "content-releases.pages.Releases.header-subtitle",
449
484
  defaultMessage: "Create and manage content updates"
450
485
  }),
451
- primaryAction: /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.create, children: /* @__PURE__ */ jsx(
486
+ primaryAction: canCreate ? /* @__PURE__ */ jsx(
452
487
  Button,
453
488
  {
454
489
  startIcon: /* @__PURE__ */ jsx(Plus, {}),
@@ -459,10 +494,10 @@ const ReleasesPage = () => {
459
494
  defaultMessage: "New release"
460
495
  })
461
496
  }
462
- ) })
497
+ ) : null
463
498
  }
464
499
  ),
465
- /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsxs(Fragment, { children: [
500
+ /* @__PURE__ */ jsx(Layouts.Content, { children: /* @__PURE__ */ jsxs(Fragment, { children: [
466
501
  hasReachedMaximumPendingReleases && /* @__PURE__ */ jsx(
467
502
  StyledAlert,
468
503
  {
@@ -538,23 +573,17 @@ const ReleasesPage = () => {
538
573
  ]
539
574
  }
540
575
  ),
541
- response.currentData?.meta?.pagination?.total ? /* @__PURE__ */ jsxs(Flex, { paddingTop: 4, alignItems: "flex-end", justifyContent: "space-between", children: [
542
- /* @__PURE__ */ jsx(
543
- PageSizeURLQuery,
544
- {
545
- options: ["8", "16", "32", "64"],
546
- defaultValue: response?.currentData?.meta?.pagination?.pageSize.toString()
547
- }
548
- ),
549
- /* @__PURE__ */ jsx(
550
- PaginationURLQuery,
551
- {
552
- pagination: {
553
- pageCount: response?.currentData?.meta?.pagination?.pageCount || 0
554
- }
555
- }
556
- )
557
- ] }) : null
576
+ /* @__PURE__ */ jsxs(
577
+ Pagination.Root,
578
+ {
579
+ ...response?.currentData?.meta?.pagination,
580
+ defaultPageSize: response?.currentData?.meta?.pagination?.pageSize,
581
+ children: [
582
+ /* @__PURE__ */ jsx(Pagination.PageSize, { options: ["8", "16", "32", "64"] }),
583
+ /* @__PURE__ */ jsx(Pagination.Links, {})
584
+ ]
585
+ }
586
+ )
558
587
  ] }) }),
559
588
  releaseModalShown && /* @__PURE__ */ jsx(
560
589
  ReleaseModal,
@@ -602,14 +631,18 @@ const TrashIcon = styled(Trash)`
602
631
  const TypographyMaxWidth = styled(Typography)`
603
632
  max-width: 300px;
604
633
  `;
605
- const EntryValidationText = ({ action, schema, components, entry }) => {
634
+ const EntryValidationText = ({ action, schema, entry }) => {
606
635
  const { formatMessage } = useIntl();
607
- const { validate } = unstable_useDocument();
608
- const { errors } = validate(entry, {
609
- contentType: schema,
610
- components,
611
- isCreatingEntry: false
612
- });
636
+ const { validate } = unstable_useDocument(
637
+ {
638
+ collectionType: schema?.kind ?? "",
639
+ model: schema?.uid ?? ""
640
+ },
641
+ {
642
+ skip: !schema
643
+ }
644
+ );
645
+ const errors = validate(entry) ?? {};
613
646
  if (Object.keys(errors).length > 0) {
614
647
  const validationErrorsMessages = Object.entries(errors).map(
615
648
  ([key, value]) => formatMessage(
@@ -618,13 +651,13 @@ const EntryValidationText = ({ action, schema, components, entry }) => {
618
651
  )
619
652
  ).join(" ");
620
653
  return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
621
- /* @__PURE__ */ jsx(Icon, { color: "danger600", as: CrossCircle }),
654
+ /* @__PURE__ */ jsx(CrossCircle, { fill: "danger600" }),
622
655
  /* @__PURE__ */ jsx(Tooltip, { description: validationErrorsMessages, children: /* @__PURE__ */ jsx(TypographyMaxWidth, { textColor: "danger600", variant: "omega", fontWeight: "semiBold", ellipsis: true, children: validationErrorsMessages }) })
623
656
  ] });
624
657
  }
625
658
  if (action == "publish") {
626
659
  return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
627
- /* @__PURE__ */ jsx(Icon, { color: "success600", as: CheckCircle }),
660
+ /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
628
661
  entry.publishedAt ? /* @__PURE__ */ jsx(Typography, { textColor: "success600", fontWeight: "bold", children: formatMessage({
629
662
  id: "content-releases.pages.ReleaseDetails.entry-validation.already-published",
630
663
  defaultMessage: "Already published"
@@ -635,7 +668,7 @@ const EntryValidationText = ({ action, schema, components, entry }) => {
635
668
  ] });
636
669
  }
637
670
  return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
638
- /* @__PURE__ */ jsx(Icon, { color: "success600", as: CheckCircle }),
671
+ /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
639
672
  !entry.publishedAt ? /* @__PURE__ */ jsx(Typography, { textColor: "success600", fontWeight: "bold", children: formatMessage({
640
673
  id: "content-releases.pages.ReleaseDetails.entry-validation.already-unpublished",
641
674
  defaultMessage: "Already unpublished"
@@ -657,18 +690,22 @@ const ReleaseDetailsLayout = ({
657
690
  isLoading: isLoadingDetails,
658
691
  isError,
659
692
  error
660
- } = useGetReleaseQuery({ id: releaseId });
693
+ } = useGetReleaseQuery(
694
+ { id: releaseId },
695
+ {
696
+ skip: !releaseId
697
+ }
698
+ );
661
699
  const [publishRelease, { isLoading: isPublishing }] = usePublishReleaseMutation();
662
- const toggleNotification = useNotification();
700
+ const { toggleNotification } = useNotification();
663
701
  const { formatAPIError } = useAPIErrorHandler();
664
- const {
665
- allowedActions: { canUpdate, canDelete }
666
- } = useRBAC(PERMISSIONS);
702
+ const { allowedActions } = useRBAC(PERMISSIONS);
703
+ const { canUpdate, canDelete, canPublish } = allowedActions;
667
704
  const dispatch = useTypedDispatch();
668
705
  const { trackUsage } = useTracking();
669
706
  const release = data?.data;
670
- const handlePublishRelease = async () => {
671
- const response = await publishRelease({ id: releaseId });
707
+ const handlePublishRelease = (id) => async () => {
708
+ const response = await publishRelease({ id });
672
709
  if ("data" in response) {
673
710
  toggleNotification({
674
711
  type: "success",
@@ -685,12 +722,12 @@ const ReleaseDetailsLayout = ({
685
722
  });
686
723
  } else if (isAxiosError(response.error)) {
687
724
  toggleNotification({
688
- type: "warning",
725
+ type: "danger",
689
726
  message: formatAPIError(response.error)
690
727
  });
691
728
  } else {
692
729
  toggleNotification({
693
- type: "warning",
730
+ type: "danger",
694
731
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
695
732
  });
696
733
  }
@@ -716,21 +753,19 @@ const ReleaseDetailsLayout = ({
716
753
  return release.createdBy.email;
717
754
  };
718
755
  if (isLoadingDetails) {
719
- return /* @__PURE__ */ jsx(Main, { "aria-busy": isLoadingDetails, children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) });
756
+ return /* @__PURE__ */ jsx(Page.Loading, {});
720
757
  }
721
758
  if (isError || !release) {
722
759
  return /* @__PURE__ */ jsx(
723
- Redirect,
760
+ Navigate,
724
761
  {
725
- to: {
726
- pathname: "/plugins/content-releases",
727
- state: {
728
- errors: [
729
- {
730
- code: error?.code
731
- }
732
- ]
733
- }
762
+ to: "..",
763
+ state: {
764
+ errors: [
765
+ {
766
+ code: error?.code
767
+ }
768
+ ]
734
769
  }
735
770
  }
736
771
  );
@@ -767,17 +802,14 @@ const ReleaseDetailsLayout = ({
767
802
  ) : "";
768
803
  return /* @__PURE__ */ jsxs(Main, { "aria-busy": isLoadingDetails, children: [
769
804
  /* @__PURE__ */ jsx(
770
- HeaderLayout,
805
+ Layouts.Header,
771
806
  {
772
807
  title: release.name,
773
808
  subtitle: /* @__PURE__ */ jsxs(Flex, { gap: 2, lineHeight: 6, children: [
774
809
  /* @__PURE__ */ jsx(Typography, { textColor: "neutral600", variant: "epsilon", children: numberOfEntriesText + (isScheduled ? ` - ${scheduledText}` : "") }),
775
810
  /* @__PURE__ */ jsx(Badge, { ...getBadgeProps(release.status), children: release.status })
776
811
  ] }),
777
- navigationAction: /* @__PURE__ */ jsx(Link$1, { startIcon: /* @__PURE__ */ jsx(ArrowLeft, {}), to: "/plugins/content-releases", children: formatMessage({
778
- id: "global.back",
779
- defaultMessage: "Back"
780
- }) }),
812
+ navigationAction: /* @__PURE__ */ jsx(BackButton, {}),
781
813
  primaryAction: !release.releasedAt && /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
782
814
  /* @__PURE__ */ jsxs(Menu.Root, { children: [
783
815
  /* @__PURE__ */ jsx(
@@ -794,7 +826,7 @@ const ReleaseDetailsLayout = ({
794
826
  variant: "tertiary"
795
827
  }
796
828
  ),
797
- /* @__PURE__ */ jsxs(Menu.Content, { top: 1, popoverPlacement: "bottom-end", children: [
829
+ /* @__PURE__ */ jsxs(Menu.Content, { top: 1, popoverPlacement: "bottom-end", maxHeight: void 0, children: [
798
830
  /* @__PURE__ */ jsxs(
799
831
  Flex,
800
832
  {
@@ -843,7 +875,7 @@ const ReleaseDetailsLayout = ({
843
875
  defaultMessage: "Created"
844
876
  }) }),
845
877
  /* @__PURE__ */ jsxs(Typography, { variant: "pi", color: "neutral300", children: [
846
- /* @__PURE__ */ jsx(RelativeTime, { timestamp: new Date(release.createdAt) }),
878
+ /* @__PURE__ */ jsx(RelativeTime$1, { timestamp: new Date(release.createdAt) }),
847
879
  formatMessage(
848
880
  {
849
881
  id: "content-releases.header.actions.created.description",
@@ -861,12 +893,12 @@ const ReleaseDetailsLayout = ({
861
893
  id: "content-releases.header.actions.refresh",
862
894
  defaultMessage: "Refresh"
863
895
  }) }),
864
- /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.publish, children: /* @__PURE__ */ jsx(
896
+ canPublish ? /* @__PURE__ */ jsx(
865
897
  Button,
866
898
  {
867
899
  size: "S",
868
900
  variant: "default",
869
- onClick: handlePublishRelease,
901
+ onClick: handlePublishRelease(release.id.toString()),
870
902
  loading: isPublishing,
871
903
  disabled: release.actions.meta.count === 0,
872
904
  children: formatMessage({
@@ -874,7 +906,7 @@ const ReleaseDetailsLayout = ({
874
906
  defaultMessage: "Publish"
875
907
  })
876
908
  }
877
- ) })
909
+ ) : null
878
910
  ] })
879
911
  }
880
912
  ),
@@ -882,6 +914,7 @@ const ReleaseDetailsLayout = ({
882
914
  ] });
883
915
  };
884
916
  const GROUP_BY_OPTIONS = ["contentType", "locale", "action"];
917
+ const GROUP_BY_OPTIONS_NO_LOCALE = ["contentType", "action"];
885
918
  const getGroupByOptionLabel = (value) => {
886
919
  if (value === "locale") {
887
920
  return {
@@ -900,11 +933,10 @@ const getGroupByOptionLabel = (value) => {
900
933
  defaultMessage: "Content-Types"
901
934
  };
902
935
  };
903
- const ReleaseDetailsBody = () => {
936
+ const ReleaseDetailsBody = ({ releaseId }) => {
904
937
  const { formatMessage } = useIntl();
905
- const { releaseId } = useParams();
906
938
  const [{ query }, setQuery] = useQueryParams();
907
- const toggleNotification = useNotification();
939
+ const { toggleNotification } = useNotification();
908
940
  const { formatAPIError } = useAPIErrorHandler();
909
941
  const {
910
942
  data: releaseData,
@@ -915,6 +947,20 @@ const ReleaseDetailsBody = () => {
915
947
  const {
916
948
  allowedActions: { canUpdate }
917
949
  } = useRBAC(PERMISSIONS);
950
+ const runHookWaterfall = useStrapiApp("ReleaseDetailsPage", (state) => state.runHookWaterfall);
951
+ const { hasI18nEnabled } = runHookWaterfall(
952
+ "ContentReleases/pages/ReleaseDetails/add-locale-in-releases",
953
+ {
954
+ displayedHeaders: {
955
+ label: formatMessage({
956
+ id: "content-releases.page.ReleaseDetails.table.header.label.locale",
957
+ defaultMessage: "locale"
958
+ }),
959
+ name: "locale"
960
+ },
961
+ hasI18nEnabled: false
962
+ }
963
+ );
918
964
  const release = releaseData?.data;
919
965
  const selectedGroupBy = query?.groupBy || "contentType";
920
966
  const {
@@ -945,19 +991,19 @@ const ReleaseDetailsBody = () => {
945
991
  if ("error" in response) {
946
992
  if (isAxiosError(response.error)) {
947
993
  toggleNotification({
948
- type: "warning",
994
+ type: "danger",
949
995
  message: formatAPIError(response.error)
950
996
  });
951
997
  } else {
952
998
  toggleNotification({
953
- type: "warning",
999
+ type: "danger",
954
1000
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
955
1001
  });
956
1002
  }
957
1003
  }
958
1004
  };
959
1005
  if (isLoading || isReleaseLoading) {
960
- return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) });
1006
+ return /* @__PURE__ */ jsx(Page.Loading, {});
961
1007
  }
962
1008
  const releaseActions = data?.data;
963
1009
  const releaseMeta = data?.meta;
@@ -976,32 +1022,26 @@ const ReleaseDetailsBody = () => {
976
1022
  });
977
1023
  }
978
1024
  return /* @__PURE__ */ jsx(
979
- Redirect,
1025
+ Navigate,
980
1026
  {
981
- to: {
982
- pathname: "/plugins/content-releases",
983
- state: {
984
- errors: errorsArray
985
- }
1027
+ to: "..",
1028
+ state: {
1029
+ errors: errorsArray
986
1030
  }
987
1031
  }
988
1032
  );
989
1033
  }
990
1034
  if (isError || !releaseActions) {
991
- return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(AnErrorOccurred, {}) });
1035
+ return /* @__PURE__ */ jsx(Page.Error, {});
992
1036
  }
993
1037
  if (Object.keys(releaseActions).length === 0) {
994
- return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(
995
- NoContent,
1038
+ return /* @__PURE__ */ jsx(Layouts.Content, { children: /* @__PURE__ */ jsx(
1039
+ EmptyStateLayout,
996
1040
  {
997
- content: {
998
- id: "content-releases.pages.Details.tab.emptyEntries",
999
- defaultMessage: "This release is empty. Open the Content Manager, select an entry and add it to the release."
1000
- },
1001
1041
  action: /* @__PURE__ */ jsx(
1002
1042
  LinkButton,
1003
1043
  {
1004
- as: Link$2,
1044
+ as: Link$1,
1005
1045
  to: {
1006
1046
  pathname: "/content-manager"
1007
1047
  },
@@ -1012,18 +1052,59 @@ const ReleaseDetailsBody = () => {
1012
1052
  defaultMessage: "Open the Content Manager"
1013
1053
  })
1014
1054
  }
1015
- )
1055
+ ),
1056
+ icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "16rem" }),
1057
+ content: formatMessage({
1058
+ id: "content-releases.pages.Details.tab.emptyEntries",
1059
+ defaultMessage: "This release is empty. Open the Content Manager, select an entry and add it to the release."
1060
+ })
1016
1061
  }
1017
1062
  ) });
1018
1063
  }
1019
- return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsxs(Flex, { gap: 8, direction: "column", alignItems: "stretch", children: [
1064
+ const groupByLabel = formatMessage({
1065
+ id: "content-releases.pages.ReleaseDetails.groupBy.aria-label",
1066
+ defaultMessage: "Group by"
1067
+ });
1068
+ const headers = [
1069
+ // ...displayedHeaders,
1070
+ {
1071
+ label: formatMessage({
1072
+ id: "content-releases.page.ReleaseDetails.table.header.label.name",
1073
+ defaultMessage: "name"
1074
+ }),
1075
+ name: "name"
1076
+ },
1077
+ {
1078
+ label: formatMessage({
1079
+ id: "content-releases.page.ReleaseDetails.table.header.label.content-type",
1080
+ defaultMessage: "content-type"
1081
+ }),
1082
+ name: "content-type"
1083
+ },
1084
+ {
1085
+ label: formatMessage({
1086
+ id: "content-releases.page.ReleaseDetails.table.header.label.action",
1087
+ defaultMessage: "action"
1088
+ }),
1089
+ name: "action"
1090
+ },
1091
+ ...!release.releasedAt ? [
1092
+ {
1093
+ label: formatMessage({
1094
+ id: "content-releases.page.ReleaseDetails.table.header.label.status",
1095
+ defaultMessage: "status"
1096
+ }),
1097
+ name: "status"
1098
+ }
1099
+ ] : []
1100
+ ];
1101
+ const options = hasI18nEnabled ? GROUP_BY_OPTIONS : GROUP_BY_OPTIONS_NO_LOCALE;
1102
+ return /* @__PURE__ */ jsx(Layouts.Content, { children: /* @__PURE__ */ jsxs(Flex, { gap: 8, direction: "column", alignItems: "stretch", children: [
1020
1103
  /* @__PURE__ */ jsx(Flex, { children: /* @__PURE__ */ jsx(
1021
1104
  SingleSelect,
1022
1105
  {
1023
- "aria-label": formatMessage({
1024
- id: "content-releases.pages.ReleaseDetails.groupBy.aria-label",
1025
- defaultMessage: "Group by"
1026
- }),
1106
+ placeholder: groupByLabel,
1107
+ "aria-label": groupByLabel,
1027
1108
  customizeContent: (value) => formatMessage(
1028
1109
  {
1029
1110
  id: `content-releases.pages.ReleaseDetails.groupBy.label`,
@@ -1035,7 +1116,7 @@ const ReleaseDetailsBody = () => {
1035
1116
  ),
1036
1117
  value: formatMessage(getGroupByOptionLabel(selectedGroupBy)),
1037
1118
  onChange: (value) => setQuery({ groupBy: value }),
1038
- children: GROUP_BY_OPTIONS.map((option) => /* @__PURE__ */ jsx(SingleSelectOption, { value: option, children: formatMessage(getGroupByOptionLabel(option)) }, option))
1119
+ children: options.map((option) => /* @__PURE__ */ jsx(SingleSelectOption, { value: option, children: formatMessage(getGroupByOptionLabel(option)) }, option))
1039
1120
  }
1040
1121
  ) }),
1041
1122
  Object.keys(releaseActions).map((key) => /* @__PURE__ */ jsxs(Flex, { gap: 4, direction: "column", alignItems: "stretch", children: [
@@ -1047,72 +1128,15 @@ const ReleaseDetailsBody = () => {
1047
1128
  ...item,
1048
1129
  id: Number(item.entry.id)
1049
1130
  })),
1050
- colCount: releaseActions[key].length,
1051
- isLoading,
1052
- isFetching,
1131
+ headers,
1132
+ isLoading: isLoading || isFetching,
1053
1133
  children: /* @__PURE__ */ jsxs(Table.Content, { children: [
1054
- /* @__PURE__ */ jsxs(Table.Head, { children: [
1055
- /* @__PURE__ */ jsx(
1056
- Table.HeaderCell,
1057
- {
1058
- fieldSchemaType: "string",
1059
- label: formatMessage({
1060
- id: "content-releases.page.ReleaseDetails.table.header.label.name",
1061
- defaultMessage: "name"
1062
- }),
1063
- name: "name"
1064
- }
1065
- ),
1066
- /* @__PURE__ */ jsx(
1067
- Table.HeaderCell,
1068
- {
1069
- fieldSchemaType: "string",
1070
- label: formatMessage({
1071
- id: "content-releases.page.ReleaseDetails.table.header.label.locale",
1072
- defaultMessage: "locale"
1073
- }),
1074
- name: "locale"
1075
- }
1076
- ),
1077
- /* @__PURE__ */ jsx(
1078
- Table.HeaderCell,
1079
- {
1080
- fieldSchemaType: "string",
1081
- label: formatMessage({
1082
- id: "content-releases.page.ReleaseDetails.table.header.label.content-type",
1083
- defaultMessage: "content-type"
1084
- }),
1085
- name: "content-type"
1086
- }
1087
- ),
1088
- /* @__PURE__ */ jsx(
1089
- Table.HeaderCell,
1090
- {
1091
- fieldSchemaType: "string",
1092
- label: formatMessage({
1093
- id: "content-releases.page.ReleaseDetails.table.header.label.action",
1094
- defaultMessage: "action"
1095
- }),
1096
- name: "action"
1097
- }
1098
- ),
1099
- !release.releasedAt && /* @__PURE__ */ jsx(
1100
- Table.HeaderCell,
1101
- {
1102
- fieldSchemaType: "string",
1103
- label: formatMessage({
1104
- id: "content-releases.page.ReleaseDetails.table.header.label.status",
1105
- defaultMessage: "status"
1106
- }),
1107
- name: "status"
1108
- }
1109
- )
1110
- ] }),
1111
- /* @__PURE__ */ jsx(Table.LoadingBody, {}),
1134
+ /* @__PURE__ */ jsx(Table.Head, { children: headers.map((header) => /* @__PURE__ */ jsx(Table.HeaderCell, { ...header }, header.name)) }),
1135
+ /* @__PURE__ */ jsx(Table.Loading, {}),
1112
1136
  /* @__PURE__ */ jsx(Table.Body, { children: releaseActions[key].map(
1113
1137
  ({ id, contentType, locale, type, entry }, actionIndex) => /* @__PURE__ */ jsxs(Tr, { children: [
1114
1138
  /* @__PURE__ */ jsx(Td, { width: "25%", maxWidth: "200px", children: /* @__PURE__ */ jsx(Typography, { ellipsis: true, children: `${contentType.mainFieldValue || entry.id}` }) }),
1115
- /* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: `${locale?.name ? locale.name : "-"}` }) }),
1139
+ hasI18nEnabled && /* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: `${locale?.name ? locale.name : "-"}` }) }),
1116
1140
  /* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: contentType.displayName || "" }) }),
1117
1141
  /* @__PURE__ */ jsx(Td, { width: "20%", children: release.releasedAt ? /* @__PURE__ */ jsx(Typography, { children: formatMessage(
1118
1142
  {
@@ -1166,34 +1190,39 @@ const ReleaseDetailsBody = () => {
1166
1190
  }
1167
1191
  )
1168
1192
  ] }, `releases-group-${key}`)),
1169
- /* @__PURE__ */ jsxs(Flex, { paddingTop: 4, alignItems: "flex-end", justifyContent: "space-between", children: [
1170
- /* @__PURE__ */ jsx(PageSizeURLQuery, { defaultValue: releaseMeta?.pagination?.pageSize.toString() }),
1171
- /* @__PURE__ */ jsx(
1172
- PaginationURLQuery,
1173
- {
1174
- pagination: {
1175
- pageCount: releaseMeta?.pagination?.pageCount || 0
1176
- }
1177
- }
1178
- )
1179
- ] })
1193
+ /* @__PURE__ */ jsxs(
1194
+ Pagination.Root,
1195
+ {
1196
+ ...releaseMeta?.pagination,
1197
+ defaultPageSize: releaseMeta?.pagination?.pageSize,
1198
+ children: [
1199
+ /* @__PURE__ */ jsx(Pagination.PageSize, {}),
1200
+ /* @__PURE__ */ jsx(Pagination.Links, {})
1201
+ ]
1202
+ }
1203
+ )
1180
1204
  ] }) });
1181
1205
  };
1182
1206
  const ReleaseDetailsPage = () => {
1183
1207
  const { formatMessage } = useIntl();
1184
1208
  const { releaseId } = useParams();
1185
- const toggleNotification = useNotification();
1209
+ const { toggleNotification } = useNotification();
1186
1210
  const { formatAPIError } = useAPIErrorHandler();
1187
- const { replace } = useHistory();
1211
+ const navigate = useNavigate();
1188
1212
  const [releaseModalShown, setReleaseModalShown] = React.useState(false);
1189
1213
  const [showWarningSubmit, setWarningSubmit] = React.useState(false);
1190
1214
  const {
1191
1215
  isLoading: isLoadingDetails,
1192
1216
  data,
1193
1217
  isSuccess: isSuccessDetails
1194
- } = useGetReleaseQuery({ id: releaseId });
1218
+ } = useGetReleaseQuery(
1219
+ { id: releaseId },
1220
+ {
1221
+ skip: !releaseId
1222
+ }
1223
+ );
1195
1224
  const [updateRelease, { isLoading: isSubmittingForm }] = useUpdateReleaseMutation();
1196
- const [deleteRelease, { isLoading: isDeletingRelease }] = useDeleteReleaseMutation();
1225
+ const [deleteRelease] = useDeleteReleaseMutation();
1197
1226
  const toggleEditReleaseModal = () => {
1198
1227
  setReleaseModalShown((prev) => !prev);
1199
1228
  };
@@ -1204,10 +1233,13 @@ const ReleaseDetailsPage = () => {
1204
1233
  {
1205
1234
  toggleEditReleaseModal,
1206
1235
  toggleWarningSubmit,
1207
- children: /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) })
1236
+ children: /* @__PURE__ */ jsx(Page.Loading, {})
1208
1237
  }
1209
1238
  );
1210
1239
  }
1240
+ if (!releaseId) {
1241
+ return /* @__PURE__ */ jsx(Navigate, { to: ".." });
1242
+ }
1211
1243
  const releaseData = isSuccessDetails && data?.data || null;
1212
1244
  const title = releaseData?.name || "";
1213
1245
  const timezone = releaseData?.timezone ?? null;
@@ -1229,33 +1261,33 @@ const ReleaseDetailsPage = () => {
1229
1261
  defaultMessage: "Release updated."
1230
1262
  })
1231
1263
  });
1264
+ toggleEditReleaseModal();
1232
1265
  } else if (isAxiosError(response.error)) {
1233
1266
  toggleNotification({
1234
- type: "warning",
1267
+ type: "danger",
1235
1268
  message: formatAPIError(response.error)
1236
1269
  });
1237
1270
  } else {
1238
1271
  toggleNotification({
1239
- type: "warning",
1272
+ type: "danger",
1240
1273
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
1241
1274
  });
1242
1275
  }
1243
- toggleEditReleaseModal();
1244
1276
  };
1245
1277
  const handleDeleteRelease = async () => {
1246
1278
  const response = await deleteRelease({
1247
1279
  id: releaseId
1248
1280
  });
1249
1281
  if ("data" in response) {
1250
- replace("/plugins/content-releases");
1282
+ navigate("..");
1251
1283
  } else if (isAxiosError(response.error)) {
1252
1284
  toggleNotification({
1253
- type: "warning",
1285
+ type: "danger",
1254
1286
  message: formatAPIError(response.error)
1255
1287
  });
1256
1288
  } else {
1257
1289
  toggleNotification({
1258
- type: "warning",
1290
+ type: "danger",
1259
1291
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
1260
1292
  });
1261
1293
  }
@@ -1266,7 +1298,7 @@ const ReleaseDetailsPage = () => {
1266
1298
  toggleEditReleaseModal,
1267
1299
  toggleWarningSubmit,
1268
1300
  children: [
1269
- /* @__PURE__ */ jsx(ReleaseDetailsBody, {}),
1301
+ /* @__PURE__ */ jsx(ReleaseDetailsBody, { releaseId }),
1270
1302
  releaseModalShown && /* @__PURE__ */ jsx(
1271
1303
  ReleaseModal,
1272
1304
  {
@@ -1286,14 +1318,13 @@ const ReleaseDetailsPage = () => {
1286
1318
  /* @__PURE__ */ jsx(
1287
1319
  ConfirmDialog,
1288
1320
  {
1289
- bodyText: {
1321
+ isOpen: showWarningSubmit,
1322
+ onClose: toggleWarningSubmit,
1323
+ onConfirm: handleDeleteRelease,
1324
+ children: formatMessage({
1290
1325
  id: "content-releases.dialog.confirmation-message",
1291
1326
  defaultMessage: "Are you sure you want to delete this release?"
1292
- },
1293
- isOpen: showWarningSubmit,
1294
- isConfirmButtonLoading: isDeletingRelease,
1295
- onToggleDialog: toggleWarningSubmit,
1296
- onConfirm: handleDeleteRelease
1327
+ })
1297
1328
  }
1298
1329
  )
1299
1330
  ]
@@ -1301,12 +1332,12 @@ const ReleaseDetailsPage = () => {
1301
1332
  );
1302
1333
  };
1303
1334
  const App = () => {
1304
- return /* @__PURE__ */ jsx(CheckPagePermissions, { permissions: PERMISSIONS.main, children: /* @__PURE__ */ jsxs(Switch, { children: [
1305
- /* @__PURE__ */ jsx(Route, { exact: true, path: `/plugins/${pluginId}`, component: ReleasesPage }),
1306
- /* @__PURE__ */ jsx(Route, { exact: true, path: `/plugins/${pluginId}/:releaseId`, component: ReleaseDetailsPage })
1335
+ return /* @__PURE__ */ jsx(Page.Protect, { permissions: PERMISSIONS.main, children: /* @__PURE__ */ jsxs(Routes, { children: [
1336
+ /* @__PURE__ */ jsx(Route, { index: true, element: /* @__PURE__ */ jsx(ReleasesPage, {}) }),
1337
+ /* @__PURE__ */ jsx(Route, { path: ":releaseId", element: /* @__PURE__ */ jsx(ReleaseDetailsPage, {}) })
1307
1338
  ] }) });
1308
1339
  };
1309
1340
  export {
1310
1341
  App
1311
1342
  };
1312
- //# sourceMappingURL=App-XbK-TdJn.mjs.map
1343
+ //# sourceMappingURL=App-BsUSTHVD.mjs.map