@strapi/content-releases 0.0.0-experimental.d53e940834bf72ddc725f1d2fd36dac9abec30cb → 0.0.0-experimental.d65615a2b9130dd742d3c396674457d7971da928

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 (101) hide show
  1. package/LICENSE +17 -1
  2. package/dist/_chunks/{App-CEwOQkKT.js → App-BKB1esYS.js} +314 -264
  3. package/dist/_chunks/App-BKB1esYS.js.map +1 -0
  4. package/dist/_chunks/{App-B2R2exNT.mjs → App-Cne--1Z8.mjs} +317 -266
  5. package/dist/_chunks/App-Cne--1Z8.mjs.map +1 -0
  6. package/dist/_chunks/ReleasesSettingsPage-C1WwGWIH.mjs +178 -0
  7. package/dist/_chunks/ReleasesSettingsPage-C1WwGWIH.mjs.map +1 -0
  8. package/dist/_chunks/ReleasesSettingsPage-kuXIwpWp.js +178 -0
  9. package/dist/_chunks/ReleasesSettingsPage-kuXIwpWp.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-BrWv-zV4.js → index-5Odi61vw.js} +793 -441
  15. package/dist/_chunks/index-5Odi61vw.js.map +1 -0
  16. package/dist/_chunks/index-Cy7qwpaU.mjs +1362 -0
  17. package/dist/_chunks/index-Cy7qwpaU.mjs.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/ReleasesPanel.d.ts +3 -0
  28. package/dist/admin/src/constants.d.ts +18 -0
  29. package/dist/admin/src/modules/hooks.d.ts +7 -0
  30. package/dist/admin/src/pages/ReleasesSettingsPage.d.ts +1 -0
  31. package/dist/admin/src/services/release.d.ts +43 -36
  32. package/dist/admin/src/utils/time.d.ts +9 -0
  33. package/dist/admin/src/validation/schemas.d.ts +6 -0
  34. package/dist/server/index.js +782 -580
  35. package/dist/server/index.js.map +1 -1
  36. package/dist/server/index.mjs +783 -581
  37. package/dist/server/index.mjs.map +1 -1
  38. package/dist/server/src/bootstrap.d.ts.map +1 -1
  39. package/dist/server/src/constants.d.ts +11 -2
  40. package/dist/server/src/constants.d.ts.map +1 -1
  41. package/dist/server/src/content-types/index.d.ts +3 -5
  42. package/dist/server/src/content-types/index.d.ts.map +1 -1
  43. package/dist/server/src/content-types/release-action/index.d.ts +3 -5
  44. package/dist/server/src/content-types/release-action/index.d.ts.map +1 -1
  45. package/dist/server/src/content-types/release-action/schema.d.ts +3 -5
  46. package/dist/server/src/content-types/release-action/schema.d.ts.map +1 -1
  47. package/dist/server/src/controllers/index.d.ts +6 -1
  48. package/dist/server/src/controllers/index.d.ts.map +1 -1
  49. package/dist/server/src/controllers/release-action.d.ts.map +1 -1
  50. package/dist/server/src/controllers/release.d.ts +7 -1
  51. package/dist/server/src/controllers/release.d.ts.map +1 -1
  52. package/dist/server/src/controllers/settings.d.ts +11 -0
  53. package/dist/server/src/controllers/settings.d.ts.map +1 -0
  54. package/dist/server/src/controllers/validation/release-action.d.ts +7 -1
  55. package/dist/server/src/controllers/validation/release-action.d.ts.map +1 -1
  56. package/dist/server/src/controllers/validation/release.d.ts +2 -0
  57. package/dist/server/src/controllers/validation/release.d.ts.map +1 -1
  58. package/dist/server/src/controllers/validation/settings.d.ts +3 -0
  59. package/dist/server/src/controllers/validation/settings.d.ts.map +1 -0
  60. package/dist/server/src/index.d.ts +68 -49
  61. package/dist/server/src/index.d.ts.map +1 -1
  62. package/dist/server/src/middlewares/documents.d.ts +6 -0
  63. package/dist/server/src/middlewares/documents.d.ts.map +1 -0
  64. package/dist/server/src/migrations/database/5.0.0-document-id-in-actions.d.ts +9 -0
  65. package/dist/server/src/migrations/database/5.0.0-document-id-in-actions.d.ts.map +1 -0
  66. package/dist/server/src/migrations/index.d.ts.map +1 -1
  67. package/dist/server/src/register.d.ts.map +1 -1
  68. package/dist/server/src/routes/index.d.ts +16 -0
  69. package/dist/server/src/routes/index.d.ts.map +1 -1
  70. package/dist/server/src/routes/release.d.ts.map +1 -1
  71. package/dist/server/src/routes/settings.d.ts +18 -0
  72. package/dist/server/src/routes/settings.d.ts.map +1 -0
  73. package/dist/server/src/services/index.d.ts +40 -38
  74. package/dist/server/src/services/index.d.ts.map +1 -1
  75. package/dist/server/src/services/release-action.d.ts +38 -0
  76. package/dist/server/src/services/release-action.d.ts.map +1 -0
  77. package/dist/server/src/services/release.d.ts +6 -41
  78. package/dist/server/src/services/release.d.ts.map +1 -1
  79. package/dist/server/src/services/settings.d.ts +13 -0
  80. package/dist/server/src/services/settings.d.ts.map +1 -0
  81. package/dist/server/src/services/validation.d.ts +1 -1
  82. package/dist/server/src/services/validation.d.ts.map +1 -1
  83. package/dist/server/src/utils/index.d.ts +29 -8
  84. package/dist/server/src/utils/index.d.ts.map +1 -1
  85. package/dist/shared/contracts/release-actions.d.ts +9 -10
  86. package/dist/shared/contracts/release-actions.d.ts.map +1 -1
  87. package/dist/shared/contracts/releases.d.ts +9 -7
  88. package/dist/shared/contracts/releases.d.ts.map +1 -1
  89. package/dist/shared/contracts/settings.d.ts +39 -0
  90. package/dist/shared/contracts/settings.d.ts.map +1 -0
  91. package/package.json +15 -13
  92. package/dist/_chunks/App-B2R2exNT.mjs.map +0 -1
  93. package/dist/_chunks/App-CEwOQkKT.js.map +0 -1
  94. package/dist/_chunks/en-B9Ur3VsE.mjs.map +0 -1
  95. package/dist/_chunks/en-DtFJ5ViE.js.map +0 -1
  96. package/dist/_chunks/index-BrWv-zV4.js.map +0 -1
  97. package/dist/_chunks/index-DbmynICx.mjs +0 -1010
  98. package/dist/_chunks/index-DbmynICx.mjs.map +0 -1
  99. package/dist/shared/validation-schemas.d.ts +0 -2
  100. package/dist/shared/validation-schemas.d.ts.map +0 -1
  101. 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-DbmynICx.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-Cy7qwpaU.mjs";
5
5
  import * as React from "react";
6
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, Menu, Dialog, 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,26 +46,6 @@ 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,
71
51
  open,
@@ -119,14 +99,22 @@ const ReleaseModal = ({
119
99
  children: ({ values, errors, handleChange, setFieldValue }) => {
120
100
  return /* @__PURE__ */ jsxs(Form, { children: [
121
101
  /* @__PURE__ */ jsx(Modal.Body, { children: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 6, children: [
122
- /* @__PURE__ */ jsxs(Field.Root, { name: "name", error: errors.name, required: true, children: [
123
- /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
124
- id: "content-releases.modal.form.input.label.release-name",
125
- defaultMessage: "Name"
126
- }) }),
127
- /* @__PURE__ */ jsx(TextInput, { value: values.name, onChange: handleChange }),
128
- /* @__PURE__ */ jsx(Field.Error, {})
129
- ] }),
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
+ ),
130
118
  /* @__PURE__ */ jsx(Box, { width: "max-content", children: /* @__PURE__ */ jsx(
131
119
  Checkbox,
132
120
  {
@@ -162,54 +150,70 @@ const ReleaseModal = ({
162
150
  ) }),
163
151
  values.isScheduled && /* @__PURE__ */ jsxs(Fragment, { children: [
164
152
  /* @__PURE__ */ jsxs(Flex, { gap: 4, alignItems: "start", children: [
165
- /* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsxs(Field.Root, { name: "date", error: errors.date, required: true, children: [
166
- /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
167
- id: "content-releases.modal.form.input.label.date",
168
- defaultMessage: "Date"
169
- }) }),
170
- /* @__PURE__ */ jsx(
171
- DatePicker,
172
- {
173
- onChange: (date) => {
174
- const isoFormatDate = date ? formatISO(date, { representation: "date" }) : null;
175
- setFieldValue("date", isoFormatDate);
176
- },
177
- clearLabel: formatMessage({
178
- id: "content-releases.modal.form.input.clearLabel",
179
- defaultMessage: "Clear"
180
- }),
181
- onClear: () => {
182
- setFieldValue("date", null);
183
- },
184
- value: values.date ? new Date(values.date) : /* @__PURE__ */ new Date(),
185
- minDate: utcToZonedTime(/* @__PURE__ */ new Date(), values.timezone.split("&")[1])
186
- }
187
- ),
188
- /* @__PURE__ */ jsx(Field.Error, {})
189
- ] }) }),
190
- /* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsxs(Field.Root, { name: "time", error: errors.time, required: true, children: [
191
- /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
192
- id: "content-releases.modal.form.input.label.time",
193
- defaultMessage: "Time"
194
- }) }),
195
- /* @__PURE__ */ jsx(
196
- TimePicker,
197
- {
198
- onChange: (time) => {
199
- setFieldValue("time", time);
200
- },
201
- clearLabel: formatMessage({
202
- id: "content-releases.modal.form.input.clearLabel",
203
- defaultMessage: "Clear"
204
- }),
205
- onClear: () => {
206
- setFieldValue("time", "");
207
- },
208
- value: values.time || void 0
209
- }
210
- ),
211
- /* @__PURE__ */ jsx(Field.Error, {})
212
- ] }) })
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
+ ) })
213
217
  ] }),
214
218
  /* @__PURE__ */ jsx(TimezoneComponent, { timezoneOptions: timezoneList })
215
219
  ] })
@@ -230,16 +234,6 @@ const ReleaseModal = ({
230
234
  )
231
235
  ] }) });
232
236
  };
233
- const getTimezones = (selectedDate) => {
234
- const timezoneList = Intl.supportedValuesOf("timeZone").map((timezone) => {
235
- const utcOffset = getTimezoneOffset(timezone, selectedDate);
236
- return { offset: utcOffset, value: `${utcOffset}&${timezone}` };
237
- });
238
- const systemTimezone = timezoneList.find(
239
- (timezone) => timezone.value.split("&")[1] === Intl.DateTimeFormat().resolvedOptions().timeZone
240
- );
241
- return { timezoneList, systemTimezone };
242
- };
243
237
  const TimezoneComponent = ({ timezoneOptions }) => {
244
238
  const { values, errors, setFieldValue } = useFormikContext();
245
239
  const { formatMessage } = useIntl();
@@ -254,31 +248,39 @@ const TimezoneComponent = ({ timezoneOptions }) => {
254
248
  }
255
249
  }
256
250
  }, [setFieldValue, values.date, values.timezone]);
257
- return /* @__PURE__ */ jsxs(Field.Root, { name: "timezone", error: errors.timezone, required: true, 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
- ] });
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
+ );
282
284
  };
283
285
  const useTypedDispatch = useDispatch;
284
286
  const isBaseQueryError = (error) => {
@@ -340,7 +342,7 @@ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
340
342
  }
341
343
  );
342
344
  }
343
- return /* @__PURE__ */ jsx(Grid.Root, { gap: 4, children: releases.map(({ id, name, scheduledAt, status }) => /* @__PURE__ */ jsx(Grid.Item, { col: 3, s: 6, xs: 12, children: /* @__PURE__ */ jsx(LinkCard, { tag: NavLink, to: `${id}`, isExternal: false, children: /* @__PURE__ */ jsxs(
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",
@@ -376,7 +378,7 @@ const StyledAlert = styled(Alert)`
376
378
  `;
377
379
  const INITIAL_FORM_VALUES = {
378
380
  name: "",
379
- date: void 0,
381
+ date: format(/* @__PURE__ */ new Date(), "yyyy-MM-dd"),
380
382
  time: "",
381
383
  isScheduled: true,
382
384
  scheduledAt: null,
@@ -391,6 +393,7 @@ const ReleasesPage = () => {
391
393
  const { formatAPIError } = useAPIErrorHandler();
392
394
  const [{ query }, setQuery] = useQueryParams();
393
395
  const response = useGetReleasesQuery(query);
396
+ const { data, isLoading: isLoadingSettings } = useGetReleaseSettingsQuery();
394
397
  const [createRelease, { isLoading: isSubmittingForm }] = useCreateReleaseMutation();
395
398
  const { getFeature } = useLicenseLimits();
396
399
  const { maximumReleases = 3 } = getFeature("cms-content-releases");
@@ -398,7 +401,7 @@ const ReleasesPage = () => {
398
401
  const {
399
402
  allowedActions: { canCreate }
400
403
  } = useRBAC(PERMISSIONS);
401
- const { isLoading, isSuccess, isError } = response;
404
+ const { isLoading: isLoadingReleases, isSuccess, isError } = response;
402
405
  const activeTab = response?.currentData?.meta?.activeTab || "pending";
403
406
  React.useEffect(() => {
404
407
  if (location?.state?.errors) {
@@ -419,7 +422,7 @@ const ReleasesPage = () => {
419
422
  const toggleAddReleaseModal = () => {
420
423
  setReleaseModalShown((prev) => !prev);
421
424
  };
422
- if (isLoading) {
425
+ if (isLoadingReleases || isLoadingSettings) {
423
426
  return /* @__PURE__ */ jsx(Page.Loading, {});
424
427
  }
425
428
  const totalPendingReleases = isSuccess && response.currentData?.meta?.pendingReleasesCount || 0;
@@ -464,7 +467,7 @@ const ReleasesPage = () => {
464
467
  });
465
468
  }
466
469
  };
467
- return /* @__PURE__ */ jsxs(Main, { "aria-busy": isLoading, children: [
470
+ return /* @__PURE__ */ jsxs(Main, { "aria-busy": isLoadingReleases || isLoadingSettings, children: [
468
471
  /* @__PURE__ */ jsx(
469
472
  Layouts.Header,
470
473
  {
@@ -579,7 +582,10 @@ const ReleasesPage = () => {
579
582
  handleClose: toggleAddReleaseModal,
580
583
  handleSubmit: handleAddRelease,
581
584
  isLoading: isSubmittingForm,
582
- initialValues: INITIAL_FORM_VALUES
585
+ initialValues: {
586
+ ...INITIAL_FORM_VALUES,
587
+ timezone: data?.data.defaultTimezone ? data.data.defaultTimezone.split("&")[1] : null
588
+ }
583
589
  }
584
590
  )
585
591
  ] });
@@ -590,7 +596,7 @@ const ReleaseInfoWrapper = styled(Flex)`
590
596
  border-bottom-left-radius: ${({ theme }) => theme.borderRadius};
591
597
  border-top: 1px solid ${({ theme }) => theme.colors.neutral150};
592
598
  `;
593
- const StyledMenuItem = styled(Menu.Item)`
599
+ const StyledMenuItem = styled(MenuItem)`
594
600
  svg path {
595
601
  fill: ${({ theme, disabled }) => disabled && theme.colors.neutral500};
596
602
  }
@@ -603,15 +609,15 @@ const StyledMenuItem = styled(Menu.Item)`
603
609
  }
604
610
  `;
605
611
  const PencilIcon = styled(Pencil)`
606
- width: ${({ theme }) => theme.spaces[3]};
607
- height: ${({ theme }) => theme.spaces[3]};
612
+ width: ${({ theme }) => theme.spaces[4]};
613
+ height: ${({ theme }) => theme.spaces[4]};
608
614
  path {
609
615
  fill: ${({ theme }) => theme.colors.neutral600};
610
616
  }
611
617
  `;
612
618
  const TrashIcon = styled(Trash)`
613
- width: ${({ theme }) => theme.spaces[3]};
614
- height: ${({ theme }) => theme.spaces[3]};
619
+ width: ${({ theme }) => theme.spaces[4]};
620
+ height: ${({ theme }) => theme.spaces[4]};
615
621
  path {
616
622
  fill: ${({ theme }) => theme.colors.danger600};
617
623
  }
@@ -619,42 +625,90 @@ const TrashIcon = styled(Trash)`
619
625
  const TypographyMaxWidth = styled(Typography)`
620
626
  max-width: 300px;
621
627
  `;
622
- const EntryValidationText = ({ action, schema, entry }) => {
628
+ const EntryValidationText = ({ action, schema, entry, status }) => {
623
629
  const { formatMessage } = useIntl();
624
- const { validate } = unstable_useDocument(
630
+ const { validate, isLoading } = unstable_useDocument(
625
631
  {
626
632
  collectionType: schema?.kind ?? "",
627
633
  model: schema?.uid ?? ""
628
634
  },
629
635
  {
630
- 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
631
638
  }
632
639
  );
633
- const errors = validate(entry) ?? {};
634
- if (Object.keys(errors).length > 0) {
635
- const validationErrorsMessages = Object.entries(errors).map(
636
- ([key, value]) => formatMessage(
637
- // @ts-expect-error TODO: fix this will better checks
638
- { id: `${value.id}.withField`, defaultMessage: value.defaultMessage },
639
- { field: key }
640
- )
641
- ).join(" ");
642
- return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
643
- /* @__PURE__ */ jsx(CrossCircle, { fill: "danger600" }),
644
- /* @__PURE__ */ jsx(Tooltip, { description: validationErrorsMessages, children: /* @__PURE__ */ jsx(TypographyMaxWidth, { textColor: "danger600", variant: "omega", fontWeight: "semiBold", ellipsis: true, children: validationErrorsMessages }) })
645
- ] });
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;
646
666
  }
647
- if (action == "publish") {
648
- return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
649
- /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
650
- entry.publishedAt ? /* @__PURE__ */ jsx(Typography, { textColor: "success600", fontWeight: "bold", children: formatMessage({
651
- id: "content-releases.pages.ReleaseDetails.entry-validation.already-published",
652
- defaultMessage: "Already published"
653
- }) }) : /* @__PURE__ */ jsx(Typography, { children: formatMessage({
654
- id: "content-releases.pages.ReleaseDetails.entry-validation.ready-to-publish",
655
- defaultMessage: "Ready to publish"
656
- }) })
657
- ] });
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
+ }
658
712
  }
659
713
  return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
660
714
  /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
@@ -800,83 +854,71 @@ const ReleaseDetailsLayout = ({
800
854
  ] }),
801
855
  navigationAction: /* @__PURE__ */ jsx(BackButton, {}),
802
856
  primaryAction: !release.releasedAt && /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
803
- /* @__PURE__ */ jsxs(Menu.Root, { children: [
804
- /* @__PURE__ */ jsx(
805
- Menu.Trigger,
806
- {
807
- paddingLeft: 2,
808
- paddingRight: 2,
809
- "aria-label": formatMessage({
810
- id: "content-releases.header.actions.open-release-actions",
811
- defaultMessage: "Release edit and delete menu"
812
- }),
813
- variant: "tertiary",
814
- children: /* @__PURE__ */ jsx(More, {})
815
- }
816
- ),
817
- /* @__PURE__ */ jsxs(Menu.Content, { top: 1, popoverPlacement: "bottom-end", maxHeight: void 0, children: [
818
- /* @__PURE__ */ jsxs(
819
- Flex,
820
- {
821
- alignItems: "center",
822
- justifyContent: "center",
823
- direction: "column",
824
- padding: 1,
825
- width: "100%",
826
- children: [
827
- /* @__PURE__ */ jsx(StyledMenuItem, { disabled: !canUpdate, onSelect: toggleEditReleaseModal, children: /* @__PURE__ */ jsxs(Flex, { alignItems: "center", gap: 2, hasRadius: true, width: "100%", children: [
828
- /* @__PURE__ */ jsx(PencilIcon, {}),
829
- /* @__PURE__ */ jsx(Typography, { ellipsis: true, children: formatMessage({
830
- id: "content-releases.header.actions.edit",
831
- 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"
832
889
  }) })
833
- ] }) }),
834
- /* @__PURE__ */ jsx(
835
- StyledMenuItem,
836
- {
837
- disabled: !canDelete,
838
- onSelect: toggleWarningSubmit,
839
- $variant: "danger",
840
- children: /* @__PURE__ */ jsxs(Flex, { alignItems: "center", gap: 2, hasRadius: true, width: "100%", children: [
841
- /* @__PURE__ */ jsx(TrashIcon, {}),
842
- /* @__PURE__ */ jsx(Typography, { ellipsis: true, textColor: "danger600", children: formatMessage({
843
- id: "content-releases.header.actions.delete",
844
- defaultMessage: "Delete"
845
- }) })
846
- ] })
847
- }
848
- )
849
- ]
850
- }
851
- ),
852
- /* @__PURE__ */ jsxs(
853
- ReleaseInfoWrapper,
854
- {
855
- direction: "column",
856
- justifyContent: "center",
857
- alignItems: "flex-start",
858
- gap: 1,
859
- padding: 5,
860
- children: [
861
- /* @__PURE__ */ jsx(Typography, { variant: "pi", fontWeight: "bold", children: formatMessage({
862
- id: "content-releases.header.actions.created",
863
- defaultMessage: "Created"
864
- }) }),
865
- /* @__PURE__ */ jsxs(Typography, { variant: "pi", color: "neutral300", children: [
866
- /* @__PURE__ */ jsx(RelativeTime$1, { timestamp: new Date(release.createdAt) }),
867
- formatMessage(
868
- {
869
- id: "content-releases.header.actions.created.description",
870
- defaultMessage: "{hasCreatedByUser, select, true { by {createdBy}} other { by deleted user}}"
871
- },
872
- { createdBy: getCreatedByUser(), hasCreatedByUser }
873
- )
874
890
  ] })
875
- ]
876
- }
877
- )
878
- ] })
879
- ] }),
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
+ ),
880
922
  /* @__PURE__ */ jsx(Button, { size: "S", variant: "tertiary", onClick: handleRefresh, children: formatMessage({
881
923
  id: "content-releases.header.actions.refresh",
882
924
  defaultMessage: "Refresh"
@@ -901,6 +943,11 @@ const ReleaseDetailsLayout = ({
901
943
  children
902
944
  ] });
903
945
  };
946
+ const SimpleMenuButton = styled(SimpleMenu)`
947
+ & > span {
948
+ display: flex;
949
+ }
950
+ `;
904
951
  const GROUP_BY_OPTIONS = ["contentType", "locale", "action"];
905
952
  const GROUP_BY_OPTIONS_NO_LOCALE = ["contentType", "action"];
906
953
  const getGroupByOptionLabel = (value) => {
@@ -935,19 +982,18 @@ const ReleaseDetailsBody = ({ releaseId }) => {
935
982
  allowedActions: { canUpdate }
936
983
  } = useRBAC(PERMISSIONS);
937
984
  const runHookWaterfall = useStrapiApp("ReleaseDetailsPage", (state) => state.runHookWaterfall);
938
- const { hasI18nEnabled } = runHookWaterfall(
939
- "ContentReleases/pages/ReleaseDetails/add-locale-in-releases",
940
- {
941
- displayedHeaders: {
942
- label: formatMessage({
943
- id: "content-releases.page.ReleaseDetails.table.header.label.locale",
944
- defaultMessage: "locale"
945
- }),
946
- name: "locale"
947
- },
948
- hasI18nEnabled: false
949
- }
950
- );
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
+ });
951
997
  const release = releaseData?.data;
952
998
  const selectedGroupBy = query?.groupBy || "contentType";
953
999
  const {
@@ -1053,34 +1099,27 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1053
1099
  defaultMessage: "Group by"
1054
1100
  });
1055
1101
  const headers = [
1056
- // ...displayedHeaders,
1102
+ ...displayedHeaders,
1057
1103
  {
1058
- label: formatMessage({
1059
- id: "content-releases.page.ReleaseDetails.table.header.label.name",
1060
- defaultMessage: "name"
1061
- }),
1062
- name: "name"
1063
- },
1064
- {
1065
- label: formatMessage({
1104
+ label: {
1066
1105
  id: "content-releases.page.ReleaseDetails.table.header.label.content-type",
1067
1106
  defaultMessage: "content-type"
1068
- }),
1107
+ },
1069
1108
  name: "content-type"
1070
1109
  },
1071
1110
  {
1072
- label: formatMessage({
1111
+ label: {
1073
1112
  id: "content-releases.page.ReleaseDetails.table.header.label.action",
1074
1113
  defaultMessage: "action"
1075
- }),
1114
+ },
1076
1115
  name: "action"
1077
1116
  },
1078
1117
  ...!release.releasedAt ? [
1079
1118
  {
1080
- label: formatMessage({
1119
+ label: {
1081
1120
  id: "content-releases.page.ReleaseDetails.table.header.label.status",
1082
1121
  defaultMessage: "status"
1083
- }),
1122
+ },
1084
1123
  name: "status"
1085
1124
  }
1086
1125
  ] : []
@@ -1118,10 +1157,10 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1118
1157
  headers,
1119
1158
  isLoading: isLoading || isFetching,
1120
1159
  children: /* @__PURE__ */ jsxs(Table.Content, { children: [
1121
- /* @__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)) }),
1122
1161
  /* @__PURE__ */ jsx(Table.Loading, {}),
1123
1162
  /* @__PURE__ */ jsx(Table.Body, { children: releaseActions[key].map(
1124
- ({ id, contentType, locale, type, entry }, actionIndex) => /* @__PURE__ */ jsxs(Tr, { children: [
1163
+ ({ id, contentType, locale, type, entry, status }, actionIndex) => /* @__PURE__ */ jsxs(Tr, { children: [
1125
1164
  /* @__PURE__ */ jsx(Td, { width: "25%", maxWidth: "200px", children: /* @__PURE__ */ jsx(Typography, { ellipsis: true, children: `${contentType.mainFieldValue || entry.id}` }) }),
1126
1165
  hasI18nEnabled && /* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: `${locale?.name ? locale.name : "-"}` }) }),
1127
1166
  /* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: contentType.displayName || "" }) }),
@@ -1150,7 +1189,8 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1150
1189
  action: type,
1151
1190
  schema: contentTypes?.[contentType.uid],
1152
1191
  components,
1153
- entry
1192
+ entry,
1193
+ status
1154
1194
  }
1155
1195
  ) }),
1156
1196
  /* @__PURE__ */ jsx(Td, { children: /* @__PURE__ */ jsx(Flex, { justifyContent: "flex-end", children: /* @__PURE__ */ jsxs(ReleaseActionMenu.Root, { children: [
@@ -1158,7 +1198,7 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1158
1198
  ReleaseActionMenu.ReleaseActionEntryLinkItem,
1159
1199
  {
1160
1200
  contentTypeUid: contentType.uid,
1161
- entryId: entry.id,
1201
+ documentId: entry.documentId,
1162
1202
  locale: locale?.code
1163
1203
  }
1164
1204
  ),
@@ -1208,13 +1248,24 @@ const ReleaseDetailsPage = () => {
1208
1248
  skip: !releaseId
1209
1249
  }
1210
1250
  );
1251
+ const { data: dataTimezone, isLoading: isLoadingTimezone } = useGetReleaseSettingsQuery();
1211
1252
  const [updateRelease, { isLoading: isSubmittingForm }] = useUpdateReleaseMutation();
1212
1253
  const [deleteRelease] = useDeleteReleaseMutation();
1213
1254
  const toggleEditReleaseModal = () => {
1214
1255
  setReleaseModalShown((prev) => !prev);
1215
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
+ };
1216
1267
  const toggleWarningSubmit = () => setWarningSubmit((prevState) => !prevState);
1217
- if (isLoadingDetails) {
1268
+ if (isLoadingDetails || isLoadingTimezone) {
1218
1269
  return /* @__PURE__ */ jsx(
1219
1270
  ReleaseDetailsLayout,
1220
1271
  {
@@ -1229,10 +1280,10 @@ const ReleaseDetailsPage = () => {
1229
1280
  }
1230
1281
  const releaseData = isSuccessDetails && data?.data || null;
1231
1282
  const title = releaseData?.name || "";
1232
- const timezone = releaseData?.timezone ?? null;
1283
+ const timezone = getTimezoneValue();
1233
1284
  const scheduledAt = releaseData?.scheduledAt && timezone ? utcToZonedTime(releaseData.scheduledAt, timezone) : null;
1234
- const date = scheduledAt ? format(scheduledAt, "yyyy-MM-dd") : void 0;
1235
- 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") : "";
1236
1287
  const handleEditRelease = async (values) => {
1237
1288
  const response = await updateRelease({
1238
1289
  id: releaseId,
@@ -1320,4 +1371,4 @@ const App = () => {
1320
1371
  export {
1321
1372
  App
1322
1373
  };
1323
- //# sourceMappingURL=App-B2R2exNT.mjs.map
1374
+ //# sourceMappingURL=App-Cne--1Z8.mjs.map