@strapi/content-releases 0.0.0-experimental.e5740babedd53cf5b6af99d74920b6b9ef1e4c11 → 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-HVXzE3i3.mjs → App-BsUSTHVD.mjs} +243 -213
  2. package/dist/_chunks/App-BsUSTHVD.mjs.map +1 -0
  3. package/dist/_chunks/{App-l62gIUTX.js → App-CXRpb2hi.js} +258 -228
  4. package/dist/_chunks/App-CXRpb2hi.js.map +1 -0
  5. package/dist/_chunks/{PurchaseContentReleases-YhAPgpG9.js → PurchaseContentReleases-Be3acS2L.js} +8 -7
  6. package/dist/_chunks/PurchaseContentReleases-Be3acS2L.js.map +1 -0
  7. package/dist/_chunks/{PurchaseContentReleases-Clm0iACO.mjs → PurchaseContentReleases-_MxP6-Dt.mjs} +9 -8
  8. package/dist/_chunks/PurchaseContentReleases-_MxP6-Dt.mjs.map +1 -0
  9. package/dist/_chunks/{en-RdapH-9X.mjs → en-B9Ur3VsE.mjs} +11 -2
  10. package/dist/_chunks/en-B9Ur3VsE.mjs.map +1 -0
  11. package/dist/_chunks/{en-faJDuv3q.js → en-DtFJ5ViE.js} +11 -2
  12. package/dist/_chunks/en-DtFJ5ViE.js.map +1 -0
  13. package/dist/_chunks/{index-ML_b3php.js → index-B6-lic1Q.js} +340 -113
  14. package/dist/_chunks/index-B6-lic1Q.js.map +1 -0
  15. package/dist/_chunks/{index-Ys87ROOe.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-HVXzE3i3.mjs.map +0 -1
  104. package/dist/_chunks/App-l62gIUTX.js.map +0 -1
  105. package/dist/_chunks/PurchaseContentReleases-Clm0iACO.mjs.map +0 -1
  106. package/dist/_chunks/PurchaseContentReleases-YhAPgpG9.js.map +0 -1
  107. package/dist/_chunks/en-RdapH-9X.mjs.map +0 -1
  108. package/dist/_chunks/en-faJDuv3q.js.map +0 -1
  109. package/dist/_chunks/index-ML_b3php.js.map +0 -1
  110. package/dist/_chunks/index-Ys87ROOe.mjs.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-Ys87ROOe.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, parse } 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(),
@@ -54,9 +82,8 @@ const ReleaseModal = ({
54
82
  const { date, time, timezone } = values;
55
83
  if (!date || !time || !timezone)
56
84
  return null;
57
- const formattedDate = parse(time, "HH:mm", new Date(date));
58
85
  const timezoneWithoutOffset = timezone.split("&")[1];
59
- return zonedTimeToUtc(formattedDate, timezoneWithoutOffset);
86
+ return zonedTimeToUtc(`${date} ${time}`, timezoneWithoutOffset);
60
87
  };
61
88
  const getTimezoneWithOffset = () => {
62
89
  const currentTimezone = timezoneList.find(
@@ -256,11 +283,15 @@ const TimezoneComponent = ({ timezoneOptions }) => {
256
283
  }
257
284
  );
258
285
  };
286
+ const useTypedDispatch = useDispatch;
259
287
  const LinkCard = styled(Link)`
260
288
  display: block;
261
289
  `;
262
- const CapitalizeRelativeTime = styled(RelativeTime)`
263
- text-transform: capitalize;
290
+ const RelativeTime = styled(RelativeTime$1)`
291
+ display: inline-block;
292
+ &::first-letter {
293
+ text-transform: uppercase;
294
+ }
264
295
  `;
265
296
  const getBadgeProps = (status) => {
266
297
  let color;
@@ -290,7 +321,7 @@ const getBadgeProps = (status) => {
290
321
  const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
291
322
  const { formatMessage } = useIntl();
292
323
  if (isError) {
293
- return /* @__PURE__ */ jsx(AnErrorOccurred, {});
324
+ return /* @__PURE__ */ jsx(Page.Error, {});
294
325
  }
295
326
  if (releases?.length === 0) {
296
327
  return /* @__PURE__ */ jsx(
@@ -305,7 +336,7 @@ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
305
336
  target: sectionTitle
306
337
  }
307
338
  ),
308
- icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "10rem" })
339
+ icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "16rem" })
309
340
  }
310
341
  );
311
342
  }
@@ -325,7 +356,7 @@ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
325
356
  children: [
326
357
  /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "start", gap: 1, children: [
327
358
  /* @__PURE__ */ jsx(Typography, { as: "h3", variant: "delta", fontWeight: "bold", children: name }),
328
- /* @__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({
329
360
  id: "content-releases.pages.Releases.not-scheduled",
330
361
  defaultMessage: "Not scheduled"
331
362
  }) })
@@ -355,9 +386,9 @@ const ReleasesPage = () => {
355
386
  const tabRef = React.useRef(null);
356
387
  const location = useLocation();
357
388
  const [releaseModalShown, setReleaseModalShown] = React.useState(false);
358
- const toggleNotification = useNotification();
389
+ const { toggleNotification } = useNotification();
359
390
  const { formatMessage } = useIntl();
360
- const { push, replace } = useHistory();
391
+ const navigate = useNavigate();
361
392
  const { formatAPIError } = useAPIErrorHandler();
362
393
  const [{ query }, setQuery] = useQueryParams();
363
394
  const response = useGetReleasesQuery(query);
@@ -365,13 +396,16 @@ const ReleasesPage = () => {
365
396
  const { getFeature } = useLicenseLimits();
366
397
  const { maximumReleases = 3 } = getFeature("cms-content-releases");
367
398
  const { trackUsage } = useTracking();
399
+ const {
400
+ allowedActions: { canCreate }
401
+ } = useRBAC(PERMISSIONS);
368
402
  const { isLoading, isSuccess, isError } = response;
369
403
  const activeTab = response?.currentData?.meta?.activeTab || "pending";
370
404
  const activeTabIndex = ["pending", "done"].indexOf(activeTab);
371
405
  React.useEffect(() => {
372
406
  if (location?.state?.errors) {
373
407
  toggleNotification({
374
- type: "warning",
408
+ type: "danger",
375
409
  title: formatMessage({
376
410
  id: "content-releases.pages.Releases.notification.error.title",
377
411
  defaultMessage: "Your request could not be processed."
@@ -381,9 +415,9 @@ const ReleasesPage = () => {
381
415
  defaultMessage: "Please try again or open another release."
382
416
  })
383
417
  });
384
- replace({ state: null });
418
+ navigate("", { replace: true, state: null });
385
419
  }
386
- }, [formatMessage, location?.state?.errors, replace, toggleNotification]);
420
+ }, [formatMessage, location?.state?.errors, navigate, toggleNotification]);
387
421
  React.useEffect(() => {
388
422
  if (tabRef.current) {
389
423
  tabRef.current._handlers.setSelectedTabIndex(activeTabIndex);
@@ -393,7 +427,7 @@ const ReleasesPage = () => {
393
427
  setReleaseModalShown((prev) => !prev);
394
428
  };
395
429
  if (isLoading) {
396
- return /* @__PURE__ */ jsx(Main, { "aria-busy": isLoading, children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) });
430
+ return /* @__PURE__ */ jsx(Page.Loading, {});
397
431
  }
398
432
  const totalPendingReleases = isSuccess && response.currentData?.meta?.pendingReleasesCount || 0;
399
433
  const hasReachedMaximumPendingReleases = totalPendingReleases >= maximumReleases;
@@ -424,22 +458,22 @@ const ReleasesPage = () => {
424
458
  })
425
459
  });
426
460
  trackUsage("didCreateRelease");
427
- push(`/plugins/content-releases/${response2.data.data.id}`);
461
+ navigate(response2.data.data.id.toString());
428
462
  } else if (isAxiosError(response2.error)) {
429
463
  toggleNotification({
430
- type: "warning",
464
+ type: "danger",
431
465
  message: formatAPIError(response2.error)
432
466
  });
433
467
  } else {
434
468
  toggleNotification({
435
- type: "warning",
469
+ type: "danger",
436
470
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
437
471
  });
438
472
  }
439
473
  };
440
474
  return /* @__PURE__ */ jsxs(Main, { "aria-busy": isLoading, children: [
441
475
  /* @__PURE__ */ jsx(
442
- HeaderLayout,
476
+ Layouts.Header,
443
477
  {
444
478
  title: formatMessage({
445
479
  id: "content-releases.pages.Releases.title",
@@ -449,7 +483,7 @@ const ReleasesPage = () => {
449
483
  id: "content-releases.pages.Releases.header-subtitle",
450
484
  defaultMessage: "Create and manage content updates"
451
485
  }),
452
- primaryAction: /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.create, children: /* @__PURE__ */ jsx(
486
+ primaryAction: canCreate ? /* @__PURE__ */ jsx(
453
487
  Button,
454
488
  {
455
489
  startIcon: /* @__PURE__ */ jsx(Plus, {}),
@@ -460,10 +494,10 @@ const ReleasesPage = () => {
460
494
  defaultMessage: "New release"
461
495
  })
462
496
  }
463
- ) })
497
+ ) : null
464
498
  }
465
499
  ),
466
- /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsxs(Fragment, { children: [
500
+ /* @__PURE__ */ jsx(Layouts.Content, { children: /* @__PURE__ */ jsxs(Fragment, { children: [
467
501
  hasReachedMaximumPendingReleases && /* @__PURE__ */ jsx(
468
502
  StyledAlert,
469
503
  {
@@ -539,23 +573,17 @@ const ReleasesPage = () => {
539
573
  ]
540
574
  }
541
575
  ),
542
- response.currentData?.meta?.pagination?.total ? /* @__PURE__ */ jsxs(Flex, { paddingTop: 4, alignItems: "flex-end", justifyContent: "space-between", children: [
543
- /* @__PURE__ */ jsx(
544
- PageSizeURLQuery,
545
- {
546
- options: ["8", "16", "32", "64"],
547
- defaultValue: response?.currentData?.meta?.pagination?.pageSize.toString()
548
- }
549
- ),
550
- /* @__PURE__ */ jsx(
551
- PaginationURLQuery,
552
- {
553
- pagination: {
554
- pageCount: response?.currentData?.meta?.pagination?.pageCount || 0
555
- }
556
- }
557
- )
558
- ] }) : 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
+ )
559
587
  ] }) }),
560
588
  releaseModalShown && /* @__PURE__ */ jsx(
561
589
  ReleaseModal,
@@ -603,14 +631,18 @@ const TrashIcon = styled(Trash)`
603
631
  const TypographyMaxWidth = styled(Typography)`
604
632
  max-width: 300px;
605
633
  `;
606
- const EntryValidationText = ({ action, schema, components, entry }) => {
634
+ const EntryValidationText = ({ action, schema, entry }) => {
607
635
  const { formatMessage } = useIntl();
608
- const { validate } = unstable_useDocument();
609
- const { errors } = validate(entry, {
610
- contentType: schema,
611
- components,
612
- isCreatingEntry: false
613
- });
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) ?? {};
614
646
  if (Object.keys(errors).length > 0) {
615
647
  const validationErrorsMessages = Object.entries(errors).map(
616
648
  ([key, value]) => formatMessage(
@@ -619,13 +651,13 @@ const EntryValidationText = ({ action, schema, components, entry }) => {
619
651
  )
620
652
  ).join(" ");
621
653
  return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
622
- /* @__PURE__ */ jsx(Icon, { color: "danger600", as: CrossCircle }),
654
+ /* @__PURE__ */ jsx(CrossCircle, { fill: "danger600" }),
623
655
  /* @__PURE__ */ jsx(Tooltip, { description: validationErrorsMessages, children: /* @__PURE__ */ jsx(TypographyMaxWidth, { textColor: "danger600", variant: "omega", fontWeight: "semiBold", ellipsis: true, children: validationErrorsMessages }) })
624
656
  ] });
625
657
  }
626
658
  if (action == "publish") {
627
659
  return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
628
- /* @__PURE__ */ jsx(Icon, { color: "success600", as: CheckCircle }),
660
+ /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
629
661
  entry.publishedAt ? /* @__PURE__ */ jsx(Typography, { textColor: "success600", fontWeight: "bold", children: formatMessage({
630
662
  id: "content-releases.pages.ReleaseDetails.entry-validation.already-published",
631
663
  defaultMessage: "Already published"
@@ -636,7 +668,7 @@ const EntryValidationText = ({ action, schema, components, entry }) => {
636
668
  ] });
637
669
  }
638
670
  return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
639
- /* @__PURE__ */ jsx(Icon, { color: "success600", as: CheckCircle }),
671
+ /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
640
672
  !entry.publishedAt ? /* @__PURE__ */ jsx(Typography, { textColor: "success600", fontWeight: "bold", children: formatMessage({
641
673
  id: "content-releases.pages.ReleaseDetails.entry-validation.already-unpublished",
642
674
  defaultMessage: "Already unpublished"
@@ -658,18 +690,22 @@ const ReleaseDetailsLayout = ({
658
690
  isLoading: isLoadingDetails,
659
691
  isError,
660
692
  error
661
- } = useGetReleaseQuery({ id: releaseId });
693
+ } = useGetReleaseQuery(
694
+ { id: releaseId },
695
+ {
696
+ skip: !releaseId
697
+ }
698
+ );
662
699
  const [publishRelease, { isLoading: isPublishing }] = usePublishReleaseMutation();
663
- const toggleNotification = useNotification();
700
+ const { toggleNotification } = useNotification();
664
701
  const { formatAPIError } = useAPIErrorHandler();
665
- const {
666
- allowedActions: { canUpdate, canDelete }
667
- } = useRBAC(PERMISSIONS);
702
+ const { allowedActions } = useRBAC(PERMISSIONS);
703
+ const { canUpdate, canDelete, canPublish } = allowedActions;
668
704
  const dispatch = useTypedDispatch();
669
705
  const { trackUsage } = useTracking();
670
706
  const release = data?.data;
671
- const handlePublishRelease = async () => {
672
- const response = await publishRelease({ id: releaseId });
707
+ const handlePublishRelease = (id) => async () => {
708
+ const response = await publishRelease({ id });
673
709
  if ("data" in response) {
674
710
  toggleNotification({
675
711
  type: "success",
@@ -686,12 +722,12 @@ const ReleaseDetailsLayout = ({
686
722
  });
687
723
  } else if (isAxiosError(response.error)) {
688
724
  toggleNotification({
689
- type: "warning",
725
+ type: "danger",
690
726
  message: formatAPIError(response.error)
691
727
  });
692
728
  } else {
693
729
  toggleNotification({
694
- type: "warning",
730
+ type: "danger",
695
731
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
696
732
  });
697
733
  }
@@ -717,21 +753,19 @@ const ReleaseDetailsLayout = ({
717
753
  return release.createdBy.email;
718
754
  };
719
755
  if (isLoadingDetails) {
720
- return /* @__PURE__ */ jsx(Main, { "aria-busy": isLoadingDetails, children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) });
756
+ return /* @__PURE__ */ jsx(Page.Loading, {});
721
757
  }
722
758
  if (isError || !release) {
723
759
  return /* @__PURE__ */ jsx(
724
- Redirect,
760
+ Navigate,
725
761
  {
726
- to: {
727
- pathname: "/plugins/content-releases",
728
- state: {
729
- errors: [
730
- {
731
- code: error?.code
732
- }
733
- ]
734
- }
762
+ to: "..",
763
+ state: {
764
+ errors: [
765
+ {
766
+ code: error?.code
767
+ }
768
+ ]
735
769
  }
736
770
  }
737
771
  );
@@ -768,17 +802,14 @@ const ReleaseDetailsLayout = ({
768
802
  ) : "";
769
803
  return /* @__PURE__ */ jsxs(Main, { "aria-busy": isLoadingDetails, children: [
770
804
  /* @__PURE__ */ jsx(
771
- HeaderLayout,
805
+ Layouts.Header,
772
806
  {
773
807
  title: release.name,
774
808
  subtitle: /* @__PURE__ */ jsxs(Flex, { gap: 2, lineHeight: 6, children: [
775
809
  /* @__PURE__ */ jsx(Typography, { textColor: "neutral600", variant: "epsilon", children: numberOfEntriesText + (isScheduled ? ` - ${scheduledText}` : "") }),
776
810
  /* @__PURE__ */ jsx(Badge, { ...getBadgeProps(release.status), children: release.status })
777
811
  ] }),
778
- navigationAction: /* @__PURE__ */ jsx(Link$1, { startIcon: /* @__PURE__ */ jsx(ArrowLeft, {}), to: "/plugins/content-releases", children: formatMessage({
779
- id: "global.back",
780
- defaultMessage: "Back"
781
- }) }),
812
+ navigationAction: /* @__PURE__ */ jsx(BackButton, {}),
782
813
  primaryAction: !release.releasedAt && /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
783
814
  /* @__PURE__ */ jsxs(Menu.Root, { children: [
784
815
  /* @__PURE__ */ jsx(
@@ -795,7 +826,7 @@ const ReleaseDetailsLayout = ({
795
826
  variant: "tertiary"
796
827
  }
797
828
  ),
798
- /* @__PURE__ */ jsxs(Menu.Content, { top: 1, popoverPlacement: "bottom-end", children: [
829
+ /* @__PURE__ */ jsxs(Menu.Content, { top: 1, popoverPlacement: "bottom-end", maxHeight: void 0, children: [
799
830
  /* @__PURE__ */ jsxs(
800
831
  Flex,
801
832
  {
@@ -844,7 +875,7 @@ const ReleaseDetailsLayout = ({
844
875
  defaultMessage: "Created"
845
876
  }) }),
846
877
  /* @__PURE__ */ jsxs(Typography, { variant: "pi", color: "neutral300", children: [
847
- /* @__PURE__ */ jsx(RelativeTime, { timestamp: new Date(release.createdAt) }),
878
+ /* @__PURE__ */ jsx(RelativeTime$1, { timestamp: new Date(release.createdAt) }),
848
879
  formatMessage(
849
880
  {
850
881
  id: "content-releases.header.actions.created.description",
@@ -862,12 +893,12 @@ const ReleaseDetailsLayout = ({
862
893
  id: "content-releases.header.actions.refresh",
863
894
  defaultMessage: "Refresh"
864
895
  }) }),
865
- /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.publish, children: /* @__PURE__ */ jsx(
896
+ canPublish ? /* @__PURE__ */ jsx(
866
897
  Button,
867
898
  {
868
899
  size: "S",
869
900
  variant: "default",
870
- onClick: handlePublishRelease,
901
+ onClick: handlePublishRelease(release.id.toString()),
871
902
  loading: isPublishing,
872
903
  disabled: release.actions.meta.count === 0,
873
904
  children: formatMessage({
@@ -875,7 +906,7 @@ const ReleaseDetailsLayout = ({
875
906
  defaultMessage: "Publish"
876
907
  })
877
908
  }
878
- ) })
909
+ ) : null
879
910
  ] })
880
911
  }
881
912
  ),
@@ -883,6 +914,7 @@ const ReleaseDetailsLayout = ({
883
914
  ] });
884
915
  };
885
916
  const GROUP_BY_OPTIONS = ["contentType", "locale", "action"];
917
+ const GROUP_BY_OPTIONS_NO_LOCALE = ["contentType", "action"];
886
918
  const getGroupByOptionLabel = (value) => {
887
919
  if (value === "locale") {
888
920
  return {
@@ -901,11 +933,10 @@ const getGroupByOptionLabel = (value) => {
901
933
  defaultMessage: "Content-Types"
902
934
  };
903
935
  };
904
- const ReleaseDetailsBody = () => {
936
+ const ReleaseDetailsBody = ({ releaseId }) => {
905
937
  const { formatMessage } = useIntl();
906
- const { releaseId } = useParams();
907
938
  const [{ query }, setQuery] = useQueryParams();
908
- const toggleNotification = useNotification();
939
+ const { toggleNotification } = useNotification();
909
940
  const { formatAPIError } = useAPIErrorHandler();
910
941
  const {
911
942
  data: releaseData,
@@ -916,6 +947,20 @@ const ReleaseDetailsBody = () => {
916
947
  const {
917
948
  allowedActions: { canUpdate }
918
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
+ );
919
964
  const release = releaseData?.data;
920
965
  const selectedGroupBy = query?.groupBy || "contentType";
921
966
  const {
@@ -946,19 +991,19 @@ const ReleaseDetailsBody = () => {
946
991
  if ("error" in response) {
947
992
  if (isAxiosError(response.error)) {
948
993
  toggleNotification({
949
- type: "warning",
994
+ type: "danger",
950
995
  message: formatAPIError(response.error)
951
996
  });
952
997
  } else {
953
998
  toggleNotification({
954
- type: "warning",
999
+ type: "danger",
955
1000
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
956
1001
  });
957
1002
  }
958
1003
  }
959
1004
  };
960
1005
  if (isLoading || isReleaseLoading) {
961
- return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) });
1006
+ return /* @__PURE__ */ jsx(Page.Loading, {});
962
1007
  }
963
1008
  const releaseActions = data?.data;
964
1009
  const releaseMeta = data?.meta;
@@ -977,32 +1022,26 @@ const ReleaseDetailsBody = () => {
977
1022
  });
978
1023
  }
979
1024
  return /* @__PURE__ */ jsx(
980
- Redirect,
1025
+ Navigate,
981
1026
  {
982
- to: {
983
- pathname: "/plugins/content-releases",
984
- state: {
985
- errors: errorsArray
986
- }
1027
+ to: "..",
1028
+ state: {
1029
+ errors: errorsArray
987
1030
  }
988
1031
  }
989
1032
  );
990
1033
  }
991
1034
  if (isError || !releaseActions) {
992
- return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(AnErrorOccurred, {}) });
1035
+ return /* @__PURE__ */ jsx(Page.Error, {});
993
1036
  }
994
1037
  if (Object.keys(releaseActions).length === 0) {
995
- return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(
996
- NoContent,
1038
+ return /* @__PURE__ */ jsx(Layouts.Content, { children: /* @__PURE__ */ jsx(
1039
+ EmptyStateLayout,
997
1040
  {
998
- content: {
999
- id: "content-releases.pages.Details.tab.emptyEntries",
1000
- defaultMessage: "This release is empty. Open the Content Manager, select an entry and add it to the release."
1001
- },
1002
1041
  action: /* @__PURE__ */ jsx(
1003
1042
  LinkButton,
1004
1043
  {
1005
- as: Link$2,
1044
+ as: Link$1,
1006
1045
  to: {
1007
1046
  pathname: "/content-manager"
1008
1047
  },
@@ -1013,18 +1052,59 @@ const ReleaseDetailsBody = () => {
1013
1052
  defaultMessage: "Open the Content Manager"
1014
1053
  })
1015
1054
  }
1016
- )
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
+ })
1017
1061
  }
1018
1062
  ) });
1019
1063
  }
1020
- 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: [
1021
1103
  /* @__PURE__ */ jsx(Flex, { children: /* @__PURE__ */ jsx(
1022
1104
  SingleSelect,
1023
1105
  {
1024
- "aria-label": formatMessage({
1025
- id: "content-releases.pages.ReleaseDetails.groupBy.aria-label",
1026
- defaultMessage: "Group by"
1027
- }),
1106
+ placeholder: groupByLabel,
1107
+ "aria-label": groupByLabel,
1028
1108
  customizeContent: (value) => formatMessage(
1029
1109
  {
1030
1110
  id: `content-releases.pages.ReleaseDetails.groupBy.label`,
@@ -1036,7 +1116,7 @@ const ReleaseDetailsBody = () => {
1036
1116
  ),
1037
1117
  value: formatMessage(getGroupByOptionLabel(selectedGroupBy)),
1038
1118
  onChange: (value) => setQuery({ groupBy: value }),
1039
- 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))
1040
1120
  }
1041
1121
  ) }),
1042
1122
  Object.keys(releaseActions).map((key) => /* @__PURE__ */ jsxs(Flex, { gap: 4, direction: "column", alignItems: "stretch", children: [
@@ -1048,72 +1128,15 @@ const ReleaseDetailsBody = () => {
1048
1128
  ...item,
1049
1129
  id: Number(item.entry.id)
1050
1130
  })),
1051
- colCount: releaseActions[key].length,
1052
- isLoading,
1053
- isFetching,
1131
+ headers,
1132
+ isLoading: isLoading || isFetching,
1054
1133
  children: /* @__PURE__ */ jsxs(Table.Content, { children: [
1055
- /* @__PURE__ */ jsxs(Table.Head, { children: [
1056
- /* @__PURE__ */ jsx(
1057
- Table.HeaderCell,
1058
- {
1059
- fieldSchemaType: "string",
1060
- label: formatMessage({
1061
- id: "content-releases.page.ReleaseDetails.table.header.label.name",
1062
- defaultMessage: "name"
1063
- }),
1064
- name: "name"
1065
- }
1066
- ),
1067
- /* @__PURE__ */ jsx(
1068
- Table.HeaderCell,
1069
- {
1070
- fieldSchemaType: "string",
1071
- label: formatMessage({
1072
- id: "content-releases.page.ReleaseDetails.table.header.label.locale",
1073
- defaultMessage: "locale"
1074
- }),
1075
- name: "locale"
1076
- }
1077
- ),
1078
- /* @__PURE__ */ jsx(
1079
- Table.HeaderCell,
1080
- {
1081
- fieldSchemaType: "string",
1082
- label: formatMessage({
1083
- id: "content-releases.page.ReleaseDetails.table.header.label.content-type",
1084
- defaultMessage: "content-type"
1085
- }),
1086
- name: "content-type"
1087
- }
1088
- ),
1089
- /* @__PURE__ */ jsx(
1090
- Table.HeaderCell,
1091
- {
1092
- fieldSchemaType: "string",
1093
- label: formatMessage({
1094
- id: "content-releases.page.ReleaseDetails.table.header.label.action",
1095
- defaultMessage: "action"
1096
- }),
1097
- name: "action"
1098
- }
1099
- ),
1100
- !release.releasedAt && /* @__PURE__ */ jsx(
1101
- Table.HeaderCell,
1102
- {
1103
- fieldSchemaType: "string",
1104
- label: formatMessage({
1105
- id: "content-releases.page.ReleaseDetails.table.header.label.status",
1106
- defaultMessage: "status"
1107
- }),
1108
- name: "status"
1109
- }
1110
- )
1111
- ] }),
1112
- /* @__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, {}),
1113
1136
  /* @__PURE__ */ jsx(Table.Body, { children: releaseActions[key].map(
1114
1137
  ({ id, contentType, locale, type, entry }, actionIndex) => /* @__PURE__ */ jsxs(Tr, { children: [
1115
1138
  /* @__PURE__ */ jsx(Td, { width: "25%", maxWidth: "200px", children: /* @__PURE__ */ jsx(Typography, { ellipsis: true, children: `${contentType.mainFieldValue || entry.id}` }) }),
1116
- /* @__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 : "-"}` }) }),
1117
1140
  /* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: contentType.displayName || "" }) }),
1118
1141
  /* @__PURE__ */ jsx(Td, { width: "20%", children: release.releasedAt ? /* @__PURE__ */ jsx(Typography, { children: formatMessage(
1119
1142
  {
@@ -1167,34 +1190,39 @@ const ReleaseDetailsBody = () => {
1167
1190
  }
1168
1191
  )
1169
1192
  ] }, `releases-group-${key}`)),
1170
- /* @__PURE__ */ jsxs(Flex, { paddingTop: 4, alignItems: "flex-end", justifyContent: "space-between", children: [
1171
- /* @__PURE__ */ jsx(PageSizeURLQuery, { defaultValue: releaseMeta?.pagination?.pageSize.toString() }),
1172
- /* @__PURE__ */ jsx(
1173
- PaginationURLQuery,
1174
- {
1175
- pagination: {
1176
- pageCount: releaseMeta?.pagination?.pageCount || 0
1177
- }
1178
- }
1179
- )
1180
- ] })
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
+ )
1181
1204
  ] }) });
1182
1205
  };
1183
1206
  const ReleaseDetailsPage = () => {
1184
1207
  const { formatMessage } = useIntl();
1185
1208
  const { releaseId } = useParams();
1186
- const toggleNotification = useNotification();
1209
+ const { toggleNotification } = useNotification();
1187
1210
  const { formatAPIError } = useAPIErrorHandler();
1188
- const { replace } = useHistory();
1211
+ const navigate = useNavigate();
1189
1212
  const [releaseModalShown, setReleaseModalShown] = React.useState(false);
1190
1213
  const [showWarningSubmit, setWarningSubmit] = React.useState(false);
1191
1214
  const {
1192
1215
  isLoading: isLoadingDetails,
1193
1216
  data,
1194
1217
  isSuccess: isSuccessDetails
1195
- } = useGetReleaseQuery({ id: releaseId });
1218
+ } = useGetReleaseQuery(
1219
+ { id: releaseId },
1220
+ {
1221
+ skip: !releaseId
1222
+ }
1223
+ );
1196
1224
  const [updateRelease, { isLoading: isSubmittingForm }] = useUpdateReleaseMutation();
1197
- const [deleteRelease, { isLoading: isDeletingRelease }] = useDeleteReleaseMutation();
1225
+ const [deleteRelease] = useDeleteReleaseMutation();
1198
1226
  const toggleEditReleaseModal = () => {
1199
1227
  setReleaseModalShown((prev) => !prev);
1200
1228
  };
@@ -1205,15 +1233,18 @@ const ReleaseDetailsPage = () => {
1205
1233
  {
1206
1234
  toggleEditReleaseModal,
1207
1235
  toggleWarningSubmit,
1208
- children: /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) })
1236
+ children: /* @__PURE__ */ jsx(Page.Loading, {})
1209
1237
  }
1210
1238
  );
1211
1239
  }
1240
+ if (!releaseId) {
1241
+ return /* @__PURE__ */ jsx(Navigate, { to: ".." });
1242
+ }
1212
1243
  const releaseData = isSuccessDetails && data?.data || null;
1213
1244
  const title = releaseData?.name || "";
1214
1245
  const timezone = releaseData?.timezone ?? null;
1215
1246
  const scheduledAt = releaseData?.scheduledAt && timezone ? utcToZonedTime(releaseData.scheduledAt, timezone) : null;
1216
- const date = scheduledAt ? new Date(format(scheduledAt, "yyyy-MM-dd")) : null;
1247
+ const date = scheduledAt ? format(scheduledAt, "yyyy-MM-dd") : null;
1217
1248
  const time = scheduledAt ? format(scheduledAt, "HH:mm") : "";
1218
1249
  const handleEditRelease = async (values) => {
1219
1250
  const response = await updateRelease({
@@ -1230,33 +1261,33 @@ const ReleaseDetailsPage = () => {
1230
1261
  defaultMessage: "Release updated."
1231
1262
  })
1232
1263
  });
1264
+ toggleEditReleaseModal();
1233
1265
  } else if (isAxiosError(response.error)) {
1234
1266
  toggleNotification({
1235
- type: "warning",
1267
+ type: "danger",
1236
1268
  message: formatAPIError(response.error)
1237
1269
  });
1238
1270
  } else {
1239
1271
  toggleNotification({
1240
- type: "warning",
1272
+ type: "danger",
1241
1273
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
1242
1274
  });
1243
1275
  }
1244
- toggleEditReleaseModal();
1245
1276
  };
1246
1277
  const handleDeleteRelease = async () => {
1247
1278
  const response = await deleteRelease({
1248
1279
  id: releaseId
1249
1280
  });
1250
1281
  if ("data" in response) {
1251
- replace("/plugins/content-releases");
1282
+ navigate("..");
1252
1283
  } else if (isAxiosError(response.error)) {
1253
1284
  toggleNotification({
1254
- type: "warning",
1285
+ type: "danger",
1255
1286
  message: formatAPIError(response.error)
1256
1287
  });
1257
1288
  } else {
1258
1289
  toggleNotification({
1259
- type: "warning",
1290
+ type: "danger",
1260
1291
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
1261
1292
  });
1262
1293
  }
@@ -1267,7 +1298,7 @@ const ReleaseDetailsPage = () => {
1267
1298
  toggleEditReleaseModal,
1268
1299
  toggleWarningSubmit,
1269
1300
  children: [
1270
- /* @__PURE__ */ jsx(ReleaseDetailsBody, {}),
1301
+ /* @__PURE__ */ jsx(ReleaseDetailsBody, { releaseId }),
1271
1302
  releaseModalShown && /* @__PURE__ */ jsx(
1272
1303
  ReleaseModal,
1273
1304
  {
@@ -1287,14 +1318,13 @@ const ReleaseDetailsPage = () => {
1287
1318
  /* @__PURE__ */ jsx(
1288
1319
  ConfirmDialog,
1289
1320
  {
1290
- bodyText: {
1321
+ isOpen: showWarningSubmit,
1322
+ onClose: toggleWarningSubmit,
1323
+ onConfirm: handleDeleteRelease,
1324
+ children: formatMessage({
1291
1325
  id: "content-releases.dialog.confirmation-message",
1292
1326
  defaultMessage: "Are you sure you want to delete this release?"
1293
- },
1294
- isOpen: showWarningSubmit,
1295
- isConfirmButtonLoading: isDeletingRelease,
1296
- onToggleDialog: toggleWarningSubmit,
1297
- onConfirm: handleDeleteRelease
1327
+ })
1298
1328
  }
1299
1329
  )
1300
1330
  ]
@@ -1302,12 +1332,12 @@ const ReleaseDetailsPage = () => {
1302
1332
  );
1303
1333
  };
1304
1334
  const App = () => {
1305
- return /* @__PURE__ */ jsx(CheckPagePermissions, { permissions: PERMISSIONS.main, children: /* @__PURE__ */ jsxs(Switch, { children: [
1306
- /* @__PURE__ */ jsx(Route, { exact: true, path: `/plugins/${pluginId}`, component: ReleasesPage }),
1307
- /* @__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, {}) })
1308
1338
  ] }) });
1309
1339
  };
1310
1340
  export {
1311
1341
  App
1312
1342
  };
1313
- //# sourceMappingURL=App-HVXzE3i3.mjs.map
1343
+ //# sourceMappingURL=App-BsUSTHVD.mjs.map