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

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-p8aKBitd.js → App-CqbuK4M6.js} +426 -427
  2. package/dist/_chunks/App-CqbuK4M6.js.map +1 -0
  3. package/dist/_chunks/{App-bpzO2Ljh.mjs → App-Do-Rnv0A.mjs} +406 -406
  4. package/dist/_chunks/App-Do-Rnv0A.mjs.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-WuuhP6Bn.mjs → en-B9Ur3VsE.mjs} +11 -3
  10. package/dist/_chunks/en-B9Ur3VsE.mjs.map +1 -0
  11. package/dist/_chunks/{en-gcJJ5htG.js → en-DtFJ5ViE.js} +11 -3
  12. package/dist/_chunks/en-DtFJ5ViE.js.map +1 -0
  13. package/dist/_chunks/{index-AECgcaDa.mjs → index-D_pgdqQL.mjs} +244 -247
  14. package/dist/_chunks/index-D_pgdqQL.mjs.map +1 -0
  15. package/dist/_chunks/{index-fP3qoWZ4.js → index-Tedsw4GC.js} +244 -249
  16. package/dist/_chunks/index-Tedsw4GC.js.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 +17 -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/release.d.ts +105 -0
  38. package/dist/admin/src/store/hooks.d.ts +7 -0
  39. package/dist/admin/src/utils/api.d.ts +6 -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 +358 -237
  43. package/dist/server/index.js.map +1 -1
  44. package/dist/server/index.mjs +359 -237
  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 +29 -36
  103. package/dist/_chunks/App-bpzO2Ljh.mjs.map +0 -1
  104. package/dist/_chunks/App-p8aKBitd.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-WuuhP6Bn.mjs.map +0 -1
  108. package/dist/_chunks/en-gcJJ5htG.js.map +0 -1
  109. package/dist/_chunks/index-AECgcaDa.mjs.map +0 -1
  110. package/dist/_chunks/index-fP3qoWZ4.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-AECgcaDa.mjs";
1
+ import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
+ import { useNotification, useAPIErrorHandler, useQueryParams, useTracking, useRBAC, Page, Layouts, Pagination, isFetchError, ConfirmDialog, BackButton, useStrapiApp, Table } from "@strapi/admin/strapi-admin";
3
+ import { useLocation, useNavigate, NavLink, 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, b as useGetReleaseQuery, c as useUpdateReleaseMutation, d as useDeleteReleaseMutation, e as usePublishReleaseMutation, f as useGetReleaseActionsQuery, h as useUpdateReleaseActionMutation, R as ReleaseActionOptions, i as ReleaseActionMenu, r as releaseApi } from "./index-D_pgdqQL.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 { Modal, Flex, Field, TextInput, Box, Checkbox, Typography, DatePicker, TimePicker, Button, Combobox, ComboboxOption, Link, Alert, Main, Tabs, Divider, EmptyStateLayout, Grid, Badge, Menu, Dialog, 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
- import styled from "styled-components";
14
- import { formatISO, parse } from "date-fns";
13
+ import { styled } from "styled-components";
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(),
@@ -40,6 +68,7 @@ const RELEASE_SCHEMA = yup.object().shape({
40
68
  }).required().noUnknown();
41
69
  const ReleaseModal = ({
42
70
  handleClose,
71
+ open,
43
72
  handleSubmit,
44
73
  initialValues,
45
74
  isLoading = false
@@ -47,7 +76,6 @@ const ReleaseModal = ({
47
76
  const { formatMessage } = useIntl();
48
77
  const { pathname } = useLocation();
49
78
  const isCreatingRelease = pathname === `/plugins/${pluginId}`;
50
- const IsSchedulingEnabled = window.strapi.future.isEnabled("contentReleasesScheduling");
51
79
  const { timezoneList, systemTimezone = { value: "UTC+00:00-Africa/Abidjan " } } = getTimezones(
52
80
  initialValues.scheduledAt ? new Date(initialValues.scheduledAt) : /* @__PURE__ */ new Date()
53
81
  );
@@ -55,9 +83,8 @@ const ReleaseModal = ({
55
83
  const { date, time, timezone } = values;
56
84
  if (!date || !time || !timezone)
57
85
  return null;
58
- const formattedDate = parse(time, "HH:mm", new Date(date));
59
86
  const timezoneWithoutOffset = timezone.split("&")[1];
60
- return zonedTimeToUtc(formattedDate, timezoneWithoutOffset);
87
+ return zonedTimeToUtc(`${date} ${time}`, timezoneWithoutOffset);
61
88
  };
62
89
  const getTimezoneWithOffset = () => {
63
90
  const currentTimezone = timezoneList.find(
@@ -65,8 +92,8 @@ const ReleaseModal = ({
65
92
  );
66
93
  return currentTimezone?.value || systemTimezone.value;
67
94
  };
68
- return /* @__PURE__ */ jsxs(ModalLayout, { onClose: handleClose, labelledBy: "title", children: [
69
- /* @__PURE__ */ jsx(ModalHeader, { children: /* @__PURE__ */ jsx(Typography, { id: "title", fontWeight: "bold", textColor: "neutral800", children: formatMessage(
95
+ return /* @__PURE__ */ jsx(Modal.Root, { open, onOpenChange: handleClose, children: /* @__PURE__ */ jsxs(Modal.Content, { children: [
96
+ /* @__PURE__ */ jsx(Modal.Header, { children: /* @__PURE__ */ jsx(Modal.Title, { children: formatMessage(
70
97
  {
71
98
  id: "content-releases.modal.title",
72
99
  defaultMessage: "{isCreatingRelease, select, true {New release} other {Edit release}}"
@@ -89,31 +116,25 @@ const ReleaseModal = ({
89
116
  },
90
117
  validationSchema: RELEASE_SCHEMA,
91
118
  validateOnChange: false,
92
- children: ({ values, errors, handleChange, setFieldValue }) => /* @__PURE__ */ jsxs(Form, { children: [
93
- /* @__PURE__ */ jsx(ModalBody, { children: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 6, children: [
94
- /* @__PURE__ */ jsx(
95
- TextInput,
96
- {
97
- label: formatMessage({
119
+ children: ({ values, errors, handleChange, setFieldValue }) => {
120
+ return /* @__PURE__ */ jsxs(Form, { children: [
121
+ /* @__PURE__ */ jsx(Modal.Body, { children: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 6, children: [
122
+ /* @__PURE__ */ jsxs(Field.Root, { name: "name", error: errors.name, required: true, children: [
123
+ /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
98
124
  id: "content-releases.modal.form.input.label.release-name",
99
125
  defaultMessage: "Name"
100
- }),
101
- name: "name",
102
- value: values.name,
103
- error: errors.name,
104
- onChange: handleChange,
105
- required: true
106
- }
107
- ),
108
- IsSchedulingEnabled && /* @__PURE__ */ jsxs(Fragment, { children: [
126
+ }) }),
127
+ /* @__PURE__ */ jsx(TextInput, { value: values.name, onChange: handleChange }),
128
+ /* @__PURE__ */ jsx(Field.Error, {})
129
+ ] }),
109
130
  /* @__PURE__ */ jsx(Box, { width: "max-content", children: /* @__PURE__ */ jsx(
110
131
  Checkbox,
111
132
  {
112
133
  name: "isScheduled",
113
- value: values.isScheduled,
114
- onChange: (event) => {
115
- setFieldValue("isScheduled", event.target.checked);
116
- if (!event.target.checked) {
134
+ checked: values.isScheduled,
135
+ onCheckedChange: (checked) => {
136
+ setFieldValue("isScheduled", checked);
137
+ if (!checked) {
117
138
  setFieldValue("date", null);
118
139
  setFieldValue("time", "");
119
140
  setFieldValue("timezone", null);
@@ -141,76 +162,73 @@ const ReleaseModal = ({
141
162
  ) }),
142
163
  values.isScheduled && /* @__PURE__ */ jsxs(Fragment, { children: [
143
164
  /* @__PURE__ */ jsxs(Flex, { gap: 4, alignItems: "start", children: [
144
- /* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsx(
145
- DatePicker,
146
- {
147
- label: formatMessage({
148
- id: "content-releases.modal.form.input.label.date",
149
- defaultMessage: "Date"
150
- }),
151
- name: "date",
152
- error: errors.date,
153
- onChange: (date) => {
154
- const isoFormatDate = date ? formatISO(date, { representation: "date" }) : null;
155
- setFieldValue("date", isoFormatDate);
156
- },
157
- clearLabel: formatMessage({
158
- id: "content-releases.modal.form.input.clearLabel",
159
- defaultMessage: "Clear"
160
- }),
161
- onClear: () => {
162
- setFieldValue("date", null);
163
- },
164
- selectedDate: values.date || void 0,
165
- required: true,
166
- minDate: utcToZonedTime(/* @__PURE__ */ new Date(), values.timezone.split("&")[1])
167
- }
168
- ) }),
169
- /* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsx(
170
- TimePicker,
171
- {
172
- label: formatMessage({
173
- id: "content-releases.modal.form.input.label.time",
174
- defaultMessage: "Time"
175
- }),
176
- name: "time",
177
- error: errors.time,
178
- onChange: (time) => {
179
- setFieldValue("time", time);
180
- },
181
- clearLabel: formatMessage({
182
- id: "content-releases.modal.form.input.clearLabel",
183
- defaultMessage: "Clear"
184
- }),
185
- onClear: () => {
186
- setFieldValue("time", "");
187
- },
188
- value: values.time || void 0,
189
- required: true
190
- }
191
- ) })
165
+ /* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsxs(Field.Root, { name: "date", error: errors.date, required: true, children: [
166
+ /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
167
+ id: "content-releases.modal.form.input.label.date",
168
+ defaultMessage: "Date"
169
+ }) }),
170
+ /* @__PURE__ */ jsx(
171
+ DatePicker,
172
+ {
173
+ onChange: (date) => {
174
+ const isoFormatDate = date ? formatISO(date, { representation: "date" }) : null;
175
+ setFieldValue("date", isoFormatDate);
176
+ },
177
+ clearLabel: formatMessage({
178
+ id: "content-releases.modal.form.input.clearLabel",
179
+ defaultMessage: "Clear"
180
+ }),
181
+ onClear: () => {
182
+ setFieldValue("date", null);
183
+ },
184
+ value: values.date ? new Date(values.date) : /* @__PURE__ */ new Date(),
185
+ minDate: utcToZonedTime(/* @__PURE__ */ new Date(), values.timezone.split("&")[1])
186
+ }
187
+ ),
188
+ /* @__PURE__ */ jsx(Field.Error, {})
189
+ ] }) }),
190
+ /* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsxs(Field.Root, { name: "time", error: errors.time, required: true, children: [
191
+ /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
192
+ id: "content-releases.modal.form.input.label.time",
193
+ defaultMessage: "Time"
194
+ }) }),
195
+ /* @__PURE__ */ jsx(
196
+ TimePicker,
197
+ {
198
+ onChange: (time) => {
199
+ setFieldValue("time", time);
200
+ },
201
+ clearLabel: formatMessage({
202
+ id: "content-releases.modal.form.input.clearLabel",
203
+ defaultMessage: "Clear"
204
+ }),
205
+ onClear: () => {
206
+ setFieldValue("time", "");
207
+ },
208
+ value: values.time || void 0
209
+ }
210
+ ),
211
+ /* @__PURE__ */ jsx(Field.Error, {})
212
+ ] }) })
192
213
  ] }),
193
214
  /* @__PURE__ */ jsx(TimezoneComponent, { timezoneOptions: timezoneList })
194
215
  ] })
195
- ] })
196
- ] }) }),
197
- /* @__PURE__ */ jsx(
198
- ModalFooter,
199
- {
200
- startActions: /* @__PURE__ */ jsx(Button, { onClick: handleClose, variant: "tertiary", name: "cancel", children: formatMessage({ id: "cancel", defaultMessage: "Cancel" }) }),
201
- endActions: /* @__PURE__ */ jsx(Button, { name: "submit", loading: isLoading, type: "submit", children: formatMessage(
216
+ ] }) }),
217
+ /* @__PURE__ */ jsxs(Modal.Footer, { children: [
218
+ /* @__PURE__ */ jsx(Modal.Close, { children: /* @__PURE__ */ jsx(Button, { variant: "tertiary", name: "cancel", children: formatMessage({ id: "cancel", defaultMessage: "Cancel" }) }) }),
219
+ /* @__PURE__ */ jsx(Button, { name: "submit", loading: isLoading, type: "submit", children: formatMessage(
202
220
  {
203
221
  id: "content-releases.modal.form.button.submit",
204
222
  defaultMessage: "{isCreatingRelease, select, true {Continue} other {Save}}"
205
223
  },
206
224
  { isCreatingRelease }
207
225
  ) })
208
- }
209
- )
210
- ] })
226
+ ] })
227
+ ] });
228
+ }
211
229
  }
212
230
  )
213
- ] });
231
+ ] }) });
214
232
  };
215
233
  const getTimezones = (selectedDate) => {
216
234
  const timezoneList = Intl.supportedValuesOf("timeZone").map((timezone) => {
@@ -236,37 +254,44 @@ const TimezoneComponent = ({ timezoneOptions }) => {
236
254
  }
237
255
  }
238
256
  }, [setFieldValue, values.date, values.timezone]);
239
- return /* @__PURE__ */ jsx(
240
- Combobox,
241
- {
242
- label: formatMessage({
243
- id: "content-releases.modal.form.input.label.timezone",
244
- defaultMessage: "Timezone"
245
- }),
246
- autocomplete: { type: "list", filter: "contains" },
247
- name: "timezone",
248
- value: values.timezone || void 0,
249
- textValue: values.timezone ? values.timezone.replace(/&/, " ") : void 0,
250
- onChange: (timezone) => {
251
- setFieldValue("timezone", timezone);
252
- },
253
- onTextValueChange: (timezone) => {
254
- setFieldValue("timezone", timezone);
255
- },
256
- onClear: () => {
257
- setFieldValue("timezone", "");
258
- },
259
- error: errors.timezone,
260
- required: true,
261
- children: timezoneList.map((timezone) => /* @__PURE__ */ jsx(ComboboxOption, { value: timezone.value, children: timezone.value.replace(/&/, " ") }, timezone.value))
262
- }
263
- );
257
+ return /* @__PURE__ */ jsxs(Field.Root, { name: "timezone", error: errors.timezone, required: true, children: [
258
+ /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
259
+ id: "content-releases.modal.form.input.label.timezone",
260
+ defaultMessage: "Timezone"
261
+ }) }),
262
+ /* @__PURE__ */ jsx(
263
+ Combobox,
264
+ {
265
+ autocomplete: { type: "list", filter: "contains" },
266
+ value: values.timezone || void 0,
267
+ textValue: values.timezone ? values.timezone.replace(/&/, " ") : void 0,
268
+ onChange: (timezone) => {
269
+ setFieldValue("timezone", timezone);
270
+ },
271
+ onTextValueChange: (timezone) => {
272
+ setFieldValue("timezone", timezone);
273
+ },
274
+ onClear: () => {
275
+ setFieldValue("timezone", "");
276
+ },
277
+ children: timezoneList.map((timezone) => /* @__PURE__ */ jsx(ComboboxOption, { value: timezone.value, children: timezone.value.replace(/&/, " ") }, timezone.value))
278
+ }
279
+ ),
280
+ /* @__PURE__ */ jsx(Field.Error, {})
281
+ ] });
282
+ };
283
+ const useTypedDispatch = useDispatch;
284
+ const isBaseQueryError = (error) => {
285
+ return typeof error !== "undefined" && error.name !== void 0;
264
286
  };
265
287
  const LinkCard = styled(Link)`
266
288
  display: block;
267
289
  `;
268
- const CapitalizeRelativeTime = styled(RelativeTime)`
269
- text-transform: capitalize;
290
+ const RelativeTime = styled(RelativeTime$1)`
291
+ display: inline-block;
292
+ &::first-letter {
293
+ text-transform: uppercase;
294
+ }
270
295
  `;
271
296
  const getBadgeProps = (status) => {
272
297
  let color;
@@ -295,9 +320,8 @@ const getBadgeProps = (status) => {
295
320
  };
296
321
  const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
297
322
  const { formatMessage } = useIntl();
298
- const IsSchedulingEnabled = window.strapi.future.isEnabled("contentReleasesScheduling");
299
323
  if (isError) {
300
- return /* @__PURE__ */ jsx(AnErrorOccurred, {});
324
+ return /* @__PURE__ */ jsx(Page.Error, {});
301
325
  }
302
326
  if (releases?.length === 0) {
303
327
  return /* @__PURE__ */ jsx(
@@ -312,11 +336,11 @@ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
312
336
  target: sectionTitle
313
337
  }
314
338
  ),
315
- icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "10rem" })
339
+ icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "16rem" })
316
340
  }
317
341
  );
318
342
  }
319
- return /* @__PURE__ */ jsx(Grid, { gap: 4, children: releases.map(({ id, name, actions, scheduledAt, status }) => /* @__PURE__ */ jsx(GridItem, { col: 3, s: 6, xs: 12, children: /* @__PURE__ */ jsx(LinkCard, { href: `content-releases/${id}`, isExternal: false, children: /* @__PURE__ */ jsxs(
343
+ return /* @__PURE__ */ jsx(Grid.Root, { gap: 4, children: releases.map(({ id, name, scheduledAt, status }) => /* @__PURE__ */ jsx(Grid.Item, { col: 3, s: 6, xs: 12, children: /* @__PURE__ */ jsx(LinkCard, { tag: NavLink, to: `${id}`, isExternal: false, children: /* @__PURE__ */ jsxs(
320
344
  Flex,
321
345
  {
322
346
  direction: "column",
@@ -331,17 +355,11 @@ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
331
355
  gap: 4,
332
356
  children: [
333
357
  /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "start", gap: 1, children: [
334
- /* @__PURE__ */ jsx(Typography, { as: "h3", variant: "delta", fontWeight: "bold", children: name }),
335
- /* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: IsSchedulingEnabled ? scheduledAt ? /* @__PURE__ */ jsx(CapitalizeRelativeTime, { timestamp: new Date(scheduledAt) }) : formatMessage({
358
+ /* @__PURE__ */ jsx(Typography, { textColor: "neutral800", tag: "h3", variant: "delta", fontWeight: "bold", children: name }),
359
+ /* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: scheduledAt ? /* @__PURE__ */ jsx(RelativeTime, { timestamp: new Date(scheduledAt) }) : formatMessage({
336
360
  id: "content-releases.pages.Releases.not-scheduled",
337
361
  defaultMessage: "Not scheduled"
338
- }) : formatMessage(
339
- {
340
- id: "content-releases.page.Releases.release-item.entries",
341
- defaultMessage: "{number, plural, =0 {No entries} one {# entry} other {# entries}}"
342
- },
343
- { number: actions.meta.count }
344
- ) })
362
+ }) })
345
363
  ] }),
346
364
  /* @__PURE__ */ jsx(Badge, { ...getBadgeProps(status), children: status })
347
365
  ]
@@ -358,20 +376,18 @@ const StyledAlert = styled(Alert)`
358
376
  `;
359
377
  const INITIAL_FORM_VALUES = {
360
378
  name: "",
361
- date: null,
379
+ date: void 0,
362
380
  time: "",
363
- // Remove future flag check after Scheduling Beta release and replace with true as creating new release should include scheduling by default
364
- isScheduled: window.strapi.future.isEnabled("contentReleasesScheduling"),
381
+ isScheduled: true,
365
382
  scheduledAt: null,
366
383
  timezone: null
367
384
  };
368
385
  const ReleasesPage = () => {
369
- const tabRef = React.useRef(null);
370
386
  const location = useLocation();
371
387
  const [releaseModalShown, setReleaseModalShown] = React.useState(false);
372
- const toggleNotification = useNotification();
388
+ const { toggleNotification } = useNotification();
373
389
  const { formatMessage } = useIntl();
374
- const { push, replace } = useHistory();
390
+ const navigate = useNavigate();
375
391
  const { formatAPIError } = useAPIErrorHandler();
376
392
  const [{ query }, setQuery] = useQueryParams();
377
393
  const response = useGetReleasesQuery(query);
@@ -379,13 +395,15 @@ const ReleasesPage = () => {
379
395
  const { getFeature } = useLicenseLimits();
380
396
  const { maximumReleases = 3 } = getFeature("cms-content-releases");
381
397
  const { trackUsage } = useTracking();
398
+ const {
399
+ allowedActions: { canCreate }
400
+ } = useRBAC(PERMISSIONS);
382
401
  const { isLoading, isSuccess, isError } = response;
383
402
  const activeTab = response?.currentData?.meta?.activeTab || "pending";
384
- const activeTabIndex = ["pending", "done"].indexOf(activeTab);
385
403
  React.useEffect(() => {
386
404
  if (location?.state?.errors) {
387
405
  toggleNotification({
388
- type: "warning",
406
+ type: "danger",
389
407
  title: formatMessage({
390
408
  id: "content-releases.pages.Releases.notification.error.title",
391
409
  defaultMessage: "Your request could not be processed."
@@ -395,30 +413,25 @@ const ReleasesPage = () => {
395
413
  defaultMessage: "Please try again or open another release."
396
414
  })
397
415
  });
398
- replace({ state: null });
416
+ navigate("", { replace: true, state: null });
399
417
  }
400
- }, [formatMessage, location?.state?.errors, replace, toggleNotification]);
401
- React.useEffect(() => {
402
- if (tabRef.current) {
403
- tabRef.current._handlers.setSelectedTabIndex(activeTabIndex);
404
- }
405
- }, [activeTabIndex]);
418
+ }, [formatMessage, location?.state?.errors, navigate, toggleNotification]);
406
419
  const toggleAddReleaseModal = () => {
407
420
  setReleaseModalShown((prev) => !prev);
408
421
  };
409
422
  if (isLoading) {
410
- return /* @__PURE__ */ jsx(Main, { "aria-busy": isLoading, children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) });
423
+ return /* @__PURE__ */ jsx(Page.Loading, {});
411
424
  }
412
425
  const totalPendingReleases = isSuccess && response.currentData?.meta?.pendingReleasesCount || 0;
413
426
  const hasReachedMaximumPendingReleases = totalPendingReleases >= maximumReleases;
414
- const handleTabChange = (index) => {
427
+ const handleTabChange = (tabValue) => {
415
428
  setQuery({
416
429
  ...query,
417
430
  page: 1,
418
431
  pageSize: response?.currentData?.meta?.pagination?.pageSize || 16,
419
432
  filters: {
420
433
  releasedAt: {
421
- $notNull: index === 0 ? false : true
434
+ $notNull: tabValue === "pending"
422
435
  }
423
436
  }
424
437
  });
@@ -438,22 +451,22 @@ const ReleasesPage = () => {
438
451
  })
439
452
  });
440
453
  trackUsage("didCreateRelease");
441
- push(`/plugins/content-releases/${response2.data.data.id}`);
442
- } else if (isAxiosError(response2.error)) {
454
+ navigate(response2.data.data.id.toString());
455
+ } else if (isFetchError(response2.error)) {
443
456
  toggleNotification({
444
- type: "warning",
457
+ type: "danger",
445
458
  message: formatAPIError(response2.error)
446
459
  });
447
460
  } else {
448
461
  toggleNotification({
449
- type: "warning",
462
+ type: "danger",
450
463
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
451
464
  });
452
465
  }
453
466
  };
454
467
  return /* @__PURE__ */ jsxs(Main, { "aria-busy": isLoading, children: [
455
468
  /* @__PURE__ */ jsx(
456
- HeaderLayout,
469
+ Layouts.Header,
457
470
  {
458
471
  title: formatMessage({
459
472
  id: "content-releases.pages.Releases.title",
@@ -463,7 +476,7 @@ const ReleasesPage = () => {
463
476
  id: "content-releases.pages.Releases.header-subtitle",
464
477
  defaultMessage: "Create and manage content updates"
465
478
  }),
466
- primaryAction: /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.create, children: /* @__PURE__ */ jsx(
479
+ primaryAction: canCreate ? /* @__PURE__ */ jsx(
467
480
  Button,
468
481
  {
469
482
  startIcon: /* @__PURE__ */ jsx(Plus, {}),
@@ -474,10 +487,10 @@ const ReleasesPage = () => {
474
487
  defaultMessage: "New release"
475
488
  })
476
489
  }
477
- ) })
490
+ ) : null
478
491
  }
479
492
  ),
480
- /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsxs(Fragment, { children: [
493
+ /* @__PURE__ */ jsx(Layouts.Content, { children: /* @__PURE__ */ jsxs(Fragment, { children: [
481
494
  hasReachedMaximumPendingReleases && /* @__PURE__ */ jsx(
482
495
  StyledAlert,
483
496
  {
@@ -502,21 +515,17 @@ const ReleasesPage = () => {
502
515
  })
503
516
  }
504
517
  ),
505
- /* @__PURE__ */ jsxs(
506
- TabGroup,
507
- {
508
- label: formatMessage({
509
- id: "content-releases.pages.Releases.tab-group.label",
510
- defaultMessage: "Releases list"
511
- }),
512
- variant: "simple",
513
- initialSelectedTabIndex: activeTabIndex,
514
- onTabChange: handleTabChange,
515
- ref: tabRef,
516
- children: [
517
- /* @__PURE__ */ jsxs(Box, { paddingBottom: 8, children: [
518
- /* @__PURE__ */ jsxs(Tabs, { children: [
519
- /* @__PURE__ */ jsx(Tab, { children: formatMessage(
518
+ /* @__PURE__ */ jsxs(Tabs.Root, { variant: "simple", onValueChange: handleTabChange, value: activeTab, children: [
519
+ /* @__PURE__ */ jsxs(Box, { paddingBottom: 8, children: [
520
+ /* @__PURE__ */ jsxs(
521
+ Tabs.List,
522
+ {
523
+ "aria-label": formatMessage({
524
+ id: "content-releases.pages.Releases.tab-group.label",
525
+ defaultMessage: "Releases list"
526
+ }),
527
+ children: [
528
+ /* @__PURE__ */ jsx(Tabs.Trigger, { value: "pending", children: formatMessage(
520
529
  {
521
530
  id: "content-releases.pages.Releases.tab.pending",
522
531
  defaultMessage: "Pending ({count})"
@@ -525,55 +534,48 @@ const ReleasesPage = () => {
525
534
  count: totalPendingReleases
526
535
  }
527
536
  ) }),
528
- /* @__PURE__ */ jsx(Tab, { children: formatMessage({
537
+ /* @__PURE__ */ jsx(Tabs.Trigger, { value: "done", children: formatMessage({
529
538
  id: "content-releases.pages.Releases.tab.done",
530
539
  defaultMessage: "Done"
531
540
  }) })
532
- ] }),
533
- /* @__PURE__ */ jsx(Divider, {})
534
- ] }),
535
- /* @__PURE__ */ jsxs(TabPanels, { children: [
536
- /* @__PURE__ */ jsx(TabPanel, { children: /* @__PURE__ */ jsx(
537
- ReleasesGrid,
538
- {
539
- sectionTitle: "pending",
540
- releases: response?.currentData?.data,
541
- isError
542
- }
543
- ) }),
544
- /* @__PURE__ */ jsx(TabPanel, { children: /* @__PURE__ */ jsx(
545
- ReleasesGrid,
546
- {
547
- sectionTitle: "done",
548
- releases: response?.currentData?.data,
549
- isError
550
- }
551
- ) })
552
- ] })
553
- ]
554
- }
555
- ),
556
- response.currentData?.meta?.pagination?.total ? /* @__PURE__ */ jsxs(Flex, { paddingTop: 4, alignItems: "flex-end", justifyContent: "space-between", children: [
557
- /* @__PURE__ */ jsx(
558
- PageSizeURLQuery,
541
+ ]
542
+ }
543
+ ),
544
+ /* @__PURE__ */ jsx(Divider, {})
545
+ ] }),
546
+ /* @__PURE__ */ jsx(Tabs.Content, { value: "pending", children: /* @__PURE__ */ jsx(
547
+ ReleasesGrid,
559
548
  {
560
- options: ["8", "16", "32", "64"],
561
- defaultValue: response?.currentData?.meta?.pagination?.pageSize.toString()
549
+ sectionTitle: "pending",
550
+ releases: response?.currentData?.data,
551
+ isError
562
552
  }
563
- ),
564
- /* @__PURE__ */ jsx(
565
- PaginationURLQuery,
553
+ ) }),
554
+ /* @__PURE__ */ jsx(Tabs.Content, { value: "done", children: /* @__PURE__ */ jsx(
555
+ ReleasesGrid,
566
556
  {
567
- pagination: {
568
- pageCount: response?.currentData?.meta?.pagination?.pageCount || 0
569
- }
557
+ sectionTitle: "done",
558
+ releases: response?.currentData?.data,
559
+ isError
570
560
  }
571
- )
572
- ] }) : null
561
+ ) })
562
+ ] }),
563
+ /* @__PURE__ */ jsxs(
564
+ Pagination.Root,
565
+ {
566
+ ...response?.currentData?.meta?.pagination,
567
+ defaultPageSize: response?.currentData?.meta?.pagination?.pageSize,
568
+ children: [
569
+ /* @__PURE__ */ jsx(Pagination.PageSize, { options: ["8", "16", "32", "64"] }),
570
+ /* @__PURE__ */ jsx(Pagination.Links, {})
571
+ ]
572
+ }
573
+ )
573
574
  ] }) }),
574
- releaseModalShown && /* @__PURE__ */ jsx(
575
+ /* @__PURE__ */ jsx(
575
576
  ReleaseModal,
576
577
  {
578
+ open: releaseModalShown,
577
579
  handleClose: toggleAddReleaseModal,
578
580
  handleSubmit: handleAddRelease,
579
581
  isLoading: isSubmittingForm,
@@ -597,7 +599,7 @@ const StyledMenuItem = styled(Menu.Item)`
597
599
  }
598
600
 
599
601
  &:hover {
600
- background: ${({ theme, variant = "neutral" }) => theme.colors[`${variant}100`]};
602
+ background: ${({ theme, $variant = "neutral" }) => theme.colors[`${$variant}100`]};
601
603
  }
602
604
  `;
603
605
  const PencilIcon = styled(Pencil)`
@@ -617,29 +619,34 @@ const TrashIcon = styled(Trash)`
617
619
  const TypographyMaxWidth = styled(Typography)`
618
620
  max-width: 300px;
619
621
  `;
620
- const EntryValidationText = ({ action, schema, components, entry }) => {
622
+ const EntryValidationText = ({ action, schema, entry }) => {
621
623
  const { formatMessage } = useIntl();
622
- const { validate } = unstable_useDocument();
623
- const { errors } = validate(entry, {
624
- contentType: schema,
625
- components,
626
- isCreatingEntry: false
627
- });
624
+ const { validate } = unstable_useDocument(
625
+ {
626
+ collectionType: schema?.kind ?? "",
627
+ model: schema?.uid ?? ""
628
+ },
629
+ {
630
+ skip: !schema
631
+ }
632
+ );
633
+ const errors = validate(entry) ?? {};
628
634
  if (Object.keys(errors).length > 0) {
629
635
  const validationErrorsMessages = Object.entries(errors).map(
630
636
  ([key, value]) => formatMessage(
637
+ // @ts-expect-error – TODO: fix this will better checks
631
638
  { id: `${value.id}.withField`, defaultMessage: value.defaultMessage },
632
639
  { field: key }
633
640
  )
634
641
  ).join(" ");
635
642
  return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
636
- /* @__PURE__ */ jsx(Icon, { color: "danger600", as: CrossCircle }),
643
+ /* @__PURE__ */ jsx(CrossCircle, { fill: "danger600" }),
637
644
  /* @__PURE__ */ jsx(Tooltip, { description: validationErrorsMessages, children: /* @__PURE__ */ jsx(TypographyMaxWidth, { textColor: "danger600", variant: "omega", fontWeight: "semiBold", ellipsis: true, children: validationErrorsMessages }) })
638
645
  ] });
639
646
  }
640
647
  if (action == "publish") {
641
648
  return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
642
- /* @__PURE__ */ jsx(Icon, { color: "success600", as: CheckCircle }),
649
+ /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
643
650
  entry.publishedAt ? /* @__PURE__ */ jsx(Typography, { textColor: "success600", fontWeight: "bold", children: formatMessage({
644
651
  id: "content-releases.pages.ReleaseDetails.entry-validation.already-published",
645
652
  defaultMessage: "Already published"
@@ -650,7 +657,7 @@ const EntryValidationText = ({ action, schema, components, entry }) => {
650
657
  ] });
651
658
  }
652
659
  return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
653
- /* @__PURE__ */ jsx(Icon, { color: "success600", as: CheckCircle }),
660
+ /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
654
661
  !entry.publishedAt ? /* @__PURE__ */ jsx(Typography, { textColor: "success600", fontWeight: "bold", children: formatMessage({
655
662
  id: "content-releases.pages.ReleaseDetails.entry-validation.already-unpublished",
656
663
  defaultMessage: "Already unpublished"
@@ -670,20 +677,23 @@ const ReleaseDetailsLayout = ({
670
677
  const {
671
678
  data,
672
679
  isLoading: isLoadingDetails,
673
- isError,
674
680
  error
675
- } = useGetReleaseQuery({ id: releaseId });
681
+ } = useGetReleaseQuery(
682
+ { id: releaseId },
683
+ {
684
+ skip: !releaseId
685
+ }
686
+ );
676
687
  const [publishRelease, { isLoading: isPublishing }] = usePublishReleaseMutation();
677
- const toggleNotification = useNotification();
688
+ const { toggleNotification } = useNotification();
678
689
  const { formatAPIError } = useAPIErrorHandler();
679
- const {
680
- allowedActions: { canUpdate, canDelete }
681
- } = useRBAC(PERMISSIONS);
690
+ const { allowedActions } = useRBAC(PERMISSIONS);
691
+ const { canUpdate, canDelete, canPublish } = allowedActions;
682
692
  const dispatch = useTypedDispatch();
683
693
  const { trackUsage } = useTracking();
684
694
  const release = data?.data;
685
- const handlePublishRelease = async () => {
686
- const response = await publishRelease({ id: releaseId });
695
+ const handlePublishRelease = (id) => async () => {
696
+ const response = await publishRelease({ id });
687
697
  if ("data" in response) {
688
698
  toggleNotification({
689
699
  type: "success",
@@ -698,20 +708,25 @@ const ReleaseDetailsLayout = ({
698
708
  totalPublishedEntries,
699
709
  totalUnpublishedEntries
700
710
  });
701
- } else if (isAxiosError(response.error)) {
711
+ } else if (isFetchError(response.error)) {
702
712
  toggleNotification({
703
- type: "warning",
713
+ type: "danger",
704
714
  message: formatAPIError(response.error)
705
715
  });
706
716
  } else {
707
717
  toggleNotification({
708
- type: "warning",
718
+ type: "danger",
709
719
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
710
720
  });
711
721
  }
712
722
  };
713
723
  const handleRefresh = () => {
714
- dispatch(releaseApi.util.invalidateTags([{ type: "ReleaseAction", id: "LIST" }]));
724
+ dispatch(
725
+ releaseApi.util.invalidateTags([
726
+ { type: "ReleaseAction", id: "LIST" },
727
+ { type: "Release", id: releaseId }
728
+ ])
729
+ );
715
730
  };
716
731
  const getCreatedByUser = () => {
717
732
  if (!release?.createdBy) {
@@ -726,28 +741,26 @@ const ReleaseDetailsLayout = ({
726
741
  return release.createdBy.email;
727
742
  };
728
743
  if (isLoadingDetails) {
729
- return /* @__PURE__ */ jsx(Main, { "aria-busy": isLoadingDetails, children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) });
744
+ return /* @__PURE__ */ jsx(Page.Loading, {});
730
745
  }
731
- if (isError || !release) {
746
+ if (isBaseQueryError(error) && "code" in error || !release) {
732
747
  return /* @__PURE__ */ jsx(
733
- Redirect,
748
+ Navigate,
734
749
  {
735
- to: {
736
- pathname: "/plugins/content-releases",
737
- state: {
738
- errors: [
739
- {
740
- code: error?.code
741
- }
742
- ]
743
- }
750
+ to: "..",
751
+ state: {
752
+ errors: [
753
+ {
754
+ // @ts-expect-error – TODO: fix this weird error flow
755
+ code: error?.code
756
+ }
757
+ ]
744
758
  }
745
759
  }
746
760
  );
747
761
  }
748
762
  const totalEntries = release.actions.meta.count || 0;
749
763
  const hasCreatedByUser = Boolean(getCreatedByUser());
750
- const IsSchedulingEnabled = window.strapi.future.isEnabled("contentReleasesScheduling");
751
764
  const isScheduled = release.scheduledAt && release.timezone;
752
765
  const numberOfEntriesText = formatMessage(
753
766
  {
@@ -778,34 +791,30 @@ const ReleaseDetailsLayout = ({
778
791
  ) : "";
779
792
  return /* @__PURE__ */ jsxs(Main, { "aria-busy": isLoadingDetails, children: [
780
793
  /* @__PURE__ */ jsx(
781
- HeaderLayout,
794
+ Layouts.Header,
782
795
  {
783
796
  title: release.name,
784
797
  subtitle: /* @__PURE__ */ jsxs(Flex, { gap: 2, lineHeight: 6, children: [
785
- /* @__PURE__ */ jsx(Typography, { textColor: "neutral600", variant: "epsilon", children: numberOfEntriesText + (IsSchedulingEnabled && isScheduled ? ` - ${scheduledText}` : "") }),
798
+ /* @__PURE__ */ jsx(Typography, { textColor: "neutral600", variant: "epsilon", children: numberOfEntriesText + (isScheduled ? ` - ${scheduledText}` : "") }),
786
799
  /* @__PURE__ */ jsx(Badge, { ...getBadgeProps(release.status), children: release.status })
787
800
  ] }),
788
- navigationAction: /* @__PURE__ */ jsx(Link$1, { startIcon: /* @__PURE__ */ jsx(ArrowLeft, {}), to: "/plugins/content-releases", children: formatMessage({
789
- id: "global.back",
790
- defaultMessage: "Back"
791
- }) }),
801
+ navigationAction: /* @__PURE__ */ jsx(BackButton, {}),
792
802
  primaryAction: !release.releasedAt && /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
793
803
  /* @__PURE__ */ jsxs(Menu.Root, { children: [
794
804
  /* @__PURE__ */ jsx(
795
805
  Menu.Trigger,
796
806
  {
797
- as: IconButton,
798
807
  paddingLeft: 2,
799
808
  paddingRight: 2,
800
809
  "aria-label": formatMessage({
801
810
  id: "content-releases.header.actions.open-release-actions",
802
811
  defaultMessage: "Release edit and delete menu"
803
812
  }),
804
- icon: /* @__PURE__ */ jsx(More, {}),
805
- variant: "tertiary"
813
+ variant: "tertiary",
814
+ children: /* @__PURE__ */ jsx(More, {})
806
815
  }
807
816
  ),
808
- /* @__PURE__ */ jsxs(Menu.Content, { top: 1, popoverPlacement: "bottom-end", children: [
817
+ /* @__PURE__ */ jsxs(Menu.Content, { top: 1, popoverPlacement: "bottom-end", maxHeight: void 0, children: [
809
818
  /* @__PURE__ */ jsxs(
810
819
  Flex,
811
820
  {
@@ -827,7 +836,7 @@ const ReleaseDetailsLayout = ({
827
836
  {
828
837
  disabled: !canDelete,
829
838
  onSelect: toggleWarningSubmit,
830
- variant: "danger",
839
+ $variant: "danger",
831
840
  children: /* @__PURE__ */ jsxs(Flex, { alignItems: "center", gap: 2, hasRadius: true, width: "100%", children: [
832
841
  /* @__PURE__ */ jsx(TrashIcon, {}),
833
842
  /* @__PURE__ */ jsx(Typography, { ellipsis: true, textColor: "danger600", children: formatMessage({
@@ -854,7 +863,7 @@ const ReleaseDetailsLayout = ({
854
863
  defaultMessage: "Created"
855
864
  }) }),
856
865
  /* @__PURE__ */ jsxs(Typography, { variant: "pi", color: "neutral300", children: [
857
- /* @__PURE__ */ jsx(RelativeTime, { timestamp: new Date(release.createdAt) }),
866
+ /* @__PURE__ */ jsx(RelativeTime$1, { timestamp: new Date(release.createdAt) }),
858
867
  formatMessage(
859
868
  {
860
869
  id: "content-releases.header.actions.created.description",
@@ -872,12 +881,12 @@ const ReleaseDetailsLayout = ({
872
881
  id: "content-releases.header.actions.refresh",
873
882
  defaultMessage: "Refresh"
874
883
  }) }),
875
- /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.publish, children: /* @__PURE__ */ jsx(
884
+ canPublish ? /* @__PURE__ */ jsx(
876
885
  Button,
877
886
  {
878
887
  size: "S",
879
888
  variant: "default",
880
- onClick: handlePublishRelease,
889
+ onClick: handlePublishRelease(release.id.toString()),
881
890
  loading: isPublishing,
882
891
  disabled: release.actions.meta.count === 0,
883
892
  children: formatMessage({
@@ -885,7 +894,7 @@ const ReleaseDetailsLayout = ({
885
894
  defaultMessage: "Publish"
886
895
  })
887
896
  }
888
- ) })
897
+ ) : null
889
898
  ] })
890
899
  }
891
900
  ),
@@ -893,6 +902,7 @@ const ReleaseDetailsLayout = ({
893
902
  ] });
894
903
  };
895
904
  const GROUP_BY_OPTIONS = ["contentType", "locale", "action"];
905
+ const GROUP_BY_OPTIONS_NO_LOCALE = ["contentType", "action"];
896
906
  const getGroupByOptionLabel = (value) => {
897
907
  if (value === "locale") {
898
908
  return {
@@ -911,21 +921,33 @@ const getGroupByOptionLabel = (value) => {
911
921
  defaultMessage: "Content-Types"
912
922
  };
913
923
  };
914
- const ReleaseDetailsBody = () => {
924
+ const ReleaseDetailsBody = ({ releaseId }) => {
915
925
  const { formatMessage } = useIntl();
916
- const { releaseId } = useParams();
917
926
  const [{ query }, setQuery] = useQueryParams();
918
- const toggleNotification = useNotification();
927
+ const { toggleNotification } = useNotification();
919
928
  const { formatAPIError } = useAPIErrorHandler();
920
929
  const {
921
930
  data: releaseData,
922
931
  isLoading: isReleaseLoading,
923
- isError: isReleaseError,
924
932
  error: releaseError
925
933
  } = useGetReleaseQuery({ id: releaseId });
926
934
  const {
927
935
  allowedActions: { canUpdate }
928
936
  } = useRBAC(PERMISSIONS);
937
+ const runHookWaterfall = useStrapiApp("ReleaseDetailsPage", (state) => state.runHookWaterfall);
938
+ const { hasI18nEnabled } = runHookWaterfall(
939
+ "ContentReleases/pages/ReleaseDetails/add-locale-in-releases",
940
+ {
941
+ displayedHeaders: {
942
+ label: formatMessage({
943
+ id: "content-releases.page.ReleaseDetails.table.header.label.locale",
944
+ defaultMessage: "locale"
945
+ }),
946
+ name: "locale"
947
+ },
948
+ hasI18nEnabled: false
949
+ }
950
+ );
929
951
  const release = releaseData?.data;
930
952
  const selectedGroupBy = query?.groupBy || "contentType";
931
953
  const {
@@ -954,65 +976,59 @@ const ReleaseDetailsBody = () => {
954
976
  // We are passing the action path to found the position in the cache of the action for optimistic updates
955
977
  });
956
978
  if ("error" in response) {
957
- if (isAxiosError(response.error)) {
979
+ if (isFetchError(response.error)) {
958
980
  toggleNotification({
959
- type: "warning",
981
+ type: "danger",
960
982
  message: formatAPIError(response.error)
961
983
  });
962
984
  } else {
963
985
  toggleNotification({
964
- type: "warning",
986
+ type: "danger",
965
987
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
966
988
  });
967
989
  }
968
990
  }
969
991
  };
970
992
  if (isLoading || isReleaseLoading) {
971
- return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) });
993
+ return /* @__PURE__ */ jsx(Page.Loading, {});
972
994
  }
973
995
  const releaseActions = data?.data;
974
996
  const releaseMeta = data?.meta;
975
997
  const contentTypes = releaseMeta?.contentTypes || {};
976
998
  const components = releaseMeta?.components || {};
977
- if (isReleaseError || !release) {
999
+ if (isBaseQueryError(releaseError) || !release) {
978
1000
  const errorsArray = [];
979
- if (releaseError) {
1001
+ if (releaseError && "code" in releaseError) {
980
1002
  errorsArray.push({
981
1003
  code: releaseError.code
982
1004
  });
983
1005
  }
984
- if (releaseActionsError) {
1006
+ if (releaseActionsError && "code" in releaseActionsError) {
985
1007
  errorsArray.push({
986
1008
  code: releaseActionsError.code
987
1009
  });
988
1010
  }
989
1011
  return /* @__PURE__ */ jsx(
990
- Redirect,
1012
+ Navigate,
991
1013
  {
992
- to: {
993
- pathname: "/plugins/content-releases",
994
- state: {
995
- errors: errorsArray
996
- }
1014
+ to: "..",
1015
+ state: {
1016
+ errors: errorsArray
997
1017
  }
998
1018
  }
999
1019
  );
1000
1020
  }
1001
1021
  if (isError || !releaseActions) {
1002
- return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(AnErrorOccurred, {}) });
1022
+ return /* @__PURE__ */ jsx(Page.Error, {});
1003
1023
  }
1004
1024
  if (Object.keys(releaseActions).length === 0) {
1005
- return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(
1006
- NoContent,
1025
+ return /* @__PURE__ */ jsx(Layouts.Content, { children: /* @__PURE__ */ jsx(
1026
+ EmptyStateLayout,
1007
1027
  {
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
1028
  action: /* @__PURE__ */ jsx(
1013
1029
  LinkButton,
1014
1030
  {
1015
- as: Link$2,
1031
+ tag: Link$1,
1016
1032
  to: {
1017
1033
  pathname: "/content-manager"
1018
1034
  },
@@ -1023,18 +1039,59 @@ const ReleaseDetailsBody = () => {
1023
1039
  defaultMessage: "Open the Content Manager"
1024
1040
  })
1025
1041
  }
1026
- )
1042
+ ),
1043
+ icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "16rem" }),
1044
+ content: formatMessage({
1045
+ id: "content-releases.pages.Details.tab.emptyEntries",
1046
+ defaultMessage: "This release is empty. Open the Content Manager, select an entry and add it to the release."
1047
+ })
1027
1048
  }
1028
1049
  ) });
1029
1050
  }
1030
- return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsxs(Flex, { gap: 8, direction: "column", alignItems: "stretch", children: [
1051
+ const groupByLabel = formatMessage({
1052
+ id: "content-releases.pages.ReleaseDetails.groupBy.aria-label",
1053
+ defaultMessage: "Group by"
1054
+ });
1055
+ const headers = [
1056
+ // ...displayedHeaders,
1057
+ {
1058
+ label: formatMessage({
1059
+ id: "content-releases.page.ReleaseDetails.table.header.label.name",
1060
+ defaultMessage: "name"
1061
+ }),
1062
+ name: "name"
1063
+ },
1064
+ {
1065
+ label: formatMessage({
1066
+ id: "content-releases.page.ReleaseDetails.table.header.label.content-type",
1067
+ defaultMessage: "content-type"
1068
+ }),
1069
+ name: "content-type"
1070
+ },
1071
+ {
1072
+ label: formatMessage({
1073
+ id: "content-releases.page.ReleaseDetails.table.header.label.action",
1074
+ defaultMessage: "action"
1075
+ }),
1076
+ name: "action"
1077
+ },
1078
+ ...!release.releasedAt ? [
1079
+ {
1080
+ label: formatMessage({
1081
+ id: "content-releases.page.ReleaseDetails.table.header.label.status",
1082
+ defaultMessage: "status"
1083
+ }),
1084
+ name: "status"
1085
+ }
1086
+ ] : []
1087
+ ];
1088
+ const options = hasI18nEnabled ? GROUP_BY_OPTIONS : GROUP_BY_OPTIONS_NO_LOCALE;
1089
+ return /* @__PURE__ */ jsx(Layouts.Content, { children: /* @__PURE__ */ jsxs(Flex, { gap: 8, direction: "column", alignItems: "stretch", children: [
1031
1090
  /* @__PURE__ */ jsx(Flex, { children: /* @__PURE__ */ jsx(
1032
1091
  SingleSelect,
1033
1092
  {
1034
- "aria-label": formatMessage({
1035
- id: "content-releases.pages.ReleaseDetails.groupBy.aria-label",
1036
- defaultMessage: "Group by"
1037
- }),
1093
+ placeholder: groupByLabel,
1094
+ "aria-label": groupByLabel,
1038
1095
  customizeContent: (value) => formatMessage(
1039
1096
  {
1040
1097
  id: `content-releases.pages.ReleaseDetails.groupBy.label`,
@@ -1046,7 +1103,7 @@ const ReleaseDetailsBody = () => {
1046
1103
  ),
1047
1104
  value: formatMessage(getGroupByOptionLabel(selectedGroupBy)),
1048
1105
  onChange: (value) => setQuery({ groupBy: value }),
1049
- children: GROUP_BY_OPTIONS.map((option) => /* @__PURE__ */ jsx(SingleSelectOption, { value: option, children: formatMessage(getGroupByOptionLabel(option)) }, option))
1106
+ children: options.map((option) => /* @__PURE__ */ jsx(SingleSelectOption, { value: option, children: formatMessage(getGroupByOptionLabel(option)) }, option))
1050
1107
  }
1051
1108
  ) }),
1052
1109
  Object.keys(releaseActions).map((key) => /* @__PURE__ */ jsxs(Flex, { gap: 4, direction: "column", alignItems: "stretch", children: [
@@ -1058,72 +1115,15 @@ const ReleaseDetailsBody = () => {
1058
1115
  ...item,
1059
1116
  id: Number(item.entry.id)
1060
1117
  })),
1061
- colCount: releaseActions[key].length,
1062
- isLoading,
1063
- isFetching,
1118
+ headers,
1119
+ isLoading: isLoading || isFetching,
1064
1120
  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, {}),
1121
+ /* @__PURE__ */ jsx(Table.Head, { children: headers.map((header) => /* @__PURE__ */ jsx(Table.HeaderCell, { ...header }, header.name)) }),
1122
+ /* @__PURE__ */ jsx(Table.Loading, {}),
1123
1123
  /* @__PURE__ */ jsx(Table.Body, { children: releaseActions[key].map(
1124
1124
  ({ id, contentType, locale, type, entry }, actionIndex) => /* @__PURE__ */ jsxs(Tr, { children: [
1125
1125
  /* @__PURE__ */ jsx(Td, { width: "25%", maxWidth: "200px", children: /* @__PURE__ */ jsx(Typography, { ellipsis: true, children: `${contentType.mainFieldValue || entry.id}` }) }),
1126
- /* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: `${locale?.name ? locale.name : "-"}` }) }),
1126
+ hasI18nEnabled && /* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: `${locale?.name ? locale.name : "-"}` }) }),
1127
1127
  /* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: contentType.displayName || "" }) }),
1128
1128
  /* @__PURE__ */ jsx(Td, { width: "20%", children: release.releasedAt ? /* @__PURE__ */ jsx(Typography, { children: formatMessage(
1129
1129
  {
@@ -1177,34 +1177,39 @@ const ReleaseDetailsBody = () => {
1177
1177
  }
1178
1178
  )
1179
1179
  ] }, `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
- ] })
1180
+ /* @__PURE__ */ jsxs(
1181
+ Pagination.Root,
1182
+ {
1183
+ ...releaseMeta?.pagination,
1184
+ defaultPageSize: releaseMeta?.pagination?.pageSize,
1185
+ children: [
1186
+ /* @__PURE__ */ jsx(Pagination.PageSize, {}),
1187
+ /* @__PURE__ */ jsx(Pagination.Links, {})
1188
+ ]
1189
+ }
1190
+ )
1191
1191
  ] }) });
1192
1192
  };
1193
1193
  const ReleaseDetailsPage = () => {
1194
1194
  const { formatMessage } = useIntl();
1195
1195
  const { releaseId } = useParams();
1196
- const toggleNotification = useNotification();
1196
+ const { toggleNotification } = useNotification();
1197
1197
  const { formatAPIError } = useAPIErrorHandler();
1198
- const { replace } = useHistory();
1198
+ const navigate = useNavigate();
1199
1199
  const [releaseModalShown, setReleaseModalShown] = React.useState(false);
1200
1200
  const [showWarningSubmit, setWarningSubmit] = React.useState(false);
1201
1201
  const {
1202
1202
  isLoading: isLoadingDetails,
1203
1203
  data,
1204
1204
  isSuccess: isSuccessDetails
1205
- } = useGetReleaseQuery({ id: releaseId });
1205
+ } = useGetReleaseQuery(
1206
+ { id: releaseId },
1207
+ {
1208
+ skip: !releaseId
1209
+ }
1210
+ );
1206
1211
  const [updateRelease, { isLoading: isSubmittingForm }] = useUpdateReleaseMutation();
1207
- const [deleteRelease, { isLoading: isDeletingRelease }] = useDeleteReleaseMutation();
1212
+ const [deleteRelease] = useDeleteReleaseMutation();
1208
1213
  const toggleEditReleaseModal = () => {
1209
1214
  setReleaseModalShown((prev) => !prev);
1210
1215
  };
@@ -1215,15 +1220,18 @@ const ReleaseDetailsPage = () => {
1215
1220
  {
1216
1221
  toggleEditReleaseModal,
1217
1222
  toggleWarningSubmit,
1218
- children: /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) })
1223
+ children: /* @__PURE__ */ jsx(Page.Loading, {})
1219
1224
  }
1220
1225
  );
1221
1226
  }
1227
+ if (!releaseId) {
1228
+ return /* @__PURE__ */ jsx(Navigate, { to: ".." });
1229
+ }
1222
1230
  const releaseData = isSuccessDetails && data?.data || null;
1223
1231
  const title = releaseData?.name || "";
1224
1232
  const timezone = releaseData?.timezone ?? null;
1225
1233
  const scheduledAt = releaseData?.scheduledAt && timezone ? utcToZonedTime(releaseData.scheduledAt, timezone) : null;
1226
- const date = scheduledAt ? new Date(format(scheduledAt, "yyyy-MM-dd")) : null;
1234
+ const date = scheduledAt ? format(scheduledAt, "yyyy-MM-dd") : void 0;
1227
1235
  const time = scheduledAt ? format(scheduledAt, "HH:mm") : "";
1228
1236
  const handleEditRelease = async (values) => {
1229
1237
  const response = await updateRelease({
@@ -1240,33 +1248,33 @@ const ReleaseDetailsPage = () => {
1240
1248
  defaultMessage: "Release updated."
1241
1249
  })
1242
1250
  });
1243
- } else if (isAxiosError(response.error)) {
1251
+ toggleEditReleaseModal();
1252
+ } else if (isFetchError(response.error)) {
1244
1253
  toggleNotification({
1245
- type: "warning",
1254
+ type: "danger",
1246
1255
  message: formatAPIError(response.error)
1247
1256
  });
1248
1257
  } else {
1249
1258
  toggleNotification({
1250
- type: "warning",
1259
+ type: "danger",
1251
1260
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
1252
1261
  });
1253
1262
  }
1254
- toggleEditReleaseModal();
1255
1263
  };
1256
1264
  const handleDeleteRelease = async () => {
1257
1265
  const response = await deleteRelease({
1258
1266
  id: releaseId
1259
1267
  });
1260
1268
  if ("data" in response) {
1261
- replace("/plugins/content-releases");
1262
- } else if (isAxiosError(response.error)) {
1269
+ navigate("..");
1270
+ } else if (isFetchError(response.error)) {
1263
1271
  toggleNotification({
1264
- type: "warning",
1272
+ type: "danger",
1265
1273
  message: formatAPIError(response.error)
1266
1274
  });
1267
1275
  } else {
1268
1276
  toggleNotification({
1269
- type: "warning",
1277
+ type: "danger",
1270
1278
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
1271
1279
  });
1272
1280
  }
@@ -1277,10 +1285,11 @@ const ReleaseDetailsPage = () => {
1277
1285
  toggleEditReleaseModal,
1278
1286
  toggleWarningSubmit,
1279
1287
  children: [
1280
- /* @__PURE__ */ jsx(ReleaseDetailsBody, {}),
1281
- releaseModalShown && /* @__PURE__ */ jsx(
1288
+ /* @__PURE__ */ jsx(ReleaseDetailsBody, { releaseId }),
1289
+ /* @__PURE__ */ jsx(
1282
1290
  ReleaseModal,
1283
1291
  {
1292
+ open: releaseModalShown,
1284
1293
  handleClose: toggleEditReleaseModal,
1285
1294
  handleSubmit: handleEditRelease,
1286
1295
  isLoading: isLoadingDetails || isSubmittingForm,
@@ -1294,30 +1303,21 @@ const ReleaseDetailsPage = () => {
1294
1303
  }
1295
1304
  }
1296
1305
  ),
1297
- /* @__PURE__ */ jsx(
1298
- ConfirmDialog,
1299
- {
1300
- bodyText: {
1301
- id: "content-releases.dialog.confirmation-message",
1302
- defaultMessage: "Are you sure you want to delete this release?"
1303
- },
1304
- isOpen: showWarningSubmit,
1305
- isConfirmButtonLoading: isDeletingRelease,
1306
- onToggleDialog: toggleWarningSubmit,
1307
- onConfirm: handleDeleteRelease
1308
- }
1309
- )
1306
+ /* @__PURE__ */ jsx(Dialog.Root, { open: showWarningSubmit, onOpenChange: toggleWarningSubmit, children: /* @__PURE__ */ jsx(ConfirmDialog, { onConfirm: handleDeleteRelease, children: formatMessage({
1307
+ id: "content-releases.dialog.confirmation-message",
1308
+ defaultMessage: "Are you sure you want to delete this release?"
1309
+ }) }) })
1310
1310
  ]
1311
1311
  }
1312
1312
  );
1313
1313
  };
1314
1314
  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 })
1315
+ return /* @__PURE__ */ jsx(Page.Protect, { permissions: PERMISSIONS.main, children: /* @__PURE__ */ jsxs(Routes, { children: [
1316
+ /* @__PURE__ */ jsx(Route, { index: true, element: /* @__PURE__ */ jsx(ReleasesPage, {}) }),
1317
+ /* @__PURE__ */ jsx(Route, { path: ":releaseId", element: /* @__PURE__ */ jsx(ReleaseDetailsPage, {}) })
1318
1318
  ] }) });
1319
1319
  };
1320
1320
  export {
1321
1321
  App
1322
1322
  };
1323
- //# sourceMappingURL=App-bpzO2Ljh.mjs.map
1323
+ //# sourceMappingURL=App-Do-Rnv0A.mjs.map