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

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-p8aKBitd.js → App-vS3MaAL8.js} +277 -279
  2. package/dist/_chunks/App-vS3MaAL8.js.map +1 -0
  3. package/dist/_chunks/{App-bpzO2Ljh.mjs → App-wYLtVioz.mjs} +271 -273
  4. package/dist/_chunks/App-wYLtVioz.mjs.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-fP3qoWZ4.js → index-EoKpj3V5.js} +70 -61
  10. package/dist/_chunks/index-EoKpj3V5.js.map +1 -0
  11. package/dist/_chunks/{index-AECgcaDa.mjs → index-RhLsjv0x.mjs} +72 -63
  12. package/dist/_chunks/index-RhLsjv0x.mjs.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 +8 -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,13 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
- const helperPlugin = require("@strapi/helper-plugin");
4
+ const strapiAdmin = require("@strapi/admin/strapi-admin");
5
5
  const reactRouterDom = require("react-router-dom");
6
- const index = require("./index-fP3qoWZ4.js");
6
+ const index = require("./index-EoKpj3V5.js");
7
7
  const React = require("react");
8
- const strapiAdmin = require("@strapi/admin/strapi-admin");
9
8
  const designSystem = require("@strapi/design-system");
10
9
  const v2 = require("@strapi/design-system/v2");
10
+ const helperPlugin = require("@strapi/helper-plugin");
11
11
  const icons = require("@strapi/icons");
12
12
  const format = require("date-fns/format");
13
13
  const dateFnsTz = require("date-fns-tz");
@@ -16,10 +16,6 @@ const styled = require("styled-components");
16
16
  const dateFns = require("date-fns");
17
17
  const formik = require("formik");
18
18
  const yup = require("yup");
19
- require("@reduxjs/toolkit/query");
20
- require("axios");
21
- require("@reduxjs/toolkit/query/react");
22
- require("react-redux");
23
19
  const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
24
20
  function _interopNamespace(e) {
25
21
  if (e && e.__esModule)
@@ -43,6 +39,36 @@ const React__namespace = /* @__PURE__ */ _interopNamespace(React);
43
39
  const format__default = /* @__PURE__ */ _interopDefault(format);
44
40
  const styled__default = /* @__PURE__ */ _interopDefault(styled);
45
41
  const yup__namespace = /* @__PURE__ */ _interopNamespace(yup);
42
+ const intervals = ["years", "months", "days", "hours", "minutes", "seconds"];
43
+ const RelativeTime = React__namespace.forwardRef(
44
+ ({ timestamp, customIntervals = [], ...restProps }, forwardedRef) => {
45
+ const { formatRelativeTime, formatDate, formatTime } = reactIntl.useIntl();
46
+ const interval = dateFns.intervalToDuration({
47
+ start: timestamp,
48
+ end: Date.now()
49
+ // see https://github.com/date-fns/date-fns/issues/2891 – No idea why it's all partial it returns it every time.
50
+ });
51
+ const unit = intervals.find((intervalUnit) => {
52
+ return interval[intervalUnit] > 0 && Object.keys(interval).includes(intervalUnit);
53
+ });
54
+ const relativeTime = dateFns.isPast(timestamp) ? -interval[unit] : interval[unit];
55
+ const customInterval = customIntervals.find(
56
+ (custom) => interval[custom.unit] < custom.threshold
57
+ );
58
+ const displayText = customInterval ? customInterval.text : formatRelativeTime(relativeTime, unit, { numeric: "auto" });
59
+ return /* @__PURE__ */ jsxRuntime.jsx(
60
+ "time",
61
+ {
62
+ ref: forwardedRef,
63
+ dateTime: timestamp.toISOString(),
64
+ role: "time",
65
+ title: `${formatDate(timestamp)} ${formatTime(timestamp)}`,
66
+ ...restProps,
67
+ children: displayText
68
+ }
69
+ );
70
+ }
71
+ );
46
72
  const RELEASE_SCHEMA = yup__namespace.object().shape({
47
73
  name: yup__namespace.string().trim().required(),
48
74
  scheduledAt: yup__namespace.string().nullable(),
@@ -72,7 +98,6 @@ const ReleaseModal = ({
72
98
  const { formatMessage } = reactIntl.useIntl();
73
99
  const { pathname } = reactRouterDom.useLocation();
74
100
  const isCreatingRelease = pathname === `/plugins/${index.pluginId}`;
75
- const IsSchedulingEnabled = window.strapi.future.isEnabled("contentReleasesScheduling");
76
101
  const { timezoneList, systemTimezone = { value: "UTC+00:00-Africa/Abidjan " } } = getTimezones(
77
102
  initialValues.scheduledAt ? new Date(initialValues.scheduledAt) : /* @__PURE__ */ new Date()
78
103
  );
@@ -130,93 +155,88 @@ const ReleaseModal = ({
130
155
  required: true
131
156
  }
132
157
  ),
133
- IsSchedulingEnabled && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
134
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { width: "max-content", children: /* @__PURE__ */ jsxRuntime.jsx(
135
- designSystem.Checkbox,
136
- {
137
- name: "isScheduled",
138
- value: values.isScheduled,
139
- onChange: (event) => {
140
- setFieldValue("isScheduled", event.target.checked);
141
- if (!event.target.checked) {
158
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { width: "max-content", children: /* @__PURE__ */ jsxRuntime.jsx(
159
+ designSystem.Checkbox,
160
+ {
161
+ name: "isScheduled",
162
+ value: values.isScheduled,
163
+ onChange: (event) => {
164
+ setFieldValue("isScheduled", event.target.checked);
165
+ if (!event.target.checked) {
166
+ setFieldValue("date", null);
167
+ setFieldValue("time", "");
168
+ setFieldValue("timezone", null);
169
+ } else {
170
+ setFieldValue("date", initialValues.date);
171
+ setFieldValue("time", initialValues.time);
172
+ setFieldValue("timezone", initialValues.timezone ?? systemTimezone?.value);
173
+ }
174
+ },
175
+ children: /* @__PURE__ */ jsxRuntime.jsx(
176
+ designSystem.Typography,
177
+ {
178
+ textColor: values.isScheduled ? "primary600" : "neutral800",
179
+ fontWeight: values.isScheduled ? "semiBold" : "regular",
180
+ children: formatMessage({
181
+ id: "modal.form.input.label.schedule-release",
182
+ defaultMessage: "Schedule release"
183
+ })
184
+ }
185
+ )
186
+ }
187
+ ) }),
188
+ values.isScheduled && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
189
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 4, alignItems: "start", children: [
190
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { width: "100%", children: /* @__PURE__ */ jsxRuntime.jsx(
191
+ designSystem.DatePicker,
192
+ {
193
+ label: formatMessage({
194
+ id: "content-releases.modal.form.input.label.date",
195
+ defaultMessage: "Date"
196
+ }),
197
+ name: "date",
198
+ error: errors.date,
199
+ onChange: (date) => {
200
+ const isoFormatDate = date ? dateFns.formatISO(date, { representation: "date" }) : null;
201
+ setFieldValue("date", isoFormatDate);
202
+ },
203
+ clearLabel: formatMessage({
204
+ id: "content-releases.modal.form.input.clearLabel",
205
+ defaultMessage: "Clear"
206
+ }),
207
+ onClear: () => {
142
208
  setFieldValue("date", null);
209
+ },
210
+ selectedDate: values.date || void 0,
211
+ required: true,
212
+ minDate: dateFnsTz.utcToZonedTime(/* @__PURE__ */ new Date(), values.timezone.split("&")[1])
213
+ }
214
+ ) }),
215
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { width: "100%", children: /* @__PURE__ */ jsxRuntime.jsx(
216
+ designSystem.TimePicker,
217
+ {
218
+ label: formatMessage({
219
+ id: "content-releases.modal.form.input.label.time",
220
+ defaultMessage: "Time"
221
+ }),
222
+ name: "time",
223
+ error: errors.time,
224
+ onChange: (time) => {
225
+ setFieldValue("time", time);
226
+ },
227
+ clearLabel: formatMessage({
228
+ id: "content-releases.modal.form.input.clearLabel",
229
+ defaultMessage: "Clear"
230
+ }),
231
+ onClear: () => {
143
232
  setFieldValue("time", "");
144
- setFieldValue("timezone", null);
145
- } else {
146
- setFieldValue("date", initialValues.date);
147
- setFieldValue("time", initialValues.time);
148
- setFieldValue(
149
- "timezone",
150
- initialValues.timezone ?? systemTimezone?.value
151
- );
152
- }
153
- },
154
- children: /* @__PURE__ */ jsxRuntime.jsx(
155
- designSystem.Typography,
156
- {
157
- textColor: values.isScheduled ? "primary600" : "neutral800",
158
- fontWeight: values.isScheduled ? "semiBold" : "regular",
159
- children: formatMessage({
160
- id: "modal.form.input.label.schedule-release",
161
- defaultMessage: "Schedule release"
162
- })
163
- }
164
- )
165
- }
166
- ) }),
167
- values.isScheduled && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
168
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 4, alignItems: "start", children: [
169
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { width: "100%", children: /* @__PURE__ */ jsxRuntime.jsx(
170
- designSystem.DatePicker,
171
- {
172
- label: formatMessage({
173
- id: "content-releases.modal.form.input.label.date",
174
- defaultMessage: "Date"
175
- }),
176
- name: "date",
177
- error: errors.date,
178
- onChange: (date) => {
179
- const isoFormatDate = date ? dateFns.formatISO(date, { representation: "date" }) : null;
180
- setFieldValue("date", isoFormatDate);
181
- },
182
- clearLabel: formatMessage({
183
- id: "content-releases.modal.form.input.clearLabel",
184
- defaultMessage: "Clear"
185
- }),
186
- onClear: () => {
187
- setFieldValue("date", null);
188
- },
189
- selectedDate: values.date || void 0,
190
- required: true,
191
- minDate: dateFnsTz.utcToZonedTime(/* @__PURE__ */ new Date(), values.timezone.split("&")[1])
192
- }
193
- ) }),
194
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { width: "100%", children: /* @__PURE__ */ jsxRuntime.jsx(
195
- designSystem.TimePicker,
196
- {
197
- label: formatMessage({
198
- id: "content-releases.modal.form.input.label.time",
199
- defaultMessage: "Time"
200
- }),
201
- name: "time",
202
- error: errors.time,
203
- onChange: (time) => {
204
- setFieldValue("time", time);
205
- },
206
- clearLabel: formatMessage({
207
- id: "content-releases.modal.form.input.clearLabel",
208
- defaultMessage: "Clear"
209
- }),
210
- onClear: () => {
211
- setFieldValue("time", "");
212
- },
213
- value: values.time || void 0,
214
- required: true
215
- }
216
- ) })
217
- ] }),
218
- /* @__PURE__ */ jsxRuntime.jsx(TimezoneComponent, { timezoneOptions: timezoneList })
219
- ] })
233
+ },
234
+ value: values.time || void 0,
235
+ required: true
236
+ }
237
+ ) })
238
+ ] }),
239
+ /* @__PURE__ */ jsxRuntime.jsx(TimezoneComponent, { timezoneOptions: timezoneList })
220
240
  ] })
221
241
  ] }) }),
222
242
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -290,7 +310,7 @@ const TimezoneComponent = ({ timezoneOptions }) => {
290
310
  const LinkCard = styled__default.default(v2.Link)`
291
311
  display: block;
292
312
  `;
293
- const CapitalizeRelativeTime = styled__default.default(helperPlugin.RelativeTime)`
313
+ const CapitalizeRelativeTime = styled__default.default(RelativeTime)`
294
314
  text-transform: capitalize;
295
315
  `;
296
316
  const getBadgeProps = (status) => {
@@ -320,9 +340,8 @@ const getBadgeProps = (status) => {
320
340
  };
321
341
  const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
322
342
  const { formatMessage } = reactIntl.useIntl();
323
- const IsSchedulingEnabled = window.strapi.future.isEnabled("contentReleasesScheduling");
324
343
  if (isError) {
325
- return /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.AnErrorOccurred, {});
344
+ return /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Page.Error, {});
326
345
  }
327
346
  if (releases?.length === 0) {
328
347
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -341,7 +360,7 @@ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
341
360
  }
342
361
  );
343
362
  }
344
- return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Grid, { gap: 4, children: releases.map(({ id, name, actions, scheduledAt, status }) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.GridItem, { col: 3, s: 6, xs: 12, children: /* @__PURE__ */ jsxRuntime.jsx(LinkCard, { href: `content-releases/${id}`, isExternal: false, children: /* @__PURE__ */ jsxRuntime.jsxs(
363
+ return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Grid, { gap: 4, children: releases.map(({ id, name, scheduledAt, status }) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.GridItem, { col: 3, s: 6, xs: 12, children: /* @__PURE__ */ jsxRuntime.jsx(LinkCard, { href: `content-releases/${id}`, isExternal: false, children: /* @__PURE__ */ jsxRuntime.jsxs(
345
364
  designSystem.Flex,
346
365
  {
347
366
  direction: "column",
@@ -357,16 +376,10 @@ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
357
376
  children: [
358
377
  /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", alignItems: "start", gap: 1, children: [
359
378
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { as: "h3", variant: "delta", fontWeight: "bold", children: name }),
360
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "pi", textColor: "neutral600", children: IsSchedulingEnabled ? scheduledAt ? /* @__PURE__ */ jsxRuntime.jsx(CapitalizeRelativeTime, { timestamp: new Date(scheduledAt) }) : formatMessage({
379
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "pi", textColor: "neutral600", children: scheduledAt ? /* @__PURE__ */ jsxRuntime.jsx(CapitalizeRelativeTime, { timestamp: new Date(scheduledAt) }) : formatMessage({
361
380
  id: "content-releases.pages.Releases.not-scheduled",
362
381
  defaultMessage: "Not scheduled"
363
- }) : formatMessage(
364
- {
365
- id: "content-releases.page.Releases.release-item.entries",
366
- defaultMessage: "{number, plural, =0 {No entries} one {# entry} other {# entries}}"
367
- },
368
- { number: actions.meta.count }
369
- ) })
382
+ }) })
370
383
  ] }),
371
384
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Badge, { ...getBadgeProps(status), children: status })
372
385
  ]
@@ -385,8 +398,7 @@ const INITIAL_FORM_VALUES = {
385
398
  name: "",
386
399
  date: null,
387
400
  time: "",
388
- // Remove future flag check after Scheduling Beta release and replace with true as creating new release should include scheduling by default
389
- isScheduled: window.strapi.future.isEnabled("contentReleasesScheduling"),
401
+ isScheduled: true,
390
402
  scheduledAt: null,
391
403
  timezone: null
392
404
  };
@@ -396,14 +408,17 @@ const ReleasesPage = () => {
396
408
  const [releaseModalShown, setReleaseModalShown] = React__namespace.useState(false);
397
409
  const toggleNotification = helperPlugin.useNotification();
398
410
  const { formatMessage } = reactIntl.useIntl();
399
- const { push, replace } = reactRouterDom.useHistory();
400
- const { formatAPIError } = helperPlugin.useAPIErrorHandler();
411
+ const navigate = reactRouterDom.useNavigate();
412
+ const { formatAPIError } = strapiAdmin.useAPIErrorHandler();
401
413
  const [{ query }, setQuery] = helperPlugin.useQueryParams();
402
414
  const response = index.useGetReleasesQuery(query);
403
415
  const [createRelease, { isLoading: isSubmittingForm }] = index.useCreateReleaseMutation();
404
416
  const { getFeature } = strapiAdmin.useLicenseLimits();
405
417
  const { maximumReleases = 3 } = getFeature("cms-content-releases");
406
- const { trackUsage } = helperPlugin.useTracking();
418
+ const { trackUsage } = strapiAdmin.useTracking();
419
+ const {
420
+ allowedActions: { canCreate }
421
+ } = helperPlugin.useRBAC(index.PERMISSIONS);
407
422
  const { isLoading, isSuccess, isError } = response;
408
423
  const activeTab = response?.currentData?.meta?.activeTab || "pending";
409
424
  const activeTabIndex = ["pending", "done"].indexOf(activeTab);
@@ -420,9 +435,9 @@ const ReleasesPage = () => {
420
435
  defaultMessage: "Please try again or open another release."
421
436
  })
422
437
  });
423
- replace({ state: null });
438
+ navigate("", { replace: true, state: null });
424
439
  }
425
- }, [formatMessage, location?.state?.errors, replace, toggleNotification]);
440
+ }, [formatMessage, location?.state?.errors, navigate, toggleNotification]);
426
441
  React__namespace.useEffect(() => {
427
442
  if (tabRef.current) {
428
443
  tabRef.current._handlers.setSelectedTabIndex(activeTabIndex);
@@ -432,7 +447,7 @@ const ReleasesPage = () => {
432
447
  setReleaseModalShown((prev) => !prev);
433
448
  };
434
449
  if (isLoading) {
435
- return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Main, { "aria-busy": isLoading, children: /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.LoadingIndicatorPage, {}) });
450
+ return /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Page.Loading, {});
436
451
  }
437
452
  const totalPendingReleases = isSuccess && response.currentData?.meta?.pendingReleasesCount || 0;
438
453
  const hasReachedMaximumPendingReleases = totalPendingReleases >= maximumReleases;
@@ -463,7 +478,7 @@ const ReleasesPage = () => {
463
478
  })
464
479
  });
465
480
  trackUsage("didCreateRelease");
466
- push(`/plugins/content-releases/${response2.data.data.id}`);
481
+ navigate(response2.data.data.id.toString());
467
482
  } else if (index.isAxiosError(response2.error)) {
468
483
  toggleNotification({
469
484
  type: "warning",
@@ -488,7 +503,7 @@ const ReleasesPage = () => {
488
503
  id: "content-releases.pages.Releases.header-subtitle",
489
504
  defaultMessage: "Create and manage content updates"
490
505
  }),
491
- primaryAction: /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.CheckPermissions, { permissions: index.PERMISSIONS.create, children: /* @__PURE__ */ jsxRuntime.jsx(
506
+ primaryAction: canCreate ? /* @__PURE__ */ jsxRuntime.jsx(
492
507
  designSystem.Button,
493
508
  {
494
509
  startIcon: /* @__PURE__ */ jsxRuntime.jsx(icons.Plus, {}),
@@ -499,7 +514,7 @@ const ReleasesPage = () => {
499
514
  defaultMessage: "New release"
500
515
  })
501
516
  }
502
- ) })
517
+ ) : null
503
518
  }
504
519
  ),
505
520
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.ContentLayout, { children: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
@@ -578,23 +593,17 @@ const ReleasesPage = () => {
578
593
  ]
579
594
  }
580
595
  ),
581
- response.currentData?.meta?.pagination?.total ? /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { paddingTop: 4, alignItems: "flex-end", justifyContent: "space-between", children: [
582
- /* @__PURE__ */ jsxRuntime.jsx(
583
- helperPlugin.PageSizeURLQuery,
584
- {
585
- options: ["8", "16", "32", "64"],
586
- defaultValue: response?.currentData?.meta?.pagination?.pageSize.toString()
587
- }
588
- ),
589
- /* @__PURE__ */ jsxRuntime.jsx(
590
- helperPlugin.PaginationURLQuery,
591
- {
592
- pagination: {
593
- pageCount: response?.currentData?.meta?.pagination?.pageCount || 0
594
- }
595
- }
596
- )
597
- ] }) : null
596
+ /* @__PURE__ */ jsxRuntime.jsxs(
597
+ strapiAdmin.Pagination.Root,
598
+ {
599
+ ...response?.currentData?.meta?.pagination,
600
+ defaultPageSize: response?.currentData?.meta?.pagination?.pageSize,
601
+ children: [
602
+ /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Pagination.PageSize, { options: ["8", "16", "32", "64"] }),
603
+ /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Pagination.Links, {})
604
+ ]
605
+ }
606
+ )
598
607
  ] }) }),
599
608
  releaseModalShown && /* @__PURE__ */ jsxRuntime.jsx(
600
609
  ReleaseModal,
@@ -642,14 +651,18 @@ const TrashIcon = styled__default.default(icons.Trash)`
642
651
  const TypographyMaxWidth = styled__default.default(designSystem.Typography)`
643
652
  max-width: 300px;
644
653
  `;
645
- const EntryValidationText = ({ action, schema, components, entry }) => {
654
+ const EntryValidationText = ({ action, schema, entry }) => {
646
655
  const { formatMessage } = reactIntl.useIntl();
647
- const { validate } = strapiAdmin.unstable_useDocument();
648
- const { errors } = validate(entry, {
649
- contentType: schema,
650
- components,
651
- isCreatingEntry: false
652
- });
656
+ const { validate } = strapiAdmin.unstable_useDocument(
657
+ {
658
+ collectionType: schema?.kind ?? "",
659
+ model: schema?.uid ?? ""
660
+ },
661
+ {
662
+ skip: !schema
663
+ }
664
+ );
665
+ const errors = validate(entry) ?? {};
653
666
  if (Object.keys(errors).length > 0) {
654
667
  const validationErrorsMessages = Object.entries(errors).map(
655
668
  ([key, value]) => formatMessage(
@@ -697,18 +710,22 @@ const ReleaseDetailsLayout = ({
697
710
  isLoading: isLoadingDetails,
698
711
  isError,
699
712
  error
700
- } = index.useGetReleaseQuery({ id: releaseId });
713
+ } = index.useGetReleaseQuery(
714
+ { id: releaseId },
715
+ {
716
+ skip: !releaseId
717
+ }
718
+ );
701
719
  const [publishRelease, { isLoading: isPublishing }] = index.usePublishReleaseMutation();
702
720
  const toggleNotification = helperPlugin.useNotification();
703
- const { formatAPIError } = helperPlugin.useAPIErrorHandler();
704
- const {
705
- allowedActions: { canUpdate, canDelete }
706
- } = helperPlugin.useRBAC(index.PERMISSIONS);
721
+ const { formatAPIError } = strapiAdmin.useAPIErrorHandler();
722
+ const { allowedActions } = helperPlugin.useRBAC(index.PERMISSIONS);
723
+ const { canUpdate, canDelete, canPublish } = allowedActions;
707
724
  const dispatch = index.useTypedDispatch();
708
- const { trackUsage } = helperPlugin.useTracking();
725
+ const { trackUsage } = strapiAdmin.useTracking();
709
726
  const release = data?.data;
710
- const handlePublishRelease = async () => {
711
- const response = await publishRelease({ id: releaseId });
727
+ const handlePublishRelease = (id) => async () => {
728
+ const response = await publishRelease({ id });
712
729
  if ("data" in response) {
713
730
  toggleNotification({
714
731
  type: "success",
@@ -751,28 +768,25 @@ const ReleaseDetailsLayout = ({
751
768
  return release.createdBy.email;
752
769
  };
753
770
  if (isLoadingDetails) {
754
- return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Main, { "aria-busy": isLoadingDetails, children: /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.LoadingIndicatorPage, {}) });
771
+ return /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Page.Loading, {});
755
772
  }
756
773
  if (isError || !release) {
757
774
  return /* @__PURE__ */ jsxRuntime.jsx(
758
- reactRouterDom.Redirect,
775
+ reactRouterDom.Navigate,
759
776
  {
760
- to: {
761
- pathname: "/plugins/content-releases",
762
- state: {
763
- errors: [
764
- {
765
- code: error?.code
766
- }
767
- ]
768
- }
777
+ to: "..",
778
+ state: {
779
+ errors: [
780
+ {
781
+ code: error?.code
782
+ }
783
+ ]
769
784
  }
770
785
  }
771
786
  );
772
787
  }
773
788
  const totalEntries = release.actions.meta.count || 0;
774
789
  const hasCreatedByUser = Boolean(getCreatedByUser());
775
- const IsSchedulingEnabled = window.strapi.future.isEnabled("contentReleasesScheduling");
776
790
  const isScheduled = release.scheduledAt && release.timezone;
777
791
  const numberOfEntriesText = formatMessage(
778
792
  {
@@ -807,13 +821,10 @@ const ReleaseDetailsLayout = ({
807
821
  {
808
822
  title: release.name,
809
823
  subtitle: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 2, lineHeight: 6, children: [
810
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "neutral600", variant: "epsilon", children: numberOfEntriesText + (IsSchedulingEnabled && isScheduled ? ` - ${scheduledText}` : "") }),
824
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "neutral600", variant: "epsilon", children: numberOfEntriesText + (isScheduled ? ` - ${scheduledText}` : "") }),
811
825
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Badge, { ...getBadgeProps(release.status), children: release.status })
812
826
  ] }),
813
- navigationAction: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Link, { startIcon: /* @__PURE__ */ jsxRuntime.jsx(icons.ArrowLeft, {}), to: "/plugins/content-releases", children: formatMessage({
814
- id: "global.back",
815
- defaultMessage: "Back"
816
- }) }),
827
+ navigationAction: /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.BackButton, {}),
817
828
  primaryAction: !release.releasedAt && /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 2, children: [
818
829
  /* @__PURE__ */ jsxRuntime.jsxs(v2.Menu.Root, { children: [
819
830
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -879,7 +890,7 @@ const ReleaseDetailsLayout = ({
879
890
  defaultMessage: "Created"
880
891
  }) }),
881
892
  /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Typography, { variant: "pi", color: "neutral300", children: [
882
- /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.RelativeTime, { timestamp: new Date(release.createdAt) }),
893
+ /* @__PURE__ */ jsxRuntime.jsx(RelativeTime, { timestamp: new Date(release.createdAt) }),
883
894
  formatMessage(
884
895
  {
885
896
  id: "content-releases.header.actions.created.description",
@@ -897,12 +908,12 @@ const ReleaseDetailsLayout = ({
897
908
  id: "content-releases.header.actions.refresh",
898
909
  defaultMessage: "Refresh"
899
910
  }) }),
900
- /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.CheckPermissions, { permissions: index.PERMISSIONS.publish, children: /* @__PURE__ */ jsxRuntime.jsx(
911
+ canPublish ? /* @__PURE__ */ jsxRuntime.jsx(
901
912
  designSystem.Button,
902
913
  {
903
914
  size: "S",
904
915
  variant: "default",
905
- onClick: handlePublishRelease,
916
+ onClick: handlePublishRelease(release.id.toString()),
906
917
  loading: isPublishing,
907
918
  disabled: release.actions.meta.count === 0,
908
919
  children: formatMessage({
@@ -910,7 +921,7 @@ const ReleaseDetailsLayout = ({
910
921
  defaultMessage: "Publish"
911
922
  })
912
923
  }
913
- ) })
924
+ ) : null
914
925
  ] })
915
926
  }
916
927
  ),
@@ -936,12 +947,11 @@ const getGroupByOptionLabel = (value) => {
936
947
  defaultMessage: "Content-Types"
937
948
  };
938
949
  };
939
- const ReleaseDetailsBody = () => {
950
+ const ReleaseDetailsBody = ({ releaseId }) => {
940
951
  const { formatMessage } = reactIntl.useIntl();
941
- const { releaseId } = reactRouterDom.useParams();
942
952
  const [{ query }, setQuery] = helperPlugin.useQueryParams();
943
953
  const toggleNotification = helperPlugin.useNotification();
944
- const { formatAPIError } = helperPlugin.useAPIErrorHandler();
954
+ const { formatAPIError } = strapiAdmin.useAPIErrorHandler();
945
955
  const {
946
956
  data: releaseData,
947
957
  isLoading: isReleaseLoading,
@@ -993,7 +1003,7 @@ const ReleaseDetailsBody = () => {
993
1003
  }
994
1004
  };
995
1005
  if (isLoading || isReleaseLoading) {
996
- return /* @__PURE__ */ jsxRuntime.jsx(designSystem.ContentLayout, { children: /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.LoadingIndicatorPage, {}) });
1006
+ return /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Page.Loading, {});
997
1007
  }
998
1008
  const releaseActions = data?.data;
999
1009
  const releaseMeta = data?.meta;
@@ -1012,28 +1022,22 @@ const ReleaseDetailsBody = () => {
1012
1022
  });
1013
1023
  }
1014
1024
  return /* @__PURE__ */ jsxRuntime.jsx(
1015
- reactRouterDom.Redirect,
1025
+ reactRouterDom.Navigate,
1016
1026
  {
1017
- to: {
1018
- pathname: "/plugins/content-releases",
1019
- state: {
1020
- errors: errorsArray
1021
- }
1027
+ to: "..",
1028
+ state: {
1029
+ errors: errorsArray
1022
1030
  }
1023
1031
  }
1024
1032
  );
1025
1033
  }
1026
1034
  if (isError || !releaseActions) {
1027
- return /* @__PURE__ */ jsxRuntime.jsx(designSystem.ContentLayout, { children: /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.AnErrorOccurred, {}) });
1035
+ return /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Page.Error, {});
1028
1036
  }
1029
1037
  if (Object.keys(releaseActions).length === 0) {
1030
1038
  return /* @__PURE__ */ jsxRuntime.jsx(designSystem.ContentLayout, { children: /* @__PURE__ */ jsxRuntime.jsx(
1031
- helperPlugin.NoContent,
1039
+ designSystem.EmptyStateLayout,
1032
1040
  {
1033
- content: {
1034
- id: "content-releases.pages.Details.tab.emptyEntries",
1035
- defaultMessage: "This release is empty. Open the Content Manager, select an entry and add it to the release."
1036
- },
1037
1041
  action: /* @__PURE__ */ jsxRuntime.jsx(
1038
1042
  v2.LinkButton,
1039
1043
  {
@@ -1048,10 +1052,54 @@ const ReleaseDetailsBody = () => {
1048
1052
  defaultMessage: "Open the Content Manager"
1049
1053
  })
1050
1054
  }
1051
- )
1055
+ ),
1056
+ icon: /* @__PURE__ */ jsxRuntime.jsx(icons.EmptyDocuments, { width: "10rem" }),
1057
+ content: formatMessage({
1058
+ id: "content-releases.pages.Details.tab.emptyEntries",
1059
+ defaultMessage: "This release is empty. Open the Content Manager, select an entry and add it to the release."
1060
+ })
1052
1061
  }
1053
1062
  ) });
1054
1063
  }
1064
+ const headers = [
1065
+ {
1066
+ label: formatMessage({
1067
+ id: "content-releases.page.ReleaseDetails.table.header.label.name",
1068
+ defaultMessage: "name"
1069
+ }),
1070
+ name: "name"
1071
+ },
1072
+ {
1073
+ label: formatMessage({
1074
+ id: "content-releases.page.ReleaseDetails.table.header.label.locale",
1075
+ defaultMessage: "locale"
1076
+ }),
1077
+ name: "locale"
1078
+ },
1079
+ {
1080
+ label: formatMessage({
1081
+ id: "content-releases.page.ReleaseDetails.table.header.label.content-type",
1082
+ defaultMessage: "content-type"
1083
+ }),
1084
+ name: "content-type"
1085
+ },
1086
+ {
1087
+ label: formatMessage({
1088
+ id: "content-releases.page.ReleaseDetails.table.header.label.action",
1089
+ defaultMessage: "action"
1090
+ }),
1091
+ name: "action"
1092
+ },
1093
+ ...!release.releasedAt ? [
1094
+ {
1095
+ label: formatMessage({
1096
+ id: "content-releases.page.ReleaseDetails.table.header.label.status",
1097
+ defaultMessage: "status"
1098
+ }),
1099
+ name: "status"
1100
+ }
1101
+ ] : []
1102
+ ];
1055
1103
  return /* @__PURE__ */ jsxRuntime.jsx(designSystem.ContentLayout, { children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 8, direction: "column", alignItems: "stretch", children: [
1056
1104
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { children: /* @__PURE__ */ jsxRuntime.jsx(
1057
1105
  designSystem.SingleSelect,
@@ -1077,75 +1125,18 @@ const ReleaseDetailsBody = () => {
1077
1125
  Object.keys(releaseActions).map((key) => /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 4, direction: "column", alignItems: "stretch", children: [
1078
1126
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { role: "separator", "aria-label": key, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Badge, { children: key }) }),
1079
1127
  /* @__PURE__ */ jsxRuntime.jsx(
1080
- helperPlugin.Table.Root,
1128
+ strapiAdmin.Table.Root,
1081
1129
  {
1082
1130
  rows: releaseActions[key].map((item) => ({
1083
1131
  ...item,
1084
1132
  id: Number(item.entry.id)
1085
1133
  })),
1086
- colCount: releaseActions[key].length,
1087
- isLoading,
1088
- isFetching,
1089
- children: /* @__PURE__ */ jsxRuntime.jsxs(helperPlugin.Table.Content, { children: [
1090
- /* @__PURE__ */ jsxRuntime.jsxs(helperPlugin.Table.Head, { children: [
1091
- /* @__PURE__ */ jsxRuntime.jsx(
1092
- helperPlugin.Table.HeaderCell,
1093
- {
1094
- fieldSchemaType: "string",
1095
- label: formatMessage({
1096
- id: "content-releases.page.ReleaseDetails.table.header.label.name",
1097
- defaultMessage: "name"
1098
- }),
1099
- name: "name"
1100
- }
1101
- ),
1102
- /* @__PURE__ */ jsxRuntime.jsx(
1103
- helperPlugin.Table.HeaderCell,
1104
- {
1105
- fieldSchemaType: "string",
1106
- label: formatMessage({
1107
- id: "content-releases.page.ReleaseDetails.table.header.label.locale",
1108
- defaultMessage: "locale"
1109
- }),
1110
- name: "locale"
1111
- }
1112
- ),
1113
- /* @__PURE__ */ jsxRuntime.jsx(
1114
- helperPlugin.Table.HeaderCell,
1115
- {
1116
- fieldSchemaType: "string",
1117
- label: formatMessage({
1118
- id: "content-releases.page.ReleaseDetails.table.header.label.content-type",
1119
- defaultMessage: "content-type"
1120
- }),
1121
- name: "content-type"
1122
- }
1123
- ),
1124
- /* @__PURE__ */ jsxRuntime.jsx(
1125
- helperPlugin.Table.HeaderCell,
1126
- {
1127
- fieldSchemaType: "string",
1128
- label: formatMessage({
1129
- id: "content-releases.page.ReleaseDetails.table.header.label.action",
1130
- defaultMessage: "action"
1131
- }),
1132
- name: "action"
1133
- }
1134
- ),
1135
- !release.releasedAt && /* @__PURE__ */ jsxRuntime.jsx(
1136
- helperPlugin.Table.HeaderCell,
1137
- {
1138
- fieldSchemaType: "string",
1139
- label: formatMessage({
1140
- id: "content-releases.page.ReleaseDetails.table.header.label.status",
1141
- defaultMessage: "status"
1142
- }),
1143
- name: "status"
1144
- }
1145
- )
1146
- ] }),
1147
- /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.Table.LoadingBody, {}),
1148
- /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.Table.Body, { children: releaseActions[key].map(
1134
+ headers,
1135
+ isLoading: isLoading || isFetching,
1136
+ children: /* @__PURE__ */ jsxRuntime.jsxs(strapiAdmin.Table.Content, { children: [
1137
+ /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Table.Head, { children: headers.map((header) => /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Table.HeaderCell, { ...header }, header.name)) }),
1138
+ /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Table.Loading, {}),
1139
+ /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Table.Body, { children: releaseActions[key].map(
1149
1140
  ({ id, contentType, locale, type, entry }, actionIndex) => /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Tr, { children: [
1150
1141
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Td, { width: "25%", maxWidth: "200px", children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { ellipsis: true, children: `${contentType.mainFieldValue || entry.id}` }) }),
1151
1142
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Td, { width: "10%", children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { children: `${locale?.name ? locale.name : "-"}` }) }),
@@ -1202,34 +1193,39 @@ const ReleaseDetailsBody = () => {
1202
1193
  }
1203
1194
  )
1204
1195
  ] }, `releases-group-${key}`)),
1205
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { paddingTop: 4, alignItems: "flex-end", justifyContent: "space-between", children: [
1206
- /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.PageSizeURLQuery, { defaultValue: releaseMeta?.pagination?.pageSize.toString() }),
1207
- /* @__PURE__ */ jsxRuntime.jsx(
1208
- helperPlugin.PaginationURLQuery,
1209
- {
1210
- pagination: {
1211
- pageCount: releaseMeta?.pagination?.pageCount || 0
1212
- }
1213
- }
1214
- )
1215
- ] })
1196
+ /* @__PURE__ */ jsxRuntime.jsxs(
1197
+ strapiAdmin.Pagination.Root,
1198
+ {
1199
+ ...releaseMeta?.pagination,
1200
+ defaultPageSize: releaseMeta?.pagination?.pageSize,
1201
+ children: [
1202
+ /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Pagination.PageSize, {}),
1203
+ /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Pagination.Links, {})
1204
+ ]
1205
+ }
1206
+ )
1216
1207
  ] }) });
1217
1208
  };
1218
1209
  const ReleaseDetailsPage = () => {
1219
1210
  const { formatMessage } = reactIntl.useIntl();
1220
1211
  const { releaseId } = reactRouterDom.useParams();
1221
1212
  const toggleNotification = helperPlugin.useNotification();
1222
- const { formatAPIError } = helperPlugin.useAPIErrorHandler();
1223
- const { replace } = reactRouterDom.useHistory();
1213
+ const { formatAPIError } = strapiAdmin.useAPIErrorHandler();
1214
+ const navigate = reactRouterDom.useNavigate();
1224
1215
  const [releaseModalShown, setReleaseModalShown] = React__namespace.useState(false);
1225
1216
  const [showWarningSubmit, setWarningSubmit] = React__namespace.useState(false);
1226
1217
  const {
1227
1218
  isLoading: isLoadingDetails,
1228
1219
  data,
1229
1220
  isSuccess: isSuccessDetails
1230
- } = index.useGetReleaseQuery({ id: releaseId });
1221
+ } = index.useGetReleaseQuery(
1222
+ { id: releaseId },
1223
+ {
1224
+ skip: !releaseId
1225
+ }
1226
+ );
1231
1227
  const [updateRelease, { isLoading: isSubmittingForm }] = index.useUpdateReleaseMutation();
1232
- const [deleteRelease, { isLoading: isDeletingRelease }] = index.useDeleteReleaseMutation();
1228
+ const [deleteRelease] = index.useDeleteReleaseMutation();
1233
1229
  const toggleEditReleaseModal = () => {
1234
1230
  setReleaseModalShown((prev) => !prev);
1235
1231
  };
@@ -1240,10 +1236,13 @@ const ReleaseDetailsPage = () => {
1240
1236
  {
1241
1237
  toggleEditReleaseModal,
1242
1238
  toggleWarningSubmit,
1243
- children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.ContentLayout, { children: /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.LoadingIndicatorPage, {}) })
1239
+ children: /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Page.Loading, {})
1244
1240
  }
1245
1241
  );
1246
1242
  }
1243
+ if (!releaseId) {
1244
+ return /* @__PURE__ */ jsxRuntime.jsx(reactRouterDom.Navigate, { to: ".." });
1245
+ }
1247
1246
  const releaseData = isSuccessDetails && data?.data || null;
1248
1247
  const title = releaseData?.name || "";
1249
1248
  const timezone = releaseData?.timezone ?? null;
@@ -1283,7 +1282,7 @@ const ReleaseDetailsPage = () => {
1283
1282
  id: releaseId
1284
1283
  });
1285
1284
  if ("data" in response) {
1286
- replace("/plugins/content-releases");
1285
+ navigate("..");
1287
1286
  } else if (index.isAxiosError(response.error)) {
1288
1287
  toggleNotification({
1289
1288
  type: "warning",
@@ -1302,7 +1301,7 @@ const ReleaseDetailsPage = () => {
1302
1301
  toggleEditReleaseModal,
1303
1302
  toggleWarningSubmit,
1304
1303
  children: [
1305
- /* @__PURE__ */ jsxRuntime.jsx(ReleaseDetailsBody, {}),
1304
+ /* @__PURE__ */ jsxRuntime.jsx(ReleaseDetailsBody, { releaseId }),
1306
1305
  releaseModalShown && /* @__PURE__ */ jsxRuntime.jsx(
1307
1306
  ReleaseModal,
1308
1307
  {
@@ -1320,16 +1319,15 @@ const ReleaseDetailsPage = () => {
1320
1319
  }
1321
1320
  ),
1322
1321
  /* @__PURE__ */ jsxRuntime.jsx(
1323
- helperPlugin.ConfirmDialog,
1322
+ strapiAdmin.ConfirmDialog,
1324
1323
  {
1325
- bodyText: {
1324
+ isOpen: showWarningSubmit,
1325
+ onClose: toggleWarningSubmit,
1326
+ onConfirm: handleDeleteRelease,
1327
+ children: formatMessage({
1326
1328
  id: "content-releases.dialog.confirmation-message",
1327
1329
  defaultMessage: "Are you sure you want to delete this release?"
1328
- },
1329
- isOpen: showWarningSubmit,
1330
- isConfirmButtonLoading: isDeletingRelease,
1331
- onToggleDialog: toggleWarningSubmit,
1332
- onConfirm: handleDeleteRelease
1330
+ })
1333
1331
  }
1334
1332
  )
1335
1333
  ]
@@ -1337,10 +1335,10 @@ const ReleaseDetailsPage = () => {
1337
1335
  );
1338
1336
  };
1339
1337
  const App = () => {
1340
- return /* @__PURE__ */ jsxRuntime.jsx(helperPlugin.CheckPagePermissions, { permissions: index.PERMISSIONS.main, children: /* @__PURE__ */ jsxRuntime.jsxs(reactRouterDom.Switch, { children: [
1341
- /* @__PURE__ */ jsxRuntime.jsx(reactRouterDom.Route, { exact: true, path: `/plugins/${index.pluginId}`, component: ReleasesPage }),
1342
- /* @__PURE__ */ jsxRuntime.jsx(reactRouterDom.Route, { exact: true, path: `/plugins/${index.pluginId}/:releaseId`, component: ReleaseDetailsPage })
1338
+ return /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Page.Protect, { permissions: index.PERMISSIONS.main, children: /* @__PURE__ */ jsxRuntime.jsxs(reactRouterDom.Routes, { children: [
1339
+ /* @__PURE__ */ jsxRuntime.jsx(reactRouterDom.Route, { index: true, element: /* @__PURE__ */ jsxRuntime.jsx(ReleasesPage, {}) }),
1340
+ /* @__PURE__ */ jsxRuntime.jsx(reactRouterDom.Route, { path: ":releaseId", element: /* @__PURE__ */ jsxRuntime.jsx(ReleaseDetailsPage, {}) })
1343
1341
  ] }) });
1344
1342
  };
1345
1343
  exports.App = App;
1346
- //# sourceMappingURL=App-p8aKBitd.js.map
1344
+ //# sourceMappingURL=App-vS3MaAL8.js.map