@strapi/content-releases 4.20.5 → 5.0.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/dist/_chunks/{App-bpzO2Ljh.mjs → App-dbdAcsz_.mjs} +286 -288
  2. package/dist/_chunks/App-dbdAcsz_.mjs.map +1 -0
  3. package/dist/_chunks/{App-p8aKBitd.js → App-zwe_jKPv.js} +292 -294
  4. package/dist/_chunks/App-zwe_jKPv.js.map +1 -0
  5. package/dist/_chunks/{en-WuuhP6Bn.mjs → en-RdapH-9X.mjs} +1 -2
  6. package/dist/_chunks/en-RdapH-9X.mjs.map +1 -0
  7. package/dist/_chunks/{en-gcJJ5htG.js → en-faJDuv3q.js} +1 -2
  8. package/dist/_chunks/en-faJDuv3q.js.map +1 -0
  9. package/dist/_chunks/{index-AECgcaDa.mjs → index-RBaVMtyr.mjs} +78 -69
  10. package/dist/_chunks/index-RBaVMtyr.mjs.map +1 -0
  11. package/dist/_chunks/{index-fP3qoWZ4.js → index-TBrVNrv9.js} +76 -67
  12. package/dist/_chunks/index-TBrVNrv9.js.map +1 -0
  13. package/dist/admin/index.js +1 -14
  14. package/dist/admin/index.js.map +1 -1
  15. package/dist/admin/index.mjs +1 -14
  16. package/dist/admin/index.mjs.map +1 -1
  17. package/dist/admin/src/components/CMReleasesContainer.d.ts +1 -0
  18. package/dist/admin/src/components/RelativeTime.d.ts +28 -0
  19. package/dist/admin/src/components/ReleaseActionMenu.d.ts +26 -0
  20. package/dist/admin/src/components/ReleaseActionOptions.d.ts +9 -0
  21. package/dist/admin/src/components/ReleaseModal.d.ts +16 -0
  22. package/dist/admin/src/constants.d.ts +58 -0
  23. package/dist/admin/src/index.d.ts +3 -0
  24. package/dist/admin/src/pages/App.d.ts +1 -0
  25. package/dist/admin/src/pages/PurchaseContentReleases.d.ts +2 -0
  26. package/dist/admin/src/pages/ReleaseDetailsPage.d.ts +2 -0
  27. package/dist/admin/src/pages/ReleasesPage.d.ts +8 -0
  28. package/dist/admin/src/pages/tests/mockReleaseDetailsPageData.d.ts +181 -0
  29. package/dist/admin/src/pages/tests/mockReleasesPageData.d.ts +39 -0
  30. package/dist/admin/src/pluginId.d.ts +1 -0
  31. package/dist/admin/src/services/axios.d.ts +29 -0
  32. package/dist/admin/src/services/release.d.ts +369 -0
  33. package/dist/admin/src/store/hooks.d.ts +7 -0
  34. package/dist/admin/src/utils/time.d.ts +1 -0
  35. package/dist/server/index.js +277 -232
  36. package/dist/server/index.js.map +1 -1
  37. package/dist/server/index.mjs +278 -232
  38. package/dist/server/index.mjs.map +1 -1
  39. package/dist/server/src/bootstrap.d.ts +5 -0
  40. package/dist/server/src/bootstrap.d.ts.map +1 -0
  41. package/dist/server/src/constants.d.ts +12 -0
  42. package/dist/server/src/constants.d.ts.map +1 -0
  43. package/dist/server/src/content-types/index.d.ts +99 -0
  44. package/dist/server/src/content-types/index.d.ts.map +1 -0
  45. package/dist/server/src/content-types/release/index.d.ts +48 -0
  46. package/dist/server/src/content-types/release/index.d.ts.map +1 -0
  47. package/dist/server/src/content-types/release/schema.d.ts +47 -0
  48. package/dist/server/src/content-types/release/schema.d.ts.map +1 -0
  49. package/dist/server/src/content-types/release-action/index.d.ts +50 -0
  50. package/dist/server/src/content-types/release-action/index.d.ts.map +1 -0
  51. package/dist/server/src/content-types/release-action/schema.d.ts +49 -0
  52. package/dist/server/src/content-types/release-action/schema.d.ts.map +1 -0
  53. package/dist/server/src/controllers/index.d.ts +19 -0
  54. package/dist/server/src/controllers/index.d.ts.map +1 -0
  55. package/dist/server/src/controllers/release-action.d.ts +10 -0
  56. package/dist/server/src/controllers/release-action.d.ts.map +1 -0
  57. package/dist/server/src/controllers/release.d.ts +11 -0
  58. package/dist/server/src/controllers/release.d.ts.map +1 -0
  59. package/dist/server/src/controllers/validation/release-action.d.ts +3 -0
  60. package/dist/server/src/controllers/validation/release-action.d.ts.map +1 -0
  61. package/dist/server/src/controllers/validation/release.d.ts +2 -0
  62. package/dist/server/src/controllers/validation/release.d.ts.map +1 -0
  63. package/dist/server/src/destroy.d.ts +5 -0
  64. package/dist/server/src/destroy.d.ts.map +1 -0
  65. package/dist/server/src/index.d.ts +2095 -0
  66. package/dist/server/src/index.d.ts.map +1 -0
  67. package/dist/server/src/migrations/index.d.ts +12 -0
  68. package/dist/server/src/migrations/index.d.ts.map +1 -0
  69. package/dist/server/src/register.d.ts +5 -0
  70. package/dist/server/src/register.d.ts.map +1 -0
  71. package/dist/server/src/routes/index.d.ts +35 -0
  72. package/dist/server/src/routes/index.d.ts.map +1 -0
  73. package/dist/server/src/routes/release-action.d.ts +18 -0
  74. package/dist/server/src/routes/release-action.d.ts.map +1 -0
  75. package/dist/server/src/routes/release.d.ts +18 -0
  76. package/dist/server/src/routes/release.d.ts.map +1 -0
  77. package/dist/server/src/services/index.d.ts +1826 -0
  78. package/dist/server/src/services/index.d.ts.map +1 -0
  79. package/dist/server/src/services/release.d.ts +66 -0
  80. package/dist/server/src/services/release.d.ts.map +1 -0
  81. package/dist/server/src/services/scheduling.d.ts +18 -0
  82. package/dist/server/src/services/scheduling.d.ts.map +1 -0
  83. package/dist/server/src/services/validation.d.ts +18 -0
  84. package/dist/server/src/services/validation.d.ts.map +1 -0
  85. package/dist/server/src/utils/index.d.ts +14 -0
  86. package/dist/server/src/utils/index.d.ts.map +1 -0
  87. package/dist/shared/contracts/release-actions.d.ts +131 -0
  88. package/dist/shared/contracts/release-actions.d.ts.map +1 -0
  89. package/dist/shared/contracts/releases.d.ts +166 -0
  90. package/dist/shared/contracts/releases.d.ts.map +1 -0
  91. package/dist/shared/types.d.ts +24 -0
  92. package/dist/shared/types.d.ts.map +1 -0
  93. package/dist/shared/validation-schemas.d.ts +2 -0
  94. package/dist/shared/validation-schemas.d.ts.map +1 -0
  95. package/package.json +22 -28
  96. package/dist/_chunks/App-bpzO2Ljh.mjs.map +0 -1
  97. package/dist/_chunks/App-p8aKBitd.js.map +0 -1
  98. package/dist/_chunks/en-WuuhP6Bn.mjs.map +0 -1
  99. package/dist/_chunks/en-gcJJ5htG.js.map +0 -1
  100. package/dist/_chunks/index-AECgcaDa.mjs.map +0 -1
  101. package/dist/_chunks/index-fP3qoWZ4.js.map +0 -1
@@ -1,23 +1,49 @@
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, useLicenseLimits, useTracking, Page, Pagination, ConfirmDialog, 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-RBaVMtyr.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 { useQueryParams, 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
11
  import { utcToZonedTime, zonedTimeToUtc } from "date-fns-tz";
12
12
  import { useIntl } from "react-intl";
13
13
  import styled from "styled-components";
14
- import { formatISO, parse } from "date-fns";
14
+ import { intervalToDuration, isPast, formatISO, parse } 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
+ const intervals = ["years", "months", "days", "hours", "minutes", "seconds"];
18
+ const RelativeTime = React.forwardRef(
19
+ ({ timestamp, customIntervals = [], ...restProps }, forwardedRef) => {
20
+ const { formatRelativeTime, formatDate, formatTime } = useIntl();
21
+ const interval = intervalToDuration({
22
+ start: timestamp,
23
+ end: Date.now()
24
+ // see https://github.com/date-fns/date-fns/issues/2891 – No idea why it's all partial it returns it every time.
25
+ });
26
+ const unit = intervals.find((intervalUnit) => {
27
+ return interval[intervalUnit] > 0 && Object.keys(interval).includes(intervalUnit);
28
+ });
29
+ const relativeTime = isPast(timestamp) ? -interval[unit] : interval[unit];
30
+ const customInterval = customIntervals.find(
31
+ (custom) => interval[custom.unit] < custom.threshold
32
+ );
33
+ const displayText = customInterval ? customInterval.text : formatRelativeTime(relativeTime, unit, { numeric: "auto" });
34
+ return /* @__PURE__ */ jsx(
35
+ "time",
36
+ {
37
+ ref: forwardedRef,
38
+ dateTime: timestamp.toISOString(),
39
+ role: "time",
40
+ title: `${formatDate(timestamp)} ${formatTime(timestamp)}`,
41
+ ...restProps,
42
+ children: displayText
43
+ }
44
+ );
45
+ }
46
+ );
21
47
  const RELEASE_SCHEMA = yup.object().shape({
22
48
  name: yup.string().trim().required(),
23
49
  scheduledAt: yup.string().nullable(),
@@ -47,7 +73,6 @@ const ReleaseModal = ({
47
73
  const { formatMessage } = useIntl();
48
74
  const { pathname } = useLocation();
49
75
  const isCreatingRelease = pathname === `/plugins/${pluginId}`;
50
- const IsSchedulingEnabled = window.strapi.future.isEnabled("contentReleasesScheduling");
51
76
  const { timezoneList, systemTimezone = { value: "UTC+00:00-Africa/Abidjan " } } = getTimezones(
52
77
  initialValues.scheduledAt ? new Date(initialValues.scheduledAt) : /* @__PURE__ */ new Date()
53
78
  );
@@ -105,93 +130,88 @@ const ReleaseModal = ({
105
130
  required: true
106
131
  }
107
132
  ),
108
- IsSchedulingEnabled && /* @__PURE__ */ jsxs(Fragment, { children: [
109
- /* @__PURE__ */ jsx(Box, { width: "max-content", children: /* @__PURE__ */ jsx(
110
- Checkbox,
111
- {
112
- name: "isScheduled",
113
- value: values.isScheduled,
114
- onChange: (event) => {
115
- setFieldValue("isScheduled", event.target.checked);
116
- if (!event.target.checked) {
133
+ /* @__PURE__ */ jsx(Box, { width: "max-content", children: /* @__PURE__ */ jsx(
134
+ Checkbox,
135
+ {
136
+ name: "isScheduled",
137
+ value: values.isScheduled,
138
+ onChange: (event) => {
139
+ setFieldValue("isScheduled", event.target.checked);
140
+ if (!event.target.checked) {
141
+ setFieldValue("date", null);
142
+ setFieldValue("time", "");
143
+ setFieldValue("timezone", null);
144
+ } else {
145
+ setFieldValue("date", initialValues.date);
146
+ setFieldValue("time", initialValues.time);
147
+ setFieldValue("timezone", initialValues.timezone ?? systemTimezone?.value);
148
+ }
149
+ },
150
+ children: /* @__PURE__ */ jsx(
151
+ Typography,
152
+ {
153
+ textColor: values.isScheduled ? "primary600" : "neutral800",
154
+ fontWeight: values.isScheduled ? "semiBold" : "regular",
155
+ children: formatMessage({
156
+ id: "modal.form.input.label.schedule-release",
157
+ defaultMessage: "Schedule release"
158
+ })
159
+ }
160
+ )
161
+ }
162
+ ) }),
163
+ values.isScheduled && /* @__PURE__ */ jsxs(Fragment, { children: [
164
+ /* @__PURE__ */ jsxs(Flex, { gap: 4, alignItems: "start", children: [
165
+ /* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsx(
166
+ DatePicker,
167
+ {
168
+ label: formatMessage({
169
+ id: "content-releases.modal.form.input.label.date",
170
+ defaultMessage: "Date"
171
+ }),
172
+ name: "date",
173
+ error: errors.date,
174
+ onChange: (date) => {
175
+ const isoFormatDate = date ? formatISO(date, { representation: "date" }) : null;
176
+ setFieldValue("date", isoFormatDate);
177
+ },
178
+ clearLabel: formatMessage({
179
+ id: "content-releases.modal.form.input.clearLabel",
180
+ defaultMessage: "Clear"
181
+ }),
182
+ onClear: () => {
117
183
  setFieldValue("date", null);
184
+ },
185
+ selectedDate: values.date || void 0,
186
+ required: true,
187
+ minDate: utcToZonedTime(/* @__PURE__ */ new Date(), values.timezone.split("&")[1])
188
+ }
189
+ ) }),
190
+ /* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsx(
191
+ TimePicker,
192
+ {
193
+ label: formatMessage({
194
+ id: "content-releases.modal.form.input.label.time",
195
+ defaultMessage: "Time"
196
+ }),
197
+ name: "time",
198
+ error: errors.time,
199
+ onChange: (time) => {
200
+ setFieldValue("time", time);
201
+ },
202
+ clearLabel: formatMessage({
203
+ id: "content-releases.modal.form.input.clearLabel",
204
+ defaultMessage: "Clear"
205
+ }),
206
+ onClear: () => {
118
207
  setFieldValue("time", "");
119
- setFieldValue("timezone", null);
120
- } else {
121
- setFieldValue("date", initialValues.date);
122
- setFieldValue("time", initialValues.time);
123
- setFieldValue(
124
- "timezone",
125
- initialValues.timezone ?? systemTimezone?.value
126
- );
127
- }
128
- },
129
- children: /* @__PURE__ */ jsx(
130
- Typography,
131
- {
132
- textColor: values.isScheduled ? "primary600" : "neutral800",
133
- fontWeight: values.isScheduled ? "semiBold" : "regular",
134
- children: formatMessage({
135
- id: "modal.form.input.label.schedule-release",
136
- defaultMessage: "Schedule release"
137
- })
138
- }
139
- )
140
- }
141
- ) }),
142
- values.isScheduled && /* @__PURE__ */ jsxs(Fragment, { children: [
143
- /* @__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
- ) })
192
- ] }),
193
- /* @__PURE__ */ jsx(TimezoneComponent, { timezoneOptions: timezoneList })
194
- ] })
208
+ },
209
+ value: values.time || void 0,
210
+ required: true
211
+ }
212
+ ) })
213
+ ] }),
214
+ /* @__PURE__ */ jsx(TimezoneComponent, { timezoneOptions: timezoneList })
195
215
  ] })
196
216
  ] }) }),
197
217
  /* @__PURE__ */ jsx(
@@ -295,9 +315,8 @@ const getBadgeProps = (status) => {
295
315
  };
296
316
  const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
297
317
  const { formatMessage } = useIntl();
298
- const IsSchedulingEnabled = window.strapi.future.isEnabled("contentReleasesScheduling");
299
318
  if (isError) {
300
- return /* @__PURE__ */ jsx(AnErrorOccurred, {});
319
+ return /* @__PURE__ */ jsx(Page.Error, {});
301
320
  }
302
321
  if (releases?.length === 0) {
303
322
  return /* @__PURE__ */ jsx(
@@ -316,7 +335,7 @@ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
316
335
  }
317
336
  );
318
337
  }
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(
338
+ return /* @__PURE__ */ jsx(Grid, { gap: 4, children: releases.map(({ id, name, scheduledAt, status }) => /* @__PURE__ */ jsx(GridItem, { col: 3, s: 6, xs: 12, children: /* @__PURE__ */ jsx(LinkCard, { href: `content-releases/${id}`, isExternal: false, children: /* @__PURE__ */ jsxs(
320
339
  Flex,
321
340
  {
322
341
  direction: "column",
@@ -332,16 +351,10 @@ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
332
351
  children: [
333
352
  /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "start", gap: 1, children: [
334
353
  /* @__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({
354
+ /* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: scheduledAt ? /* @__PURE__ */ jsx(CapitalizeRelativeTime, { timestamp: new Date(scheduledAt) }) : formatMessage({
336
355
  id: "content-releases.pages.Releases.not-scheduled",
337
356
  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
- ) })
357
+ }) })
345
358
  ] }),
346
359
  /* @__PURE__ */ jsx(Badge, { ...getBadgeProps(status), children: status })
347
360
  ]
@@ -360,8 +373,7 @@ const INITIAL_FORM_VALUES = {
360
373
  name: "",
361
374
  date: null,
362
375
  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"),
376
+ isScheduled: true,
365
377
  scheduledAt: null,
366
378
  timezone: null
367
379
  };
@@ -369,9 +381,9 @@ const ReleasesPage = () => {
369
381
  const tabRef = React.useRef(null);
370
382
  const location = useLocation();
371
383
  const [releaseModalShown, setReleaseModalShown] = React.useState(false);
372
- const toggleNotification = useNotification();
384
+ const { toggleNotification } = useNotification();
373
385
  const { formatMessage } = useIntl();
374
- const { push, replace } = useHistory();
386
+ const navigate = useNavigate();
375
387
  const { formatAPIError } = useAPIErrorHandler();
376
388
  const [{ query }, setQuery] = useQueryParams();
377
389
  const response = useGetReleasesQuery(query);
@@ -379,13 +391,16 @@ const ReleasesPage = () => {
379
391
  const { getFeature } = useLicenseLimits();
380
392
  const { maximumReleases = 3 } = getFeature("cms-content-releases");
381
393
  const { trackUsage } = useTracking();
394
+ const {
395
+ allowedActions: { canCreate }
396
+ } = useRBAC(PERMISSIONS);
382
397
  const { isLoading, isSuccess, isError } = response;
383
398
  const activeTab = response?.currentData?.meta?.activeTab || "pending";
384
399
  const activeTabIndex = ["pending", "done"].indexOf(activeTab);
385
400
  React.useEffect(() => {
386
401
  if (location?.state?.errors) {
387
402
  toggleNotification({
388
- type: "warning",
403
+ type: "danger",
389
404
  title: formatMessage({
390
405
  id: "content-releases.pages.Releases.notification.error.title",
391
406
  defaultMessage: "Your request could not be processed."
@@ -395,9 +410,9 @@ const ReleasesPage = () => {
395
410
  defaultMessage: "Please try again or open another release."
396
411
  })
397
412
  });
398
- replace({ state: null });
413
+ navigate("", { replace: true, state: null });
399
414
  }
400
- }, [formatMessage, location?.state?.errors, replace, toggleNotification]);
415
+ }, [formatMessage, location?.state?.errors, navigate, toggleNotification]);
401
416
  React.useEffect(() => {
402
417
  if (tabRef.current) {
403
418
  tabRef.current._handlers.setSelectedTabIndex(activeTabIndex);
@@ -407,7 +422,7 @@ const ReleasesPage = () => {
407
422
  setReleaseModalShown((prev) => !prev);
408
423
  };
409
424
  if (isLoading) {
410
- return /* @__PURE__ */ jsx(Main, { "aria-busy": isLoading, children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) });
425
+ return /* @__PURE__ */ jsx(Page.Loading, {});
411
426
  }
412
427
  const totalPendingReleases = isSuccess && response.currentData?.meta?.pendingReleasesCount || 0;
413
428
  const hasReachedMaximumPendingReleases = totalPendingReleases >= maximumReleases;
@@ -438,15 +453,15 @@ const ReleasesPage = () => {
438
453
  })
439
454
  });
440
455
  trackUsage("didCreateRelease");
441
- push(`/plugins/content-releases/${response2.data.data.id}`);
456
+ navigate(response2.data.data.id.toString());
442
457
  } else if (isAxiosError(response2.error)) {
443
458
  toggleNotification({
444
- type: "warning",
459
+ type: "danger",
445
460
  message: formatAPIError(response2.error)
446
461
  });
447
462
  } else {
448
463
  toggleNotification({
449
- type: "warning",
464
+ type: "danger",
450
465
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
451
466
  });
452
467
  }
@@ -463,7 +478,7 @@ const ReleasesPage = () => {
463
478
  id: "content-releases.pages.Releases.header-subtitle",
464
479
  defaultMessage: "Create and manage content updates"
465
480
  }),
466
- primaryAction: /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.create, children: /* @__PURE__ */ jsx(
481
+ primaryAction: canCreate ? /* @__PURE__ */ jsx(
467
482
  Button,
468
483
  {
469
484
  startIcon: /* @__PURE__ */ jsx(Plus, {}),
@@ -474,7 +489,7 @@ const ReleasesPage = () => {
474
489
  defaultMessage: "New release"
475
490
  })
476
491
  }
477
- ) })
492
+ ) : null
478
493
  }
479
494
  ),
480
495
  /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsxs(Fragment, { children: [
@@ -553,23 +568,17 @@ const ReleasesPage = () => {
553
568
  ]
554
569
  }
555
570
  ),
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
571
+ /* @__PURE__ */ jsxs(
572
+ Pagination.Root,
573
+ {
574
+ ...response?.currentData?.meta?.pagination,
575
+ defaultPageSize: response?.currentData?.meta?.pagination?.pageSize,
576
+ children: [
577
+ /* @__PURE__ */ jsx(Pagination.PageSize, { options: ["8", "16", "32", "64"] }),
578
+ /* @__PURE__ */ jsx(Pagination.Links, {})
579
+ ]
580
+ }
581
+ )
573
582
  ] }) }),
574
583
  releaseModalShown && /* @__PURE__ */ jsx(
575
584
  ReleaseModal,
@@ -617,14 +626,18 @@ const TrashIcon = styled(Trash)`
617
626
  const TypographyMaxWidth = styled(Typography)`
618
627
  max-width: 300px;
619
628
  `;
620
- const EntryValidationText = ({ action, schema, components, entry }) => {
629
+ const EntryValidationText = ({ action, schema, entry }) => {
621
630
  const { formatMessage } = useIntl();
622
- const { validate } = unstable_useDocument();
623
- const { errors } = validate(entry, {
624
- contentType: schema,
625
- components,
626
- isCreatingEntry: false
627
- });
631
+ const { validate } = unstable_useDocument(
632
+ {
633
+ collectionType: schema?.kind ?? "",
634
+ model: schema?.uid ?? ""
635
+ },
636
+ {
637
+ skip: !schema
638
+ }
639
+ );
640
+ const errors = validate(entry) ?? {};
628
641
  if (Object.keys(errors).length > 0) {
629
642
  const validationErrorsMessages = Object.entries(errors).map(
630
643
  ([key, value]) => formatMessage(
@@ -672,18 +685,22 @@ const ReleaseDetailsLayout = ({
672
685
  isLoading: isLoadingDetails,
673
686
  isError,
674
687
  error
675
- } = useGetReleaseQuery({ id: releaseId });
688
+ } = useGetReleaseQuery(
689
+ { id: releaseId },
690
+ {
691
+ skip: !releaseId
692
+ }
693
+ );
676
694
  const [publishRelease, { isLoading: isPublishing }] = usePublishReleaseMutation();
677
- const toggleNotification = useNotification();
695
+ const { toggleNotification } = useNotification();
678
696
  const { formatAPIError } = useAPIErrorHandler();
679
- const {
680
- allowedActions: { canUpdate, canDelete }
681
- } = useRBAC(PERMISSIONS);
697
+ const { allowedActions } = useRBAC(PERMISSIONS);
698
+ const { canUpdate, canDelete, canPublish } = allowedActions;
682
699
  const dispatch = useTypedDispatch();
683
700
  const { trackUsage } = useTracking();
684
701
  const release = data?.data;
685
- const handlePublishRelease = async () => {
686
- const response = await publishRelease({ id: releaseId });
702
+ const handlePublishRelease = (id) => async () => {
703
+ const response = await publishRelease({ id });
687
704
  if ("data" in response) {
688
705
  toggleNotification({
689
706
  type: "success",
@@ -700,12 +717,12 @@ const ReleaseDetailsLayout = ({
700
717
  });
701
718
  } else if (isAxiosError(response.error)) {
702
719
  toggleNotification({
703
- type: "warning",
720
+ type: "danger",
704
721
  message: formatAPIError(response.error)
705
722
  });
706
723
  } else {
707
724
  toggleNotification({
708
- type: "warning",
725
+ type: "danger",
709
726
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
710
727
  });
711
728
  }
@@ -726,28 +743,25 @@ const ReleaseDetailsLayout = ({
726
743
  return release.createdBy.email;
727
744
  };
728
745
  if (isLoadingDetails) {
729
- return /* @__PURE__ */ jsx(Main, { "aria-busy": isLoadingDetails, children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) });
746
+ return /* @__PURE__ */ jsx(Page.Loading, {});
730
747
  }
731
748
  if (isError || !release) {
732
749
  return /* @__PURE__ */ jsx(
733
- Redirect,
750
+ Navigate,
734
751
  {
735
- to: {
736
- pathname: "/plugins/content-releases",
737
- state: {
738
- errors: [
739
- {
740
- code: error?.code
741
- }
742
- ]
743
- }
752
+ to: "..",
753
+ state: {
754
+ errors: [
755
+ {
756
+ code: error?.code
757
+ }
758
+ ]
744
759
  }
745
760
  }
746
761
  );
747
762
  }
748
763
  const totalEntries = release.actions.meta.count || 0;
749
764
  const hasCreatedByUser = Boolean(getCreatedByUser());
750
- const IsSchedulingEnabled = window.strapi.future.isEnabled("contentReleasesScheduling");
751
765
  const isScheduled = release.scheduledAt && release.timezone;
752
766
  const numberOfEntriesText = formatMessage(
753
767
  {
@@ -782,13 +796,10 @@ const ReleaseDetailsLayout = ({
782
796
  {
783
797
  title: release.name,
784
798
  subtitle: /* @__PURE__ */ jsxs(Flex, { gap: 2, lineHeight: 6, children: [
785
- /* @__PURE__ */ jsx(Typography, { textColor: "neutral600", variant: "epsilon", children: numberOfEntriesText + (IsSchedulingEnabled && isScheduled ? ` - ${scheduledText}` : "") }),
799
+ /* @__PURE__ */ jsx(Typography, { textColor: "neutral600", variant: "epsilon", children: numberOfEntriesText + (isScheduled ? ` - ${scheduledText}` : "") }),
786
800
  /* @__PURE__ */ jsx(Badge, { ...getBadgeProps(release.status), children: release.status })
787
801
  ] }),
788
- navigationAction: /* @__PURE__ */ jsx(Link$1, { startIcon: /* @__PURE__ */ jsx(ArrowLeft, {}), to: "/plugins/content-releases", children: formatMessage({
789
- id: "global.back",
790
- defaultMessage: "Back"
791
- }) }),
802
+ navigationAction: /* @__PURE__ */ jsx(BackButton, {}),
792
803
  primaryAction: !release.releasedAt && /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
793
804
  /* @__PURE__ */ jsxs(Menu.Root, { children: [
794
805
  /* @__PURE__ */ jsx(
@@ -872,12 +883,12 @@ const ReleaseDetailsLayout = ({
872
883
  id: "content-releases.header.actions.refresh",
873
884
  defaultMessage: "Refresh"
874
885
  }) }),
875
- /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.publish, children: /* @__PURE__ */ jsx(
886
+ canPublish ? /* @__PURE__ */ jsx(
876
887
  Button,
877
888
  {
878
889
  size: "S",
879
890
  variant: "default",
880
- onClick: handlePublishRelease,
891
+ onClick: handlePublishRelease(release.id.toString()),
881
892
  loading: isPublishing,
882
893
  disabled: release.actions.meta.count === 0,
883
894
  children: formatMessage({
@@ -885,7 +896,7 @@ const ReleaseDetailsLayout = ({
885
896
  defaultMessage: "Publish"
886
897
  })
887
898
  }
888
- ) })
899
+ ) : null
889
900
  ] })
890
901
  }
891
902
  ),
@@ -911,11 +922,10 @@ const getGroupByOptionLabel = (value) => {
911
922
  defaultMessage: "Content-Types"
912
923
  };
913
924
  };
914
- const ReleaseDetailsBody = () => {
925
+ const ReleaseDetailsBody = ({ releaseId }) => {
915
926
  const { formatMessage } = useIntl();
916
- const { releaseId } = useParams();
917
927
  const [{ query }, setQuery] = useQueryParams();
918
- const toggleNotification = useNotification();
928
+ const { toggleNotification } = useNotification();
919
929
  const { formatAPIError } = useAPIErrorHandler();
920
930
  const {
921
931
  data: releaseData,
@@ -956,19 +966,19 @@ const ReleaseDetailsBody = () => {
956
966
  if ("error" in response) {
957
967
  if (isAxiosError(response.error)) {
958
968
  toggleNotification({
959
- type: "warning",
969
+ type: "danger",
960
970
  message: formatAPIError(response.error)
961
971
  });
962
972
  } else {
963
973
  toggleNotification({
964
- type: "warning",
974
+ type: "danger",
965
975
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
966
976
  });
967
977
  }
968
978
  }
969
979
  };
970
980
  if (isLoading || isReleaseLoading) {
971
- return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) });
981
+ return /* @__PURE__ */ jsx(Page.Loading, {});
972
982
  }
973
983
  const releaseActions = data?.data;
974
984
  const releaseMeta = data?.meta;
@@ -987,32 +997,26 @@ const ReleaseDetailsBody = () => {
987
997
  });
988
998
  }
989
999
  return /* @__PURE__ */ jsx(
990
- Redirect,
1000
+ Navigate,
991
1001
  {
992
- to: {
993
- pathname: "/plugins/content-releases",
994
- state: {
995
- errors: errorsArray
996
- }
1002
+ to: "..",
1003
+ state: {
1004
+ errors: errorsArray
997
1005
  }
998
1006
  }
999
1007
  );
1000
1008
  }
1001
1009
  if (isError || !releaseActions) {
1002
- return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(AnErrorOccurred, {}) });
1010
+ return /* @__PURE__ */ jsx(Page.Error, {});
1003
1011
  }
1004
1012
  if (Object.keys(releaseActions).length === 0) {
1005
1013
  return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(
1006
- NoContent,
1014
+ EmptyStateLayout,
1007
1015
  {
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
1016
  action: /* @__PURE__ */ jsx(
1013
1017
  LinkButton,
1014
1018
  {
1015
- as: Link$2,
1019
+ as: Link$1,
1016
1020
  to: {
1017
1021
  pathname: "/content-manager"
1018
1022
  },
@@ -1023,10 +1027,54 @@ const ReleaseDetailsBody = () => {
1023
1027
  defaultMessage: "Open the Content Manager"
1024
1028
  })
1025
1029
  }
1026
- )
1030
+ ),
1031
+ icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "10rem" }),
1032
+ content: formatMessage({
1033
+ id: "content-releases.pages.Details.tab.emptyEntries",
1034
+ defaultMessage: "This release is empty. Open the Content Manager, select an entry and add it to the release."
1035
+ })
1027
1036
  }
1028
1037
  ) });
1029
1038
  }
1039
+ const headers = [
1040
+ {
1041
+ label: formatMessage({
1042
+ id: "content-releases.page.ReleaseDetails.table.header.label.name",
1043
+ defaultMessage: "name"
1044
+ }),
1045
+ name: "name"
1046
+ },
1047
+ {
1048
+ label: formatMessage({
1049
+ id: "content-releases.page.ReleaseDetails.table.header.label.locale",
1050
+ defaultMessage: "locale"
1051
+ }),
1052
+ name: "locale"
1053
+ },
1054
+ {
1055
+ label: formatMessage({
1056
+ id: "content-releases.page.ReleaseDetails.table.header.label.content-type",
1057
+ defaultMessage: "content-type"
1058
+ }),
1059
+ name: "content-type"
1060
+ },
1061
+ {
1062
+ label: formatMessage({
1063
+ id: "content-releases.page.ReleaseDetails.table.header.label.action",
1064
+ defaultMessage: "action"
1065
+ }),
1066
+ name: "action"
1067
+ },
1068
+ ...!release.releasedAt ? [
1069
+ {
1070
+ label: formatMessage({
1071
+ id: "content-releases.page.ReleaseDetails.table.header.label.status",
1072
+ defaultMessage: "status"
1073
+ }),
1074
+ name: "status"
1075
+ }
1076
+ ] : []
1077
+ ];
1030
1078
  return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsxs(Flex, { gap: 8, direction: "column", alignItems: "stretch", children: [
1031
1079
  /* @__PURE__ */ jsx(Flex, { children: /* @__PURE__ */ jsx(
1032
1080
  SingleSelect,
@@ -1058,68 +1106,11 @@ const ReleaseDetailsBody = () => {
1058
1106
  ...item,
1059
1107
  id: Number(item.entry.id)
1060
1108
  })),
1061
- colCount: releaseActions[key].length,
1062
- isLoading,
1063
- isFetching,
1109
+ headers,
1110
+ isLoading: isLoading || isFetching,
1064
1111
  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, {}),
1112
+ /* @__PURE__ */ jsx(Table.Head, { children: headers.map((header) => /* @__PURE__ */ jsx(Table.HeaderCell, { ...header }, header.name)) }),
1113
+ /* @__PURE__ */ jsx(Table.Loading, {}),
1123
1114
  /* @__PURE__ */ jsx(Table.Body, { children: releaseActions[key].map(
1124
1115
  ({ id, contentType, locale, type, entry }, actionIndex) => /* @__PURE__ */ jsxs(Tr, { children: [
1125
1116
  /* @__PURE__ */ jsx(Td, { width: "25%", maxWidth: "200px", children: /* @__PURE__ */ jsx(Typography, { ellipsis: true, children: `${contentType.mainFieldValue || entry.id}` }) }),
@@ -1177,34 +1168,39 @@ const ReleaseDetailsBody = () => {
1177
1168
  }
1178
1169
  )
1179
1170
  ] }, `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
- ] })
1171
+ /* @__PURE__ */ jsxs(
1172
+ Pagination.Root,
1173
+ {
1174
+ ...releaseMeta?.pagination,
1175
+ defaultPageSize: releaseMeta?.pagination?.pageSize,
1176
+ children: [
1177
+ /* @__PURE__ */ jsx(Pagination.PageSize, {}),
1178
+ /* @__PURE__ */ jsx(Pagination.Links, {})
1179
+ ]
1180
+ }
1181
+ )
1191
1182
  ] }) });
1192
1183
  };
1193
1184
  const ReleaseDetailsPage = () => {
1194
1185
  const { formatMessage } = useIntl();
1195
1186
  const { releaseId } = useParams();
1196
- const toggleNotification = useNotification();
1187
+ const { toggleNotification } = useNotification();
1197
1188
  const { formatAPIError } = useAPIErrorHandler();
1198
- const { replace } = useHistory();
1189
+ const navigate = useNavigate();
1199
1190
  const [releaseModalShown, setReleaseModalShown] = React.useState(false);
1200
1191
  const [showWarningSubmit, setWarningSubmit] = React.useState(false);
1201
1192
  const {
1202
1193
  isLoading: isLoadingDetails,
1203
1194
  data,
1204
1195
  isSuccess: isSuccessDetails
1205
- } = useGetReleaseQuery({ id: releaseId });
1196
+ } = useGetReleaseQuery(
1197
+ { id: releaseId },
1198
+ {
1199
+ skip: !releaseId
1200
+ }
1201
+ );
1206
1202
  const [updateRelease, { isLoading: isSubmittingForm }] = useUpdateReleaseMutation();
1207
- const [deleteRelease, { isLoading: isDeletingRelease }] = useDeleteReleaseMutation();
1203
+ const [deleteRelease] = useDeleteReleaseMutation();
1208
1204
  const toggleEditReleaseModal = () => {
1209
1205
  setReleaseModalShown((prev) => !prev);
1210
1206
  };
@@ -1215,10 +1211,13 @@ const ReleaseDetailsPage = () => {
1215
1211
  {
1216
1212
  toggleEditReleaseModal,
1217
1213
  toggleWarningSubmit,
1218
- children: /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) })
1214
+ children: /* @__PURE__ */ jsx(Page.Loading, {})
1219
1215
  }
1220
1216
  );
1221
1217
  }
1218
+ if (!releaseId) {
1219
+ return /* @__PURE__ */ jsx(Navigate, { to: ".." });
1220
+ }
1222
1221
  const releaseData = isSuccessDetails && data?.data || null;
1223
1222
  const title = releaseData?.name || "";
1224
1223
  const timezone = releaseData?.timezone ?? null;
@@ -1242,12 +1241,12 @@ const ReleaseDetailsPage = () => {
1242
1241
  });
1243
1242
  } else if (isAxiosError(response.error)) {
1244
1243
  toggleNotification({
1245
- type: "warning",
1244
+ type: "danger",
1246
1245
  message: formatAPIError(response.error)
1247
1246
  });
1248
1247
  } else {
1249
1248
  toggleNotification({
1250
- type: "warning",
1249
+ type: "danger",
1251
1250
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
1252
1251
  });
1253
1252
  }
@@ -1258,15 +1257,15 @@ const ReleaseDetailsPage = () => {
1258
1257
  id: releaseId
1259
1258
  });
1260
1259
  if ("data" in response) {
1261
- replace("/plugins/content-releases");
1260
+ navigate("..");
1262
1261
  } else if (isAxiosError(response.error)) {
1263
1262
  toggleNotification({
1264
- type: "warning",
1263
+ type: "danger",
1265
1264
  message: formatAPIError(response.error)
1266
1265
  });
1267
1266
  } else {
1268
1267
  toggleNotification({
1269
- type: "warning",
1268
+ type: "danger",
1270
1269
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
1271
1270
  });
1272
1271
  }
@@ -1277,7 +1276,7 @@ const ReleaseDetailsPage = () => {
1277
1276
  toggleEditReleaseModal,
1278
1277
  toggleWarningSubmit,
1279
1278
  children: [
1280
- /* @__PURE__ */ jsx(ReleaseDetailsBody, {}),
1279
+ /* @__PURE__ */ jsx(ReleaseDetailsBody, { releaseId }),
1281
1280
  releaseModalShown && /* @__PURE__ */ jsx(
1282
1281
  ReleaseModal,
1283
1282
  {
@@ -1297,14 +1296,13 @@ const ReleaseDetailsPage = () => {
1297
1296
  /* @__PURE__ */ jsx(
1298
1297
  ConfirmDialog,
1299
1298
  {
1300
- bodyText: {
1299
+ isOpen: showWarningSubmit,
1300
+ onClose: toggleWarningSubmit,
1301
+ onConfirm: handleDeleteRelease,
1302
+ children: formatMessage({
1301
1303
  id: "content-releases.dialog.confirmation-message",
1302
1304
  defaultMessage: "Are you sure you want to delete this release?"
1303
- },
1304
- isOpen: showWarningSubmit,
1305
- isConfirmButtonLoading: isDeletingRelease,
1306
- onToggleDialog: toggleWarningSubmit,
1307
- onConfirm: handleDeleteRelease
1305
+ })
1308
1306
  }
1309
1307
  )
1310
1308
  ]
@@ -1312,12 +1310,12 @@ const ReleaseDetailsPage = () => {
1312
1310
  );
1313
1311
  };
1314
1312
  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 })
1313
+ return /* @__PURE__ */ jsx(Page.Protect, { permissions: PERMISSIONS.main, children: /* @__PURE__ */ jsxs(Routes, { children: [
1314
+ /* @__PURE__ */ jsx(Route, { index: true, element: /* @__PURE__ */ jsx(ReleasesPage, {}) }),
1315
+ /* @__PURE__ */ jsx(Route, { path: ":releaseId", element: /* @__PURE__ */ jsx(ReleaseDetailsPage, {}) })
1318
1316
  ] }) });
1319
1317
  };
1320
1318
  export {
1321
1319
  App
1322
1320
  };
1323
- //# sourceMappingURL=App-bpzO2Ljh.mjs.map
1321
+ //# sourceMappingURL=App-dbdAcsz_.mjs.map