@strapi/content-releases 4.20.4 → 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-6ugQxqYE.mjs → App-dbdAcsz_.mjs} +296 -296
  2. package/dist/_chunks/App-dbdAcsz_.mjs.map +1 -0
  3. package/dist/_chunks/{App-P1kyM3gT.js → App-zwe_jKPv.js} +301 -301
  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-_eBuegHN.mjs → index-RBaVMtyr.mjs} +79 -70
  10. package/dist/_chunks/index-RBaVMtyr.mjs.map +1 -0
  11. package/dist/_chunks/{index-2xzbhaQP.js → index-TBrVNrv9.js} +77 -68
  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 +327 -234
  36. package/dist/server/index.js.map +1 -1
  37. package/dist/server/index.mjs +328 -234
  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 +24 -30
  96. package/dist/_chunks/App-6ugQxqYE.mjs.map +0 -1
  97. package/dist/_chunks/App-P1kyM3gT.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-2xzbhaQP.js.map +0 -1
  101. package/dist/_chunks/index-_eBuegHN.mjs.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-_eBuegHN.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
- import { zonedTimeToUtc, utcToZonedTime } from "date-fns-tz";
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
  );
@@ -56,12 +81,12 @@ const ReleaseModal = ({
56
81
  if (!date || !time || !timezone)
57
82
  return null;
58
83
  const formattedDate = parse(time, "HH:mm", new Date(date));
59
- const timezoneWithoutOffset = timezone.split("_")[1];
84
+ const timezoneWithoutOffset = timezone.split("&")[1];
60
85
  return zonedTimeToUtc(formattedDate, timezoneWithoutOffset);
61
86
  };
62
87
  const getTimezoneWithOffset = () => {
63
88
  const currentTimezone = timezoneList.find(
64
- (timezone) => timezone.value.split("_")[1] === initialValues.timezone
89
+ (timezone) => timezone.value.split("&")[1] === initialValues.timezone
65
90
  );
66
91
  return currentTimezone?.value || systemTimezone.value;
67
92
  };
@@ -79,7 +104,7 @@ const ReleaseModal = ({
79
104
  onSubmit: (values) => {
80
105
  handleSubmit({
81
106
  ...values,
82
- timezone: values.timezone ? values.timezone.split("_")[1] : null,
107
+ timezone: values.timezone ? values.timezone.split("&")[1] : null,
83
108
  scheduledAt: values.isScheduled ? getScheduledTimestamp(values) : null
84
109
  });
85
110
  },
@@ -105,92 +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
- }
167
- ) }),
168
- /* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsx(
169
- TimePicker,
170
- {
171
- label: formatMessage({
172
- id: "content-releases.modal.form.input.label.time",
173
- defaultMessage: "Time"
174
- }),
175
- name: "time",
176
- error: errors.time,
177
- onChange: (time) => {
178
- setFieldValue("time", time);
179
- },
180
- clearLabel: formatMessage({
181
- id: "content-releases.modal.form.input.clearLabel",
182
- defaultMessage: "Clear"
183
- }),
184
- onClear: () => {
185
- setFieldValue("time", "");
186
- },
187
- value: values.time || void 0,
188
- required: true
189
- }
190
- ) })
191
- ] }),
192
- /* @__PURE__ */ jsx(TimezoneComponent, { timezoneOptions: timezoneList })
193
- ] })
208
+ },
209
+ value: values.time || void 0,
210
+ required: true
211
+ }
212
+ ) })
213
+ ] }),
214
+ /* @__PURE__ */ jsx(TimezoneComponent, { timezoneOptions: timezoneList })
194
215
  ] })
195
216
  ] }) }),
196
217
  /* @__PURE__ */ jsx(
@@ -214,10 +235,10 @@ const ReleaseModal = ({
214
235
  const getTimezones = (selectedDate) => {
215
236
  const timezoneList = Intl.supportedValuesOf("timeZone").map((timezone) => {
216
237
  const utcOffset = getTimezoneOffset(timezone, selectedDate);
217
- return { offset: utcOffset, value: `${utcOffset}_${timezone}` };
238
+ return { offset: utcOffset, value: `${utcOffset}&${timezone}` };
218
239
  });
219
240
  const systemTimezone = timezoneList.find(
220
- (timezone) => timezone.value.split("_")[1] === Intl.DateTimeFormat().resolvedOptions().timeZone
241
+ (timezone) => timezone.value.split("&")[1] === Intl.DateTimeFormat().resolvedOptions().timeZone
221
242
  );
222
243
  return { timezoneList, systemTimezone };
223
244
  };
@@ -229,7 +250,7 @@ const TimezoneComponent = ({ timezoneOptions }) => {
229
250
  if (values.date) {
230
251
  const { timezoneList: timezoneList2 } = getTimezones(new Date(values.date));
231
252
  setTimezoneList(timezoneList2);
232
- const updatedTimezone = values.timezone && timezoneList2.find((tz) => tz.value.split("_")[1] === values.timezone.split("_")[1]);
253
+ const updatedTimezone = values.timezone && timezoneList2.find((tz) => tz.value.split("&")[1] === values.timezone.split("&")[1]);
233
254
  if (updatedTimezone) {
234
255
  setFieldValue("timezone", updatedTimezone.value);
235
256
  }
@@ -242,9 +263,10 @@ const TimezoneComponent = ({ timezoneOptions }) => {
242
263
  id: "content-releases.modal.form.input.label.timezone",
243
264
  defaultMessage: "Timezone"
244
265
  }),
266
+ autocomplete: { type: "list", filter: "contains" },
245
267
  name: "timezone",
246
268
  value: values.timezone || void 0,
247
- textValue: values.timezone ? values.timezone.replace("_", " ") : void 0,
269
+ textValue: values.timezone ? values.timezone.replace(/&/, " ") : void 0,
248
270
  onChange: (timezone) => {
249
271
  setFieldValue("timezone", timezone);
250
272
  },
@@ -256,7 +278,7 @@ const TimezoneComponent = ({ timezoneOptions }) => {
256
278
  },
257
279
  error: errors.timezone,
258
280
  required: true,
259
- children: timezoneList.map((timezone) => /* @__PURE__ */ jsx(ComboboxOption, { value: timezone.value, children: timezone.value.replace("_", " ") }, timezone.value))
281
+ children: timezoneList.map((timezone) => /* @__PURE__ */ jsx(ComboboxOption, { value: timezone.value, children: timezone.value.replace(/&/, " ") }, timezone.value))
260
282
  }
261
283
  );
262
284
  };
@@ -293,9 +315,8 @@ const getBadgeProps = (status) => {
293
315
  };
294
316
  const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
295
317
  const { formatMessage } = useIntl();
296
- const IsSchedulingEnabled = window.strapi.future.isEnabled("contentReleasesScheduling");
297
318
  if (isError) {
298
- return /* @__PURE__ */ jsx(AnErrorOccurred, {});
319
+ return /* @__PURE__ */ jsx(Page.Error, {});
299
320
  }
300
321
  if (releases?.length === 0) {
301
322
  return /* @__PURE__ */ jsx(
@@ -314,7 +335,7 @@ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
314
335
  }
315
336
  );
316
337
  }
317
- 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(
318
339
  Flex,
319
340
  {
320
341
  direction: "column",
@@ -330,16 +351,10 @@ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
330
351
  children: [
331
352
  /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "start", gap: 1, children: [
332
353
  /* @__PURE__ */ jsx(Typography, { as: "h3", variant: "delta", fontWeight: "bold", children: name }),
333
- /* @__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({
334
355
  id: "content-releases.pages.Releases.not-scheduled",
335
356
  defaultMessage: "Not scheduled"
336
- }) : formatMessage(
337
- {
338
- id: "content-releases.page.Releases.release-item.entries",
339
- defaultMessage: "{number, plural, =0 {No entries} one {# entry} other {# entries}}"
340
- },
341
- { number: actions.meta.count }
342
- ) })
357
+ }) })
343
358
  ] }),
344
359
  /* @__PURE__ */ jsx(Badge, { ...getBadgeProps(status), children: status })
345
360
  ]
@@ -358,8 +373,7 @@ const INITIAL_FORM_VALUES = {
358
373
  name: "",
359
374
  date: null,
360
375
  time: "",
361
- // Remove future flag check after Scheduling Beta release and replace with true as creating new release should include scheduling by default
362
- isScheduled: window.strapi.future.isEnabled("contentReleasesScheduling"),
376
+ isScheduled: true,
363
377
  scheduledAt: null,
364
378
  timezone: null
365
379
  };
@@ -367,9 +381,9 @@ const ReleasesPage = () => {
367
381
  const tabRef = React.useRef(null);
368
382
  const location = useLocation();
369
383
  const [releaseModalShown, setReleaseModalShown] = React.useState(false);
370
- const toggleNotification = useNotification();
384
+ const { toggleNotification } = useNotification();
371
385
  const { formatMessage } = useIntl();
372
- const { push, replace } = useHistory();
386
+ const navigate = useNavigate();
373
387
  const { formatAPIError } = useAPIErrorHandler();
374
388
  const [{ query }, setQuery] = useQueryParams();
375
389
  const response = useGetReleasesQuery(query);
@@ -377,13 +391,16 @@ const ReleasesPage = () => {
377
391
  const { getFeature } = useLicenseLimits();
378
392
  const { maximumReleases = 3 } = getFeature("cms-content-releases");
379
393
  const { trackUsage } = useTracking();
394
+ const {
395
+ allowedActions: { canCreate }
396
+ } = useRBAC(PERMISSIONS);
380
397
  const { isLoading, isSuccess, isError } = response;
381
398
  const activeTab = response?.currentData?.meta?.activeTab || "pending";
382
399
  const activeTabIndex = ["pending", "done"].indexOf(activeTab);
383
400
  React.useEffect(() => {
384
401
  if (location?.state?.errors) {
385
402
  toggleNotification({
386
- type: "warning",
403
+ type: "danger",
387
404
  title: formatMessage({
388
405
  id: "content-releases.pages.Releases.notification.error.title",
389
406
  defaultMessage: "Your request could not be processed."
@@ -393,9 +410,9 @@ const ReleasesPage = () => {
393
410
  defaultMessage: "Please try again or open another release."
394
411
  })
395
412
  });
396
- replace({ state: null });
413
+ navigate("", { replace: true, state: null });
397
414
  }
398
- }, [formatMessage, location?.state?.errors, replace, toggleNotification]);
415
+ }, [formatMessage, location?.state?.errors, navigate, toggleNotification]);
399
416
  React.useEffect(() => {
400
417
  if (tabRef.current) {
401
418
  tabRef.current._handlers.setSelectedTabIndex(activeTabIndex);
@@ -405,7 +422,7 @@ const ReleasesPage = () => {
405
422
  setReleaseModalShown((prev) => !prev);
406
423
  };
407
424
  if (isLoading) {
408
- return /* @__PURE__ */ jsx(Main, { "aria-busy": isLoading, children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) });
425
+ return /* @__PURE__ */ jsx(Page.Loading, {});
409
426
  }
410
427
  const totalPendingReleases = isSuccess && response.currentData?.meta?.pendingReleasesCount || 0;
411
428
  const hasReachedMaximumPendingReleases = totalPendingReleases >= maximumReleases;
@@ -436,15 +453,15 @@ const ReleasesPage = () => {
436
453
  })
437
454
  });
438
455
  trackUsage("didCreateRelease");
439
- push(`/plugins/content-releases/${response2.data.data.id}`);
456
+ navigate(response2.data.data.id.toString());
440
457
  } else if (isAxiosError(response2.error)) {
441
458
  toggleNotification({
442
- type: "warning",
459
+ type: "danger",
443
460
  message: formatAPIError(response2.error)
444
461
  });
445
462
  } else {
446
463
  toggleNotification({
447
- type: "warning",
464
+ type: "danger",
448
465
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
449
466
  });
450
467
  }
@@ -461,7 +478,7 @@ const ReleasesPage = () => {
461
478
  id: "content-releases.pages.Releases.header-subtitle",
462
479
  defaultMessage: "Create and manage content updates"
463
480
  }),
464
- primaryAction: /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.create, children: /* @__PURE__ */ jsx(
481
+ primaryAction: canCreate ? /* @__PURE__ */ jsx(
465
482
  Button,
466
483
  {
467
484
  startIcon: /* @__PURE__ */ jsx(Plus, {}),
@@ -472,7 +489,7 @@ const ReleasesPage = () => {
472
489
  defaultMessage: "New release"
473
490
  })
474
491
  }
475
- ) })
492
+ ) : null
476
493
  }
477
494
  ),
478
495
  /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsxs(Fragment, { children: [
@@ -551,23 +568,17 @@ const ReleasesPage = () => {
551
568
  ]
552
569
  }
553
570
  ),
554
- response.currentData?.meta?.pagination?.total ? /* @__PURE__ */ jsxs(Flex, { paddingTop: 4, alignItems: "flex-end", justifyContent: "space-between", children: [
555
- /* @__PURE__ */ jsx(
556
- PageSizeURLQuery,
557
- {
558
- options: ["8", "16", "32", "64"],
559
- defaultValue: response?.currentData?.meta?.pagination?.pageSize.toString()
560
- }
561
- ),
562
- /* @__PURE__ */ jsx(
563
- PaginationURLQuery,
564
- {
565
- pagination: {
566
- pageCount: response?.currentData?.meta?.pagination?.pageCount || 0
567
- }
568
- }
569
- )
570
- ] }) : 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
+ )
571
582
  ] }) }),
572
583
  releaseModalShown && /* @__PURE__ */ jsx(
573
584
  ReleaseModal,
@@ -615,14 +626,18 @@ const TrashIcon = styled(Trash)`
615
626
  const TypographyMaxWidth = styled(Typography)`
616
627
  max-width: 300px;
617
628
  `;
618
- const EntryValidationText = ({ action, schema, components, entry }) => {
629
+ const EntryValidationText = ({ action, schema, entry }) => {
619
630
  const { formatMessage } = useIntl();
620
- const { validate } = unstable_useDocument();
621
- const { errors } = validate(entry, {
622
- contentType: schema,
623
- components,
624
- isCreatingEntry: false
625
- });
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) ?? {};
626
641
  if (Object.keys(errors).length > 0) {
627
642
  const validationErrorsMessages = Object.entries(errors).map(
628
643
  ([key, value]) => formatMessage(
@@ -670,18 +685,22 @@ const ReleaseDetailsLayout = ({
670
685
  isLoading: isLoadingDetails,
671
686
  isError,
672
687
  error
673
- } = useGetReleaseQuery({ id: releaseId });
688
+ } = useGetReleaseQuery(
689
+ { id: releaseId },
690
+ {
691
+ skip: !releaseId
692
+ }
693
+ );
674
694
  const [publishRelease, { isLoading: isPublishing }] = usePublishReleaseMutation();
675
- const toggleNotification = useNotification();
695
+ const { toggleNotification } = useNotification();
676
696
  const { formatAPIError } = useAPIErrorHandler();
677
- const {
678
- allowedActions: { canUpdate, canDelete }
679
- } = useRBAC(PERMISSIONS);
697
+ const { allowedActions } = useRBAC(PERMISSIONS);
698
+ const { canUpdate, canDelete, canPublish } = allowedActions;
680
699
  const dispatch = useTypedDispatch();
681
700
  const { trackUsage } = useTracking();
682
701
  const release = data?.data;
683
- const handlePublishRelease = async () => {
684
- const response = await publishRelease({ id: releaseId });
702
+ const handlePublishRelease = (id) => async () => {
703
+ const response = await publishRelease({ id });
685
704
  if ("data" in response) {
686
705
  toggleNotification({
687
706
  type: "success",
@@ -698,12 +717,12 @@ const ReleaseDetailsLayout = ({
698
717
  });
699
718
  } else if (isAxiosError(response.error)) {
700
719
  toggleNotification({
701
- type: "warning",
720
+ type: "danger",
702
721
  message: formatAPIError(response.error)
703
722
  });
704
723
  } else {
705
724
  toggleNotification({
706
- type: "warning",
725
+ type: "danger",
707
726
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
708
727
  });
709
728
  }
@@ -724,28 +743,25 @@ const ReleaseDetailsLayout = ({
724
743
  return release.createdBy.email;
725
744
  };
726
745
  if (isLoadingDetails) {
727
- return /* @__PURE__ */ jsx(Main, { "aria-busy": isLoadingDetails, children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) });
746
+ return /* @__PURE__ */ jsx(Page.Loading, {});
728
747
  }
729
748
  if (isError || !release) {
730
749
  return /* @__PURE__ */ jsx(
731
- Redirect,
750
+ Navigate,
732
751
  {
733
- to: {
734
- pathname: "/plugins/content-releases",
735
- state: {
736
- errors: [
737
- {
738
- code: error?.code
739
- }
740
- ]
741
- }
752
+ to: "..",
753
+ state: {
754
+ errors: [
755
+ {
756
+ code: error?.code
757
+ }
758
+ ]
742
759
  }
743
760
  }
744
761
  );
745
762
  }
746
763
  const totalEntries = release.actions.meta.count || 0;
747
764
  const hasCreatedByUser = Boolean(getCreatedByUser());
748
- const IsSchedulingEnabled = window.strapi.future.isEnabled("contentReleasesScheduling");
749
765
  const isScheduled = release.scheduledAt && release.timezone;
750
766
  const numberOfEntriesText = formatMessage(
751
767
  {
@@ -780,13 +796,10 @@ const ReleaseDetailsLayout = ({
780
796
  {
781
797
  title: release.name,
782
798
  subtitle: /* @__PURE__ */ jsxs(Flex, { gap: 2, lineHeight: 6, children: [
783
- /* @__PURE__ */ jsx(Typography, { textColor: "neutral600", variant: "epsilon", children: numberOfEntriesText + (IsSchedulingEnabled && isScheduled ? ` - ${scheduledText}` : "") }),
799
+ /* @__PURE__ */ jsx(Typography, { textColor: "neutral600", variant: "epsilon", children: numberOfEntriesText + (isScheduled ? ` - ${scheduledText}` : "") }),
784
800
  /* @__PURE__ */ jsx(Badge, { ...getBadgeProps(release.status), children: release.status })
785
801
  ] }),
786
- navigationAction: /* @__PURE__ */ jsx(Link$1, { startIcon: /* @__PURE__ */ jsx(ArrowLeft, {}), to: "/plugins/content-releases", children: formatMessage({
787
- id: "global.back",
788
- defaultMessage: "Back"
789
- }) }),
802
+ navigationAction: /* @__PURE__ */ jsx(BackButton, {}),
790
803
  primaryAction: !release.releasedAt && /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
791
804
  /* @__PURE__ */ jsxs(Menu.Root, { children: [
792
805
  /* @__PURE__ */ jsx(
@@ -870,12 +883,12 @@ const ReleaseDetailsLayout = ({
870
883
  id: "content-releases.header.actions.refresh",
871
884
  defaultMessage: "Refresh"
872
885
  }) }),
873
- /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.publish, children: /* @__PURE__ */ jsx(
886
+ canPublish ? /* @__PURE__ */ jsx(
874
887
  Button,
875
888
  {
876
889
  size: "S",
877
890
  variant: "default",
878
- onClick: handlePublishRelease,
891
+ onClick: handlePublishRelease(release.id.toString()),
879
892
  loading: isPublishing,
880
893
  disabled: release.actions.meta.count === 0,
881
894
  children: formatMessage({
@@ -883,7 +896,7 @@ const ReleaseDetailsLayout = ({
883
896
  defaultMessage: "Publish"
884
897
  })
885
898
  }
886
- ) })
899
+ ) : null
887
900
  ] })
888
901
  }
889
902
  ),
@@ -909,11 +922,10 @@ const getGroupByOptionLabel = (value) => {
909
922
  defaultMessage: "Content-Types"
910
923
  };
911
924
  };
912
- const ReleaseDetailsBody = () => {
925
+ const ReleaseDetailsBody = ({ releaseId }) => {
913
926
  const { formatMessage } = useIntl();
914
- const { releaseId } = useParams();
915
927
  const [{ query }, setQuery] = useQueryParams();
916
- const toggleNotification = useNotification();
928
+ const { toggleNotification } = useNotification();
917
929
  const { formatAPIError } = useAPIErrorHandler();
918
930
  const {
919
931
  data: releaseData,
@@ -954,19 +966,19 @@ const ReleaseDetailsBody = () => {
954
966
  if ("error" in response) {
955
967
  if (isAxiosError(response.error)) {
956
968
  toggleNotification({
957
- type: "warning",
969
+ type: "danger",
958
970
  message: formatAPIError(response.error)
959
971
  });
960
972
  } else {
961
973
  toggleNotification({
962
- type: "warning",
974
+ type: "danger",
963
975
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
964
976
  });
965
977
  }
966
978
  }
967
979
  };
968
980
  if (isLoading || isReleaseLoading) {
969
- return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) });
981
+ return /* @__PURE__ */ jsx(Page.Loading, {});
970
982
  }
971
983
  const releaseActions = data?.data;
972
984
  const releaseMeta = data?.meta;
@@ -985,32 +997,26 @@ const ReleaseDetailsBody = () => {
985
997
  });
986
998
  }
987
999
  return /* @__PURE__ */ jsx(
988
- Redirect,
1000
+ Navigate,
989
1001
  {
990
- to: {
991
- pathname: "/plugins/content-releases",
992
- state: {
993
- errors: errorsArray
994
- }
1002
+ to: "..",
1003
+ state: {
1004
+ errors: errorsArray
995
1005
  }
996
1006
  }
997
1007
  );
998
1008
  }
999
1009
  if (isError || !releaseActions) {
1000
- return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(AnErrorOccurred, {}) });
1010
+ return /* @__PURE__ */ jsx(Page.Error, {});
1001
1011
  }
1002
1012
  if (Object.keys(releaseActions).length === 0) {
1003
1013
  return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(
1004
- NoContent,
1014
+ EmptyStateLayout,
1005
1015
  {
1006
- content: {
1007
- id: "content-releases.pages.Details.tab.emptyEntries",
1008
- defaultMessage: "This release is empty. Open the Content Manager, select an entry and add it to the release."
1009
- },
1010
1016
  action: /* @__PURE__ */ jsx(
1011
1017
  LinkButton,
1012
1018
  {
1013
- as: Link$2,
1019
+ as: Link$1,
1014
1020
  to: {
1015
1021
  pathname: "/content-manager"
1016
1022
  },
@@ -1021,10 +1027,54 @@ const ReleaseDetailsBody = () => {
1021
1027
  defaultMessage: "Open the Content Manager"
1022
1028
  })
1023
1029
  }
1024
- )
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
+ })
1025
1036
  }
1026
1037
  ) });
1027
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
+ ];
1028
1078
  return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsxs(Flex, { gap: 8, direction: "column", alignItems: "stretch", children: [
1029
1079
  /* @__PURE__ */ jsx(Flex, { children: /* @__PURE__ */ jsx(
1030
1080
  SingleSelect,
@@ -1056,68 +1106,11 @@ const ReleaseDetailsBody = () => {
1056
1106
  ...item,
1057
1107
  id: Number(item.entry.id)
1058
1108
  })),
1059
- colCount: releaseActions[key].length,
1060
- isLoading,
1061
- isFetching,
1109
+ headers,
1110
+ isLoading: isLoading || isFetching,
1062
1111
  children: /* @__PURE__ */ jsxs(Table.Content, { children: [
1063
- /* @__PURE__ */ jsxs(Table.Head, { children: [
1064
- /* @__PURE__ */ jsx(
1065
- Table.HeaderCell,
1066
- {
1067
- fieldSchemaType: "string",
1068
- label: formatMessage({
1069
- id: "content-releases.page.ReleaseDetails.table.header.label.name",
1070
- defaultMessage: "name"
1071
- }),
1072
- name: "name"
1073
- }
1074
- ),
1075
- /* @__PURE__ */ jsx(
1076
- Table.HeaderCell,
1077
- {
1078
- fieldSchemaType: "string",
1079
- label: formatMessage({
1080
- id: "content-releases.page.ReleaseDetails.table.header.label.locale",
1081
- defaultMessage: "locale"
1082
- }),
1083
- name: "locale"
1084
- }
1085
- ),
1086
- /* @__PURE__ */ jsx(
1087
- Table.HeaderCell,
1088
- {
1089
- fieldSchemaType: "string",
1090
- label: formatMessage({
1091
- id: "content-releases.page.ReleaseDetails.table.header.label.content-type",
1092
- defaultMessage: "content-type"
1093
- }),
1094
- name: "content-type"
1095
- }
1096
- ),
1097
- /* @__PURE__ */ jsx(
1098
- Table.HeaderCell,
1099
- {
1100
- fieldSchemaType: "string",
1101
- label: formatMessage({
1102
- id: "content-releases.page.ReleaseDetails.table.header.label.action",
1103
- defaultMessage: "action"
1104
- }),
1105
- name: "action"
1106
- }
1107
- ),
1108
- !release.releasedAt && /* @__PURE__ */ jsx(
1109
- Table.HeaderCell,
1110
- {
1111
- fieldSchemaType: "string",
1112
- label: formatMessage({
1113
- id: "content-releases.page.ReleaseDetails.table.header.label.status",
1114
- defaultMessage: "status"
1115
- }),
1116
- name: "status"
1117
- }
1118
- )
1119
- ] }),
1120
- /* @__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, {}),
1121
1114
  /* @__PURE__ */ jsx(Table.Body, { children: releaseActions[key].map(
1122
1115
  ({ id, contentType, locale, type, entry }, actionIndex) => /* @__PURE__ */ jsxs(Tr, { children: [
1123
1116
  /* @__PURE__ */ jsx(Td, { width: "25%", maxWidth: "200px", children: /* @__PURE__ */ jsx(Typography, { ellipsis: true, children: `${contentType.mainFieldValue || entry.id}` }) }),
@@ -1175,34 +1168,39 @@ const ReleaseDetailsBody = () => {
1175
1168
  }
1176
1169
  )
1177
1170
  ] }, `releases-group-${key}`)),
1178
- /* @__PURE__ */ jsxs(Flex, { paddingTop: 4, alignItems: "flex-end", justifyContent: "space-between", children: [
1179
- /* @__PURE__ */ jsx(PageSizeURLQuery, { defaultValue: releaseMeta?.pagination?.pageSize.toString() }),
1180
- /* @__PURE__ */ jsx(
1181
- PaginationURLQuery,
1182
- {
1183
- pagination: {
1184
- pageCount: releaseMeta?.pagination?.pageCount || 0
1185
- }
1186
- }
1187
- )
1188
- ] })
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
+ )
1189
1182
  ] }) });
1190
1183
  };
1191
1184
  const ReleaseDetailsPage = () => {
1192
1185
  const { formatMessage } = useIntl();
1193
1186
  const { releaseId } = useParams();
1194
- const toggleNotification = useNotification();
1187
+ const { toggleNotification } = useNotification();
1195
1188
  const { formatAPIError } = useAPIErrorHandler();
1196
- const { push } = useHistory();
1189
+ const navigate = useNavigate();
1197
1190
  const [releaseModalShown, setReleaseModalShown] = React.useState(false);
1198
1191
  const [showWarningSubmit, setWarningSubmit] = React.useState(false);
1199
1192
  const {
1200
1193
  isLoading: isLoadingDetails,
1201
1194
  data,
1202
1195
  isSuccess: isSuccessDetails
1203
- } = useGetReleaseQuery({ id: releaseId });
1196
+ } = useGetReleaseQuery(
1197
+ { id: releaseId },
1198
+ {
1199
+ skip: !releaseId
1200
+ }
1201
+ );
1204
1202
  const [updateRelease, { isLoading: isSubmittingForm }] = useUpdateReleaseMutation();
1205
- const [deleteRelease, { isLoading: isDeletingRelease }] = useDeleteReleaseMutation();
1203
+ const [deleteRelease] = useDeleteReleaseMutation();
1206
1204
  const toggleEditReleaseModal = () => {
1207
1205
  setReleaseModalShown((prev) => !prev);
1208
1206
  };
@@ -1213,10 +1211,13 @@ const ReleaseDetailsPage = () => {
1213
1211
  {
1214
1212
  toggleEditReleaseModal,
1215
1213
  toggleWarningSubmit,
1216
- children: /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) })
1214
+ children: /* @__PURE__ */ jsx(Page.Loading, {})
1217
1215
  }
1218
1216
  );
1219
1217
  }
1218
+ if (!releaseId) {
1219
+ return /* @__PURE__ */ jsx(Navigate, { to: ".." });
1220
+ }
1220
1221
  const releaseData = isSuccessDetails && data?.data || null;
1221
1222
  const title = releaseData?.name || "";
1222
1223
  const timezone = releaseData?.timezone ?? null;
@@ -1240,12 +1241,12 @@ const ReleaseDetailsPage = () => {
1240
1241
  });
1241
1242
  } else if (isAxiosError(response.error)) {
1242
1243
  toggleNotification({
1243
- type: "warning",
1244
+ type: "danger",
1244
1245
  message: formatAPIError(response.error)
1245
1246
  });
1246
1247
  } else {
1247
1248
  toggleNotification({
1248
- type: "warning",
1249
+ type: "danger",
1249
1250
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
1250
1251
  });
1251
1252
  }
@@ -1256,15 +1257,15 @@ const ReleaseDetailsPage = () => {
1256
1257
  id: releaseId
1257
1258
  });
1258
1259
  if ("data" in response) {
1259
- push("/plugins/content-releases");
1260
+ navigate("..");
1260
1261
  } else if (isAxiosError(response.error)) {
1261
1262
  toggleNotification({
1262
- type: "warning",
1263
+ type: "danger",
1263
1264
  message: formatAPIError(response.error)
1264
1265
  });
1265
1266
  } else {
1266
1267
  toggleNotification({
1267
- type: "warning",
1268
+ type: "danger",
1268
1269
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
1269
1270
  });
1270
1271
  }
@@ -1275,7 +1276,7 @@ const ReleaseDetailsPage = () => {
1275
1276
  toggleEditReleaseModal,
1276
1277
  toggleWarningSubmit,
1277
1278
  children: [
1278
- /* @__PURE__ */ jsx(ReleaseDetailsBody, {}),
1279
+ /* @__PURE__ */ jsx(ReleaseDetailsBody, { releaseId }),
1279
1280
  releaseModalShown && /* @__PURE__ */ jsx(
1280
1281
  ReleaseModal,
1281
1282
  {
@@ -1295,14 +1296,13 @@ const ReleaseDetailsPage = () => {
1295
1296
  /* @__PURE__ */ jsx(
1296
1297
  ConfirmDialog,
1297
1298
  {
1298
- bodyText: {
1299
+ isOpen: showWarningSubmit,
1300
+ onClose: toggleWarningSubmit,
1301
+ onConfirm: handleDeleteRelease,
1302
+ children: formatMessage({
1299
1303
  id: "content-releases.dialog.confirmation-message",
1300
1304
  defaultMessage: "Are you sure you want to delete this release?"
1301
- },
1302
- isOpen: showWarningSubmit,
1303
- isConfirmButtonLoading: isDeletingRelease,
1304
- onToggleDialog: toggleWarningSubmit,
1305
- onConfirm: handleDeleteRelease
1305
+ })
1306
1306
  }
1307
1307
  )
1308
1308
  ]
@@ -1310,12 +1310,12 @@ const ReleaseDetailsPage = () => {
1310
1310
  );
1311
1311
  };
1312
1312
  const App = () => {
1313
- return /* @__PURE__ */ jsx(CheckPagePermissions, { permissions: PERMISSIONS.main, children: /* @__PURE__ */ jsxs(Switch, { children: [
1314
- /* @__PURE__ */ jsx(Route, { exact: true, path: `/plugins/${pluginId}`, component: ReleasesPage }),
1315
- /* @__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, {}) })
1316
1316
  ] }) });
1317
1317
  };
1318
1318
  export {
1319
1319
  App
1320
1320
  };
1321
- //# sourceMappingURL=App-6ugQxqYE.mjs.map
1321
+ //# sourceMappingURL=App-dbdAcsz_.mjs.map