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

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 (99) hide show
  1. package/LICENSE +17 -1
  2. package/dist/_chunks/{App-B2R2exNT.mjs → App-DMILern_.mjs} +295 -262
  3. package/dist/_chunks/App-DMILern_.mjs.map +1 -0
  4. package/dist/_chunks/{App-CEwOQkKT.js → App-fAgiijnc.js} +292 -260
  5. package/dist/_chunks/App-fAgiijnc.js.map +1 -0
  6. package/dist/_chunks/ReleasesSettingsPage-YVZJH-oN.js +178 -0
  7. package/dist/_chunks/ReleasesSettingsPage-YVZJH-oN.js.map +1 -0
  8. package/dist/_chunks/ReleasesSettingsPage-dwoRuXB-.mjs +178 -0
  9. package/dist/_chunks/ReleasesSettingsPage-dwoRuXB-.mjs.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--_NWfuDG.js} +760 -431
  15. package/dist/_chunks/index--_NWfuDG.js.map +1 -0
  16. package/dist/_chunks/{index-DbmynICx.mjs → index-CYsQToWs.mjs} +777 -448
  17. package/dist/_chunks/index-CYsQToWs.mjs.map +1 -0
  18. package/dist/_chunks/schemas-63pFihNF.mjs +44 -0
  19. package/dist/_chunks/schemas-63pFihNF.mjs.map +1 -0
  20. package/dist/_chunks/schemas-z5zp-_Gd.js +62 -0
  21. package/dist/_chunks/schemas-z5zp-_Gd.js.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 +796 -623
  35. package/dist/server/index.js.map +1 -1
  36. package/dist/server/index.mjs +797 -624
  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 +66 -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 +38 -38
  74. package/dist/server/src/services/index.d.ts.map +1 -1
  75. package/dist/server/src/services/release-action.d.ts +36 -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 +10 -9
  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.map +0 -1
  98. package/dist/shared/validation-schemas.d.ts +0 -2
  99. 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
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-CYsQToWs.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-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,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
  }
@@ -619,42 +625,72 @@ 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
+ if (isLoading) {
641
+ return null;
646
642
  }
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
- ] });
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
+ }
658
694
  }
659
695
  return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
660
696
  /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
@@ -800,83 +836,71 @@ const ReleaseDetailsLayout = ({
800
836
  ] }),
801
837
  navigationAction: /* @__PURE__ */ jsx(BackButton, {}),
802
838
  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"
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"
832
871
  }) })
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
872
  ] })
875
- ]
876
- }
877
- )
878
- ] })
879
- ] }),
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
+ ),
880
904
  /* @__PURE__ */ jsx(Button, { size: "S", variant: "tertiary", onClick: handleRefresh, children: formatMessage({
881
905
  id: "content-releases.header.actions.refresh",
882
906
  defaultMessage: "Refresh"
@@ -901,6 +925,11 @@ const ReleaseDetailsLayout = ({
901
925
  children
902
926
  ] });
903
927
  };
928
+ const SimpleMenuButton = styled(SimpleMenu)`
929
+ & > span {
930
+ display: flex;
931
+ }
932
+ `;
904
933
  const GROUP_BY_OPTIONS = ["contentType", "locale", "action"];
905
934
  const GROUP_BY_OPTIONS_NO_LOCALE = ["contentType", "action"];
906
935
  const getGroupByOptionLabel = (value) => {
@@ -935,19 +964,18 @@ const ReleaseDetailsBody = ({ releaseId }) => {
935
964
  allowedActions: { canUpdate }
936
965
  } = useRBAC(PERMISSIONS);
937
966
  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
- );
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
+ });
951
979
  const release = releaseData?.data;
952
980
  const selectedGroupBy = query?.groupBy || "contentType";
953
981
  const {
@@ -1053,34 +1081,27 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1053
1081
  defaultMessage: "Group by"
1054
1082
  });
1055
1083
  const headers = [
1056
- // ...displayedHeaders,
1084
+ ...displayedHeaders,
1057
1085
  {
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({
1086
+ label: {
1066
1087
  id: "content-releases.page.ReleaseDetails.table.header.label.content-type",
1067
1088
  defaultMessage: "content-type"
1068
- }),
1089
+ },
1069
1090
  name: "content-type"
1070
1091
  },
1071
1092
  {
1072
- label: formatMessage({
1093
+ label: {
1073
1094
  id: "content-releases.page.ReleaseDetails.table.header.label.action",
1074
1095
  defaultMessage: "action"
1075
- }),
1096
+ },
1076
1097
  name: "action"
1077
1098
  },
1078
1099
  ...!release.releasedAt ? [
1079
1100
  {
1080
- label: formatMessage({
1101
+ label: {
1081
1102
  id: "content-releases.page.ReleaseDetails.table.header.label.status",
1082
1103
  defaultMessage: "status"
1083
- }),
1104
+ },
1084
1105
  name: "status"
1085
1106
  }
1086
1107
  ] : []
@@ -1118,10 +1139,10 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1118
1139
  headers,
1119
1140
  isLoading: isLoading || isFetching,
1120
1141
  children: /* @__PURE__ */ jsxs(Table.Content, { children: [
1121
- /* @__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)) }),
1122
1143
  /* @__PURE__ */ jsx(Table.Loading, {}),
1123
1144
  /* @__PURE__ */ jsx(Table.Body, { children: releaseActions[key].map(
1124
- ({ id, contentType, locale, type, entry }, actionIndex) => /* @__PURE__ */ jsxs(Tr, { children: [
1145
+ ({ id, contentType, locale, type, entry, status }, actionIndex) => /* @__PURE__ */ jsxs(Tr, { children: [
1125
1146
  /* @__PURE__ */ jsx(Td, { width: "25%", maxWidth: "200px", children: /* @__PURE__ */ jsx(Typography, { ellipsis: true, children: `${contentType.mainFieldValue || entry.id}` }) }),
1126
1147
  hasI18nEnabled && /* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: `${locale?.name ? locale.name : "-"}` }) }),
1127
1148
  /* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: contentType.displayName || "" }) }),
@@ -1150,7 +1171,8 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1150
1171
  action: type,
1151
1172
  schema: contentTypes?.[contentType.uid],
1152
1173
  components,
1153
- entry
1174
+ entry,
1175
+ status
1154
1176
  }
1155
1177
  ) }),
1156
1178
  /* @__PURE__ */ jsx(Td, { children: /* @__PURE__ */ jsx(Flex, { justifyContent: "flex-end", children: /* @__PURE__ */ jsxs(ReleaseActionMenu.Root, { children: [
@@ -1158,7 +1180,7 @@ const ReleaseDetailsBody = ({ releaseId }) => {
1158
1180
  ReleaseActionMenu.ReleaseActionEntryLinkItem,
1159
1181
  {
1160
1182
  contentTypeUid: contentType.uid,
1161
- entryId: entry.id,
1183
+ documentId: entry.documentId,
1162
1184
  locale: locale?.code
1163
1185
  }
1164
1186
  ),
@@ -1208,13 +1230,24 @@ const ReleaseDetailsPage = () => {
1208
1230
  skip: !releaseId
1209
1231
  }
1210
1232
  );
1233
+ const { data: dataTimezone, isLoading: isLoadingTimezone } = useGetReleaseSettingsQuery();
1211
1234
  const [updateRelease, { isLoading: isSubmittingForm }] = useUpdateReleaseMutation();
1212
1235
  const [deleteRelease] = useDeleteReleaseMutation();
1213
1236
  const toggleEditReleaseModal = () => {
1214
1237
  setReleaseModalShown((prev) => !prev);
1215
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
+ };
1216
1249
  const toggleWarningSubmit = () => setWarningSubmit((prevState) => !prevState);
1217
- if (isLoadingDetails) {
1250
+ if (isLoadingDetails || isLoadingTimezone) {
1218
1251
  return /* @__PURE__ */ jsx(
1219
1252
  ReleaseDetailsLayout,
1220
1253
  {
@@ -1229,10 +1262,10 @@ const ReleaseDetailsPage = () => {
1229
1262
  }
1230
1263
  const releaseData = isSuccessDetails && data?.data || null;
1231
1264
  const title = releaseData?.name || "";
1232
- const timezone = releaseData?.timezone ?? null;
1265
+ const timezone = getTimezoneValue();
1233
1266
  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") : "";
1267
+ const date = scheduledAt ? format$1(scheduledAt, "yyyy-MM-dd") : void 0;
1268
+ const time = scheduledAt ? format$1(scheduledAt, "HH:mm") : "";
1236
1269
  const handleEditRelease = async (values) => {
1237
1270
  const response = await updateRelease({
1238
1271
  id: releaseId,
@@ -1320,4 +1353,4 @@ const App = () => {
1320
1353
  export {
1321
1354
  App
1322
1355
  };
1323
- //# sourceMappingURL=App-B2R2exNT.mjs.map
1356
+ //# sourceMappingURL=App-DMILern_.mjs.map