@strapi/content-releases 5.0.0-beta.1 → 5.0.0-beta.11

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 (109) hide show
  1. package/dist/_chunks/{App-1LckaIGY.js → App-B5UOQWbt.js} +375 -368
  2. package/dist/_chunks/App-B5UOQWbt.js.map +1 -0
  3. package/dist/_chunks/{App-X01LBg5V.mjs → App-DcXlnXrr.mjs} +371 -363
  4. package/dist/_chunks/App-DcXlnXrr.mjs.map +1 -0
  5. package/dist/_chunks/{PurchaseContentReleases-YhAPgpG9.js → PurchaseContentReleases-Be3acS2L.js} +8 -7
  6. package/dist/_chunks/PurchaseContentReleases-Be3acS2L.js.map +1 -0
  7. package/dist/_chunks/{PurchaseContentReleases-Clm0iACO.mjs → PurchaseContentReleases-_MxP6-Dt.mjs} +9 -8
  8. package/dist/_chunks/PurchaseContentReleases-_MxP6-Dt.mjs.map +1 -0
  9. package/dist/_chunks/SettingsPage-ped5WZ6Q.js +40 -0
  10. package/dist/_chunks/SettingsPage-ped5WZ6Q.js.map +1 -0
  11. package/dist/_chunks/SettingsPage-w5dOMAtL.mjs +40 -0
  12. package/dist/_chunks/SettingsPage-w5dOMAtL.mjs.map +1 -0
  13. package/dist/_chunks/{en-faJDuv3q.js → en-aH5E5UNw.js} +12 -2
  14. package/dist/_chunks/en-aH5E5UNw.js.map +1 -0
  15. package/dist/_chunks/{en-RdapH-9X.mjs → en-ahPQUZv2.mjs} +12 -2
  16. package/dist/_chunks/en-ahPQUZv2.mjs.map +1 -0
  17. package/dist/_chunks/{index-cYWov2wa.js → index-BgID5UQ7.js} +549 -525
  18. package/dist/_chunks/index-BgID5UQ7.js.map +1 -0
  19. package/dist/_chunks/{index-OD9AlD-6.mjs → index-LUuvped4.mjs} +551 -525
  20. package/dist/_chunks/index-LUuvped4.mjs.map +1 -0
  21. package/dist/admin/index.js +1 -1
  22. package/dist/admin/index.mjs +2 -2
  23. package/dist/admin/src/components/ReleaseAction.d.ts +3 -0
  24. package/dist/admin/src/components/ReleaseActionMenu.d.ts +3 -3
  25. package/dist/admin/src/components/ReleaseActionModal.d.ts +24 -0
  26. package/dist/admin/src/components/ReleaseListCell.d.ts +0 -0
  27. package/dist/admin/src/components/ReleaseModal.d.ts +3 -2
  28. package/dist/admin/src/components/ReleasesPanel.d.ts +3 -0
  29. package/dist/admin/src/pages/SettingsPage.d.ts +1 -0
  30. package/dist/admin/src/services/release.d.ts +51 -313
  31. package/dist/admin/src/utils/api.d.ts +6 -0
  32. package/dist/server/index.js +824 -579
  33. package/dist/server/index.js.map +1 -1
  34. package/dist/server/index.mjs +825 -580
  35. package/dist/server/index.mjs.map +1 -1
  36. package/dist/server/src/bootstrap.d.ts +1 -1
  37. package/dist/server/src/bootstrap.d.ts.map +1 -1
  38. package/dist/server/src/constants.d.ts +11 -2
  39. package/dist/server/src/constants.d.ts.map +1 -1
  40. package/dist/server/src/content-types/index.d.ts +3 -5
  41. package/dist/server/src/content-types/index.d.ts.map +1 -1
  42. package/dist/server/src/content-types/release-action/index.d.ts +3 -5
  43. package/dist/server/src/content-types/release-action/index.d.ts.map +1 -1
  44. package/dist/server/src/content-types/release-action/schema.d.ts +3 -5
  45. package/dist/server/src/content-types/release-action/schema.d.ts.map +1 -1
  46. package/dist/server/src/controllers/index.d.ts +6 -2
  47. package/dist/server/src/controllers/index.d.ts.map +1 -1
  48. package/dist/server/src/controllers/release-action.d.ts +0 -1
  49. package/dist/server/src/controllers/release-action.d.ts.map +1 -1
  50. package/dist/server/src/controllers/release.d.ts +7 -1
  51. package/dist/server/src/controllers/release.d.ts.map +1 -1
  52. package/dist/server/src/controllers/settings.d.ts +11 -0
  53. package/dist/server/src/controllers/settings.d.ts.map +1 -0
  54. package/dist/server/src/controllers/validation/release-action.d.ts +7 -1
  55. package/dist/server/src/controllers/validation/release-action.d.ts.map +1 -1
  56. package/dist/server/src/controllers/validation/release.d.ts +1 -0
  57. package/dist/server/src/controllers/validation/release.d.ts.map +1 -1
  58. package/dist/server/src/controllers/validation/settings.d.ts +2 -0
  59. package/dist/server/src/controllers/validation/settings.d.ts.map +1 -0
  60. package/dist/server/src/destroy.d.ts +1 -1
  61. package/dist/server/src/destroy.d.ts.map +1 -1
  62. package/dist/server/src/index.d.ts +73 -57
  63. package/dist/server/src/index.d.ts.map +1 -1
  64. package/dist/server/src/middlewares/documents.d.ts +6 -0
  65. package/dist/server/src/middlewares/documents.d.ts.map +1 -0
  66. package/dist/server/src/migrations/database/5.0.0-document-id-in-actions.d.ts +9 -0
  67. package/dist/server/src/migrations/database/5.0.0-document-id-in-actions.d.ts.map +1 -0
  68. package/dist/server/src/migrations/index.d.ts.map +1 -1
  69. package/dist/server/src/register.d.ts +1 -1
  70. package/dist/server/src/register.d.ts.map +1 -1
  71. package/dist/server/src/routes/index.d.ts +16 -0
  72. package/dist/server/src/routes/index.d.ts.map +1 -1
  73. package/dist/server/src/routes/release-action.d.ts.map +1 -1
  74. package/dist/server/src/routes/release.d.ts.map +1 -1
  75. package/dist/server/src/routes/settings.d.ts +18 -0
  76. package/dist/server/src/routes/settings.d.ts.map +1 -0
  77. package/dist/server/src/services/index.d.ts +41 -41
  78. package/dist/server/src/services/index.d.ts.map +1 -1
  79. package/dist/server/src/services/release-action.d.ts +36 -0
  80. package/dist/server/src/services/release-action.d.ts.map +1 -0
  81. package/dist/server/src/services/release.d.ts +7 -42
  82. package/dist/server/src/services/release.d.ts.map +1 -1
  83. package/dist/server/src/services/scheduling.d.ts +1 -1
  84. package/dist/server/src/services/scheduling.d.ts.map +1 -1
  85. package/dist/server/src/services/settings.d.ts +13 -0
  86. package/dist/server/src/services/settings.d.ts.map +1 -0
  87. package/dist/server/src/services/validation.d.ts +2 -2
  88. package/dist/server/src/services/validation.d.ts.map +1 -1
  89. package/dist/server/src/utils/index.d.ts +33 -12
  90. package/dist/server/src/utils/index.d.ts.map +1 -1
  91. package/dist/shared/contracts/release-actions.d.ts +6 -5
  92. package/dist/shared/contracts/release-actions.d.ts.map +1 -1
  93. package/dist/shared/contracts/releases.d.ts +23 -6
  94. package/dist/shared/contracts/releases.d.ts.map +1 -1
  95. package/dist/shared/contracts/settings.d.ts +39 -0
  96. package/dist/shared/contracts/settings.d.ts.map +1 -0
  97. package/dist/shared/validation-schemas.d.ts +1 -0
  98. package/dist/shared/validation-schemas.d.ts.map +1 -1
  99. package/package.json +19 -18
  100. package/dist/_chunks/App-1LckaIGY.js.map +0 -1
  101. package/dist/_chunks/App-X01LBg5V.mjs.map +0 -1
  102. package/dist/_chunks/PurchaseContentReleases-Clm0iACO.mjs.map +0 -1
  103. package/dist/_chunks/PurchaseContentReleases-YhAPgpG9.js.map +0 -1
  104. package/dist/_chunks/en-RdapH-9X.mjs.map +0 -1
  105. package/dist/_chunks/en-faJDuv3q.js.map +0 -1
  106. package/dist/_chunks/index-OD9AlD-6.mjs.map +0 -1
  107. package/dist/_chunks/index-cYWov2wa.js.map +0 -1
  108. package/dist/admin/src/components/CMReleasesContainer.d.ts +0 -1
  109. package/dist/admin/src/services/axios.d.ts +0 -29
@@ -1,21 +1,23 @@
1
1
  import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
- import { useNotification, useAPIErrorHandler, useQueryParams, useLicenseLimits, useTracking, useRBAC, Page, Pagination, ConfirmDialog, BackButton, Table, unstable_useDocument } from "@strapi/admin/strapi-admin";
3
- import { useLocation, useNavigate, useParams, Navigate, Link as Link$1, Routes, Route } from "react-router-dom";
4
- import { g as getTimezoneOffset, p as pluginId, u as useGetReleasesQuery, a as useCreateReleaseMutation, P as PERMISSIONS, i as isAxiosError, b as useGetReleaseQuery, c as useUpdateReleaseMutation, d as useDeleteReleaseMutation, e as usePublishReleaseMutation, f as useGetReleaseActionsQuery, h as useUpdateReleaseActionMutation, R as ReleaseActionOptions, j as ReleaseActionMenu, r as releaseApi } from "./index-OD9AlD-6.mjs";
2
+ import { useNotification, useAPIErrorHandler, useQueryParams, useTracking, useRBAC, Page, Layouts, Pagination, isFetchError, ConfirmDialog, BackButton, useStrapiApp, Table } from "@strapi/admin/strapi-admin";
3
+ import { useLocation, useNavigate, NavLink, 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, b as useGetReleaseQuery, c as useUpdateReleaseMutation, d as useDeleteReleaseMutation, e as usePublishReleaseMutation, f as useGetReleaseActionsQuery, h as useUpdateReleaseActionMutation, R as ReleaseActionOptions, i as ReleaseActionMenu, r as releaseApi } from "./index-LUuvped4.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";
7
- import { Link, Menu, LinkButton } from "@strapi/design-system/v2";
8
- import { Plus, EmptyDocuments, Pencil, Trash, More, CrossCircle, CheckCircle } from "@strapi/icons";
6
+ import { unstable_useDocument } from "@strapi/content-manager/strapi-admin";
7
+ import { Modal, Flex, Field, TextInput, Box, Checkbox, Typography, DatePicker, TimePicker, Button, Combobox, ComboboxOption, Link, Alert, Main, Tabs, Divider, EmptyStateLayout, Grid, Badge, MenuItem, Dialog, SimpleMenu, LinkButton, SingleSelect, SingleSelectOption, Tr, Td, Tooltip } from "@strapi/design-system";
8
+ import { Plus, Pencil, Trash, More, CrossCircle, CheckCircle, ArrowsCounterClockwise } from "@strapi/icons";
9
+ import { EmptyDocuments } from "@strapi/icons/symbols";
9
10
  import format from "date-fns/format";
10
11
  import { utcToZonedTime, zonedTimeToUtc } from "date-fns-tz";
11
12
  import { useIntl } from "react-intl";
12
- import styled from "styled-components";
13
- import { intervalToDuration, isPast, formatISO, parse } from "date-fns";
13
+ import { styled } from "styled-components";
14
+ import { intervalToDuration, isPast, formatISO } from "date-fns";
14
15
  import { Formik, Form, useFormikContext } from "formik";
15
16
  import * as yup from "yup";
16
17
  import { useDispatch } from "react-redux";
18
+ import { useLicenseLimits } from "@strapi/admin/strapi-admin/ee";
17
19
  const intervals = ["years", "months", "days", "hours", "minutes", "seconds"];
18
- const RelativeTime = React.forwardRef(
20
+ const RelativeTime$1 = React.forwardRef(
19
21
  ({ timestamp, customIntervals = [], ...restProps }, forwardedRef) => {
20
22
  const { formatRelativeTime, formatDate, formatTime } = useIntl();
21
23
  const interval = intervalToDuration({
@@ -64,8 +66,12 @@ const RELEASE_SCHEMA = yup.object().shape({
64
66
  otherwise: yup.string().nullable()
65
67
  })
66
68
  }).required().noUnknown();
69
+ yup.object().shape({
70
+ defaultTimezone: yup.string().nullable().default(null)
71
+ }).required().noUnknown();
67
72
  const ReleaseModal = ({
68
73
  handleClose,
74
+ open,
69
75
  handleSubmit,
70
76
  initialValues,
71
77
  isLoading = false
@@ -80,9 +86,8 @@ const ReleaseModal = ({
80
86
  const { date, time, timezone } = values;
81
87
  if (!date || !time || !timezone)
82
88
  return null;
83
- const formattedDate = parse(time, "HH:mm", new Date(date));
84
89
  const timezoneWithoutOffset = timezone.split("&")[1];
85
- return zonedTimeToUtc(formattedDate, timezoneWithoutOffset);
90
+ return zonedTimeToUtc(`${date} ${time}`, timezoneWithoutOffset);
86
91
  };
87
92
  const getTimezoneWithOffset = () => {
88
93
  const currentTimezone = timezoneList.find(
@@ -90,8 +95,8 @@ const ReleaseModal = ({
90
95
  );
91
96
  return currentTimezone?.value || systemTimezone.value;
92
97
  };
93
- return /* @__PURE__ */ jsxs(ModalLayout, { onClose: handleClose, labelledBy: "title", children: [
94
- /* @__PURE__ */ jsx(ModalHeader, { children: /* @__PURE__ */ jsx(Typography, { id: "title", fontWeight: "bold", textColor: "neutral800", children: formatMessage(
98
+ return /* @__PURE__ */ jsx(Modal.Root, { open, onOpenChange: handleClose, children: /* @__PURE__ */ jsxs(Modal.Content, { children: [
99
+ /* @__PURE__ */ jsx(Modal.Header, { children: /* @__PURE__ */ jsx(Modal.Title, { children: formatMessage(
95
100
  {
96
101
  id: "content-releases.modal.title",
97
102
  defaultMessage: "{isCreatingRelease, select, true {New release} other {Edit release}}"
@@ -114,123 +119,119 @@ const ReleaseModal = ({
114
119
  },
115
120
  validationSchema: RELEASE_SCHEMA,
116
121
  validateOnChange: false,
117
- children: ({ values, errors, handleChange, setFieldValue }) => /* @__PURE__ */ jsxs(Form, { children: [
118
- /* @__PURE__ */ jsx(ModalBody, { children: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 6, children: [
119
- /* @__PURE__ */ jsx(
120
- TextInput,
121
- {
122
- label: formatMessage({
122
+ children: ({ values, errors, handleChange, setFieldValue }) => {
123
+ return /* @__PURE__ */ jsxs(Form, { children: [
124
+ /* @__PURE__ */ jsx(Modal.Body, { children: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 6, children: [
125
+ /* @__PURE__ */ jsxs(Field.Root, { name: "name", error: errors.name, required: true, children: [
126
+ /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
123
127
  id: "content-releases.modal.form.input.label.release-name",
124
128
  defaultMessage: "Name"
125
- }),
126
- name: "name",
127
- value: values.name,
128
- error: errors.name,
129
- onChange: handleChange,
130
- required: true
131
- }
132
- ),
133
- /* @__PURE__ */ jsx(Box, { width: "max-content", children: /* @__PURE__ */ jsx(
134
- Checkbox,
135
- {
136
- name: "isScheduled",
137
- value: values.isScheduled,
138
- onChange: (event) => {
139
- setFieldValue("isScheduled", event.target.checked);
140
- if (!event.target.checked) {
141
- setFieldValue("date", null);
142
- setFieldValue("time", "");
143
- setFieldValue("timezone", null);
144
- } else {
145
- setFieldValue("date", initialValues.date);
146
- setFieldValue("time", initialValues.time);
147
- setFieldValue("timezone", initialValues.timezone ?? systemTimezone?.value);
148
- }
149
- },
150
- children: /* @__PURE__ */ jsx(
151
- Typography,
152
- {
153
- textColor: values.isScheduled ? "primary600" : "neutral800",
154
- fontWeight: values.isScheduled ? "semiBold" : "regular",
155
- children: formatMessage({
156
- id: "modal.form.input.label.schedule-release",
157
- defaultMessage: "Schedule release"
158
- })
159
- }
160
- )
161
- }
162
- ) }),
163
- values.isScheduled && /* @__PURE__ */ jsxs(Fragment, { children: [
164
- /* @__PURE__ */ jsxs(Flex, { gap: 4, alignItems: "start", children: [
165
- /* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsx(
166
- DatePicker,
167
- {
168
- label: formatMessage({
129
+ }) }),
130
+ /* @__PURE__ */ jsx(TextInput, { value: values.name, onChange: handleChange }),
131
+ /* @__PURE__ */ jsx(Field.Error, {})
132
+ ] }),
133
+ /* @__PURE__ */ jsx(Box, { width: "max-content", children: /* @__PURE__ */ jsx(
134
+ Checkbox,
135
+ {
136
+ name: "isScheduled",
137
+ checked: values.isScheduled,
138
+ onCheckedChange: (checked) => {
139
+ setFieldValue("isScheduled", checked);
140
+ if (!checked) {
141
+ setFieldValue("date", null);
142
+ setFieldValue("time", "");
143
+ setFieldValue("timezone", null);
144
+ } else {
145
+ setFieldValue("date", initialValues.date);
146
+ setFieldValue("time", initialValues.time);
147
+ setFieldValue(
148
+ "timezone",
149
+ initialValues.timezone ?? systemTimezone?.value
150
+ );
151
+ }
152
+ },
153
+ children: /* @__PURE__ */ jsx(
154
+ Typography,
155
+ {
156
+ textColor: values.isScheduled ? "primary600" : "neutral800",
157
+ fontWeight: values.isScheduled ? "semiBold" : "regular",
158
+ children: formatMessage({
159
+ id: "modal.form.input.label.schedule-release",
160
+ defaultMessage: "Schedule release"
161
+ })
162
+ }
163
+ )
164
+ }
165
+ ) }),
166
+ values.isScheduled && /* @__PURE__ */ jsxs(Fragment, { children: [
167
+ /* @__PURE__ */ jsxs(Flex, { gap: 4, alignItems: "start", children: [
168
+ /* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsxs(Field.Root, { name: "date", error: errors.date, required: true, children: [
169
+ /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
169
170
  id: "content-releases.modal.form.input.label.date",
170
171
  defaultMessage: "Date"
171
- }),
172
- name: "date",
173
- error: errors.date,
174
- onChange: (date) => {
175
- const isoFormatDate = date ? formatISO(date, { representation: "date" }) : null;
176
- setFieldValue("date", isoFormatDate);
177
- },
178
- clearLabel: formatMessage({
179
- id: "content-releases.modal.form.input.clearLabel",
180
- defaultMessage: "Clear"
181
- }),
182
- onClear: () => {
183
- setFieldValue("date", null);
184
- },
185
- selectedDate: values.date || void 0,
186
- required: true,
187
- minDate: utcToZonedTime(/* @__PURE__ */ new Date(), values.timezone.split("&")[1])
188
- }
189
- ) }),
190
- /* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsx(
191
- TimePicker,
192
- {
193
- label: formatMessage({
172
+ }) }),
173
+ /* @__PURE__ */ jsx(
174
+ DatePicker,
175
+ {
176
+ onChange: (date) => {
177
+ const isoFormatDate = date ? formatISO(date, { representation: "date" }) : null;
178
+ setFieldValue("date", isoFormatDate);
179
+ },
180
+ clearLabel: formatMessage({
181
+ id: "content-releases.modal.form.input.clearLabel",
182
+ defaultMessage: "Clear"
183
+ }),
184
+ onClear: () => {
185
+ setFieldValue("date", null);
186
+ },
187
+ value: values.date ? new Date(values.date) : /* @__PURE__ */ new Date(),
188
+ minDate: utcToZonedTime(/* @__PURE__ */ new Date(), values.timezone.split("&")[1])
189
+ }
190
+ ),
191
+ /* @__PURE__ */ jsx(Field.Error, {})
192
+ ] }) }),
193
+ /* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsxs(Field.Root, { name: "time", error: errors.time, required: true, children: [
194
+ /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
194
195
  id: "content-releases.modal.form.input.label.time",
195
196
  defaultMessage: "Time"
196
- }),
197
- name: "time",
198
- error: errors.time,
199
- onChange: (time) => {
200
- setFieldValue("time", time);
201
- },
202
- clearLabel: formatMessage({
203
- id: "content-releases.modal.form.input.clearLabel",
204
- defaultMessage: "Clear"
205
- }),
206
- onClear: () => {
207
- setFieldValue("time", "");
208
- },
209
- value: values.time || void 0,
210
- required: true
211
- }
212
- ) })
213
- ] }),
214
- /* @__PURE__ */ jsx(TimezoneComponent, { timezoneOptions: timezoneList })
215
- ] })
216
- ] }) }),
217
- /* @__PURE__ */ jsx(
218
- ModalFooter,
219
- {
220
- startActions: /* @__PURE__ */ jsx(Button, { onClick: handleClose, variant: "tertiary", name: "cancel", children: formatMessage({ id: "cancel", defaultMessage: "Cancel" }) }),
221
- endActions: /* @__PURE__ */ jsx(Button, { name: "submit", loading: isLoading, type: "submit", children: formatMessage(
197
+ }) }),
198
+ /* @__PURE__ */ jsx(
199
+ TimePicker,
200
+ {
201
+ onChange: (time) => {
202
+ setFieldValue("time", time);
203
+ },
204
+ clearLabel: formatMessage({
205
+ id: "content-releases.modal.form.input.clearLabel",
206
+ defaultMessage: "Clear"
207
+ }),
208
+ onClear: () => {
209
+ setFieldValue("time", "");
210
+ },
211
+ value: values.time || void 0
212
+ }
213
+ ),
214
+ /* @__PURE__ */ jsx(Field.Error, {})
215
+ ] }) })
216
+ ] }),
217
+ /* @__PURE__ */ jsx(TimezoneComponent, { timezoneOptions: timezoneList })
218
+ ] })
219
+ ] }) }),
220
+ /* @__PURE__ */ jsxs(Modal.Footer, { children: [
221
+ /* @__PURE__ */ jsx(Modal.Close, { children: /* @__PURE__ */ jsx(Button, { variant: "tertiary", name: "cancel", children: formatMessage({ id: "cancel", defaultMessage: "Cancel" }) }) }),
222
+ /* @__PURE__ */ jsx(Button, { name: "submit", loading: isLoading, type: "submit", children: formatMessage(
222
223
  {
223
224
  id: "content-releases.modal.form.button.submit",
224
225
  defaultMessage: "{isCreatingRelease, select, true {Continue} other {Save}}"
225
226
  },
226
227
  { isCreatingRelease }
227
228
  ) })
228
- }
229
- )
230
- ] })
229
+ ] })
230
+ ] });
231
+ }
231
232
  }
232
233
  )
233
- ] });
234
+ ] }) });
234
235
  };
235
236
  const getTimezones = (selectedDate) => {
236
237
  const timezoneList = Intl.supportedValuesOf("timeZone").map((timezone) => {
@@ -256,38 +257,44 @@ const TimezoneComponent = ({ timezoneOptions }) => {
256
257
  }
257
258
  }
258
259
  }, [setFieldValue, values.date, values.timezone]);
259
- return /* @__PURE__ */ jsx(
260
- Combobox,
261
- {
262
- label: formatMessage({
263
- id: "content-releases.modal.form.input.label.timezone",
264
- defaultMessage: "Timezone"
265
- }),
266
- autocomplete: { type: "list", filter: "contains" },
267
- name: "timezone",
268
- value: values.timezone || void 0,
269
- textValue: values.timezone ? values.timezone.replace(/&/, " ") : void 0,
270
- onChange: (timezone) => {
271
- setFieldValue("timezone", timezone);
272
- },
273
- onTextValueChange: (timezone) => {
274
- setFieldValue("timezone", timezone);
275
- },
276
- onClear: () => {
277
- setFieldValue("timezone", "");
278
- },
279
- error: errors.timezone,
280
- required: true,
281
- children: timezoneList.map((timezone) => /* @__PURE__ */ jsx(ComboboxOption, { value: timezone.value, children: timezone.value.replace(/&/, " ") }, timezone.value))
282
- }
283
- );
260
+ return /* @__PURE__ */ jsxs(Field.Root, { name: "timezone", error: errors.timezone, required: true, children: [
261
+ /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
262
+ id: "content-releases.modal.form.input.label.timezone",
263
+ defaultMessage: "Timezone"
264
+ }) }),
265
+ /* @__PURE__ */ jsx(
266
+ Combobox,
267
+ {
268
+ autocomplete: { type: "list", filter: "contains" },
269
+ value: values.timezone || void 0,
270
+ textValue: values.timezone ? values.timezone.replace(/&/, " ") : void 0,
271
+ onChange: (timezone) => {
272
+ setFieldValue("timezone", timezone);
273
+ },
274
+ onTextValueChange: (timezone) => {
275
+ setFieldValue("timezone", timezone);
276
+ },
277
+ onClear: () => {
278
+ setFieldValue("timezone", "");
279
+ },
280
+ children: timezoneList.map((timezone) => /* @__PURE__ */ jsx(ComboboxOption, { value: timezone.value, children: timezone.value.replace(/&/, " ") }, timezone.value))
281
+ }
282
+ ),
283
+ /* @__PURE__ */ jsx(Field.Error, {})
284
+ ] });
284
285
  };
285
286
  const useTypedDispatch = useDispatch;
287
+ const isBaseQueryError = (error) => {
288
+ return typeof error !== "undefined" && error.name !== void 0;
289
+ };
286
290
  const LinkCard = styled(Link)`
287
291
  display: block;
288
292
  `;
289
- const CapitalizeRelativeTime = styled(RelativeTime)`
290
- text-transform: capitalize;
293
+ const RelativeTime = styled(RelativeTime$1)`
294
+ display: inline-block;
295
+ &::first-letter {
296
+ text-transform: uppercase;
297
+ }
291
298
  `;
292
299
  const getBadgeProps = (status) => {
293
300
  let color;
@@ -332,11 +339,11 @@ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
332
339
  target: sectionTitle
333
340
  }
334
341
  ),
335
- icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "10rem" })
342
+ icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "16rem" })
336
343
  }
337
344
  );
338
345
  }
339
- 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(
346
+ return /* @__PURE__ */ jsx(Grid.Root, { gap: 4, children: releases.map(({ id, name, scheduledAt, status }) => /* @__PURE__ */ jsx(Grid.Item, { col: 3, s: 6, xs: 12, children: /* @__PURE__ */ jsx(LinkCard, { tag: NavLink, to: `${id}`, isExternal: false, children: /* @__PURE__ */ jsxs(
340
347
  Flex,
341
348
  {
342
349
  direction: "column",
@@ -351,8 +358,8 @@ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
351
358
  gap: 4,
352
359
  children: [
353
360
  /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "start", gap: 1, children: [
354
- /* @__PURE__ */ jsx(Typography, { as: "h3", variant: "delta", fontWeight: "bold", children: name }),
355
- /* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: scheduledAt ? /* @__PURE__ */ jsx(CapitalizeRelativeTime, { timestamp: new Date(scheduledAt) }) : formatMessage({
361
+ /* @__PURE__ */ jsx(Typography, { textColor: "neutral800", tag: "h3", variant: "delta", fontWeight: "bold", children: name }),
362
+ /* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: scheduledAt ? /* @__PURE__ */ jsx(RelativeTime, { timestamp: new Date(scheduledAt) }) : formatMessage({
356
363
  id: "content-releases.pages.Releases.not-scheduled",
357
364
  defaultMessage: "Not scheduled"
358
365
  }) })
@@ -372,14 +379,13 @@ const StyledAlert = styled(Alert)`
372
379
  `;
373
380
  const INITIAL_FORM_VALUES = {
374
381
  name: "",
375
- date: null,
382
+ date: void 0,
376
383
  time: "",
377
384
  isScheduled: true,
378
385
  scheduledAt: null,
379
386
  timezone: null
380
387
  };
381
388
  const ReleasesPage = () => {
382
- const tabRef = React.useRef(null);
383
389
  const location = useLocation();
384
390
  const [releaseModalShown, setReleaseModalShown] = React.useState(false);
385
391
  const { toggleNotification } = useNotification();
@@ -397,7 +403,6 @@ const ReleasesPage = () => {
397
403
  } = useRBAC(PERMISSIONS);
398
404
  const { isLoading, isSuccess, isError } = response;
399
405
  const activeTab = response?.currentData?.meta?.activeTab || "pending";
400
- const activeTabIndex = ["pending", "done"].indexOf(activeTab);
401
406
  React.useEffect(() => {
402
407
  if (location?.state?.errors) {
403
408
  toggleNotification({
@@ -414,11 +419,6 @@ const ReleasesPage = () => {
414
419
  navigate("", { replace: true, state: null });
415
420
  }
416
421
  }, [formatMessage, location?.state?.errors, navigate, toggleNotification]);
417
- React.useEffect(() => {
418
- if (tabRef.current) {
419
- tabRef.current._handlers.setSelectedTabIndex(activeTabIndex);
420
- }
421
- }, [activeTabIndex]);
422
422
  const toggleAddReleaseModal = () => {
423
423
  setReleaseModalShown((prev) => !prev);
424
424
  };
@@ -427,14 +427,14 @@ const ReleasesPage = () => {
427
427
  }
428
428
  const totalPendingReleases = isSuccess && response.currentData?.meta?.pendingReleasesCount || 0;
429
429
  const hasReachedMaximumPendingReleases = totalPendingReleases >= maximumReleases;
430
- const handleTabChange = (index) => {
430
+ const handleTabChange = (tabValue) => {
431
431
  setQuery({
432
432
  ...query,
433
433
  page: 1,
434
434
  pageSize: response?.currentData?.meta?.pagination?.pageSize || 16,
435
435
  filters: {
436
436
  releasedAt: {
437
- $notNull: index === 0 ? false : true
437
+ $notNull: tabValue !== "pending"
438
438
  }
439
439
  }
440
440
  });
@@ -455,7 +455,7 @@ const ReleasesPage = () => {
455
455
  });
456
456
  trackUsage("didCreateRelease");
457
457
  navigate(response2.data.data.id.toString());
458
- } else if (isAxiosError(response2.error)) {
458
+ } else if (isFetchError(response2.error)) {
459
459
  toggleNotification({
460
460
  type: "danger",
461
461
  message: formatAPIError(response2.error)
@@ -469,7 +469,7 @@ const ReleasesPage = () => {
469
469
  };
470
470
  return /* @__PURE__ */ jsxs(Main, { "aria-busy": isLoading, children: [
471
471
  /* @__PURE__ */ jsx(
472
- HeaderLayout,
472
+ Layouts.Header,
473
473
  {
474
474
  title: formatMessage({
475
475
  id: "content-releases.pages.Releases.title",
@@ -493,7 +493,7 @@ const ReleasesPage = () => {
493
493
  ) : null
494
494
  }
495
495
  ),
496
- /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsxs(Fragment, { children: [
496
+ /* @__PURE__ */ jsx(Layouts.Content, { children: /* @__PURE__ */ jsxs(Fragment, { children: [
497
497
  hasReachedMaximumPendingReleases && /* @__PURE__ */ jsx(
498
498
  StyledAlert,
499
499
  {
@@ -518,21 +518,17 @@ const ReleasesPage = () => {
518
518
  })
519
519
  }
520
520
  ),
521
- /* @__PURE__ */ jsxs(
522
- TabGroup,
523
- {
524
- label: formatMessage({
525
- id: "content-releases.pages.Releases.tab-group.label",
526
- defaultMessage: "Releases list"
527
- }),
528
- variant: "simple",
529
- initialSelectedTabIndex: activeTabIndex,
530
- onTabChange: handleTabChange,
531
- ref: tabRef,
532
- children: [
533
- /* @__PURE__ */ jsxs(Box, { paddingBottom: 8, children: [
534
- /* @__PURE__ */ jsxs(Tabs, { children: [
535
- /* @__PURE__ */ jsx(Tab, { children: formatMessage(
521
+ /* @__PURE__ */ jsxs(Tabs.Root, { variant: "simple", onValueChange: handleTabChange, value: activeTab, children: [
522
+ /* @__PURE__ */ jsxs(Box, { paddingBottom: 8, children: [
523
+ /* @__PURE__ */ jsxs(
524
+ Tabs.List,
525
+ {
526
+ "aria-label": formatMessage({
527
+ id: "content-releases.pages.Releases.tab-group.label",
528
+ defaultMessage: "Releases list"
529
+ }),
530
+ children: [
531
+ /* @__PURE__ */ jsx(Tabs.Trigger, { value: "pending", children: formatMessage(
536
532
  {
537
533
  id: "content-releases.pages.Releases.tab.pending",
538
534
  defaultMessage: "Pending ({count})"
@@ -541,34 +537,32 @@ const ReleasesPage = () => {
541
537
  count: totalPendingReleases
542
538
  }
543
539
  ) }),
544
- /* @__PURE__ */ jsx(Tab, { children: formatMessage({
540
+ /* @__PURE__ */ jsx(Tabs.Trigger, { value: "done", children: formatMessage({
545
541
  id: "content-releases.pages.Releases.tab.done",
546
542
  defaultMessage: "Done"
547
543
  }) })
548
- ] }),
549
- /* @__PURE__ */ jsx(Divider, {})
550
- ] }),
551
- /* @__PURE__ */ jsxs(TabPanels, { children: [
552
- /* @__PURE__ */ jsx(TabPanel, { children: /* @__PURE__ */ jsx(
553
- ReleasesGrid,
554
- {
555
- sectionTitle: "pending",
556
- releases: response?.currentData?.data,
557
- isError
558
- }
559
- ) }),
560
- /* @__PURE__ */ jsx(TabPanel, { children: /* @__PURE__ */ jsx(
561
- ReleasesGrid,
562
- {
563
- sectionTitle: "done",
564
- releases: response?.currentData?.data,
565
- isError
566
- }
567
- ) })
568
- ] })
569
- ]
570
- }
571
- ),
544
+ ]
545
+ }
546
+ ),
547
+ /* @__PURE__ */ jsx(Divider, {})
548
+ ] }),
549
+ /* @__PURE__ */ jsx(Tabs.Content, { value: "pending", children: /* @__PURE__ */ jsx(
550
+ ReleasesGrid,
551
+ {
552
+ sectionTitle: "pending",
553
+ releases: response?.currentData?.data,
554
+ isError
555
+ }
556
+ ) }),
557
+ /* @__PURE__ */ jsx(Tabs.Content, { value: "done", children: /* @__PURE__ */ jsx(
558
+ ReleasesGrid,
559
+ {
560
+ sectionTitle: "done",
561
+ releases: response?.currentData?.data,
562
+ isError
563
+ }
564
+ ) })
565
+ ] }),
572
566
  /* @__PURE__ */ jsxs(
573
567
  Pagination.Root,
574
568
  {
@@ -581,9 +575,10 @@ const ReleasesPage = () => {
581
575
  }
582
576
  )
583
577
  ] }) }),
584
- releaseModalShown && /* @__PURE__ */ jsx(
578
+ /* @__PURE__ */ jsx(
585
579
  ReleaseModal,
586
580
  {
581
+ open: releaseModalShown,
587
582
  handleClose: toggleAddReleaseModal,
588
583
  handleSubmit: handleAddRelease,
589
584
  isLoading: isSubmittingForm,
@@ -598,7 +593,7 @@ const ReleaseInfoWrapper = styled(Flex)`
598
593
  border-bottom-left-radius: ${({ theme }) => theme.borderRadius};
599
594
  border-top: 1px solid ${({ theme }) => theme.colors.neutral150};
600
595
  `;
601
- const StyledMenuItem = styled(Menu.Item)`
596
+ const StyledMenuItem = styled(MenuItem)`
602
597
  svg path {
603
598
  fill: ${({ theme, disabled }) => disabled && theme.colors.neutral500};
604
599
  }
@@ -607,7 +602,7 @@ const StyledMenuItem = styled(Menu.Item)`
607
602
  }
608
603
 
609
604
  &:hover {
610
- background: ${({ theme, variant = "neutral" }) => theme.colors[`${variant}100`]};
605
+ background: ${({ theme, $variant = "neutral" }) => theme.colors[`${$variant}100`]};
611
606
  }
612
607
  `;
613
608
  const PencilIcon = styled(Pencil)`
@@ -627,44 +622,75 @@ const TrashIcon = styled(Trash)`
627
622
  const TypographyMaxWidth = styled(Typography)`
628
623
  max-width: 300px;
629
624
  `;
630
- const EntryValidationText = ({ action, schema, entry }) => {
625
+ const EntryValidationText = ({ action, schema, entry, status }) => {
631
626
  const { formatMessage } = useIntl();
632
- const { validate } = unstable_useDocument(
627
+ const { validate, isLoading } = unstable_useDocument(
633
628
  {
634
629
  collectionType: schema?.kind ?? "",
635
630
  model: schema?.uid ?? ""
636
631
  },
637
632
  {
638
- skip: !schema
633
+ // useDocument makes a request to get more data about the entry, but we only want to have the validation function so we skip the request
634
+ skip: true
639
635
  }
640
636
  );
641
- const errors = validate(entry) ?? {};
642
- if (Object.keys(errors).length > 0) {
643
- const validationErrorsMessages = Object.entries(errors).map(
644
- ([key, value]) => formatMessage(
645
- { id: `${value.id}.withField`, defaultMessage: value.defaultMessage },
646
- { field: key }
647
- )
648
- ).join(" ");
649
- return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
650
- /* @__PURE__ */ jsx(Icon, { color: "danger600", as: CrossCircle }),
651
- /* @__PURE__ */ jsx(Tooltip, { description: validationErrorsMessages, children: /* @__PURE__ */ jsx(TypographyMaxWidth, { textColor: "danger600", variant: "omega", fontWeight: "semiBold", ellipsis: true, children: validationErrorsMessages }) })
652
- ] });
637
+ if (isLoading) {
638
+ return null;
653
639
  }
654
- if (action == "publish") {
655
- return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
656
- /* @__PURE__ */ jsx(Icon, { color: "success600", as: CheckCircle }),
657
- entry.publishedAt ? /* @__PURE__ */ jsx(Typography, { textColor: "success600", fontWeight: "bold", children: formatMessage({
658
- id: "content-releases.pages.ReleaseDetails.entry-validation.already-published",
659
- defaultMessage: "Already published"
660
- }) }) : /* @__PURE__ */ jsx(Typography, { children: formatMessage({
661
- id: "content-releases.pages.ReleaseDetails.entry-validation.ready-to-publish",
662
- defaultMessage: "Ready to publish"
663
- }) })
664
- ] });
640
+ const errors = validate(entry) ?? {};
641
+ if (action === "publish") {
642
+ if (Object.keys(errors).length > 0) {
643
+ const validationErrorsMessages = Object.entries(errors).map(
644
+ ([key, value]) => formatMessage(
645
+ // @ts-expect-error – TODO: fix this will better checks
646
+ { id: `${value.id}.withField`, defaultMessage: value.defaultMessage },
647
+ { field: key }
648
+ )
649
+ ).join(" ");
650
+ return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
651
+ /* @__PURE__ */ jsx(CrossCircle, { fill: "danger600" }),
652
+ /* @__PURE__ */ jsx(Tooltip, { description: validationErrorsMessages, children: /* @__PURE__ */ jsx(
653
+ TypographyMaxWidth,
654
+ {
655
+ textColor: "danger600",
656
+ variant: "omega",
657
+ fontWeight: "semiBold",
658
+ ellipsis: true,
659
+ children: validationErrorsMessages
660
+ }
661
+ ) })
662
+ ] });
663
+ }
664
+ if (status === "draft") {
665
+ return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
666
+ /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
667
+ /* @__PURE__ */ jsx(Typography, { children: formatMessage({
668
+ id: "content-releases.pages.ReleaseDetails.entry-validation.ready-to-publish",
669
+ defaultMessage: "Ready to publish"
670
+ }) })
671
+ ] });
672
+ }
673
+ if (status === "modified") {
674
+ return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
675
+ /* @__PURE__ */ jsx(ArrowsCounterClockwise, { fill: "alternative600" }),
676
+ /* @__PURE__ */ jsx(Typography, { children: formatMessage({
677
+ id: "content-releases.pages.ReleaseDetails.entry-validation.modified",
678
+ defaultMessage: "Ready to publish changes"
679
+ }) })
680
+ ] });
681
+ }
682
+ if (status === "published") {
683
+ return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
684
+ /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
685
+ /* @__PURE__ */ jsx(Typography, { children: formatMessage({
686
+ id: "content-releases.pages.ReleaseDetails.entry-validation.already-published",
687
+ defaultMessage: "Already published"
688
+ }) })
689
+ ] });
690
+ }
665
691
  }
666
692
  return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
667
- /* @__PURE__ */ jsx(Icon, { color: "success600", as: CheckCircle }),
693
+ /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
668
694
  !entry.publishedAt ? /* @__PURE__ */ jsx(Typography, { textColor: "success600", fontWeight: "bold", children: formatMessage({
669
695
  id: "content-releases.pages.ReleaseDetails.entry-validation.already-unpublished",
670
696
  defaultMessage: "Already unpublished"
@@ -684,7 +710,6 @@ const ReleaseDetailsLayout = ({
684
710
  const {
685
711
  data,
686
712
  isLoading: isLoadingDetails,
687
- isError,
688
713
  error
689
714
  } = useGetReleaseQuery(
690
715
  { id: releaseId },
@@ -716,7 +741,7 @@ const ReleaseDetailsLayout = ({
716
741
  totalPublishedEntries,
717
742
  totalUnpublishedEntries
718
743
  });
719
- } else if (isAxiosError(response.error)) {
744
+ } else if (isFetchError(response.error)) {
720
745
  toggleNotification({
721
746
  type: "danger",
722
747
  message: formatAPIError(response.error)
@@ -751,7 +776,7 @@ const ReleaseDetailsLayout = ({
751
776
  if (isLoadingDetails) {
752
777
  return /* @__PURE__ */ jsx(Page.Loading, {});
753
778
  }
754
- if (isError || !release) {
779
+ if (isBaseQueryError(error) && "code" in error || !release) {
755
780
  return /* @__PURE__ */ jsx(
756
781
  Navigate,
757
782
  {
@@ -759,6 +784,7 @@ const ReleaseDetailsLayout = ({
759
784
  state: {
760
785
  errors: [
761
786
  {
787
+ // @ts-expect-error – TODO: fix this weird error flow
762
788
  code: error?.code
763
789
  }
764
790
  ]
@@ -798,7 +824,7 @@ const ReleaseDetailsLayout = ({
798
824
  ) : "";
799
825
  return /* @__PURE__ */ jsxs(Main, { "aria-busy": isLoadingDetails, children: [
800
826
  /* @__PURE__ */ jsx(
801
- HeaderLayout,
827
+ Layouts.Header,
802
828
  {
803
829
  title: release.name,
804
830
  subtitle: /* @__PURE__ */ jsxs(Flex, { gap: 2, lineHeight: 6, children: [
@@ -807,84 +833,71 @@ const ReleaseDetailsLayout = ({
807
833
  ] }),
808
834
  navigationAction: /* @__PURE__ */ jsx(BackButton, {}),
809
835
  primaryAction: !release.releasedAt && /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
810
- /* @__PURE__ */ jsxs(Menu.Root, { children: [
811
- /* @__PURE__ */ jsx(
812
- Menu.Trigger,
813
- {
814
- as: IconButton,
815
- paddingLeft: 2,
816
- paddingRight: 2,
817
- "aria-label": formatMessage({
818
- id: "content-releases.header.actions.open-release-actions",
819
- defaultMessage: "Release edit and delete menu"
820
- }),
821
- icon: /* @__PURE__ */ jsx(More, {}),
822
- variant: "tertiary"
823
- }
824
- ),
825
- /* @__PURE__ */ jsxs(Menu.Content, { top: 1, popoverPlacement: "bottom-end", children: [
826
- /* @__PURE__ */ jsxs(
827
- Flex,
828
- {
829
- alignItems: "center",
830
- justifyContent: "center",
831
- direction: "column",
832
- padding: 1,
833
- width: "100%",
834
- children: [
835
- /* @__PURE__ */ jsx(StyledMenuItem, { disabled: !canUpdate, onSelect: toggleEditReleaseModal, children: /* @__PURE__ */ jsxs(Flex, { alignItems: "center", gap: 2, hasRadius: true, width: "100%", children: [
836
- /* @__PURE__ */ jsx(PencilIcon, {}),
837
- /* @__PURE__ */ jsx(Typography, { ellipsis: true, children: formatMessage({
838
- id: "content-releases.header.actions.edit",
839
- defaultMessage: "Edit"
836
+ /* @__PURE__ */ jsxs(
837
+ SimpleMenu,
838
+ {
839
+ label: /* @__PURE__ */ jsx(More, {}),
840
+ variant: "tertiary",
841
+ endIcon: null,
842
+ paddingLeft: 2,
843
+ paddingRight: 2,
844
+ "aria-label": formatMessage({
845
+ id: "content-releases.header.actions.open-release-actions",
846
+ defaultMessage: "Release edit and delete menu"
847
+ }),
848
+ popoverPlacement: "bottom-end",
849
+ children: [
850
+ /* @__PURE__ */ jsx(StyledMenuItem, { disabled: !canUpdate, onSelect: toggleEditReleaseModal, children: /* @__PURE__ */ jsxs(Flex, { alignItems: "center", gap: 2, hasRadius: true, width: "100%", children: [
851
+ /* @__PURE__ */ jsx(PencilIcon, {}),
852
+ /* @__PURE__ */ jsx(Typography, { ellipsis: true, children: formatMessage({
853
+ id: "content-releases.header.actions.edit",
854
+ defaultMessage: "Edit"
855
+ }) })
856
+ ] }) }),
857
+ /* @__PURE__ */ jsx(
858
+ StyledMenuItem,
859
+ {
860
+ disabled: !canDelete,
861
+ onSelect: toggleWarningSubmit,
862
+ $variant: "danger",
863
+ children: /* @__PURE__ */ jsxs(Flex, { alignItems: "center", gap: 2, hasRadius: true, width: "100%", children: [
864
+ /* @__PURE__ */ jsx(TrashIcon, {}),
865
+ /* @__PURE__ */ jsx(Typography, { ellipsis: true, textColor: "danger600", children: formatMessage({
866
+ id: "content-releases.header.actions.delete",
867
+ defaultMessage: "Delete"
840
868
  }) })
841
- ] }) }),
842
- /* @__PURE__ */ jsx(
843
- StyledMenuItem,
844
- {
845
- disabled: !canDelete,
846
- onSelect: toggleWarningSubmit,
847
- variant: "danger",
848
- children: /* @__PURE__ */ jsxs(Flex, { alignItems: "center", gap: 2, hasRadius: true, width: "100%", children: [
849
- /* @__PURE__ */ jsx(TrashIcon, {}),
850
- /* @__PURE__ */ jsx(Typography, { ellipsis: true, textColor: "danger600", children: formatMessage({
851
- id: "content-releases.header.actions.delete",
852
- defaultMessage: "Delete"
853
- }) })
854
- ] })
855
- }
856
- )
857
- ]
858
- }
859
- ),
860
- /* @__PURE__ */ jsxs(
861
- ReleaseInfoWrapper,
862
- {
863
- direction: "column",
864
- justifyContent: "center",
865
- alignItems: "flex-start",
866
- gap: 1,
867
- padding: 5,
868
- children: [
869
- /* @__PURE__ */ jsx(Typography, { variant: "pi", fontWeight: "bold", children: formatMessage({
870
- id: "content-releases.header.actions.created",
871
- defaultMessage: "Created"
872
- }) }),
873
- /* @__PURE__ */ jsxs(Typography, { variant: "pi", color: "neutral300", children: [
874
- /* @__PURE__ */ jsx(RelativeTime, { timestamp: new Date(release.createdAt) }),
875
- formatMessage(
876
- {
877
- id: "content-releases.header.actions.created.description",
878
- defaultMessage: "{hasCreatedByUser, select, true { by {createdBy}} other { by deleted user}}"
879
- },
880
- { createdBy: getCreatedByUser(), hasCreatedByUser }
881
- )
882
869
  ] })
883
- ]
884
- }
885
- )
886
- ] })
887
- ] }),
870
+ }
871
+ ),
872
+ /* @__PURE__ */ jsxs(
873
+ ReleaseInfoWrapper,
874
+ {
875
+ direction: "column",
876
+ justifyContent: "center",
877
+ alignItems: "flex-start",
878
+ gap: 1,
879
+ padding: 5,
880
+ children: [
881
+ /* @__PURE__ */ jsx(Typography, { variant: "pi", fontWeight: "bold", children: formatMessage({
882
+ id: "content-releases.header.actions.created",
883
+ defaultMessage: "Created"
884
+ }) }),
885
+ /* @__PURE__ */ jsxs(Typography, { variant: "pi", color: "neutral300", children: [
886
+ /* @__PURE__ */ jsx(RelativeTime$1, { timestamp: new Date(release.createdAt) }),
887
+ formatMessage(
888
+ {
889
+ id: "content-releases.header.actions.created.description",
890
+ defaultMessage: "{hasCreatedByUser, select, true { by {createdBy}} other { by deleted user}}"
891
+ },
892
+ { createdBy: getCreatedByUser(), hasCreatedByUser }
893
+ )
894
+ ] })
895
+ ]
896
+ }
897
+ )
898
+ ]
899
+ }
900
+ ),
888
901
  /* @__PURE__ */ jsx(Button, { size: "S", variant: "tertiary", onClick: handleRefresh, children: formatMessage({
889
902
  id: "content-releases.header.actions.refresh",
890
903
  defaultMessage: "Refresh"
@@ -910,6 +923,7 @@ const ReleaseDetailsLayout = ({
910
923
  ] });
911
924
  };
912
925
  const GROUP_BY_OPTIONS = ["contentType", "locale", "action"];
926
+ const GROUP_BY_OPTIONS_NO_LOCALE = ["contentType", "action"];
913
927
  const getGroupByOptionLabel = (value) => {
914
928
  if (value === "locale") {
915
929
  return {
@@ -936,12 +950,24 @@ const ReleaseDetailsBody = ({ releaseId }) => {
936
950
  const {
937
951
  data: releaseData,
938
952
  isLoading: isReleaseLoading,
939
- isError: isReleaseError,
940
953
  error: releaseError
941
954
  } = useGetReleaseQuery({ id: releaseId });
942
955
  const {
943
956
  allowedActions: { canUpdate }
944
957
  } = useRBAC(PERMISSIONS);
958
+ const runHookWaterfall = useStrapiApp("ReleaseDetailsPage", (state) => state.runHookWaterfall);
959
+ const { displayedHeaders, hasI18nEnabled } = runHookWaterfall("ContentReleases/pages/ReleaseDetails/add-locale-in-releases", {
960
+ displayedHeaders: [
961
+ {
962
+ label: {
963
+ id: "content-releases.page.ReleaseDetails.table.header.label.name",
964
+ defaultMessage: "name"
965
+ },
966
+ name: "name"
967
+ }
968
+ ],
969
+ hasI18nEnabled: false
970
+ });
945
971
  const release = releaseData?.data;
946
972
  const selectedGroupBy = query?.groupBy || "contentType";
947
973
  const {
@@ -970,7 +996,7 @@ const ReleaseDetailsBody = ({ releaseId }) => {
970
996
  // We are passing the action path to found the position in the cache of the action for optimistic updates
971
997
  });
972
998
  if ("error" in response) {
973
- if (isAxiosError(response.error)) {
999
+ if (isFetchError(response.error)) {
974
1000
  toggleNotification({
975
1001
  type: "danger",
976
1002
  message: formatAPIError(response.error)
@@ -990,14 +1016,14 @@ const ReleaseDetailsBody = ({ releaseId }) => {
990
1016
  const releaseMeta = data?.meta;
991
1017
  const contentTypes = releaseMeta?.contentTypes || {};
992
1018
  const components = releaseMeta?.components || {};
993
- if (isReleaseError || !release) {
1019
+ if (isBaseQueryError(releaseError) || !release) {
994
1020
  const errorsArray = [];
995
- if (releaseError) {
1021
+ if (releaseError && "code" in releaseError) {
996
1022
  errorsArray.push({
997
1023
  code: releaseError.code
998
1024
  });
999
1025
  }
1000
- if (releaseActionsError) {
1026
+ if (releaseActionsError && "code" in releaseActionsError) {
1001
1027
  errorsArray.push({
1002
1028
  code: releaseActionsError.code
1003
1029
  });
@@ -1016,13 +1042,13 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1016
1042
  return /* @__PURE__ */ jsx(Page.Error, {});
1017
1043
  }
1018
1044
  if (Object.keys(releaseActions).length === 0) {
1019
- return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(
1045
+ return /* @__PURE__ */ jsx(Layouts.Content, { children: /* @__PURE__ */ jsx(
1020
1046
  EmptyStateLayout,
1021
1047
  {
1022
1048
  action: /* @__PURE__ */ jsx(
1023
1049
  LinkButton,
1024
1050
  {
1025
- as: Link$1,
1051
+ tag: Link$1,
1026
1052
  to: {
1027
1053
  pathname: "/content-manager"
1028
1054
  },
@@ -1034,7 +1060,7 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1034
1060
  })
1035
1061
  }
1036
1062
  ),
1037
- icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "10rem" }),
1063
+ icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "16rem" }),
1038
1064
  content: formatMessage({
1039
1065
  id: "content-releases.pages.Details.tab.emptyEntries",
1040
1066
  defaultMessage: "This release is empty. Open the Content Manager, select an entry and add it to the release."
@@ -1047,45 +1073,33 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1047
1073
  defaultMessage: "Group by"
1048
1074
  });
1049
1075
  const headers = [
1076
+ ...displayedHeaders,
1050
1077
  {
1051
- label: formatMessage({
1052
- id: "content-releases.page.ReleaseDetails.table.header.label.name",
1053
- defaultMessage: "name"
1054
- }),
1055
- name: "name"
1056
- },
1057
- {
1058
- label: formatMessage({
1059
- id: "content-releases.page.ReleaseDetails.table.header.label.locale",
1060
- defaultMessage: "locale"
1061
- }),
1062
- name: "locale"
1063
- },
1064
- {
1065
- label: formatMessage({
1078
+ label: {
1066
1079
  id: "content-releases.page.ReleaseDetails.table.header.label.content-type",
1067
1080
  defaultMessage: "content-type"
1068
- }),
1081
+ },
1069
1082
  name: "content-type"
1070
1083
  },
1071
1084
  {
1072
- label: formatMessage({
1085
+ label: {
1073
1086
  id: "content-releases.page.ReleaseDetails.table.header.label.action",
1074
1087
  defaultMessage: "action"
1075
- }),
1088
+ },
1076
1089
  name: "action"
1077
1090
  },
1078
1091
  ...!release.releasedAt ? [
1079
1092
  {
1080
- label: formatMessage({
1093
+ label: {
1081
1094
  id: "content-releases.page.ReleaseDetails.table.header.label.status",
1082
1095
  defaultMessage: "status"
1083
- }),
1096
+ },
1084
1097
  name: "status"
1085
1098
  }
1086
1099
  ] : []
1087
1100
  ];
1088
- return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsxs(Flex, { gap: 8, direction: "column", alignItems: "stretch", children: [
1101
+ const options = hasI18nEnabled ? GROUP_BY_OPTIONS : GROUP_BY_OPTIONS_NO_LOCALE;
1102
+ return /* @__PURE__ */ jsx(Layouts.Content, { children: /* @__PURE__ */ jsxs(Flex, { gap: 8, direction: "column", alignItems: "stretch", children: [
1089
1103
  /* @__PURE__ */ jsx(Flex, { children: /* @__PURE__ */ jsx(
1090
1104
  SingleSelect,
1091
1105
  {
@@ -1102,7 +1116,7 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1102
1116
  ),
1103
1117
  value: formatMessage(getGroupByOptionLabel(selectedGroupBy)),
1104
1118
  onChange: (value) => setQuery({ groupBy: value }),
1105
- children: GROUP_BY_OPTIONS.map((option) => /* @__PURE__ */ jsx(SingleSelectOption, { value: option, children: formatMessage(getGroupByOptionLabel(option)) }, option))
1119
+ children: options.map((option) => /* @__PURE__ */ jsx(SingleSelectOption, { value: option, children: formatMessage(getGroupByOptionLabel(option)) }, option))
1106
1120
  }
1107
1121
  ) }),
1108
1122
  Object.keys(releaseActions).map((key) => /* @__PURE__ */ jsxs(Flex, { gap: 4, direction: "column", alignItems: "stretch", children: [
@@ -1117,12 +1131,12 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1117
1131
  headers,
1118
1132
  isLoading: isLoading || isFetching,
1119
1133
  children: /* @__PURE__ */ jsxs(Table.Content, { children: [
1120
- /* @__PURE__ */ jsx(Table.Head, { children: headers.map((header) => /* @__PURE__ */ jsx(Table.HeaderCell, { ...header }, header.name)) }),
1134
+ /* @__PURE__ */ jsx(Table.Head, { children: headers.map(({ label, name }) => /* @__PURE__ */ jsx(Table.HeaderCell, { label: formatMessage(label), name }, name)) }),
1121
1135
  /* @__PURE__ */ jsx(Table.Loading, {}),
1122
1136
  /* @__PURE__ */ jsx(Table.Body, { children: releaseActions[key].map(
1123
- ({ id, contentType, locale, type, entry }, actionIndex) => /* @__PURE__ */ jsxs(Tr, { children: [
1137
+ ({ id, contentType, locale, type, entry, status }, actionIndex) => /* @__PURE__ */ jsxs(Tr, { children: [
1124
1138
  /* @__PURE__ */ jsx(Td, { width: "25%", maxWidth: "200px", children: /* @__PURE__ */ jsx(Typography, { ellipsis: true, children: `${contentType.mainFieldValue || entry.id}` }) }),
1125
- /* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: `${locale?.name ? locale.name : "-"}` }) }),
1139
+ hasI18nEnabled && /* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: `${locale?.name ? locale.name : "-"}` }) }),
1126
1140
  /* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: contentType.displayName || "" }) }),
1127
1141
  /* @__PURE__ */ jsx(Td, { width: "20%", children: release.releasedAt ? /* @__PURE__ */ jsx(Typography, { children: formatMessage(
1128
1142
  {
@@ -1149,7 +1163,8 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1149
1163
  action: type,
1150
1164
  schema: contentTypes?.[contentType.uid],
1151
1165
  components,
1152
- entry
1166
+ entry,
1167
+ status
1153
1168
  }
1154
1169
  ) }),
1155
1170
  /* @__PURE__ */ jsx(Td, { children: /* @__PURE__ */ jsx(Flex, { justifyContent: "flex-end", children: /* @__PURE__ */ jsxs(ReleaseActionMenu.Root, { children: [
@@ -1157,7 +1172,7 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1157
1172
  ReleaseActionMenu.ReleaseActionEntryLinkItem,
1158
1173
  {
1159
1174
  contentTypeUid: contentType.uid,
1160
- entryId: entry.id,
1175
+ documentId: entry.documentId,
1161
1176
  locale: locale?.code
1162
1177
  }
1163
1178
  ),
@@ -1230,7 +1245,7 @@ const ReleaseDetailsPage = () => {
1230
1245
  const title = releaseData?.name || "";
1231
1246
  const timezone = releaseData?.timezone ?? null;
1232
1247
  const scheduledAt = releaseData?.scheduledAt && timezone ? utcToZonedTime(releaseData.scheduledAt, timezone) : null;
1233
- const date = scheduledAt ? new Date(format(scheduledAt, "yyyy-MM-dd")) : null;
1248
+ const date = scheduledAt ? format(scheduledAt, "yyyy-MM-dd") : void 0;
1234
1249
  const time = scheduledAt ? format(scheduledAt, "HH:mm") : "";
1235
1250
  const handleEditRelease = async (values) => {
1236
1251
  const response = await updateRelease({
@@ -1247,7 +1262,8 @@ const ReleaseDetailsPage = () => {
1247
1262
  defaultMessage: "Release updated."
1248
1263
  })
1249
1264
  });
1250
- } else if (isAxiosError(response.error)) {
1265
+ toggleEditReleaseModal();
1266
+ } else if (isFetchError(response.error)) {
1251
1267
  toggleNotification({
1252
1268
  type: "danger",
1253
1269
  message: formatAPIError(response.error)
@@ -1258,7 +1274,6 @@ const ReleaseDetailsPage = () => {
1258
1274
  message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
1259
1275
  });
1260
1276
  }
1261
- toggleEditReleaseModal();
1262
1277
  };
1263
1278
  const handleDeleteRelease = async () => {
1264
1279
  const response = await deleteRelease({
@@ -1266,7 +1281,7 @@ const ReleaseDetailsPage = () => {
1266
1281
  });
1267
1282
  if ("data" in response) {
1268
1283
  navigate("..");
1269
- } else if (isAxiosError(response.error)) {
1284
+ } else if (isFetchError(response.error)) {
1270
1285
  toggleNotification({
1271
1286
  type: "danger",
1272
1287
  message: formatAPIError(response.error)
@@ -1285,9 +1300,10 @@ const ReleaseDetailsPage = () => {
1285
1300
  toggleWarningSubmit,
1286
1301
  children: [
1287
1302
  /* @__PURE__ */ jsx(ReleaseDetailsBody, { releaseId }),
1288
- releaseModalShown && /* @__PURE__ */ jsx(
1303
+ /* @__PURE__ */ jsx(
1289
1304
  ReleaseModal,
1290
1305
  {
1306
+ open: releaseModalShown,
1291
1307
  handleClose: toggleEditReleaseModal,
1292
1308
  handleSubmit: handleEditRelease,
1293
1309
  isLoading: isLoadingDetails || isSubmittingForm,
@@ -1301,18 +1317,10 @@ const ReleaseDetailsPage = () => {
1301
1317
  }
1302
1318
  }
1303
1319
  ),
1304
- /* @__PURE__ */ jsx(
1305
- ConfirmDialog,
1306
- {
1307
- isOpen: showWarningSubmit,
1308
- onClose: toggleWarningSubmit,
1309
- onConfirm: handleDeleteRelease,
1310
- children: formatMessage({
1311
- id: "content-releases.dialog.confirmation-message",
1312
- defaultMessage: "Are you sure you want to delete this release?"
1313
- })
1314
- }
1315
- )
1320
+ /* @__PURE__ */ jsx(Dialog.Root, { open: showWarningSubmit, onOpenChange: toggleWarningSubmit, children: /* @__PURE__ */ jsx(ConfirmDialog, { onConfirm: handleDeleteRelease, children: formatMessage({
1321
+ id: "content-releases.dialog.confirmation-message",
1322
+ defaultMessage: "Are you sure you want to delete this release?"
1323
+ }) }) })
1316
1324
  ]
1317
1325
  }
1318
1326
  );
@@ -1326,4 +1334,4 @@ const App = () => {
1326
1334
  export {
1327
1335
  App
1328
1336
  };
1329
- //# sourceMappingURL=App-X01LBg5V.mjs.map
1337
+ //# sourceMappingURL=App-DcXlnXrr.mjs.map