@strapi/content-releases 0.0.0-experimental.fc1ac2acd58c8a5a858679956b6d102ac5ee4011 → 0.0.0-experimental.fea7af0bd6b406e4648e4c6669829249f73eb60f

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-C768ulk4.js → App-HjWtUYmc.js} +233 -261
  2. package/dist/_chunks/App-HjWtUYmc.js.map +1 -0
  3. package/dist/_chunks/{App-0Er6xxcq.mjs → App-gu1aiP6i.mjs} +237 -265
  4. package/dist/_chunks/App-gu1aiP6i.mjs.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-HrREghh3.js} +11 -3
  10. package/dist/_chunks/en-HrREghh3.js.map +1 -0
  11. package/dist/_chunks/{en-WuuhP6Bn.mjs → en-ltT1TlKQ.mjs} +11 -3
  12. package/dist/_chunks/en-ltT1TlKQ.mjs.map +1 -0
  13. package/dist/_chunks/{index-BLSMpbpZ.js → index-ZNwxYN8H.js} +338 -31
  14. package/dist/_chunks/index-ZNwxYN8H.js.map +1 -0
  15. package/dist/_chunks/{index-fJx1up7m.mjs → index-mvj9PSKd.mjs} +345 -38
  16. package/dist/_chunks/index-mvj9PSKd.mjs.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 +380 -172
  20. package/dist/server/index.js.map +1 -1
  21. package/dist/server/index.mjs +380 -173
  22. package/dist/server/index.mjs.map +1 -1
  23. package/package.json +22 -15
  24. package/dist/_chunks/App-0Er6xxcq.mjs.map +0 -1
  25. package/dist/_chunks/App-C768ulk4.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-BLSMpbpZ.js.map +0 -1
  31. package/dist/_chunks/index-fJx1up7m.mjs.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 -3838
  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 -3572
  89. package/dist/server/src/services/index.d.ts.map +0 -1
  90. package/dist/server/src/services/release.d.ts +0 -1812
  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 -18
  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, unstable_useDocument } from "@strapi/admin/strapi-admin";
3
- import { useLocation, useNavigate, useParams, Navigate, Link as Link$2, 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-fJx1up7m.mjs";
1
+ import { jsxs, jsx, Fragment } from "react/jsx-runtime";
2
+ import { RelativeTime as RelativeTime$1, useNotification, useAPIErrorHandler, useQueryParams, useTracking, LoadingIndicatorPage, CheckPermissions, PageSizeURLQuery, PaginationURLQuery, AnErrorOccurred, ConfirmDialog, useRBAC, useStrapiApp, 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-mvj9PSKd.mjs";
5
5
  import * as React from "react";
6
+ import { useLicenseLimits, unstable_useDocument } from "@strapi/admin/strapi-admin";
6
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, Table } from "@strapi/helper-plugin";
9
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,15 +251,18 @@ 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
  };
293
258
  const LinkCard = styled(Link)`
294
259
  display: block;
295
260
  `;
296
- const CapitalizeRelativeTime = styled(RelativeTime)`
297
- text-transform: capitalize;
261
+ const RelativeTime = styled(RelativeTime$1)`
262
+ display: inline-block;
263
+ &::first-letter {
264
+ text-transform: uppercase;
265
+ }
298
266
  `;
299
267
  const getBadgeProps = (status) => {
300
268
  let color;
@@ -323,9 +291,8 @@ const getBadgeProps = (status) => {
323
291
  };
324
292
  const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
325
293
  const { formatMessage } = useIntl();
326
- const IsSchedulingEnabled = window.strapi.future.isEnabled("contentReleasesScheduling");
327
294
  if (isError) {
328
- return /* @__PURE__ */ jsx(Page.Error, {});
295
+ return /* @__PURE__ */ jsx(AnErrorOccurred, {});
329
296
  }
330
297
  if (releases?.length === 0) {
331
298
  return /* @__PURE__ */ jsx(
@@ -344,7 +311,7 @@ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
344
311
  }
345
312
  );
346
313
  }
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(
314
+ 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
315
  Flex,
349
316
  {
350
317
  direction: "column",
@@ -360,16 +327,10 @@ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
360
327
  children: [
361
328
  /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "start", gap: 1, children: [
362
329
  /* @__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({
330
+ /* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: scheduledAt ? /* @__PURE__ */ jsx(RelativeTime, { timestamp: new Date(scheduledAt) }) : formatMessage({
364
331
  id: "content-releases.pages.Releases.not-scheduled",
365
332
  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
- ) })
333
+ }) })
373
334
  ] }),
374
335
  /* @__PURE__ */ jsx(Badge, { ...getBadgeProps(status), children: status })
375
336
  ]
@@ -388,8 +349,7 @@ const INITIAL_FORM_VALUES = {
388
349
  name: "",
389
350
  date: null,
390
351
  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"),
352
+ isScheduled: true,
393
353
  scheduledAt: null,
394
354
  timezone: null
395
355
  };
@@ -399,7 +359,7 @@ const ReleasesPage = () => {
399
359
  const [releaseModalShown, setReleaseModalShown] = React.useState(false);
400
360
  const toggleNotification = useNotification();
401
361
  const { formatMessage } = useIntl();
402
- const navigate = useNavigate();
362
+ const { push, replace } = useHistory();
403
363
  const { formatAPIError } = useAPIErrorHandler();
404
364
  const [{ query }, setQuery] = useQueryParams();
405
365
  const response = useGetReleasesQuery(query);
@@ -423,9 +383,9 @@ const ReleasesPage = () => {
423
383
  defaultMessage: "Please try again or open another release."
424
384
  })
425
385
  });
426
- navigate("", { replace: true, state: null });
386
+ replace({ state: null });
427
387
  }
428
- }, [formatMessage, location?.state?.errors, navigate, toggleNotification]);
388
+ }, [formatMessage, location?.state?.errors, replace, toggleNotification]);
429
389
  React.useEffect(() => {
430
390
  if (tabRef.current) {
431
391
  tabRef.current._handlers.setSelectedTabIndex(activeTabIndex);
@@ -435,7 +395,7 @@ const ReleasesPage = () => {
435
395
  setReleaseModalShown((prev) => !prev);
436
396
  };
437
397
  if (isLoading) {
438
- return /* @__PURE__ */ jsx(Page.Loading, {});
398
+ return /* @__PURE__ */ jsx(Main, { "aria-busy": isLoading, children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) });
439
399
  }
440
400
  const totalPendingReleases = isSuccess && response.currentData?.meta?.pendingReleasesCount || 0;
441
401
  const hasReachedMaximumPendingReleases = totalPendingReleases >= maximumReleases;
@@ -466,7 +426,7 @@ const ReleasesPage = () => {
466
426
  })
467
427
  });
468
428
  trackUsage("didCreateRelease");
469
- navigate(response2.data.data.id.toString());
429
+ push(`/plugins/content-releases/${response2.data.data.id}`);
470
430
  } else if (isAxiosError(response2.error)) {
471
431
  toggleNotification({
472
432
  type: "warning",
@@ -581,17 +541,23 @@ const ReleasesPage = () => {
581
541
  ]
582
542
  }
583
543
  ),
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
- )
544
+ response.currentData?.meta?.pagination?.total ? /* @__PURE__ */ jsxs(Flex, { paddingTop: 4, alignItems: "flex-end", justifyContent: "space-between", children: [
545
+ /* @__PURE__ */ jsx(
546
+ PageSizeURLQuery,
547
+ {
548
+ options: ["8", "16", "32", "64"],
549
+ defaultValue: response?.currentData?.meta?.pagination?.pageSize.toString()
550
+ }
551
+ ),
552
+ /* @__PURE__ */ jsx(
553
+ PaginationURLQuery,
554
+ {
555
+ pagination: {
556
+ pageCount: response?.currentData?.meta?.pagination?.pageCount || 0
557
+ }
558
+ }
559
+ )
560
+ ] }) : null
595
561
  ] }) }),
596
562
  releaseModalShown && /* @__PURE__ */ jsx(
597
563
  ReleaseModal,
@@ -639,18 +605,14 @@ const TrashIcon = styled(Trash)`
639
605
  const TypographyMaxWidth = styled(Typography)`
640
606
  max-width: 300px;
641
607
  `;
642
- const EntryValidationText = ({ action, schema, entry }) => {
608
+ const EntryValidationText = ({ action, schema, components, entry }) => {
643
609
  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) ?? {};
610
+ const { validate } = unstable_useDocument();
611
+ const { errors } = validate(entry, {
612
+ contentType: schema,
613
+ components,
614
+ isCreatingEntry: false
615
+ });
654
616
  if (Object.keys(errors).length > 0) {
655
617
  const validationErrorsMessages = Object.entries(errors).map(
656
618
  ([key, value]) => formatMessage(
@@ -698,12 +660,7 @@ const ReleaseDetailsLayout = ({
698
660
  isLoading: isLoadingDetails,
699
661
  isError,
700
662
  error
701
- } = useGetReleaseQuery(
702
- { id: releaseId },
703
- {
704
- skip: !releaseId
705
- }
706
- );
663
+ } = useGetReleaseQuery({ id: releaseId });
707
664
  const [publishRelease, { isLoading: isPublishing }] = usePublishReleaseMutation();
708
665
  const toggleNotification = useNotification();
709
666
  const { formatAPIError } = useAPIErrorHandler();
@@ -713,8 +670,8 @@ const ReleaseDetailsLayout = ({
713
670
  const dispatch = useTypedDispatch();
714
671
  const { trackUsage } = useTracking();
715
672
  const release = data?.data;
716
- const handlePublishRelease = (id) => async () => {
717
- const response = await publishRelease({ id });
673
+ const handlePublishRelease = async () => {
674
+ const response = await publishRelease({ id: releaseId });
718
675
  if ("data" in response) {
719
676
  toggleNotification({
720
677
  type: "success",
@@ -742,7 +699,12 @@ const ReleaseDetailsLayout = ({
742
699
  }
743
700
  };
744
701
  const handleRefresh = () => {
745
- dispatch(releaseApi.util.invalidateTags([{ type: "ReleaseAction", id: "LIST" }]));
702
+ dispatch(
703
+ releaseApi.util.invalidateTags([
704
+ { type: "ReleaseAction", id: "LIST" },
705
+ { type: "Release", id: releaseId }
706
+ ])
707
+ );
746
708
  };
747
709
  const getCreatedByUser = () => {
748
710
  if (!release?.createdBy) {
@@ -757,26 +719,27 @@ const ReleaseDetailsLayout = ({
757
719
  return release.createdBy.email;
758
720
  };
759
721
  if (isLoadingDetails) {
760
- return /* @__PURE__ */ jsx(Page.Loading, {});
722
+ return /* @__PURE__ */ jsx(Main, { "aria-busy": isLoadingDetails, children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) });
761
723
  }
762
724
  if (isError || !release) {
763
725
  return /* @__PURE__ */ jsx(
764
- Navigate,
726
+ Redirect,
765
727
  {
766
- to: "..",
767
- state: {
768
- errors: [
769
- {
770
- code: error?.code
771
- }
772
- ]
728
+ to: {
729
+ pathname: "/plugins/content-releases",
730
+ state: {
731
+ errors: [
732
+ {
733
+ code: error?.code
734
+ }
735
+ ]
736
+ }
773
737
  }
774
738
  }
775
739
  );
776
740
  }
777
741
  const totalEntries = release.actions.meta.count || 0;
778
742
  const hasCreatedByUser = Boolean(getCreatedByUser());
779
- const IsSchedulingEnabled = window.strapi.future.isEnabled("contentReleasesScheduling");
780
743
  const isScheduled = release.scheduledAt && release.timezone;
781
744
  const numberOfEntriesText = formatMessage(
782
745
  {
@@ -811,7 +774,7 @@ const ReleaseDetailsLayout = ({
811
774
  {
812
775
  title: release.name,
813
776
  subtitle: /* @__PURE__ */ jsxs(Flex, { gap: 2, lineHeight: 6, children: [
814
- /* @__PURE__ */ jsx(Typography, { textColor: "neutral600", variant: "epsilon", children: numberOfEntriesText + (IsSchedulingEnabled && isScheduled ? ` - ${scheduledText}` : "") }),
777
+ /* @__PURE__ */ jsx(Typography, { textColor: "neutral600", variant: "epsilon", children: numberOfEntriesText + (isScheduled ? ` - ${scheduledText}` : "") }),
815
778
  /* @__PURE__ */ jsx(Badge, { ...getBadgeProps(release.status), children: release.status })
816
779
  ] }),
817
780
  navigationAction: /* @__PURE__ */ jsx(Link$1, { startIcon: /* @__PURE__ */ jsx(ArrowLeft, {}), to: "/plugins/content-releases", children: formatMessage({
@@ -883,7 +846,7 @@ const ReleaseDetailsLayout = ({
883
846
  defaultMessage: "Created"
884
847
  }) }),
885
848
  /* @__PURE__ */ jsxs(Typography, { variant: "pi", color: "neutral300", children: [
886
- /* @__PURE__ */ jsx(RelativeTime, { timestamp: new Date(release.createdAt) }),
849
+ /* @__PURE__ */ jsx(RelativeTime$1, { timestamp: new Date(release.createdAt) }),
887
850
  formatMessage(
888
851
  {
889
852
  id: "content-releases.header.actions.created.description",
@@ -906,7 +869,7 @@ const ReleaseDetailsLayout = ({
906
869
  {
907
870
  size: "S",
908
871
  variant: "default",
909
- onClick: handlePublishRelease(release.id.toString()),
872
+ onClick: handlePublishRelease,
910
873
  loading: isPublishing,
911
874
  disabled: release.actions.meta.count === 0,
912
875
  children: formatMessage({
@@ -922,6 +885,7 @@ const ReleaseDetailsLayout = ({
922
885
  ] });
923
886
  };
924
887
  const GROUP_BY_OPTIONS = ["contentType", "locale", "action"];
888
+ const GROUP_BY_OPTIONS_NO_LOCALE = ["contentType", "action"];
925
889
  const getGroupByOptionLabel = (value) => {
926
890
  if (value === "locale") {
927
891
  return {
@@ -940,8 +904,24 @@ const getGroupByOptionLabel = (value) => {
940
904
  defaultMessage: "Content-Types"
941
905
  };
942
906
  };
943
- const ReleaseDetailsBody = ({ releaseId }) => {
907
+ const DEFAULT_RELEASE_DETAILS_HEADER = [
908
+ {
909
+ key: "__name__",
910
+ fieldSchema: { type: "string" },
911
+ metadatas: {
912
+ label: {
913
+ id: "content-releases.page.ReleaseDetails.table.header.label.name",
914
+ defaultMessage: "name"
915
+ },
916
+ searchable: false,
917
+ sortable: false
918
+ },
919
+ name: "name"
920
+ }
921
+ ];
922
+ const ReleaseDetailsBody = () => {
944
923
  const { formatMessage } = useIntl();
924
+ const { releaseId } = useParams();
945
925
  const [{ query }, setQuery] = useQueryParams();
946
926
  const toggleNotification = useNotification();
947
927
  const { formatAPIError } = useAPIErrorHandler();
@@ -954,6 +934,17 @@ const ReleaseDetailsBody = ({ releaseId }) => {
954
934
  const {
955
935
  allowedActions: { canUpdate }
956
936
  } = useRBAC(PERMISSIONS);
937
+ const { runHookWaterfall } = useStrapiApp();
938
+ const {
939
+ displayedHeaders,
940
+ hasI18nEnabled
941
+ } = runHookWaterfall(
942
+ "ContentReleases/pages/ReleaseDetails/add-locale-in-releases",
943
+ {
944
+ displayedHeaders: DEFAULT_RELEASE_DETAILS_HEADER,
945
+ hasI18nEnabled: false
946
+ }
947
+ );
957
948
  const release = releaseData?.data;
958
949
  const selectedGroupBy = query?.groupBy || "contentType";
959
950
  const {
@@ -996,7 +987,7 @@ const ReleaseDetailsBody = ({ releaseId }) => {
996
987
  }
997
988
  };
998
989
  if (isLoading || isReleaseLoading) {
999
- return /* @__PURE__ */ jsx(Page.Loading, {});
990
+ return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) });
1000
991
  }
1001
992
  const releaseActions = data?.data;
1002
993
  const releaseMeta = data?.meta;
@@ -1015,22 +1006,28 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1015
1006
  });
1016
1007
  }
1017
1008
  return /* @__PURE__ */ jsx(
1018
- Navigate,
1009
+ Redirect,
1019
1010
  {
1020
- to: "..",
1021
- state: {
1022
- errors: errorsArray
1011
+ to: {
1012
+ pathname: "/plugins/content-releases",
1013
+ state: {
1014
+ errors: errorsArray
1015
+ }
1023
1016
  }
1024
1017
  }
1025
1018
  );
1026
1019
  }
1027
1020
  if (isError || !releaseActions) {
1028
- return /* @__PURE__ */ jsx(Page.Error, {});
1021
+ return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(AnErrorOccurred, {}) });
1029
1022
  }
1030
1023
  if (Object.keys(releaseActions).length === 0) {
1031
1024
  return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(
1032
- EmptyStateLayout,
1025
+ NoContent,
1033
1026
  {
1027
+ content: {
1028
+ id: "content-releases.pages.Details.tab.emptyEntries",
1029
+ defaultMessage: "This release is empty. Open the Content Manager, select an entry and add it to the release."
1030
+ },
1034
1031
  action: /* @__PURE__ */ jsx(
1035
1032
  LinkButton,
1036
1033
  {
@@ -1045,15 +1042,11 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1045
1042
  defaultMessage: "Open the Content Manager"
1046
1043
  })
1047
1044
  }
1048
- ),
1049
- icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "10rem" }),
1050
- content: formatMessage({
1051
- id: "content-releases.pages.Details.tab.emptyEntries",
1052
- defaultMessage: "This release is empty. Open the Content Manager, select an entry and add it to the release."
1053
- })
1045
+ )
1054
1046
  }
1055
1047
  ) });
1056
1048
  }
1049
+ const options = hasI18nEnabled ? GROUP_BY_OPTIONS : GROUP_BY_OPTIONS_NO_LOCALE;
1057
1050
  return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsxs(Flex, { gap: 8, direction: "column", alignItems: "stretch", children: [
1058
1051
  /* @__PURE__ */ jsx(Flex, { children: /* @__PURE__ */ jsx(
1059
1052
  SingleSelect,
@@ -1073,7 +1066,7 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1073
1066
  ),
1074
1067
  value: formatMessage(getGroupByOptionLabel(selectedGroupBy)),
1075
1068
  onChange: (value) => setQuery({ groupBy: value }),
1076
- children: GROUP_BY_OPTIONS.map((option) => /* @__PURE__ */ jsx(SingleSelectOption, { value: option, children: formatMessage(getGroupByOptionLabel(option)) }, option))
1069
+ children: options.map((option) => /* @__PURE__ */ jsx(SingleSelectOption, { value: option, children: formatMessage(getGroupByOptionLabel(option)) }, option))
1077
1070
  }
1078
1071
  ) }),
1079
1072
  Object.keys(releaseActions).map((key) => /* @__PURE__ */ jsxs(Flex, { gap: 4, direction: "column", alignItems: "stretch", children: [
@@ -1090,32 +1083,19 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1090
1083
  isFetching,
1091
1084
  children: /* @__PURE__ */ jsxs(Table.Content, { children: [
1092
1085
  /* @__PURE__ */ jsxs(Table.Head, { children: [
1093
- /* @__PURE__ */ jsx(
1094
- Table.HeaderCell,
1095
- {
1096
- attribute: { type: "string" },
1097
- label: formatMessage({
1098
- id: "content-releases.page.ReleaseDetails.table.header.label.name",
1099
- defaultMessage: "name"
1100
- }),
1101
- name: "name"
1102
- }
1103
- ),
1104
- /* @__PURE__ */ jsx(
1086
+ displayedHeaders.map(({ key: key2, fieldSchema, metadatas, name }) => /* @__PURE__ */ jsx(
1105
1087
  Table.HeaderCell,
1106
1088
  {
1107
- attribute: { type: "string" },
1108
- label: formatMessage({
1109
- id: "content-releases.page.ReleaseDetails.table.header.label.locale",
1110
- defaultMessage: "locale"
1111
- }),
1112
- name: "locale"
1113
- }
1114
- ),
1089
+ fieldSchemaType: fieldSchema.type,
1090
+ label: formatMessage(metadatas.label),
1091
+ name
1092
+ },
1093
+ key2
1094
+ )),
1115
1095
  /* @__PURE__ */ jsx(
1116
1096
  Table.HeaderCell,
1117
1097
  {
1118
- attribute: { type: "string" },
1098
+ fieldSchemaType: "string",
1119
1099
  label: formatMessage({
1120
1100
  id: "content-releases.page.ReleaseDetails.table.header.label.content-type",
1121
1101
  defaultMessage: "content-type"
@@ -1126,7 +1106,7 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1126
1106
  /* @__PURE__ */ jsx(
1127
1107
  Table.HeaderCell,
1128
1108
  {
1129
- attribute: { type: "string" },
1109
+ fieldSchemaType: "string",
1130
1110
  label: formatMessage({
1131
1111
  id: "content-releases.page.ReleaseDetails.table.header.label.action",
1132
1112
  defaultMessage: "action"
@@ -1137,7 +1117,7 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1137
1117
  !release.releasedAt && /* @__PURE__ */ jsx(
1138
1118
  Table.HeaderCell,
1139
1119
  {
1140
- attribute: { type: "string" },
1120
+ fieldSchemaType: "string",
1141
1121
  label: formatMessage({
1142
1122
  id: "content-releases.page.ReleaseDetails.table.header.label.status",
1143
1123
  defaultMessage: "status"
@@ -1150,7 +1130,7 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1150
1130
  /* @__PURE__ */ jsx(Table.Body, { children: releaseActions[key].map(
1151
1131
  ({ id, contentType, locale, type, entry }, actionIndex) => /* @__PURE__ */ jsxs(Tr, { children: [
1152
1132
  /* @__PURE__ */ jsx(Td, { width: "25%", maxWidth: "200px", children: /* @__PURE__ */ jsx(Typography, { ellipsis: true, children: `${contentType.mainFieldValue || entry.id}` }) }),
1153
- /* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: `${locale?.name ? locale.name : "-"}` }) }),
1133
+ hasI18nEnabled && /* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: `${locale?.name ? locale.name : "-"}` }) }),
1154
1134
  /* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: contentType.displayName || "" }) }),
1155
1135
  /* @__PURE__ */ jsx(Td, { width: "20%", children: release.releasedAt ? /* @__PURE__ */ jsx(Typography, { children: formatMessage(
1156
1136
  {
@@ -1204,17 +1184,17 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1204
1184
  }
1205
1185
  )
1206
1186
  ] }, `releases-group-${key}`)),
1207
- /* @__PURE__ */ jsxs(
1208
- Pagination.Root,
1209
- {
1210
- ...releaseMeta?.pagination,
1211
- defaultPageSize: releaseMeta?.pagination?.pageSize,
1212
- children: [
1213
- /* @__PURE__ */ jsx(Pagination.PageSize, {}),
1214
- /* @__PURE__ */ jsx(Pagination.Links, {})
1215
- ]
1216
- }
1217
- )
1187
+ /* @__PURE__ */ jsxs(Flex, { paddingTop: 4, alignItems: "flex-end", justifyContent: "space-between", children: [
1188
+ /* @__PURE__ */ jsx(PageSizeURLQuery, { defaultValue: releaseMeta?.pagination?.pageSize.toString() }),
1189
+ /* @__PURE__ */ jsx(
1190
+ PaginationURLQuery,
1191
+ {
1192
+ pagination: {
1193
+ pageCount: releaseMeta?.pagination?.pageCount || 0
1194
+ }
1195
+ }
1196
+ )
1197
+ ] })
1218
1198
  ] }) });
1219
1199
  };
1220
1200
  const ReleaseDetailsPage = () => {
@@ -1222,19 +1202,14 @@ const ReleaseDetailsPage = () => {
1222
1202
  const { releaseId } = useParams();
1223
1203
  const toggleNotification = useNotification();
1224
1204
  const { formatAPIError } = useAPIErrorHandler();
1225
- const navigate = useNavigate();
1205
+ const { replace } = useHistory();
1226
1206
  const [releaseModalShown, setReleaseModalShown] = React.useState(false);
1227
1207
  const [showWarningSubmit, setWarningSubmit] = React.useState(false);
1228
1208
  const {
1229
1209
  isLoading: isLoadingDetails,
1230
1210
  data,
1231
1211
  isSuccess: isSuccessDetails
1232
- } = useGetReleaseQuery(
1233
- { id: releaseId },
1234
- {
1235
- skip: !releaseId
1236
- }
1237
- );
1212
+ } = useGetReleaseQuery({ id: releaseId });
1238
1213
  const [updateRelease, { isLoading: isSubmittingForm }] = useUpdateReleaseMutation();
1239
1214
  const [deleteRelease, { isLoading: isDeletingRelease }] = useDeleteReleaseMutation();
1240
1215
  const toggleEditReleaseModal = () => {
@@ -1247,18 +1222,15 @@ const ReleaseDetailsPage = () => {
1247
1222
  {
1248
1223
  toggleEditReleaseModal,
1249
1224
  toggleWarningSubmit,
1250
- children: /* @__PURE__ */ jsx(Page.Loading, {})
1225
+ children: /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) })
1251
1226
  }
1252
1227
  );
1253
1228
  }
1254
- if (!releaseId) {
1255
- return /* @__PURE__ */ jsx(Navigate, { to: ".." });
1256
- }
1257
1229
  const releaseData = isSuccessDetails && data?.data || null;
1258
1230
  const title = releaseData?.name || "";
1259
1231
  const timezone = releaseData?.timezone ?? null;
1260
1232
  const scheduledAt = releaseData?.scheduledAt && timezone ? utcToZonedTime(releaseData.scheduledAt, timezone) : null;
1261
- const date = scheduledAt ? new Date(format(scheduledAt, "yyyy-MM-dd")) : null;
1233
+ const date = scheduledAt ? format(scheduledAt, "yyyy-MM-dd") : null;
1262
1234
  const time = scheduledAt ? format(scheduledAt, "HH:mm") : "";
1263
1235
  const handleEditRelease = async (values) => {
1264
1236
  const response = await updateRelease({
@@ -1275,6 +1247,7 @@ const ReleaseDetailsPage = () => {
1275
1247
  defaultMessage: "Release updated."
1276
1248
  })
1277
1249
  });
1250
+ toggleEditReleaseModal();
1278
1251
  } else if (isAxiosError(response.error)) {
1279
1252
  toggleNotification({
1280
1253
  type: "warning",
@@ -1286,14 +1259,13 @@ const ReleaseDetailsPage = () => {
1286
1259
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
1287
1260
  });
1288
1261
  }
1289
- toggleEditReleaseModal();
1290
1262
  };
1291
1263
  const handleDeleteRelease = async () => {
1292
1264
  const response = await deleteRelease({
1293
1265
  id: releaseId
1294
1266
  });
1295
1267
  if ("data" in response) {
1296
- navigate("..");
1268
+ replace("/plugins/content-releases");
1297
1269
  } else if (isAxiosError(response.error)) {
1298
1270
  toggleNotification({
1299
1271
  type: "warning",
@@ -1312,7 +1284,7 @@ const ReleaseDetailsPage = () => {
1312
1284
  toggleEditReleaseModal,
1313
1285
  toggleWarningSubmit,
1314
1286
  children: [
1315
- /* @__PURE__ */ jsx(ReleaseDetailsBody, { releaseId }),
1287
+ /* @__PURE__ */ jsx(ReleaseDetailsBody, {}),
1316
1288
  releaseModalShown && /* @__PURE__ */ jsx(
1317
1289
  ReleaseModal,
1318
1290
  {
@@ -1347,12 +1319,12 @@ const ReleaseDetailsPage = () => {
1347
1319
  );
1348
1320
  };
1349
1321
  const App = () => {
1350
- return /* @__PURE__ */ jsx(Page.Protect, { permissions: PERMISSIONS.main, children: /* @__PURE__ */ jsxs(Routes, { children: [
1351
- /* @__PURE__ */ jsx(Route, { index: true, element: /* @__PURE__ */ jsx(ReleasesPage, {}) }),
1352
- /* @__PURE__ */ jsx(Route, { path: ":releaseId", element: /* @__PURE__ */ jsx(ReleaseDetailsPage, {}) })
1322
+ return /* @__PURE__ */ jsx(CheckPagePermissions, { permissions: PERMISSIONS.main, children: /* @__PURE__ */ jsxs(Switch, { children: [
1323
+ /* @__PURE__ */ jsx(Route, { exact: true, path: `/plugins/${pluginId}`, component: ReleasesPage }),
1324
+ /* @__PURE__ */ jsx(Route, { exact: true, path: `/plugins/${pluginId}/:releaseId`, component: ReleaseDetailsPage })
1353
1325
  ] }) });
1354
1326
  };
1355
1327
  export {
1356
1328
  App
1357
1329
  };
1358
- //# sourceMappingURL=App-0Er6xxcq.mjs.map
1330
+ //# sourceMappingURL=App-gu1aiP6i.mjs.map