@strapi/content-releases 0.0.0-experimental.d954d57341a6623992a0d211daaec8e245c3517d → 0.0.0-experimental.d9724d67b33363354d7171a9f2265e1c42485e13

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