@strapi/content-releases 0.0.0-experimental.e60ec1829240dae21c1e1d29076681c322288813 → 0.0.0-experimental.eba25ec571b091c6bde1104eb6c753debdf15462

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 (104) hide show
  1. package/LICENSE +17 -1
  2. package/dist/_chunks/{App-BsUSTHVD.mjs → App-FQyYFBJT.mjs} +642 -426
  3. package/dist/_chunks/App-FQyYFBJT.mjs.map +1 -0
  4. package/dist/_chunks/{App-CXRpb2hi.js → App-lx4Ucy9W.js} +680 -466
  5. package/dist/_chunks/App-lx4Ucy9W.js.map +1 -0
  6. package/dist/_chunks/ReleasesSettingsPage-DqBxvJ9i.mjs +178 -0
  7. package/dist/_chunks/ReleasesSettingsPage-DqBxvJ9i.mjs.map +1 -0
  8. package/dist/_chunks/ReleasesSettingsPage-T5VEAV03.js +178 -0
  9. package/dist/_chunks/ReleasesSettingsPage-T5VEAV03.js.map +1 -0
  10. package/dist/_chunks/{en-DtFJ5ViE.js → en-BWPPsSH-.js} +18 -2
  11. package/dist/_chunks/en-BWPPsSH-.js.map +1 -0
  12. package/dist/_chunks/{en-B9Ur3VsE.mjs → en-D9Q4YW03.mjs} +18 -2
  13. package/dist/_chunks/en-D9Q4YW03.mjs.map +1 -0
  14. package/dist/_chunks/{index-DJLIZdZv.mjs → index-CK9G80CL.mjs} +740 -600
  15. package/dist/_chunks/index-CK9G80CL.mjs.map +1 -0
  16. package/dist/_chunks/{index-B6-lic1Q.js → index-Cl3tM1YW.js} +731 -593
  17. package/dist/_chunks/index-Cl3tM1YW.js.map +1 -0
  18. package/dist/_chunks/schemas-BE1LxE9J.js +62 -0
  19. package/dist/_chunks/schemas-BE1LxE9J.js.map +1 -0
  20. package/dist/_chunks/schemas-DdA2ic2U.mjs +44 -0
  21. package/dist/_chunks/schemas-DdA2ic2U.mjs.map +1 -0
  22. package/dist/admin/index.js +1 -1
  23. package/dist/admin/index.mjs +2 -2
  24. package/dist/admin/src/components/EntryValidationPopover.d.ts +13 -0
  25. package/dist/admin/src/components/ReleaseActionMenu.d.ts +3 -3
  26. package/dist/admin/src/components/{CMReleasesContainer.d.ts → ReleaseActionModal.d.ts} +3 -1
  27. package/dist/admin/src/components/ReleaseListCell.d.ts +28 -0
  28. package/dist/admin/src/components/ReleaseModal.d.ts +3 -2
  29. package/dist/admin/src/components/ReleasesPanel.d.ts +3 -0
  30. package/dist/admin/src/constants.d.ts +18 -0
  31. package/dist/admin/src/modules/hooks.d.ts +7 -0
  32. package/dist/admin/src/pages/ReleasesSettingsPage.d.ts +1 -0
  33. package/dist/admin/src/services/release.d.ts +53 -370
  34. package/dist/admin/src/utils/api.d.ts +6 -0
  35. package/dist/admin/src/utils/time.d.ts +9 -0
  36. package/dist/admin/src/validation/schemas.d.ts +6 -0
  37. package/dist/server/index.js +888 -612
  38. package/dist/server/index.js.map +1 -1
  39. package/dist/server/index.mjs +889 -613
  40. package/dist/server/index.mjs.map +1 -1
  41. package/dist/server/src/bootstrap.d.ts.map +1 -1
  42. package/dist/server/src/constants.d.ts +11 -2
  43. package/dist/server/src/constants.d.ts.map +1 -1
  44. package/dist/server/src/content-types/index.d.ts +3 -5
  45. package/dist/server/src/content-types/index.d.ts.map +1 -1
  46. package/dist/server/src/content-types/release-action/index.d.ts +3 -5
  47. package/dist/server/src/content-types/release-action/index.d.ts.map +1 -1
  48. package/dist/server/src/content-types/release-action/schema.d.ts +3 -5
  49. package/dist/server/src/content-types/release-action/schema.d.ts.map +1 -1
  50. package/dist/server/src/controllers/index.d.ts +6 -1
  51. package/dist/server/src/controllers/index.d.ts.map +1 -1
  52. package/dist/server/src/controllers/release-action.d.ts.map +1 -1
  53. package/dist/server/src/controllers/release.d.ts +7 -1
  54. package/dist/server/src/controllers/release.d.ts.map +1 -1
  55. package/dist/server/src/controllers/settings.d.ts +11 -0
  56. package/dist/server/src/controllers/settings.d.ts.map +1 -0
  57. package/dist/server/src/controllers/validation/release-action.d.ts +7 -1
  58. package/dist/server/src/controllers/validation/release-action.d.ts.map +1 -1
  59. package/dist/server/src/controllers/validation/release.d.ts +2 -0
  60. package/dist/server/src/controllers/validation/release.d.ts.map +1 -1
  61. package/dist/server/src/controllers/validation/settings.d.ts +3 -0
  62. package/dist/server/src/controllers/validation/settings.d.ts.map +1 -0
  63. package/dist/server/src/index.d.ts +64 -49
  64. package/dist/server/src/index.d.ts.map +1 -1
  65. package/dist/server/src/middlewares/documents.d.ts +6 -0
  66. package/dist/server/src/middlewares/documents.d.ts.map +1 -0
  67. package/dist/server/src/migrations/database/5.0.0-document-id-in-actions.d.ts +9 -0
  68. package/dist/server/src/migrations/database/5.0.0-document-id-in-actions.d.ts.map +1 -0
  69. package/dist/server/src/migrations/index.d.ts.map +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.d.ts.map +1 -1
  74. package/dist/server/src/routes/settings.d.ts +18 -0
  75. package/dist/server/src/routes/settings.d.ts.map +1 -0
  76. package/dist/server/src/services/index.d.ts +36 -38
  77. package/dist/server/src/services/index.d.ts.map +1 -1
  78. package/dist/server/src/services/release-action.d.ts +34 -0
  79. package/dist/server/src/services/release-action.d.ts.map +1 -0
  80. package/dist/server/src/services/release.d.ts +6 -41
  81. package/dist/server/src/services/release.d.ts.map +1 -1
  82. package/dist/server/src/services/settings.d.ts +13 -0
  83. package/dist/server/src/services/settings.d.ts.map +1 -0
  84. package/dist/server/src/services/validation.d.ts +1 -1
  85. package/dist/server/src/services/validation.d.ts.map +1 -1
  86. package/dist/server/src/utils/index.d.ts +29 -8
  87. package/dist/server/src/utils/index.d.ts.map +1 -1
  88. package/dist/shared/contracts/release-actions.d.ts +17 -11
  89. package/dist/shared/contracts/release-actions.d.ts.map +1 -1
  90. package/dist/shared/contracts/releases.d.ts +9 -7
  91. package/dist/shared/contracts/releases.d.ts.map +1 -1
  92. package/dist/shared/contracts/settings.d.ts +39 -0
  93. package/dist/shared/contracts/settings.d.ts.map +1 -0
  94. package/package.json +23 -22
  95. package/dist/_chunks/App-BsUSTHVD.mjs.map +0 -1
  96. package/dist/_chunks/App-CXRpb2hi.js.map +0 -1
  97. package/dist/_chunks/en-B9Ur3VsE.mjs.map +0 -1
  98. package/dist/_chunks/en-DtFJ5ViE.js.map +0 -1
  99. package/dist/_chunks/index-B6-lic1Q.js.map +0 -1
  100. package/dist/_chunks/index-DJLIZdZv.mjs.map +0 -1
  101. package/dist/admin/src/services/axios.d.ts +0 -29
  102. package/dist/shared/validation-schemas.d.ts +0 -2
  103. package/dist/shared/validation-schemas.d.ts.map +0 -1
  104. package/strapi-server.js +0 -3
@@ -1,21 +1,306 @@
1
- import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
- import { useNotification, useAPIErrorHandler, useQueryParams, useTracking, useRBAC, Page, Layouts, 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-DJLIZdZv.mjs";
1
+ import { jsxs, jsx, Fragment } from "react/jsx-runtime";
2
+ import { useNotification, useAPIErrorHandler, useQueryParams, useTracking, useRBAC, Page, Layouts, Pagination, isFetchError, ConfirmDialog, BackButton, useStrapiApp, Table } from "@strapi/admin/strapi-admin";
3
+ import { Link, useLocation, useNavigate, NavLink, useParams, Navigate, 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-CK9G80CL.mjs";
5
5
  import * as React from "react";
6
- import { unstable_useDocument } from "@strapi/content-manager/strapi-admin";
7
- import { ModalLayout, ModalHeader, Typography, ModalBody, Flex, TextInput, Box, Checkbox, DatePicker, TimePicker, ModalFooter, Button, Combobox, ComboboxOption, Link, Alert, Main, TabGroup, Tabs, Tab, Divider, TabPanels, TabPanel, EmptyStateLayout, Grid, GridItem, Badge, Menu, IconButton, LinkButton, SingleSelect, SingleSelectOption, Tr, Td, Tooltip } from "@strapi/design-system";
8
- import { Plus, Pencil, Trash, More, CrossCircle, CheckCircle } from "@strapi/icons";
6
+ import { Flex, Popover, Button, Typography, LinkButton, Modal, Field, TextInput, Box, Checkbox, DatePicker, TimePicker, Combobox, ComboboxOption, Link as Link$1, Alert, Main, Tabs, Divider, EmptyStateLayout, Grid, Badge, MenuItem, SimpleMenu, Dialog, SingleSelect, SingleSelectOption, Tr, Td } from "@strapi/design-system";
7
+ import { CrossCircle, CaretDown, CheckCircle, ArrowsCounterClockwise, Plus, Pencil, Trash, More } from "@strapi/icons";
9
8
  import { EmptyDocuments } from "@strapi/icons/symbols";
10
- import format from "date-fns/format";
9
+ import format$1 from "date-fns/format";
11
10
  import { utcToZonedTime, zonedTimeToUtc } from "date-fns-tz";
12
11
  import { useIntl } from "react-intl";
13
- import styled from "styled-components";
14
- import { intervalToDuration, isPast, formatISO } from "date-fns";
12
+ import { styled } from "styled-components";
13
+ import { unstable_useDocument } from "@strapi/content-manager/strapi-admin";
14
+ import { stringify } from "qs";
15
+ import { intervalToDuration, isPast, formatISO, format } from "date-fns";
15
16
  import { Formik, Form, useFormikContext } from "formik";
16
- import * as yup from "yup";
17
+ import { R as RELEASE_SCHEMA } from "./schemas-DdA2ic2U.mjs";
17
18
  import { useDispatch } from "react-redux";
18
19
  import { useLicenseLimits } from "@strapi/admin/strapi-admin/ee";
20
+ const StyledPopoverFlex = styled(Flex)`
21
+ width: 100%;
22
+ max-width: 256px;
23
+
24
+ & > * {
25
+ border-bottom: 1px solid ${({ theme }) => theme.colors.neutral150};
26
+ }
27
+
28
+ & > *:last-child {
29
+ border-bottom: none;
30
+ }
31
+ `;
32
+ const EntryStatusTrigger = ({
33
+ action,
34
+ status,
35
+ hasErrors,
36
+ requiredStage,
37
+ entryStage
38
+ }) => {
39
+ const { formatMessage } = useIntl();
40
+ if (action === "publish") {
41
+ if (hasErrors || requiredStage && requiredStage.id !== entryStage?.id) {
42
+ return /* @__PURE__ */ jsx(Popover.Trigger, { children: /* @__PURE__ */ jsx(
43
+ Button,
44
+ {
45
+ variant: "ghost",
46
+ startIcon: /* @__PURE__ */ jsx(CrossCircle, { fill: "danger600" }),
47
+ endIcon: /* @__PURE__ */ jsx(CaretDown, {}),
48
+ children: /* @__PURE__ */ jsx(Typography, { textColor: "danger600", variant: "omega", fontWeight: "bold", children: formatMessage({
49
+ id: "content-releases.pages.ReleaseDetails.entry-validation.not-ready",
50
+ defaultMessage: "Not ready to publish"
51
+ }) })
52
+ }
53
+ ) });
54
+ }
55
+ if (status === "draft") {
56
+ return /* @__PURE__ */ jsx(Popover.Trigger, { children: /* @__PURE__ */ jsx(
57
+ Button,
58
+ {
59
+ variant: "ghost",
60
+ startIcon: /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
61
+ endIcon: /* @__PURE__ */ jsx(CaretDown, {}),
62
+ children: /* @__PURE__ */ jsx(Typography, { textColor: "success600", variant: "omega", fontWeight: "bold", children: formatMessage({
63
+ id: "content-releases.pages.ReleaseDetails.entry-validation.ready-to-publish",
64
+ defaultMessage: "Ready to publish"
65
+ }) })
66
+ }
67
+ ) });
68
+ }
69
+ if (status === "modified") {
70
+ return /* @__PURE__ */ jsx(Popover.Trigger, { children: /* @__PURE__ */ jsx(
71
+ Button,
72
+ {
73
+ variant: "ghost",
74
+ startIcon: /* @__PURE__ */ jsx(ArrowsCounterClockwise, { fill: "alternative600" }),
75
+ endIcon: /* @__PURE__ */ jsx(CaretDown, {}),
76
+ children: /* @__PURE__ */ jsx(Typography, { variant: "omega", fontWeight: "bold", textColor: "alternative600", children: formatMessage({
77
+ id: "content-releases.pages.ReleaseDetails.entry-validation.modified",
78
+ defaultMessage: "Ready to publish changes"
79
+ }) })
80
+ }
81
+ ) });
82
+ }
83
+ return /* @__PURE__ */ jsx(Popover.Trigger, { children: /* @__PURE__ */ jsx(
84
+ Button,
85
+ {
86
+ variant: "ghost",
87
+ startIcon: /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
88
+ endIcon: /* @__PURE__ */ jsx(CaretDown, {}),
89
+ children: /* @__PURE__ */ jsx(Typography, { textColor: "success600", variant: "omega", fontWeight: "bold", children: formatMessage({
90
+ id: "content-releases.pages.ReleaseDetails.entry-validation.already-published",
91
+ defaultMessage: "Already published"
92
+ }) })
93
+ }
94
+ ) });
95
+ }
96
+ if (status === "published") {
97
+ return /* @__PURE__ */ jsx(Popover.Trigger, { children: /* @__PURE__ */ jsx(
98
+ Button,
99
+ {
100
+ variant: "ghost",
101
+ startIcon: /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
102
+ endIcon: /* @__PURE__ */ jsx(CaretDown, {}),
103
+ children: /* @__PURE__ */ jsx(Typography, { textColor: "success600", variant: "omega", fontWeight: "bold", children: formatMessage({
104
+ id: "content-releases.pages.ReleaseDetails.entry-validation.ready-to-unpublish",
105
+ defaultMessage: "Ready to unpublish"
106
+ }) })
107
+ }
108
+ ) });
109
+ }
110
+ return /* @__PURE__ */ jsx(Popover.Trigger, { children: /* @__PURE__ */ jsx(Button, { variant: "ghost", startIcon: /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }), endIcon: /* @__PURE__ */ jsx(CaretDown, {}), children: /* @__PURE__ */ jsx(Typography, { textColor: "success600", variant: "omega", fontWeight: "bold", children: formatMessage({
111
+ id: "content-releases.pages.ReleaseDetails.entry-validation.already-unpublished",
112
+ defaultMessage: "Already unpublished"
113
+ }) }) }) });
114
+ };
115
+ const FieldsValidation = ({
116
+ hasErrors,
117
+ errors,
118
+ kind,
119
+ contentTypeUid,
120
+ documentId,
121
+ locale
122
+ }) => {
123
+ const { formatMessage } = useIntl();
124
+ return /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: 1, width: "100%", padding: 5, children: [
125
+ /* @__PURE__ */ jsxs(Flex, { gap: 2, width: "100%", children: [
126
+ /* @__PURE__ */ jsx(Typography, { fontWeight: "bold", children: formatMessage({
127
+ id: "content-releases.pages.ReleaseDetails.entry-validation.fields",
128
+ defaultMessage: "Fields"
129
+ }) }),
130
+ hasErrors ? /* @__PURE__ */ jsx(CrossCircle, { fill: "danger600" }) : /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" })
131
+ ] }),
132
+ /* @__PURE__ */ jsx(Typography, { width: "100%", textColor: "neutral600", children: hasErrors ? formatMessage(
133
+ {
134
+ id: "content-releases.pages.ReleaseDetails.entry-validation.fields.error",
135
+ defaultMessage: "{errors} errors on fields."
136
+ },
137
+ { errors: errors ? Object.keys(errors).length : 0 }
138
+ ) : formatMessage({
139
+ id: "content-releases.pages.ReleaseDetails.entry-validation.fields.success",
140
+ defaultMessage: "All fields are filled correctly."
141
+ }) }),
142
+ hasErrors && /* @__PURE__ */ jsx(
143
+ LinkButton,
144
+ {
145
+ tag: Link,
146
+ to: {
147
+ pathname: `/content-manager/${kind === "collectionType" ? "collection-types" : "single-types"}/${contentTypeUid}/${documentId}`,
148
+ search: locale ? stringify({
149
+ plugins: {
150
+ i18n: {
151
+ locale
152
+ }
153
+ }
154
+ }) : ""
155
+ },
156
+ variant: "secondary",
157
+ fullWidth: true,
158
+ state: { forceValidation: true },
159
+ children: formatMessage({
160
+ id: "content-releases.pages.ReleaseDetails.entry-validation.fields.see-errors",
161
+ defaultMessage: "See errors"
162
+ })
163
+ }
164
+ )
165
+ ] });
166
+ };
167
+ const getReviewStageIcon = ({
168
+ contentTypeHasReviewWorkflow,
169
+ requiredStage,
170
+ entryStage
171
+ }) => {
172
+ if (!contentTypeHasReviewWorkflow) {
173
+ return /* @__PURE__ */ jsx(CheckCircle, { fill: "neutral200" });
174
+ }
175
+ if (requiredStage && requiredStage.id !== entryStage?.id) {
176
+ return /* @__PURE__ */ jsx(CrossCircle, { fill: "danger600" });
177
+ }
178
+ return /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" });
179
+ };
180
+ const getReviewStageMessage = ({
181
+ contentTypeHasReviewWorkflow,
182
+ requiredStage,
183
+ entryStage,
184
+ formatMessage
185
+ }) => {
186
+ if (!contentTypeHasReviewWorkflow) {
187
+ return formatMessage({
188
+ id: "content-releases.pages.ReleaseDetails.entry-validation.review-stage.not-enabled",
189
+ defaultMessage: "This entry is not associated to any workflow."
190
+ });
191
+ }
192
+ if (requiredStage && requiredStage.id !== entryStage?.id) {
193
+ return formatMessage(
194
+ {
195
+ id: "content-releases.pages.ReleaseDetails.entry-validation.review-stage.not-ready",
196
+ defaultMessage: "This entry is not at the required stage for publishing. ({stageName})"
197
+ },
198
+ {
199
+ stageName: requiredStage?.name ?? ""
200
+ }
201
+ );
202
+ }
203
+ if (requiredStage && requiredStage.id === entryStage?.id) {
204
+ return formatMessage(
205
+ {
206
+ id: "content-releases.pages.ReleaseDetails.entry-validation.review-stage.ready",
207
+ defaultMessage: "This entry is at the required stage for publishing. ({stageName})"
208
+ },
209
+ {
210
+ stageName: requiredStage?.name ?? ""
211
+ }
212
+ );
213
+ }
214
+ return formatMessage({
215
+ id: "content-releases.pages.ReleaseDetails.entry-validation.review-stage.stage-not-required",
216
+ defaultMessage: "No required stage for publication"
217
+ });
218
+ };
219
+ const ReviewStageValidation = ({
220
+ contentTypeHasReviewWorkflow,
221
+ requiredStage,
222
+ entryStage
223
+ }) => {
224
+ const { formatMessage } = useIntl();
225
+ const Icon = getReviewStageIcon({
226
+ contentTypeHasReviewWorkflow,
227
+ requiredStage,
228
+ entryStage
229
+ });
230
+ return /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: 1, width: "100%", padding: 5, children: [
231
+ /* @__PURE__ */ jsxs(Flex, { gap: 2, width: "100%", children: [
232
+ /* @__PURE__ */ jsx(Typography, { fontWeight: "bold", children: formatMessage({
233
+ id: "content-releases.pages.ReleaseDetails.entry-validation.review-stage",
234
+ defaultMessage: "Review stage"
235
+ }) }),
236
+ Icon
237
+ ] }),
238
+ /* @__PURE__ */ jsx(Typography, { textColor: "neutral600", children: getReviewStageMessage({
239
+ contentTypeHasReviewWorkflow,
240
+ requiredStage,
241
+ entryStage,
242
+ formatMessage
243
+ }) })
244
+ ] });
245
+ };
246
+ const EntryValidationPopover = ({
247
+ schema,
248
+ entry,
249
+ status,
250
+ action
251
+ }) => {
252
+ const { validate, isLoading } = unstable_useDocument(
253
+ {
254
+ collectionType: schema?.kind ?? "",
255
+ model: schema?.uid ?? ""
256
+ },
257
+ {
258
+ // 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
259
+ skip: true
260
+ }
261
+ );
262
+ const errors = isLoading ? null : validate(entry);
263
+ const hasErrors = errors ? Object.keys(errors).length > 0 : false;
264
+ const contentTypeHasReviewWorkflow = schema?.hasReviewWorkflow ?? false;
265
+ const requiredStage = schema?.stageRequiredToPublish;
266
+ const entryStage = entry.strapi_stage;
267
+ if (isLoading) {
268
+ return null;
269
+ }
270
+ return /* @__PURE__ */ jsxs(Popover.Root, { children: [
271
+ /* @__PURE__ */ jsx(
272
+ EntryStatusTrigger,
273
+ {
274
+ action,
275
+ status,
276
+ hasErrors,
277
+ requiredStage,
278
+ entryStage
279
+ }
280
+ ),
281
+ /* @__PURE__ */ jsx(Popover.Content, { children: /* @__PURE__ */ jsxs(StyledPopoverFlex, { direction: "column", children: [
282
+ /* @__PURE__ */ jsx(
283
+ FieldsValidation,
284
+ {
285
+ hasErrors,
286
+ errors,
287
+ contentTypeUid: schema?.uid,
288
+ kind: schema?.kind,
289
+ documentId: entry.documentId,
290
+ locale: entry.locale
291
+ }
292
+ ),
293
+ /* @__PURE__ */ jsx(
294
+ ReviewStageValidation,
295
+ {
296
+ contentTypeHasReviewWorkflow,
297
+ requiredStage,
298
+ entryStage
299
+ }
300
+ )
301
+ ] }) })
302
+ ] });
303
+ };
19
304
  const intervals = ["years", "months", "days", "hours", "minutes", "seconds"];
20
305
  const RelativeTime$1 = React.forwardRef(
21
306
  ({ timestamp, customIntervals = [], ...restProps }, forwardedRef) => {
@@ -46,28 +331,9 @@ const RelativeTime$1 = React.forwardRef(
46
331
  );
47
332
  }
48
333
  );
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
334
  const ReleaseModal = ({
70
335
  handleClose,
336
+ open,
71
337
  handleSubmit,
72
338
  initialValues,
73
339
  isLoading = false
@@ -91,8 +357,8 @@ const ReleaseModal = ({
91
357
  );
92
358
  return currentTimezone?.value || systemTimezone.value;
93
359
  };
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(
360
+ return /* @__PURE__ */ jsx(Modal.Root, { open, onOpenChange: handleClose, children: /* @__PURE__ */ jsxs(Modal.Content, { children: [
361
+ /* @__PURE__ */ jsx(Modal.Header, { children: /* @__PURE__ */ jsx(Modal.Title, { children: formatMessage(
96
362
  {
97
363
  id: "content-releases.modal.title",
98
364
  defaultMessage: "{isCreatingRelease, select, true {New release} other {Edit release}}"
@@ -115,133 +381,143 @@ const ReleaseModal = ({
115
381
  },
116
382
  validationSchema: RELEASE_SCHEMA,
117
383
  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: () => {
384
+ children: ({ values, errors, handleChange, setFieldValue }) => {
385
+ return /* @__PURE__ */ jsxs(Form, { children: [
386
+ /* @__PURE__ */ jsx(Modal.Body, { children: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 6, children: [
387
+ /* @__PURE__ */ jsxs(
388
+ Field.Root,
389
+ {
390
+ name: "name",
391
+ error: errors.name && formatMessage({ id: errors.name, defaultMessage: errors.name }),
392
+ required: true,
393
+ children: [
394
+ /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
395
+ id: "content-releases.modal.form.input.label.release-name",
396
+ defaultMessage: "Name"
397
+ }) }),
398
+ /* @__PURE__ */ jsx(TextInput, { value: values.name, onChange: handleChange }),
399
+ /* @__PURE__ */ jsx(Field.Error, {})
400
+ ]
401
+ }
402
+ ),
403
+ /* @__PURE__ */ jsx(Box, { width: "max-content", children: /* @__PURE__ */ jsx(
404
+ Checkbox,
405
+ {
406
+ name: "isScheduled",
407
+ checked: values.isScheduled,
408
+ onCheckedChange: (checked) => {
409
+ setFieldValue("isScheduled", checked);
410
+ if (!checked) {
184
411
  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
412
  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(
413
+ setFieldValue("timezone", null);
414
+ } else {
415
+ setFieldValue("date", initialValues.date);
416
+ setFieldValue("time", initialValues.time);
417
+ setFieldValue(
418
+ "timezone",
419
+ initialValues.timezone ?? systemTimezone?.value
420
+ );
421
+ }
422
+ },
423
+ children: /* @__PURE__ */ jsx(
424
+ Typography,
425
+ {
426
+ textColor: values.isScheduled ? "primary600" : "neutral800",
427
+ fontWeight: values.isScheduled ? "semiBold" : "regular",
428
+ children: formatMessage({
429
+ id: "modal.form.input.label.schedule-release",
430
+ defaultMessage: "Schedule release"
431
+ })
432
+ }
433
+ )
434
+ }
435
+ ) }),
436
+ values.isScheduled && /* @__PURE__ */ jsxs(Fragment, { children: [
437
+ /* @__PURE__ */ jsxs(Flex, { gap: 4, alignItems: "start", children: [
438
+ /* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsxs(
439
+ Field.Root,
440
+ {
441
+ name: "date",
442
+ error: errors.date && formatMessage({ id: errors.date, defaultMessage: errors.date }),
443
+ required: true,
444
+ children: [
445
+ /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
446
+ id: "content-releases.modal.form.input.label.date",
447
+ defaultMessage: "Date"
448
+ }) }),
449
+ /* @__PURE__ */ jsx(
450
+ DatePicker,
451
+ {
452
+ onChange: (date) => {
453
+ const isoFormatDate = date ? formatISO(date, { representation: "date" }) : null;
454
+ setFieldValue("date", isoFormatDate);
455
+ },
456
+ clearLabel: formatMessage({
457
+ id: "content-releases.modal.form.input.clearLabel",
458
+ defaultMessage: "Clear"
459
+ }),
460
+ onClear: () => {
461
+ setFieldValue("date", null);
462
+ },
463
+ value: values.date ? new Date(values.date) : /* @__PURE__ */ new Date(),
464
+ minDate: utcToZonedTime(/* @__PURE__ */ new Date(), values.timezone.split("&")[1])
465
+ }
466
+ ),
467
+ /* @__PURE__ */ jsx(Field.Error, {})
468
+ ]
469
+ }
470
+ ) }),
471
+ /* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsxs(
472
+ Field.Root,
473
+ {
474
+ name: "time",
475
+ error: errors.time && formatMessage({ id: errors.time, defaultMessage: errors.time }),
476
+ required: true,
477
+ children: [
478
+ /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
479
+ id: "content-releases.modal.form.input.label.time",
480
+ defaultMessage: "Time"
481
+ }) }),
482
+ /* @__PURE__ */ jsx(
483
+ TimePicker,
484
+ {
485
+ onChange: (time) => {
486
+ setFieldValue("time", time);
487
+ },
488
+ clearLabel: formatMessage({
489
+ id: "content-releases.modal.form.input.clearLabel",
490
+ defaultMessage: "Clear"
491
+ }),
492
+ onClear: () => {
493
+ setFieldValue("time", "");
494
+ },
495
+ value: values.time || void 0
496
+ }
497
+ ),
498
+ /* @__PURE__ */ jsx(Field.Error, {})
499
+ ]
500
+ }
501
+ ) })
502
+ ] }),
503
+ /* @__PURE__ */ jsx(TimezoneComponent, { timezoneOptions: timezoneList })
504
+ ] })
505
+ ] }) }),
506
+ /* @__PURE__ */ jsxs(Modal.Footer, { children: [
507
+ /* @__PURE__ */ jsx(Modal.Close, { children: /* @__PURE__ */ jsx(Button, { variant: "tertiary", name: "cancel", children: formatMessage({ id: "cancel", defaultMessage: "Cancel" }) }) }),
508
+ /* @__PURE__ */ jsx(Button, { name: "submit", loading: isLoading, type: "submit", children: formatMessage(
223
509
  {
224
510
  id: "content-releases.modal.form.button.submit",
225
511
  defaultMessage: "{isCreatingRelease, select, true {Continue} other {Save}}"
226
512
  },
227
513
  { isCreatingRelease }
228
514
  ) })
229
- }
230
- )
231
- ] })
515
+ ] })
516
+ ] });
517
+ }
232
518
  }
233
519
  )
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 };
520
+ ] }) });
245
521
  };
246
522
  const TimezoneComponent = ({ timezoneOptions }) => {
247
523
  const { values, errors, setFieldValue } = useFormikContext();
@@ -257,34 +533,45 @@ const TimezoneComponent = ({ timezoneOptions }) => {
257
533
  }
258
534
  }
259
535
  }, [setFieldValue, values.date, values.timezone]);
260
- return /* @__PURE__ */ jsx(
261
- Combobox,
536
+ return /* @__PURE__ */ jsxs(
537
+ Field.Root,
262
538
  {
263
- label: formatMessage({
264
- id: "content-releases.modal.form.input.label.timezone",
265
- defaultMessage: "Timezone"
266
- }),
267
- autocomplete: { type: "list", filter: "contains" },
268
539
  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,
540
+ error: errors.timezone && formatMessage({ id: errors.timezone, defaultMessage: errors.timezone }),
281
541
  required: true,
282
- children: timezoneList.map((timezone) => /* @__PURE__ */ jsx(ComboboxOption, { value: timezone.value, children: timezone.value.replace(/&/, " ") }, timezone.value))
542
+ children: [
543
+ /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
544
+ id: "content-releases.modal.form.input.label.timezone",
545
+ defaultMessage: "Timezone"
546
+ }) }),
547
+ /* @__PURE__ */ jsx(
548
+ Combobox,
549
+ {
550
+ autocomplete: { type: "list", filter: "contains" },
551
+ value: values.timezone || void 0,
552
+ textValue: values.timezone ? values.timezone.replace(/&/, " ") : void 0,
553
+ onChange: (timezone) => {
554
+ setFieldValue("timezone", timezone);
555
+ },
556
+ onTextValueChange: (timezone) => {
557
+ setFieldValue("timezone", timezone);
558
+ },
559
+ onClear: () => {
560
+ setFieldValue("timezone", "");
561
+ },
562
+ children: timezoneList.map((timezone) => /* @__PURE__ */ jsx(ComboboxOption, { value: timezone.value, children: timezone.value.replace(/&/, " ") }, timezone.value))
563
+ }
564
+ ),
565
+ /* @__PURE__ */ jsx(Field.Error, {})
566
+ ]
283
567
  }
284
568
  );
285
569
  };
286
570
  const useTypedDispatch = useDispatch;
287
- const LinkCard = styled(Link)`
571
+ const isBaseQueryError = (error) => {
572
+ return typeof error !== "undefined" && error.name !== void 0;
573
+ };
574
+ const LinkCard = styled(Link$1)`
288
575
  display: block;
289
576
  `;
290
577
  const RelativeTime = styled(RelativeTime$1)`
@@ -340,7 +627,7 @@ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
340
627
  }
341
628
  );
342
629
  }
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(
630
+ 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
631
  Flex,
345
632
  {
346
633
  direction: "column",
@@ -355,7 +642,7 @@ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
355
642
  gap: 4,
356
643
  children: [
357
644
  /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "start", gap: 1, children: [
358
- /* @__PURE__ */ jsx(Typography, { as: "h3", variant: "delta", fontWeight: "bold", children: name }),
645
+ /* @__PURE__ */ jsx(Typography, { textColor: "neutral800", tag: "h3", variant: "delta", fontWeight: "bold", children: name }),
359
646
  /* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: scheduledAt ? /* @__PURE__ */ jsx(RelativeTime, { timestamp: new Date(scheduledAt) }) : formatMessage({
360
647
  id: "content-releases.pages.Releases.not-scheduled",
361
648
  defaultMessage: "Not scheduled"
@@ -376,14 +663,13 @@ const StyledAlert = styled(Alert)`
376
663
  `;
377
664
  const INITIAL_FORM_VALUES = {
378
665
  name: "",
379
- date: null,
666
+ date: format(/* @__PURE__ */ new Date(), "yyyy-MM-dd"),
380
667
  time: "",
381
668
  isScheduled: true,
382
669
  scheduledAt: null,
383
670
  timezone: null
384
671
  };
385
672
  const ReleasesPage = () => {
386
- const tabRef = React.useRef(null);
387
673
  const location = useLocation();
388
674
  const [releaseModalShown, setReleaseModalShown] = React.useState(false);
389
675
  const { toggleNotification } = useNotification();
@@ -392,6 +678,7 @@ const ReleasesPage = () => {
392
678
  const { formatAPIError } = useAPIErrorHandler();
393
679
  const [{ query }, setQuery] = useQueryParams();
394
680
  const response = useGetReleasesQuery(query);
681
+ const { data, isLoading: isLoadingSettings } = useGetReleaseSettingsQuery();
395
682
  const [createRelease, { isLoading: isSubmittingForm }] = useCreateReleaseMutation();
396
683
  const { getFeature } = useLicenseLimits();
397
684
  const { maximumReleases = 3 } = getFeature("cms-content-releases");
@@ -399,9 +686,8 @@ const ReleasesPage = () => {
399
686
  const {
400
687
  allowedActions: { canCreate }
401
688
  } = useRBAC(PERMISSIONS);
402
- const { isLoading, isSuccess, isError } = response;
689
+ const { isLoading: isLoadingReleases, isSuccess, isError } = response;
403
690
  const activeTab = response?.currentData?.meta?.activeTab || "pending";
404
- const activeTabIndex = ["pending", "done"].indexOf(activeTab);
405
691
  React.useEffect(() => {
406
692
  if (location?.state?.errors) {
407
693
  toggleNotification({
@@ -418,27 +704,22 @@ const ReleasesPage = () => {
418
704
  navigate("", { replace: true, state: null });
419
705
  }
420
706
  }, [formatMessage, location?.state?.errors, navigate, toggleNotification]);
421
- React.useEffect(() => {
422
- if (tabRef.current) {
423
- tabRef.current._handlers.setSelectedTabIndex(activeTabIndex);
424
- }
425
- }, [activeTabIndex]);
426
707
  const toggleAddReleaseModal = () => {
427
708
  setReleaseModalShown((prev) => !prev);
428
709
  };
429
- if (isLoading) {
710
+ if (isLoadingReleases || isLoadingSettings) {
430
711
  return /* @__PURE__ */ jsx(Page.Loading, {});
431
712
  }
432
713
  const totalPendingReleases = isSuccess && response.currentData?.meta?.pendingReleasesCount || 0;
433
714
  const hasReachedMaximumPendingReleases = totalPendingReleases >= maximumReleases;
434
- const handleTabChange = (index) => {
715
+ const handleTabChange = (tabValue) => {
435
716
  setQuery({
436
717
  ...query,
437
718
  page: 1,
438
719
  pageSize: response?.currentData?.meta?.pagination?.pageSize || 16,
439
720
  filters: {
440
721
  releasedAt: {
441
- $notNull: index === 0 ? false : true
722
+ $notNull: tabValue !== "pending"
442
723
  }
443
724
  }
444
725
  });
@@ -459,7 +740,7 @@ const ReleasesPage = () => {
459
740
  });
460
741
  trackUsage("didCreateRelease");
461
742
  navigate(response2.data.data.id.toString());
462
- } else if (isAxiosError(response2.error)) {
743
+ } else if (isFetchError(response2.error)) {
463
744
  toggleNotification({
464
745
  type: "danger",
465
746
  message: formatAPIError(response2.error)
@@ -471,7 +752,7 @@ const ReleasesPage = () => {
471
752
  });
472
753
  }
473
754
  };
474
- return /* @__PURE__ */ jsxs(Main, { "aria-busy": isLoading, children: [
755
+ return /* @__PURE__ */ jsxs(Main, { "aria-busy": isLoadingReleases || isLoadingSettings, children: [
475
756
  /* @__PURE__ */ jsx(
476
757
  Layouts.Header,
477
758
  {
@@ -502,7 +783,7 @@ const ReleasesPage = () => {
502
783
  StyledAlert,
503
784
  {
504
785
  marginBottom: 6,
505
- action: /* @__PURE__ */ jsx(Link, { href: "https://strapi.io/pricing-cloud", isExternal: true, children: formatMessage({
786
+ action: /* @__PURE__ */ jsx(Link$1, { href: "https://strapi.io/pricing-cloud", isExternal: true, children: formatMessage({
506
787
  id: "content-releases.pages.Releases.max-limit-reached.action",
507
788
  defaultMessage: "Explore plans"
508
789
  }) }),
@@ -522,21 +803,17 @@ const ReleasesPage = () => {
522
803
  })
523
804
  }
524
805
  ),
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(
806
+ /* @__PURE__ */ jsxs(Tabs.Root, { variant: "simple", onValueChange: handleTabChange, value: activeTab, children: [
807
+ /* @__PURE__ */ jsxs(Box, { paddingBottom: 8, children: [
808
+ /* @__PURE__ */ jsxs(
809
+ Tabs.List,
810
+ {
811
+ "aria-label": formatMessage({
812
+ id: "content-releases.pages.Releases.tab-group.label",
813
+ defaultMessage: "Releases list"
814
+ }),
815
+ children: [
816
+ /* @__PURE__ */ jsx(Tabs.Trigger, { value: "pending", children: formatMessage(
540
817
  {
541
818
  id: "content-releases.pages.Releases.tab.pending",
542
819
  defaultMessage: "Pending ({count})"
@@ -545,34 +822,32 @@ const ReleasesPage = () => {
545
822
  count: totalPendingReleases
546
823
  }
547
824
  ) }),
548
- /* @__PURE__ */ jsx(Tab, { children: formatMessage({
825
+ /* @__PURE__ */ jsx(Tabs.Trigger, { value: "done", children: formatMessage({
549
826
  id: "content-releases.pages.Releases.tab.done",
550
827
  defaultMessage: "Done"
551
828
  }) })
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
- ),
829
+ ]
830
+ }
831
+ ),
832
+ /* @__PURE__ */ jsx(Divider, {})
833
+ ] }),
834
+ /* @__PURE__ */ jsx(Tabs.Content, { value: "pending", children: /* @__PURE__ */ jsx(
835
+ ReleasesGrid,
836
+ {
837
+ sectionTitle: "pending",
838
+ releases: response?.currentData?.data,
839
+ isError
840
+ }
841
+ ) }),
842
+ /* @__PURE__ */ jsx(Tabs.Content, { value: "done", children: /* @__PURE__ */ jsx(
843
+ ReleasesGrid,
844
+ {
845
+ sectionTitle: "done",
846
+ releases: response?.currentData?.data,
847
+ isError
848
+ }
849
+ ) })
850
+ ] }),
576
851
  /* @__PURE__ */ jsxs(
577
852
  Pagination.Root,
578
853
  {
@@ -585,13 +860,17 @@ const ReleasesPage = () => {
585
860
  }
586
861
  )
587
862
  ] }) }),
588
- releaseModalShown && /* @__PURE__ */ jsx(
863
+ /* @__PURE__ */ jsx(
589
864
  ReleaseModal,
590
865
  {
866
+ open: releaseModalShown,
591
867
  handleClose: toggleAddReleaseModal,
592
868
  handleSubmit: handleAddRelease,
593
869
  isLoading: isSubmittingForm,
594
- initialValues: INITIAL_FORM_VALUES
870
+ initialValues: {
871
+ ...INITIAL_FORM_VALUES,
872
+ timezone: data?.data.defaultTimezone ? data.data.defaultTimezone.split("&")[1] : null
873
+ }
595
874
  }
596
875
  )
597
876
  ] });
@@ -602,7 +881,7 @@ const ReleaseInfoWrapper = styled(Flex)`
602
881
  border-bottom-left-radius: ${({ theme }) => theme.borderRadius};
603
882
  border-top: 1px solid ${({ theme }) => theme.colors.neutral150};
604
883
  `;
605
- const StyledMenuItem = styled(Menu.Item)`
884
+ const StyledMenuItem = styled(MenuItem)`
606
885
  svg path {
607
886
  fill: ${({ theme, disabled }) => disabled && theme.colors.neutral500};
608
887
  }
@@ -611,73 +890,23 @@ const StyledMenuItem = styled(Menu.Item)`
611
890
  }
612
891
 
613
892
  &:hover {
614
- background: ${({ theme, variant = "neutral" }) => theme.colors[`${variant}100`]};
893
+ background: ${({ theme, $variant = "neutral" }) => theme.colors[`${$variant}100`]};
615
894
  }
616
895
  `;
617
896
  const PencilIcon = styled(Pencil)`
618
- width: ${({ theme }) => theme.spaces[3]};
619
- height: ${({ theme }) => theme.spaces[3]};
897
+ width: ${({ theme }) => theme.spaces[4]};
898
+ height: ${({ theme }) => theme.spaces[4]};
620
899
  path {
621
900
  fill: ${({ theme }) => theme.colors.neutral600};
622
901
  }
623
902
  `;
624
903
  const TrashIcon = styled(Trash)`
625
- width: ${({ theme }) => theme.spaces[3]};
626
- height: ${({ theme }) => theme.spaces[3]};
904
+ width: ${({ theme }) => theme.spaces[4]};
905
+ height: ${({ theme }) => theme.spaces[4]};
627
906
  path {
628
907
  fill: ${({ theme }) => theme.colors.danger600};
629
908
  }
630
909
  `;
631
- const TypographyMaxWidth = styled(Typography)`
632
- max-width: 300px;
633
- `;
634
- const EntryValidationText = ({ action, schema, entry }) => {
635
- const { formatMessage } = useIntl();
636
- const { validate } = unstable_useDocument(
637
- {
638
- collectionType: schema?.kind ?? "",
639
- model: schema?.uid ?? ""
640
- },
641
- {
642
- skip: !schema
643
- }
644
- );
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
- ] });
657
- }
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
- ] });
669
- }
670
- return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
671
- /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
672
- !entry.publishedAt ? /* @__PURE__ */ jsx(Typography, { textColor: "success600", fontWeight: "bold", children: formatMessage({
673
- id: "content-releases.pages.ReleaseDetails.entry-validation.already-unpublished",
674
- defaultMessage: "Already unpublished"
675
- }) }) : /* @__PURE__ */ jsx(Typography, { children: formatMessage({
676
- id: "content-releases.pages.ReleaseDetails.entry-validation.ready-to-unpublish",
677
- defaultMessage: "Ready to unpublish"
678
- }) })
679
- ] });
680
- };
681
910
  const ReleaseDetailsLayout = ({
682
911
  toggleEditReleaseModal,
683
912
  toggleWarningSubmit,
@@ -688,7 +917,6 @@ const ReleaseDetailsLayout = ({
688
917
  const {
689
918
  data,
690
919
  isLoading: isLoadingDetails,
691
- isError,
692
920
  error
693
921
  } = useGetReleaseQuery(
694
922
  { id: releaseId },
@@ -720,7 +948,7 @@ const ReleaseDetailsLayout = ({
720
948
  totalPublishedEntries,
721
949
  totalUnpublishedEntries
722
950
  });
723
- } else if (isAxiosError(response.error)) {
951
+ } else if (isFetchError(response.error)) {
724
952
  toggleNotification({
725
953
  type: "danger",
726
954
  message: formatAPIError(response.error)
@@ -755,7 +983,7 @@ const ReleaseDetailsLayout = ({
755
983
  if (isLoadingDetails) {
756
984
  return /* @__PURE__ */ jsx(Page.Loading, {});
757
985
  }
758
- if (isError || !release) {
986
+ if (isBaseQueryError(error) && "code" in error || !release) {
759
987
  return /* @__PURE__ */ jsx(
760
988
  Navigate,
761
989
  {
@@ -763,6 +991,7 @@ const ReleaseDetailsLayout = ({
763
991
  state: {
764
992
  errors: [
765
993
  {
994
+ // @ts-expect-error – TODO: fix this weird error flow
766
995
  code: error?.code
767
996
  }
768
997
  ]
@@ -809,86 +1038,73 @@ const ReleaseDetailsLayout = ({
809
1038
  /* @__PURE__ */ jsx(Typography, { textColor: "neutral600", variant: "epsilon", children: numberOfEntriesText + (isScheduled ? ` - ${scheduledText}` : "") }),
810
1039
  /* @__PURE__ */ jsx(Badge, { ...getBadgeProps(release.status), children: release.status })
811
1040
  ] }),
812
- navigationAction: /* @__PURE__ */ jsx(BackButton, {}),
1041
+ navigationAction: /* @__PURE__ */ jsx(BackButton, { fallback: ".." }),
813
1042
  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"
1043
+ /* @__PURE__ */ jsxs(
1044
+ SimpleMenuButton,
1045
+ {
1046
+ label: /* @__PURE__ */ jsx(More, {}),
1047
+ variant: "tertiary",
1048
+ endIcon: null,
1049
+ paddingLeft: "7px",
1050
+ paddingRight: "7px",
1051
+ "aria-label": formatMessage({
1052
+ id: "content-releases.header.actions.open-release-actions",
1053
+ defaultMessage: "Release edit and delete menu"
1054
+ }),
1055
+ popoverPlacement: "bottom-end",
1056
+ children: [
1057
+ /* @__PURE__ */ jsx(StyledMenuItem, { disabled: !canUpdate, onSelect: toggleEditReleaseModal, children: /* @__PURE__ */ jsxs(Flex, { alignItems: "center", gap: 2, hasRadius: true, width: "100%", children: [
1058
+ /* @__PURE__ */ jsx(PencilIcon, {}),
1059
+ /* @__PURE__ */ jsx(Typography, { ellipsis: true, children: formatMessage({
1060
+ id: "content-releases.header.actions.edit",
1061
+ defaultMessage: "Edit"
1062
+ }) })
1063
+ ] }) }),
1064
+ /* @__PURE__ */ jsx(
1065
+ StyledMenuItem,
1066
+ {
1067
+ disabled: !canDelete,
1068
+ onSelect: toggleWarningSubmit,
1069
+ $variant: "danger",
1070
+ children: /* @__PURE__ */ jsxs(Flex, { alignItems: "center", gap: 2, hasRadius: true, width: "100%", children: [
1071
+ /* @__PURE__ */ jsx(TrashIcon, {}),
1072
+ /* @__PURE__ */ jsx(Typography, { ellipsis: true, textColor: "danger600", children: formatMessage({
1073
+ id: "content-releases.header.actions.delete",
1074
+ defaultMessage: "Delete"
844
1075
  }) })
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
1076
  ] })
887
- ]
888
- }
889
- )
890
- ] })
891
- ] }),
1077
+ }
1078
+ ),
1079
+ /* @__PURE__ */ jsxs(
1080
+ ReleaseInfoWrapper,
1081
+ {
1082
+ direction: "column",
1083
+ justifyContent: "center",
1084
+ alignItems: "flex-start",
1085
+ gap: 1,
1086
+ padding: 4,
1087
+ children: [
1088
+ /* @__PURE__ */ jsx(Typography, { variant: "pi", fontWeight: "bold", children: formatMessage({
1089
+ id: "content-releases.header.actions.created",
1090
+ defaultMessage: "Created"
1091
+ }) }),
1092
+ /* @__PURE__ */ jsxs(Typography, { variant: "pi", color: "neutral300", children: [
1093
+ /* @__PURE__ */ jsx(RelativeTime$1, { timestamp: new Date(release.createdAt) }),
1094
+ formatMessage(
1095
+ {
1096
+ id: "content-releases.header.actions.created.description",
1097
+ defaultMessage: "{hasCreatedByUser, select, true { by {createdBy}} other { by deleted user}}"
1098
+ },
1099
+ { createdBy: getCreatedByUser(), hasCreatedByUser }
1100
+ )
1101
+ ] })
1102
+ ]
1103
+ }
1104
+ )
1105
+ ]
1106
+ }
1107
+ ),
892
1108
  /* @__PURE__ */ jsx(Button, { size: "S", variant: "tertiary", onClick: handleRefresh, children: formatMessage({
893
1109
  id: "content-releases.header.actions.refresh",
894
1110
  defaultMessage: "Refresh"
@@ -913,6 +1129,11 @@ const ReleaseDetailsLayout = ({
913
1129
  children
914
1130
  ] });
915
1131
  };
1132
+ const SimpleMenuButton = styled(SimpleMenu)`
1133
+ & > span {
1134
+ display: flex;
1135
+ }
1136
+ `;
916
1137
  const GROUP_BY_OPTIONS = ["contentType", "locale", "action"];
917
1138
  const GROUP_BY_OPTIONS_NO_LOCALE = ["contentType", "action"];
918
1139
  const getGroupByOptionLabel = (value) => {
@@ -941,26 +1162,24 @@ const ReleaseDetailsBody = ({ releaseId }) => {
941
1162
  const {
942
1163
  data: releaseData,
943
1164
  isLoading: isReleaseLoading,
944
- isError: isReleaseError,
945
1165
  error: releaseError
946
1166
  } = useGetReleaseQuery({ id: releaseId });
947
1167
  const {
948
1168
  allowedActions: { canUpdate }
949
1169
  } = useRBAC(PERMISSIONS);
950
1170
  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
- );
1171
+ const { displayedHeaders, hasI18nEnabled } = runHookWaterfall("ContentReleases/pages/ReleaseDetails/add-locale-in-releases", {
1172
+ displayedHeaders: [
1173
+ {
1174
+ label: {
1175
+ id: "content-releases.page.ReleaseDetails.table.header.label.name",
1176
+ defaultMessage: "name"
1177
+ },
1178
+ name: "name"
1179
+ }
1180
+ ],
1181
+ hasI18nEnabled: false
1182
+ });
964
1183
  const release = releaseData?.data;
965
1184
  const selectedGroupBy = query?.groupBy || "contentType";
966
1185
  const {
@@ -989,7 +1208,7 @@ const ReleaseDetailsBody = ({ releaseId }) => {
989
1208
  // We are passing the action path to found the position in the cache of the action for optimistic updates
990
1209
  });
991
1210
  if ("error" in response) {
992
- if (isAxiosError(response.error)) {
1211
+ if (isFetchError(response.error)) {
993
1212
  toggleNotification({
994
1213
  type: "danger",
995
1214
  message: formatAPIError(response.error)
@@ -1008,15 +1227,15 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1008
1227
  const releaseActions = data?.data;
1009
1228
  const releaseMeta = data?.meta;
1010
1229
  const contentTypes = releaseMeta?.contentTypes || {};
1011
- const components = releaseMeta?.components || {};
1012
- if (isReleaseError || !release) {
1230
+ releaseMeta?.components || {};
1231
+ if (isBaseQueryError(releaseError) || !release) {
1013
1232
  const errorsArray = [];
1014
- if (releaseError) {
1233
+ if (releaseError && "code" in releaseError) {
1015
1234
  errorsArray.push({
1016
1235
  code: releaseError.code
1017
1236
  });
1018
1237
  }
1019
- if (releaseActionsError) {
1238
+ if (releaseActionsError && "code" in releaseActionsError) {
1020
1239
  errorsArray.push({
1021
1240
  code: releaseActionsError.code
1022
1241
  });
@@ -1041,7 +1260,7 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1041
1260
  action: /* @__PURE__ */ jsx(
1042
1261
  LinkButton,
1043
1262
  {
1044
- as: Link$1,
1263
+ tag: Link,
1045
1264
  to: {
1046
1265
  pathname: "/content-manager"
1047
1266
  },
@@ -1066,34 +1285,27 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1066
1285
  defaultMessage: "Group by"
1067
1286
  });
1068
1287
  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
- },
1288
+ ...displayedHeaders,
1077
1289
  {
1078
- label: formatMessage({
1290
+ label: {
1079
1291
  id: "content-releases.page.ReleaseDetails.table.header.label.content-type",
1080
1292
  defaultMessage: "content-type"
1081
- }),
1293
+ },
1082
1294
  name: "content-type"
1083
1295
  },
1084
1296
  {
1085
- label: formatMessage({
1297
+ label: {
1086
1298
  id: "content-releases.page.ReleaseDetails.table.header.label.action",
1087
1299
  defaultMessage: "action"
1088
- }),
1300
+ },
1089
1301
  name: "action"
1090
1302
  },
1091
1303
  ...!release.releasedAt ? [
1092
1304
  {
1093
- label: formatMessage({
1305
+ label: {
1094
1306
  id: "content-releases.page.ReleaseDetails.table.header.label.status",
1095
1307
  defaultMessage: "status"
1096
- }),
1308
+ },
1097
1309
  name: "status"
1098
1310
  }
1099
1311
  ] : []
@@ -1131,10 +1343,10 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1131
1343
  headers,
1132
1344
  isLoading: isLoading || isFetching,
1133
1345
  children: /* @__PURE__ */ jsxs(Table.Content, { children: [
1134
- /* @__PURE__ */ jsx(Table.Head, { children: headers.map((header) => /* @__PURE__ */ jsx(Table.HeaderCell, { ...header }, header.name)) }),
1346
+ /* @__PURE__ */ jsx(Table.Head, { children: headers.map(({ label, name }) => /* @__PURE__ */ jsx(Table.HeaderCell, { label: formatMessage(label), name }, name)) }),
1135
1347
  /* @__PURE__ */ jsx(Table.Loading, {}),
1136
1348
  /* @__PURE__ */ jsx(Table.Body, { children: releaseActions[key].map(
1137
- ({ id, contentType, locale, type, entry }, actionIndex) => /* @__PURE__ */ jsxs(Tr, { children: [
1349
+ ({ id, contentType, locale, type, entry, status }, actionIndex) => /* @__PURE__ */ jsxs(Tr, { children: [
1138
1350
  /* @__PURE__ */ jsx(Td, { width: "25%", maxWidth: "200px", children: /* @__PURE__ */ jsx(Typography, { ellipsis: true, children: `${contentType.mainFieldValue || entry.id}` }) }),
1139
1351
  hasI18nEnabled && /* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: `${locale?.name ? locale.name : "-"}` }) }),
1140
1352
  /* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: contentType.displayName || "" }) }),
@@ -1158,12 +1370,12 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1158
1370
  ) }),
1159
1371
  !release.releasedAt && /* @__PURE__ */ jsxs(Fragment, { children: [
1160
1372
  /* @__PURE__ */ jsx(Td, { width: "20%", minWidth: "200px", children: /* @__PURE__ */ jsx(
1161
- EntryValidationText,
1373
+ EntryValidationPopover,
1162
1374
  {
1163
1375
  action: type,
1164
1376
  schema: contentTypes?.[contentType.uid],
1165
- components,
1166
- entry
1377
+ entry,
1378
+ status
1167
1379
  }
1168
1380
  ) }),
1169
1381
  /* @__PURE__ */ jsx(Td, { children: /* @__PURE__ */ jsx(Flex, { justifyContent: "flex-end", children: /* @__PURE__ */ jsxs(ReleaseActionMenu.Root, { children: [
@@ -1171,7 +1383,7 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1171
1383
  ReleaseActionMenu.ReleaseActionEntryLinkItem,
1172
1384
  {
1173
1385
  contentTypeUid: contentType.uid,
1174
- entryId: entry.id,
1386
+ documentId: entry.documentId,
1175
1387
  locale: locale?.code
1176
1388
  }
1177
1389
  ),
@@ -1221,13 +1433,24 @@ const ReleaseDetailsPage = () => {
1221
1433
  skip: !releaseId
1222
1434
  }
1223
1435
  );
1436
+ const { data: dataTimezone, isLoading: isLoadingTimezone } = useGetReleaseSettingsQuery();
1224
1437
  const [updateRelease, { isLoading: isSubmittingForm }] = useUpdateReleaseMutation();
1225
1438
  const [deleteRelease] = useDeleteReleaseMutation();
1226
1439
  const toggleEditReleaseModal = () => {
1227
1440
  setReleaseModalShown((prev) => !prev);
1228
1441
  };
1442
+ const getTimezoneValue = () => {
1443
+ if (releaseData?.timezone) {
1444
+ return releaseData.timezone;
1445
+ } else {
1446
+ if (dataTimezone?.data.defaultTimezone) {
1447
+ return dataTimezone.data.defaultTimezone;
1448
+ }
1449
+ return null;
1450
+ }
1451
+ };
1229
1452
  const toggleWarningSubmit = () => setWarningSubmit((prevState) => !prevState);
1230
- if (isLoadingDetails) {
1453
+ if (isLoadingDetails || isLoadingTimezone) {
1231
1454
  return /* @__PURE__ */ jsx(
1232
1455
  ReleaseDetailsLayout,
1233
1456
  {
@@ -1242,10 +1465,10 @@ const ReleaseDetailsPage = () => {
1242
1465
  }
1243
1466
  const releaseData = isSuccessDetails && data?.data || null;
1244
1467
  const title = releaseData?.name || "";
1245
- const timezone = releaseData?.timezone ?? null;
1468
+ const timezone = getTimezoneValue();
1246
1469
  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") : "";
1470
+ const date = scheduledAt ? format$1(scheduledAt, "yyyy-MM-dd") : void 0;
1471
+ const time = scheduledAt ? format$1(scheduledAt, "HH:mm") : "";
1249
1472
  const handleEditRelease = async (values) => {
1250
1473
  const response = await updateRelease({
1251
1474
  id: releaseId,
@@ -1262,7 +1485,7 @@ const ReleaseDetailsPage = () => {
1262
1485
  })
1263
1486
  });
1264
1487
  toggleEditReleaseModal();
1265
- } else if (isAxiosError(response.error)) {
1488
+ } else if (isFetchError(response.error)) {
1266
1489
  toggleNotification({
1267
1490
  type: "danger",
1268
1491
  message: formatAPIError(response.error)
@@ -1280,7 +1503,7 @@ const ReleaseDetailsPage = () => {
1280
1503
  });
1281
1504
  if ("data" in response) {
1282
1505
  navigate("..");
1283
- } else if (isAxiosError(response.error)) {
1506
+ } else if (isFetchError(response.error)) {
1284
1507
  toggleNotification({
1285
1508
  type: "danger",
1286
1509
  message: formatAPIError(response.error)
@@ -1299,9 +1522,10 @@ const ReleaseDetailsPage = () => {
1299
1522
  toggleWarningSubmit,
1300
1523
  children: [
1301
1524
  /* @__PURE__ */ jsx(ReleaseDetailsBody, { releaseId }),
1302
- releaseModalShown && /* @__PURE__ */ jsx(
1525
+ /* @__PURE__ */ jsx(
1303
1526
  ReleaseModal,
1304
1527
  {
1528
+ open: releaseModalShown,
1305
1529
  handleClose: toggleEditReleaseModal,
1306
1530
  handleSubmit: handleEditRelease,
1307
1531
  isLoading: isLoadingDetails || isSubmittingForm,
@@ -1315,18 +1539,10 @@ const ReleaseDetailsPage = () => {
1315
1539
  }
1316
1540
  }
1317
1541
  ),
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
- )
1542
+ /* @__PURE__ */ jsx(Dialog.Root, { open: showWarningSubmit, onOpenChange: toggleWarningSubmit, children: /* @__PURE__ */ jsx(ConfirmDialog, { onConfirm: handleDeleteRelease, children: formatMessage({
1543
+ id: "content-releases.dialog.confirmation-message",
1544
+ defaultMessage: "Are you sure you want to delete this release?"
1545
+ }) }) })
1330
1546
  ]
1331
1547
  }
1332
1548
  );
@@ -1340,4 +1556,4 @@ const App = () => {
1340
1556
  export {
1341
1557
  App
1342
1558
  };
1343
- //# sourceMappingURL=App-BsUSTHVD.mjs.map
1559
+ //# sourceMappingURL=App-FQyYFBJT.mjs.map