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

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 (105) hide show
  1. package/dist/_chunks/{App-PQlYzNfb.mjs → App-XbK-TdJn.mjs} +258 -283
  2. package/dist/_chunks/App-XbK-TdJn.mjs.map +1 -0
  3. package/dist/_chunks/{App-lzeJz92X.js → App-ftICpqDz.js} +256 -281
  4. package/dist/_chunks/App-ftICpqDz.js.map +1 -0
  5. package/dist/_chunks/{PurchaseContentReleases-Clm0iACO.mjs → PurchaseContentReleases-3tRbmbY3.mjs} +2 -2
  6. package/dist/_chunks/PurchaseContentReleases-3tRbmbY3.mjs.map +1 -0
  7. package/dist/_chunks/{PurchaseContentReleases-YhAPgpG9.js → PurchaseContentReleases-bpIYXOfu.js} +2 -2
  8. package/dist/_chunks/PurchaseContentReleases-bpIYXOfu.js.map +1 -0
  9. package/dist/_chunks/{en-gcJJ5htG.js → en-4CUzVH2g.js} +2 -3
  10. package/dist/_chunks/en-4CUzVH2g.js.map +1 -0
  11. package/dist/_chunks/{en-WuuhP6Bn.mjs → en-pOJ6G5fC.mjs} +2 -3
  12. package/dist/_chunks/en-pOJ6G5fC.mjs.map +1 -0
  13. package/dist/_chunks/{index--4AgLDzb.mjs → index-8LrruHqK.mjs} +33 -27
  14. package/dist/_chunks/index-8LrruHqK.mjs.map +1 -0
  15. package/dist/_chunks/{index-Nf1JfI-m.js → index-RYVGXFeL.js} +29 -23
  16. package/dist/_chunks/index-RYVGXFeL.js.map +1 -0
  17. package/dist/admin/index.js +1 -1
  18. package/dist/admin/index.mjs +1 -1
  19. package/dist/server/index.js +344 -203
  20. package/dist/server/index.js.map +1 -1
  21. package/dist/server/index.mjs +344 -204
  22. package/dist/server/index.mjs.map +1 -1
  23. package/package.json +21 -14
  24. package/dist/_chunks/App-PQlYzNfb.mjs.map +0 -1
  25. package/dist/_chunks/App-lzeJz92X.js.map +0 -1
  26. package/dist/_chunks/PurchaseContentReleases-Clm0iACO.mjs.map +0 -1
  27. package/dist/_chunks/PurchaseContentReleases-YhAPgpG9.js.map +0 -1
  28. package/dist/_chunks/en-WuuhP6Bn.mjs.map +0 -1
  29. package/dist/_chunks/en-gcJJ5htG.js.map +0 -1
  30. package/dist/_chunks/index--4AgLDzb.mjs.map +0 -1
  31. package/dist/_chunks/index-Nf1JfI-m.js.map +0 -1
  32. package/dist/admin/src/components/CMReleasesContainer.d.ts +0 -1
  33. package/dist/admin/src/components/RelativeTime.d.ts +0 -28
  34. package/dist/admin/src/components/ReleaseActionMenu.d.ts +0 -26
  35. package/dist/admin/src/components/ReleaseActionOptions.d.ts +0 -9
  36. package/dist/admin/src/components/ReleaseModal.d.ts +0 -16
  37. package/dist/admin/src/constants.d.ts +0 -58
  38. package/dist/admin/src/index.d.ts +0 -3
  39. package/dist/admin/src/pages/App.d.ts +0 -1
  40. package/dist/admin/src/pages/PurchaseContentReleases.d.ts +0 -2
  41. package/dist/admin/src/pages/ReleaseDetailsPage.d.ts +0 -2
  42. package/dist/admin/src/pages/ReleasesPage.d.ts +0 -8
  43. package/dist/admin/src/pages/tests/mockReleaseDetailsPageData.d.ts +0 -181
  44. package/dist/admin/src/pages/tests/mockReleasesPageData.d.ts +0 -39
  45. package/dist/admin/src/pluginId.d.ts +0 -1
  46. package/dist/admin/src/services/axios.d.ts +0 -29
  47. package/dist/admin/src/services/release.d.ts +0 -369
  48. package/dist/admin/src/store/hooks.d.ts +0 -7
  49. package/dist/admin/src/utils/time.d.ts +0 -1
  50. package/dist/server/src/bootstrap.d.ts +0 -5
  51. package/dist/server/src/bootstrap.d.ts.map +0 -1
  52. package/dist/server/src/constants.d.ts +0 -12
  53. package/dist/server/src/constants.d.ts.map +0 -1
  54. package/dist/server/src/content-types/index.d.ts +0 -99
  55. package/dist/server/src/content-types/index.d.ts.map +0 -1
  56. package/dist/server/src/content-types/release/index.d.ts +0 -48
  57. package/dist/server/src/content-types/release/index.d.ts.map +0 -1
  58. package/dist/server/src/content-types/release/schema.d.ts +0 -47
  59. package/dist/server/src/content-types/release/schema.d.ts.map +0 -1
  60. package/dist/server/src/content-types/release-action/index.d.ts +0 -50
  61. package/dist/server/src/content-types/release-action/index.d.ts.map +0 -1
  62. package/dist/server/src/content-types/release-action/schema.d.ts +0 -49
  63. package/dist/server/src/content-types/release-action/schema.d.ts.map +0 -1
  64. package/dist/server/src/controllers/index.d.ts +0 -18
  65. package/dist/server/src/controllers/index.d.ts.map +0 -1
  66. package/dist/server/src/controllers/release-action.d.ts +0 -9
  67. package/dist/server/src/controllers/release-action.d.ts.map +0 -1
  68. package/dist/server/src/controllers/release.d.ts +0 -11
  69. package/dist/server/src/controllers/release.d.ts.map +0 -1
  70. package/dist/server/src/controllers/validation/release-action.d.ts +0 -3
  71. package/dist/server/src/controllers/validation/release-action.d.ts.map +0 -1
  72. package/dist/server/src/controllers/validation/release.d.ts +0 -2
  73. package/dist/server/src/controllers/validation/release.d.ts.map +0 -1
  74. package/dist/server/src/destroy.d.ts +0 -5
  75. package/dist/server/src/destroy.d.ts.map +0 -1
  76. package/dist/server/src/index.d.ts +0 -2092
  77. package/dist/server/src/index.d.ts.map +0 -1
  78. package/dist/server/src/migrations/index.d.ts +0 -10
  79. package/dist/server/src/migrations/index.d.ts.map +0 -1
  80. package/dist/server/src/register.d.ts +0 -5
  81. package/dist/server/src/register.d.ts.map +0 -1
  82. package/dist/server/src/routes/index.d.ts +0 -35
  83. package/dist/server/src/routes/index.d.ts.map +0 -1
  84. package/dist/server/src/routes/release-action.d.ts +0 -18
  85. package/dist/server/src/routes/release-action.d.ts.map +0 -1
  86. package/dist/server/src/routes/release.d.ts +0 -18
  87. package/dist/server/src/routes/release.d.ts.map +0 -1
  88. package/dist/server/src/services/index.d.ts +0 -1826
  89. package/dist/server/src/services/index.d.ts.map +0 -1
  90. package/dist/server/src/services/release.d.ts +0 -66
  91. package/dist/server/src/services/release.d.ts.map +0 -1
  92. package/dist/server/src/services/scheduling.d.ts +0 -18
  93. package/dist/server/src/services/scheduling.d.ts.map +0 -1
  94. package/dist/server/src/services/validation.d.ts +0 -14
  95. package/dist/server/src/services/validation.d.ts.map +0 -1
  96. package/dist/server/src/utils/index.d.ts +0 -14
  97. package/dist/server/src/utils/index.d.ts.map +0 -1
  98. package/dist/shared/contracts/release-actions.d.ts +0 -105
  99. package/dist/shared/contracts/release-actions.d.ts.map +0 -1
  100. package/dist/shared/contracts/releases.d.ts +0 -166
  101. package/dist/shared/contracts/releases.d.ts.map +0 -1
  102. package/dist/shared/types.d.ts +0 -24
  103. package/dist/shared/types.d.ts.map +0 -1
  104. package/dist/shared/validation-schemas.d.ts +0 -2
  105. package/dist/shared/validation-schemas.d.ts.map +0 -1
@@ -1,53 +1,23 @@
1
- import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
- import { useLicenseLimits, Page, Pagination, BackButton, Table, unstable_useDocument } from "@strapi/admin/strapi-admin";
3
- import { useLocation, useNavigate, useParams, Navigate, Link as Link$1, Routes, Route } from "react-router-dom";
4
- import { g as getTimezoneOffset, p as pluginId, u as useGetReleasesQuery, a as useCreateReleaseMutation, P as PERMISSIONS, i as isAxiosError, b as useGetReleaseQuery, c as useUpdateReleaseMutation, d as useDeleteReleaseMutation, e as usePublishReleaseMutation, f as useTypedDispatch, h as useGetReleaseActionsQuery, j as useUpdateReleaseActionMutation, R as ReleaseActionOptions, k as ReleaseActionMenu, r as releaseApi } from "./index--4AgLDzb.mjs";
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-8LrruHqK.mjs";
5
5
  import * as React from "react";
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";
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";
7
8
  import { Link, Menu, LinkButton } from "@strapi/design-system/v2";
8
- import { useNotification, useAPIErrorHandler, useQueryParams, useTracking, CheckPermissions, ConfirmDialog, useRBAC } from "@strapi/helper-plugin";
9
- import { Plus, EmptyDocuments, Pencil, Trash, More, CrossCircle, CheckCircle } from "@strapi/icons";
9
+ import { Plus, EmptyDocuments, Pencil, Trash, ArrowLeft, 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 { intervalToDuration, isPast, formatISO, parse } from "date-fns";
14
+ import { formatISO } from "date-fns";
15
15
  import { Formik, Form, useFormikContext } from "formik";
16
16
  import * as yup from "yup";
17
17
  import "@reduxjs/toolkit/query";
18
18
  import "axios";
19
19
  import "@reduxjs/toolkit/query/react";
20
20
  import "react-redux";
21
- const intervals = ["years", "months", "days", "hours", "minutes", "seconds"];
22
- const RelativeTime = React.forwardRef(
23
- ({ timestamp, customIntervals = [], ...restProps }, forwardedRef) => {
24
- const { formatRelativeTime, formatDate, formatTime } = useIntl();
25
- const interval = intervalToDuration({
26
- start: timestamp,
27
- end: Date.now()
28
- // see https://github.com/date-fns/date-fns/issues/2891 – No idea why it's all partial it returns it every time.
29
- });
30
- const unit = intervals.find((intervalUnit) => {
31
- return interval[intervalUnit] > 0 && Object.keys(interval).includes(intervalUnit);
32
- });
33
- const relativeTime = isPast(timestamp) ? -interval[unit] : interval[unit];
34
- const customInterval = customIntervals.find(
35
- (custom) => interval[custom.unit] < custom.threshold
36
- );
37
- const displayText = customInterval ? customInterval.text : formatRelativeTime(relativeTime, unit, { numeric: "auto" });
38
- return /* @__PURE__ */ jsx(
39
- "time",
40
- {
41
- ref: forwardedRef,
42
- dateTime: timestamp.toISOString(),
43
- role: "time",
44
- title: `${formatDate(timestamp)} ${formatTime(timestamp)}`,
45
- ...restProps,
46
- children: displayText
47
- }
48
- );
49
- }
50
- );
51
21
  const RELEASE_SCHEMA = yup.object().shape({
52
22
  name: yup.string().trim().required(),
53
23
  scheduledAt: yup.string().nullable(),
@@ -77,7 +47,6 @@ const ReleaseModal = ({
77
47
  const { formatMessage } = useIntl();
78
48
  const { pathname } = useLocation();
79
49
  const isCreatingRelease = pathname === `/plugins/${pluginId}`;
80
- const IsSchedulingEnabled = window.strapi.future.isEnabled("contentReleasesScheduling");
81
50
  const { timezoneList, systemTimezone = { value: "UTC+00:00-Africa/Abidjan " } } = getTimezones(
82
51
  initialValues.scheduledAt ? new Date(initialValues.scheduledAt) : /* @__PURE__ */ new Date()
83
52
  );
@@ -85,13 +54,12 @@ const ReleaseModal = ({
85
54
  const { date, time, timezone } = values;
86
55
  if (!date || !time || !timezone)
87
56
  return null;
88
- const formattedDate = parse(time, "HH:mm", new Date(date));
89
- const timezoneWithoutOffset = timezone.split("_")[1];
90
- return zonedTimeToUtc(formattedDate, timezoneWithoutOffset);
57
+ const timezoneWithoutOffset = timezone.split("&")[1];
58
+ return zonedTimeToUtc(`${date} ${time}`, timezoneWithoutOffset);
91
59
  };
92
60
  const getTimezoneWithOffset = () => {
93
61
  const currentTimezone = timezoneList.find(
94
- (timezone) => timezone.value.split("_")[1] === initialValues.timezone
62
+ (timezone) => timezone.value.split("&")[1] === initialValues.timezone
95
63
  );
96
64
  return currentTimezone?.value || systemTimezone.value;
97
65
  };
@@ -109,7 +77,7 @@ const ReleaseModal = ({
109
77
  onSubmit: (values) => {
110
78
  handleSubmit({
111
79
  ...values,
112
- timezone: values.timezone ? values.timezone.split("_")[1] : null,
80
+ timezone: values.timezone ? values.timezone.split("&")[1] : null,
113
81
  scheduledAt: values.isScheduled ? getScheduledTimestamp(values) : null
114
82
  });
115
83
  },
@@ -135,92 +103,88 @@ const ReleaseModal = ({
135
103
  required: true
136
104
  }
137
105
  ),
138
- IsSchedulingEnabled && /* @__PURE__ */ jsxs(Fragment, { children: [
139
- /* @__PURE__ */ jsx(Box, { width: "max-content", children: /* @__PURE__ */ jsx(
140
- Checkbox,
141
- {
142
- name: "isScheduled",
143
- value: values.isScheduled,
144
- onChange: (event) => {
145
- setFieldValue("isScheduled", event.target.checked);
146
- if (!event.target.checked) {
106
+ /* @__PURE__ */ jsx(Box, { width: "max-content", children: /* @__PURE__ */ jsx(
107
+ Checkbox,
108
+ {
109
+ name: "isScheduled",
110
+ value: values.isScheduled,
111
+ onChange: (event) => {
112
+ setFieldValue("isScheduled", event.target.checked);
113
+ if (!event.target.checked) {
114
+ setFieldValue("date", null);
115
+ setFieldValue("time", "");
116
+ setFieldValue("timezone", null);
117
+ } else {
118
+ setFieldValue("date", initialValues.date);
119
+ setFieldValue("time", initialValues.time);
120
+ setFieldValue("timezone", initialValues.timezone ?? systemTimezone?.value);
121
+ }
122
+ },
123
+ children: /* @__PURE__ */ jsx(
124
+ Typography,
125
+ {
126
+ textColor: values.isScheduled ? "primary600" : "neutral800",
127
+ fontWeight: values.isScheduled ? "semiBold" : "regular",
128
+ children: formatMessage({
129
+ id: "modal.form.input.label.schedule-release",
130
+ defaultMessage: "Schedule release"
131
+ })
132
+ }
133
+ )
134
+ }
135
+ ) }),
136
+ values.isScheduled && /* @__PURE__ */ jsxs(Fragment, { children: [
137
+ /* @__PURE__ */ jsxs(Flex, { gap: 4, alignItems: "start", children: [
138
+ /* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsx(
139
+ DatePicker,
140
+ {
141
+ label: formatMessage({
142
+ id: "content-releases.modal.form.input.label.date",
143
+ defaultMessage: "Date"
144
+ }),
145
+ name: "date",
146
+ error: errors.date,
147
+ onChange: (date) => {
148
+ const isoFormatDate = date ? formatISO(date, { representation: "date" }) : null;
149
+ setFieldValue("date", isoFormatDate);
150
+ },
151
+ clearLabel: formatMessage({
152
+ id: "content-releases.modal.form.input.clearLabel",
153
+ defaultMessage: "Clear"
154
+ }),
155
+ onClear: () => {
147
156
  setFieldValue("date", null);
157
+ },
158
+ selectedDate: values.date || void 0,
159
+ required: true,
160
+ minDate: utcToZonedTime(/* @__PURE__ */ new Date(), values.timezone.split("&")[1])
161
+ }
162
+ ) }),
163
+ /* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsx(
164
+ TimePicker,
165
+ {
166
+ label: formatMessage({
167
+ id: "content-releases.modal.form.input.label.time",
168
+ defaultMessage: "Time"
169
+ }),
170
+ name: "time",
171
+ error: errors.time,
172
+ onChange: (time) => {
173
+ setFieldValue("time", time);
174
+ },
175
+ clearLabel: formatMessage({
176
+ id: "content-releases.modal.form.input.clearLabel",
177
+ defaultMessage: "Clear"
178
+ }),
179
+ onClear: () => {
148
180
  setFieldValue("time", "");
149
- setFieldValue("timezone", null);
150
- } else {
151
- setFieldValue("date", initialValues.date);
152
- setFieldValue("time", initialValues.time);
153
- setFieldValue(
154
- "timezone",
155
- initialValues.timezone ?? systemTimezone?.value
156
- );
157
- }
158
- },
159
- children: /* @__PURE__ */ jsx(
160
- Typography,
161
- {
162
- textColor: values.isScheduled ? "primary600" : "neutral800",
163
- fontWeight: values.isScheduled ? "semiBold" : "regular",
164
- children: formatMessage({
165
- id: "modal.form.input.label.schedule-release",
166
- defaultMessage: "Schedule release"
167
- })
168
- }
169
- )
170
- }
171
- ) }),
172
- values.isScheduled && /* @__PURE__ */ jsxs(Fragment, { children: [
173
- /* @__PURE__ */ jsxs(Flex, { gap: 4, alignItems: "start", children: [
174
- /* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsx(
175
- DatePicker,
176
- {
177
- label: formatMessage({
178
- id: "content-releases.modal.form.input.label.date",
179
- defaultMessage: "Date"
180
- }),
181
- name: "date",
182
- error: errors.date,
183
- onChange: (date) => {
184
- const isoFormatDate = date ? formatISO(date, { representation: "date" }) : null;
185
- setFieldValue("date", isoFormatDate);
186
- },
187
- clearLabel: formatMessage({
188
- id: "content-releases.modal.form.input.clearLabel",
189
- defaultMessage: "Clear"
190
- }),
191
- onClear: () => {
192
- setFieldValue("date", null);
193
- },
194
- selectedDate: values.date || void 0,
195
- required: true
196
- }
197
- ) }),
198
- /* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsx(
199
- TimePicker,
200
- {
201
- label: formatMessage({
202
- id: "content-releases.modal.form.input.label.time",
203
- defaultMessage: "Time"
204
- }),
205
- name: "time",
206
- error: errors.time,
207
- onChange: (time) => {
208
- setFieldValue("time", time);
209
- },
210
- clearLabel: formatMessage({
211
- id: "content-releases.modal.form.input.clearLabel",
212
- defaultMessage: "Clear"
213
- }),
214
- onClear: () => {
215
- setFieldValue("time", "");
216
- },
217
- value: values.time || void 0,
218
- required: true
219
- }
220
- ) })
221
- ] }),
222
- /* @__PURE__ */ jsx(TimezoneComponent, { timezoneOptions: timezoneList })
223
- ] })
181
+ },
182
+ value: values.time || void 0,
183
+ required: true
184
+ }
185
+ ) })
186
+ ] }),
187
+ /* @__PURE__ */ jsx(TimezoneComponent, { timezoneOptions: timezoneList })
224
188
  ] })
225
189
  ] }) }),
226
190
  /* @__PURE__ */ jsx(
@@ -244,10 +208,10 @@ const ReleaseModal = ({
244
208
  const getTimezones = (selectedDate) => {
245
209
  const timezoneList = Intl.supportedValuesOf("timeZone").map((timezone) => {
246
210
  const utcOffset = getTimezoneOffset(timezone, selectedDate);
247
- return { offset: utcOffset, value: `${utcOffset}_${timezone}` };
211
+ return { offset: utcOffset, value: `${utcOffset}&${timezone}` };
248
212
  });
249
213
  const systemTimezone = timezoneList.find(
250
- (timezone) => timezone.value.split("_")[1] === Intl.DateTimeFormat().resolvedOptions().timeZone
214
+ (timezone) => timezone.value.split("&")[1] === Intl.DateTimeFormat().resolvedOptions().timeZone
251
215
  );
252
216
  return { timezoneList, systemTimezone };
253
217
  };
@@ -259,7 +223,7 @@ const TimezoneComponent = ({ timezoneOptions }) => {
259
223
  if (values.date) {
260
224
  const { timezoneList: timezoneList2 } = getTimezones(new Date(values.date));
261
225
  setTimezoneList(timezoneList2);
262
- const updatedTimezone = values.timezone && timezoneList2.find((tz) => tz.value.split("_")[1] === values.timezone.split("_")[1]);
226
+ const updatedTimezone = values.timezone && timezoneList2.find((tz) => tz.value.split("&")[1] === values.timezone.split("&")[1]);
263
227
  if (updatedTimezone) {
264
228
  setFieldValue("timezone", updatedTimezone.value);
265
229
  }
@@ -272,9 +236,10 @@ const TimezoneComponent = ({ timezoneOptions }) => {
272
236
  id: "content-releases.modal.form.input.label.timezone",
273
237
  defaultMessage: "Timezone"
274
238
  }),
239
+ autocomplete: { type: "list", filter: "contains" },
275
240
  name: "timezone",
276
241
  value: values.timezone || void 0,
277
- textValue: values.timezone ? values.timezone.replace("_", " ") : void 0,
242
+ textValue: values.timezone ? values.timezone.replace(/&/, " ") : void 0,
278
243
  onChange: (timezone) => {
279
244
  setFieldValue("timezone", timezone);
280
245
  },
@@ -286,7 +251,7 @@ const TimezoneComponent = ({ timezoneOptions }) => {
286
251
  },
287
252
  error: errors.timezone,
288
253
  required: true,
289
- children: timezoneList.map((timezone) => /* @__PURE__ */ jsx(ComboboxOption, { value: timezone.value, children: timezone.value.replace("_", " ") }, timezone.value))
254
+ children: timezoneList.map((timezone) => /* @__PURE__ */ jsx(ComboboxOption, { value: timezone.value, children: timezone.value.replace(/&/, " ") }, timezone.value))
290
255
  }
291
256
  );
292
257
  };
@@ -323,9 +288,8 @@ const getBadgeProps = (status) => {
323
288
  };
324
289
  const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
325
290
  const { formatMessage } = useIntl();
326
- const IsSchedulingEnabled = window.strapi.future.isEnabled("contentReleasesScheduling");
327
291
  if (isError) {
328
- return /* @__PURE__ */ jsx(Page.Error, {});
292
+ return /* @__PURE__ */ jsx(AnErrorOccurred, {});
329
293
  }
330
294
  if (releases?.length === 0) {
331
295
  return /* @__PURE__ */ jsx(
@@ -344,7 +308,7 @@ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
344
308
  }
345
309
  );
346
310
  }
347
- 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(
311
+ 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(
348
312
  Flex,
349
313
  {
350
314
  direction: "column",
@@ -360,16 +324,10 @@ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
360
324
  children: [
361
325
  /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "start", gap: 1, children: [
362
326
  /* @__PURE__ */ jsx(Typography, { as: "h3", variant: "delta", fontWeight: "bold", children: name }),
363
- /* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: IsSchedulingEnabled ? scheduledAt ? /* @__PURE__ */ jsx(CapitalizeRelativeTime, { timestamp: new Date(scheduledAt) }) : formatMessage({
327
+ /* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: scheduledAt ? /* @__PURE__ */ jsx(CapitalizeRelativeTime, { timestamp: new Date(scheduledAt) }) : formatMessage({
364
328
  id: "content-releases.pages.Releases.not-scheduled",
365
329
  defaultMessage: "Not scheduled"
366
- }) : formatMessage(
367
- {
368
- id: "content-releases.page.Releases.release-item.entries",
369
- defaultMessage: "{number, plural, =0 {No entries} one {# entry} other {# entries}}"
370
- },
371
- { number: actions.meta.count }
372
- ) })
330
+ }) })
373
331
  ] }),
374
332
  /* @__PURE__ */ jsx(Badge, { ...getBadgeProps(status), children: status })
375
333
  ]
@@ -388,8 +346,7 @@ const INITIAL_FORM_VALUES = {
388
346
  name: "",
389
347
  date: null,
390
348
  time: "",
391
- // Remove future flag check after Scheduling Beta release and replace with true as creating new release should include scheduling by default
392
- isScheduled: window.strapi.future.isEnabled("contentReleasesScheduling"),
349
+ isScheduled: true,
393
350
  scheduledAt: null,
394
351
  timezone: null
395
352
  };
@@ -399,7 +356,7 @@ const ReleasesPage = () => {
399
356
  const [releaseModalShown, setReleaseModalShown] = React.useState(false);
400
357
  const toggleNotification = useNotification();
401
358
  const { formatMessage } = useIntl();
402
- const navigate = useNavigate();
359
+ const { push, replace } = useHistory();
403
360
  const { formatAPIError } = useAPIErrorHandler();
404
361
  const [{ query }, setQuery] = useQueryParams();
405
362
  const response = useGetReleasesQuery(query);
@@ -423,9 +380,9 @@ const ReleasesPage = () => {
423
380
  defaultMessage: "Please try again or open another release."
424
381
  })
425
382
  });
426
- navigate("", { replace: true, state: null });
383
+ replace({ state: null });
427
384
  }
428
- }, [formatMessage, location?.state?.errors, navigate, toggleNotification]);
385
+ }, [formatMessage, location?.state?.errors, replace, toggleNotification]);
429
386
  React.useEffect(() => {
430
387
  if (tabRef.current) {
431
388
  tabRef.current._handlers.setSelectedTabIndex(activeTabIndex);
@@ -435,7 +392,7 @@ const ReleasesPage = () => {
435
392
  setReleaseModalShown((prev) => !prev);
436
393
  };
437
394
  if (isLoading) {
438
- return /* @__PURE__ */ jsx(Page.Loading, {});
395
+ return /* @__PURE__ */ jsx(Main, { "aria-busy": isLoading, children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) });
439
396
  }
440
397
  const totalPendingReleases = isSuccess && response.currentData?.meta?.pendingReleasesCount || 0;
441
398
  const hasReachedMaximumPendingReleases = totalPendingReleases >= maximumReleases;
@@ -466,7 +423,7 @@ const ReleasesPage = () => {
466
423
  })
467
424
  });
468
425
  trackUsage("didCreateRelease");
469
- navigate(response2.data.data.id.toString());
426
+ push(`/plugins/content-releases/${response2.data.data.id}`);
470
427
  } else if (isAxiosError(response2.error)) {
471
428
  toggleNotification({
472
429
  type: "warning",
@@ -581,17 +538,23 @@ const ReleasesPage = () => {
581
538
  ]
582
539
  }
583
540
  ),
584
- /* @__PURE__ */ jsxs(
585
- Pagination.Root,
586
- {
587
- ...response?.currentData?.meta?.pagination,
588
- defaultPageSize: response?.currentData?.meta?.pagination?.pageSize,
589
- children: [
590
- /* @__PURE__ */ jsx(Pagination.PageSize, { options: ["8", "16", "32", "64"] }),
591
- /* @__PURE__ */ jsx(Pagination.Links, {})
592
- ]
593
- }
594
- )
541
+ response.currentData?.meta?.pagination?.total ? /* @__PURE__ */ jsxs(Flex, { paddingTop: 4, alignItems: "flex-end", justifyContent: "space-between", children: [
542
+ /* @__PURE__ */ jsx(
543
+ PageSizeURLQuery,
544
+ {
545
+ options: ["8", "16", "32", "64"],
546
+ defaultValue: response?.currentData?.meta?.pagination?.pageSize.toString()
547
+ }
548
+ ),
549
+ /* @__PURE__ */ jsx(
550
+ PaginationURLQuery,
551
+ {
552
+ pagination: {
553
+ pageCount: response?.currentData?.meta?.pagination?.pageCount || 0
554
+ }
555
+ }
556
+ )
557
+ ] }) : null
595
558
  ] }) }),
596
559
  releaseModalShown && /* @__PURE__ */ jsx(
597
560
  ReleaseModal,
@@ -639,18 +602,14 @@ const TrashIcon = styled(Trash)`
639
602
  const TypographyMaxWidth = styled(Typography)`
640
603
  max-width: 300px;
641
604
  `;
642
- const EntryValidationText = ({ action, schema, entry }) => {
605
+ const EntryValidationText = ({ action, schema, components, entry }) => {
643
606
  const { formatMessage } = useIntl();
644
- const { validate } = unstable_useDocument(
645
- {
646
- collectionType: schema?.kind ?? "",
647
- model: schema?.uid ?? ""
648
- },
649
- {
650
- skip: !schema
651
- }
652
- );
653
- const errors = validate(entry) ?? {};
607
+ const { validate } = unstable_useDocument();
608
+ const { errors } = validate(entry, {
609
+ contentType: schema,
610
+ components,
611
+ isCreatingEntry: false
612
+ });
654
613
  if (Object.keys(errors).length > 0) {
655
614
  const validationErrorsMessages = Object.entries(errors).map(
656
615
  ([key, value]) => formatMessage(
@@ -698,12 +657,7 @@ const ReleaseDetailsLayout = ({
698
657
  isLoading: isLoadingDetails,
699
658
  isError,
700
659
  error
701
- } = useGetReleaseQuery(
702
- { id: releaseId },
703
- {
704
- skip: !releaseId
705
- }
706
- );
660
+ } = useGetReleaseQuery({ id: releaseId });
707
661
  const [publishRelease, { isLoading: isPublishing }] = usePublishReleaseMutation();
708
662
  const toggleNotification = useNotification();
709
663
  const { formatAPIError } = useAPIErrorHandler();
@@ -713,8 +667,8 @@ const ReleaseDetailsLayout = ({
713
667
  const dispatch = useTypedDispatch();
714
668
  const { trackUsage } = useTracking();
715
669
  const release = data?.data;
716
- const handlePublishRelease = (id) => async () => {
717
- const response = await publishRelease({ id });
670
+ const handlePublishRelease = async () => {
671
+ const response = await publishRelease({ id: releaseId });
718
672
  if ("data" in response) {
719
673
  toggleNotification({
720
674
  type: "success",
@@ -742,7 +696,12 @@ const ReleaseDetailsLayout = ({
742
696
  }
743
697
  };
744
698
  const handleRefresh = () => {
745
- dispatch(releaseApi.util.invalidateTags([{ type: "ReleaseAction", id: "LIST" }]));
699
+ dispatch(
700
+ releaseApi.util.invalidateTags([
701
+ { type: "ReleaseAction", id: "LIST" },
702
+ { type: "Release", id: releaseId }
703
+ ])
704
+ );
746
705
  };
747
706
  const getCreatedByUser = () => {
748
707
  if (!release?.createdBy) {
@@ -757,26 +716,27 @@ const ReleaseDetailsLayout = ({
757
716
  return release.createdBy.email;
758
717
  };
759
718
  if (isLoadingDetails) {
760
- return /* @__PURE__ */ jsx(Page.Loading, {});
719
+ return /* @__PURE__ */ jsx(Main, { "aria-busy": isLoadingDetails, children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) });
761
720
  }
762
721
  if (isError || !release) {
763
722
  return /* @__PURE__ */ jsx(
764
- Navigate,
723
+ Redirect,
765
724
  {
766
- to: "..",
767
- state: {
768
- errors: [
769
- {
770
- code: error?.code
771
- }
772
- ]
725
+ to: {
726
+ pathname: "/plugins/content-releases",
727
+ state: {
728
+ errors: [
729
+ {
730
+ code: error?.code
731
+ }
732
+ ]
733
+ }
773
734
  }
774
735
  }
775
736
  );
776
737
  }
777
738
  const totalEntries = release.actions.meta.count || 0;
778
739
  const hasCreatedByUser = Boolean(getCreatedByUser());
779
- const IsSchedulingEnabled = window.strapi.future.isEnabled("contentReleasesScheduling");
780
740
  const isScheduled = release.scheduledAt && release.timezone;
781
741
  const numberOfEntriesText = formatMessage(
782
742
  {
@@ -811,10 +771,13 @@ const ReleaseDetailsLayout = ({
811
771
  {
812
772
  title: release.name,
813
773
  subtitle: /* @__PURE__ */ jsxs(Flex, { gap: 2, lineHeight: 6, children: [
814
- /* @__PURE__ */ jsx(Typography, { textColor: "neutral600", variant: "epsilon", children: numberOfEntriesText + (IsSchedulingEnabled && isScheduled ? ` - ${scheduledText}` : "") }),
774
+ /* @__PURE__ */ jsx(Typography, { textColor: "neutral600", variant: "epsilon", children: numberOfEntriesText + (isScheduled ? ` - ${scheduledText}` : "") }),
815
775
  /* @__PURE__ */ jsx(Badge, { ...getBadgeProps(release.status), children: release.status })
816
776
  ] }),
817
- navigationAction: /* @__PURE__ */ jsx(BackButton, {}),
777
+ navigationAction: /* @__PURE__ */ jsx(Link$1, { startIcon: /* @__PURE__ */ jsx(ArrowLeft, {}), to: "/plugins/content-releases", children: formatMessage({
778
+ id: "global.back",
779
+ defaultMessage: "Back"
780
+ }) }),
818
781
  primaryAction: !release.releasedAt && /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
819
782
  /* @__PURE__ */ jsxs(Menu.Root, { children: [
820
783
  /* @__PURE__ */ jsx(
@@ -903,7 +866,7 @@ const ReleaseDetailsLayout = ({
903
866
  {
904
867
  size: "S",
905
868
  variant: "default",
906
- onClick: handlePublishRelease(release.id.toString()),
869
+ onClick: handlePublishRelease,
907
870
  loading: isPublishing,
908
871
  disabled: release.actions.meta.count === 0,
909
872
  children: formatMessage({
@@ -937,8 +900,9 @@ const getGroupByOptionLabel = (value) => {
937
900
  defaultMessage: "Content-Types"
938
901
  };
939
902
  };
940
- const ReleaseDetailsBody = ({ releaseId }) => {
903
+ const ReleaseDetailsBody = () => {
941
904
  const { formatMessage } = useIntl();
905
+ const { releaseId } = useParams();
942
906
  const [{ query }, setQuery] = useQueryParams();
943
907
  const toggleNotification = useNotification();
944
908
  const { formatAPIError } = useAPIErrorHandler();
@@ -993,7 +957,7 @@ const ReleaseDetailsBody = ({ releaseId }) => {
993
957
  }
994
958
  };
995
959
  if (isLoading || isReleaseLoading) {
996
- return /* @__PURE__ */ jsx(Page.Loading, {});
960
+ return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) });
997
961
  }
998
962
  const releaseActions = data?.data;
999
963
  const releaseMeta = data?.meta;
@@ -1012,26 +976,32 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1012
976
  });
1013
977
  }
1014
978
  return /* @__PURE__ */ jsx(
1015
- Navigate,
979
+ Redirect,
1016
980
  {
1017
- to: "..",
1018
- state: {
1019
- errors: errorsArray
981
+ to: {
982
+ pathname: "/plugins/content-releases",
983
+ state: {
984
+ errors: errorsArray
985
+ }
1020
986
  }
1021
987
  }
1022
988
  );
1023
989
  }
1024
990
  if (isError || !releaseActions) {
1025
- return /* @__PURE__ */ jsx(Page.Error, {});
991
+ return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(AnErrorOccurred, {}) });
1026
992
  }
1027
993
  if (Object.keys(releaseActions).length === 0) {
1028
994
  return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(
1029
- EmptyStateLayout,
995
+ NoContent,
1030
996
  {
997
+ content: {
998
+ id: "content-releases.pages.Details.tab.emptyEntries",
999
+ defaultMessage: "This release is empty. Open the Content Manager, select an entry and add it to the release."
1000
+ },
1031
1001
  action: /* @__PURE__ */ jsx(
1032
1002
  LinkButton,
1033
1003
  {
1034
- as: Link$1,
1004
+ as: Link$2,
1035
1005
  to: {
1036
1006
  pathname: "/content-manager"
1037
1007
  },
@@ -1042,54 +1012,10 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1042
1012
  defaultMessage: "Open the Content Manager"
1043
1013
  })
1044
1014
  }
1045
- ),
1046
- icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "10rem" }),
1047
- content: formatMessage({
1048
- id: "content-releases.pages.Details.tab.emptyEntries",
1049
- defaultMessage: "This release is empty. Open the Content Manager, select an entry and add it to the release."
1050
- })
1015
+ )
1051
1016
  }
1052
1017
  ) });
1053
1018
  }
1054
- const headers = [
1055
- {
1056
- label: formatMessage({
1057
- id: "content-releases.page.ReleaseDetails.table.header.label.name",
1058
- defaultMessage: "name"
1059
- }),
1060
- name: "name"
1061
- },
1062
- {
1063
- label: formatMessage({
1064
- id: "content-releases.page.ReleaseDetails.table.header.label.locale",
1065
- defaultMessage: "locale"
1066
- }),
1067
- name: "locale"
1068
- },
1069
- {
1070
- label: formatMessage({
1071
- id: "content-releases.page.ReleaseDetails.table.header.label.content-type",
1072
- defaultMessage: "content-type"
1073
- }),
1074
- name: "content-type"
1075
- },
1076
- {
1077
- label: formatMessage({
1078
- id: "content-releases.page.ReleaseDetails.table.header.label.action",
1079
- defaultMessage: "action"
1080
- }),
1081
- name: "action"
1082
- },
1083
- ...!release.releasedAt ? [
1084
- {
1085
- label: formatMessage({
1086
- id: "content-releases.page.ReleaseDetails.table.header.label.status",
1087
- defaultMessage: "status"
1088
- }),
1089
- name: "status"
1090
- }
1091
- ] : []
1092
- ];
1093
1019
  return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsxs(Flex, { gap: 8, direction: "column", alignItems: "stretch", children: [
1094
1020
  /* @__PURE__ */ jsx(Flex, { children: /* @__PURE__ */ jsx(
1095
1021
  SingleSelect,
@@ -1121,11 +1047,68 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1121
1047
  ...item,
1122
1048
  id: Number(item.entry.id)
1123
1049
  })),
1124
- headers,
1125
- isLoading: isLoading || isFetching,
1050
+ colCount: releaseActions[key].length,
1051
+ isLoading,
1052
+ isFetching,
1126
1053
  children: /* @__PURE__ */ jsxs(Table.Content, { children: [
1127
- /* @__PURE__ */ jsx(Table.Head, { children: headers.map((header) => /* @__PURE__ */ jsx(Table.HeaderCell, { ...header }, header.name)) }),
1128
- /* @__PURE__ */ jsx(Table.Loading, {}),
1054
+ /* @__PURE__ */ jsxs(Table.Head, { children: [
1055
+ /* @__PURE__ */ jsx(
1056
+ Table.HeaderCell,
1057
+ {
1058
+ fieldSchemaType: "string",
1059
+ label: formatMessage({
1060
+ id: "content-releases.page.ReleaseDetails.table.header.label.name",
1061
+ defaultMessage: "name"
1062
+ }),
1063
+ name: "name"
1064
+ }
1065
+ ),
1066
+ /* @__PURE__ */ jsx(
1067
+ Table.HeaderCell,
1068
+ {
1069
+ fieldSchemaType: "string",
1070
+ label: formatMessage({
1071
+ id: "content-releases.page.ReleaseDetails.table.header.label.locale",
1072
+ defaultMessage: "locale"
1073
+ }),
1074
+ name: "locale"
1075
+ }
1076
+ ),
1077
+ /* @__PURE__ */ jsx(
1078
+ Table.HeaderCell,
1079
+ {
1080
+ fieldSchemaType: "string",
1081
+ label: formatMessage({
1082
+ id: "content-releases.page.ReleaseDetails.table.header.label.content-type",
1083
+ defaultMessage: "content-type"
1084
+ }),
1085
+ name: "content-type"
1086
+ }
1087
+ ),
1088
+ /* @__PURE__ */ jsx(
1089
+ Table.HeaderCell,
1090
+ {
1091
+ fieldSchemaType: "string",
1092
+ label: formatMessage({
1093
+ id: "content-releases.page.ReleaseDetails.table.header.label.action",
1094
+ defaultMessage: "action"
1095
+ }),
1096
+ name: "action"
1097
+ }
1098
+ ),
1099
+ !release.releasedAt && /* @__PURE__ */ jsx(
1100
+ Table.HeaderCell,
1101
+ {
1102
+ fieldSchemaType: "string",
1103
+ label: formatMessage({
1104
+ id: "content-releases.page.ReleaseDetails.table.header.label.status",
1105
+ defaultMessage: "status"
1106
+ }),
1107
+ name: "status"
1108
+ }
1109
+ )
1110
+ ] }),
1111
+ /* @__PURE__ */ jsx(Table.LoadingBody, {}),
1129
1112
  /* @__PURE__ */ jsx(Table.Body, { children: releaseActions[key].map(
1130
1113
  ({ id, contentType, locale, type, entry }, actionIndex) => /* @__PURE__ */ jsxs(Tr, { children: [
1131
1114
  /* @__PURE__ */ jsx(Td, { width: "25%", maxWidth: "200px", children: /* @__PURE__ */ jsx(Typography, { ellipsis: true, children: `${contentType.mainFieldValue || entry.id}` }) }),
@@ -1183,17 +1166,17 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1183
1166
  }
1184
1167
  )
1185
1168
  ] }, `releases-group-${key}`)),
1186
- /* @__PURE__ */ jsxs(
1187
- Pagination.Root,
1188
- {
1189
- ...releaseMeta?.pagination,
1190
- defaultPageSize: releaseMeta?.pagination?.pageSize,
1191
- children: [
1192
- /* @__PURE__ */ jsx(Pagination.PageSize, {}),
1193
- /* @__PURE__ */ jsx(Pagination.Links, {})
1194
- ]
1195
- }
1196
- )
1169
+ /* @__PURE__ */ jsxs(Flex, { paddingTop: 4, alignItems: "flex-end", justifyContent: "space-between", children: [
1170
+ /* @__PURE__ */ jsx(PageSizeURLQuery, { defaultValue: releaseMeta?.pagination?.pageSize.toString() }),
1171
+ /* @__PURE__ */ jsx(
1172
+ PaginationURLQuery,
1173
+ {
1174
+ pagination: {
1175
+ pageCount: releaseMeta?.pagination?.pageCount || 0
1176
+ }
1177
+ }
1178
+ )
1179
+ ] })
1197
1180
  ] }) });
1198
1181
  };
1199
1182
  const ReleaseDetailsPage = () => {
@@ -1201,19 +1184,14 @@ const ReleaseDetailsPage = () => {
1201
1184
  const { releaseId } = useParams();
1202
1185
  const toggleNotification = useNotification();
1203
1186
  const { formatAPIError } = useAPIErrorHandler();
1204
- const navigate = useNavigate();
1187
+ const { replace } = useHistory();
1205
1188
  const [releaseModalShown, setReleaseModalShown] = React.useState(false);
1206
1189
  const [showWarningSubmit, setWarningSubmit] = React.useState(false);
1207
1190
  const {
1208
1191
  isLoading: isLoadingDetails,
1209
1192
  data,
1210
1193
  isSuccess: isSuccessDetails
1211
- } = useGetReleaseQuery(
1212
- { id: releaseId },
1213
- {
1214
- skip: !releaseId
1215
- }
1216
- );
1194
+ } = useGetReleaseQuery({ id: releaseId });
1217
1195
  const [updateRelease, { isLoading: isSubmittingForm }] = useUpdateReleaseMutation();
1218
1196
  const [deleteRelease, { isLoading: isDeletingRelease }] = useDeleteReleaseMutation();
1219
1197
  const toggleEditReleaseModal = () => {
@@ -1226,18 +1204,15 @@ const ReleaseDetailsPage = () => {
1226
1204
  {
1227
1205
  toggleEditReleaseModal,
1228
1206
  toggleWarningSubmit,
1229
- children: /* @__PURE__ */ jsx(Page.Loading, {})
1207
+ children: /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) })
1230
1208
  }
1231
1209
  );
1232
1210
  }
1233
- if (!releaseId) {
1234
- return /* @__PURE__ */ jsx(Navigate, { to: ".." });
1235
- }
1236
1211
  const releaseData = isSuccessDetails && data?.data || null;
1237
1212
  const title = releaseData?.name || "";
1238
1213
  const timezone = releaseData?.timezone ?? null;
1239
1214
  const scheduledAt = releaseData?.scheduledAt && timezone ? utcToZonedTime(releaseData.scheduledAt, timezone) : null;
1240
- const date = scheduledAt ? new Date(format(scheduledAt, "yyyy-MM-dd")) : null;
1215
+ const date = scheduledAt ? format(scheduledAt, "yyyy-MM-dd") : null;
1241
1216
  const time = scheduledAt ? format(scheduledAt, "HH:mm") : "";
1242
1217
  const handleEditRelease = async (values) => {
1243
1218
  const response = await updateRelease({
@@ -1272,7 +1247,7 @@ const ReleaseDetailsPage = () => {
1272
1247
  id: releaseId
1273
1248
  });
1274
1249
  if ("data" in response) {
1275
- navigate("..");
1250
+ replace("/plugins/content-releases");
1276
1251
  } else if (isAxiosError(response.error)) {
1277
1252
  toggleNotification({
1278
1253
  type: "warning",
@@ -1291,7 +1266,7 @@ const ReleaseDetailsPage = () => {
1291
1266
  toggleEditReleaseModal,
1292
1267
  toggleWarningSubmit,
1293
1268
  children: [
1294
- /* @__PURE__ */ jsx(ReleaseDetailsBody, { releaseId }),
1269
+ /* @__PURE__ */ jsx(ReleaseDetailsBody, {}),
1295
1270
  releaseModalShown && /* @__PURE__ */ jsx(
1296
1271
  ReleaseModal,
1297
1272
  {
@@ -1326,12 +1301,12 @@ const ReleaseDetailsPage = () => {
1326
1301
  );
1327
1302
  };
1328
1303
  const App = () => {
1329
- return /* @__PURE__ */ jsx(Page.Protect, { permissions: PERMISSIONS.main, children: /* @__PURE__ */ jsxs(Routes, { children: [
1330
- /* @__PURE__ */ jsx(Route, { index: true, element: /* @__PURE__ */ jsx(ReleasesPage, {}) }),
1331
- /* @__PURE__ */ jsx(Route, { path: ":releaseId", element: /* @__PURE__ */ jsx(ReleaseDetailsPage, {}) })
1304
+ return /* @__PURE__ */ jsx(CheckPagePermissions, { permissions: PERMISSIONS.main, children: /* @__PURE__ */ jsxs(Switch, { children: [
1305
+ /* @__PURE__ */ jsx(Route, { exact: true, path: `/plugins/${pluginId}`, component: ReleasesPage }),
1306
+ /* @__PURE__ */ jsx(Route, { exact: true, path: `/plugins/${pluginId}/:releaseId`, component: ReleaseDetailsPage })
1332
1307
  ] }) });
1333
1308
  };
1334
1309
  export {
1335
1310
  App
1336
1311
  };
1337
- //# sourceMappingURL=App-PQlYzNfb.mjs.map
1312
+ //# sourceMappingURL=App-XbK-TdJn.mjs.map