@strapi/content-releases 0.0.0-experimental.dd3311938ac827f1fa8560c8840a9a394f5896c0 → 0.0.0-experimental.de2b94258659463e5ddc5992e9a9490d66d950dd

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