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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/LICENSE +17 -1
  2. package/dist/_chunks/{App-O0ZO-S35.mjs → App-DMILern_.mjs} +409 -396
  3. package/dist/_chunks/App-DMILern_.mjs.map +1 -0
  4. package/dist/_chunks/{App-C0DlH0im.js → App-fAgiijnc.js} +412 -401
  5. package/dist/_chunks/App-fAgiijnc.js.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-YVZJH-oN.js +178 -0
  11. package/dist/_chunks/ReleasesSettingsPage-YVZJH-oN.js.map +1 -0
  12. package/dist/_chunks/ReleasesSettingsPage-dwoRuXB-.mjs +178 -0
  13. package/dist/_chunks/ReleasesSettingsPage-dwoRuXB-.mjs.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--_NWfuDG.js} +681 -585
  19. package/dist/_chunks/index--_NWfuDG.js.map +1 -0
  20. package/dist/_chunks/{index-DjDPK8kb.mjs → index-CYsQToWs.mjs} +690 -592
  21. package/dist/_chunks/index-CYsQToWs.mjs.map +1 -0
  22. package/dist/_chunks/schemas-63pFihNF.mjs +44 -0
  23. package/dist/_chunks/schemas-63pFihNF.mjs.map +1 -0
  24. package/dist/_chunks/schemas-z5zp-_Gd.js +62 -0
  25. package/dist/_chunks/schemas-z5zp-_Gd.js.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 +796 -623
  42. package/dist/server/index.js.map +1 -1
  43. package/dist/server/index.mjs +797 -624
  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 +66 -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 +38 -38
  81. package/dist/server/src/services/index.d.ts.map +1 -1
  82. package/dist/server/src/services/release-action.d.ts +36 -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 +17 -18
  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
@@ -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-CYsQToWs.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-63pFihNF.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,7 +605,7 @@ 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)`
@@ -631,41 +625,72 @@ 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
+ if (isLoading) {
641
+ return null;
657
642
  }
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
- ] });
643
+ const errors = validate(entry) ?? {};
644
+ if (action === "publish") {
645
+ if (Object.keys(errors).length > 0) {
646
+ const validationErrorsMessages = Object.entries(errors).map(
647
+ ([key, value]) => formatMessage(
648
+ // @ts-expect-error – TODO: fix this will better checks
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(
656
+ TypographyMaxWidth,
657
+ {
658
+ textColor: "danger600",
659
+ variant: "omega",
660
+ fontWeight: "semiBold",
661
+ ellipsis: true,
662
+ children: validationErrorsMessages
663
+ }
664
+ ) })
665
+ ] });
666
+ }
667
+ if (status === "draft") {
668
+ return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
669
+ /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
670
+ /* @__PURE__ */ jsx(Typography, { children: formatMessage({
671
+ id: "content-releases.pages.ReleaseDetails.entry-validation.ready-to-publish",
672
+ defaultMessage: "Ready to publish"
673
+ }) })
674
+ ] });
675
+ }
676
+ if (status === "modified") {
677
+ return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
678
+ /* @__PURE__ */ jsx(ArrowsCounterClockwise, { fill: "alternative600" }),
679
+ /* @__PURE__ */ jsx(Typography, { children: formatMessage({
680
+ id: "content-releases.pages.ReleaseDetails.entry-validation.modified",
681
+ defaultMessage: "Ready to publish changes"
682
+ }) })
683
+ ] });
684
+ }
685
+ if (status === "published") {
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.already-published",
690
+ defaultMessage: "Already published"
691
+ }) })
692
+ ] });
693
+ }
669
694
  }
670
695
  return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
671
696
  /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
@@ -688,7 +713,6 @@ const ReleaseDetailsLayout = ({
688
713
  const {
689
714
  data,
690
715
  isLoading: isLoadingDetails,
691
- isError,
692
716
  error
693
717
  } = useGetReleaseQuery(
694
718
  { id: releaseId },
@@ -720,7 +744,7 @@ const ReleaseDetailsLayout = ({
720
744
  totalPublishedEntries,
721
745
  totalUnpublishedEntries
722
746
  });
723
- } else if (isAxiosError(response.error)) {
747
+ } else if (isFetchError(response.error)) {
724
748
  toggleNotification({
725
749
  type: "danger",
726
750
  message: formatAPIError(response.error)
@@ -755,7 +779,7 @@ const ReleaseDetailsLayout = ({
755
779
  if (isLoadingDetails) {
756
780
  return /* @__PURE__ */ jsx(Page.Loading, {});
757
781
  }
758
- if (isError || !release) {
782
+ if (isBaseQueryError(error) && "code" in error || !release) {
759
783
  return /* @__PURE__ */ jsx(
760
784
  Navigate,
761
785
  {
@@ -763,6 +787,7 @@ const ReleaseDetailsLayout = ({
763
787
  state: {
764
788
  errors: [
765
789
  {
790
+ // @ts-expect-error – TODO: fix this weird error flow
766
791
  code: error?.code
767
792
  }
768
793
  ]
@@ -802,7 +827,7 @@ const ReleaseDetailsLayout = ({
802
827
  ) : "";
803
828
  return /* @__PURE__ */ jsxs(Main, { "aria-busy": isLoadingDetails, children: [
804
829
  /* @__PURE__ */ jsx(
805
- HeaderLayout,
830
+ Layouts.Header,
806
831
  {
807
832
  title: release.name,
808
833
  subtitle: /* @__PURE__ */ jsxs(Flex, { gap: 2, lineHeight: 6, children: [
@@ -811,84 +836,71 @@ const ReleaseDetailsLayout = ({
811
836
  ] }),
812
837
  navigationAction: /* @__PURE__ */ jsx(BackButton, {}),
813
838
  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"
839
+ /* @__PURE__ */ jsxs(
840
+ SimpleMenuButton,
841
+ {
842
+ label: /* @__PURE__ */ jsx(More, {}),
843
+ variant: "tertiary",
844
+ endIcon: null,
845
+ paddingLeft: "7px",
846
+ paddingRight: "7px",
847
+ "aria-label": formatMessage({
848
+ id: "content-releases.header.actions.open-release-actions",
849
+ defaultMessage: "Release edit and delete menu"
850
+ }),
851
+ popoverPlacement: "bottom-end",
852
+ children: [
853
+ /* @__PURE__ */ jsx(StyledMenuItem, { disabled: !canUpdate, onSelect: toggleEditReleaseModal, children: /* @__PURE__ */ jsxs(Flex, { alignItems: "center", gap: 2, hasRadius: true, width: "100%", children: [
854
+ /* @__PURE__ */ jsx(PencilIcon, {}),
855
+ /* @__PURE__ */ jsx(Typography, { ellipsis: true, children: formatMessage({
856
+ id: "content-releases.header.actions.edit",
857
+ defaultMessage: "Edit"
858
+ }) })
859
+ ] }) }),
860
+ /* @__PURE__ */ jsx(
861
+ StyledMenuItem,
862
+ {
863
+ disabled: !canDelete,
864
+ onSelect: toggleWarningSubmit,
865
+ $variant: "danger",
866
+ children: /* @__PURE__ */ jsxs(Flex, { alignItems: "center", gap: 2, hasRadius: true, width: "100%", children: [
867
+ /* @__PURE__ */ jsx(TrashIcon, {}),
868
+ /* @__PURE__ */ jsx(Typography, { ellipsis: true, textColor: "danger600", children: formatMessage({
869
+ id: "content-releases.header.actions.delete",
870
+ defaultMessage: "Delete"
844
871
  }) })
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
872
  ] })
887
- ]
888
- }
889
- )
890
- ] })
891
- ] }),
873
+ }
874
+ ),
875
+ /* @__PURE__ */ jsxs(
876
+ ReleaseInfoWrapper,
877
+ {
878
+ direction: "column",
879
+ justifyContent: "center",
880
+ alignItems: "flex-start",
881
+ gap: 1,
882
+ padding: 5,
883
+ children: [
884
+ /* @__PURE__ */ jsx(Typography, { variant: "pi", fontWeight: "bold", children: formatMessage({
885
+ id: "content-releases.header.actions.created",
886
+ defaultMessage: "Created"
887
+ }) }),
888
+ /* @__PURE__ */ jsxs(Typography, { variant: "pi", color: "neutral300", children: [
889
+ /* @__PURE__ */ jsx(RelativeTime$1, { timestamp: new Date(release.createdAt) }),
890
+ formatMessage(
891
+ {
892
+ id: "content-releases.header.actions.created.description",
893
+ defaultMessage: "{hasCreatedByUser, select, true { by {createdBy}} other { by deleted user}}"
894
+ },
895
+ { createdBy: getCreatedByUser(), hasCreatedByUser }
896
+ )
897
+ ] })
898
+ ]
899
+ }
900
+ )
901
+ ]
902
+ }
903
+ ),
892
904
  /* @__PURE__ */ jsx(Button, { size: "S", variant: "tertiary", onClick: handleRefresh, children: formatMessage({
893
905
  id: "content-releases.header.actions.refresh",
894
906
  defaultMessage: "Refresh"
@@ -913,6 +925,11 @@ const ReleaseDetailsLayout = ({
913
925
  children
914
926
  ] });
915
927
  };
928
+ const SimpleMenuButton = styled(SimpleMenu)`
929
+ & > span {
930
+ display: flex;
931
+ }
932
+ `;
916
933
  const GROUP_BY_OPTIONS = ["contentType", "locale", "action"];
917
934
  const GROUP_BY_OPTIONS_NO_LOCALE = ["contentType", "action"];
918
935
  const getGroupByOptionLabel = (value) => {
@@ -941,26 +958,24 @@ const ReleaseDetailsBody = ({ releaseId }) => {
941
958
  const {
942
959
  data: releaseData,
943
960
  isLoading: isReleaseLoading,
944
- isError: isReleaseError,
945
961
  error: releaseError
946
962
  } = useGetReleaseQuery({ id: releaseId });
947
963
  const {
948
964
  allowedActions: { canUpdate }
949
965
  } = useRBAC(PERMISSIONS);
950
966
  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
- );
967
+ const { displayedHeaders, hasI18nEnabled } = runHookWaterfall("ContentReleases/pages/ReleaseDetails/add-locale-in-releases", {
968
+ displayedHeaders: [
969
+ {
970
+ label: {
971
+ id: "content-releases.page.ReleaseDetails.table.header.label.name",
972
+ defaultMessage: "name"
973
+ },
974
+ name: "name"
975
+ }
976
+ ],
977
+ hasI18nEnabled: false
978
+ });
964
979
  const release = releaseData?.data;
965
980
  const selectedGroupBy = query?.groupBy || "contentType";
966
981
  const {
@@ -989,7 +1004,7 @@ const ReleaseDetailsBody = ({ releaseId }) => {
989
1004
  // We are passing the action path to found the position in the cache of the action for optimistic updates
990
1005
  });
991
1006
  if ("error" in response) {
992
- if (isAxiosError(response.error)) {
1007
+ if (isFetchError(response.error)) {
993
1008
  toggleNotification({
994
1009
  type: "danger",
995
1010
  message: formatAPIError(response.error)
@@ -1009,14 +1024,14 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1009
1024
  const releaseMeta = data?.meta;
1010
1025
  const contentTypes = releaseMeta?.contentTypes || {};
1011
1026
  const components = releaseMeta?.components || {};
1012
- if (isReleaseError || !release) {
1027
+ if (isBaseQueryError(releaseError) || !release) {
1013
1028
  const errorsArray = [];
1014
- if (releaseError) {
1029
+ if (releaseError && "code" in releaseError) {
1015
1030
  errorsArray.push({
1016
1031
  code: releaseError.code
1017
1032
  });
1018
1033
  }
1019
- if (releaseActionsError) {
1034
+ if (releaseActionsError && "code" in releaseActionsError) {
1020
1035
  errorsArray.push({
1021
1036
  code: releaseActionsError.code
1022
1037
  });
@@ -1035,13 +1050,13 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1035
1050
  return /* @__PURE__ */ jsx(Page.Error, {});
1036
1051
  }
1037
1052
  if (Object.keys(releaseActions).length === 0) {
1038
- return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(
1053
+ return /* @__PURE__ */ jsx(Layouts.Content, { children: /* @__PURE__ */ jsx(
1039
1054
  EmptyStateLayout,
1040
1055
  {
1041
1056
  action: /* @__PURE__ */ jsx(
1042
1057
  LinkButton,
1043
1058
  {
1044
- as: Link$1,
1059
+ tag: Link$1,
1045
1060
  to: {
1046
1061
  pathname: "/content-manager"
1047
1062
  },
@@ -1066,40 +1081,33 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1066
1081
  defaultMessage: "Group by"
1067
1082
  });
1068
1083
  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
- },
1084
+ ...displayedHeaders,
1077
1085
  {
1078
- label: formatMessage({
1086
+ label: {
1079
1087
  id: "content-releases.page.ReleaseDetails.table.header.label.content-type",
1080
1088
  defaultMessage: "content-type"
1081
- }),
1089
+ },
1082
1090
  name: "content-type"
1083
1091
  },
1084
1092
  {
1085
- label: formatMessage({
1093
+ label: {
1086
1094
  id: "content-releases.page.ReleaseDetails.table.header.label.action",
1087
1095
  defaultMessage: "action"
1088
- }),
1096
+ },
1089
1097
  name: "action"
1090
1098
  },
1091
1099
  ...!release.releasedAt ? [
1092
1100
  {
1093
- label: formatMessage({
1101
+ label: {
1094
1102
  id: "content-releases.page.ReleaseDetails.table.header.label.status",
1095
1103
  defaultMessage: "status"
1096
- }),
1104
+ },
1097
1105
  name: "status"
1098
1106
  }
1099
1107
  ] : []
1100
1108
  ];
1101
1109
  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: [
1110
+ return /* @__PURE__ */ jsx(Layouts.Content, { children: /* @__PURE__ */ jsxs(Flex, { gap: 8, direction: "column", alignItems: "stretch", children: [
1103
1111
  /* @__PURE__ */ jsx(Flex, { children: /* @__PURE__ */ jsx(
1104
1112
  SingleSelect,
1105
1113
  {
@@ -1131,10 +1139,10 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1131
1139
  headers,
1132
1140
  isLoading: isLoading || isFetching,
1133
1141
  children: /* @__PURE__ */ jsxs(Table.Content, { children: [
1134
- /* @__PURE__ */ jsx(Table.Head, { children: headers.map((header) => /* @__PURE__ */ jsx(Table.HeaderCell, { ...header }, header.name)) }),
1142
+ /* @__PURE__ */ jsx(Table.Head, { children: headers.map(({ label, name }) => /* @__PURE__ */ jsx(Table.HeaderCell, { label: formatMessage(label), name }, name)) }),
1135
1143
  /* @__PURE__ */ jsx(Table.Loading, {}),
1136
1144
  /* @__PURE__ */ jsx(Table.Body, { children: releaseActions[key].map(
1137
- ({ id, contentType, locale, type, entry }, actionIndex) => /* @__PURE__ */ jsxs(Tr, { children: [
1145
+ ({ id, contentType, locale, type, entry, status }, actionIndex) => /* @__PURE__ */ jsxs(Tr, { children: [
1138
1146
  /* @__PURE__ */ jsx(Td, { width: "25%", maxWidth: "200px", children: /* @__PURE__ */ jsx(Typography, { ellipsis: true, children: `${contentType.mainFieldValue || entry.id}` }) }),
1139
1147
  hasI18nEnabled && /* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: `${locale?.name ? locale.name : "-"}` }) }),
1140
1148
  /* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: contentType.displayName || "" }) }),
@@ -1163,7 +1171,8 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1163
1171
  action: type,
1164
1172
  schema: contentTypes?.[contentType.uid],
1165
1173
  components,
1166
- entry
1174
+ entry,
1175
+ status
1167
1176
  }
1168
1177
  ) }),
1169
1178
  /* @__PURE__ */ jsx(Td, { children: /* @__PURE__ */ jsx(Flex, { justifyContent: "flex-end", children: /* @__PURE__ */ jsxs(ReleaseActionMenu.Root, { children: [
@@ -1171,7 +1180,7 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1171
1180
  ReleaseActionMenu.ReleaseActionEntryLinkItem,
1172
1181
  {
1173
1182
  contentTypeUid: contentType.uid,
1174
- entryId: entry.id,
1183
+ documentId: entry.documentId,
1175
1184
  locale: locale?.code
1176
1185
  }
1177
1186
  ),
@@ -1221,13 +1230,24 @@ const ReleaseDetailsPage = () => {
1221
1230
  skip: !releaseId
1222
1231
  }
1223
1232
  );
1233
+ const { data: dataTimezone, isLoading: isLoadingTimezone } = useGetReleaseSettingsQuery();
1224
1234
  const [updateRelease, { isLoading: isSubmittingForm }] = useUpdateReleaseMutation();
1225
1235
  const [deleteRelease] = useDeleteReleaseMutation();
1226
1236
  const toggleEditReleaseModal = () => {
1227
1237
  setReleaseModalShown((prev) => !prev);
1228
1238
  };
1239
+ const getTimezoneValue = () => {
1240
+ if (releaseData?.timezone) {
1241
+ return releaseData.timezone;
1242
+ } else {
1243
+ if (dataTimezone?.data.defaultTimezone) {
1244
+ return dataTimezone.data.defaultTimezone;
1245
+ }
1246
+ return null;
1247
+ }
1248
+ };
1229
1249
  const toggleWarningSubmit = () => setWarningSubmit((prevState) => !prevState);
1230
- if (isLoadingDetails) {
1250
+ if (isLoadingDetails || isLoadingTimezone) {
1231
1251
  return /* @__PURE__ */ jsx(
1232
1252
  ReleaseDetailsLayout,
1233
1253
  {
@@ -1242,10 +1262,10 @@ const ReleaseDetailsPage = () => {
1242
1262
  }
1243
1263
  const releaseData = isSuccessDetails && data?.data || null;
1244
1264
  const title = releaseData?.name || "";
1245
- const timezone = releaseData?.timezone ?? null;
1265
+ const timezone = getTimezoneValue();
1246
1266
  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") : "";
1267
+ const date = scheduledAt ? format$1(scheduledAt, "yyyy-MM-dd") : void 0;
1268
+ const time = scheduledAt ? format$1(scheduledAt, "HH:mm") : "";
1249
1269
  const handleEditRelease = async (values) => {
1250
1270
  const response = await updateRelease({
1251
1271
  id: releaseId,
@@ -1262,7 +1282,7 @@ const ReleaseDetailsPage = () => {
1262
1282
  })
1263
1283
  });
1264
1284
  toggleEditReleaseModal();
1265
- } else if (isAxiosError(response.error)) {
1285
+ } else if (isFetchError(response.error)) {
1266
1286
  toggleNotification({
1267
1287
  type: "danger",
1268
1288
  message: formatAPIError(response.error)
@@ -1280,7 +1300,7 @@ const ReleaseDetailsPage = () => {
1280
1300
  });
1281
1301
  if ("data" in response) {
1282
1302
  navigate("..");
1283
- } else if (isAxiosError(response.error)) {
1303
+ } else if (isFetchError(response.error)) {
1284
1304
  toggleNotification({
1285
1305
  type: "danger",
1286
1306
  message: formatAPIError(response.error)
@@ -1299,9 +1319,10 @@ const ReleaseDetailsPage = () => {
1299
1319
  toggleWarningSubmit,
1300
1320
  children: [
1301
1321
  /* @__PURE__ */ jsx(ReleaseDetailsBody, { releaseId }),
1302
- releaseModalShown && /* @__PURE__ */ jsx(
1322
+ /* @__PURE__ */ jsx(
1303
1323
  ReleaseModal,
1304
1324
  {
1325
+ open: releaseModalShown,
1305
1326
  handleClose: toggleEditReleaseModal,
1306
1327
  handleSubmit: handleEditRelease,
1307
1328
  isLoading: isLoadingDetails || isSubmittingForm,
@@ -1315,18 +1336,10 @@ const ReleaseDetailsPage = () => {
1315
1336
  }
1316
1337
  }
1317
1338
  ),
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
- )
1339
+ /* @__PURE__ */ jsx(Dialog.Root, { open: showWarningSubmit, onOpenChange: toggleWarningSubmit, children: /* @__PURE__ */ jsx(ConfirmDialog, { onConfirm: handleDeleteRelease, children: formatMessage({
1340
+ id: "content-releases.dialog.confirmation-message",
1341
+ defaultMessage: "Are you sure you want to delete this release?"
1342
+ }) }) })
1330
1343
  ]
1331
1344
  }
1332
1345
  );
@@ -1340,4 +1353,4 @@ const App = () => {
1340
1353
  export {
1341
1354
  App
1342
1355
  };
1343
- //# sourceMappingURL=App-O0ZO-S35.mjs.map
1356
+ //# sourceMappingURL=App-DMILern_.mjs.map