@strapi/content-releases 0.0.0-next.c5f067b5650921187770124e9b6c8186e805e242 → 0.0.0-next.c72b48da735f44a3ccafb7a6dc9ba5213f3844db

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 (347) 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 +243 -0
  23. package/dist/admin/components/ReleaseActionMenu.js.map +1 -0
  24. package/dist/admin/components/ReleaseActionMenu.mjs +222 -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 +821 -0
  67. package/dist/admin/pages/ReleaseDetailsPage.js.map +1 -0
  68. package/dist/admin/pages/ReleaseDetailsPage.mjs +800 -0
  69. package/dist/admin/pages/ReleaseDetailsPage.mjs.map +1 -0
  70. package/dist/admin/pages/ReleasesPage.js +397 -0
  71. package/dist/admin/pages/ReleasesPage.js.map +1 -0
  72. package/dist/admin/pages/ReleasesPage.mjs +375 -0
  73. package/dist/admin/pages/ReleasesPage.mjs.map +1 -0
  74. package/dist/admin/pages/ReleasesSettingsPage.js +199 -0
  75. package/dist/admin/pages/ReleasesSettingsPage.js.map +1 -0
  76. package/dist/admin/pages/ReleasesSettingsPage.mjs +197 -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 -1161
  201. package/dist/server/index.js.map +1 -1
  202. package/dist/server/index.mjs +24 -1141
  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 +41 -40
  335. package/dist/_chunks/App-3ycH2d3s.mjs +0 -1062
  336. package/dist/_chunks/App-3ycH2d3s.mjs.map +0 -1
  337. package/dist/_chunks/App-5PsAyVt2.js +0 -1084
  338. package/dist/_chunks/App-5PsAyVt2.js.map +0 -1
  339. package/dist/_chunks/en-2DuPv5k0.js +0 -66
  340. package/dist/_chunks/en-2DuPv5k0.js.map +0 -1
  341. package/dist/_chunks/en-SOqjCdyh.mjs +0 -66
  342. package/dist/_chunks/en-SOqjCdyh.mjs.map +0 -1
  343. package/dist/_chunks/index-4gUWuCQV.mjs +0 -909
  344. package/dist/_chunks/index-4gUWuCQV.mjs.map +0 -1
  345. package/dist/_chunks/index-D57Rztnc.js +0 -930
  346. package/dist/_chunks/index-D57Rztnc.js.map +0 -1
  347. package/strapi-server.js +0 -3
@@ -1,1062 +0,0 @@
1
- import { jsxs, jsx, Fragment } from "react/jsx-runtime";
2
- import { useNotification, useAPIErrorHandler, LoadingIndicatorPage, ConfirmDialog, useRBAC, useTracking, RelativeTime, CheckPermissions, useQueryParams, AnErrorOccurred, NoContent, Table, PageSizeURLQuery, PaginationURLQuery, CheckPagePermissions } from "@strapi/helper-plugin";
3
- import { useLocation, useParams, useHistory, Redirect, Link as Link$1, Switch, Route } from "react-router-dom";
4
- import { p as pluginId, u as useGetReleaseQuery, a as useUpdateReleaseMutation, b as useDeleteReleaseMutation, c as usePublishReleaseMutation, P as PERMISSIONS, d as useTypedDispatch, e as useGetReleaseActionsQuery, f as useUpdateReleaseActionMutation, R as ReleaseActionOptions, g as ReleaseActionMenu, i as isAxiosError, r as releaseApi, h as useGetReleasesQuery, j as useCreateReleaseMutation } from "./index-4gUWuCQV.mjs";
5
- import * as React from "react";
6
- import { unstable_useDocument, useLicenseLimits } from "@strapi/admin/strapi-admin";
7
- import { ModalLayout, ModalHeader, Typography, ModalBody, TextInput, ModalFooter, Button, Flex, ContentLayout, Main, HeaderLayout, Link, IconButton, Popover, SingleSelect, SingleSelectOption, Badge, Tr, Td, Icon, Tooltip, Alert, TabGroup, Box, Tabs, Tab, Divider, TabPanels, TabPanel, EmptyStateLayout, Grid, GridItem } from "@strapi/design-system";
8
- import { LinkButton, Link as Link$2 } from "@strapi/design-system/v2";
9
- import { Pencil, Trash, ArrowLeft, More, CrossCircle, CheckCircle, Plus, EmptyDocuments } from "@strapi/icons";
10
- import { useIntl } from "react-intl";
11
- import styled from "styled-components";
12
- import { Formik, Form } from "formik";
13
- import * as yup from "yup";
14
- import "@reduxjs/toolkit/query";
15
- import "axios";
16
- import "@reduxjs/toolkit/query/react";
17
- import "react-redux";
18
- const RELEASE_SCHEMA = yup.object().shape({
19
- name: yup.string().trim().required()
20
- }).required().noUnknown();
21
- const ReleaseModal = ({
22
- handleClose,
23
- handleSubmit,
24
- initialValues,
25
- isLoading = false
26
- }) => {
27
- const { formatMessage } = useIntl();
28
- const { pathname } = useLocation();
29
- const isCreatingRelease = pathname === `/plugins/${pluginId}`;
30
- return /* @__PURE__ */ jsxs(ModalLayout, { onClose: handleClose, labelledBy: "title", children: [
31
- /* @__PURE__ */ jsx(ModalHeader, { children: /* @__PURE__ */ jsx(Typography, { id: "title", fontWeight: "bold", textColor: "neutral800", children: formatMessage(
32
- {
33
- id: "content-releases.modal.title",
34
- defaultMessage: "{isCreatingRelease, select, true {New release} other {Edit release}}"
35
- },
36
- { isCreatingRelease }
37
- ) }) }),
38
- /* @__PURE__ */ jsx(
39
- Formik,
40
- {
41
- validateOnChange: false,
42
- onSubmit: handleSubmit,
43
- initialValues,
44
- validationSchema: RELEASE_SCHEMA,
45
- children: ({ values, errors, handleChange }) => /* @__PURE__ */ jsxs(Form, { children: [
46
- /* @__PURE__ */ jsx(ModalBody, { children: /* @__PURE__ */ jsx(
47
- TextInput,
48
- {
49
- label: formatMessage({
50
- id: "content-releases.modal.form.input.label.release-name",
51
- defaultMessage: "Name"
52
- }),
53
- name: "name",
54
- value: values.name,
55
- error: errors.name,
56
- onChange: handleChange,
57
- required: true
58
- }
59
- ) }),
60
- /* @__PURE__ */ jsx(
61
- ModalFooter,
62
- {
63
- startActions: /* @__PURE__ */ jsx(Button, { onClick: handleClose, variant: "tertiary", name: "cancel", children: formatMessage({ id: "cancel", defaultMessage: "Cancel" }) }),
64
- endActions: /* @__PURE__ */ jsx(
65
- Button,
66
- {
67
- name: "submit",
68
- loading: isLoading,
69
- disabled: !values.name || values.name === initialValues.name,
70
- type: "submit",
71
- children: formatMessage(
72
- {
73
- id: "content-releases.modal.form.button.submit",
74
- defaultMessage: "{isCreatingRelease, select, true {Continue} other {Save}}"
75
- },
76
- { isCreatingRelease }
77
- )
78
- }
79
- )
80
- }
81
- )
82
- ] })
83
- }
84
- )
85
- ] });
86
- };
87
- const ReleaseInfoWrapper = styled(Flex)`
88
- align-self: stretch;
89
- border-bottom-right-radius: ${({ theme }) => theme.borderRadius};
90
- border-bottom-left-radius: ${({ theme }) => theme.borderRadius};
91
- border-top: 1px solid ${({ theme }) => theme.colors.neutral150};
92
- `;
93
- const StyledFlex = styled(Flex)`
94
- align-self: stretch;
95
- cursor: ${({ disabled }) => disabled ? "not-allowed" : "pointer"};
96
-
97
- svg path {
98
- fill: ${({ theme, disabled }) => disabled && theme.colors.neutral500};
99
- }
100
- span {
101
- color: ${({ theme, disabled }) => disabled && theme.colors.neutral500};
102
- }
103
- `;
104
- const PencilIcon = styled(Pencil)`
105
- width: ${({ theme }) => theme.spaces[4]};
106
- height: ${({ theme }) => theme.spaces[4]};
107
- path {
108
- fill: ${({ theme }) => theme.colors.neutral600};
109
- }
110
- `;
111
- const TrashIcon = styled(Trash)`
112
- width: ${({ theme }) => theme.spaces[4]};
113
- height: ${({ theme }) => theme.spaces[4]};
114
- path {
115
- fill: ${({ theme }) => theme.colors.danger600};
116
- }
117
- `;
118
- const TypographyMaxWidth = styled(Typography)`
119
- max-width: 300px;
120
- `;
121
- const PopoverButton = ({ onClick, disabled, children }) => {
122
- return /* @__PURE__ */ jsx(
123
- StyledFlex,
124
- {
125
- paddingTop: 2,
126
- paddingBottom: 2,
127
- paddingLeft: 4,
128
- paddingRight: 4,
129
- alignItems: "center",
130
- gap: 2,
131
- as: "button",
132
- hasRadius: true,
133
- onClick,
134
- disabled,
135
- children
136
- }
137
- );
138
- };
139
- const EntryValidationText = ({ action, schema, components, entry }) => {
140
- const { formatMessage } = useIntl();
141
- const { validate } = unstable_useDocument();
142
- const { errors } = validate(entry, {
143
- contentType: schema,
144
- components,
145
- isCreatingEntry: false
146
- });
147
- if (Object.keys(errors).length > 0) {
148
- const validationErrorsMessages = Object.entries(errors).map(
149
- ([key, value]) => formatMessage(
150
- { id: `${value.id}.withField`, defaultMessage: value.defaultMessage },
151
- { field: key }
152
- )
153
- ).join(" ");
154
- return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
155
- /* @__PURE__ */ jsx(Icon, { color: "danger600", as: CrossCircle }),
156
- /* @__PURE__ */ jsx(Tooltip, { description: validationErrorsMessages, children: /* @__PURE__ */ jsx(TypographyMaxWidth, { textColor: "danger600", variant: "omega", fontWeight: "semiBold", ellipsis: true, children: validationErrorsMessages }) })
157
- ] });
158
- }
159
- if (action == "publish") {
160
- return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
161
- /* @__PURE__ */ jsx(Icon, { color: "success600", as: CheckCircle }),
162
- entry.publishedAt ? /* @__PURE__ */ jsx(Typography, { textColor: "success600", fontWeight: "bold", children: formatMessage({
163
- id: "content-releases.pages.ReleaseDetails.entry-validation.already-published",
164
- defaultMessage: "Already published"
165
- }) }) : /* @__PURE__ */ jsx(Typography, { children: formatMessage({
166
- id: "content-releases.pages.ReleaseDetails.entry-validation.ready-to-publish",
167
- defaultMessage: "Ready to publish"
168
- }) })
169
- ] });
170
- }
171
- return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
172
- /* @__PURE__ */ jsx(Icon, { color: "success600", as: CheckCircle }),
173
- !entry.publishedAt ? /* @__PURE__ */ jsx(Typography, { textColor: "success600", fontWeight: "bold", children: formatMessage({
174
- id: "content-releases.pages.ReleaseDetails.entry-validation.already-unpublished",
175
- defaultMessage: "Already unpublished"
176
- }) }) : /* @__PURE__ */ jsx(Typography, { children: formatMessage({
177
- id: "content-releases.pages.ReleaseDetails.entry-validation.ready-to-unpublish",
178
- defaultMessage: "Ready to unpublish"
179
- }) })
180
- ] });
181
- };
182
- const ReleaseDetailsLayout = ({
183
- toggleEditReleaseModal,
184
- toggleWarningSubmit,
185
- children
186
- }) => {
187
- const { formatMessage } = useIntl();
188
- const { releaseId } = useParams();
189
- const [isPopoverVisible, setIsPopoverVisible] = React.useState(false);
190
- const moreButtonRef = React.useRef(null);
191
- const {
192
- data,
193
- isLoading: isLoadingDetails,
194
- isError,
195
- error
196
- } = useGetReleaseQuery({ id: releaseId });
197
- const [publishRelease, { isLoading: isPublishing }] = usePublishReleaseMutation();
198
- const toggleNotification = useNotification();
199
- const { formatAPIError } = useAPIErrorHandler();
200
- const {
201
- allowedActions: { canUpdate, canDelete }
202
- } = useRBAC(PERMISSIONS);
203
- const dispatch = useTypedDispatch();
204
- const { trackUsage } = useTracking();
205
- const release = data?.data;
206
- const handleTogglePopover = () => {
207
- setIsPopoverVisible((prev) => !prev);
208
- };
209
- const openReleaseModal = () => {
210
- toggleEditReleaseModal();
211
- handleTogglePopover();
212
- };
213
- const handlePublishRelease = async () => {
214
- const response = await publishRelease({ id: releaseId });
215
- if ("data" in response) {
216
- toggleNotification({
217
- type: "success",
218
- message: formatMessage({
219
- id: "content-releases.pages.ReleaseDetails.publish-notification-success",
220
- defaultMessage: "Release was published successfully."
221
- })
222
- });
223
- const { totalEntries: totalEntries2, totalPublishedEntries, totalUnpublishedEntries } = response.data.meta;
224
- trackUsage("didPublishRelease", {
225
- totalEntries: totalEntries2,
226
- totalPublishedEntries,
227
- totalUnpublishedEntries
228
- });
229
- } else if (isAxiosError(response.error)) {
230
- toggleNotification({
231
- type: "warning",
232
- message: formatAPIError(response.error)
233
- });
234
- } else {
235
- toggleNotification({
236
- type: "warning",
237
- message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
238
- });
239
- }
240
- };
241
- const openWarningConfirmDialog = () => {
242
- toggleWarningSubmit();
243
- handleTogglePopover();
244
- };
245
- const handleRefresh = () => {
246
- dispatch(releaseApi.util.invalidateTags([{ type: "ReleaseAction", id: "LIST" }]));
247
- };
248
- if (isLoadingDetails) {
249
- return /* @__PURE__ */ jsx(Main, { "aria-busy": isLoadingDetails, children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) });
250
- }
251
- if (isError || !release) {
252
- return /* @__PURE__ */ jsx(
253
- Redirect,
254
- {
255
- to: {
256
- pathname: "/plugins/content-releases",
257
- state: {
258
- errors: [
259
- {
260
- code: error?.code
261
- }
262
- ]
263
- }
264
- }
265
- }
266
- );
267
- }
268
- const totalEntries = release.actions.meta.count || 0;
269
- const createdBy = release.createdBy.lastname ? `${release.createdBy.firstname} ${release.createdBy.lastname}` : `${release.createdBy.firstname}`;
270
- return /* @__PURE__ */ jsxs(Main, { "aria-busy": isLoadingDetails, children: [
271
- /* @__PURE__ */ jsx(
272
- HeaderLayout,
273
- {
274
- title: release.name,
275
- subtitle: formatMessage(
276
- {
277
- id: "content-releases.pages.Details.header-subtitle",
278
- defaultMessage: "{number, plural, =0 {No entries} one {# entry} other {# entries}}"
279
- },
280
- { number: totalEntries }
281
- ),
282
- navigationAction: /* @__PURE__ */ jsx(Link, { startIcon: /* @__PURE__ */ jsx(ArrowLeft, {}), to: "/plugins/content-releases", children: formatMessage({
283
- id: "global.back",
284
- defaultMessage: "Back"
285
- }) }),
286
- primaryAction: !release.releasedAt && /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
287
- /* @__PURE__ */ jsx(
288
- IconButton,
289
- {
290
- label: formatMessage({
291
- id: "content-releases.header.actions.open-release-actions",
292
- defaultMessage: "Release actions"
293
- }),
294
- ref: moreButtonRef,
295
- onClick: handleTogglePopover,
296
- children: /* @__PURE__ */ jsx(More, {})
297
- }
298
- ),
299
- isPopoverVisible && /* @__PURE__ */ jsxs(
300
- Popover,
301
- {
302
- source: moreButtonRef,
303
- placement: "bottom-end",
304
- onDismiss: handleTogglePopover,
305
- spacing: 4,
306
- minWidth: "242px",
307
- children: [
308
- /* @__PURE__ */ jsxs(Flex, { alignItems: "center", justifyContent: "center", direction: "column", padding: 1, children: [
309
- /* @__PURE__ */ jsxs(PopoverButton, { disabled: !canUpdate, onClick: openReleaseModal, children: [
310
- /* @__PURE__ */ jsx(PencilIcon, {}),
311
- /* @__PURE__ */ jsx(Typography, { ellipsis: true, children: formatMessage({
312
- id: "content-releases.header.actions.edit",
313
- defaultMessage: "Edit"
314
- }) })
315
- ] }),
316
- /* @__PURE__ */ jsxs(PopoverButton, { disabled: !canDelete, onClick: openWarningConfirmDialog, children: [
317
- /* @__PURE__ */ jsx(TrashIcon, {}),
318
- /* @__PURE__ */ jsx(Typography, { ellipsis: true, textColor: "danger600", children: formatMessage({
319
- id: "content-releases.header.actions.delete",
320
- defaultMessage: "Delete"
321
- }) })
322
- ] })
323
- ] }),
324
- /* @__PURE__ */ jsxs(
325
- ReleaseInfoWrapper,
326
- {
327
- direction: "column",
328
- justifyContent: "center",
329
- alignItems: "flex-start",
330
- gap: 1,
331
- padding: 5,
332
- children: [
333
- /* @__PURE__ */ jsx(Typography, { variant: "pi", fontWeight: "bold", children: formatMessage({
334
- id: "content-releases.header.actions.created",
335
- defaultMessage: "Created"
336
- }) }),
337
- /* @__PURE__ */ jsxs(Typography, { variant: "pi", color: "neutral300", children: [
338
- /* @__PURE__ */ jsx(RelativeTime, { timestamp: new Date(release.createdAt) }),
339
- formatMessage(
340
- {
341
- id: "content-releases.header.actions.created.description",
342
- defaultMessage: " by {createdBy}"
343
- },
344
- { createdBy }
345
- )
346
- ] })
347
- ]
348
- }
349
- )
350
- ]
351
- }
352
- ),
353
- /* @__PURE__ */ jsx(Button, { size: "S", variant: "tertiary", onClick: handleRefresh, children: formatMessage({
354
- id: "content-releases.header.actions.refresh",
355
- defaultMessage: "Refresh"
356
- }) }),
357
- /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.publish, children: /* @__PURE__ */ jsx(
358
- Button,
359
- {
360
- size: "S",
361
- variant: "default",
362
- onClick: handlePublishRelease,
363
- loading: isPublishing,
364
- disabled: release.actions.meta.count === 0,
365
- children: formatMessage({
366
- id: "content-releases.header.actions.publish",
367
- defaultMessage: "Publish"
368
- })
369
- }
370
- ) })
371
- ] })
372
- }
373
- ),
374
- children
375
- ] });
376
- };
377
- const GROUP_BY_OPTIONS = ["contentType", "locale", "action"];
378
- const getGroupByOptionLabel = (value) => {
379
- if (value === "locale") {
380
- return {
381
- id: "content-releases.pages.ReleaseDetails.groupBy.option.locales",
382
- defaultMessage: "Locales"
383
- };
384
- }
385
- if (value === "action") {
386
- return {
387
- id: "content-releases.pages.ReleaseDetails.groupBy.option.actions",
388
- defaultMessage: "Actions"
389
- };
390
- }
391
- return {
392
- id: "content-releases.pages.ReleaseDetails.groupBy.option.content-type",
393
- defaultMessage: "Content-Types"
394
- };
395
- };
396
- const ReleaseDetailsBody = () => {
397
- const { formatMessage } = useIntl();
398
- const { releaseId } = useParams();
399
- const [{ query }, setQuery] = useQueryParams();
400
- const toggleNotification = useNotification();
401
- const { formatAPIError } = useAPIErrorHandler();
402
- const {
403
- data: releaseData,
404
- isLoading: isReleaseLoading,
405
- isError: isReleaseError,
406
- error: releaseError
407
- } = useGetReleaseQuery({ id: releaseId });
408
- const release = releaseData?.data;
409
- const selectedGroupBy = query?.groupBy || "contentType";
410
- const {
411
- isLoading,
412
- isFetching,
413
- isError,
414
- data,
415
- error: releaseActionsError
416
- } = useGetReleaseActionsQuery({
417
- ...query,
418
- releaseId
419
- });
420
- const [updateReleaseAction] = useUpdateReleaseActionMutation();
421
- const handleChangeType = async (e, actionId, actionPath) => {
422
- const response = await updateReleaseAction({
423
- params: {
424
- releaseId,
425
- actionId
426
- },
427
- body: {
428
- type: e.target.value
429
- },
430
- query,
431
- // We are passing the query params to make optimistic updates
432
- actionPath
433
- // We are passing the action path to found the position in the cache of the action for optimistic updates
434
- });
435
- if ("error" in response) {
436
- if (isAxiosError(response.error)) {
437
- toggleNotification({
438
- type: "warning",
439
- message: formatAPIError(response.error)
440
- });
441
- } else {
442
- toggleNotification({
443
- type: "warning",
444
- message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
445
- });
446
- }
447
- }
448
- };
449
- if (isLoading || isReleaseLoading) {
450
- return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) });
451
- }
452
- const releaseActions = data?.data;
453
- const releaseMeta = data?.meta;
454
- const contentTypes = releaseMeta?.contentTypes || {};
455
- const components = releaseMeta?.components || {};
456
- if (isReleaseError || !release) {
457
- const errorsArray = [];
458
- if (releaseError) {
459
- errorsArray.push({
460
- code: releaseError.code
461
- });
462
- }
463
- if (releaseActionsError) {
464
- errorsArray.push({
465
- code: releaseActionsError.code
466
- });
467
- }
468
- return /* @__PURE__ */ jsx(
469
- Redirect,
470
- {
471
- to: {
472
- pathname: "/plugins/content-releases",
473
- state: {
474
- errors: errorsArray
475
- }
476
- }
477
- }
478
- );
479
- }
480
- if (isError || !releaseActions) {
481
- return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(AnErrorOccurred, {}) });
482
- }
483
- if (Object.keys(releaseActions).length === 0) {
484
- return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(
485
- NoContent,
486
- {
487
- content: {
488
- id: "content-releases.pages.Details.tab.emptyEntries",
489
- defaultMessage: "This release is empty. Open the Content Manager, select an entry and add it to the release."
490
- },
491
- action: /* @__PURE__ */ jsx(
492
- LinkButton,
493
- {
494
- as: Link$1,
495
- to: {
496
- pathname: "/content-manager"
497
- },
498
- style: { textDecoration: "none" },
499
- variant: "secondary",
500
- children: formatMessage({
501
- id: "content-releases.page.Details.button.openContentManager",
502
- defaultMessage: "Open the Content Manager"
503
- })
504
- }
505
- )
506
- }
507
- ) });
508
- }
509
- return /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsxs(Flex, { gap: 8, direction: "column", alignItems: "stretch", children: [
510
- /* @__PURE__ */ jsx(Flex, { children: /* @__PURE__ */ jsx(
511
- SingleSelect,
512
- {
513
- "aria-label": formatMessage({
514
- id: "content-releases.pages.ReleaseDetails.groupBy.label",
515
- defaultMessage: "Group by"
516
- }),
517
- customizeContent: (value) => formatMessage(
518
- {
519
- id: `content-releases.pages.ReleaseDetails.groupBy.label`,
520
- defaultMessage: `Group by {groupBy}`
521
- },
522
- {
523
- groupBy: value
524
- }
525
- ),
526
- value: formatMessage(getGroupByOptionLabel(selectedGroupBy)),
527
- onChange: (value) => setQuery({ groupBy: value }),
528
- children: GROUP_BY_OPTIONS.map((option) => /* @__PURE__ */ jsx(SingleSelectOption, { value: option, children: formatMessage(getGroupByOptionLabel(option)) }, option))
529
- }
530
- ) }),
531
- Object.keys(releaseActions).map((key) => /* @__PURE__ */ jsxs(Flex, { gap: 4, direction: "column", alignItems: "stretch", children: [
532
- /* @__PURE__ */ jsx(Flex, { children: /* @__PURE__ */ jsx(Badge, { children: key }) }),
533
- /* @__PURE__ */ jsx(
534
- Table.Root,
535
- {
536
- rows: releaseActions[key].map((item) => ({
537
- ...item,
538
- id: Number(item.entry.id)
539
- })),
540
- colCount: releaseActions[key].length,
541
- isLoading,
542
- isFetching,
543
- children: /* @__PURE__ */ jsxs(Table.Content, { children: [
544
- /* @__PURE__ */ jsxs(Table.Head, { children: [
545
- /* @__PURE__ */ jsx(
546
- Table.HeaderCell,
547
- {
548
- fieldSchemaType: "string",
549
- label: formatMessage({
550
- id: "content-releases.page.ReleaseDetails.table.header.label.name",
551
- defaultMessage: "name"
552
- }),
553
- name: "name"
554
- }
555
- ),
556
- /* @__PURE__ */ jsx(
557
- Table.HeaderCell,
558
- {
559
- fieldSchemaType: "string",
560
- label: formatMessage({
561
- id: "content-releases.page.ReleaseDetails.table.header.label.locale",
562
- defaultMessage: "locale"
563
- }),
564
- name: "locale"
565
- }
566
- ),
567
- /* @__PURE__ */ jsx(
568
- Table.HeaderCell,
569
- {
570
- fieldSchemaType: "string",
571
- label: formatMessage({
572
- id: "content-releases.page.ReleaseDetails.table.header.label.content-type",
573
- defaultMessage: "content-type"
574
- }),
575
- name: "content-type"
576
- }
577
- ),
578
- /* @__PURE__ */ jsx(
579
- Table.HeaderCell,
580
- {
581
- fieldSchemaType: "string",
582
- label: formatMessage({
583
- id: "content-releases.page.ReleaseDetails.table.header.label.action",
584
- defaultMessage: "action"
585
- }),
586
- name: "action"
587
- }
588
- ),
589
- !release.releasedAt && /* @__PURE__ */ jsx(
590
- Table.HeaderCell,
591
- {
592
- fieldSchemaType: "string",
593
- label: formatMessage({
594
- id: "content-releases.page.ReleaseDetails.table.header.label.status",
595
- defaultMessage: "status"
596
- }),
597
- name: "status"
598
- }
599
- )
600
- ] }),
601
- /* @__PURE__ */ jsx(Table.LoadingBody, {}),
602
- /* @__PURE__ */ jsx(Table.Body, { children: releaseActions[key].map(
603
- ({ id, contentType, locale, type, entry }, actionIndex) => /* @__PURE__ */ jsxs(Tr, { children: [
604
- /* @__PURE__ */ jsx(Td, { width: "25%", maxWidth: "200px", children: /* @__PURE__ */ jsx(Typography, { ellipsis: true, children: `${contentType.mainFieldValue || entry.id}` }) }),
605
- /* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: `${locale?.name ? locale.name : "-"}` }) }),
606
- /* @__PURE__ */ jsx(Td, { width: "10%", children: /* @__PURE__ */ jsx(Typography, { children: contentType.displayName || "" }) }),
607
- /* @__PURE__ */ jsx(Td, { width: "20%", children: release.releasedAt ? /* @__PURE__ */ jsx(Typography, { children: formatMessage(
608
- {
609
- id: "content-releases.page.ReleaseDetails.table.action-published",
610
- defaultMessage: "This entry was <b>{isPublish, select, true {published} other {unpublished}}</b>."
611
- },
612
- {
613
- isPublish: type === "publish",
614
- b: (children) => /* @__PURE__ */ jsx(Typography, { fontWeight: "bold", children })
615
- }
616
- ) }) : /* @__PURE__ */ jsx(
617
- ReleaseActionOptions,
618
- {
619
- selected: type,
620
- handleChange: (e) => handleChangeType(e, id, [key, actionIndex]),
621
- name: `release-action-${id}-type`
622
- }
623
- ) }),
624
- !release.releasedAt && /* @__PURE__ */ jsxs(Fragment, { children: [
625
- /* @__PURE__ */ jsx(Td, { width: "20%", minWidth: "200px", children: /* @__PURE__ */ jsx(
626
- EntryValidationText,
627
- {
628
- action: type,
629
- schema: contentTypes?.[contentType.uid],
630
- components,
631
- entry
632
- }
633
- ) }),
634
- /* @__PURE__ */ jsx(Td, { children: /* @__PURE__ */ jsx(Flex, { justifyContent: "flex-end", children: /* @__PURE__ */ jsxs(ReleaseActionMenu.Root, { children: [
635
- /* @__PURE__ */ jsx(
636
- ReleaseActionMenu.ReleaseActionEntryLinkItem,
637
- {
638
- contentTypeUid: contentType.uid,
639
- entryId: entry.id,
640
- locale: locale?.code
641
- }
642
- ),
643
- /* @__PURE__ */ jsx(
644
- ReleaseActionMenu.DeleteReleaseActionItem,
645
- {
646
- releaseId: release.id,
647
- actionId: id
648
- }
649
- )
650
- ] }) }) })
651
- ] })
652
- ] }, id)
653
- ) })
654
- ] })
655
- }
656
- )
657
- ] }, `releases-group-${key}`)),
658
- /* @__PURE__ */ jsxs(Flex, { paddingTop: 4, alignItems: "flex-end", justifyContent: "space-between", children: [
659
- /* @__PURE__ */ jsx(PageSizeURLQuery, { defaultValue: releaseMeta?.pagination?.pageSize.toString() }),
660
- /* @__PURE__ */ jsx(
661
- PaginationURLQuery,
662
- {
663
- pagination: {
664
- pageCount: releaseMeta?.pagination?.pageCount || 0
665
- }
666
- }
667
- )
668
- ] })
669
- ] }) });
670
- };
671
- const ReleaseDetailsPage = () => {
672
- const { formatMessage } = useIntl();
673
- const { releaseId } = useParams();
674
- const toggleNotification = useNotification();
675
- const { formatAPIError } = useAPIErrorHandler();
676
- const { push } = useHistory();
677
- const [releaseModalShown, setReleaseModalShown] = React.useState(false);
678
- const [showWarningSubmit, setWarningSubmit] = React.useState(false);
679
- const {
680
- isLoading: isLoadingDetails,
681
- data,
682
- isSuccess: isSuccessDetails
683
- } = useGetReleaseQuery({ id: releaseId });
684
- const [updateRelease, { isLoading: isSubmittingForm }] = useUpdateReleaseMutation();
685
- const [deleteRelease, { isLoading: isDeletingRelease }] = useDeleteReleaseMutation();
686
- const toggleEditReleaseModal = () => {
687
- setReleaseModalShown((prev) => !prev);
688
- };
689
- const toggleWarningSubmit = () => setWarningSubmit((prevState) => !prevState);
690
- if (isLoadingDetails) {
691
- return /* @__PURE__ */ jsx(
692
- ReleaseDetailsLayout,
693
- {
694
- toggleEditReleaseModal,
695
- toggleWarningSubmit,
696
- children: /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) })
697
- }
698
- );
699
- }
700
- const title = isSuccessDetails && data?.data?.name || "";
701
- const handleEditRelease = async (values) => {
702
- const response = await updateRelease({
703
- id: releaseId,
704
- name: values.name
705
- });
706
- if ("data" in response) {
707
- toggleNotification({
708
- type: "success",
709
- message: formatMessage({
710
- id: "content-releases.modal.release-updated-notification-success",
711
- defaultMessage: "Release updated."
712
- })
713
- });
714
- } else if (isAxiosError(response.error)) {
715
- toggleNotification({
716
- type: "warning",
717
- message: formatAPIError(response.error)
718
- });
719
- } else {
720
- toggleNotification({
721
- type: "warning",
722
- message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
723
- });
724
- }
725
- toggleEditReleaseModal();
726
- };
727
- const handleDeleteRelease = async () => {
728
- const response = await deleteRelease({
729
- id: releaseId
730
- });
731
- if ("data" in response) {
732
- push("/plugins/content-releases");
733
- } else if (isAxiosError(response.error)) {
734
- toggleNotification({
735
- type: "warning",
736
- message: formatAPIError(response.error)
737
- });
738
- } else {
739
- toggleNotification({
740
- type: "warning",
741
- message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
742
- });
743
- }
744
- };
745
- return /* @__PURE__ */ jsxs(
746
- ReleaseDetailsLayout,
747
- {
748
- toggleEditReleaseModal,
749
- toggleWarningSubmit,
750
- children: [
751
- /* @__PURE__ */ jsx(ReleaseDetailsBody, {}),
752
- releaseModalShown && /* @__PURE__ */ jsx(
753
- ReleaseModal,
754
- {
755
- handleClose: toggleEditReleaseModal,
756
- handleSubmit: handleEditRelease,
757
- isLoading: isLoadingDetails || isSubmittingForm,
758
- initialValues: { name: title || "" }
759
- }
760
- ),
761
- /* @__PURE__ */ jsx(
762
- ConfirmDialog,
763
- {
764
- bodyText: {
765
- id: "content-releases.dialog.confirmation-message",
766
- defaultMessage: "Are you sure you want to delete this release?"
767
- },
768
- isOpen: showWarningSubmit,
769
- isConfirmButtonLoading: isDeletingRelease,
770
- onToggleDialog: toggleWarningSubmit,
771
- onConfirm: handleDeleteRelease
772
- }
773
- )
774
- ]
775
- }
776
- );
777
- };
778
- const LinkCard = styled(Link$2)`
779
- display: block;
780
- `;
781
- const ReleasesGrid = ({ sectionTitle, releases = [], isError = false }) => {
782
- const { formatMessage } = useIntl();
783
- if (isError) {
784
- return /* @__PURE__ */ jsx(AnErrorOccurred, {});
785
- }
786
- if (releases?.length === 0) {
787
- return /* @__PURE__ */ jsx(
788
- EmptyStateLayout,
789
- {
790
- content: formatMessage(
791
- {
792
- id: "content-releases.page.Releases.tab.emptyEntries",
793
- defaultMessage: "No releases"
794
- },
795
- {
796
- target: sectionTitle
797
- }
798
- ),
799
- icon: /* @__PURE__ */ jsx(EmptyDocuments, { width: "10rem" })
800
- }
801
- );
802
- }
803
- return /* @__PURE__ */ jsx(Grid, { gap: 4, children: releases.map(({ id, name, actions }) => /* @__PURE__ */ jsx(GridItem, { col: 3, s: 6, xs: 12, children: /* @__PURE__ */ jsx(LinkCard, { href: `content-releases/${id}`, isExternal: false, children: /* @__PURE__ */ jsxs(
804
- Flex,
805
- {
806
- direction: "column",
807
- justifyContent: "space-between",
808
- padding: 4,
809
- hasRadius: true,
810
- background: "neutral0",
811
- shadow: "tableShadow",
812
- height: "100%",
813
- width: "100%",
814
- alignItems: "start",
815
- gap: 2,
816
- children: [
817
- /* @__PURE__ */ jsx(Typography, { as: "h3", variant: "delta", fontWeight: "bold", children: name }),
818
- /* @__PURE__ */ jsx(Typography, { variant: "pi", children: formatMessage(
819
- {
820
- id: "content-releases.page.Releases.release-item.entries",
821
- defaultMessage: "{number, plural, =0 {No entries} one {# entry} other {# entries}}"
822
- },
823
- { number: actions.meta.count }
824
- ) })
825
- ]
826
- }
827
- ) }) }, id)) });
828
- };
829
- const StyledAlert = styled(Alert)`
830
- button {
831
- display: none;
832
- }
833
- p + div {
834
- margin-left: auto;
835
- }
836
- `;
837
- const INITIAL_FORM_VALUES = {
838
- name: ""
839
- };
840
- const ReleasesPage = () => {
841
- const tabRef = React.useRef(null);
842
- const location = useLocation();
843
- const [releaseModalShown, setReleaseModalShown] = React.useState(false);
844
- const toggleNotification = useNotification();
845
- const { formatMessage } = useIntl();
846
- const { push, replace } = useHistory();
847
- const { formatAPIError } = useAPIErrorHandler();
848
- const [{ query }, setQuery] = useQueryParams();
849
- const response = useGetReleasesQuery(query);
850
- const [createRelease, { isLoading: isSubmittingForm }] = useCreateReleaseMutation();
851
- const { getFeature } = useLicenseLimits();
852
- const { maximumReleases = 3 } = getFeature("cms-content-releases");
853
- const { trackUsage } = useTracking();
854
- const { isLoading, isSuccess, isError } = response;
855
- const activeTab = response?.currentData?.meta?.activeTab || "pending";
856
- const activeTabIndex = ["pending", "done"].indexOf(activeTab);
857
- React.useEffect(() => {
858
- if (location?.state?.errors) {
859
- toggleNotification({
860
- type: "warning",
861
- title: formatMessage({
862
- id: "content-releases.pages.Releases.notification.error.title",
863
- defaultMessage: "Your request could not be processed."
864
- }),
865
- message: formatMessage({
866
- id: "content-releases.pages.Releases.notification.error.message",
867
- defaultMessage: "Please try again or open another release."
868
- })
869
- });
870
- replace({ state: null });
871
- }
872
- }, [formatMessage, location?.state?.errors, replace, toggleNotification]);
873
- React.useEffect(() => {
874
- if (tabRef.current) {
875
- tabRef.current._handlers.setSelectedTabIndex(activeTabIndex);
876
- }
877
- }, [activeTabIndex]);
878
- const toggleAddReleaseModal = () => {
879
- setReleaseModalShown((prev) => !prev);
880
- };
881
- if (isLoading) {
882
- return /* @__PURE__ */ jsx(Main, { "aria-busy": isLoading, children: /* @__PURE__ */ jsx(LoadingIndicatorPage, {}) });
883
- }
884
- const totalReleases = isSuccess && response.currentData?.meta?.pagination?.total || 0;
885
- const hasReachedMaximumPendingReleases = totalReleases >= maximumReleases;
886
- const handleTabChange = (index) => {
887
- setQuery({
888
- ...query,
889
- page: 1,
890
- pageSize: response?.currentData?.meta?.pagination?.pageSize || 16,
891
- filters: {
892
- releasedAt: {
893
- $notNull: index === 0 ? false : true
894
- }
895
- }
896
- });
897
- };
898
- const handleAddRelease = async (values) => {
899
- const response2 = await createRelease({
900
- name: values.name
901
- });
902
- if ("data" in response2) {
903
- toggleNotification({
904
- type: "success",
905
- message: formatMessage({
906
- id: "content-releases.modal.release-created-notification-success",
907
- defaultMessage: "Release created."
908
- })
909
- });
910
- trackUsage("didCreateRelease");
911
- push(`/plugins/content-releases/${response2.data.data.id}`);
912
- } else if (isAxiosError(response2.error)) {
913
- toggleNotification({
914
- type: "warning",
915
- message: formatAPIError(response2.error)
916
- });
917
- } else {
918
- toggleNotification({
919
- type: "warning",
920
- message: formatMessage({ id: "notification.error", defaultMessage: "An error occurred" })
921
- });
922
- }
923
- };
924
- return /* @__PURE__ */ jsxs(Main, { "aria-busy": isLoading, children: [
925
- /* @__PURE__ */ jsx(
926
- HeaderLayout,
927
- {
928
- title: formatMessage({
929
- id: "content-releases.pages.Releases.title",
930
- defaultMessage: "Releases"
931
- }),
932
- subtitle: formatMessage(
933
- {
934
- id: "content-releases.pages.Releases.header-subtitle",
935
- defaultMessage: "{number, plural, =0 {No releases} one {# release} other {# releases}}"
936
- },
937
- { number: totalReleases }
938
- ),
939
- primaryAction: /* @__PURE__ */ jsx(CheckPermissions, { permissions: PERMISSIONS.create, children: /* @__PURE__ */ jsx(
940
- Button,
941
- {
942
- startIcon: /* @__PURE__ */ jsx(Plus, {}),
943
- onClick: toggleAddReleaseModal,
944
- disabled: hasReachedMaximumPendingReleases,
945
- children: formatMessage({
946
- id: "content-releases.header.actions.add-release",
947
- defaultMessage: "New release"
948
- })
949
- }
950
- ) })
951
- }
952
- ),
953
- /* @__PURE__ */ jsx(ContentLayout, { children: /* @__PURE__ */ jsxs(Fragment, { children: [
954
- activeTab === "pending" && hasReachedMaximumPendingReleases && /* @__PURE__ */ jsx(
955
- StyledAlert,
956
- {
957
- marginBottom: 6,
958
- action: /* @__PURE__ */ jsx(Link$2, { href: "https://strapi.io/pricing-cloud", isExternal: true, children: formatMessage({
959
- id: "content-releases.pages.Releases.max-limit-reached.action",
960
- defaultMessage: "Explore plans"
961
- }) }),
962
- title: formatMessage(
963
- {
964
- id: "content-releases.pages.Releases.max-limit-reached.title",
965
- defaultMessage: "You have reached the {number} pending {number, plural, one {release} other {releases}} limit."
966
- },
967
- { number: maximumReleases }
968
- ),
969
- onClose: () => {
970
- },
971
- closeLabel: "",
972
- children: formatMessage({
973
- id: "content-releases.pages.Releases.max-limit-reached.message",
974
- defaultMessage: "Upgrade to manage an unlimited number of releases."
975
- })
976
- }
977
- ),
978
- /* @__PURE__ */ jsxs(
979
- TabGroup,
980
- {
981
- label: formatMessage({
982
- id: "content-releases.pages.Releases.tab-group.label",
983
- defaultMessage: "Releases list"
984
- }),
985
- variant: "simple",
986
- initialSelectedTabIndex: activeTabIndex,
987
- onTabChange: handleTabChange,
988
- ref: tabRef,
989
- children: [
990
- /* @__PURE__ */ jsxs(Box, { paddingBottom: 8, children: [
991
- /* @__PURE__ */ jsxs(Tabs, { children: [
992
- /* @__PURE__ */ jsx(Tab, { children: formatMessage({
993
- id: "content-releases.pages.Releases.tab.pending",
994
- defaultMessage: "Pending"
995
- }) }),
996
- /* @__PURE__ */ jsx(Tab, { children: formatMessage({
997
- id: "content-releases.pages.Releases.tab.done",
998
- defaultMessage: "Done"
999
- }) })
1000
- ] }),
1001
- /* @__PURE__ */ jsx(Divider, {})
1002
- ] }),
1003
- /* @__PURE__ */ jsxs(TabPanels, { children: [
1004
- /* @__PURE__ */ jsx(TabPanel, { children: /* @__PURE__ */ jsx(
1005
- ReleasesGrid,
1006
- {
1007
- sectionTitle: "pending",
1008
- releases: response?.currentData?.data,
1009
- isError
1010
- }
1011
- ) }),
1012
- /* @__PURE__ */ jsx(TabPanel, { children: /* @__PURE__ */ jsx(
1013
- ReleasesGrid,
1014
- {
1015
- sectionTitle: "done",
1016
- releases: response?.currentData?.data,
1017
- isError
1018
- }
1019
- ) })
1020
- ] })
1021
- ]
1022
- }
1023
- ),
1024
- totalReleases > 0 && /* @__PURE__ */ jsxs(Flex, { paddingTop: 4, alignItems: "flex-end", justifyContent: "space-between", children: [
1025
- /* @__PURE__ */ jsx(
1026
- PageSizeURLQuery,
1027
- {
1028
- options: ["8", "16", "32", "64"],
1029
- defaultValue: response?.currentData?.meta?.pagination?.pageSize.toString()
1030
- }
1031
- ),
1032
- /* @__PURE__ */ jsx(
1033
- PaginationURLQuery,
1034
- {
1035
- pagination: {
1036
- pageCount: response?.currentData?.meta?.pagination?.pageCount || 0
1037
- }
1038
- }
1039
- )
1040
- ] })
1041
- ] }) }),
1042
- releaseModalShown && /* @__PURE__ */ jsx(
1043
- ReleaseModal,
1044
- {
1045
- handleClose: toggleAddReleaseModal,
1046
- handleSubmit: handleAddRelease,
1047
- isLoading: isSubmittingForm,
1048
- initialValues: INITIAL_FORM_VALUES
1049
- }
1050
- )
1051
- ] });
1052
- };
1053
- const App = () => {
1054
- return /* @__PURE__ */ jsx(CheckPagePermissions, { permissions: PERMISSIONS.main, children: /* @__PURE__ */ jsxs(Switch, { children: [
1055
- /* @__PURE__ */ jsx(Route, { exact: true, path: `/plugins/${pluginId}`, component: ReleasesPage }),
1056
- /* @__PURE__ */ jsx(Route, { exact: true, path: `/plugins/${pluginId}/:releaseId`, component: ReleaseDetailsPage })
1057
- ] }) });
1058
- };
1059
- export {
1060
- App
1061
- };
1062
- //# sourceMappingURL=App-3ycH2d3s.mjs.map