@strapi/content-releases 0.0.0-experimental.fb442e5e12dd3f611303691bf85a249520ba348b → 0.0.0-experimental.fb92031f3d90f3d2a2d191ba65725b6c8e329a5d

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 (289) hide show
  1. package/dist/admin/assets/purchase-page-illustration-dark.svg.js +6 -0
  2. package/dist/admin/assets/purchase-page-illustration-dark.svg.js.map +1 -0
  3. package/dist/admin/assets/purchase-page-illustration-dark.svg.mjs +4 -0
  4. package/dist/admin/assets/purchase-page-illustration-dark.svg.mjs.map +1 -0
  5. package/dist/admin/assets/purchase-page-illustration-light.svg.js +6 -0
  6. package/dist/admin/assets/purchase-page-illustration-light.svg.js.map +1 -0
  7. package/dist/admin/assets/purchase-page-illustration-light.svg.mjs +4 -0
  8. package/dist/admin/assets/purchase-page-illustration-light.svg.mjs.map +1 -0
  9. package/dist/admin/components/EntryValidationPopover.js +344 -0
  10. package/dist/admin/components/EntryValidationPopover.js.map +1 -0
  11. package/dist/admin/components/EntryValidationPopover.mjs +342 -0
  12. package/dist/admin/components/EntryValidationPopover.mjs.map +1 -0
  13. package/dist/admin/components/RelativeTime.js +76 -0
  14. package/dist/admin/components/RelativeTime.js.map +1 -0
  15. package/dist/admin/components/RelativeTime.mjs +55 -0
  16. package/dist/admin/components/RelativeTime.mjs.map +1 -0
  17. package/dist/admin/components/ReleaseAction.js +201 -0
  18. package/dist/admin/components/ReleaseAction.js.map +1 -0
  19. package/dist/admin/components/ReleaseAction.mjs +199 -0
  20. package/dist/admin/components/ReleaseAction.mjs.map +1 -0
  21. package/dist/admin/components/ReleaseActionMenu.js +243 -0
  22. package/dist/admin/components/ReleaseActionMenu.js.map +1 -0
  23. package/dist/admin/components/ReleaseActionMenu.mjs +222 -0
  24. package/dist/admin/components/ReleaseActionMenu.mjs.map +1 -0
  25. package/dist/admin/components/ReleaseActionModal.js +268 -0
  26. package/dist/admin/components/ReleaseActionModal.js.map +1 -0
  27. package/dist/admin/components/ReleaseActionModal.mjs +244 -0
  28. package/dist/admin/components/ReleaseActionModal.mjs.map +1 -0
  29. package/dist/admin/components/ReleaseActionOptions.js +104 -0
  30. package/dist/admin/components/ReleaseActionOptions.js.map +1 -0
  31. package/dist/admin/components/ReleaseActionOptions.mjs +102 -0
  32. package/dist/admin/components/ReleaseActionOptions.mjs.map +1 -0
  33. package/dist/admin/components/ReleaseListCell.js +103 -0
  34. package/dist/admin/components/ReleaseListCell.js.map +1 -0
  35. package/dist/admin/components/ReleaseListCell.mjs +100 -0
  36. package/dist/admin/components/ReleaseListCell.mjs.map +1 -0
  37. package/dist/admin/components/ReleaseModal.js +323 -0
  38. package/dist/admin/components/ReleaseModal.js.map +1 -0
  39. package/dist/admin/components/ReleaseModal.mjs +302 -0
  40. package/dist/admin/components/ReleaseModal.mjs.map +1 -0
  41. package/dist/admin/components/ReleasesPanel.js +138 -0
  42. package/dist/admin/components/ReleasesPanel.js.map +1 -0
  43. package/dist/admin/components/ReleasesPanel.mjs +136 -0
  44. package/dist/admin/components/ReleasesPanel.mjs.map +1 -0
  45. package/dist/admin/constants.js +77 -0
  46. package/dist/admin/constants.js.map +1 -0
  47. package/dist/admin/constants.mjs +75 -0
  48. package/dist/admin/constants.mjs.map +1 -0
  49. package/dist/admin/index.js +125 -4
  50. package/dist/admin/index.js.map +1 -1
  51. package/dist/admin/index.mjs +120 -4
  52. package/dist/admin/index.mjs.map +1 -1
  53. package/dist/admin/modules/hooks.js +8 -0
  54. package/dist/admin/modules/hooks.js.map +1 -0
  55. package/dist/admin/modules/hooks.mjs +6 -0
  56. package/dist/admin/modules/hooks.mjs.map +1 -0
  57. package/dist/admin/pages/App.js +29 -0
  58. package/dist/admin/pages/App.js.map +1 -0
  59. package/dist/admin/pages/App.mjs +27 -0
  60. package/dist/admin/pages/App.mjs.map +1 -0
  61. package/dist/admin/pages/PurchaseContentReleases.js +192 -0
  62. package/dist/admin/pages/PurchaseContentReleases.js.map +1 -0
  63. package/dist/admin/pages/PurchaseContentReleases.mjs +190 -0
  64. package/dist/admin/pages/PurchaseContentReleases.mjs.map +1 -0
  65. package/dist/admin/pages/ReleaseDetailsPage.js +821 -0
  66. package/dist/admin/pages/ReleaseDetailsPage.js.map +1 -0
  67. package/dist/admin/pages/ReleaseDetailsPage.mjs +800 -0
  68. package/dist/admin/pages/ReleaseDetailsPage.mjs.map +1 -0
  69. package/dist/admin/pages/ReleasesPage.js +397 -0
  70. package/dist/admin/pages/ReleasesPage.js.map +1 -0
  71. package/dist/admin/pages/ReleasesPage.mjs +375 -0
  72. package/dist/admin/pages/ReleasesPage.mjs.map +1 -0
  73. package/dist/admin/pages/ReleasesSettingsPage.js +199 -0
  74. package/dist/admin/pages/ReleasesSettingsPage.js.map +1 -0
  75. package/dist/admin/pages/ReleasesSettingsPage.mjs +197 -0
  76. package/dist/admin/pages/ReleasesSettingsPage.mjs.map +1 -0
  77. package/dist/admin/pluginId.js +6 -0
  78. package/dist/admin/pluginId.js.map +1 -0
  79. package/dist/admin/pluginId.mjs +4 -0
  80. package/dist/admin/pluginId.mjs.map +1 -0
  81. package/dist/admin/services/release.js +464 -0
  82. package/dist/admin/services/release.js.map +1 -0
  83. package/dist/admin/services/release.mjs +447 -0
  84. package/dist/admin/services/release.mjs.map +1 -0
  85. package/dist/admin/src/components/EntryValidationPopover.d.ts +13 -0
  86. package/dist/admin/src/components/ReleaseListCell.d.ts +1 -1
  87. package/dist/admin/src/services/release.d.ts +28 -28
  88. package/dist/admin/store/hooks.js +8 -0
  89. package/dist/admin/store/hooks.js.map +1 -0
  90. package/dist/admin/store/hooks.mjs +6 -0
  91. package/dist/admin/store/hooks.mjs.map +1 -0
  92. package/dist/admin/translations/en.json.js +108 -0
  93. package/dist/admin/translations/en.json.js.map +1 -0
  94. package/dist/admin/translations/en.json.mjs +106 -0
  95. package/dist/admin/translations/en.json.mjs.map +1 -0
  96. package/dist/admin/translations/uk.json.js +103 -0
  97. package/dist/admin/translations/uk.json.js.map +1 -0
  98. package/dist/admin/translations/uk.json.mjs +101 -0
  99. package/dist/admin/translations/uk.json.mjs.map +1 -0
  100. package/dist/admin/utils/api.js +8 -0
  101. package/dist/admin/utils/api.js.map +1 -0
  102. package/dist/admin/utils/api.mjs +6 -0
  103. package/dist/admin/utils/api.mjs.map +1 -0
  104. package/dist/admin/utils/prefixPluginTranslations.js +11 -0
  105. package/dist/admin/utils/prefixPluginTranslations.js.map +1 -0
  106. package/dist/admin/utils/prefixPluginTranslations.mjs +9 -0
  107. package/dist/admin/utils/prefixPluginTranslations.mjs.map +1 -0
  108. package/dist/admin/utils/time.js +42 -0
  109. package/dist/admin/utils/time.js.map +1 -0
  110. package/dist/admin/utils/time.mjs +39 -0
  111. package/dist/admin/utils/time.mjs.map +1 -0
  112. package/dist/admin/validation/schemas.js +65 -0
  113. package/dist/admin/validation/schemas.js.map +1 -0
  114. package/dist/admin/validation/schemas.mjs +43 -0
  115. package/dist/admin/validation/schemas.mjs.map +1 -0
  116. package/dist/server/bootstrap.js +68 -0
  117. package/dist/server/bootstrap.js.map +1 -0
  118. package/dist/server/bootstrap.mjs +66 -0
  119. package/dist/server/bootstrap.mjs.map +1 -0
  120. package/dist/server/constants.js +74 -0
  121. package/dist/server/constants.js.map +1 -0
  122. package/dist/server/constants.mjs +69 -0
  123. package/dist/server/constants.mjs.map +1 -0
  124. package/dist/server/content-types/index.js +12 -0
  125. package/dist/server/content-types/index.js.map +1 -0
  126. package/dist/server/content-types/index.mjs +10 -0
  127. package/dist/server/content-types/index.mjs.map +1 -0
  128. package/dist/server/content-types/release/index.js +10 -0
  129. package/dist/server/content-types/release/index.js.map +1 -0
  130. package/dist/server/content-types/release/index.mjs +8 -0
  131. package/dist/server/content-types/release/index.mjs.map +1 -0
  132. package/dist/server/content-types/release/schema.js +58 -0
  133. package/dist/server/content-types/release/schema.js.map +1 -0
  134. package/dist/server/content-types/release/schema.mjs +56 -0
  135. package/dist/server/content-types/release/schema.mjs.map +1 -0
  136. package/dist/server/content-types/release-action/index.js +10 -0
  137. package/dist/server/content-types/release-action/index.js.map +1 -0
  138. package/dist/server/content-types/release-action/index.mjs +8 -0
  139. package/dist/server/content-types/release-action/index.mjs.map +1 -0
  140. package/dist/server/content-types/release-action/schema.js +55 -0
  141. package/dist/server/content-types/release-action/schema.js.map +1 -0
  142. package/dist/server/content-types/release-action/schema.mjs +53 -0
  143. package/dist/server/content-types/release-action/schema.mjs.map +1 -0
  144. package/dist/server/controllers/index.js +14 -0
  145. package/dist/server/controllers/index.js.map +1 -0
  146. package/dist/server/controllers/index.mjs +12 -0
  147. package/dist/server/controllers/index.mjs.map +1 -0
  148. package/dist/server/controllers/release-action.js +150 -0
  149. package/dist/server/controllers/release-action.js.map +1 -0
  150. package/dist/server/controllers/release-action.mjs +148 -0
  151. package/dist/server/controllers/release-action.mjs.map +1 -0
  152. package/dist/server/controllers/release.js +302 -0
  153. package/dist/server/controllers/release.js.map +1 -0
  154. package/dist/server/controllers/release.mjs +300 -0
  155. package/dist/server/controllers/release.mjs.map +1 -0
  156. package/dist/server/controllers/settings.js +37 -0
  157. package/dist/server/controllers/settings.js.map +1 -0
  158. package/dist/server/controllers/settings.mjs +35 -0
  159. package/dist/server/controllers/settings.mjs.map +1 -0
  160. package/dist/server/controllers/validation/release-action.js +34 -0
  161. package/dist/server/controllers/validation/release-action.js.map +1 -0
  162. package/dist/server/controllers/validation/release-action.mjs +30 -0
  163. package/dist/server/controllers/validation/release-action.mjs.map +1 -0
  164. package/dist/server/controllers/validation/release.js +26 -0
  165. package/dist/server/controllers/validation/release.js.map +1 -0
  166. package/dist/server/controllers/validation/release.mjs +22 -0
  167. package/dist/server/controllers/validation/release.mjs.map +1 -0
  168. package/dist/server/controllers/validation/settings.js +32 -0
  169. package/dist/server/controllers/validation/settings.js.map +1 -0
  170. package/dist/server/controllers/validation/settings.mjs +10 -0
  171. package/dist/server/controllers/validation/settings.mjs.map +1 -0
  172. package/dist/server/destroy.js +15 -0
  173. package/dist/server/destroy.js.map +1 -0
  174. package/dist/server/destroy.mjs +13 -0
  175. package/dist/server/destroy.mjs.map +1 -0
  176. package/dist/server/index.js +25 -1947
  177. package/dist/server/index.js.map +1 -1
  178. package/dist/server/index.mjs +24 -1927
  179. package/dist/server/index.mjs.map +1 -1
  180. package/dist/server/middlewares/documents.js +104 -0
  181. package/dist/server/middlewares/documents.js.map +1 -0
  182. package/dist/server/middlewares/documents.mjs +101 -0
  183. package/dist/server/middlewares/documents.mjs.map +1 -0
  184. package/dist/server/migrations/database/5.0.0-document-id-in-actions.js +51 -0
  185. package/dist/server/migrations/database/5.0.0-document-id-in-actions.js.map +1 -0
  186. package/dist/server/migrations/database/5.0.0-document-id-in-actions.mjs +49 -0
  187. package/dist/server/migrations/database/5.0.0-document-id-in-actions.mjs.map +1 -0
  188. package/dist/server/migrations/index.js +205 -0
  189. package/dist/server/migrations/index.js.map +1 -0
  190. package/dist/server/migrations/index.mjs +198 -0
  191. package/dist/server/migrations/index.mjs.map +1 -0
  192. package/dist/server/register.js +23 -0
  193. package/dist/server/register.js.map +1 -0
  194. package/dist/server/register.mjs +21 -0
  195. package/dist/server/register.mjs.map +1 -0
  196. package/dist/server/routes/index.js +14 -0
  197. package/dist/server/routes/index.js.map +1 -0
  198. package/dist/server/routes/index.mjs +12 -0
  199. package/dist/server/routes/index.mjs.map +1 -0
  200. package/dist/server/routes/release-action.js +100 -0
  201. package/dist/server/routes/release-action.js.map +1 -0
  202. package/dist/server/routes/release-action.mjs +98 -0
  203. package/dist/server/routes/release-action.mjs.map +1 -0
  204. package/dist/server/routes/release.js +154 -0
  205. package/dist/server/routes/release.js.map +1 -0
  206. package/dist/server/routes/release.mjs +152 -0
  207. package/dist/server/routes/release.mjs.map +1 -0
  208. package/dist/server/routes/settings.js +46 -0
  209. package/dist/server/routes/settings.js.map +1 -0
  210. package/dist/server/routes/settings.mjs +44 -0
  211. package/dist/server/routes/settings.mjs.map +1 -0
  212. package/dist/server/services/index.js +18 -0
  213. package/dist/server/services/index.js.map +1 -0
  214. package/dist/server/services/index.mjs +16 -0
  215. package/dist/server/services/index.mjs.map +1 -0
  216. package/dist/server/services/release-action.js +323 -0
  217. package/dist/server/services/release-action.js.map +1 -0
  218. package/dist/server/services/release-action.mjs +321 -0
  219. package/dist/server/services/release-action.mjs.map +1 -0
  220. package/dist/server/services/release.js +324 -0
  221. package/dist/server/services/release.js.map +1 -0
  222. package/dist/server/services/release.mjs +322 -0
  223. package/dist/server/services/release.mjs.map +1 -0
  224. package/dist/server/services/scheduling.js +70 -0
  225. package/dist/server/services/scheduling.js.map +1 -0
  226. package/dist/server/services/scheduling.mjs +68 -0
  227. package/dist/server/services/scheduling.mjs.map +1 -0
  228. package/dist/server/services/settings.js +34 -0
  229. package/dist/server/services/settings.js.map +1 -0
  230. package/dist/server/services/settings.mjs +32 -0
  231. package/dist/server/services/settings.mjs.map +1 -0
  232. package/dist/server/services/validation.js +91 -0
  233. package/dist/server/services/validation.js.map +1 -0
  234. package/dist/server/services/validation.mjs +86 -0
  235. package/dist/server/services/validation.mjs.map +1 -0
  236. package/dist/server/src/controllers/release-action.d.ts.map +1 -1
  237. package/dist/server/src/controllers/release.d.ts.map +1 -1
  238. package/dist/server/src/destroy.d.ts +1 -1
  239. package/dist/server/src/destroy.d.ts.map +1 -1
  240. package/dist/server/src/index.d.ts +4 -6
  241. package/dist/server/src/index.d.ts.map +1 -1
  242. package/dist/server/src/middlewares/documents.d.ts +1 -1
  243. package/dist/server/src/middlewares/documents.d.ts.map +1 -1
  244. package/dist/server/src/migrations/database/5.0.0-document-id-in-actions.d.ts.map +1 -1
  245. package/dist/server/src/services/index.d.ts +4 -6
  246. package/dist/server/src/services/index.d.ts.map +1 -1
  247. package/dist/server/src/services/release-action.d.ts +6 -8
  248. package/dist/server/src/services/release-action.d.ts.map +1 -1
  249. package/dist/server/src/services/scheduling.d.ts +1 -1
  250. package/dist/server/src/services/scheduling.d.ts.map +1 -1
  251. package/dist/server/src/services/validation.d.ts +1 -1
  252. package/dist/server/src/services/validation.d.ts.map +1 -1
  253. package/dist/server/src/utils/index.d.ts.map +1 -1
  254. package/dist/server/utils/index.js +93 -0
  255. package/dist/server/utils/index.js.map +1 -0
  256. package/dist/server/utils/index.mjs +87 -0
  257. package/dist/server/utils/index.mjs.map +1 -0
  258. package/dist/shared/contracts/release-actions.d.ts +8 -2
  259. package/dist/shared/contracts/release-actions.d.ts.map +1 -1
  260. package/dist/shared/contracts/releases.d.ts +0 -1
  261. package/dist/shared/contracts/settings.d.ts +1 -2
  262. package/dist/shared/contracts/settings.d.ts.map +1 -1
  263. package/dist/shared/types.d.ts +0 -1
  264. package/package.json +24 -20
  265. package/dist/_chunks/App-DMILern_.mjs +0 -1356
  266. package/dist/_chunks/App-DMILern_.mjs.map +0 -1
  267. package/dist/_chunks/App-fAgiijnc.js +0 -1377
  268. package/dist/_chunks/App-fAgiijnc.js.map +0 -1
  269. package/dist/_chunks/PurchaseContentReleases-Be3acS2L.js +0 -52
  270. package/dist/_chunks/PurchaseContentReleases-Be3acS2L.js.map +0 -1
  271. package/dist/_chunks/PurchaseContentReleases-_MxP6-Dt.mjs +0 -52
  272. package/dist/_chunks/PurchaseContentReleases-_MxP6-Dt.mjs.map +0 -1
  273. package/dist/_chunks/ReleasesSettingsPage-YVZJH-oN.js +0 -178
  274. package/dist/_chunks/ReleasesSettingsPage-YVZJH-oN.js.map +0 -1
  275. package/dist/_chunks/ReleasesSettingsPage-dwoRuXB-.mjs +0 -178
  276. package/dist/_chunks/ReleasesSettingsPage-dwoRuXB-.mjs.map +0 -1
  277. package/dist/_chunks/en-CmYoEnA7.js +0 -93
  278. package/dist/_chunks/en-CmYoEnA7.js.map +0 -1
  279. package/dist/_chunks/en-D0yVZFqf.mjs +0 -93
  280. package/dist/_chunks/en-D0yVZFqf.mjs.map +0 -1
  281. package/dist/_chunks/index--_NWfuDG.js +0 -1358
  282. package/dist/_chunks/index--_NWfuDG.js.map +0 -1
  283. package/dist/_chunks/index-CYsQToWs.mjs +0 -1339
  284. package/dist/_chunks/index-CYsQToWs.mjs.map +0 -1
  285. package/dist/_chunks/schemas-63pFihNF.mjs +0 -44
  286. package/dist/_chunks/schemas-63pFihNF.mjs.map +0 -1
  287. package/dist/_chunks/schemas-z5zp-_Gd.js +0 -62
  288. package/dist/_chunks/schemas-z5zp-_Gd.js.map +0 -1
  289. package/strapi-server.js +0 -3
@@ -1,1356 +0,0 @@
1
- import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
- import { useNotification, useAPIErrorHandler, useQueryParams, useTracking, useRBAC, Page, Layouts, Pagination, isFetchError, ConfirmDialog, BackButton, useStrapiApp, Table } from "@strapi/admin/strapi-admin";
3
- import { useLocation, useNavigate, NavLink, useParams, Navigate, Link as Link$1, Routes, Route } from "react-router-dom";
4
- import { g as getTimezones, p as pluginId, u as useGetReleasesQuery, a as useGetReleaseSettingsQuery, b as useCreateReleaseMutation, P as PERMISSIONS, c as useGetReleaseQuery, d as useUpdateReleaseMutation, e as useDeleteReleaseMutation, f as usePublishReleaseMutation, h as getTimezoneOffset, i as useGetReleaseActionsQuery, j as useUpdateReleaseActionMutation, R as ReleaseActionOptions, k as ReleaseActionMenu, r as releaseApi } from "./index-CYsQToWs.mjs";
5
- import * as React from "react";
6
- import { unstable_useDocument } from "@strapi/content-manager/strapi-admin";
7
- import { Modal, Flex, Field, TextInput, Box, Checkbox, Typography, DatePicker, TimePicker, Button, Combobox, ComboboxOption, Link, Alert, Main, Tabs, Divider, EmptyStateLayout, Grid, Badge, MenuItem, SimpleMenu, Dialog, LinkButton, SingleSelect, SingleSelectOption, Tr, Td, Tooltip } from "@strapi/design-system";
8
- import { Plus, Pencil, Trash, More, CrossCircle, CheckCircle, ArrowsCounterClockwise } from "@strapi/icons";
9
- import { EmptyDocuments } from "@strapi/icons/symbols";
10
- import format$1 from "date-fns/format";
11
- import { utcToZonedTime, zonedTimeToUtc } from "date-fns-tz";
12
- import { useIntl } from "react-intl";
13
- import { styled } from "styled-components";
14
- import { intervalToDuration, isPast, formatISO, format } from "date-fns";
15
- import { Formik, Form, useFormikContext } from "formik";
16
- import { R as RELEASE_SCHEMA } from "./schemas-63pFihNF.mjs";
17
- import { useDispatch } from "react-redux";
18
- import { useLicenseLimits } from "@strapi/admin/strapi-admin/ee";
19
- const intervals = ["years", "months", "days", "hours", "minutes", "seconds"];
20
- const RelativeTime$1 = React.forwardRef(
21
- ({ timestamp, customIntervals = [], ...restProps }, forwardedRef) => {
22
- const { formatRelativeTime, formatDate, formatTime } = useIntl();
23
- const interval = intervalToDuration({
24
- start: timestamp,
25
- end: Date.now()
26
- // see https://github.com/date-fns/date-fns/issues/2891 – No idea why it's all partial it returns it every time.
27
- });
28
- const unit = intervals.find((intervalUnit) => {
29
- return interval[intervalUnit] > 0 && Object.keys(interval).includes(intervalUnit);
30
- });
31
- const relativeTime = isPast(timestamp) ? -interval[unit] : interval[unit];
32
- const customInterval = customIntervals.find(
33
- (custom) => interval[custom.unit] < custom.threshold
34
- );
35
- const displayText = customInterval ? customInterval.text : formatRelativeTime(relativeTime, unit, { numeric: "auto" });
36
- return /* @__PURE__ */ jsx(
37
- "time",
38
- {
39
- ref: forwardedRef,
40
- dateTime: timestamp.toISOString(),
41
- role: "time",
42
- title: `${formatDate(timestamp)} ${formatTime(timestamp)}`,
43
- ...restProps,
44
- children: displayText
45
- }
46
- );
47
- }
48
- );
49
- const ReleaseModal = ({
50
- handleClose,
51
- open,
52
- handleSubmit,
53
- initialValues,
54
- isLoading = false
55
- }) => {
56
- const { formatMessage } = useIntl();
57
- const { pathname } = useLocation();
58
- const isCreatingRelease = pathname === `/plugins/${pluginId}`;
59
- const { timezoneList, systemTimezone = { value: "UTC+00:00-Africa/Abidjan " } } = getTimezones(
60
- initialValues.scheduledAt ? new Date(initialValues.scheduledAt) : /* @__PURE__ */ new Date()
61
- );
62
- const getScheduledTimestamp = (values) => {
63
- const { date, time, timezone } = values;
64
- if (!date || !time || !timezone)
65
- return null;
66
- const timezoneWithoutOffset = timezone.split("&")[1];
67
- return zonedTimeToUtc(`${date} ${time}`, timezoneWithoutOffset);
68
- };
69
- const getTimezoneWithOffset = () => {
70
- const currentTimezone = timezoneList.find(
71
- (timezone) => timezone.value.split("&")[1] === initialValues.timezone
72
- );
73
- return currentTimezone?.value || systemTimezone.value;
74
- };
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(
77
- {
78
- id: "content-releases.modal.title",
79
- defaultMessage: "{isCreatingRelease, select, true {New release} other {Edit release}}"
80
- },
81
- { isCreatingRelease }
82
- ) }) }),
83
- /* @__PURE__ */ jsx(
84
- Formik,
85
- {
86
- onSubmit: (values) => {
87
- handleSubmit({
88
- ...values,
89
- timezone: values.timezone ? values.timezone.split("&")[1] : null,
90
- scheduledAt: values.isScheduled ? getScheduledTimestamp(values) : null
91
- });
92
- },
93
- initialValues: {
94
- ...initialValues,
95
- timezone: initialValues.timezone ? getTimezoneWithOffset() : systemTimezone.value
96
- },
97
- validationSchema: RELEASE_SCHEMA,
98
- validateOnChange: false,
99
- children: ({ values, errors, handleChange, setFieldValue }) => {
100
- return /* @__PURE__ */ jsxs(Form, { children: [
101
- /* @__PURE__ */ jsx(Modal.Body, { children: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 6, children: [
102
- /* @__PURE__ */ jsxs(
103
- Field.Root,
104
- {
105
- name: "name",
106
- error: errors.name && formatMessage({ id: errors.name, defaultMessage: errors.name }),
107
- required: true,
108
- children: [
109
- /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
110
- id: "content-releases.modal.form.input.label.release-name",
111
- defaultMessage: "Name"
112
- }) }),
113
- /* @__PURE__ */ jsx(TextInput, { value: values.name, onChange: handleChange }),
114
- /* @__PURE__ */ jsx(Field.Error, {})
115
- ]
116
- }
117
- ),
118
- /* @__PURE__ */ jsx(Box, { width: "max-content", children: /* @__PURE__ */ jsx(
119
- Checkbox,
120
- {
121
- name: "isScheduled",
122
- checked: values.isScheduled,
123
- onCheckedChange: (checked) => {
124
- setFieldValue("isScheduled", checked);
125
- if (!checked) {
126
- setFieldValue("date", null);
127
- setFieldValue("time", "");
128
- setFieldValue("timezone", null);
129
- } else {
130
- setFieldValue("date", initialValues.date);
131
- setFieldValue("time", initialValues.time);
132
- setFieldValue(
133
- "timezone",
134
- initialValues.timezone ?? systemTimezone?.value
135
- );
136
- }
137
- },
138
- children: /* @__PURE__ */ jsx(
139
- Typography,
140
- {
141
- textColor: values.isScheduled ? "primary600" : "neutral800",
142
- fontWeight: values.isScheduled ? "semiBold" : "regular",
143
- children: formatMessage({
144
- id: "modal.form.input.label.schedule-release",
145
- defaultMessage: "Schedule release"
146
- })
147
- }
148
- )
149
- }
150
- ) }),
151
- values.isScheduled && /* @__PURE__ */ jsxs(Fragment, { children: [
152
- /* @__PURE__ */ jsxs(Flex, { gap: 4, alignItems: "start", children: [
153
- /* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsxs(
154
- Field.Root,
155
- {
156
- name: "date",
157
- error: errors.date && formatMessage({ id: errors.date, defaultMessage: errors.date }),
158
- required: true,
159
- children: [
160
- /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
161
- id: "content-releases.modal.form.input.label.date",
162
- defaultMessage: "Date"
163
- }) }),
164
- /* @__PURE__ */ jsx(
165
- DatePicker,
166
- {
167
- onChange: (date) => {
168
- const isoFormatDate = date ? formatISO(date, { representation: "date" }) : null;
169
- setFieldValue("date", isoFormatDate);
170
- },
171
- clearLabel: formatMessage({
172
- id: "content-releases.modal.form.input.clearLabel",
173
- defaultMessage: "Clear"
174
- }),
175
- onClear: () => {
176
- setFieldValue("date", null);
177
- },
178
- value: values.date ? new Date(values.date) : /* @__PURE__ */ new Date(),
179
- minDate: utcToZonedTime(/* @__PURE__ */ new Date(), values.timezone.split("&")[1])
180
- }
181
- ),
182
- /* @__PURE__ */ jsx(Field.Error, {})
183
- ]
184
- }
185
- ) }),
186
- /* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsxs(
187
- Field.Root,
188
- {
189
- name: "time",
190
- error: errors.time && formatMessage({ id: errors.time, defaultMessage: errors.time }),
191
- required: true,
192
- children: [
193
- /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
194
- id: "content-releases.modal.form.input.label.time",
195
- defaultMessage: "Time"
196
- }) }),
197
- /* @__PURE__ */ jsx(
198
- TimePicker,
199
- {
200
- onChange: (time) => {
201
- setFieldValue("time", time);
202
- },
203
- clearLabel: formatMessage({
204
- id: "content-releases.modal.form.input.clearLabel",
205
- defaultMessage: "Clear"
206
- }),
207
- onClear: () => {
208
- setFieldValue("time", "");
209
- },
210
- value: values.time || void 0
211
- }
212
- ),
213
- /* @__PURE__ */ jsx(Field.Error, {})
214
- ]
215
- }
216
- ) })
217
- ] }),
218
- /* @__PURE__ */ jsx(TimezoneComponent, { timezoneOptions: timezoneList })
219
- ] })
220
- ] }) }),
221
- /* @__PURE__ */ jsxs(Modal.Footer, { children: [
222
- /* @__PURE__ */ jsx(Modal.Close, { children: /* @__PURE__ */ jsx(Button, { variant: "tertiary", name: "cancel", children: formatMessage({ id: "cancel", defaultMessage: "Cancel" }) }) }),
223
- /* @__PURE__ */ jsx(Button, { name: "submit", loading: isLoading, type: "submit", children: formatMessage(
224
- {
225
- id: "content-releases.modal.form.button.submit",
226
- defaultMessage: "{isCreatingRelease, select, true {Continue} other {Save}}"
227
- },
228
- { isCreatingRelease }
229
- ) })
230
- ] })
231
- ] });
232
- }
233
- }
234
- )
235
- ] }) });
236
- };
237
- const TimezoneComponent = ({ timezoneOptions }) => {
238
- const { values, errors, setFieldValue } = useFormikContext();
239
- const { formatMessage } = useIntl();
240
- const [timezoneList, setTimezoneList] = React.useState(timezoneOptions);
241
- React.useEffect(() => {
242
- if (values.date) {
243
- const { timezoneList: timezoneList2 } = getTimezones(new Date(values.date));
244
- setTimezoneList(timezoneList2);
245
- const updatedTimezone = values.timezone && timezoneList2.find((tz) => tz.value.split("&")[1] === values.timezone.split("&")[1]);
246
- if (updatedTimezone) {
247
- setFieldValue("timezone", updatedTimezone.value);
248
- }
249
- }
250
- }, [setFieldValue, values.date, values.timezone]);
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
- };
285
- const useTypedDispatch = useDispatch;
286
- const isBaseQueryError = (error) => {
287
- return typeof error !== "undefined" && error.name !== void 0;
288
- };
289
- const LinkCard = styled(Link)`
290
- display: block;
291
- `;
292
- const RelativeTime = styled(RelativeTime$1)`
293
- display: inline-block;
294
- &::first-letter {
295
- text-transform: uppercase;
296
- }
297
- `;
298
- const getBadgeProps = (status) => {
299
- let color;
300
- switch (status) {
301
- case "ready":
302
- color = "success";
303
- break;
304
- case "blocked":
305
- color = "warning";
306
- break;
307
- case "failed":
308
- color = "danger";
309
- break;
310
- case "done":
311
- color = "primary";
312
- break;
313
- case "empty":
314
- default:
315
- color = "neutral";
316
- }
317
- return {
318
- textColor: `${color}600`,
319
- backgroundColor: `${color}100`,
320
- borderColor: `${color}200`
321
- };
322
- };
323
- const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
324
- const { formatMessage } = useIntl();
325
- if (isError) {
326
- return /* @__PURE__ */ jsx(Page.Error, {});
327
- }
328
- if (releases?.length === 0) {
329
- return /* @__PURE__ */ jsx(
330
- EmptyStateLayout,
331
- {
332
- content: formatMessage(
333
- {
334
- id: "content-releases.page.Releases.tab.emptyEntries",
335
- defaultMessage: "No releases"
336
- },
337
- {
338
- target: sectionTitle
339
- }
340
- ),
341
- icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "16rem" })
342
- }
343
- );
344
- }
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
- Flex,
347
- {
348
- direction: "column",
349
- justifyContent: "space-between",
350
- padding: 4,
351
- hasRadius: true,
352
- background: "neutral0",
353
- shadow: "tableShadow",
354
- height: "100%",
355
- width: "100%",
356
- alignItems: "start",
357
- gap: 4,
358
- children: [
359
- /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "start", gap: 1, children: [
360
- /* @__PURE__ */ jsx(Typography, { textColor: "neutral800", tag: "h3", variant: "delta", fontWeight: "bold", children: name }),
361
- /* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: scheduledAt ? /* @__PURE__ */ jsx(RelativeTime, { timestamp: new Date(scheduledAt) }) : formatMessage({
362
- id: "content-releases.pages.Releases.not-scheduled",
363
- defaultMessage: "Not scheduled"
364
- }) })
365
- ] }),
366
- /* @__PURE__ */ jsx(Badge, { ...getBadgeProps(status), children: status })
367
- ]
368
- }
369
- ) }) }, id)) });
370
- };
371
- const StyledAlert = styled(Alert)`
372
- button {
373
- display: none;
374
- }
375
- p + div {
376
- margin-left: auto;
377
- }
378
- `;
379
- const INITIAL_FORM_VALUES = {
380
- name: "",
381
- date: format(/* @__PURE__ */ new Date(), "yyyy-MM-dd"),
382
- time: "",
383
- isScheduled: true,
384
- scheduledAt: null,
385
- timezone: null
386
- };
387
- const ReleasesPage = () => {
388
- const location = useLocation();
389
- const [releaseModalShown, setReleaseModalShown] = React.useState(false);
390
- const { toggleNotification } = useNotification();
391
- const { formatMessage } = useIntl();
392
- const navigate = useNavigate();
393
- const { formatAPIError } = useAPIErrorHandler();
394
- const [{ query }, setQuery] = useQueryParams();
395
- const response = useGetReleasesQuery(query);
396
- const { data, isLoading: isLoadingSettings } = useGetReleaseSettingsQuery();
397
- const [createRelease, { isLoading: isSubmittingForm }] = useCreateReleaseMutation();
398
- const { getFeature } = useLicenseLimits();
399
- const { maximumReleases = 3 } = getFeature("cms-content-releases");
400
- const { trackUsage } = useTracking();
401
- const {
402
- allowedActions: { canCreate }
403
- } = useRBAC(PERMISSIONS);
404
- const { isLoading: isLoadingReleases, isSuccess, isError } = response;
405
- const activeTab = response?.currentData?.meta?.activeTab || "pending";
406
- React.useEffect(() => {
407
- if (location?.state?.errors) {
408
- toggleNotification({
409
- type: "danger",
410
- title: formatMessage({
411
- id: "content-releases.pages.Releases.notification.error.title",
412
- defaultMessage: "Your request could not be processed."
413
- }),
414
- message: formatMessage({
415
- id: "content-releases.pages.Releases.notification.error.message",
416
- defaultMessage: "Please try again or open another release."
417
- })
418
- });
419
- navigate("", { replace: true, state: null });
420
- }
421
- }, [formatMessage, location?.state?.errors, navigate, toggleNotification]);
422
- const toggleAddReleaseModal = () => {
423
- setReleaseModalShown((prev) => !prev);
424
- };
425
- if (isLoadingReleases || isLoadingSettings) {
426
- return /* @__PURE__ */ jsx(Page.Loading, {});
427
- }
428
- const totalPendingReleases = isSuccess && response.currentData?.meta?.pendingReleasesCount || 0;
429
- const hasReachedMaximumPendingReleases = totalPendingReleases >= maximumReleases;
430
- const handleTabChange = (tabValue) => {
431
- setQuery({
432
- ...query,
433
- page: 1,
434
- pageSize: response?.currentData?.meta?.pagination?.pageSize || 16,
435
- filters: {
436
- releasedAt: {
437
- $notNull: tabValue !== "pending"
438
- }
439
- }
440
- });
441
- };
442
- const handleAddRelease = async ({ name, scheduledAt, timezone }) => {
443
- const response2 = await createRelease({
444
- name,
445
- scheduledAt,
446
- timezone
447
- });
448
- if ("data" in response2) {
449
- toggleNotification({
450
- type: "success",
451
- message: formatMessage({
452
- id: "content-releases.modal.release-created-notification-success",
453
- defaultMessage: "Release created."
454
- })
455
- });
456
- trackUsage("didCreateRelease");
457
- navigate(response2.data.data.id.toString());
458
- } else if (isFetchError(response2.error)) {
459
- toggleNotification({
460
- type: "danger",
461
- message: formatAPIError(response2.error)
462
- });
463
- } else {
464
- toggleNotification({
465
- type: "danger",
466
- message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
467
- });
468
- }
469
- };
470
- return /* @__PURE__ */ jsxs(Main, { "aria-busy": isLoadingReleases || isLoadingSettings, children: [
471
- /* @__PURE__ */ jsx(
472
- Layouts.Header,
473
- {
474
- title: formatMessage({
475
- id: "content-releases.pages.Releases.title",
476
- defaultMessage: "Releases"
477
- }),
478
- subtitle: formatMessage({
479
- id: "content-releases.pages.Releases.header-subtitle",
480
- defaultMessage: "Create and manage content updates"
481
- }),
482
- primaryAction: canCreate ? /* @__PURE__ */ jsx(
483
- Button,
484
- {
485
- startIcon: /* @__PURE__ */ jsx(Plus, {}),
486
- onClick: toggleAddReleaseModal,
487
- disabled: hasReachedMaximumPendingReleases,
488
- children: formatMessage({
489
- id: "content-releases.header.actions.add-release",
490
- defaultMessage: "New release"
491
- })
492
- }
493
- ) : null
494
- }
495
- ),
496
- /* @__PURE__ */ jsx(Layouts.Content, { children: /* @__PURE__ */ jsxs(Fragment, { children: [
497
- hasReachedMaximumPendingReleases && /* @__PURE__ */ jsx(
498
- StyledAlert,
499
- {
500
- marginBottom: 6,
501
- action: /* @__PURE__ */ jsx(Link, { href: "https://strapi.io/pricing-cloud", isExternal: true, children: formatMessage({
502
- id: "content-releases.pages.Releases.max-limit-reached.action",
503
- defaultMessage: "Explore plans"
504
- }) }),
505
- title: formatMessage(
506
- {
507
- id: "content-releases.pages.Releases.max-limit-reached.title",
508
- defaultMessage: "You have reached the {number} pending {number, plural, one {release} other {releases}} limit."
509
- },
510
- { number: maximumReleases }
511
- ),
512
- onClose: () => {
513
- },
514
- closeLabel: "",
515
- children: formatMessage({
516
- id: "content-releases.pages.Releases.max-limit-reached.message",
517
- defaultMessage: "Upgrade to manage an unlimited number of releases."
518
- })
519
- }
520
- ),
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(
532
- {
533
- id: "content-releases.pages.Releases.tab.pending",
534
- defaultMessage: "Pending ({count})"
535
- },
536
- {
537
- count: totalPendingReleases
538
- }
539
- ) }),
540
- /* @__PURE__ */ jsx(Tabs.Trigger, { value: "done", children: formatMessage({
541
- id: "content-releases.pages.Releases.tab.done",
542
- defaultMessage: "Done"
543
- }) })
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
- ] }),
566
- /* @__PURE__ */ jsxs(
567
- Pagination.Root,
568
- {
569
- ...response?.currentData?.meta?.pagination,
570
- defaultPageSize: response?.currentData?.meta?.pagination?.pageSize,
571
- children: [
572
- /* @__PURE__ */ jsx(Pagination.PageSize, { options: ["8", "16", "32", "64"] }),
573
- /* @__PURE__ */ jsx(Pagination.Links, {})
574
- ]
575
- }
576
- )
577
- ] }) }),
578
- /* @__PURE__ */ jsx(
579
- ReleaseModal,
580
- {
581
- open: releaseModalShown,
582
- handleClose: toggleAddReleaseModal,
583
- handleSubmit: handleAddRelease,
584
- isLoading: isSubmittingForm,
585
- initialValues: {
586
- ...INITIAL_FORM_VALUES,
587
- timezone: data?.data.defaultTimezone ? data.data.defaultTimezone.split("&")[1] : null
588
- }
589
- }
590
- )
591
- ] });
592
- };
593
- const ReleaseInfoWrapper = styled(Flex)`
594
- align-self: stretch;
595
- border-bottom-right-radius: ${({ theme }) => theme.borderRadius};
596
- border-bottom-left-radius: ${({ theme }) => theme.borderRadius};
597
- border-top: 1px solid ${({ theme }) => theme.colors.neutral150};
598
- `;
599
- const StyledMenuItem = styled(MenuItem)`
600
- svg path {
601
- fill: ${({ theme, disabled }) => disabled && theme.colors.neutral500};
602
- }
603
- span {
604
- color: ${({ theme, disabled }) => disabled && theme.colors.neutral500};
605
- }
606
-
607
- &:hover {
608
- background: ${({ theme, $variant = "neutral" }) => theme.colors[`${$variant}100`]};
609
- }
610
- `;
611
- const PencilIcon = styled(Pencil)`
612
- width: ${({ theme }) => theme.spaces[3]};
613
- height: ${({ theme }) => theme.spaces[3]};
614
- path {
615
- fill: ${({ theme }) => theme.colors.neutral600};
616
- }
617
- `;
618
- const TrashIcon = styled(Trash)`
619
- width: ${({ theme }) => theme.spaces[3]};
620
- height: ${({ theme }) => theme.spaces[3]};
621
- path {
622
- fill: ${({ theme }) => theme.colors.danger600};
623
- }
624
- `;
625
- const TypographyMaxWidth = styled(Typography)`
626
- max-width: 300px;
627
- `;
628
- const EntryValidationText = ({ action, schema, entry, status }) => {
629
- const { formatMessage } = useIntl();
630
- const { validate, isLoading } = unstable_useDocument(
631
- {
632
- collectionType: schema?.kind ?? "",
633
- model: schema?.uid ?? ""
634
- },
635
- {
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
638
- }
639
- );
640
- if (isLoading) {
641
- return null;
642
- }
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
- }
694
- }
695
- return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
696
- /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
697
- !entry.publishedAt ? /* @__PURE__ */ jsx(Typography, { textColor: "success600", fontWeight: "bold", children: formatMessage({
698
- id: "content-releases.pages.ReleaseDetails.entry-validation.already-unpublished",
699
- defaultMessage: "Already unpublished"
700
- }) }) : /* @__PURE__ */ jsx(Typography, { children: formatMessage({
701
- id: "content-releases.pages.ReleaseDetails.entry-validation.ready-to-unpublish",
702
- defaultMessage: "Ready to unpublish"
703
- }) })
704
- ] });
705
- };
706
- const ReleaseDetailsLayout = ({
707
- toggleEditReleaseModal,
708
- toggleWarningSubmit,
709
- children
710
- }) => {
711
- const { formatMessage, formatDate, formatTime } = useIntl();
712
- const { releaseId } = useParams();
713
- const {
714
- data,
715
- isLoading: isLoadingDetails,
716
- error
717
- } = useGetReleaseQuery(
718
- { id: releaseId },
719
- {
720
- skip: !releaseId
721
- }
722
- );
723
- const [publishRelease, { isLoading: isPublishing }] = usePublishReleaseMutation();
724
- const { toggleNotification } = useNotification();
725
- const { formatAPIError } = useAPIErrorHandler();
726
- const { allowedActions } = useRBAC(PERMISSIONS);
727
- const { canUpdate, canDelete, canPublish } = allowedActions;
728
- const dispatch = useTypedDispatch();
729
- const { trackUsage } = useTracking();
730
- const release = data?.data;
731
- const handlePublishRelease = (id) => async () => {
732
- const response = await publishRelease({ id });
733
- if ("data" in response) {
734
- toggleNotification({
735
- type: "success",
736
- message: formatMessage({
737
- id: "content-releases.pages.ReleaseDetails.publish-notification-success",
738
- defaultMessage: "Release was published successfully."
739
- })
740
- });
741
- const { totalEntries: totalEntries2, totalPublishedEntries, totalUnpublishedEntries } = response.data.meta;
742
- trackUsage("didPublishRelease", {
743
- totalEntries: totalEntries2,
744
- totalPublishedEntries,
745
- totalUnpublishedEntries
746
- });
747
- } else if (isFetchError(response.error)) {
748
- toggleNotification({
749
- type: "danger",
750
- message: formatAPIError(response.error)
751
- });
752
- } else {
753
- toggleNotification({
754
- type: "danger",
755
- message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
756
- });
757
- }
758
- };
759
- const handleRefresh = () => {
760
- dispatch(
761
- releaseApi.util.invalidateTags([
762
- { type: "ReleaseAction", id: "LIST" },
763
- { type: "Release", id: releaseId }
764
- ])
765
- );
766
- };
767
- const getCreatedByUser = () => {
768
- if (!release?.createdBy) {
769
- return null;
770
- }
771
- if (release.createdBy.username) {
772
- return release.createdBy.username;
773
- }
774
- if (release.createdBy.firstname) {
775
- return `${release.createdBy.firstname} ${release.createdBy.lastname || ""}`.trim();
776
- }
777
- return release.createdBy.email;
778
- };
779
- if (isLoadingDetails) {
780
- return /* @__PURE__ */ jsx(Page.Loading, {});
781
- }
782
- if (isBaseQueryError(error) && "code" in error || !release) {
783
- return /* @__PURE__ */ jsx(
784
- Navigate,
785
- {
786
- to: "..",
787
- state: {
788
- errors: [
789
- {
790
- // @ts-expect-error – TODO: fix this weird error flow
791
- code: error?.code
792
- }
793
- ]
794
- }
795
- }
796
- );
797
- }
798
- const totalEntries = release.actions.meta.count || 0;
799
- const hasCreatedByUser = Boolean(getCreatedByUser());
800
- const isScheduled = release.scheduledAt && release.timezone;
801
- const numberOfEntriesText = formatMessage(
802
- {
803
- id: "content-releases.pages.Details.header-subtitle",
804
- defaultMessage: "{number, plural, =0 {No entries} one {# entry} other {# entries}}"
805
- },
806
- { number: totalEntries }
807
- );
808
- const scheduledText = isScheduled ? formatMessage(
809
- {
810
- id: "content-releases.pages.ReleaseDetails.header-subtitle.scheduled",
811
- defaultMessage: "Scheduled for {date} at {time} ({offset})"
812
- },
813
- {
814
- date: formatDate(new Date(release.scheduledAt), {
815
- weekday: "long",
816
- day: "numeric",
817
- month: "long",
818
- year: "numeric",
819
- timeZone: release.timezone
820
- }),
821
- time: formatTime(new Date(release.scheduledAt), {
822
- timeZone: release.timezone,
823
- hourCycle: "h23"
824
- }),
825
- offset: getTimezoneOffset(release.timezone, new Date(release.scheduledAt))
826
- }
827
- ) : "";
828
- return /* @__PURE__ */ jsxs(Main, { "aria-busy": isLoadingDetails, children: [
829
- /* @__PURE__ */ jsx(
830
- Layouts.Header,
831
- {
832
- title: release.name,
833
- subtitle: /* @__PURE__ */ jsxs(Flex, { gap: 2, lineHeight: 6, children: [
834
- /* @__PURE__ */ jsx(Typography, { textColor: "neutral600", variant: "epsilon", children: numberOfEntriesText + (isScheduled ? ` - ${scheduledText}` : "") }),
835
- /* @__PURE__ */ jsx(Badge, { ...getBadgeProps(release.status), children: release.status })
836
- ] }),
837
- navigationAction: /* @__PURE__ */ jsx(BackButton, {}),
838
- primaryAction: !release.releasedAt && /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
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"
871
- }) })
872
- ] })
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
- ),
904
- /* @__PURE__ */ jsx(Button, { size: "S", variant: "tertiary", onClick: handleRefresh, children: formatMessage({
905
- id: "content-releases.header.actions.refresh",
906
- defaultMessage: "Refresh"
907
- }) }),
908
- canPublish ? /* @__PURE__ */ jsx(
909
- Button,
910
- {
911
- size: "S",
912
- variant: "default",
913
- onClick: handlePublishRelease(release.id.toString()),
914
- loading: isPublishing,
915
- disabled: release.actions.meta.count === 0,
916
- children: formatMessage({
917
- id: "content-releases.header.actions.publish",
918
- defaultMessage: "Publish"
919
- })
920
- }
921
- ) : null
922
- ] })
923
- }
924
- ),
925
- children
926
- ] });
927
- };
928
- const SimpleMenuButton = styled(SimpleMenu)`
929
- & > span {
930
- display: flex;
931
- }
932
- `;
933
- const GROUP_BY_OPTIONS = ["contentType", "locale", "action"];
934
- const GROUP_BY_OPTIONS_NO_LOCALE = ["contentType", "action"];
935
- const getGroupByOptionLabel = (value) => {
936
- if (value === "locale") {
937
- return {
938
- id: "content-releases.pages.ReleaseDetails.groupBy.option.locales",
939
- defaultMessage: "Locales"
940
- };
941
- }
942
- if (value === "action") {
943
- return {
944
- id: "content-releases.pages.ReleaseDetails.groupBy.option.actions",
945
- defaultMessage: "Actions"
946
- };
947
- }
948
- return {
949
- id: "content-releases.pages.ReleaseDetails.groupBy.option.content-type",
950
- defaultMessage: "Content-Types"
951
- };
952
- };
953
- const ReleaseDetailsBody = ({ releaseId }) => {
954
- const { formatMessage } = useIntl();
955
- const [{ query }, setQuery] = useQueryParams();
956
- const { toggleNotification } = useNotification();
957
- const { formatAPIError } = useAPIErrorHandler();
958
- const {
959
- data: releaseData,
960
- isLoading: isReleaseLoading,
961
- error: releaseError
962
- } = useGetReleaseQuery({ id: releaseId });
963
- const {
964
- allowedActions: { canUpdate }
965
- } = useRBAC(PERMISSIONS);
966
- const runHookWaterfall = useStrapiApp("ReleaseDetailsPage", (state) => state.runHookWaterfall);
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
- });
979
- const release = releaseData?.data;
980
- const selectedGroupBy = query?.groupBy || "contentType";
981
- const {
982
- isLoading,
983
- isFetching,
984
- isError,
985
- data,
986
- error: releaseActionsError
987
- } = useGetReleaseActionsQuery({
988
- ...query,
989
- releaseId
990
- });
991
- const [updateReleaseAction] = useUpdateReleaseActionMutation();
992
- const handleChangeType = async (e, actionId, actionPath) => {
993
- const response = await updateReleaseAction({
994
- params: {
995
- releaseId,
996
- actionId
997
- },
998
- body: {
999
- type: e.target.value
1000
- },
1001
- query,
1002
- // We are passing the query params to make optimistic updates
1003
- actionPath
1004
- // We are passing the action path to found the position in the cache of the action for optimistic updates
1005
- });
1006
- if ("error" in response) {
1007
- if (isFetchError(response.error)) {
1008
- toggleNotification({
1009
- type: "danger",
1010
- message: formatAPIError(response.error)
1011
- });
1012
- } else {
1013
- toggleNotification({
1014
- type: "danger",
1015
- message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
1016
- });
1017
- }
1018
- }
1019
- };
1020
- if (isLoading || isReleaseLoading) {
1021
- return /* @__PURE__ */ jsx(Page.Loading, {});
1022
- }
1023
- const releaseActions = data?.data;
1024
- const releaseMeta = data?.meta;
1025
- const contentTypes = releaseMeta?.contentTypes || {};
1026
- const components = releaseMeta?.components || {};
1027
- if (isBaseQueryError(releaseError) || !release) {
1028
- const errorsArray = [];
1029
- if (releaseError && "code" in releaseError) {
1030
- errorsArray.push({
1031
- code: releaseError.code
1032
- });
1033
- }
1034
- if (releaseActionsError && "code" in releaseActionsError) {
1035
- errorsArray.push({
1036
- code: releaseActionsError.code
1037
- });
1038
- }
1039
- return /* @__PURE__ */ jsx(
1040
- Navigate,
1041
- {
1042
- to: "..",
1043
- state: {
1044
- errors: errorsArray
1045
- }
1046
- }
1047
- );
1048
- }
1049
- if (isError || !releaseActions) {
1050
- return /* @__PURE__ */ jsx(Page.Error, {});
1051
- }
1052
- if (Object.keys(releaseActions).length === 0) {
1053
- return /* @__PURE__ */ jsx(Layouts.Content, { children: /* @__PURE__ */ jsx(
1054
- EmptyStateLayout,
1055
- {
1056
- action: /* @__PURE__ */ jsx(
1057
- LinkButton,
1058
- {
1059
- tag: Link$1,
1060
- to: {
1061
- pathname: "/content-manager"
1062
- },
1063
- style: { textDecoration: "none" },
1064
- variant: "secondary",
1065
- children: formatMessage({
1066
- id: "content-releases.page.Details.button.openContentManager",
1067
- defaultMessage: "Open the Content Manager"
1068
- })
1069
- }
1070
- ),
1071
- icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "16rem" }),
1072
- content: formatMessage({
1073
- id: "content-releases.pages.Details.tab.emptyEntries",
1074
- defaultMessage: "This release is empty. Open the Content Manager, select an entry and add it to the release."
1075
- })
1076
- }
1077
- ) });
1078
- }
1079
- const groupByLabel = formatMessage({
1080
- id: "content-releases.pages.ReleaseDetails.groupBy.aria-label",
1081
- defaultMessage: "Group by"
1082
- });
1083
- const headers = [
1084
- ...displayedHeaders,
1085
- {
1086
- label: {
1087
- id: "content-releases.page.ReleaseDetails.table.header.label.content-type",
1088
- defaultMessage: "content-type"
1089
- },
1090
- name: "content-type"
1091
- },
1092
- {
1093
- label: {
1094
- id: "content-releases.page.ReleaseDetails.table.header.label.action",
1095
- defaultMessage: "action"
1096
- },
1097
- name: "action"
1098
- },
1099
- ...!release.releasedAt ? [
1100
- {
1101
- label: {
1102
- id: "content-releases.page.ReleaseDetails.table.header.label.status",
1103
- defaultMessage: "status"
1104
- },
1105
- name: "status"
1106
- }
1107
- ] : []
1108
- ];
1109
- const options = hasI18nEnabled ? GROUP_BY_OPTIONS : GROUP_BY_OPTIONS_NO_LOCALE;
1110
- return /* @__PURE__ */ jsx(Layouts.Content, { children: /* @__PURE__ */ jsxs(Flex, { gap: 8, direction: "column", alignItems: "stretch", children: [
1111
- /* @__PURE__ */ jsx(Flex, { children: /* @__PURE__ */ jsx(
1112
- SingleSelect,
1113
- {
1114
- placeholder: groupByLabel,
1115
- "aria-label": groupByLabel,
1116
- customizeContent: (value) => formatMessage(
1117
- {
1118
- id: `content-releases.pages.ReleaseDetails.groupBy.label`,
1119
- defaultMessage: `Group by {groupBy}`
1120
- },
1121
- {
1122
- groupBy: value
1123
- }
1124
- ),
1125
- value: formatMessage(getGroupByOptionLabel(selectedGroupBy)),
1126
- onChange: (value) => setQuery({ groupBy: value }),
1127
- children: options.map((option) => /* @__PURE__ */ jsx(SingleSelectOption, { value: option, children: formatMessage(getGroupByOptionLabel(option)) }, option))
1128
- }
1129
- ) }),
1130
- Object.keys(releaseActions).map((key) => /* @__PURE__ */ jsxs(Flex, { gap: 4, direction: "column", alignItems: "stretch", children: [
1131
- /* @__PURE__ */ jsx(Flex, { role: "separator", "aria-label": key, children: /* @__PURE__ */ jsx(Badge, { children: key }) }),
1132
- /* @__PURE__ */ jsx(
1133
- Table.Root,
1134
- {
1135
- rows: releaseActions[key].map((item) => ({
1136
- ...item,
1137
- id: Number(item.entry.id)
1138
- })),
1139
- headers,
1140
- isLoading: isLoading || isFetching,
1141
- children: /* @__PURE__ */ jsxs(Table.Content, { children: [
1142
- /* @__PURE__ */ jsx(Table.Head, { children: headers.map(({ label, name }) => /* @__PURE__ */ jsx(Table.HeaderCell, { label: formatMessage(label), name }, name)) }),
1143
- /* @__PURE__ */ jsx(Table.Loading, {}),
1144
- /* @__PURE__ */ jsx(Table.Body, { children: releaseActions[key].map(
1145
- ({ id, contentType, locale, type, entry, status }, actionIndex) => /* @__PURE__ */ jsxs(Tr, { children: [
1146
- /* @__PURE__ */ jsx(Td, { width: "25%", maxWidth: "200px", children: /* @__PURE__ */ jsx(Typography, { ellipsis: true, children: `${contentType.mainFieldValue || entry.id}` }) }),
1147
- hasI18nEnabled && /* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: `${locale?.name ? locale.name : "-"}` }) }),
1148
- /* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: contentType.displayName || "" }) }),
1149
- /* @__PURE__ */ jsx(Td, { width: "20%", children: release.releasedAt ? /* @__PURE__ */ jsx(Typography, { children: formatMessage(
1150
- {
1151
- id: "content-releases.page.ReleaseDetails.table.action-published",
1152
- defaultMessage: "This entry was <b>{isPublish, select, true {published} other {unpublished}}</b>."
1153
- },
1154
- {
1155
- isPublish: type === "publish",
1156
- b: (children) => /* @__PURE__ */ jsx(Typography, { fontWeight: "bold", children })
1157
- }
1158
- ) }) : /* @__PURE__ */ jsx(
1159
- ReleaseActionOptions,
1160
- {
1161
- selected: type,
1162
- handleChange: (e) => handleChangeType(e, id, [key, actionIndex]),
1163
- name: `release-action-${id}-type`,
1164
- disabled: !canUpdate
1165
- }
1166
- ) }),
1167
- !release.releasedAt && /* @__PURE__ */ jsxs(Fragment, { children: [
1168
- /* @__PURE__ */ jsx(Td, { width: "20%", minWidth: "200px", children: /* @__PURE__ */ jsx(
1169
- EntryValidationText,
1170
- {
1171
- action: type,
1172
- schema: contentTypes?.[contentType.uid],
1173
- components,
1174
- entry,
1175
- status
1176
- }
1177
- ) }),
1178
- /* @__PURE__ */ jsx(Td, { children: /* @__PURE__ */ jsx(Flex, { justifyContent: "flex-end", children: /* @__PURE__ */ jsxs(ReleaseActionMenu.Root, { children: [
1179
- /* @__PURE__ */ jsx(
1180
- ReleaseActionMenu.ReleaseActionEntryLinkItem,
1181
- {
1182
- contentTypeUid: contentType.uid,
1183
- documentId: entry.documentId,
1184
- locale: locale?.code
1185
- }
1186
- ),
1187
- /* @__PURE__ */ jsx(
1188
- ReleaseActionMenu.DeleteReleaseActionItem,
1189
- {
1190
- releaseId: release.id,
1191
- actionId: id
1192
- }
1193
- )
1194
- ] }) }) })
1195
- ] })
1196
- ] }, id)
1197
- ) })
1198
- ] })
1199
- }
1200
- )
1201
- ] }, `releases-group-${key}`)),
1202
- /* @__PURE__ */ jsxs(
1203
- Pagination.Root,
1204
- {
1205
- ...releaseMeta?.pagination,
1206
- defaultPageSize: releaseMeta?.pagination?.pageSize,
1207
- children: [
1208
- /* @__PURE__ */ jsx(Pagination.PageSize, {}),
1209
- /* @__PURE__ */ jsx(Pagination.Links, {})
1210
- ]
1211
- }
1212
- )
1213
- ] }) });
1214
- };
1215
- const ReleaseDetailsPage = () => {
1216
- const { formatMessage } = useIntl();
1217
- const { releaseId } = useParams();
1218
- const { toggleNotification } = useNotification();
1219
- const { formatAPIError } = useAPIErrorHandler();
1220
- const navigate = useNavigate();
1221
- const [releaseModalShown, setReleaseModalShown] = React.useState(false);
1222
- const [showWarningSubmit, setWarningSubmit] = React.useState(false);
1223
- const {
1224
- isLoading: isLoadingDetails,
1225
- data,
1226
- isSuccess: isSuccessDetails
1227
- } = useGetReleaseQuery(
1228
- { id: releaseId },
1229
- {
1230
- skip: !releaseId
1231
- }
1232
- );
1233
- const { data: dataTimezone, isLoading: isLoadingTimezone } = useGetReleaseSettingsQuery();
1234
- const [updateRelease, { isLoading: isSubmittingForm }] = useUpdateReleaseMutation();
1235
- const [deleteRelease] = useDeleteReleaseMutation();
1236
- const toggleEditReleaseModal = () => {
1237
- setReleaseModalShown((prev) => !prev);
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
- };
1249
- const toggleWarningSubmit = () => setWarningSubmit((prevState) => !prevState);
1250
- if (isLoadingDetails || isLoadingTimezone) {
1251
- return /* @__PURE__ */ jsx(
1252
- ReleaseDetailsLayout,
1253
- {
1254
- toggleEditReleaseModal,
1255
- toggleWarningSubmit,
1256
- children: /* @__PURE__ */ jsx(Page.Loading, {})
1257
- }
1258
- );
1259
- }
1260
- if (!releaseId) {
1261
- return /* @__PURE__ */ jsx(Navigate, { to: ".." });
1262
- }
1263
- const releaseData = isSuccessDetails && data?.data || null;
1264
- const title = releaseData?.name || "";
1265
- const timezone = getTimezoneValue();
1266
- const scheduledAt = releaseData?.scheduledAt && timezone ? utcToZonedTime(releaseData.scheduledAt, timezone) : null;
1267
- const date = scheduledAt ? format$1(scheduledAt, "yyyy-MM-dd") : void 0;
1268
- const time = scheduledAt ? format$1(scheduledAt, "HH:mm") : "";
1269
- const handleEditRelease = async (values) => {
1270
- const response = await updateRelease({
1271
- id: releaseId,
1272
- name: values.name,
1273
- scheduledAt: values.scheduledAt,
1274
- timezone: values.timezone
1275
- });
1276
- if ("data" in response) {
1277
- toggleNotification({
1278
- type: "success",
1279
- message: formatMessage({
1280
- id: "content-releases.modal.release-updated-notification-success",
1281
- defaultMessage: "Release updated."
1282
- })
1283
- });
1284
- toggleEditReleaseModal();
1285
- } else if (isFetchError(response.error)) {
1286
- toggleNotification({
1287
- type: "danger",
1288
- message: formatAPIError(response.error)
1289
- });
1290
- } else {
1291
- toggleNotification({
1292
- type: "danger",
1293
- message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
1294
- });
1295
- }
1296
- };
1297
- const handleDeleteRelease = async () => {
1298
- const response = await deleteRelease({
1299
- id: releaseId
1300
- });
1301
- if ("data" in response) {
1302
- navigate("..");
1303
- } else if (isFetchError(response.error)) {
1304
- toggleNotification({
1305
- type: "danger",
1306
- message: formatAPIError(response.error)
1307
- });
1308
- } else {
1309
- toggleNotification({
1310
- type: "danger",
1311
- message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
1312
- });
1313
- }
1314
- };
1315
- return /* @__PURE__ */ jsxs(
1316
- ReleaseDetailsLayout,
1317
- {
1318
- toggleEditReleaseModal,
1319
- toggleWarningSubmit,
1320
- children: [
1321
- /* @__PURE__ */ jsx(ReleaseDetailsBody, { releaseId }),
1322
- /* @__PURE__ */ jsx(
1323
- ReleaseModal,
1324
- {
1325
- open: releaseModalShown,
1326
- handleClose: toggleEditReleaseModal,
1327
- handleSubmit: handleEditRelease,
1328
- isLoading: isLoadingDetails || isSubmittingForm,
1329
- initialValues: {
1330
- name: title || "",
1331
- scheduledAt,
1332
- date,
1333
- time,
1334
- isScheduled: Boolean(scheduledAt),
1335
- timezone
1336
- }
1337
- }
1338
- ),
1339
- /* @__PURE__ */ jsx(Dialog.Root, { open: showWarningSubmit, onOpenChange: toggleWarningSubmit, children: /* @__PURE__ */ jsx(ConfirmDialog, { onConfirm: handleDeleteRelease, children: formatMessage({
1340
- id: "content-releases.dialog.confirmation-message",
1341
- defaultMessage: "Are you sure you want to delete this release?"
1342
- }) }) })
1343
- ]
1344
- }
1345
- );
1346
- };
1347
- const App = () => {
1348
- return /* @__PURE__ */ jsx(Page.Protect, { permissions: PERMISSIONS.main, children: /* @__PURE__ */ jsxs(Routes, { children: [
1349
- /* @__PURE__ */ jsx(Route, { index: true, element: /* @__PURE__ */ jsx(ReleasesPage, {}) }),
1350
- /* @__PURE__ */ jsx(Route, { path: ":releaseId", element: /* @__PURE__ */ jsx(ReleaseDetailsPage, {}) })
1351
- ] }) });
1352
- };
1353
- export {
1354
- App
1355
- };
1356
- //# sourceMappingURL=App-DMILern_.mjs.map