@strapi/content-releases 0.0.0-next.9bff6e6b8e2a2c7445d3650f1b3459f1b0366db8 → 0.0.0-next.9c7149630dabd4c43f44cf68ed4ce6d7562607e8

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