@strapi/content-releases 0.0.0-experimental.fdacf4285d1cada9d94ab4dcd756c5362cba1b54 → 0.0.0-experimental.fecf677921383be55c6ab62960f7a6ff1f1a2d5e

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 (322) hide show
  1. package/dist/admin/assets/purchase-page-illustration-dark.jpg.js +6 -0
  2. package/dist/admin/assets/purchase-page-illustration-dark.jpg.js.map +1 -0
  3. package/dist/admin/assets/purchase-page-illustration-dark.jpg.mjs +4 -0
  4. package/dist/admin/assets/purchase-page-illustration-dark.jpg.mjs.map +1 -0
  5. package/dist/admin/assets/purchase-page-illustration-light.jpg.js +6 -0
  6. package/dist/admin/assets/purchase-page-illustration-light.jpg.js.map +1 -0
  7. package/dist/admin/assets/purchase-page-illustration-light.jpg.mjs +4 -0
  8. package/dist/admin/assets/purchase-page-illustration-light.jpg.mjs.map +1 -0
  9. package/dist/admin/components/EntryValidationPopover.js +310 -0
  10. package/dist/admin/components/EntryValidationPopover.js.map +1 -0
  11. package/dist/admin/components/EntryValidationPopover.mjs +308 -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 +203 -0
  18. package/dist/admin/components/ReleaseAction.js.map +1 -0
  19. package/dist/admin/components/ReleaseAction.mjs +201 -0
  20. package/dist/admin/components/ReleaseAction.mjs.map +1 -0
  21. package/dist/admin/components/ReleaseActionMenu.js +194 -0
  22. package/dist/admin/components/ReleaseActionMenu.js.map +1 -0
  23. package/dist/admin/components/ReleaseActionMenu.mjs +173 -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 +331 -0
  38. package/dist/admin/components/ReleaseModal.js.map +1 -0
  39. package/dist/admin/components/ReleaseModal.mjs +310 -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/components/Widgets.js +122 -0
  46. package/dist/admin/components/Widgets.js.map +1 -0
  47. package/dist/admin/components/Widgets.mjs +120 -0
  48. package/dist/admin/components/Widgets.mjs.map +1 -0
  49. package/dist/admin/constants.js +79 -0
  50. package/dist/admin/constants.js.map +1 -0
  51. package/dist/admin/constants.mjs +76 -0
  52. package/dist/admin/constants.mjs.map +1 -0
  53. package/dist/admin/index.js +148 -4
  54. package/dist/admin/index.js.map +1 -1
  55. package/dist/admin/index.mjs +143 -4
  56. package/dist/admin/index.mjs.map +1 -1
  57. package/dist/admin/modules/hooks.js +8 -0
  58. package/dist/admin/modules/hooks.js.map +1 -0
  59. package/dist/admin/modules/hooks.mjs +6 -0
  60. package/dist/admin/modules/hooks.mjs.map +1 -0
  61. package/dist/admin/pages/App.js +29 -0
  62. package/dist/admin/pages/App.js.map +1 -0
  63. package/dist/admin/pages/App.mjs +27 -0
  64. package/dist/admin/pages/App.mjs.map +1 -0
  65. package/dist/admin/pages/PurchaseContentReleases.js +192 -0
  66. package/dist/admin/pages/PurchaseContentReleases.js.map +1 -0
  67. package/dist/admin/pages/PurchaseContentReleases.mjs +190 -0
  68. package/dist/admin/pages/PurchaseContentReleases.mjs.map +1 -0
  69. package/dist/admin/pages/ReleaseDetailsPage.js +774 -0
  70. package/dist/admin/pages/ReleaseDetailsPage.js.map +1 -0
  71. package/dist/admin/pages/ReleaseDetailsPage.mjs +753 -0
  72. package/dist/admin/pages/ReleaseDetailsPage.mjs.map +1 -0
  73. package/dist/admin/pages/ReleasesPage.js +405 -0
  74. package/dist/admin/pages/ReleasesPage.js.map +1 -0
  75. package/dist/admin/pages/ReleasesPage.mjs +383 -0
  76. package/dist/admin/pages/ReleasesPage.mjs.map +1 -0
  77. package/dist/admin/pages/ReleasesSettingsPage.js +225 -0
  78. package/dist/admin/pages/ReleasesSettingsPage.js.map +1 -0
  79. package/dist/admin/pages/ReleasesSettingsPage.mjs +223 -0
  80. package/dist/admin/pages/ReleasesSettingsPage.mjs.map +1 -0
  81. package/dist/admin/pluginId.js +6 -0
  82. package/dist/admin/pluginId.js.map +1 -0
  83. package/dist/admin/pluginId.mjs +4 -0
  84. package/dist/admin/pluginId.mjs.map +1 -0
  85. package/dist/admin/services/homepage.js +24 -0
  86. package/dist/admin/services/homepage.js.map +1 -0
  87. package/dist/admin/services/homepage.mjs +22 -0
  88. package/dist/admin/services/homepage.mjs.map +1 -0
  89. package/dist/admin/services/release.js +473 -0
  90. package/dist/admin/services/release.js.map +1 -0
  91. package/dist/admin/services/release.mjs +456 -0
  92. package/dist/admin/services/release.mjs.map +1 -0
  93. package/dist/admin/src/components/EntryValidationPopover.d.ts +2 -1
  94. package/dist/admin/src/components/ReleaseListCell.d.ts +1 -1
  95. package/dist/admin/src/components/Widgets.d.ts +2 -0
  96. package/dist/admin/src/constants.d.ts +1 -0
  97. package/dist/admin/src/services/homepage.d.ts +9 -0
  98. package/dist/admin/src/services/release.d.ts +28 -28
  99. package/dist/admin/store/hooks.js +8 -0
  100. package/dist/admin/store/hooks.js.map +1 -0
  101. package/dist/admin/store/hooks.mjs +6 -0
  102. package/dist/admin/store/hooks.mjs.map +1 -0
  103. package/dist/admin/translations/en.json.js +111 -0
  104. package/dist/admin/translations/en.json.js.map +1 -0
  105. package/dist/admin/translations/en.json.mjs +109 -0
  106. package/dist/admin/translations/en.json.mjs.map +1 -0
  107. package/dist/admin/translations/uk.json.js +103 -0
  108. package/dist/admin/translations/uk.json.js.map +1 -0
  109. package/dist/admin/translations/uk.json.mjs +101 -0
  110. package/dist/admin/translations/uk.json.mjs.map +1 -0
  111. package/dist/admin/utils/api.js +8 -0
  112. package/dist/admin/utils/api.js.map +1 -0
  113. package/dist/admin/utils/api.mjs +6 -0
  114. package/dist/admin/utils/api.mjs.map +1 -0
  115. package/dist/admin/utils/prefixPluginTranslations.js +11 -0
  116. package/dist/admin/utils/prefixPluginTranslations.js.map +1 -0
  117. package/dist/admin/utils/prefixPluginTranslations.mjs +9 -0
  118. package/dist/admin/utils/prefixPluginTranslations.mjs.map +1 -0
  119. package/dist/admin/utils/time.js +42 -0
  120. package/dist/admin/utils/time.js.map +1 -0
  121. package/dist/admin/utils/time.mjs +39 -0
  122. package/dist/admin/utils/time.mjs.map +1 -0
  123. package/dist/admin/validation/schemas.js +65 -0
  124. package/dist/admin/validation/schemas.js.map +1 -0
  125. package/dist/admin/validation/schemas.mjs +43 -0
  126. package/dist/admin/validation/schemas.mjs.map +1 -0
  127. package/dist/server/bootstrap.js +68 -0
  128. package/dist/server/bootstrap.js.map +1 -0
  129. package/dist/server/bootstrap.mjs +66 -0
  130. package/dist/server/bootstrap.mjs.map +1 -0
  131. package/dist/server/constants.js +74 -0
  132. package/dist/server/constants.js.map +1 -0
  133. package/dist/server/constants.mjs +69 -0
  134. package/dist/server/constants.mjs.map +1 -0
  135. package/dist/server/content-types/index.js +12 -0
  136. package/dist/server/content-types/index.js.map +1 -0
  137. package/dist/server/content-types/index.mjs +10 -0
  138. package/dist/server/content-types/index.mjs.map +1 -0
  139. package/dist/server/content-types/release/index.js +10 -0
  140. package/dist/server/content-types/release/index.js.map +1 -0
  141. package/dist/server/content-types/release/index.mjs +8 -0
  142. package/dist/server/content-types/release/index.mjs.map +1 -0
  143. package/dist/server/content-types/release/schema.js +58 -0
  144. package/dist/server/content-types/release/schema.js.map +1 -0
  145. package/dist/server/content-types/release/schema.mjs +56 -0
  146. package/dist/server/content-types/release/schema.mjs.map +1 -0
  147. package/dist/server/content-types/release-action/index.js +10 -0
  148. package/dist/server/content-types/release-action/index.js.map +1 -0
  149. package/dist/server/content-types/release-action/index.mjs +8 -0
  150. package/dist/server/content-types/release-action/index.mjs.map +1 -0
  151. package/dist/server/content-types/release-action/schema.js +55 -0
  152. package/dist/server/content-types/release-action/schema.js.map +1 -0
  153. package/dist/server/content-types/release-action/schema.mjs +53 -0
  154. package/dist/server/content-types/release-action/schema.mjs.map +1 -0
  155. package/dist/server/controllers/homepage.js +15 -0
  156. package/dist/server/controllers/homepage.js.map +1 -0
  157. package/dist/server/controllers/homepage.mjs +13 -0
  158. package/dist/server/controllers/homepage.mjs.map +1 -0
  159. package/dist/server/controllers/index.js +16 -0
  160. package/dist/server/controllers/index.js.map +1 -0
  161. package/dist/server/controllers/index.mjs +14 -0
  162. package/dist/server/controllers/index.mjs.map +1 -0
  163. package/dist/server/controllers/release-action.js +150 -0
  164. package/dist/server/controllers/release-action.js.map +1 -0
  165. package/dist/server/controllers/release-action.mjs +148 -0
  166. package/dist/server/controllers/release-action.mjs.map +1 -0
  167. package/dist/server/controllers/release.js +302 -0
  168. package/dist/server/controllers/release.js.map +1 -0
  169. package/dist/server/controllers/release.mjs +300 -0
  170. package/dist/server/controllers/release.mjs.map +1 -0
  171. package/dist/server/controllers/settings.js +37 -0
  172. package/dist/server/controllers/settings.js.map +1 -0
  173. package/dist/server/controllers/settings.mjs +35 -0
  174. package/dist/server/controllers/settings.mjs.map +1 -0
  175. package/dist/server/controllers/validation/release-action.js +34 -0
  176. package/dist/server/controllers/validation/release-action.js.map +1 -0
  177. package/dist/server/controllers/validation/release-action.mjs +30 -0
  178. package/dist/server/controllers/validation/release-action.mjs.map +1 -0
  179. package/dist/server/controllers/validation/release.js +26 -0
  180. package/dist/server/controllers/validation/release.js.map +1 -0
  181. package/dist/server/controllers/validation/release.mjs +22 -0
  182. package/dist/server/controllers/validation/release.mjs.map +1 -0
  183. package/dist/server/controllers/validation/settings.js +32 -0
  184. package/dist/server/controllers/validation/settings.js.map +1 -0
  185. package/dist/server/controllers/validation/settings.mjs +10 -0
  186. package/dist/server/controllers/validation/settings.mjs.map +1 -0
  187. package/dist/server/destroy.js +15 -0
  188. package/dist/server/destroy.js.map +1 -0
  189. package/dist/server/destroy.mjs +13 -0
  190. package/dist/server/destroy.mjs.map +1 -0
  191. package/dist/server/index.js +25 -1985
  192. package/dist/server/index.js.map +1 -1
  193. package/dist/server/index.mjs +24 -1965
  194. package/dist/server/index.mjs.map +1 -1
  195. package/dist/server/middlewares/documents.js +104 -0
  196. package/dist/server/middlewares/documents.js.map +1 -0
  197. package/dist/server/middlewares/documents.mjs +101 -0
  198. package/dist/server/middlewares/documents.mjs.map +1 -0
  199. package/dist/server/migrations/database/5.0.0-document-id-in-actions.js +51 -0
  200. package/dist/server/migrations/database/5.0.0-document-id-in-actions.js.map +1 -0
  201. package/dist/server/migrations/database/5.0.0-document-id-in-actions.mjs +49 -0
  202. package/dist/server/migrations/database/5.0.0-document-id-in-actions.mjs.map +1 -0
  203. package/dist/server/migrations/index.js +205 -0
  204. package/dist/server/migrations/index.js.map +1 -0
  205. package/dist/server/migrations/index.mjs +198 -0
  206. package/dist/server/migrations/index.mjs.map +1 -0
  207. package/dist/server/register.js +23 -0
  208. package/dist/server/register.js.map +1 -0
  209. package/dist/server/register.mjs +21 -0
  210. package/dist/server/register.mjs.map +1 -0
  211. package/dist/server/routes/homepage.js +25 -0
  212. package/dist/server/routes/homepage.js.map +1 -0
  213. package/dist/server/routes/homepage.mjs +23 -0
  214. package/dist/server/routes/homepage.mjs.map +1 -0
  215. package/dist/server/routes/index.js +16 -0
  216. package/dist/server/routes/index.js.map +1 -0
  217. package/dist/server/routes/index.mjs +14 -0
  218. package/dist/server/routes/index.mjs.map +1 -0
  219. package/dist/server/routes/release-action.js +100 -0
  220. package/dist/server/routes/release-action.js.map +1 -0
  221. package/dist/server/routes/release-action.mjs +98 -0
  222. package/dist/server/routes/release-action.mjs.map +1 -0
  223. package/dist/server/routes/release.js +154 -0
  224. package/dist/server/routes/release.js.map +1 -0
  225. package/dist/server/routes/release.mjs +152 -0
  226. package/dist/server/routes/release.mjs.map +1 -0
  227. package/dist/server/routes/settings.js +46 -0
  228. package/dist/server/routes/settings.js.map +1 -0
  229. package/dist/server/routes/settings.mjs +44 -0
  230. package/dist/server/routes/settings.mjs.map +1 -0
  231. package/dist/server/services/homepage.js +26 -0
  232. package/dist/server/services/homepage.js.map +1 -0
  233. package/dist/server/services/homepage.mjs +24 -0
  234. package/dist/server/services/homepage.mjs.map +1 -0
  235. package/dist/server/services/index.js +20 -0
  236. package/dist/server/services/index.js.map +1 -0
  237. package/dist/server/services/index.mjs +18 -0
  238. package/dist/server/services/index.mjs.map +1 -0
  239. package/dist/server/services/release-action.js +324 -0
  240. package/dist/server/services/release-action.js.map +1 -0
  241. package/dist/server/services/release-action.mjs +322 -0
  242. package/dist/server/services/release-action.mjs.map +1 -0
  243. package/dist/server/services/release.js +324 -0
  244. package/dist/server/services/release.js.map +1 -0
  245. package/dist/server/services/release.mjs +322 -0
  246. package/dist/server/services/release.mjs.map +1 -0
  247. package/dist/server/services/scheduling.js +74 -0
  248. package/dist/server/services/scheduling.js.map +1 -0
  249. package/dist/server/services/scheduling.mjs +72 -0
  250. package/dist/server/services/scheduling.mjs.map +1 -0
  251. package/dist/server/services/settings.js +34 -0
  252. package/dist/server/services/settings.js.map +1 -0
  253. package/dist/server/services/settings.mjs +32 -0
  254. package/dist/server/services/settings.mjs.map +1 -0
  255. package/dist/server/services/validation.js +91 -0
  256. package/dist/server/services/validation.js.map +1 -0
  257. package/dist/server/services/validation.mjs +86 -0
  258. package/dist/server/services/validation.mjs.map +1 -0
  259. package/dist/server/src/controllers/homepage.d.ts +6 -0
  260. package/dist/server/src/controllers/homepage.d.ts.map +1 -0
  261. package/dist/server/src/controllers/index.d.ts +3 -0
  262. package/dist/server/src/controllers/index.d.ts.map +1 -1
  263. package/dist/server/src/destroy.d.ts +1 -1
  264. package/dist/server/src/destroy.d.ts.map +1 -1
  265. package/dist/server/src/index.d.ts +14 -4
  266. package/dist/server/src/index.d.ts.map +1 -1
  267. package/dist/server/src/middlewares/documents.d.ts +1 -1
  268. package/dist/server/src/middlewares/documents.d.ts.map +1 -1
  269. package/dist/server/src/migrations/database/5.0.0-document-id-in-actions.d.ts.map +1 -1
  270. package/dist/server/src/routes/homepage.d.ts +4 -0
  271. package/dist/server/src/routes/homepage.d.ts.map +1 -0
  272. package/dist/server/src/routes/index.d.ts +1 -0
  273. package/dist/server/src/routes/index.d.ts.map +1 -1
  274. package/dist/server/src/services/homepage.d.ts +9 -0
  275. package/dist/server/src/services/homepage.d.ts.map +1 -0
  276. package/dist/server/src/services/index.d.ts +10 -4
  277. package/dist/server/src/services/index.d.ts.map +1 -1
  278. package/dist/server/src/services/release-action.d.ts +2 -1
  279. package/dist/server/src/services/release-action.d.ts.map +1 -1
  280. package/dist/server/src/services/scheduling.d.ts +5 -6
  281. package/dist/server/src/services/scheduling.d.ts.map +1 -1
  282. package/dist/server/src/services/validation.d.ts +1 -1
  283. package/dist/server/src/services/validation.d.ts.map +1 -1
  284. package/dist/server/src/utils/index.d.ts.map +1 -1
  285. package/dist/server/utils/index.js +94 -0
  286. package/dist/server/utils/index.js.map +1 -0
  287. package/dist/server/utils/index.mjs +88 -0
  288. package/dist/server/utils/index.mjs.map +1 -0
  289. package/dist/shared/contracts/homepage.d.ts +11 -0
  290. package/dist/shared/contracts/homepage.d.ts.map +1 -0
  291. package/dist/shared/contracts/release-actions.d.ts +1 -1
  292. package/dist/shared/contracts/release-actions.d.ts.map +1 -1
  293. package/dist/shared/contracts/releases.d.ts +0 -1
  294. package/dist/shared/contracts/settings.d.ts +1 -2
  295. package/dist/shared/contracts/settings.d.ts.map +1 -1
  296. package/dist/shared/types.d.ts +1 -1
  297. package/dist/shared/types.d.ts.map +1 -1
  298. package/package.json +25 -24
  299. package/dist/_chunks/App-B7XAvv8M.mjs +0 -1545
  300. package/dist/_chunks/App-B7XAvv8M.mjs.map +0 -1
  301. package/dist/_chunks/App-bh0od5o7.js +0 -1566
  302. package/dist/_chunks/App-bh0od5o7.js.map +0 -1
  303. package/dist/_chunks/PurchaseContentReleases-Be3acS2L.js +0 -52
  304. package/dist/_chunks/PurchaseContentReleases-Be3acS2L.js.map +0 -1
  305. package/dist/_chunks/PurchaseContentReleases-_MxP6-Dt.mjs +0 -52
  306. package/dist/_chunks/PurchaseContentReleases-_MxP6-Dt.mjs.map +0 -1
  307. package/dist/_chunks/ReleasesSettingsPage-DI0i3yzr.mjs +0 -178
  308. package/dist/_chunks/ReleasesSettingsPage-DI0i3yzr.mjs.map +0 -1
  309. package/dist/_chunks/ReleasesSettingsPage-DegTeuSf.js +0 -178
  310. package/dist/_chunks/ReleasesSettingsPage-DegTeuSf.js.map +0 -1
  311. package/dist/_chunks/en-BWPPsSH-.js +0 -102
  312. package/dist/_chunks/en-BWPPsSH-.js.map +0 -1
  313. package/dist/_chunks/en-D9Q4YW03.mjs +0 -102
  314. package/dist/_chunks/en-D9Q4YW03.mjs.map +0 -1
  315. package/dist/_chunks/index-B7aCK4-q.js +0 -1384
  316. package/dist/_chunks/index-B7aCK4-q.js.map +0 -1
  317. package/dist/_chunks/index-ok-2phdF.mjs +0 -1365
  318. package/dist/_chunks/index-ok-2phdF.mjs.map +0 -1
  319. package/dist/_chunks/schemas-BE1LxE9J.js +0 -62
  320. package/dist/_chunks/schemas-BE1LxE9J.js.map +0 -1
  321. package/dist/_chunks/schemas-DdA2ic2U.mjs +0 -44
  322. package/dist/_chunks/schemas-DdA2ic2U.mjs.map +0 -1
@@ -1,1545 +0,0 @@
1
- import { jsxs, jsx, 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 { Link, useLocation, useNavigate, NavLink, useParams, Navigate, 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-ok-2phdF.mjs";
5
- import * as React from "react";
6
- import { Flex, Popover, Button, Typography, LinkButton, Modal, Field, TextInput, Box, Checkbox, DatePicker, TimePicker, Combobox, ComboboxOption, Link as Link$1, Alert, Main, Tabs, Divider, EmptyStateLayout, Grid, Badge, MenuItem, SimpleMenu, Dialog, SingleSelect, SingleSelectOption, Tr, Td } from "@strapi/design-system";
7
- import { CrossCircle, CaretDown, CheckCircle, ArrowsCounterClockwise, Plus, Pencil, Trash, More } from "@strapi/icons";
8
- import { EmptyDocuments } from "@strapi/icons/symbols";
9
- import format$1 from "date-fns/format";
10
- import { utcToZonedTime, zonedTimeToUtc } from "date-fns-tz";
11
- import { useIntl } from "react-intl";
12
- import { styled } from "styled-components";
13
- import { unstable_useDocument } from "@strapi/content-manager/strapi-admin";
14
- import { stringify } from "qs";
15
- import { intervalToDuration, isPast, formatISO, format } from "date-fns";
16
- import { Formik, Form, useFormikContext } from "formik";
17
- import { R as RELEASE_SCHEMA } from "./schemas-DdA2ic2U.mjs";
18
- import { useDispatch } from "react-redux";
19
- import { useLicenseLimits } from "@strapi/admin/strapi-admin/ee";
20
- const StyledPopoverFlex = styled(Flex)`
21
- width: 100%;
22
- max-width: 256px;
23
-
24
- & > * {
25
- border-bottom: 1px solid ${({ theme }) => theme.colors.neutral150};
26
- }
27
-
28
- & > *:last-child {
29
- border-bottom: none;
30
- }
31
- `;
32
- const EntryStatusTrigger = ({
33
- action,
34
- status,
35
- hasErrors,
36
- requiredStage,
37
- entryStage
38
- }) => {
39
- const { formatMessage } = useIntl();
40
- if (action === "publish") {
41
- if (hasErrors || requiredStage && requiredStage.id !== entryStage?.id) {
42
- return /* @__PURE__ */ jsx(Popover.Trigger, { children: /* @__PURE__ */ jsx(
43
- Button,
44
- {
45
- variant: "ghost",
46
- startIcon: /* @__PURE__ */ jsx(CrossCircle, { fill: "danger600" }),
47
- endIcon: /* @__PURE__ */ jsx(CaretDown, {}),
48
- children: /* @__PURE__ */ jsx(Typography, { textColor: "danger600", variant: "omega", fontWeight: "bold", children: formatMessage({
49
- id: "content-releases.pages.ReleaseDetails.entry-validation.not-ready",
50
- defaultMessage: "Not ready to publish"
51
- }) })
52
- }
53
- ) });
54
- }
55
- if (status === "draft") {
56
- return /* @__PURE__ */ jsx(Popover.Trigger, { children: /* @__PURE__ */ jsx(
57
- Button,
58
- {
59
- variant: "ghost",
60
- startIcon: /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
61
- endIcon: /* @__PURE__ */ jsx(CaretDown, {}),
62
- children: /* @__PURE__ */ jsx(Typography, { textColor: "success600", variant: "omega", fontWeight: "bold", children: formatMessage({
63
- id: "content-releases.pages.ReleaseDetails.entry-validation.ready-to-publish",
64
- defaultMessage: "Ready to publish"
65
- }) })
66
- }
67
- ) });
68
- }
69
- if (status === "modified") {
70
- return /* @__PURE__ */ jsx(Popover.Trigger, { children: /* @__PURE__ */ jsx(
71
- Button,
72
- {
73
- variant: "ghost",
74
- startIcon: /* @__PURE__ */ jsx(ArrowsCounterClockwise, { fill: "alternative600" }),
75
- endIcon: /* @__PURE__ */ jsx(CaretDown, {}),
76
- children: /* @__PURE__ */ jsx(Typography, { variant: "omega", fontWeight: "bold", textColor: "alternative600", children: formatMessage({
77
- id: "content-releases.pages.ReleaseDetails.entry-validation.modified",
78
- defaultMessage: "Ready to publish changes"
79
- }) })
80
- }
81
- ) });
82
- }
83
- return /* @__PURE__ */ jsx(Popover.Trigger, { children: /* @__PURE__ */ jsx(
84
- Button,
85
- {
86
- variant: "ghost",
87
- startIcon: /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
88
- endIcon: /* @__PURE__ */ jsx(CaretDown, {}),
89
- children: /* @__PURE__ */ jsx(Typography, { textColor: "success600", variant: "omega", fontWeight: "bold", children: formatMessage({
90
- id: "content-releases.pages.ReleaseDetails.entry-validation.already-published",
91
- defaultMessage: "Already published"
92
- }) })
93
- }
94
- ) });
95
- }
96
- return /* @__PURE__ */ jsx(Popover.Trigger, { children: /* @__PURE__ */ jsx(Button, { variant: "ghost", startIcon: /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }), endIcon: /* @__PURE__ */ jsx(CaretDown, {}), children: /* @__PURE__ */ jsx(Typography, { textColor: "success600", variant: "omega", fontWeight: "bold", children: formatMessage({
97
- id: "content-releases.pages.ReleaseDetails.entry-validation.already-unpublished",
98
- defaultMessage: "Already unpublished"
99
- }) }) }) });
100
- };
101
- const FieldsValidation = ({
102
- hasErrors,
103
- errors,
104
- kind,
105
- contentTypeUid,
106
- documentId,
107
- locale
108
- }) => {
109
- const { formatMessage } = useIntl();
110
- return /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: 1, width: "100%", padding: 5, children: [
111
- /* @__PURE__ */ jsxs(Flex, { gap: 2, width: "100%", children: [
112
- /* @__PURE__ */ jsx(Typography, { fontWeight: "bold", children: formatMessage({
113
- id: "content-releases.pages.ReleaseDetails.entry-validation.fields",
114
- defaultMessage: "Fields"
115
- }) }),
116
- hasErrors ? /* @__PURE__ */ jsx(CrossCircle, { fill: "danger600" }) : /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" })
117
- ] }),
118
- /* @__PURE__ */ jsx(Typography, { width: "100%", textColor: "neutral600", children: hasErrors ? formatMessage(
119
- {
120
- id: "content-releases.pages.ReleaseDetails.entry-validation.fields.error",
121
- defaultMessage: "{errors} errors on fields."
122
- },
123
- { errors: errors ? Object.keys(errors).length : 0 }
124
- ) : formatMessage({
125
- id: "content-releases.pages.ReleaseDetails.entry-validation.fields.success",
126
- defaultMessage: "All fields are filled correctly."
127
- }) }),
128
- hasErrors && /* @__PURE__ */ jsx(
129
- LinkButton,
130
- {
131
- tag: Link,
132
- to: {
133
- pathname: `/content-manager/${kind === "collectionType" ? "collection-types" : "single-types"}/${contentTypeUid}/${documentId}`,
134
- search: locale ? stringify({
135
- plugins: {
136
- i18n: {
137
- locale
138
- }
139
- }
140
- }) : ""
141
- },
142
- variant: "secondary",
143
- fullWidth: true,
144
- state: { forceValidation: true },
145
- children: formatMessage({
146
- id: "content-releases.pages.ReleaseDetails.entry-validation.fields.see-errors",
147
- defaultMessage: "See errors"
148
- })
149
- }
150
- )
151
- ] });
152
- };
153
- const getReviewStageIcon = ({
154
- contentTypeHasReviewWorkflow,
155
- requiredStage,
156
- entryStage
157
- }) => {
158
- if (!contentTypeHasReviewWorkflow) {
159
- return /* @__PURE__ */ jsx(CheckCircle, { fill: "neutral200" });
160
- }
161
- if (requiredStage && requiredStage.id !== entryStage?.id) {
162
- return /* @__PURE__ */ jsx(CrossCircle, { fill: "danger600" });
163
- }
164
- return /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" });
165
- };
166
- const getReviewStageMessage = ({
167
- contentTypeHasReviewWorkflow,
168
- requiredStage,
169
- entryStage,
170
- formatMessage
171
- }) => {
172
- if (!contentTypeHasReviewWorkflow) {
173
- return formatMessage({
174
- id: "content-releases.pages.ReleaseDetails.entry-validation.review-stage.not-enabled",
175
- defaultMessage: "This entry is not associated to any workflow."
176
- });
177
- }
178
- if (requiredStage && requiredStage.id !== entryStage?.id) {
179
- return formatMessage(
180
- {
181
- id: "content-releases.pages.ReleaseDetails.entry-validation.review-stage.not-ready",
182
- defaultMessage: "This entry is not at the required stage for publishing. ({stageName})"
183
- },
184
- {
185
- stageName: requiredStage?.name ?? ""
186
- }
187
- );
188
- }
189
- if (requiredStage && requiredStage.id === entryStage?.id) {
190
- return formatMessage(
191
- {
192
- id: "content-releases.pages.ReleaseDetails.entry-validation.review-stage.ready",
193
- defaultMessage: "This entry is at the required stage for publishing. ({stageName})"
194
- },
195
- {
196
- stageName: requiredStage?.name ?? ""
197
- }
198
- );
199
- }
200
- return formatMessage({
201
- id: "content-releases.pages.ReleaseDetails.entry-validation.review-stage.stage-not-required",
202
- defaultMessage: "No required stage for publication"
203
- });
204
- };
205
- const ReviewStageValidation = ({
206
- contentTypeHasReviewWorkflow,
207
- requiredStage,
208
- entryStage
209
- }) => {
210
- const { formatMessage } = useIntl();
211
- const Icon = getReviewStageIcon({
212
- contentTypeHasReviewWorkflow,
213
- requiredStage,
214
- entryStage
215
- });
216
- return /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: 1, width: "100%", padding: 5, children: [
217
- /* @__PURE__ */ jsxs(Flex, { gap: 2, width: "100%", children: [
218
- /* @__PURE__ */ jsx(Typography, { fontWeight: "bold", children: formatMessage({
219
- id: "content-releases.pages.ReleaseDetails.entry-validation.review-stage",
220
- defaultMessage: "Review stage"
221
- }) }),
222
- Icon
223
- ] }),
224
- /* @__PURE__ */ jsx(Typography, { textColor: "neutral600", children: getReviewStageMessage({
225
- contentTypeHasReviewWorkflow,
226
- requiredStage,
227
- entryStage,
228
- formatMessage
229
- }) })
230
- ] });
231
- };
232
- const EntryValidationPopover = ({
233
- action,
234
- schema,
235
- entry,
236
- status
237
- }) => {
238
- const { validate, isLoading } = unstable_useDocument(
239
- {
240
- collectionType: schema?.kind ?? "",
241
- model: schema?.uid ?? ""
242
- },
243
- {
244
- // 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
245
- skip: true
246
- }
247
- );
248
- const errors = isLoading ? null : validate(entry);
249
- const hasErrors = errors ? Object.keys(errors).length > 0 : false;
250
- const contentTypeHasReviewWorkflow = schema?.options?.reviewWorkflows ?? false;
251
- const requiredStage = schema?.stageRequiredToPublish;
252
- const entryStage = entry.strapi_stage;
253
- if (isLoading) {
254
- return null;
255
- }
256
- return /* @__PURE__ */ jsxs(Popover.Root, { children: [
257
- /* @__PURE__ */ jsx(
258
- EntryStatusTrigger,
259
- {
260
- action,
261
- status,
262
- hasErrors,
263
- requiredStage,
264
- entryStage
265
- }
266
- ),
267
- /* @__PURE__ */ jsx(Popover.Content, { children: /* @__PURE__ */ jsxs(StyledPopoverFlex, { direction: "column", children: [
268
- /* @__PURE__ */ jsx(
269
- FieldsValidation,
270
- {
271
- hasErrors,
272
- errors,
273
- contentTypeUid: schema?.uid,
274
- kind: schema?.kind,
275
- documentId: entry.documentId,
276
- locale: entry.locale
277
- }
278
- ),
279
- /* @__PURE__ */ jsx(
280
- ReviewStageValidation,
281
- {
282
- contentTypeHasReviewWorkflow,
283
- requiredStage,
284
- entryStage
285
- }
286
- )
287
- ] }) })
288
- ] });
289
- };
290
- const intervals = ["years", "months", "days", "hours", "minutes", "seconds"];
291
- const RelativeTime$1 = React.forwardRef(
292
- ({ timestamp, customIntervals = [], ...restProps }, forwardedRef) => {
293
- const { formatRelativeTime, formatDate, formatTime } = useIntl();
294
- const interval = intervalToDuration({
295
- start: timestamp,
296
- end: Date.now()
297
- // see https://github.com/date-fns/date-fns/issues/2891 – No idea why it's all partial it returns it every time.
298
- });
299
- const unit = intervals.find((intervalUnit) => {
300
- return interval[intervalUnit] > 0 && Object.keys(interval).includes(intervalUnit);
301
- });
302
- const relativeTime = isPast(timestamp) ? -interval[unit] : interval[unit];
303
- const customInterval = customIntervals.find(
304
- (custom) => interval[custom.unit] < custom.threshold
305
- );
306
- const displayText = customInterval ? customInterval.text : formatRelativeTime(relativeTime, unit, { numeric: "auto" });
307
- return /* @__PURE__ */ jsx(
308
- "time",
309
- {
310
- ref: forwardedRef,
311
- dateTime: timestamp.toISOString(),
312
- role: "time",
313
- title: `${formatDate(timestamp)} ${formatTime(timestamp)}`,
314
- ...restProps,
315
- children: displayText
316
- }
317
- );
318
- }
319
- );
320
- const ReleaseModal = ({
321
- handleClose,
322
- open,
323
- handleSubmit,
324
- initialValues,
325
- isLoading = false
326
- }) => {
327
- const { formatMessage } = useIntl();
328
- const { pathname } = useLocation();
329
- const isCreatingRelease = pathname === `/plugins/${pluginId}`;
330
- const { timezoneList, systemTimezone = { value: "UTC+00:00-Africa/Abidjan " } } = getTimezones(
331
- initialValues.scheduledAt ? new Date(initialValues.scheduledAt) : /* @__PURE__ */ new Date()
332
- );
333
- const getScheduledTimestamp = (values) => {
334
- const { date, time, timezone } = values;
335
- if (!date || !time || !timezone)
336
- return null;
337
- const timezoneWithoutOffset = timezone.split("&")[1];
338
- return zonedTimeToUtc(`${date} ${time}`, timezoneWithoutOffset);
339
- };
340
- const getTimezoneWithOffset = () => {
341
- const currentTimezone = timezoneList.find(
342
- (timezone) => timezone.value.split("&")[1] === initialValues.timezone
343
- );
344
- return currentTimezone?.value || systemTimezone.value;
345
- };
346
- return /* @__PURE__ */ jsx(Modal.Root, { open, onOpenChange: handleClose, children: /* @__PURE__ */ jsxs(Modal.Content, { children: [
347
- /* @__PURE__ */ jsx(Modal.Header, { children: /* @__PURE__ */ jsx(Modal.Title, { children: formatMessage(
348
- {
349
- id: "content-releases.modal.title",
350
- defaultMessage: "{isCreatingRelease, select, true {New release} other {Edit release}}"
351
- },
352
- { isCreatingRelease }
353
- ) }) }),
354
- /* @__PURE__ */ jsx(
355
- Formik,
356
- {
357
- onSubmit: (values) => {
358
- handleSubmit({
359
- ...values,
360
- timezone: values.timezone ? values.timezone.split("&")[1] : null,
361
- scheduledAt: values.isScheduled ? getScheduledTimestamp(values) : null
362
- });
363
- },
364
- initialValues: {
365
- ...initialValues,
366
- timezone: initialValues.timezone ? getTimezoneWithOffset() : systemTimezone.value
367
- },
368
- validationSchema: RELEASE_SCHEMA,
369
- validateOnChange: false,
370
- children: ({ values, errors, handleChange, setFieldValue }) => {
371
- return /* @__PURE__ */ jsxs(Form, { children: [
372
- /* @__PURE__ */ jsx(Modal.Body, { children: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 6, children: [
373
- /* @__PURE__ */ jsxs(
374
- Field.Root,
375
- {
376
- name: "name",
377
- error: errors.name && formatMessage({ id: errors.name, defaultMessage: errors.name }),
378
- required: true,
379
- children: [
380
- /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
381
- id: "content-releases.modal.form.input.label.release-name",
382
- defaultMessage: "Name"
383
- }) }),
384
- /* @__PURE__ */ jsx(TextInput, { value: values.name, onChange: handleChange }),
385
- /* @__PURE__ */ jsx(Field.Error, {})
386
- ]
387
- }
388
- ),
389
- /* @__PURE__ */ jsx(Box, { width: "max-content", children: /* @__PURE__ */ jsx(
390
- Checkbox,
391
- {
392
- name: "isScheduled",
393
- checked: values.isScheduled,
394
- onCheckedChange: (checked) => {
395
- setFieldValue("isScheduled", checked);
396
- if (!checked) {
397
- setFieldValue("date", null);
398
- setFieldValue("time", "");
399
- setFieldValue("timezone", null);
400
- } else {
401
- setFieldValue("date", initialValues.date);
402
- setFieldValue("time", initialValues.time);
403
- setFieldValue(
404
- "timezone",
405
- initialValues.timezone ?? systemTimezone?.value
406
- );
407
- }
408
- },
409
- children: /* @__PURE__ */ jsx(
410
- Typography,
411
- {
412
- textColor: values.isScheduled ? "primary600" : "neutral800",
413
- fontWeight: values.isScheduled ? "semiBold" : "regular",
414
- children: formatMessage({
415
- id: "modal.form.input.label.schedule-release",
416
- defaultMessage: "Schedule release"
417
- })
418
- }
419
- )
420
- }
421
- ) }),
422
- values.isScheduled && /* @__PURE__ */ jsxs(Fragment, { children: [
423
- /* @__PURE__ */ jsxs(Flex, { gap: 4, alignItems: "start", children: [
424
- /* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsxs(
425
- Field.Root,
426
- {
427
- name: "date",
428
- error: errors.date && formatMessage({ id: errors.date, defaultMessage: errors.date }),
429
- required: true,
430
- children: [
431
- /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
432
- id: "content-releases.modal.form.input.label.date",
433
- defaultMessage: "Date"
434
- }) }),
435
- /* @__PURE__ */ jsx(
436
- DatePicker,
437
- {
438
- onChange: (date) => {
439
- const isoFormatDate = date ? formatISO(date, { representation: "date" }) : null;
440
- setFieldValue("date", isoFormatDate);
441
- },
442
- clearLabel: formatMessage({
443
- id: "content-releases.modal.form.input.clearLabel",
444
- defaultMessage: "Clear"
445
- }),
446
- onClear: () => {
447
- setFieldValue("date", null);
448
- },
449
- value: values.date ? new Date(values.date) : /* @__PURE__ */ new Date(),
450
- minDate: utcToZonedTime(/* @__PURE__ */ new Date(), values.timezone.split("&")[1])
451
- }
452
- ),
453
- /* @__PURE__ */ jsx(Field.Error, {})
454
- ]
455
- }
456
- ) }),
457
- /* @__PURE__ */ jsx(Box, { width: "100%", children: /* @__PURE__ */ jsxs(
458
- Field.Root,
459
- {
460
- name: "time",
461
- error: errors.time && formatMessage({ id: errors.time, defaultMessage: errors.time }),
462
- required: true,
463
- children: [
464
- /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
465
- id: "content-releases.modal.form.input.label.time",
466
- defaultMessage: "Time"
467
- }) }),
468
- /* @__PURE__ */ jsx(
469
- TimePicker,
470
- {
471
- onChange: (time) => {
472
- setFieldValue("time", time);
473
- },
474
- clearLabel: formatMessage({
475
- id: "content-releases.modal.form.input.clearLabel",
476
- defaultMessage: "Clear"
477
- }),
478
- onClear: () => {
479
- setFieldValue("time", "");
480
- },
481
- value: values.time || void 0
482
- }
483
- ),
484
- /* @__PURE__ */ jsx(Field.Error, {})
485
- ]
486
- }
487
- ) })
488
- ] }),
489
- /* @__PURE__ */ jsx(TimezoneComponent, { timezoneOptions: timezoneList })
490
- ] })
491
- ] }) }),
492
- /* @__PURE__ */ jsxs(Modal.Footer, { children: [
493
- /* @__PURE__ */ jsx(Modal.Close, { children: /* @__PURE__ */ jsx(Button, { variant: "tertiary", name: "cancel", children: formatMessage({ id: "cancel", defaultMessage: "Cancel" }) }) }),
494
- /* @__PURE__ */ jsx(Button, { name: "submit", loading: isLoading, type: "submit", children: formatMessage(
495
- {
496
- id: "content-releases.modal.form.button.submit",
497
- defaultMessage: "{isCreatingRelease, select, true {Continue} other {Save}}"
498
- },
499
- { isCreatingRelease }
500
- ) })
501
- ] })
502
- ] });
503
- }
504
- }
505
- )
506
- ] }) });
507
- };
508
- const TimezoneComponent = ({ timezoneOptions }) => {
509
- const { values, errors, setFieldValue } = useFormikContext();
510
- const { formatMessage } = useIntl();
511
- const [timezoneList, setTimezoneList] = React.useState(timezoneOptions);
512
- React.useEffect(() => {
513
- if (values.date) {
514
- const { timezoneList: timezoneList2 } = getTimezones(new Date(values.date));
515
- setTimezoneList(timezoneList2);
516
- const updatedTimezone = values.timezone && timezoneList2.find((tz) => tz.value.split("&")[1] === values.timezone.split("&")[1]);
517
- if (updatedTimezone) {
518
- setFieldValue("timezone", updatedTimezone.value);
519
- }
520
- }
521
- }, [setFieldValue, values.date, values.timezone]);
522
- return /* @__PURE__ */ jsxs(
523
- Field.Root,
524
- {
525
- name: "timezone",
526
- error: errors.timezone && formatMessage({ id: errors.timezone, defaultMessage: errors.timezone }),
527
- required: true,
528
- children: [
529
- /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
530
- id: "content-releases.modal.form.input.label.timezone",
531
- defaultMessage: "Timezone"
532
- }) }),
533
- /* @__PURE__ */ jsx(
534
- Combobox,
535
- {
536
- autocomplete: { type: "list", filter: "contains" },
537
- value: values.timezone || void 0,
538
- textValue: values.timezone ? values.timezone.replace(/&/, " ") : void 0,
539
- onChange: (timezone) => {
540
- setFieldValue("timezone", timezone);
541
- },
542
- onTextValueChange: (timezone) => {
543
- setFieldValue("timezone", timezone);
544
- },
545
- onClear: () => {
546
- setFieldValue("timezone", "");
547
- },
548
- children: timezoneList.map((timezone) => /* @__PURE__ */ jsx(ComboboxOption, { value: timezone.value, children: timezone.value.replace(/&/, " ") }, timezone.value))
549
- }
550
- ),
551
- /* @__PURE__ */ jsx(Field.Error, {})
552
- ]
553
- }
554
- );
555
- };
556
- const useTypedDispatch = useDispatch;
557
- const isBaseQueryError = (error) => {
558
- return typeof error !== "undefined" && error.name !== void 0;
559
- };
560
- const LinkCard = styled(Link$1)`
561
- display: block;
562
- `;
563
- const RelativeTime = styled(RelativeTime$1)`
564
- display: inline-block;
565
- &::first-letter {
566
- text-transform: uppercase;
567
- }
568
- `;
569
- const getBadgeProps = (status) => {
570
- let color;
571
- switch (status) {
572
- case "ready":
573
- color = "success";
574
- break;
575
- case "blocked":
576
- color = "warning";
577
- break;
578
- case "failed":
579
- color = "danger";
580
- break;
581
- case "done":
582
- color = "primary";
583
- break;
584
- case "empty":
585
- default:
586
- color = "neutral";
587
- }
588
- return {
589
- textColor: `${color}600`,
590
- backgroundColor: `${color}100`,
591
- borderColor: `${color}200`
592
- };
593
- };
594
- const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
595
- const { formatMessage } = useIntl();
596
- if (isError) {
597
- return /* @__PURE__ */ jsx(Page.Error, {});
598
- }
599
- if (releases?.length === 0) {
600
- return /* @__PURE__ */ jsx(
601
- EmptyStateLayout,
602
- {
603
- content: formatMessage(
604
- {
605
- id: "content-releases.page.Releases.tab.emptyEntries",
606
- defaultMessage: "No releases"
607
- },
608
- {
609
- target: sectionTitle
610
- }
611
- ),
612
- icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "16rem" })
613
- }
614
- );
615
- }
616
- 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(
617
- Flex,
618
- {
619
- direction: "column",
620
- justifyContent: "space-between",
621
- padding: 4,
622
- hasRadius: true,
623
- background: "neutral0",
624
- shadow: "tableShadow",
625
- height: "100%",
626
- width: "100%",
627
- alignItems: "start",
628
- gap: 4,
629
- children: [
630
- /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "start", gap: 1, children: [
631
- /* @__PURE__ */ jsx(Typography, { textColor: "neutral800", tag: "h3", variant: "delta", fontWeight: "bold", children: name }),
632
- /* @__PURE__ */ jsx(Typography, { variant: "pi", textColor: "neutral600", children: scheduledAt ? /* @__PURE__ */ jsx(RelativeTime, { timestamp: new Date(scheduledAt) }) : formatMessage({
633
- id: "content-releases.pages.Releases.not-scheduled",
634
- defaultMessage: "Not scheduled"
635
- }) })
636
- ] }),
637
- /* @__PURE__ */ jsx(Badge, { ...getBadgeProps(status), children: status })
638
- ]
639
- }
640
- ) }) }, id)) });
641
- };
642
- const StyledAlert = styled(Alert)`
643
- button {
644
- display: none;
645
- }
646
- p + div {
647
- margin-left: auto;
648
- }
649
- `;
650
- const INITIAL_FORM_VALUES = {
651
- name: "",
652
- date: format(/* @__PURE__ */ new Date(), "yyyy-MM-dd"),
653
- time: "",
654
- isScheduled: true,
655
- scheduledAt: null,
656
- timezone: null
657
- };
658
- const ReleasesPage = () => {
659
- const location = useLocation();
660
- const [releaseModalShown, setReleaseModalShown] = React.useState(false);
661
- const { toggleNotification } = useNotification();
662
- const { formatMessage } = useIntl();
663
- const navigate = useNavigate();
664
- const { formatAPIError } = useAPIErrorHandler();
665
- const [{ query }, setQuery] = useQueryParams();
666
- const response = useGetReleasesQuery(query);
667
- const { data, isLoading: isLoadingSettings } = useGetReleaseSettingsQuery();
668
- const [createRelease, { isLoading: isSubmittingForm }] = useCreateReleaseMutation();
669
- const { getFeature } = useLicenseLimits();
670
- const { maximumReleases = 3 } = getFeature("cms-content-releases");
671
- const { trackUsage } = useTracking();
672
- const {
673
- allowedActions: { canCreate }
674
- } = useRBAC(PERMISSIONS);
675
- const { isLoading: isLoadingReleases, isSuccess, isError } = response;
676
- const activeTab = response?.currentData?.meta?.activeTab || "pending";
677
- React.useEffect(() => {
678
- if (location?.state?.errors) {
679
- toggleNotification({
680
- type: "danger",
681
- title: formatMessage({
682
- id: "content-releases.pages.Releases.notification.error.title",
683
- defaultMessage: "Your request could not be processed."
684
- }),
685
- message: formatMessage({
686
- id: "content-releases.pages.Releases.notification.error.message",
687
- defaultMessage: "Please try again or open another release."
688
- })
689
- });
690
- navigate("", { replace: true, state: null });
691
- }
692
- }, [formatMessage, location?.state?.errors, navigate, toggleNotification]);
693
- const toggleAddReleaseModal = () => {
694
- setReleaseModalShown((prev) => !prev);
695
- };
696
- if (isLoadingReleases || isLoadingSettings) {
697
- return /* @__PURE__ */ jsx(Page.Loading, {});
698
- }
699
- const totalPendingReleases = isSuccess && response.currentData?.meta?.pendingReleasesCount || 0;
700
- const hasReachedMaximumPendingReleases = totalPendingReleases >= maximumReleases;
701
- const handleTabChange = (tabValue) => {
702
- setQuery({
703
- ...query,
704
- page: 1,
705
- pageSize: response?.currentData?.meta?.pagination?.pageSize || 16,
706
- filters: {
707
- releasedAt: {
708
- $notNull: tabValue !== "pending"
709
- }
710
- }
711
- });
712
- };
713
- const handleAddRelease = async ({ name, scheduledAt, timezone }) => {
714
- const response2 = await createRelease({
715
- name,
716
- scheduledAt,
717
- timezone
718
- });
719
- if ("data" in response2) {
720
- toggleNotification({
721
- type: "success",
722
- message: formatMessage({
723
- id: "content-releases.modal.release-created-notification-success",
724
- defaultMessage: "Release created."
725
- })
726
- });
727
- trackUsage("didCreateRelease");
728
- navigate(response2.data.data.id.toString());
729
- } else if (isFetchError(response2.error)) {
730
- toggleNotification({
731
- type: "danger",
732
- message: formatAPIError(response2.error)
733
- });
734
- } else {
735
- toggleNotification({
736
- type: "danger",
737
- message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
738
- });
739
- }
740
- };
741
- return /* @__PURE__ */ jsxs(Main, { "aria-busy": isLoadingReleases || isLoadingSettings, children: [
742
- /* @__PURE__ */ jsx(
743
- Layouts.Header,
744
- {
745
- title: formatMessage({
746
- id: "content-releases.pages.Releases.title",
747
- defaultMessage: "Releases"
748
- }),
749
- subtitle: formatMessage({
750
- id: "content-releases.pages.Releases.header-subtitle",
751
- defaultMessage: "Create and manage content updates"
752
- }),
753
- primaryAction: canCreate ? /* @__PURE__ */ jsx(
754
- Button,
755
- {
756
- startIcon: /* @__PURE__ */ jsx(Plus, {}),
757
- onClick: toggleAddReleaseModal,
758
- disabled: hasReachedMaximumPendingReleases,
759
- children: formatMessage({
760
- id: "content-releases.header.actions.add-release",
761
- defaultMessage: "New release"
762
- })
763
- }
764
- ) : null
765
- }
766
- ),
767
- /* @__PURE__ */ jsx(Layouts.Content, { children: /* @__PURE__ */ jsxs(Fragment, { children: [
768
- hasReachedMaximumPendingReleases && /* @__PURE__ */ jsx(
769
- StyledAlert,
770
- {
771
- marginBottom: 6,
772
- action: /* @__PURE__ */ jsx(Link$1, { href: "https://strapi.io/pricing-cloud", isExternal: true, children: formatMessage({
773
- id: "content-releases.pages.Releases.max-limit-reached.action",
774
- defaultMessage: "Explore plans"
775
- }) }),
776
- title: formatMessage(
777
- {
778
- id: "content-releases.pages.Releases.max-limit-reached.title",
779
- defaultMessage: "You have reached the {number} pending {number, plural, one {release} other {releases}} limit."
780
- },
781
- { number: maximumReleases }
782
- ),
783
- onClose: () => {
784
- },
785
- closeLabel: "",
786
- children: formatMessage({
787
- id: "content-releases.pages.Releases.max-limit-reached.message",
788
- defaultMessage: "Upgrade to manage an unlimited number of releases."
789
- })
790
- }
791
- ),
792
- /* @__PURE__ */ jsxs(Tabs.Root, { variant: "simple", onValueChange: handleTabChange, value: activeTab, children: [
793
- /* @__PURE__ */ jsxs(Box, { paddingBottom: 8, children: [
794
- /* @__PURE__ */ jsxs(
795
- Tabs.List,
796
- {
797
- "aria-label": formatMessage({
798
- id: "content-releases.pages.Releases.tab-group.label",
799
- defaultMessage: "Releases list"
800
- }),
801
- children: [
802
- /* @__PURE__ */ jsx(Tabs.Trigger, { value: "pending", children: formatMessage(
803
- {
804
- id: "content-releases.pages.Releases.tab.pending",
805
- defaultMessage: "Pending ({count})"
806
- },
807
- {
808
- count: totalPendingReleases
809
- }
810
- ) }),
811
- /* @__PURE__ */ jsx(Tabs.Trigger, { value: "done", children: formatMessage({
812
- id: "content-releases.pages.Releases.tab.done",
813
- defaultMessage: "Done"
814
- }) })
815
- ]
816
- }
817
- ),
818
- /* @__PURE__ */ jsx(Divider, {})
819
- ] }),
820
- /* @__PURE__ */ jsx(Tabs.Content, { value: "pending", children: /* @__PURE__ */ jsx(
821
- ReleasesGrid,
822
- {
823
- sectionTitle: "pending",
824
- releases: response?.currentData?.data,
825
- isError
826
- }
827
- ) }),
828
- /* @__PURE__ */ jsx(Tabs.Content, { value: "done", children: /* @__PURE__ */ jsx(
829
- ReleasesGrid,
830
- {
831
- sectionTitle: "done",
832
- releases: response?.currentData?.data,
833
- isError
834
- }
835
- ) })
836
- ] }),
837
- /* @__PURE__ */ jsxs(
838
- Pagination.Root,
839
- {
840
- ...response?.currentData?.meta?.pagination,
841
- defaultPageSize: response?.currentData?.meta?.pagination?.pageSize,
842
- children: [
843
- /* @__PURE__ */ jsx(Pagination.PageSize, { options: ["8", "16", "32", "64"] }),
844
- /* @__PURE__ */ jsx(Pagination.Links, {})
845
- ]
846
- }
847
- )
848
- ] }) }),
849
- /* @__PURE__ */ jsx(
850
- ReleaseModal,
851
- {
852
- open: releaseModalShown,
853
- handleClose: toggleAddReleaseModal,
854
- handleSubmit: handleAddRelease,
855
- isLoading: isSubmittingForm,
856
- initialValues: {
857
- ...INITIAL_FORM_VALUES,
858
- timezone: data?.data.defaultTimezone ? data.data.defaultTimezone.split("&")[1] : null
859
- }
860
- }
861
- )
862
- ] });
863
- };
864
- const ReleaseInfoWrapper = styled(Flex)`
865
- align-self: stretch;
866
- border-bottom-right-radius: ${({ theme }) => theme.borderRadius};
867
- border-bottom-left-radius: ${({ theme }) => theme.borderRadius};
868
- border-top: 1px solid ${({ theme }) => theme.colors.neutral150};
869
- `;
870
- const StyledMenuItem = styled(MenuItem)`
871
- svg path {
872
- fill: ${({ theme, disabled }) => disabled && theme.colors.neutral500};
873
- }
874
- span {
875
- color: ${({ theme, disabled }) => disabled && theme.colors.neutral500};
876
- }
877
-
878
- &:hover {
879
- background: ${({ theme, $variant = "neutral" }) => theme.colors[`${$variant}100`]};
880
- }
881
- `;
882
- const PencilIcon = styled(Pencil)`
883
- width: ${({ theme }) => theme.spaces[4]};
884
- height: ${({ theme }) => theme.spaces[4]};
885
- path {
886
- fill: ${({ theme }) => theme.colors.neutral600};
887
- }
888
- `;
889
- const TrashIcon = styled(Trash)`
890
- width: ${({ theme }) => theme.spaces[4]};
891
- height: ${({ theme }) => theme.spaces[4]};
892
- path {
893
- fill: ${({ theme }) => theme.colors.danger600};
894
- }
895
- `;
896
- const ReleaseDetailsLayout = ({
897
- toggleEditReleaseModal,
898
- toggleWarningSubmit,
899
- children
900
- }) => {
901
- const { formatMessage, formatDate, formatTime } = useIntl();
902
- const { releaseId } = useParams();
903
- const {
904
- data,
905
- isLoading: isLoadingDetails,
906
- error
907
- } = useGetReleaseQuery(
908
- { id: releaseId },
909
- {
910
- skip: !releaseId
911
- }
912
- );
913
- const [publishRelease, { isLoading: isPublishing }] = usePublishReleaseMutation();
914
- const { toggleNotification } = useNotification();
915
- const { formatAPIError } = useAPIErrorHandler();
916
- const { allowedActions } = useRBAC(PERMISSIONS);
917
- const { canUpdate, canDelete, canPublish } = allowedActions;
918
- const dispatch = useTypedDispatch();
919
- const { trackUsage } = useTracking();
920
- const release = data?.data;
921
- const handlePublishRelease = (id) => async () => {
922
- const response = await publishRelease({ id });
923
- if ("data" in response) {
924
- toggleNotification({
925
- type: "success",
926
- message: formatMessage({
927
- id: "content-releases.pages.ReleaseDetails.publish-notification-success",
928
- defaultMessage: "Release was published successfully."
929
- })
930
- });
931
- const { totalEntries: totalEntries2, totalPublishedEntries, totalUnpublishedEntries } = response.data.meta;
932
- trackUsage("didPublishRelease", {
933
- totalEntries: totalEntries2,
934
- totalPublishedEntries,
935
- totalUnpublishedEntries
936
- });
937
- } else if (isFetchError(response.error)) {
938
- toggleNotification({
939
- type: "danger",
940
- message: formatAPIError(response.error)
941
- });
942
- } else {
943
- toggleNotification({
944
- type: "danger",
945
- message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
946
- });
947
- }
948
- };
949
- const handleRefresh = () => {
950
- dispatch(
951
- releaseApi.util.invalidateTags([
952
- { type: "ReleaseAction", id: "LIST" },
953
- { type: "Release", id: releaseId }
954
- ])
955
- );
956
- };
957
- const getCreatedByUser = () => {
958
- if (!release?.createdBy) {
959
- return null;
960
- }
961
- if (release.createdBy.username) {
962
- return release.createdBy.username;
963
- }
964
- if (release.createdBy.firstname) {
965
- return `${release.createdBy.firstname} ${release.createdBy.lastname || ""}`.trim();
966
- }
967
- return release.createdBy.email;
968
- };
969
- if (isLoadingDetails) {
970
- return /* @__PURE__ */ jsx(Page.Loading, {});
971
- }
972
- if (isBaseQueryError(error) && "code" in error || !release) {
973
- return /* @__PURE__ */ jsx(
974
- Navigate,
975
- {
976
- to: "..",
977
- state: {
978
- errors: [
979
- {
980
- // @ts-expect-error – TODO: fix this weird error flow
981
- code: error?.code
982
- }
983
- ]
984
- }
985
- }
986
- );
987
- }
988
- const totalEntries = release.actions.meta.count || 0;
989
- const hasCreatedByUser = Boolean(getCreatedByUser());
990
- const isScheduled = release.scheduledAt && release.timezone;
991
- const numberOfEntriesText = formatMessage(
992
- {
993
- id: "content-releases.pages.Details.header-subtitle",
994
- defaultMessage: "{number, plural, =0 {No entries} one {# entry} other {# entries}}"
995
- },
996
- { number: totalEntries }
997
- );
998
- const scheduledText = isScheduled ? formatMessage(
999
- {
1000
- id: "content-releases.pages.ReleaseDetails.header-subtitle.scheduled",
1001
- defaultMessage: "Scheduled for {date} at {time} ({offset})"
1002
- },
1003
- {
1004
- date: formatDate(new Date(release.scheduledAt), {
1005
- weekday: "long",
1006
- day: "numeric",
1007
- month: "long",
1008
- year: "numeric",
1009
- timeZone: release.timezone
1010
- }),
1011
- time: formatTime(new Date(release.scheduledAt), {
1012
- timeZone: release.timezone,
1013
- hourCycle: "h23"
1014
- }),
1015
- offset: getTimezoneOffset(release.timezone, new Date(release.scheduledAt))
1016
- }
1017
- ) : "";
1018
- return /* @__PURE__ */ jsxs(Main, { "aria-busy": isLoadingDetails, children: [
1019
- /* @__PURE__ */ jsx(
1020
- Layouts.Header,
1021
- {
1022
- title: release.name,
1023
- subtitle: /* @__PURE__ */ jsxs(Flex, { gap: 2, lineHeight: 6, children: [
1024
- /* @__PURE__ */ jsx(Typography, { textColor: "neutral600", variant: "epsilon", children: numberOfEntriesText + (isScheduled ? ` - ${scheduledText}` : "") }),
1025
- /* @__PURE__ */ jsx(Badge, { ...getBadgeProps(release.status), children: release.status })
1026
- ] }),
1027
- navigationAction: /* @__PURE__ */ jsx(BackButton, {}),
1028
- primaryAction: !release.releasedAt && /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
1029
- /* @__PURE__ */ jsxs(
1030
- SimpleMenuButton,
1031
- {
1032
- label: /* @__PURE__ */ jsx(More, {}),
1033
- variant: "tertiary",
1034
- endIcon: null,
1035
- paddingLeft: "7px",
1036
- paddingRight: "7px",
1037
- "aria-label": formatMessage({
1038
- id: "content-releases.header.actions.open-release-actions",
1039
- defaultMessage: "Release edit and delete menu"
1040
- }),
1041
- popoverPlacement: "bottom-end",
1042
- children: [
1043
- /* @__PURE__ */ jsx(StyledMenuItem, { disabled: !canUpdate, onSelect: toggleEditReleaseModal, children: /* @__PURE__ */ jsxs(Flex, { alignItems: "center", gap: 2, hasRadius: true, width: "100%", children: [
1044
- /* @__PURE__ */ jsx(PencilIcon, {}),
1045
- /* @__PURE__ */ jsx(Typography, { ellipsis: true, children: formatMessage({
1046
- id: "content-releases.header.actions.edit",
1047
- defaultMessage: "Edit"
1048
- }) })
1049
- ] }) }),
1050
- /* @__PURE__ */ jsx(
1051
- StyledMenuItem,
1052
- {
1053
- disabled: !canDelete,
1054
- onSelect: toggleWarningSubmit,
1055
- $variant: "danger",
1056
- children: /* @__PURE__ */ jsxs(Flex, { alignItems: "center", gap: 2, hasRadius: true, width: "100%", children: [
1057
- /* @__PURE__ */ jsx(TrashIcon, {}),
1058
- /* @__PURE__ */ jsx(Typography, { ellipsis: true, textColor: "danger600", children: formatMessage({
1059
- id: "content-releases.header.actions.delete",
1060
- defaultMessage: "Delete"
1061
- }) })
1062
- ] })
1063
- }
1064
- ),
1065
- /* @__PURE__ */ jsxs(
1066
- ReleaseInfoWrapper,
1067
- {
1068
- direction: "column",
1069
- justifyContent: "center",
1070
- alignItems: "flex-start",
1071
- gap: 1,
1072
- padding: 4,
1073
- children: [
1074
- /* @__PURE__ */ jsx(Typography, { variant: "pi", fontWeight: "bold", children: formatMessage({
1075
- id: "content-releases.header.actions.created",
1076
- defaultMessage: "Created"
1077
- }) }),
1078
- /* @__PURE__ */ jsxs(Typography, { variant: "pi", color: "neutral300", children: [
1079
- /* @__PURE__ */ jsx(RelativeTime$1, { timestamp: new Date(release.createdAt) }),
1080
- formatMessage(
1081
- {
1082
- id: "content-releases.header.actions.created.description",
1083
- defaultMessage: "{hasCreatedByUser, select, true { by {createdBy}} other { by deleted user}}"
1084
- },
1085
- { createdBy: getCreatedByUser(), hasCreatedByUser }
1086
- )
1087
- ] })
1088
- ]
1089
- }
1090
- )
1091
- ]
1092
- }
1093
- ),
1094
- /* @__PURE__ */ jsx(Button, { size: "S", variant: "tertiary", onClick: handleRefresh, children: formatMessage({
1095
- id: "content-releases.header.actions.refresh",
1096
- defaultMessage: "Refresh"
1097
- }) }),
1098
- canPublish ? /* @__PURE__ */ jsx(
1099
- Button,
1100
- {
1101
- size: "S",
1102
- variant: "default",
1103
- onClick: handlePublishRelease(release.id.toString()),
1104
- loading: isPublishing,
1105
- disabled: release.actions.meta.count === 0,
1106
- children: formatMessage({
1107
- id: "content-releases.header.actions.publish",
1108
- defaultMessage: "Publish"
1109
- })
1110
- }
1111
- ) : null
1112
- ] })
1113
- }
1114
- ),
1115
- children
1116
- ] });
1117
- };
1118
- const SimpleMenuButton = styled(SimpleMenu)`
1119
- & > span {
1120
- display: flex;
1121
- }
1122
- `;
1123
- const GROUP_BY_OPTIONS = ["contentType", "locale", "action"];
1124
- const GROUP_BY_OPTIONS_NO_LOCALE = ["contentType", "action"];
1125
- const getGroupByOptionLabel = (value) => {
1126
- if (value === "locale") {
1127
- return {
1128
- id: "content-releases.pages.ReleaseDetails.groupBy.option.locales",
1129
- defaultMessage: "Locales"
1130
- };
1131
- }
1132
- if (value === "action") {
1133
- return {
1134
- id: "content-releases.pages.ReleaseDetails.groupBy.option.actions",
1135
- defaultMessage: "Actions"
1136
- };
1137
- }
1138
- return {
1139
- id: "content-releases.pages.ReleaseDetails.groupBy.option.content-type",
1140
- defaultMessage: "Content-Types"
1141
- };
1142
- };
1143
- const ReleaseDetailsBody = ({ releaseId }) => {
1144
- const { formatMessage } = useIntl();
1145
- const [{ query }, setQuery] = useQueryParams();
1146
- const { toggleNotification } = useNotification();
1147
- const { formatAPIError } = useAPIErrorHandler();
1148
- const {
1149
- data: releaseData,
1150
- isLoading: isReleaseLoading,
1151
- error: releaseError
1152
- } = useGetReleaseQuery({ id: releaseId });
1153
- const {
1154
- allowedActions: { canUpdate }
1155
- } = useRBAC(PERMISSIONS);
1156
- const runHookWaterfall = useStrapiApp("ReleaseDetailsPage", (state) => state.runHookWaterfall);
1157
- const { displayedHeaders, hasI18nEnabled } = runHookWaterfall("ContentReleases/pages/ReleaseDetails/add-locale-in-releases", {
1158
- displayedHeaders: [
1159
- {
1160
- label: {
1161
- id: "content-releases.page.ReleaseDetails.table.header.label.name",
1162
- defaultMessage: "name"
1163
- },
1164
- name: "name"
1165
- }
1166
- ],
1167
- hasI18nEnabled: false
1168
- });
1169
- const release = releaseData?.data;
1170
- const selectedGroupBy = query?.groupBy || "contentType";
1171
- const {
1172
- isLoading,
1173
- isFetching,
1174
- isError,
1175
- data,
1176
- error: releaseActionsError
1177
- } = useGetReleaseActionsQuery({
1178
- ...query,
1179
- releaseId
1180
- });
1181
- const [updateReleaseAction] = useUpdateReleaseActionMutation();
1182
- const handleChangeType = async (e, actionId, actionPath) => {
1183
- const response = await updateReleaseAction({
1184
- params: {
1185
- releaseId,
1186
- actionId
1187
- },
1188
- body: {
1189
- type: e.target.value
1190
- },
1191
- query,
1192
- // We are passing the query params to make optimistic updates
1193
- actionPath
1194
- // We are passing the action path to found the position in the cache of the action for optimistic updates
1195
- });
1196
- if ("error" in response) {
1197
- if (isFetchError(response.error)) {
1198
- toggleNotification({
1199
- type: "danger",
1200
- message: formatAPIError(response.error)
1201
- });
1202
- } else {
1203
- toggleNotification({
1204
- type: "danger",
1205
- message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
1206
- });
1207
- }
1208
- }
1209
- };
1210
- if (isLoading || isReleaseLoading) {
1211
- return /* @__PURE__ */ jsx(Page.Loading, {});
1212
- }
1213
- const releaseActions = data?.data;
1214
- const releaseMeta = data?.meta;
1215
- const contentTypes = releaseMeta?.contentTypes || {};
1216
- releaseMeta?.components || {};
1217
- if (isBaseQueryError(releaseError) || !release) {
1218
- const errorsArray = [];
1219
- if (releaseError && "code" in releaseError) {
1220
- errorsArray.push({
1221
- code: releaseError.code
1222
- });
1223
- }
1224
- if (releaseActionsError && "code" in releaseActionsError) {
1225
- errorsArray.push({
1226
- code: releaseActionsError.code
1227
- });
1228
- }
1229
- return /* @__PURE__ */ jsx(
1230
- Navigate,
1231
- {
1232
- to: "..",
1233
- state: {
1234
- errors: errorsArray
1235
- }
1236
- }
1237
- );
1238
- }
1239
- if (isError || !releaseActions) {
1240
- return /* @__PURE__ */ jsx(Page.Error, {});
1241
- }
1242
- if (Object.keys(releaseActions).length === 0) {
1243
- return /* @__PURE__ */ jsx(Layouts.Content, { children: /* @__PURE__ */ jsx(
1244
- EmptyStateLayout,
1245
- {
1246
- action: /* @__PURE__ */ jsx(
1247
- LinkButton,
1248
- {
1249
- tag: Link,
1250
- to: {
1251
- pathname: "/content-manager"
1252
- },
1253
- style: { textDecoration: "none" },
1254
- variant: "secondary",
1255
- children: formatMessage({
1256
- id: "content-releases.page.Details.button.openContentManager",
1257
- defaultMessage: "Open the Content Manager"
1258
- })
1259
- }
1260
- ),
1261
- icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "16rem" }),
1262
- content: formatMessage({
1263
- id: "content-releases.pages.Details.tab.emptyEntries",
1264
- defaultMessage: "This release is empty. Open the Content Manager, select an entry and add it to the release."
1265
- })
1266
- }
1267
- ) });
1268
- }
1269
- const groupByLabel = formatMessage({
1270
- id: "content-releases.pages.ReleaseDetails.groupBy.aria-label",
1271
- defaultMessage: "Group by"
1272
- });
1273
- const headers = [
1274
- ...displayedHeaders,
1275
- {
1276
- label: {
1277
- id: "content-releases.page.ReleaseDetails.table.header.label.content-type",
1278
- defaultMessage: "content-type"
1279
- },
1280
- name: "content-type"
1281
- },
1282
- {
1283
- label: {
1284
- id: "content-releases.page.ReleaseDetails.table.header.label.action",
1285
- defaultMessage: "action"
1286
- },
1287
- name: "action"
1288
- },
1289
- ...!release.releasedAt ? [
1290
- {
1291
- label: {
1292
- id: "content-releases.page.ReleaseDetails.table.header.label.status",
1293
- defaultMessage: "status"
1294
- },
1295
- name: "status"
1296
- }
1297
- ] : []
1298
- ];
1299
- const options = hasI18nEnabled ? GROUP_BY_OPTIONS : GROUP_BY_OPTIONS_NO_LOCALE;
1300
- return /* @__PURE__ */ jsx(Layouts.Content, { children: /* @__PURE__ */ jsxs(Flex, { gap: 8, direction: "column", alignItems: "stretch", children: [
1301
- /* @__PURE__ */ jsx(Flex, { children: /* @__PURE__ */ jsx(
1302
- SingleSelect,
1303
- {
1304
- placeholder: groupByLabel,
1305
- "aria-label": groupByLabel,
1306
- customizeContent: (value) => formatMessage(
1307
- {
1308
- id: `content-releases.pages.ReleaseDetails.groupBy.label`,
1309
- defaultMessage: `Group by {groupBy}`
1310
- },
1311
- {
1312
- groupBy: value
1313
- }
1314
- ),
1315
- value: formatMessage(getGroupByOptionLabel(selectedGroupBy)),
1316
- onChange: (value) => setQuery({ groupBy: value }),
1317
- children: options.map((option) => /* @__PURE__ */ jsx(SingleSelectOption, { value: option, children: formatMessage(getGroupByOptionLabel(option)) }, option))
1318
- }
1319
- ) }),
1320
- Object.keys(releaseActions).map((key) => /* @__PURE__ */ jsxs(Flex, { gap: 4, direction: "column", alignItems: "stretch", children: [
1321
- /* @__PURE__ */ jsx(Flex, { role: "separator", "aria-label": key, children: /* @__PURE__ */ jsx(Badge, { children: key }) }),
1322
- /* @__PURE__ */ jsx(
1323
- Table.Root,
1324
- {
1325
- rows: releaseActions[key].map((item) => ({
1326
- ...item,
1327
- id: Number(item.entry.id)
1328
- })),
1329
- headers,
1330
- isLoading: isLoading || isFetching,
1331
- children: /* @__PURE__ */ jsxs(Table.Content, { children: [
1332
- /* @__PURE__ */ jsx(Table.Head, { children: headers.map(({ label, name }) => /* @__PURE__ */ jsx(Table.HeaderCell, { label: formatMessage(label), name }, name)) }),
1333
- /* @__PURE__ */ jsx(Table.Loading, {}),
1334
- /* @__PURE__ */ jsx(Table.Body, { children: releaseActions[key].map(
1335
- ({ id, contentType, locale, type, entry, status }, actionIndex) => /* @__PURE__ */ jsxs(Tr, { children: [
1336
- /* @__PURE__ */ jsx(Td, { width: "25%", maxWidth: "200px", children: /* @__PURE__ */ jsx(Typography, { ellipsis: true, children: `${contentType.mainFieldValue || entry.id}` }) }),
1337
- hasI18nEnabled && /* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: `${locale?.name ? locale.name : "-"}` }) }),
1338
- /* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: contentType.displayName || "" }) }),
1339
- /* @__PURE__ */ jsx(Td, { width: "20%", children: release.releasedAt ? /* @__PURE__ */ jsx(Typography, { children: formatMessage(
1340
- {
1341
- id: "content-releases.page.ReleaseDetails.table.action-published",
1342
- defaultMessage: "This entry was <b>{isPublish, select, true {published} other {unpublished}}</b>."
1343
- },
1344
- {
1345
- isPublish: type === "publish",
1346
- b: (children) => /* @__PURE__ */ jsx(Typography, { fontWeight: "bold", children })
1347
- }
1348
- ) }) : /* @__PURE__ */ jsx(
1349
- ReleaseActionOptions,
1350
- {
1351
- selected: type,
1352
- handleChange: (e) => handleChangeType(e, id, [key, actionIndex]),
1353
- name: `release-action-${id}-type`,
1354
- disabled: !canUpdate
1355
- }
1356
- ) }),
1357
- !release.releasedAt && /* @__PURE__ */ jsxs(Fragment, { children: [
1358
- /* @__PURE__ */ jsx(Td, { width: "20%", minWidth: "200px", children: /* @__PURE__ */ jsx(
1359
- EntryValidationPopover,
1360
- {
1361
- action: type,
1362
- schema: contentTypes?.[contentType.uid],
1363
- entry,
1364
- status
1365
- }
1366
- ) }),
1367
- /* @__PURE__ */ jsx(Td, { children: /* @__PURE__ */ jsx(Flex, { justifyContent: "flex-end", children: /* @__PURE__ */ jsxs(ReleaseActionMenu.Root, { children: [
1368
- /* @__PURE__ */ jsx(
1369
- ReleaseActionMenu.ReleaseActionEntryLinkItem,
1370
- {
1371
- contentTypeUid: contentType.uid,
1372
- documentId: entry.documentId,
1373
- locale: locale?.code
1374
- }
1375
- ),
1376
- /* @__PURE__ */ jsx(
1377
- ReleaseActionMenu.DeleteReleaseActionItem,
1378
- {
1379
- releaseId: release.id,
1380
- actionId: id
1381
- }
1382
- )
1383
- ] }) }) })
1384
- ] })
1385
- ] }, id)
1386
- ) })
1387
- ] })
1388
- }
1389
- )
1390
- ] }, `releases-group-${key}`)),
1391
- /* @__PURE__ */ jsxs(
1392
- Pagination.Root,
1393
- {
1394
- ...releaseMeta?.pagination,
1395
- defaultPageSize: releaseMeta?.pagination?.pageSize,
1396
- children: [
1397
- /* @__PURE__ */ jsx(Pagination.PageSize, {}),
1398
- /* @__PURE__ */ jsx(Pagination.Links, {})
1399
- ]
1400
- }
1401
- )
1402
- ] }) });
1403
- };
1404
- const ReleaseDetailsPage = () => {
1405
- const { formatMessage } = useIntl();
1406
- const { releaseId } = useParams();
1407
- const { toggleNotification } = useNotification();
1408
- const { formatAPIError } = useAPIErrorHandler();
1409
- const navigate = useNavigate();
1410
- const [releaseModalShown, setReleaseModalShown] = React.useState(false);
1411
- const [showWarningSubmit, setWarningSubmit] = React.useState(false);
1412
- const {
1413
- isLoading: isLoadingDetails,
1414
- data,
1415
- isSuccess: isSuccessDetails
1416
- } = useGetReleaseQuery(
1417
- { id: releaseId },
1418
- {
1419
- skip: !releaseId
1420
- }
1421
- );
1422
- const { data: dataTimezone, isLoading: isLoadingTimezone } = useGetReleaseSettingsQuery();
1423
- const [updateRelease, { isLoading: isSubmittingForm }] = useUpdateReleaseMutation();
1424
- const [deleteRelease] = useDeleteReleaseMutation();
1425
- const toggleEditReleaseModal = () => {
1426
- setReleaseModalShown((prev) => !prev);
1427
- };
1428
- const getTimezoneValue = () => {
1429
- if (releaseData?.timezone) {
1430
- return releaseData.timezone;
1431
- } else {
1432
- if (dataTimezone?.data.defaultTimezone) {
1433
- return dataTimezone.data.defaultTimezone;
1434
- }
1435
- return null;
1436
- }
1437
- };
1438
- const toggleWarningSubmit = () => setWarningSubmit((prevState) => !prevState);
1439
- if (isLoadingDetails || isLoadingTimezone) {
1440
- return /* @__PURE__ */ jsx(
1441
- ReleaseDetailsLayout,
1442
- {
1443
- toggleEditReleaseModal,
1444
- toggleWarningSubmit,
1445
- children: /* @__PURE__ */ jsx(Page.Loading, {})
1446
- }
1447
- );
1448
- }
1449
- if (!releaseId) {
1450
- return /* @__PURE__ */ jsx(Navigate, { to: ".." });
1451
- }
1452
- const releaseData = isSuccessDetails && data?.data || null;
1453
- const title = releaseData?.name || "";
1454
- const timezone = getTimezoneValue();
1455
- const scheduledAt = releaseData?.scheduledAt && timezone ? utcToZonedTime(releaseData.scheduledAt, timezone) : null;
1456
- const date = scheduledAt ? format$1(scheduledAt, "yyyy-MM-dd") : void 0;
1457
- const time = scheduledAt ? format$1(scheduledAt, "HH:mm") : "";
1458
- const handleEditRelease = async (values) => {
1459
- const response = await updateRelease({
1460
- id: releaseId,
1461
- name: values.name,
1462
- scheduledAt: values.scheduledAt,
1463
- timezone: values.timezone
1464
- });
1465
- if ("data" in response) {
1466
- toggleNotification({
1467
- type: "success",
1468
- message: formatMessage({
1469
- id: "content-releases.modal.release-updated-notification-success",
1470
- defaultMessage: "Release updated."
1471
- })
1472
- });
1473
- toggleEditReleaseModal();
1474
- } else if (isFetchError(response.error)) {
1475
- toggleNotification({
1476
- type: "danger",
1477
- message: formatAPIError(response.error)
1478
- });
1479
- } else {
1480
- toggleNotification({
1481
- type: "danger",
1482
- message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
1483
- });
1484
- }
1485
- };
1486
- const handleDeleteRelease = async () => {
1487
- const response = await deleteRelease({
1488
- id: releaseId
1489
- });
1490
- if ("data" in response) {
1491
- navigate("..");
1492
- } else if (isFetchError(response.error)) {
1493
- toggleNotification({
1494
- type: "danger",
1495
- message: formatAPIError(response.error)
1496
- });
1497
- } else {
1498
- toggleNotification({
1499
- type: "danger",
1500
- message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
1501
- });
1502
- }
1503
- };
1504
- return /* @__PURE__ */ jsxs(
1505
- ReleaseDetailsLayout,
1506
- {
1507
- toggleEditReleaseModal,
1508
- toggleWarningSubmit,
1509
- children: [
1510
- /* @__PURE__ */ jsx(ReleaseDetailsBody, { releaseId }),
1511
- /* @__PURE__ */ jsx(
1512
- ReleaseModal,
1513
- {
1514
- open: releaseModalShown,
1515
- handleClose: toggleEditReleaseModal,
1516
- handleSubmit: handleEditRelease,
1517
- isLoading: isLoadingDetails || isSubmittingForm,
1518
- initialValues: {
1519
- name: title || "",
1520
- scheduledAt,
1521
- date,
1522
- time,
1523
- isScheduled: Boolean(scheduledAt),
1524
- timezone
1525
- }
1526
- }
1527
- ),
1528
- /* @__PURE__ */ jsx(Dialog.Root, { open: showWarningSubmit, onOpenChange: toggleWarningSubmit, children: /* @__PURE__ */ jsx(ConfirmDialog, { onConfirm: handleDeleteRelease, children: formatMessage({
1529
- id: "content-releases.dialog.confirmation-message",
1530
- defaultMessage: "Are you sure you want to delete this release?"
1531
- }) }) })
1532
- ]
1533
- }
1534
- );
1535
- };
1536
- const App = () => {
1537
- return /* @__PURE__ */ jsx(Page.Protect, { permissions: PERMISSIONS.main, children: /* @__PURE__ */ jsxs(Routes, { children: [
1538
- /* @__PURE__ */ jsx(Route, { index: true, element: /* @__PURE__ */ jsx(ReleasesPage, {}) }),
1539
- /* @__PURE__ */ jsx(Route, { path: ":releaseId", element: /* @__PURE__ */ jsx(ReleaseDetailsPage, {}) })
1540
- ] }) });
1541
- };
1542
- export {
1543
- App
1544
- };
1545
- //# sourceMappingURL=App-B7XAvv8M.mjs.map