@strapi/content-releases 0.0.0-experimental.defd8568ae03ef8d52f86e1f3541979f953c3941 → 0.0.0-experimental.df298029ec6478763dcca7d59fafe8d2ae4ed60a

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 (110) hide show
  1. package/LICENSE +17 -1
  2. package/dist/_chunks/{App-C0DlH0im.js → App-BKB1esYS.js} +434 -405
  3. package/dist/_chunks/App-BKB1esYS.js.map +1 -0
  4. package/dist/_chunks/{App-O0ZO-S35.mjs → App-Cne--1Z8.mjs} +431 -400
  5. package/dist/_chunks/App-Cne--1Z8.mjs.map +1 -0
  6. package/dist/_chunks/{PurchaseContentReleases-DAHdUpAA.js → PurchaseContentReleases-Be3acS2L.js} +4 -3
  7. package/dist/_chunks/PurchaseContentReleases-Be3acS2L.js.map +1 -0
  8. package/dist/_chunks/{PurchaseContentReleases-Ex09YpKR.mjs → PurchaseContentReleases-_MxP6-Dt.mjs} +5 -4
  9. package/dist/_chunks/PurchaseContentReleases-_MxP6-Dt.mjs.map +1 -0
  10. package/dist/_chunks/ReleasesSettingsPage-C1WwGWIH.mjs +178 -0
  11. package/dist/_chunks/ReleasesSettingsPage-C1WwGWIH.mjs.map +1 -0
  12. package/dist/_chunks/ReleasesSettingsPage-kuXIwpWp.js +178 -0
  13. package/dist/_chunks/ReleasesSettingsPage-kuXIwpWp.js.map +1 -0
  14. package/dist/_chunks/{en-DtFJ5ViE.js → en-CmYoEnA7.js} +9 -2
  15. package/dist/_chunks/en-CmYoEnA7.js.map +1 -0
  16. package/dist/_chunks/{en-B9Ur3VsE.mjs → en-D0yVZFqf.mjs} +9 -2
  17. package/dist/_chunks/en-D0yVZFqf.mjs.map +1 -0
  18. package/dist/_chunks/{index-DoZNNtsb.js → index-5Odi61vw.js} +714 -595
  19. package/dist/_chunks/index-5Odi61vw.js.map +1 -0
  20. package/dist/_chunks/{index-DjDPK8kb.mjs → index-Cy7qwpaU.mjs} +723 -602
  21. package/dist/_chunks/index-Cy7qwpaU.mjs.map +1 -0
  22. package/dist/_chunks/schemas-BE1LxE9J.js +62 -0
  23. package/dist/_chunks/schemas-BE1LxE9J.js.map +1 -0
  24. package/dist/_chunks/schemas-DdA2ic2U.mjs +44 -0
  25. package/dist/_chunks/schemas-DdA2ic2U.mjs.map +1 -0
  26. package/dist/admin/index.js +1 -1
  27. package/dist/admin/index.mjs +2 -2
  28. package/dist/admin/src/components/ReleaseAction.d.ts +1 -1
  29. package/dist/admin/src/components/ReleaseActionMenu.d.ts +3 -3
  30. package/dist/admin/src/components/{CMReleasesContainer.d.ts → ReleaseActionModal.d.ts} +3 -1
  31. package/dist/admin/src/components/ReleaseListCell.d.ts +28 -0
  32. package/dist/admin/src/components/ReleaseModal.d.ts +3 -2
  33. package/dist/admin/src/components/ReleasesPanel.d.ts +3 -0
  34. package/dist/admin/src/constants.d.ts +18 -0
  35. package/dist/admin/src/modules/hooks.d.ts +7 -0
  36. package/dist/admin/src/pages/ReleasesSettingsPage.d.ts +1 -0
  37. package/dist/admin/src/services/release.d.ts +53 -370
  38. package/dist/admin/src/utils/api.d.ts +6 -0
  39. package/dist/admin/src/utils/time.d.ts +9 -0
  40. package/dist/admin/src/validation/schemas.d.ts +6 -0
  41. package/dist/server/index.js +786 -580
  42. package/dist/server/index.js.map +1 -1
  43. package/dist/server/index.mjs +787 -581
  44. package/dist/server/index.mjs.map +1 -1
  45. package/dist/server/src/bootstrap.d.ts.map +1 -1
  46. package/dist/server/src/constants.d.ts +11 -2
  47. package/dist/server/src/constants.d.ts.map +1 -1
  48. package/dist/server/src/content-types/index.d.ts +3 -5
  49. package/dist/server/src/content-types/index.d.ts.map +1 -1
  50. package/dist/server/src/content-types/release-action/index.d.ts +3 -5
  51. package/dist/server/src/content-types/release-action/index.d.ts.map +1 -1
  52. package/dist/server/src/content-types/release-action/schema.d.ts +3 -5
  53. package/dist/server/src/content-types/release-action/schema.d.ts.map +1 -1
  54. package/dist/server/src/controllers/index.d.ts +6 -1
  55. package/dist/server/src/controllers/index.d.ts.map +1 -1
  56. package/dist/server/src/controllers/release-action.d.ts.map +1 -1
  57. package/dist/server/src/controllers/release.d.ts +7 -1
  58. package/dist/server/src/controllers/release.d.ts.map +1 -1
  59. package/dist/server/src/controllers/settings.d.ts +11 -0
  60. package/dist/server/src/controllers/settings.d.ts.map +1 -0
  61. package/dist/server/src/controllers/validation/release-action.d.ts +7 -1
  62. package/dist/server/src/controllers/validation/release-action.d.ts.map +1 -1
  63. package/dist/server/src/controllers/validation/release.d.ts +2 -0
  64. package/dist/server/src/controllers/validation/release.d.ts.map +1 -1
  65. package/dist/server/src/controllers/validation/settings.d.ts +3 -0
  66. package/dist/server/src/controllers/validation/settings.d.ts.map +1 -0
  67. package/dist/server/src/index.d.ts +68 -49
  68. package/dist/server/src/index.d.ts.map +1 -1
  69. package/dist/server/src/middlewares/documents.d.ts +6 -0
  70. package/dist/server/src/middlewares/documents.d.ts.map +1 -0
  71. package/dist/server/src/migrations/database/5.0.0-document-id-in-actions.d.ts +9 -0
  72. package/dist/server/src/migrations/database/5.0.0-document-id-in-actions.d.ts.map +1 -0
  73. package/dist/server/src/migrations/index.d.ts.map +1 -1
  74. package/dist/server/src/register.d.ts.map +1 -1
  75. package/dist/server/src/routes/index.d.ts +16 -0
  76. package/dist/server/src/routes/index.d.ts.map +1 -1
  77. package/dist/server/src/routes/release.d.ts.map +1 -1
  78. package/dist/server/src/routes/settings.d.ts +18 -0
  79. package/dist/server/src/routes/settings.d.ts.map +1 -0
  80. package/dist/server/src/services/index.d.ts +40 -38
  81. package/dist/server/src/services/index.d.ts.map +1 -1
  82. package/dist/server/src/services/release-action.d.ts +38 -0
  83. package/dist/server/src/services/release-action.d.ts.map +1 -0
  84. package/dist/server/src/services/release.d.ts +6 -41
  85. package/dist/server/src/services/release.d.ts.map +1 -1
  86. package/dist/server/src/services/settings.d.ts +13 -0
  87. package/dist/server/src/services/settings.d.ts.map +1 -0
  88. package/dist/server/src/services/validation.d.ts +1 -1
  89. package/dist/server/src/services/validation.d.ts.map +1 -1
  90. package/dist/server/src/utils/index.d.ts +29 -8
  91. package/dist/server/src/utils/index.d.ts.map +1 -1
  92. package/dist/shared/contracts/release-actions.d.ts +9 -10
  93. package/dist/shared/contracts/release-actions.d.ts.map +1 -1
  94. package/dist/shared/contracts/releases.d.ts +9 -7
  95. package/dist/shared/contracts/releases.d.ts.map +1 -1
  96. package/dist/shared/contracts/settings.d.ts +39 -0
  97. package/dist/shared/contracts/settings.d.ts.map +1 -0
  98. package/package.json +22 -22
  99. package/dist/_chunks/App-C0DlH0im.js.map +0 -1
  100. package/dist/_chunks/App-O0ZO-S35.mjs.map +0 -1
  101. package/dist/_chunks/PurchaseContentReleases-DAHdUpAA.js.map +0 -1
  102. package/dist/_chunks/PurchaseContentReleases-Ex09YpKR.mjs.map +0 -1
  103. package/dist/_chunks/en-B9Ur3VsE.mjs.map +0 -1
  104. package/dist/_chunks/en-DtFJ5ViE.js.map +0 -1
  105. package/dist/_chunks/index-DjDPK8kb.mjs.map +0 -1
  106. package/dist/_chunks/index-DoZNNtsb.js.map +0 -1
  107. package/dist/admin/src/services/axios.d.ts +0 -29
  108. package/dist/shared/validation-schemas.d.ts +0 -2
  109. package/dist/shared/validation-schemas.d.ts.map +0 -1
  110. package/strapi-server.js +0 -3
@@ -1,19 +1,19 @@
1
1
  import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
- import { useNotification, useAPIErrorHandler, useQueryParams, useTracking, useRBAC, Page, Pagination, ConfirmDialog, BackButton, useStrapiApp, Table } 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-DjDPK8kb.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 getTimezones, p as pluginId, u as useGetReleasesQuery, a as useGetReleaseSettingsQuery, b as useCreateReleaseMutation, P as PERMISSIONS, c as useGetReleaseQuery, d as useUpdateReleaseMutation, e as useDeleteReleaseMutation, f as usePublishReleaseMutation, h as getTimezoneOffset, i as useGetReleaseActionsQuery, j as useUpdateReleaseActionMutation, R as ReleaseActionOptions, k as ReleaseActionMenu, r as releaseApi } from "./index-Cy7qwpaU.mjs";
5
5
  import * as React from "react";
6
- import { ModalLayout, ModalHeader, Typography, ModalBody, Flex, TextInput, Box, Checkbox, DatePicker, TimePicker, ModalFooter, Button, Combobox, ComboboxOption, Link, Alert, Main, HeaderLayout, ContentLayout, TabGroup, Tabs, Tab, Divider, TabPanels, TabPanel, EmptyStateLayout, Grid, GridItem, Badge, Menu, IconButton, LinkButton, SingleSelect, SingleSelectOption, Tr, Td, Tooltip } from "@strapi/design-system";
7
- import { Plus, 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, SimpleMenu, Dialog, LinkButton, SingleSelect, SingleSelectOption, Tr, Td, Tooltip } from "@strapi/design-system";
8
+ import { Plus, Pencil, Trash, More, CrossCircle, CheckCircle, ArrowsCounterClockwise } from "@strapi/icons";
8
9
  import { EmptyDocuments } from "@strapi/icons/symbols";
9
- import { unstable_useDocument } from "@strapi/plugin-content-manager/strapi-admin";
10
- import format from "date-fns/format";
10
+ import format$1 from "date-fns/format";
11
11
  import { utcToZonedTime, zonedTimeToUtc } from "date-fns-tz";
12
12
  import { useIntl } from "react-intl";
13
- import styled from "styled-components";
14
- import { intervalToDuration, isPast, formatISO } from "date-fns";
13
+ import { styled } from "styled-components";
14
+ import { intervalToDuration, isPast, formatISO, format } from "date-fns";
15
15
  import { Formik, Form, useFormikContext } from "formik";
16
- import * as yup from "yup";
16
+ import { R as RELEASE_SCHEMA } from "./schemas-DdA2ic2U.mjs";
17
17
  import { useDispatch } from "react-redux";
18
18
  import { useLicenseLimits } from "@strapi/admin/strapi-admin/ee";
19
19
  const intervals = ["years", "months", "days", "hours", "minutes", "seconds"];
@@ -46,28 +46,9 @@ const RelativeTime$1 = React.forwardRef(
46
46
  );
47
47
  }
48
48
  );
49
- const RELEASE_SCHEMA = yup.object().shape({
50
- name: yup.string().trim().required(),
51
- scheduledAt: yup.string().nullable(),
52
- isScheduled: yup.boolean().optional(),
53
- time: yup.string().when("isScheduled", {
54
- is: true,
55
- then: yup.string().trim().required(),
56
- otherwise: yup.string().nullable()
57
- }),
58
- timezone: yup.string().when("isScheduled", {
59
- is: true,
60
- then: yup.string().required().nullable(),
61
- otherwise: yup.string().nullable()
62
- }),
63
- date: yup.string().when("isScheduled", {
64
- is: true,
65
- then: yup.string().required().nullable(),
66
- otherwise: yup.string().nullable()
67
- })
68
- }).required().noUnknown();
69
49
  const ReleaseModal = ({
70
50
  handleClose,
51
+ open,
71
52
  handleSubmit,
72
53
  initialValues,
73
54
  isLoading = false
@@ -91,8 +72,8 @@ const ReleaseModal = ({
91
72
  );
92
73
  return currentTimezone?.value || systemTimezone.value;
93
74
  };
94
- return /* @__PURE__ */ jsxs(ModalLayout, { onClose: handleClose, labelledBy: "title", children: [
95
- /* @__PURE__ */ jsx(ModalHeader, { children: /* @__PURE__ */ jsx(Typography, { id: "title", fontWeight: "bold", textColor: "neutral800", children: formatMessage(
75
+ return /* @__PURE__ */ jsx(Modal.Root, { open, onOpenChange: handleClose, children: /* @__PURE__ */ jsxs(Modal.Content, { children: [
76
+ /* @__PURE__ */ jsx(Modal.Header, { children: /* @__PURE__ */ jsx(Modal.Title, { children: formatMessage(
96
77
  {
97
78
  id: "content-releases.modal.title",
98
79
  defaultMessage: "{isCreatingRelease, select, true {New release} other {Edit release}}"
@@ -115,133 +96,143 @@ const ReleaseModal = ({
115
96
  },
116
97
  validationSchema: RELEASE_SCHEMA,
117
98
  validateOnChange: false,
118
- children: ({ values, errors, handleChange, setFieldValue }) => /* @__PURE__ */ jsxs(Form, { children: [
119
- /* @__PURE__ */ jsx(ModalBody, { children: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 6, children: [
120
- /* @__PURE__ */ jsx(
121
- TextInput,
122
- {
123
- label: formatMessage({
124
- id: "content-releases.modal.form.input.label.release-name",
125
- defaultMessage: "Name"
126
- }),
127
- name: "name",
128
- value: values.name,
129
- error: errors.name,
130
- onChange: handleChange,
131
- required: true
132
- }
133
- ),
134
- /* @__PURE__ */ jsx(Box, { width: "max-content", children: /* @__PURE__ */ jsx(
135
- Checkbox,
136
- {
137
- name: "isScheduled",
138
- value: values.isScheduled,
139
- onChange: (event) => {
140
- setFieldValue("isScheduled", event.target.checked);
141
- if (!event.target.checked) {
142
- setFieldValue("date", null);
143
- setFieldValue("time", "");
144
- setFieldValue("timezone", null);
145
- } else {
146
- setFieldValue("date", initialValues.date);
147
- setFieldValue("time", initialValues.time);
148
- setFieldValue("timezone", initialValues.timezone ?? systemTimezone?.value);
149
- }
150
- },
151
- children: /* @__PURE__ */ jsx(
152
- Typography,
153
- {
154
- textColor: values.isScheduled ? "primary600" : "neutral800",
155
- fontWeight: values.isScheduled ? "semiBold" : "regular",
156
- children: formatMessage({
157
- id: "modal.form.input.label.schedule-release",
158
- defaultMessage: "Schedule release"
159
- })
160
- }
161
- )
162
- }
163
- ) }),
164
- values.isScheduled && /* @__PURE__ */ jsxs(Fragment, { children: [
165
- /* @__PURE__ */ jsxs(Flex, { gap: 4, alignItems: "start", children: [
166
- /* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsx(
167
- DatePicker,
168
- {
169
- label: formatMessage({
170
- id: "content-releases.modal.form.input.label.date",
171
- defaultMessage: "Date"
172
- }),
173
- name: "date",
174
- error: errors.date,
175
- onChange: (date) => {
176
- const isoFormatDate = date ? formatISO(date, { representation: "date" }) : null;
177
- setFieldValue("date", isoFormatDate);
178
- },
179
- clearLabel: formatMessage({
180
- id: "content-releases.modal.form.input.clearLabel",
181
- defaultMessage: "Clear"
182
- }),
183
- onClear: () => {
99
+ children: ({ values, errors, handleChange, setFieldValue }) => {
100
+ return /* @__PURE__ */ jsxs(Form, { children: [
101
+ /* @__PURE__ */ jsx(Modal.Body, { children: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 6, children: [
102
+ /* @__PURE__ */ jsxs(
103
+ Field.Root,
104
+ {
105
+ name: "name",
106
+ error: errors.name && formatMessage({ id: errors.name, defaultMessage: errors.name }),
107
+ required: true,
108
+ children: [
109
+ /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
110
+ id: "content-releases.modal.form.input.label.release-name",
111
+ defaultMessage: "Name"
112
+ }) }),
113
+ /* @__PURE__ */ jsx(TextInput, { value: values.name, onChange: handleChange }),
114
+ /* @__PURE__ */ jsx(Field.Error, {})
115
+ ]
116
+ }
117
+ ),
118
+ /* @__PURE__ */ jsx(Box, { width: "max-content", children: /* @__PURE__ */ jsx(
119
+ Checkbox,
120
+ {
121
+ name: "isScheduled",
122
+ checked: values.isScheduled,
123
+ onCheckedChange: (checked) => {
124
+ setFieldValue("isScheduled", checked);
125
+ if (!checked) {
184
126
  setFieldValue("date", null);
185
- },
186
- selectedDate: values.date || void 0,
187
- required: true,
188
- minDate: utcToZonedTime(/* @__PURE__ */ new Date(), values.timezone.split("&")[1])
189
- }
190
- ) }),
191
- /* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsx(
192
- TimePicker,
193
- {
194
- label: formatMessage({
195
- id: "content-releases.modal.form.input.label.time",
196
- defaultMessage: "Time"
197
- }),
198
- name: "time",
199
- error: errors.time,
200
- onChange: (time) => {
201
- setFieldValue("time", time);
202
- },
203
- clearLabel: formatMessage({
204
- id: "content-releases.modal.form.input.clearLabel",
205
- defaultMessage: "Clear"
206
- }),
207
- onClear: () => {
208
127
  setFieldValue("time", "");
209
- },
210
- value: values.time || void 0,
211
- required: true
212
- }
213
- ) })
214
- ] }),
215
- /* @__PURE__ */ jsx(TimezoneComponent, { timezoneOptions: timezoneList })
216
- ] })
217
- ] }) }),
218
- /* @__PURE__ */ jsx(
219
- ModalFooter,
220
- {
221
- startActions: /* @__PURE__ */ jsx(Button, { onClick: handleClose, variant: "tertiary", name: "cancel", children: formatMessage({ id: "cancel", defaultMessage: "Cancel" }) }),
222
- endActions: /* @__PURE__ */ jsx(Button, { name: "submit", loading: isLoading, type: "submit", children: formatMessage(
128
+ setFieldValue("timezone", null);
129
+ } else {
130
+ setFieldValue("date", initialValues.date);
131
+ setFieldValue("time", initialValues.time);
132
+ setFieldValue(
133
+ "timezone",
134
+ initialValues.timezone ?? systemTimezone?.value
135
+ );
136
+ }
137
+ },
138
+ children: /* @__PURE__ */ jsx(
139
+ Typography,
140
+ {
141
+ textColor: values.isScheduled ? "primary600" : "neutral800",
142
+ fontWeight: values.isScheduled ? "semiBold" : "regular",
143
+ children: formatMessage({
144
+ id: "modal.form.input.label.schedule-release",
145
+ defaultMessage: "Schedule release"
146
+ })
147
+ }
148
+ )
149
+ }
150
+ ) }),
151
+ values.isScheduled && /* @__PURE__ */ jsxs(Fragment, { children: [
152
+ /* @__PURE__ */ jsxs(Flex, { gap: 4, alignItems: "start", children: [
153
+ /* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsxs(
154
+ Field.Root,
155
+ {
156
+ name: "date",
157
+ error: errors.date && formatMessage({ id: errors.date, defaultMessage: errors.date }),
158
+ required: true,
159
+ children: [
160
+ /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
161
+ id: "content-releases.modal.form.input.label.date",
162
+ defaultMessage: "Date"
163
+ }) }),
164
+ /* @__PURE__ */ jsx(
165
+ DatePicker,
166
+ {
167
+ onChange: (date) => {
168
+ const isoFormatDate = date ? formatISO(date, { representation: "date" }) : null;
169
+ setFieldValue("date", isoFormatDate);
170
+ },
171
+ clearLabel: formatMessage({
172
+ id: "content-releases.modal.form.input.clearLabel",
173
+ defaultMessage: "Clear"
174
+ }),
175
+ onClear: () => {
176
+ setFieldValue("date", null);
177
+ },
178
+ value: values.date ? new Date(values.date) : /* @__PURE__ */ new Date(),
179
+ minDate: utcToZonedTime(/* @__PURE__ */ new Date(), values.timezone.split("&")[1])
180
+ }
181
+ ),
182
+ /* @__PURE__ */ jsx(Field.Error, {})
183
+ ]
184
+ }
185
+ ) }),
186
+ /* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsxs(
187
+ Field.Root,
188
+ {
189
+ name: "time",
190
+ error: errors.time && formatMessage({ id: errors.time, defaultMessage: errors.time }),
191
+ required: true,
192
+ children: [
193
+ /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
194
+ id: "content-releases.modal.form.input.label.time",
195
+ defaultMessage: "Time"
196
+ }) }),
197
+ /* @__PURE__ */ jsx(
198
+ TimePicker,
199
+ {
200
+ onChange: (time) => {
201
+ setFieldValue("time", time);
202
+ },
203
+ clearLabel: formatMessage({
204
+ id: "content-releases.modal.form.input.clearLabel",
205
+ defaultMessage: "Clear"
206
+ }),
207
+ onClear: () => {
208
+ setFieldValue("time", "");
209
+ },
210
+ value: values.time || void 0
211
+ }
212
+ ),
213
+ /* @__PURE__ */ jsx(Field.Error, {})
214
+ ]
215
+ }
216
+ ) })
217
+ ] }),
218
+ /* @__PURE__ */ jsx(TimezoneComponent, { timezoneOptions: timezoneList })
219
+ ] })
220
+ ] }) }),
221
+ /* @__PURE__ */ jsxs(Modal.Footer, { children: [
222
+ /* @__PURE__ */ jsx(Modal.Close, { children: /* @__PURE__ */ jsx(Button, { variant: "tertiary", name: "cancel", children: formatMessage({ id: "cancel", defaultMessage: "Cancel" }) }) }),
223
+ /* @__PURE__ */ jsx(Button, { name: "submit", loading: isLoading, type: "submit", children: formatMessage(
223
224
  {
224
225
  id: "content-releases.modal.form.button.submit",
225
226
  defaultMessage: "{isCreatingRelease, select, true {Continue} other {Save}}"
226
227
  },
227
228
  { isCreatingRelease }
228
229
  ) })
229
- }
230
- )
231
- ] })
230
+ ] })
231
+ ] });
232
+ }
232
233
  }
233
234
  )
234
- ] });
235
- };
236
- const getTimezones = (selectedDate) => {
237
- const timezoneList = Intl.supportedValuesOf("timeZone").map((timezone) => {
238
- const utcOffset = getTimezoneOffset(timezone, selectedDate);
239
- return { offset: utcOffset, value: `${utcOffset}&${timezone}` };
240
- });
241
- const systemTimezone = timezoneList.find(
242
- (timezone) => timezone.value.split("&")[1] === Intl.DateTimeFormat().resolvedOptions().timeZone
243
- );
244
- return { timezoneList, systemTimezone };
235
+ ] }) });
245
236
  };
246
237
  const TimezoneComponent = ({ timezoneOptions }) => {
247
238
  const { values, errors, setFieldValue } = useFormikContext();
@@ -257,33 +248,44 @@ const TimezoneComponent = ({ timezoneOptions }) => {
257
248
  }
258
249
  }
259
250
  }, [setFieldValue, values.date, values.timezone]);
260
- return /* @__PURE__ */ jsx(
261
- Combobox,
251
+ return /* @__PURE__ */ jsxs(
252
+ Field.Root,
262
253
  {
263
- label: formatMessage({
264
- id: "content-releases.modal.form.input.label.timezone",
265
- defaultMessage: "Timezone"
266
- }),
267
- autocomplete: { type: "list", filter: "contains" },
268
254
  name: "timezone",
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
- error: errors.timezone,
255
+ error: errors.timezone && formatMessage({ id: errors.timezone, defaultMessage: errors.timezone }),
281
256
  required: true,
282
- children: timezoneList.map((timezone) => /* @__PURE__ */ jsx(ComboboxOption, { value: timezone.value, children: timezone.value.replace(/&/, " ") }, timezone.value))
257
+ children: [
258
+ /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
259
+ id: "content-releases.modal.form.input.label.timezone",
260
+ defaultMessage: "Timezone"
261
+ }) }),
262
+ /* @__PURE__ */ jsx(
263
+ Combobox,
264
+ {
265
+ autocomplete: { type: "list", filter: "contains" },
266
+ value: values.timezone || void 0,
267
+ textValue: values.timezone ? values.timezone.replace(/&/, " ") : void 0,
268
+ onChange: (timezone) => {
269
+ setFieldValue("timezone", timezone);
270
+ },
271
+ onTextValueChange: (timezone) => {
272
+ setFieldValue("timezone", timezone);
273
+ },
274
+ onClear: () => {
275
+ setFieldValue("timezone", "");
276
+ },
277
+ children: timezoneList.map((timezone) => /* @__PURE__ */ jsx(ComboboxOption, { value: timezone.value, children: timezone.value.replace(/&/, " ") }, timezone.value))
278
+ }
279
+ ),
280
+ /* @__PURE__ */ jsx(Field.Error, {})
281
+ ]
283
282
  }
284
283
  );
285
284
  };
286
285
  const useTypedDispatch = useDispatch;
286
+ const isBaseQueryError = (error) => {
287
+ return typeof error !== "undefined" && error.name !== void 0;
288
+ };
287
289
  const LinkCard = styled(Link)`
288
290
  display: block;
289
291
  `;
@@ -340,7 +342,7 @@ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
340
342
  }
341
343
  );
342
344
  }
343
- 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(
345
+ return /* @__PURE__ */ jsx(Grid.Root, { gap: 4, children: releases.map(({ id, name, scheduledAt, status }) => /* @__PURE__ */ jsx(Grid.Item, { col: 3, s: 6, xs: 12, direction: "column", alignItems: "stretch", children: /* @__PURE__ */ jsx(LinkCard, { tag: NavLink, to: `${id}`, isExternal: false, children: /* @__PURE__ */ jsxs(
344
346
  Flex,
345
347
  {
346
348
  direction: "column",
@@ -355,7 +357,7 @@ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
355
357
  gap: 4,
356
358
  children: [
357
359
  /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "start", gap: 1, children: [
358
- /* @__PURE__ */ jsx(Typography, { as: "h3", variant: "delta", fontWeight: "bold", children: name }),
360
+ /* @__PURE__ */ jsx(Typography, { textColor: "neutral800", tag: "h3", variant: "delta", fontWeight: "bold", children: name }),
359
361
  /* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: scheduledAt ? /* @__PURE__ */ jsx(RelativeTime, { timestamp: new Date(scheduledAt) }) : formatMessage({
360
362
  id: "content-releases.pages.Releases.not-scheduled",
361
363
  defaultMessage: "Not scheduled"
@@ -376,14 +378,13 @@ const StyledAlert = styled(Alert)`
376
378
  `;
377
379
  const INITIAL_FORM_VALUES = {
378
380
  name: "",
379
- date: null,
381
+ date: format(/* @__PURE__ */ new Date(), "yyyy-MM-dd"),
380
382
  time: "",
381
383
  isScheduled: true,
382
384
  scheduledAt: null,
383
385
  timezone: null
384
386
  };
385
387
  const ReleasesPage = () => {
386
- const tabRef = React.useRef(null);
387
388
  const location = useLocation();
388
389
  const [releaseModalShown, setReleaseModalShown] = React.useState(false);
389
390
  const { toggleNotification } = useNotification();
@@ -392,6 +393,7 @@ const ReleasesPage = () => {
392
393
  const { formatAPIError } = useAPIErrorHandler();
393
394
  const [{ query }, setQuery] = useQueryParams();
394
395
  const response = useGetReleasesQuery(query);
396
+ const { data, isLoading: isLoadingSettings } = useGetReleaseSettingsQuery();
395
397
  const [createRelease, { isLoading: isSubmittingForm }] = useCreateReleaseMutation();
396
398
  const { getFeature } = useLicenseLimits();
397
399
  const { maximumReleases = 3 } = getFeature("cms-content-releases");
@@ -399,9 +401,8 @@ const ReleasesPage = () => {
399
401
  const {
400
402
  allowedActions: { canCreate }
401
403
  } = useRBAC(PERMISSIONS);
402
- const { isLoading, isSuccess, isError } = response;
404
+ const { isLoading: isLoadingReleases, isSuccess, isError } = response;
403
405
  const activeTab = response?.currentData?.meta?.activeTab || "pending";
404
- const activeTabIndex = ["pending", "done"].indexOf(activeTab);
405
406
  React.useEffect(() => {
406
407
  if (location?.state?.errors) {
407
408
  toggleNotification({
@@ -418,27 +419,22 @@ const ReleasesPage = () => {
418
419
  navigate("", { replace: true, state: null });
419
420
  }
420
421
  }, [formatMessage, location?.state?.errors, navigate, toggleNotification]);
421
- React.useEffect(() => {
422
- if (tabRef.current) {
423
- tabRef.current._handlers.setSelectedTabIndex(activeTabIndex);
424
- }
425
- }, [activeTabIndex]);
426
422
  const toggleAddReleaseModal = () => {
427
423
  setReleaseModalShown((prev) => !prev);
428
424
  };
429
- if (isLoading) {
425
+ if (isLoadingReleases || isLoadingSettings) {
430
426
  return /* @__PURE__ */ jsx(Page.Loading, {});
431
427
  }
432
428
  const totalPendingReleases = isSuccess && response.currentData?.meta?.pendingReleasesCount || 0;
433
429
  const hasReachedMaximumPendingReleases = totalPendingReleases >= maximumReleases;
434
- const handleTabChange = (index) => {
430
+ const handleTabChange = (tabValue) => {
435
431
  setQuery({
436
432
  ...query,
437
433
  page: 1,
438
434
  pageSize: response?.currentData?.meta?.pagination?.pageSize || 16,
439
435
  filters: {
440
436
  releasedAt: {
441
- $notNull: index === 0 ? false : true
437
+ $notNull: tabValue !== "pending"
442
438
  }
443
439
  }
444
440
  });
@@ -459,7 +455,7 @@ const ReleasesPage = () => {
459
455
  });
460
456
  trackUsage("didCreateRelease");
461
457
  navigate(response2.data.data.id.toString());
462
- } else if (isAxiosError(response2.error)) {
458
+ } else if (isFetchError(response2.error)) {
463
459
  toggleNotification({
464
460
  type: "danger",
465
461
  message: formatAPIError(response2.error)
@@ -471,9 +467,9 @@ const ReleasesPage = () => {
471
467
  });
472
468
  }
473
469
  };
474
- return /* @__PURE__ */ jsxs(Main, { "aria-busy": isLoading, children: [
470
+ return /* @__PURE__ */ jsxs(Main, { "aria-busy": isLoadingReleases || isLoadingSettings, children: [
475
471
  /* @__PURE__ */ jsx(
476
- HeaderLayout,
472
+ Layouts.Header,
477
473
  {
478
474
  title: formatMessage({
479
475
  id: "content-releases.pages.Releases.title",
@@ -497,7 +493,7 @@ const ReleasesPage = () => {
497
493
  ) : null
498
494
  }
499
495
  ),
500
- /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsxs(Fragment, { children: [
496
+ /* @__PURE__ */ jsx(Layouts.Content, { children: /* @__PURE__ */ jsxs(Fragment, { children: [
501
497
  hasReachedMaximumPendingReleases && /* @__PURE__ */ jsx(
502
498
  StyledAlert,
503
499
  {
@@ -522,21 +518,17 @@ const ReleasesPage = () => {
522
518
  })
523
519
  }
524
520
  ),
525
- /* @__PURE__ */ jsxs(
526
- TabGroup,
527
- {
528
- label: formatMessage({
529
- id: "content-releases.pages.Releases.tab-group.label",
530
- defaultMessage: "Releases list"
531
- }),
532
- variant: "simple",
533
- initialSelectedTabIndex: activeTabIndex,
534
- onTabChange: handleTabChange,
535
- ref: tabRef,
536
- children: [
537
- /* @__PURE__ */ jsxs(Box, { paddingBottom: 8, children: [
538
- /* @__PURE__ */ jsxs(Tabs, { children: [
539
- /* @__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(
540
532
  {
541
533
  id: "content-releases.pages.Releases.tab.pending",
542
534
  defaultMessage: "Pending ({count})"
@@ -545,34 +537,32 @@ const ReleasesPage = () => {
545
537
  count: totalPendingReleases
546
538
  }
547
539
  ) }),
548
- /* @__PURE__ */ jsx(Tab, { children: formatMessage({
540
+ /* @__PURE__ */ jsx(Tabs.Trigger, { value: "done", children: formatMessage({
549
541
  id: "content-releases.pages.Releases.tab.done",
550
542
  defaultMessage: "Done"
551
543
  }) })
552
- ] }),
553
- /* @__PURE__ */ jsx(Divider, {})
554
- ] }),
555
- /* @__PURE__ */ jsxs(TabPanels, { children: [
556
- /* @__PURE__ */ jsx(TabPanel, { children: /* @__PURE__ */ jsx(
557
- ReleasesGrid,
558
- {
559
- sectionTitle: "pending",
560
- releases: response?.currentData?.data,
561
- isError
562
- }
563
- ) }),
564
- /* @__PURE__ */ jsx(TabPanel, { children: /* @__PURE__ */ jsx(
565
- ReleasesGrid,
566
- {
567
- sectionTitle: "done",
568
- releases: response?.currentData?.data,
569
- isError
570
- }
571
- ) })
572
- ] })
573
- ]
574
- }
575
- ),
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
+ ] }),
576
566
  /* @__PURE__ */ jsxs(
577
567
  Pagination.Root,
578
568
  {
@@ -585,13 +575,17 @@ const ReleasesPage = () => {
585
575
  }
586
576
  )
587
577
  ] }) }),
588
- releaseModalShown && /* @__PURE__ */ jsx(
578
+ /* @__PURE__ */ jsx(
589
579
  ReleaseModal,
590
580
  {
581
+ open: releaseModalShown,
591
582
  handleClose: toggleAddReleaseModal,
592
583
  handleSubmit: handleAddRelease,
593
584
  isLoading: isSubmittingForm,
594
- initialValues: INITIAL_FORM_VALUES
585
+ initialValues: {
586
+ ...INITIAL_FORM_VALUES,
587
+ timezone: data?.data.defaultTimezone ? data.data.defaultTimezone.split("&")[1] : null
588
+ }
595
589
  }
596
590
  )
597
591
  ] });
@@ -602,7 +596,7 @@ const ReleaseInfoWrapper = styled(Flex)`
602
596
  border-bottom-left-radius: ${({ theme }) => theme.borderRadius};
603
597
  border-top: 1px solid ${({ theme }) => theme.colors.neutral150};
604
598
  `;
605
- const StyledMenuItem = styled(Menu.Item)`
599
+ const StyledMenuItem = styled(MenuItem)`
606
600
  svg path {
607
601
  fill: ${({ theme, disabled }) => disabled && theme.colors.neutral500};
608
602
  }
@@ -611,19 +605,19 @@ const StyledMenuItem = styled(Menu.Item)`
611
605
  }
612
606
 
613
607
  &:hover {
614
- background: ${({ theme, variant = "neutral" }) => theme.colors[`${variant}100`]};
608
+ background: ${({ theme, $variant = "neutral" }) => theme.colors[`${$variant}100`]};
615
609
  }
616
610
  `;
617
611
  const PencilIcon = styled(Pencil)`
618
- width: ${({ theme }) => theme.spaces[3]};
619
- height: ${({ theme }) => theme.spaces[3]};
612
+ width: ${({ theme }) => theme.spaces[4]};
613
+ height: ${({ theme }) => theme.spaces[4]};
620
614
  path {
621
615
  fill: ${({ theme }) => theme.colors.neutral600};
622
616
  }
623
617
  `;
624
618
  const TrashIcon = styled(Trash)`
625
- width: ${({ theme }) => theme.spaces[3]};
626
- height: ${({ theme }) => theme.spaces[3]};
619
+ width: ${({ theme }) => theme.spaces[4]};
620
+ height: ${({ theme }) => theme.spaces[4]};
627
621
  path {
628
622
  fill: ${({ theme }) => theme.colors.danger600};
629
623
  }
@@ -631,41 +625,90 @@ const TrashIcon = styled(Trash)`
631
625
  const TypographyMaxWidth = styled(Typography)`
632
626
  max-width: 300px;
633
627
  `;
634
- const EntryValidationText = ({ action, schema, entry }) => {
628
+ const EntryValidationText = ({ action, schema, entry, status }) => {
635
629
  const { formatMessage } = useIntl();
636
- const { validate } = unstable_useDocument(
630
+ const { validate, isLoading } = unstable_useDocument(
637
631
  {
638
632
  collectionType: schema?.kind ?? "",
639
633
  model: schema?.uid ?? ""
640
634
  },
641
635
  {
642
- skip: !schema
636
+ // 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
637
+ skip: true
643
638
  }
644
639
  );
645
- const errors = validate(entry) ?? {};
646
- if (Object.keys(errors).length > 0) {
647
- const validationErrorsMessages = Object.entries(errors).map(
648
- ([key, value]) => formatMessage(
649
- { id: `${value.id}.withField`, defaultMessage: value.defaultMessage },
650
- { field: key }
651
- )
652
- ).join(" ");
653
- return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
654
- /* @__PURE__ */ jsx(CrossCircle, { fill: "danger600" }),
655
- /* @__PURE__ */ jsx(Tooltip, { description: validationErrorsMessages, children: /* @__PURE__ */ jsx(TypographyMaxWidth, { textColor: "danger600", variant: "omega", fontWeight: "semiBold", ellipsis: true, children: validationErrorsMessages }) })
656
- ] });
640
+ const errorsToString = (errors2, prefix = "") => {
641
+ if (Object.keys(errors2).length === 0) {
642
+ return "";
643
+ }
644
+ return Object.entries(errors2).map(([key, value]) => {
645
+ if (value === void 0 || value === null) {
646
+ return "";
647
+ }
648
+ if (typeof value === "string") {
649
+ return formatMessage(
650
+ { id: value, defaultMessage: value },
651
+ { field: prefix ? `${prefix}.${key}` : key }
652
+ );
653
+ }
654
+ if (typeof value === "object" && value !== null && "id" in value && "defaultMessage" in value) {
655
+ return formatMessage(
656
+ // @ts-expect-error – TODO: default message will be a string
657
+ { id: `${value.id}.withField`, defaultMessage: value.defaultMessage },
658
+ { field: prefix ? `${prefix}.${key}` : key }
659
+ );
660
+ }
661
+ return errorsToString(value, key);
662
+ }).join(" ");
663
+ };
664
+ if (isLoading) {
665
+ return null;
657
666
  }
658
- if (action == "publish") {
659
- return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
660
- /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
661
- entry.publishedAt ? /* @__PURE__ */ jsx(Typography, { textColor: "success600", fontWeight: "bold", children: formatMessage({
662
- id: "content-releases.pages.ReleaseDetails.entry-validation.already-published",
663
- defaultMessage: "Already published"
664
- }) }) : /* @__PURE__ */ jsx(Typography, { children: formatMessage({
665
- id: "content-releases.pages.ReleaseDetails.entry-validation.ready-to-publish",
666
- defaultMessage: "Ready to publish"
667
- }) })
668
- ] });
667
+ const errors = validate(entry) ?? {};
668
+ if (action === "publish") {
669
+ if (Object.keys(errors).length > 0) {
670
+ const validationErrorsMessages = errorsToString(errors);
671
+ return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
672
+ /* @__PURE__ */ jsx(CrossCircle, { fill: "danger600" }),
673
+ /* @__PURE__ */ jsx(Tooltip, { description: validationErrorsMessages, children: /* @__PURE__ */ jsx(
674
+ TypographyMaxWidth,
675
+ {
676
+ textColor: "danger600",
677
+ variant: "omega",
678
+ fontWeight: "semiBold",
679
+ ellipsis: true,
680
+ children: validationErrorsMessages
681
+ }
682
+ ) })
683
+ ] });
684
+ }
685
+ if (status === "draft") {
686
+ return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
687
+ /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
688
+ /* @__PURE__ */ jsx(Typography, { children: formatMessage({
689
+ id: "content-releases.pages.ReleaseDetails.entry-validation.ready-to-publish",
690
+ defaultMessage: "Ready to publish"
691
+ }) })
692
+ ] });
693
+ }
694
+ if (status === "modified") {
695
+ return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
696
+ /* @__PURE__ */ jsx(ArrowsCounterClockwise, { fill: "alternative600" }),
697
+ /* @__PURE__ */ jsx(Typography, { children: formatMessage({
698
+ id: "content-releases.pages.ReleaseDetails.entry-validation.modified",
699
+ defaultMessage: "Ready to publish changes"
700
+ }) })
701
+ ] });
702
+ }
703
+ if (status === "published") {
704
+ return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
705
+ /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
706
+ /* @__PURE__ */ jsx(Typography, { children: formatMessage({
707
+ id: "content-releases.pages.ReleaseDetails.entry-validation.already-published",
708
+ defaultMessage: "Already published"
709
+ }) })
710
+ ] });
711
+ }
669
712
  }
670
713
  return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
671
714
  /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
@@ -688,7 +731,6 @@ const ReleaseDetailsLayout = ({
688
731
  const {
689
732
  data,
690
733
  isLoading: isLoadingDetails,
691
- isError,
692
734
  error
693
735
  } = useGetReleaseQuery(
694
736
  { id: releaseId },
@@ -720,7 +762,7 @@ const ReleaseDetailsLayout = ({
720
762
  totalPublishedEntries,
721
763
  totalUnpublishedEntries
722
764
  });
723
- } else if (isAxiosError(response.error)) {
765
+ } else if (isFetchError(response.error)) {
724
766
  toggleNotification({
725
767
  type: "danger",
726
768
  message: formatAPIError(response.error)
@@ -755,7 +797,7 @@ const ReleaseDetailsLayout = ({
755
797
  if (isLoadingDetails) {
756
798
  return /* @__PURE__ */ jsx(Page.Loading, {});
757
799
  }
758
- if (isError || !release) {
800
+ if (isBaseQueryError(error) && "code" in error || !release) {
759
801
  return /* @__PURE__ */ jsx(
760
802
  Navigate,
761
803
  {
@@ -763,6 +805,7 @@ const ReleaseDetailsLayout = ({
763
805
  state: {
764
806
  errors: [
765
807
  {
808
+ // @ts-expect-error – TODO: fix this weird error flow
766
809
  code: error?.code
767
810
  }
768
811
  ]
@@ -802,7 +845,7 @@ const ReleaseDetailsLayout = ({
802
845
  ) : "";
803
846
  return /* @__PURE__ */ jsxs(Main, { "aria-busy": isLoadingDetails, children: [
804
847
  /* @__PURE__ */ jsx(
805
- HeaderLayout,
848
+ Layouts.Header,
806
849
  {
807
850
  title: release.name,
808
851
  subtitle: /* @__PURE__ */ jsxs(Flex, { gap: 2, lineHeight: 6, children: [
@@ -811,84 +854,71 @@ const ReleaseDetailsLayout = ({
811
854
  ] }),
812
855
  navigationAction: /* @__PURE__ */ jsx(BackButton, {}),
813
856
  primaryAction: !release.releasedAt && /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
814
- /* @__PURE__ */ jsxs(Menu.Root, { children: [
815
- /* @__PURE__ */ jsx(
816
- Menu.Trigger,
817
- {
818
- as: IconButton,
819
- paddingLeft: 2,
820
- paddingRight: 2,
821
- "aria-label": formatMessage({
822
- id: "content-releases.header.actions.open-release-actions",
823
- defaultMessage: "Release edit and delete menu"
824
- }),
825
- icon: /* @__PURE__ */ jsx(More, {}),
826
- variant: "tertiary"
827
- }
828
- ),
829
- /* @__PURE__ */ jsxs(Menu.Content, { top: 1, popoverPlacement: "bottom-end", maxHeight: void 0, children: [
830
- /* @__PURE__ */ jsxs(
831
- Flex,
832
- {
833
- alignItems: "center",
834
- justifyContent: "center",
835
- direction: "column",
836
- padding: 1,
837
- width: "100%",
838
- children: [
839
- /* @__PURE__ */ jsx(StyledMenuItem, { disabled: !canUpdate, onSelect: toggleEditReleaseModal, children: /* @__PURE__ */ jsxs(Flex, { alignItems: "center", gap: 2, hasRadius: true, width: "100%", children: [
840
- /* @__PURE__ */ jsx(PencilIcon, {}),
841
- /* @__PURE__ */ jsx(Typography, { ellipsis: true, children: formatMessage({
842
- id: "content-releases.header.actions.edit",
843
- defaultMessage: "Edit"
857
+ /* @__PURE__ */ jsxs(
858
+ SimpleMenuButton,
859
+ {
860
+ label: /* @__PURE__ */ jsx(More, {}),
861
+ variant: "tertiary",
862
+ endIcon: null,
863
+ paddingLeft: "7px",
864
+ paddingRight: "7px",
865
+ "aria-label": formatMessage({
866
+ id: "content-releases.header.actions.open-release-actions",
867
+ defaultMessage: "Release edit and delete menu"
868
+ }),
869
+ popoverPlacement: "bottom-end",
870
+ children: [
871
+ /* @__PURE__ */ jsx(StyledMenuItem, { disabled: !canUpdate, onSelect: toggleEditReleaseModal, children: /* @__PURE__ */ jsxs(Flex, { alignItems: "center", gap: 2, hasRadius: true, width: "100%", children: [
872
+ /* @__PURE__ */ jsx(PencilIcon, {}),
873
+ /* @__PURE__ */ jsx(Typography, { ellipsis: true, children: formatMessage({
874
+ id: "content-releases.header.actions.edit",
875
+ defaultMessage: "Edit"
876
+ }) })
877
+ ] }) }),
878
+ /* @__PURE__ */ jsx(
879
+ StyledMenuItem,
880
+ {
881
+ disabled: !canDelete,
882
+ onSelect: toggleWarningSubmit,
883
+ $variant: "danger",
884
+ children: /* @__PURE__ */ jsxs(Flex, { alignItems: "center", gap: 2, hasRadius: true, width: "100%", children: [
885
+ /* @__PURE__ */ jsx(TrashIcon, {}),
886
+ /* @__PURE__ */ jsx(Typography, { ellipsis: true, textColor: "danger600", children: formatMessage({
887
+ id: "content-releases.header.actions.delete",
888
+ defaultMessage: "Delete"
844
889
  }) })
845
- ] }) }),
846
- /* @__PURE__ */ jsx(
847
- StyledMenuItem,
848
- {
849
- disabled: !canDelete,
850
- onSelect: toggleWarningSubmit,
851
- variant: "danger",
852
- children: /* @__PURE__ */ jsxs(Flex, { alignItems: "center", gap: 2, hasRadius: true, width: "100%", children: [
853
- /* @__PURE__ */ jsx(TrashIcon, {}),
854
- /* @__PURE__ */ jsx(Typography, { ellipsis: true, textColor: "danger600", children: formatMessage({
855
- id: "content-releases.header.actions.delete",
856
- defaultMessage: "Delete"
857
- }) })
858
- ] })
859
- }
860
- )
861
- ]
862
- }
863
- ),
864
- /* @__PURE__ */ jsxs(
865
- ReleaseInfoWrapper,
866
- {
867
- direction: "column",
868
- justifyContent: "center",
869
- alignItems: "flex-start",
870
- gap: 1,
871
- padding: 5,
872
- children: [
873
- /* @__PURE__ */ jsx(Typography, { variant: "pi", fontWeight: "bold", children: formatMessage({
874
- id: "content-releases.header.actions.created",
875
- defaultMessage: "Created"
876
- }) }),
877
- /* @__PURE__ */ jsxs(Typography, { variant: "pi", color: "neutral300", children: [
878
- /* @__PURE__ */ jsx(RelativeTime$1, { timestamp: new Date(release.createdAt) }),
879
- formatMessage(
880
- {
881
- id: "content-releases.header.actions.created.description",
882
- defaultMessage: "{hasCreatedByUser, select, true { by {createdBy}} other { by deleted user}}"
883
- },
884
- { createdBy: getCreatedByUser(), hasCreatedByUser }
885
- )
886
890
  ] })
887
- ]
888
- }
889
- )
890
- ] })
891
- ] }),
891
+ }
892
+ ),
893
+ /* @__PURE__ */ jsxs(
894
+ ReleaseInfoWrapper,
895
+ {
896
+ direction: "column",
897
+ justifyContent: "center",
898
+ alignItems: "flex-start",
899
+ gap: 1,
900
+ padding: 4,
901
+ children: [
902
+ /* @__PURE__ */ jsx(Typography, { variant: "pi", fontWeight: "bold", children: formatMessage({
903
+ id: "content-releases.header.actions.created",
904
+ defaultMessage: "Created"
905
+ }) }),
906
+ /* @__PURE__ */ jsxs(Typography, { variant: "pi", color: "neutral300", children: [
907
+ /* @__PURE__ */ jsx(RelativeTime$1, { timestamp: new Date(release.createdAt) }),
908
+ formatMessage(
909
+ {
910
+ id: "content-releases.header.actions.created.description",
911
+ defaultMessage: "{hasCreatedByUser, select, true { by {createdBy}} other { by deleted user}}"
912
+ },
913
+ { createdBy: getCreatedByUser(), hasCreatedByUser }
914
+ )
915
+ ] })
916
+ ]
917
+ }
918
+ )
919
+ ]
920
+ }
921
+ ),
892
922
  /* @__PURE__ */ jsx(Button, { size: "S", variant: "tertiary", onClick: handleRefresh, children: formatMessage({
893
923
  id: "content-releases.header.actions.refresh",
894
924
  defaultMessage: "Refresh"
@@ -913,6 +943,11 @@ const ReleaseDetailsLayout = ({
913
943
  children
914
944
  ] });
915
945
  };
946
+ const SimpleMenuButton = styled(SimpleMenu)`
947
+ & > span {
948
+ display: flex;
949
+ }
950
+ `;
916
951
  const GROUP_BY_OPTIONS = ["contentType", "locale", "action"];
917
952
  const GROUP_BY_OPTIONS_NO_LOCALE = ["contentType", "action"];
918
953
  const getGroupByOptionLabel = (value) => {
@@ -941,26 +976,24 @@ const ReleaseDetailsBody = ({ releaseId }) => {
941
976
  const {
942
977
  data: releaseData,
943
978
  isLoading: isReleaseLoading,
944
- isError: isReleaseError,
945
979
  error: releaseError
946
980
  } = useGetReleaseQuery({ id: releaseId });
947
981
  const {
948
982
  allowedActions: { canUpdate }
949
983
  } = useRBAC(PERMISSIONS);
950
984
  const runHookWaterfall = useStrapiApp("ReleaseDetailsPage", (state) => state.runHookWaterfall);
951
- const { hasI18nEnabled } = runHookWaterfall(
952
- "ContentReleases/pages/ReleaseDetails/add-locale-in-releases",
953
- {
954
- displayedHeaders: {
955
- label: formatMessage({
956
- id: "content-releases.page.ReleaseDetails.table.header.label.locale",
957
- defaultMessage: "locale"
958
- }),
959
- name: "locale"
960
- },
961
- hasI18nEnabled: false
962
- }
963
- );
985
+ const { displayedHeaders, hasI18nEnabled } = runHookWaterfall("ContentReleases/pages/ReleaseDetails/add-locale-in-releases", {
986
+ displayedHeaders: [
987
+ {
988
+ label: {
989
+ id: "content-releases.page.ReleaseDetails.table.header.label.name",
990
+ defaultMessage: "name"
991
+ },
992
+ name: "name"
993
+ }
994
+ ],
995
+ hasI18nEnabled: false
996
+ });
964
997
  const release = releaseData?.data;
965
998
  const selectedGroupBy = query?.groupBy || "contentType";
966
999
  const {
@@ -989,7 +1022,7 @@ const ReleaseDetailsBody = ({ releaseId }) => {
989
1022
  // We are passing the action path to found the position in the cache of the action for optimistic updates
990
1023
  });
991
1024
  if ("error" in response) {
992
- if (isAxiosError(response.error)) {
1025
+ if (isFetchError(response.error)) {
993
1026
  toggleNotification({
994
1027
  type: "danger",
995
1028
  message: formatAPIError(response.error)
@@ -1009,14 +1042,14 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1009
1042
  const releaseMeta = data?.meta;
1010
1043
  const contentTypes = releaseMeta?.contentTypes || {};
1011
1044
  const components = releaseMeta?.components || {};
1012
- if (isReleaseError || !release) {
1045
+ if (isBaseQueryError(releaseError) || !release) {
1013
1046
  const errorsArray = [];
1014
- if (releaseError) {
1047
+ if (releaseError && "code" in releaseError) {
1015
1048
  errorsArray.push({
1016
1049
  code: releaseError.code
1017
1050
  });
1018
1051
  }
1019
- if (releaseActionsError) {
1052
+ if (releaseActionsError && "code" in releaseActionsError) {
1020
1053
  errorsArray.push({
1021
1054
  code: releaseActionsError.code
1022
1055
  });
@@ -1035,13 +1068,13 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1035
1068
  return /* @__PURE__ */ jsx(Page.Error, {});
1036
1069
  }
1037
1070
  if (Object.keys(releaseActions).length === 0) {
1038
- return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(
1071
+ return /* @__PURE__ */ jsx(Layouts.Content, { children: /* @__PURE__ */ jsx(
1039
1072
  EmptyStateLayout,
1040
1073
  {
1041
1074
  action: /* @__PURE__ */ jsx(
1042
1075
  LinkButton,
1043
1076
  {
1044
- as: Link$1,
1077
+ tag: Link$1,
1045
1078
  to: {
1046
1079
  pathname: "/content-manager"
1047
1080
  },
@@ -1066,40 +1099,33 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1066
1099
  defaultMessage: "Group by"
1067
1100
  });
1068
1101
  const headers = [
1069
- // ...displayedHeaders,
1070
- {
1071
- label: formatMessage({
1072
- id: "content-releases.page.ReleaseDetails.table.header.label.name",
1073
- defaultMessage: "name"
1074
- }),
1075
- name: "name"
1076
- },
1102
+ ...displayedHeaders,
1077
1103
  {
1078
- label: formatMessage({
1104
+ label: {
1079
1105
  id: "content-releases.page.ReleaseDetails.table.header.label.content-type",
1080
1106
  defaultMessage: "content-type"
1081
- }),
1107
+ },
1082
1108
  name: "content-type"
1083
1109
  },
1084
1110
  {
1085
- label: formatMessage({
1111
+ label: {
1086
1112
  id: "content-releases.page.ReleaseDetails.table.header.label.action",
1087
1113
  defaultMessage: "action"
1088
- }),
1114
+ },
1089
1115
  name: "action"
1090
1116
  },
1091
1117
  ...!release.releasedAt ? [
1092
1118
  {
1093
- label: formatMessage({
1119
+ label: {
1094
1120
  id: "content-releases.page.ReleaseDetails.table.header.label.status",
1095
1121
  defaultMessage: "status"
1096
- }),
1122
+ },
1097
1123
  name: "status"
1098
1124
  }
1099
1125
  ] : []
1100
1126
  ];
1101
1127
  const options = hasI18nEnabled ? GROUP_BY_OPTIONS : GROUP_BY_OPTIONS_NO_LOCALE;
1102
- return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsxs(Flex, { gap: 8, direction: "column", alignItems: "stretch", children: [
1128
+ return /* @__PURE__ */ jsx(Layouts.Content, { children: /* @__PURE__ */ jsxs(Flex, { gap: 8, direction: "column", alignItems: "stretch", children: [
1103
1129
  /* @__PURE__ */ jsx(Flex, { children: /* @__PURE__ */ jsx(
1104
1130
  SingleSelect,
1105
1131
  {
@@ -1131,10 +1157,10 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1131
1157
  headers,
1132
1158
  isLoading: isLoading || isFetching,
1133
1159
  children: /* @__PURE__ */ jsxs(Table.Content, { children: [
1134
- /* @__PURE__ */ jsx(Table.Head, { children: headers.map((header) => /* @__PURE__ */ jsx(Table.HeaderCell, { ...header }, header.name)) }),
1160
+ /* @__PURE__ */ jsx(Table.Head, { children: headers.map(({ label, name }) => /* @__PURE__ */ jsx(Table.HeaderCell, { label: formatMessage(label), name }, name)) }),
1135
1161
  /* @__PURE__ */ jsx(Table.Loading, {}),
1136
1162
  /* @__PURE__ */ jsx(Table.Body, { children: releaseActions[key].map(
1137
- ({ id, contentType, locale, type, entry }, actionIndex) => /* @__PURE__ */ jsxs(Tr, { children: [
1163
+ ({ id, contentType, locale, type, entry, status }, actionIndex) => /* @__PURE__ */ jsxs(Tr, { children: [
1138
1164
  /* @__PURE__ */ jsx(Td, { width: "25%", maxWidth: "200px", children: /* @__PURE__ */ jsx(Typography, { ellipsis: true, children: `${contentType.mainFieldValue || entry.id}` }) }),
1139
1165
  hasI18nEnabled && /* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: `${locale?.name ? locale.name : "-"}` }) }),
1140
1166
  /* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: contentType.displayName || "" }) }),
@@ -1163,7 +1189,8 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1163
1189
  action: type,
1164
1190
  schema: contentTypes?.[contentType.uid],
1165
1191
  components,
1166
- entry
1192
+ entry,
1193
+ status
1167
1194
  }
1168
1195
  ) }),
1169
1196
  /* @__PURE__ */ jsx(Td, { children: /* @__PURE__ */ jsx(Flex, { justifyContent: "flex-end", children: /* @__PURE__ */ jsxs(ReleaseActionMenu.Root, { children: [
@@ -1171,7 +1198,7 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1171
1198
  ReleaseActionMenu.ReleaseActionEntryLinkItem,
1172
1199
  {
1173
1200
  contentTypeUid: contentType.uid,
1174
- entryId: entry.id,
1201
+ documentId: entry.documentId,
1175
1202
  locale: locale?.code
1176
1203
  }
1177
1204
  ),
@@ -1221,13 +1248,24 @@ const ReleaseDetailsPage = () => {
1221
1248
  skip: !releaseId
1222
1249
  }
1223
1250
  );
1251
+ const { data: dataTimezone, isLoading: isLoadingTimezone } = useGetReleaseSettingsQuery();
1224
1252
  const [updateRelease, { isLoading: isSubmittingForm }] = useUpdateReleaseMutation();
1225
1253
  const [deleteRelease] = useDeleteReleaseMutation();
1226
1254
  const toggleEditReleaseModal = () => {
1227
1255
  setReleaseModalShown((prev) => !prev);
1228
1256
  };
1257
+ const getTimezoneValue = () => {
1258
+ if (releaseData?.timezone) {
1259
+ return releaseData.timezone;
1260
+ } else {
1261
+ if (dataTimezone?.data.defaultTimezone) {
1262
+ return dataTimezone.data.defaultTimezone;
1263
+ }
1264
+ return null;
1265
+ }
1266
+ };
1229
1267
  const toggleWarningSubmit = () => setWarningSubmit((prevState) => !prevState);
1230
- if (isLoadingDetails) {
1268
+ if (isLoadingDetails || isLoadingTimezone) {
1231
1269
  return /* @__PURE__ */ jsx(
1232
1270
  ReleaseDetailsLayout,
1233
1271
  {
@@ -1242,10 +1280,10 @@ const ReleaseDetailsPage = () => {
1242
1280
  }
1243
1281
  const releaseData = isSuccessDetails && data?.data || null;
1244
1282
  const title = releaseData?.name || "";
1245
- const timezone = releaseData?.timezone ?? null;
1283
+ const timezone = getTimezoneValue();
1246
1284
  const scheduledAt = releaseData?.scheduledAt && timezone ? utcToZonedTime(releaseData.scheduledAt, timezone) : null;
1247
- const date = scheduledAt ? format(scheduledAt, "yyyy-MM-dd") : null;
1248
- const time = scheduledAt ? format(scheduledAt, "HH:mm") : "";
1285
+ const date = scheduledAt ? format$1(scheduledAt, "yyyy-MM-dd") : void 0;
1286
+ const time = scheduledAt ? format$1(scheduledAt, "HH:mm") : "";
1249
1287
  const handleEditRelease = async (values) => {
1250
1288
  const response = await updateRelease({
1251
1289
  id: releaseId,
@@ -1262,7 +1300,7 @@ const ReleaseDetailsPage = () => {
1262
1300
  })
1263
1301
  });
1264
1302
  toggleEditReleaseModal();
1265
- } else if (isAxiosError(response.error)) {
1303
+ } else if (isFetchError(response.error)) {
1266
1304
  toggleNotification({
1267
1305
  type: "danger",
1268
1306
  message: formatAPIError(response.error)
@@ -1280,7 +1318,7 @@ const ReleaseDetailsPage = () => {
1280
1318
  });
1281
1319
  if ("data" in response) {
1282
1320
  navigate("..");
1283
- } else if (isAxiosError(response.error)) {
1321
+ } else if (isFetchError(response.error)) {
1284
1322
  toggleNotification({
1285
1323
  type: "danger",
1286
1324
  message: formatAPIError(response.error)
@@ -1299,9 +1337,10 @@ const ReleaseDetailsPage = () => {
1299
1337
  toggleWarningSubmit,
1300
1338
  children: [
1301
1339
  /* @__PURE__ */ jsx(ReleaseDetailsBody, { releaseId }),
1302
- releaseModalShown && /* @__PURE__ */ jsx(
1340
+ /* @__PURE__ */ jsx(
1303
1341
  ReleaseModal,
1304
1342
  {
1343
+ open: releaseModalShown,
1305
1344
  handleClose: toggleEditReleaseModal,
1306
1345
  handleSubmit: handleEditRelease,
1307
1346
  isLoading: isLoadingDetails || isSubmittingForm,
@@ -1315,18 +1354,10 @@ const ReleaseDetailsPage = () => {
1315
1354
  }
1316
1355
  }
1317
1356
  ),
1318
- /* @__PURE__ */ jsx(
1319
- ConfirmDialog,
1320
- {
1321
- isOpen: showWarningSubmit,
1322
- onClose: toggleWarningSubmit,
1323
- onConfirm: handleDeleteRelease,
1324
- children: formatMessage({
1325
- id: "content-releases.dialog.confirmation-message",
1326
- defaultMessage: "Are you sure you want to delete this release?"
1327
- })
1328
- }
1329
- )
1357
+ /* @__PURE__ */ jsx(Dialog.Root, { open: showWarningSubmit, onOpenChange: toggleWarningSubmit, children: /* @__PURE__ */ jsx(ConfirmDialog, { onConfirm: handleDeleteRelease, children: formatMessage({
1358
+ id: "content-releases.dialog.confirmation-message",
1359
+ defaultMessage: "Are you sure you want to delete this release?"
1360
+ }) }) })
1330
1361
  ]
1331
1362
  }
1332
1363
  );
@@ -1340,4 +1371,4 @@ const App = () => {
1340
1371
  export {
1341
1372
  App
1342
1373
  };
1343
- //# sourceMappingURL=App-O0ZO-S35.mjs.map
1374
+ //# sourceMappingURL=App-Cne--1Z8.mjs.map