@strapi/content-releases 0.0.0-experimental.d8a676a242377cee820b59b21a05d47290d9ac73 → 0.0.0-experimental.e3e48deb89bd0a1b6cc69b698696566fa7854a95

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 (93) hide show
  1. package/dist/_chunks/{App-bpzO2Ljh.mjs → App-PQlYzNfb.mjs} +181 -167
  2. package/dist/_chunks/App-PQlYzNfb.mjs.map +1 -0
  3. package/dist/_chunks/{App-p8aKBitd.js → App-lzeJz92X.js} +179 -165
  4. package/dist/_chunks/App-lzeJz92X.js.map +1 -0
  5. package/dist/_chunks/{index-AECgcaDa.mjs → index--4AgLDzb.mjs} +20 -26
  6. package/dist/_chunks/index--4AgLDzb.mjs.map +1 -0
  7. package/dist/_chunks/{index-fP3qoWZ4.js → index-Nf1JfI-m.js} +16 -22
  8. package/dist/_chunks/index-Nf1JfI-m.js.map +1 -0
  9. package/dist/admin/index.js +1 -1
  10. package/dist/admin/index.mjs +1 -1
  11. package/dist/admin/src/components/CMReleasesContainer.d.ts +1 -0
  12. package/dist/admin/src/components/RelativeTime.d.ts +28 -0
  13. package/dist/admin/src/components/ReleaseActionMenu.d.ts +26 -0
  14. package/dist/admin/src/components/ReleaseActionOptions.d.ts +9 -0
  15. package/dist/admin/src/components/ReleaseModal.d.ts +16 -0
  16. package/dist/admin/src/constants.d.ts +58 -0
  17. package/dist/admin/src/index.d.ts +3 -0
  18. package/dist/admin/src/pages/App.d.ts +1 -0
  19. package/dist/admin/src/pages/PurchaseContentReleases.d.ts +2 -0
  20. package/dist/admin/src/pages/ReleaseDetailsPage.d.ts +2 -0
  21. package/dist/admin/src/pages/ReleasesPage.d.ts +8 -0
  22. package/dist/admin/src/pages/tests/mockReleaseDetailsPageData.d.ts +181 -0
  23. package/dist/admin/src/pages/tests/mockReleasesPageData.d.ts +39 -0
  24. package/dist/admin/src/pluginId.d.ts +1 -0
  25. package/dist/admin/src/services/axios.d.ts +29 -0
  26. package/dist/admin/src/services/release.d.ts +369 -0
  27. package/dist/admin/src/store/hooks.d.ts +7 -0
  28. package/dist/admin/src/utils/time.d.ts +1 -0
  29. package/dist/server/index.js +92 -171
  30. package/dist/server/index.js.map +1 -1
  31. package/dist/server/index.mjs +93 -171
  32. package/dist/server/index.mjs.map +1 -1
  33. package/dist/server/src/bootstrap.d.ts +5 -0
  34. package/dist/server/src/bootstrap.d.ts.map +1 -0
  35. package/dist/server/src/constants.d.ts +12 -0
  36. package/dist/server/src/constants.d.ts.map +1 -0
  37. package/dist/server/src/content-types/index.d.ts +99 -0
  38. package/dist/server/src/content-types/index.d.ts.map +1 -0
  39. package/dist/server/src/content-types/release/index.d.ts +48 -0
  40. package/dist/server/src/content-types/release/index.d.ts.map +1 -0
  41. package/dist/server/src/content-types/release/schema.d.ts +47 -0
  42. package/dist/server/src/content-types/release/schema.d.ts.map +1 -0
  43. package/dist/server/src/content-types/release-action/index.d.ts +50 -0
  44. package/dist/server/src/content-types/release-action/index.d.ts.map +1 -0
  45. package/dist/server/src/content-types/release-action/schema.d.ts +49 -0
  46. package/dist/server/src/content-types/release-action/schema.d.ts.map +1 -0
  47. package/dist/server/src/controllers/index.d.ts +18 -0
  48. package/dist/server/src/controllers/index.d.ts.map +1 -0
  49. package/dist/server/src/controllers/release-action.d.ts +9 -0
  50. package/dist/server/src/controllers/release-action.d.ts.map +1 -0
  51. package/dist/server/src/controllers/release.d.ts +11 -0
  52. package/dist/server/src/controllers/release.d.ts.map +1 -0
  53. package/dist/server/src/controllers/validation/release-action.d.ts +3 -0
  54. package/dist/server/src/controllers/validation/release-action.d.ts.map +1 -0
  55. package/dist/server/src/controllers/validation/release.d.ts +2 -0
  56. package/dist/server/src/controllers/validation/release.d.ts.map +1 -0
  57. package/dist/server/src/destroy.d.ts +5 -0
  58. package/dist/server/src/destroy.d.ts.map +1 -0
  59. package/dist/server/src/index.d.ts +2092 -0
  60. package/dist/server/src/index.d.ts.map +1 -0
  61. package/dist/server/src/migrations/index.d.ts +10 -0
  62. package/dist/server/src/migrations/index.d.ts.map +1 -0
  63. package/dist/server/src/register.d.ts +5 -0
  64. package/dist/server/src/register.d.ts.map +1 -0
  65. package/dist/server/src/routes/index.d.ts +35 -0
  66. package/dist/server/src/routes/index.d.ts.map +1 -0
  67. package/dist/server/src/routes/release-action.d.ts +18 -0
  68. package/dist/server/src/routes/release-action.d.ts.map +1 -0
  69. package/dist/server/src/routes/release.d.ts +18 -0
  70. package/dist/server/src/routes/release.d.ts.map +1 -0
  71. package/dist/server/src/services/index.d.ts +1826 -0
  72. package/dist/server/src/services/index.d.ts.map +1 -0
  73. package/dist/server/src/services/release.d.ts +66 -0
  74. package/dist/server/src/services/release.d.ts.map +1 -0
  75. package/dist/server/src/services/scheduling.d.ts +18 -0
  76. package/dist/server/src/services/scheduling.d.ts.map +1 -0
  77. package/dist/server/src/services/validation.d.ts +14 -0
  78. package/dist/server/src/services/validation.d.ts.map +1 -0
  79. package/dist/server/src/utils/index.d.ts +14 -0
  80. package/dist/server/src/utils/index.d.ts.map +1 -0
  81. package/dist/shared/contracts/release-actions.d.ts +105 -0
  82. package/dist/shared/contracts/release-actions.d.ts.map +1 -0
  83. package/dist/shared/contracts/releases.d.ts +166 -0
  84. package/dist/shared/contracts/releases.d.ts.map +1 -0
  85. package/dist/shared/types.d.ts +24 -0
  86. package/dist/shared/types.d.ts.map +1 -0
  87. package/dist/shared/validation-schemas.d.ts +2 -0
  88. package/dist/shared/validation-schemas.d.ts.map +1 -0
  89. package/package.json +14 -21
  90. package/dist/_chunks/App-bpzO2Ljh.mjs.map +0 -1
  91. package/dist/_chunks/App-p8aKBitd.js.map +0 -1
  92. package/dist/_chunks/index-AECgcaDa.mjs.map +0 -1
  93. package/dist/_chunks/index-fP3qoWZ4.js.map +0 -1
@@ -1,23 +1,53 @@
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-AECgcaDa.mjs";
1
+ import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
+ import { useLicenseLimits, Page, Pagination, BackButton, Table, unstable_useDocument } 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 useTypedDispatch, h as useGetReleaseActionsQuery, j as useUpdateReleaseActionMutation, R as ReleaseActionOptions, k as ReleaseActionMenu, r as releaseApi } from "./index--4AgLDzb.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";
6
+ 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, IconButton, SingleSelect, SingleSelectOption, Tr, Td, Icon, Tooltip } from "@strapi/design-system";
8
7
  import { Link, Menu, LinkButton } from "@strapi/design-system/v2";
9
- import { Plus, EmptyDocuments, Pencil, Trash, ArrowLeft, More, CrossCircle, CheckCircle } from "@strapi/icons";
8
+ import { useNotification, useAPIErrorHandler, useQueryParams, useTracking, CheckPermissions, ConfirmDialog, useRBAC } from "@strapi/helper-plugin";
9
+ import { Plus, EmptyDocuments, Pencil, Trash, More, CrossCircle, CheckCircle } from "@strapi/icons";
10
10
  import format from "date-fns/format";
11
- import { utcToZonedTime, zonedTimeToUtc } from "date-fns-tz";
11
+ import { zonedTimeToUtc, utcToZonedTime } 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, parse } from "date-fns";
15
15
  import { Formik, Form, useFormikContext } from "formik";
16
16
  import * as yup from "yup";
17
17
  import "@reduxjs/toolkit/query";
18
18
  import "axios";
19
19
  import "@reduxjs/toolkit/query/react";
20
20
  import "react-redux";
21
+ const intervals = ["years", "months", "days", "hours", "minutes", "seconds"];
22
+ const RelativeTime = React.forwardRef(
23
+ ({ timestamp, customIntervals = [], ...restProps }, forwardedRef) => {
24
+ const { formatRelativeTime, formatDate, formatTime } = useIntl();
25
+ const interval = intervalToDuration({
26
+ start: timestamp,
27
+ end: Date.now()
28
+ // see https://github.com/date-fns/date-fns/issues/2891 – No idea why it's all partial it returns it every time.
29
+ });
30
+ const unit = intervals.find((intervalUnit) => {
31
+ return interval[intervalUnit] > 0 && Object.keys(interval).includes(intervalUnit);
32
+ });
33
+ const relativeTime = isPast(timestamp) ? -interval[unit] : interval[unit];
34
+ const customInterval = customIntervals.find(
35
+ (custom) => interval[custom.unit] < custom.threshold
36
+ );
37
+ const displayText = customInterval ? customInterval.text : formatRelativeTime(relativeTime, unit, { numeric: "auto" });
38
+ return /* @__PURE__ */ jsx(
39
+ "time",
40
+ {
41
+ ref: forwardedRef,
42
+ dateTime: timestamp.toISOString(),
43
+ role: "time",
44
+ title: `${formatDate(timestamp)} ${formatTime(timestamp)}`,
45
+ ...restProps,
46
+ children: displayText
47
+ }
48
+ );
49
+ }
50
+ );
21
51
  const RELEASE_SCHEMA = yup.object().shape({
22
52
  name: yup.string().trim().required(),
23
53
  scheduledAt: yup.string().nullable(),
@@ -56,12 +86,12 @@ const ReleaseModal = ({
56
86
  if (!date || !time || !timezone)
57
87
  return null;
58
88
  const formattedDate = parse(time, "HH:mm", new Date(date));
59
- const timezoneWithoutOffset = timezone.split("&")[1];
89
+ const timezoneWithoutOffset = timezone.split("_")[1];
60
90
  return zonedTimeToUtc(formattedDate, timezoneWithoutOffset);
61
91
  };
62
92
  const getTimezoneWithOffset = () => {
63
93
  const currentTimezone = timezoneList.find(
64
- (timezone) => timezone.value.split("&")[1] === initialValues.timezone
94
+ (timezone) => timezone.value.split("_")[1] === initialValues.timezone
65
95
  );
66
96
  return currentTimezone?.value || systemTimezone.value;
67
97
  };
@@ -79,7 +109,7 @@ const ReleaseModal = ({
79
109
  onSubmit: (values) => {
80
110
  handleSubmit({
81
111
  ...values,
82
- timezone: values.timezone ? values.timezone.split("&")[1] : null,
112
+ timezone: values.timezone ? values.timezone.split("_")[1] : null,
83
113
  scheduledAt: values.isScheduled ? getScheduledTimestamp(values) : null
84
114
  });
85
115
  },
@@ -162,8 +192,7 @@ const ReleaseModal = ({
162
192
  setFieldValue("date", null);
163
193
  },
164
194
  selectedDate: values.date || void 0,
165
- required: true,
166
- minDate: utcToZonedTime(/* @__PURE__ */ new Date(), values.timezone.split("&")[1])
195
+ required: true
167
196
  }
168
197
  ) }),
169
198
  /* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsx(
@@ -215,10 +244,10 @@ const ReleaseModal = ({
215
244
  const getTimezones = (selectedDate) => {
216
245
  const timezoneList = Intl.supportedValuesOf("timeZone").map((timezone) => {
217
246
  const utcOffset = getTimezoneOffset(timezone, selectedDate);
218
- return { offset: utcOffset, value: `${utcOffset}&${timezone}` };
247
+ return { offset: utcOffset, value: `${utcOffset}_${timezone}` };
219
248
  });
220
249
  const systemTimezone = timezoneList.find(
221
- (timezone) => timezone.value.split("&")[1] === Intl.DateTimeFormat().resolvedOptions().timeZone
250
+ (timezone) => timezone.value.split("_")[1] === Intl.DateTimeFormat().resolvedOptions().timeZone
222
251
  );
223
252
  return { timezoneList, systemTimezone };
224
253
  };
@@ -230,7 +259,7 @@ const TimezoneComponent = ({ timezoneOptions }) => {
230
259
  if (values.date) {
231
260
  const { timezoneList: timezoneList2 } = getTimezones(new Date(values.date));
232
261
  setTimezoneList(timezoneList2);
233
- const updatedTimezone = values.timezone && timezoneList2.find((tz) => tz.value.split("&")[1] === values.timezone.split("&")[1]);
262
+ const updatedTimezone = values.timezone && timezoneList2.find((tz) => tz.value.split("_")[1] === values.timezone.split("_")[1]);
234
263
  if (updatedTimezone) {
235
264
  setFieldValue("timezone", updatedTimezone.value);
236
265
  }
@@ -243,10 +272,9 @@ const TimezoneComponent = ({ timezoneOptions }) => {
243
272
  id: "content-releases.modal.form.input.label.timezone",
244
273
  defaultMessage: "Timezone"
245
274
  }),
246
- autocomplete: { type: "list", filter: "contains" },
247
275
  name: "timezone",
248
276
  value: values.timezone || void 0,
249
- textValue: values.timezone ? values.timezone.replace(/&/, " ") : void 0,
277
+ textValue: values.timezone ? values.timezone.replace("_", " ") : void 0,
250
278
  onChange: (timezone) => {
251
279
  setFieldValue("timezone", timezone);
252
280
  },
@@ -258,7 +286,7 @@ const TimezoneComponent = ({ timezoneOptions }) => {
258
286
  },
259
287
  error: errors.timezone,
260
288
  required: true,
261
- children: timezoneList.map((timezone) => /* @__PURE__ */ jsx(ComboboxOption, { value: timezone.value, children: timezone.value.replace(/&/, " ") }, timezone.value))
289
+ children: timezoneList.map((timezone) => /* @__PURE__ */ jsx(ComboboxOption, { value: timezone.value, children: timezone.value.replace("_", " ") }, timezone.value))
262
290
  }
263
291
  );
264
292
  };
@@ -297,7 +325,7 @@ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
297
325
  const { formatMessage } = useIntl();
298
326
  const IsSchedulingEnabled = window.strapi.future.isEnabled("contentReleasesScheduling");
299
327
  if (isError) {
300
- return /* @__PURE__ */ jsx(AnErrorOccurred, {});
328
+ return /* @__PURE__ */ jsx(Page.Error, {});
301
329
  }
302
330
  if (releases?.length === 0) {
303
331
  return /* @__PURE__ */ jsx(
@@ -371,7 +399,7 @@ const ReleasesPage = () => {
371
399
  const [releaseModalShown, setReleaseModalShown] = React.useState(false);
372
400
  const toggleNotification = useNotification();
373
401
  const { formatMessage } = useIntl();
374
- const { push, replace } = useHistory();
402
+ const navigate = useNavigate();
375
403
  const { formatAPIError } = useAPIErrorHandler();
376
404
  const [{ query }, setQuery] = useQueryParams();
377
405
  const response = useGetReleasesQuery(query);
@@ -395,9 +423,9 @@ const ReleasesPage = () => {
395
423
  defaultMessage: "Please try again or open another release."
396
424
  })
397
425
  });
398
- replace({ state: null });
426
+ navigate("", { replace: true, state: null });
399
427
  }
400
- }, [formatMessage, location?.state?.errors, replace, toggleNotification]);
428
+ }, [formatMessage, location?.state?.errors, navigate, toggleNotification]);
401
429
  React.useEffect(() => {
402
430
  if (tabRef.current) {
403
431
  tabRef.current._handlers.setSelectedTabIndex(activeTabIndex);
@@ -407,7 +435,7 @@ const ReleasesPage = () => {
407
435
  setReleaseModalShown((prev) => !prev);
408
436
  };
409
437
  if (isLoading) {
410
- return /* @__PURE__ */ jsx(Main, { "aria-busy": isLoading, children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) });
438
+ return /* @__PURE__ */ jsx(Page.Loading, {});
411
439
  }
412
440
  const totalPendingReleases = isSuccess && response.currentData?.meta?.pendingReleasesCount || 0;
413
441
  const hasReachedMaximumPendingReleases = totalPendingReleases >= maximumReleases;
@@ -438,7 +466,7 @@ const ReleasesPage = () => {
438
466
  })
439
467
  });
440
468
  trackUsage("didCreateRelease");
441
- push(`/plugins/content-releases/${response2.data.data.id}`);
469
+ navigate(response2.data.data.id.toString());
442
470
  } else if (isAxiosError(response2.error)) {
443
471
  toggleNotification({
444
472
  type: "warning",
@@ -553,23 +581,17 @@ const ReleasesPage = () => {
553
581
  ]
554
582
  }
555
583
  ),
556
- response.currentData?.meta?.pagination?.total ? /* @__PURE__ */ jsxs(Flex, { paddingTop: 4, alignItems: "flex-end", justifyContent: "space-between", children: [
557
- /* @__PURE__ */ jsx(
558
- PageSizeURLQuery,
559
- {
560
- options: ["8", "16", "32", "64"],
561
- defaultValue: response?.currentData?.meta?.pagination?.pageSize.toString()
562
- }
563
- ),
564
- /* @__PURE__ */ jsx(
565
- PaginationURLQuery,
566
- {
567
- pagination: {
568
- pageCount: response?.currentData?.meta?.pagination?.pageCount || 0
569
- }
570
- }
571
- )
572
- ] }) : null
584
+ /* @__PURE__ */ jsxs(
585
+ Pagination.Root,
586
+ {
587
+ ...response?.currentData?.meta?.pagination,
588
+ defaultPageSize: response?.currentData?.meta?.pagination?.pageSize,
589
+ children: [
590
+ /* @__PURE__ */ jsx(Pagination.PageSize, { options: ["8", "16", "32", "64"] }),
591
+ /* @__PURE__ */ jsx(Pagination.Links, {})
592
+ ]
593
+ }
594
+ )
573
595
  ] }) }),
574
596
  releaseModalShown && /* @__PURE__ */ jsx(
575
597
  ReleaseModal,
@@ -617,14 +639,18 @@ const TrashIcon = styled(Trash)`
617
639
  const TypographyMaxWidth = styled(Typography)`
618
640
  max-width: 300px;
619
641
  `;
620
- const EntryValidationText = ({ action, schema, components, entry }) => {
642
+ const EntryValidationText = ({ action, schema, entry }) => {
621
643
  const { formatMessage } = useIntl();
622
- const { validate } = unstable_useDocument();
623
- const { errors } = validate(entry, {
624
- contentType: schema,
625
- components,
626
- isCreatingEntry: false
627
- });
644
+ const { validate } = unstable_useDocument(
645
+ {
646
+ collectionType: schema?.kind ?? "",
647
+ model: schema?.uid ?? ""
648
+ },
649
+ {
650
+ skip: !schema
651
+ }
652
+ );
653
+ const errors = validate(entry) ?? {};
628
654
  if (Object.keys(errors).length > 0) {
629
655
  const validationErrorsMessages = Object.entries(errors).map(
630
656
  ([key, value]) => formatMessage(
@@ -672,7 +698,12 @@ const ReleaseDetailsLayout = ({
672
698
  isLoading: isLoadingDetails,
673
699
  isError,
674
700
  error
675
- } = useGetReleaseQuery({ id: releaseId });
701
+ } = useGetReleaseQuery(
702
+ { id: releaseId },
703
+ {
704
+ skip: !releaseId
705
+ }
706
+ );
676
707
  const [publishRelease, { isLoading: isPublishing }] = usePublishReleaseMutation();
677
708
  const toggleNotification = useNotification();
678
709
  const { formatAPIError } = useAPIErrorHandler();
@@ -682,8 +713,8 @@ const ReleaseDetailsLayout = ({
682
713
  const dispatch = useTypedDispatch();
683
714
  const { trackUsage } = useTracking();
684
715
  const release = data?.data;
685
- const handlePublishRelease = async () => {
686
- const response = await publishRelease({ id: releaseId });
716
+ const handlePublishRelease = (id) => async () => {
717
+ const response = await publishRelease({ id });
687
718
  if ("data" in response) {
688
719
  toggleNotification({
689
720
  type: "success",
@@ -726,21 +757,19 @@ const ReleaseDetailsLayout = ({
726
757
  return release.createdBy.email;
727
758
  };
728
759
  if (isLoadingDetails) {
729
- return /* @__PURE__ */ jsx(Main, { "aria-busy": isLoadingDetails, children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) });
760
+ return /* @__PURE__ */ jsx(Page.Loading, {});
730
761
  }
731
762
  if (isError || !release) {
732
763
  return /* @__PURE__ */ jsx(
733
- Redirect,
764
+ Navigate,
734
765
  {
735
- to: {
736
- pathname: "/plugins/content-releases",
737
- state: {
738
- errors: [
739
- {
740
- code: error?.code
741
- }
742
- ]
743
- }
766
+ to: "..",
767
+ state: {
768
+ errors: [
769
+ {
770
+ code: error?.code
771
+ }
772
+ ]
744
773
  }
745
774
  }
746
775
  );
@@ -785,10 +814,7 @@ const ReleaseDetailsLayout = ({
785
814
  /* @__PURE__ */ jsx(Typography, { textColor: "neutral600", variant: "epsilon", children: numberOfEntriesText + (IsSchedulingEnabled && isScheduled ? ` - ${scheduledText}` : "") }),
786
815
  /* @__PURE__ */ jsx(Badge, { ...getBadgeProps(release.status), children: release.status })
787
816
  ] }),
788
- navigationAction: /* @__PURE__ */ jsx(Link$1, { startIcon: /* @__PURE__ */ jsx(ArrowLeft, {}), to: "/plugins/content-releases", children: formatMessage({
789
- id: "global.back",
790
- defaultMessage: "Back"
791
- }) }),
817
+ navigationAction: /* @__PURE__ */ jsx(BackButton, {}),
792
818
  primaryAction: !release.releasedAt && /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
793
819
  /* @__PURE__ */ jsxs(Menu.Root, { children: [
794
820
  /* @__PURE__ */ jsx(
@@ -877,7 +903,7 @@ const ReleaseDetailsLayout = ({
877
903
  {
878
904
  size: "S",
879
905
  variant: "default",
880
- onClick: handlePublishRelease,
906
+ onClick: handlePublishRelease(release.id.toString()),
881
907
  loading: isPublishing,
882
908
  disabled: release.actions.meta.count === 0,
883
909
  children: formatMessage({
@@ -911,9 +937,8 @@ const getGroupByOptionLabel = (value) => {
911
937
  defaultMessage: "Content-Types"
912
938
  };
913
939
  };
914
- const ReleaseDetailsBody = () => {
940
+ const ReleaseDetailsBody = ({ releaseId }) => {
915
941
  const { formatMessage } = useIntl();
916
- const { releaseId } = useParams();
917
942
  const [{ query }, setQuery] = useQueryParams();
918
943
  const toggleNotification = useNotification();
919
944
  const { formatAPIError } = useAPIErrorHandler();
@@ -968,7 +993,7 @@ const ReleaseDetailsBody = () => {
968
993
  }
969
994
  };
970
995
  if (isLoading || isReleaseLoading) {
971
- return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) });
996
+ return /* @__PURE__ */ jsx(Page.Loading, {});
972
997
  }
973
998
  const releaseActions = data?.data;
974
999
  const releaseMeta = data?.meta;
@@ -987,32 +1012,26 @@ const ReleaseDetailsBody = () => {
987
1012
  });
988
1013
  }
989
1014
  return /* @__PURE__ */ jsx(
990
- Redirect,
1015
+ Navigate,
991
1016
  {
992
- to: {
993
- pathname: "/plugins/content-releases",
994
- state: {
995
- errors: errorsArray
996
- }
1017
+ to: "..",
1018
+ state: {
1019
+ errors: errorsArray
997
1020
  }
998
1021
  }
999
1022
  );
1000
1023
  }
1001
1024
  if (isError || !releaseActions) {
1002
- return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(AnErrorOccurred, {}) });
1025
+ return /* @__PURE__ */ jsx(Page.Error, {});
1003
1026
  }
1004
1027
  if (Object.keys(releaseActions).length === 0) {
1005
1028
  return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(
1006
- NoContent,
1029
+ EmptyStateLayout,
1007
1030
  {
1008
- content: {
1009
- id: "content-releases.pages.Details.tab.emptyEntries",
1010
- defaultMessage: "This release is empty. Open the Content Manager, select an entry and add it to the release."
1011
- },
1012
1031
  action: /* @__PURE__ */ jsx(
1013
1032
  LinkButton,
1014
1033
  {
1015
- as: Link$2,
1034
+ as: Link$1,
1016
1035
  to: {
1017
1036
  pathname: "/content-manager"
1018
1037
  },
@@ -1023,10 +1042,54 @@ const ReleaseDetailsBody = () => {
1023
1042
  defaultMessage: "Open the Content Manager"
1024
1043
  })
1025
1044
  }
1026
- )
1045
+ ),
1046
+ icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "10rem" }),
1047
+ content: formatMessage({
1048
+ id: "content-releases.pages.Details.tab.emptyEntries",
1049
+ defaultMessage: "This release is empty. Open the Content Manager, select an entry and add it to the release."
1050
+ })
1027
1051
  }
1028
1052
  ) });
1029
1053
  }
1054
+ const headers = [
1055
+ {
1056
+ label: formatMessage({
1057
+ id: "content-releases.page.ReleaseDetails.table.header.label.name",
1058
+ defaultMessage: "name"
1059
+ }),
1060
+ name: "name"
1061
+ },
1062
+ {
1063
+ label: formatMessage({
1064
+ id: "content-releases.page.ReleaseDetails.table.header.label.locale",
1065
+ defaultMessage: "locale"
1066
+ }),
1067
+ name: "locale"
1068
+ },
1069
+ {
1070
+ label: formatMessage({
1071
+ id: "content-releases.page.ReleaseDetails.table.header.label.content-type",
1072
+ defaultMessage: "content-type"
1073
+ }),
1074
+ name: "content-type"
1075
+ },
1076
+ {
1077
+ label: formatMessage({
1078
+ id: "content-releases.page.ReleaseDetails.table.header.label.action",
1079
+ defaultMessage: "action"
1080
+ }),
1081
+ name: "action"
1082
+ },
1083
+ ...!release.releasedAt ? [
1084
+ {
1085
+ label: formatMessage({
1086
+ id: "content-releases.page.ReleaseDetails.table.header.label.status",
1087
+ defaultMessage: "status"
1088
+ }),
1089
+ name: "status"
1090
+ }
1091
+ ] : []
1092
+ ];
1030
1093
  return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsxs(Flex, { gap: 8, direction: "column", alignItems: "stretch", children: [
1031
1094
  /* @__PURE__ */ jsx(Flex, { children: /* @__PURE__ */ jsx(
1032
1095
  SingleSelect,
@@ -1058,68 +1121,11 @@ const ReleaseDetailsBody = () => {
1058
1121
  ...item,
1059
1122
  id: Number(item.entry.id)
1060
1123
  })),
1061
- colCount: releaseActions[key].length,
1062
- isLoading,
1063
- isFetching,
1124
+ headers,
1125
+ isLoading: isLoading || isFetching,
1064
1126
  children: /* @__PURE__ */ jsxs(Table.Content, { children: [
1065
- /* @__PURE__ */ jsxs(Table.Head, { children: [
1066
- /* @__PURE__ */ jsx(
1067
- Table.HeaderCell,
1068
- {
1069
- fieldSchemaType: "string",
1070
- label: formatMessage({
1071
- id: "content-releases.page.ReleaseDetails.table.header.label.name",
1072
- defaultMessage: "name"
1073
- }),
1074
- name: "name"
1075
- }
1076
- ),
1077
- /* @__PURE__ */ jsx(
1078
- Table.HeaderCell,
1079
- {
1080
- fieldSchemaType: "string",
1081
- label: formatMessage({
1082
- id: "content-releases.page.ReleaseDetails.table.header.label.locale",
1083
- defaultMessage: "locale"
1084
- }),
1085
- name: "locale"
1086
- }
1087
- ),
1088
- /* @__PURE__ */ jsx(
1089
- Table.HeaderCell,
1090
- {
1091
- fieldSchemaType: "string",
1092
- label: formatMessage({
1093
- id: "content-releases.page.ReleaseDetails.table.header.label.content-type",
1094
- defaultMessage: "content-type"
1095
- }),
1096
- name: "content-type"
1097
- }
1098
- ),
1099
- /* @__PURE__ */ jsx(
1100
- Table.HeaderCell,
1101
- {
1102
- fieldSchemaType: "string",
1103
- label: formatMessage({
1104
- id: "content-releases.page.ReleaseDetails.table.header.label.action",
1105
- defaultMessage: "action"
1106
- }),
1107
- name: "action"
1108
- }
1109
- ),
1110
- !release.releasedAt && /* @__PURE__ */ jsx(
1111
- Table.HeaderCell,
1112
- {
1113
- fieldSchemaType: "string",
1114
- label: formatMessage({
1115
- id: "content-releases.page.ReleaseDetails.table.header.label.status",
1116
- defaultMessage: "status"
1117
- }),
1118
- name: "status"
1119
- }
1120
- )
1121
- ] }),
1122
- /* @__PURE__ */ jsx(Table.LoadingBody, {}),
1127
+ /* @__PURE__ */ jsx(Table.Head, { children: headers.map((header) => /* @__PURE__ */ jsx(Table.HeaderCell, { ...header }, header.name)) }),
1128
+ /* @__PURE__ */ jsx(Table.Loading, {}),
1123
1129
  /* @__PURE__ */ jsx(Table.Body, { children: releaseActions[key].map(
1124
1130
  ({ id, contentType, locale, type, entry }, actionIndex) => /* @__PURE__ */ jsxs(Tr, { children: [
1125
1131
  /* @__PURE__ */ jsx(Td, { width: "25%", maxWidth: "200px", children: /* @__PURE__ */ jsx(Typography, { ellipsis: true, children: `${contentType.mainFieldValue || entry.id}` }) }),
@@ -1177,17 +1183,17 @@ const ReleaseDetailsBody = () => {
1177
1183
  }
1178
1184
  )
1179
1185
  ] }, `releases-group-${key}`)),
1180
- /* @__PURE__ */ jsxs(Flex, { paddingTop: 4, alignItems: "flex-end", justifyContent: "space-between", children: [
1181
- /* @__PURE__ */ jsx(PageSizeURLQuery, { defaultValue: releaseMeta?.pagination?.pageSize.toString() }),
1182
- /* @__PURE__ */ jsx(
1183
- PaginationURLQuery,
1184
- {
1185
- pagination: {
1186
- pageCount: releaseMeta?.pagination?.pageCount || 0
1187
- }
1188
- }
1189
- )
1190
- ] })
1186
+ /* @__PURE__ */ jsxs(
1187
+ Pagination.Root,
1188
+ {
1189
+ ...releaseMeta?.pagination,
1190
+ defaultPageSize: releaseMeta?.pagination?.pageSize,
1191
+ children: [
1192
+ /* @__PURE__ */ jsx(Pagination.PageSize, {}),
1193
+ /* @__PURE__ */ jsx(Pagination.Links, {})
1194
+ ]
1195
+ }
1196
+ )
1191
1197
  ] }) });
1192
1198
  };
1193
1199
  const ReleaseDetailsPage = () => {
@@ -1195,14 +1201,19 @@ const ReleaseDetailsPage = () => {
1195
1201
  const { releaseId } = useParams();
1196
1202
  const toggleNotification = useNotification();
1197
1203
  const { formatAPIError } = useAPIErrorHandler();
1198
- const { replace } = useHistory();
1204
+ const navigate = useNavigate();
1199
1205
  const [releaseModalShown, setReleaseModalShown] = React.useState(false);
1200
1206
  const [showWarningSubmit, setWarningSubmit] = React.useState(false);
1201
1207
  const {
1202
1208
  isLoading: isLoadingDetails,
1203
1209
  data,
1204
1210
  isSuccess: isSuccessDetails
1205
- } = useGetReleaseQuery({ id: releaseId });
1211
+ } = useGetReleaseQuery(
1212
+ { id: releaseId },
1213
+ {
1214
+ skip: !releaseId
1215
+ }
1216
+ );
1206
1217
  const [updateRelease, { isLoading: isSubmittingForm }] = useUpdateReleaseMutation();
1207
1218
  const [deleteRelease, { isLoading: isDeletingRelease }] = useDeleteReleaseMutation();
1208
1219
  const toggleEditReleaseModal = () => {
@@ -1215,10 +1226,13 @@ const ReleaseDetailsPage = () => {
1215
1226
  {
1216
1227
  toggleEditReleaseModal,
1217
1228
  toggleWarningSubmit,
1218
- children: /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) })
1229
+ children: /* @__PURE__ */ jsx(Page.Loading, {})
1219
1230
  }
1220
1231
  );
1221
1232
  }
1233
+ if (!releaseId) {
1234
+ return /* @__PURE__ */ jsx(Navigate, { to: ".." });
1235
+ }
1222
1236
  const releaseData = isSuccessDetails && data?.data || null;
1223
1237
  const title = releaseData?.name || "";
1224
1238
  const timezone = releaseData?.timezone ?? null;
@@ -1258,7 +1272,7 @@ const ReleaseDetailsPage = () => {
1258
1272
  id: releaseId
1259
1273
  });
1260
1274
  if ("data" in response) {
1261
- replace("/plugins/content-releases");
1275
+ navigate("..");
1262
1276
  } else if (isAxiosError(response.error)) {
1263
1277
  toggleNotification({
1264
1278
  type: "warning",
@@ -1277,7 +1291,7 @@ const ReleaseDetailsPage = () => {
1277
1291
  toggleEditReleaseModal,
1278
1292
  toggleWarningSubmit,
1279
1293
  children: [
1280
- /* @__PURE__ */ jsx(ReleaseDetailsBody, {}),
1294
+ /* @__PURE__ */ jsx(ReleaseDetailsBody, { releaseId }),
1281
1295
  releaseModalShown && /* @__PURE__ */ jsx(
1282
1296
  ReleaseModal,
1283
1297
  {
@@ -1312,12 +1326,12 @@ const ReleaseDetailsPage = () => {
1312
1326
  );
1313
1327
  };
1314
1328
  const App = () => {
1315
- return /* @__PURE__ */ jsx(CheckPagePermissions, { permissions: PERMISSIONS.main, children: /* @__PURE__ */ jsxs(Switch, { children: [
1316
- /* @__PURE__ */ jsx(Route, { exact: true, path: `/plugins/${pluginId}`, component: ReleasesPage }),
1317
- /* @__PURE__ */ jsx(Route, { exact: true, path: `/plugins/${pluginId}/:releaseId`, component: ReleaseDetailsPage })
1329
+ return /* @__PURE__ */ jsx(Page.Protect, { permissions: PERMISSIONS.main, children: /* @__PURE__ */ jsxs(Routes, { children: [
1330
+ /* @__PURE__ */ jsx(Route, { index: true, element: /* @__PURE__ */ jsx(ReleasesPage, {}) }),
1331
+ /* @__PURE__ */ jsx(Route, { path: ":releaseId", element: /* @__PURE__ */ jsx(ReleaseDetailsPage, {}) })
1318
1332
  ] }) });
1319
1333
  };
1320
1334
  export {
1321
1335
  App
1322
1336
  };
1323
- //# sourceMappingURL=App-bpzO2Ljh.mjs.map
1337
+ //# sourceMappingURL=App-PQlYzNfb.mjs.map