@akbarsafari00/bonyan-content-releases 5.52.1-fa.2

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 (397) hide show
  1. package/LICENSE +17 -0
  2. package/README.md +9 -0
  3. package/dist/admin/assets/purchase-page-illustration-dark.jpg.js +6 -0
  4. package/dist/admin/assets/purchase-page-illustration-dark.jpg.js.map +1 -0
  5. package/dist/admin/assets/purchase-page-illustration-dark.jpg.mjs +4 -0
  6. package/dist/admin/assets/purchase-page-illustration-dark.jpg.mjs.map +1 -0
  7. package/dist/admin/assets/purchase-page-illustration-light.jpg.js +6 -0
  8. package/dist/admin/assets/purchase-page-illustration-light.jpg.js.map +1 -0
  9. package/dist/admin/assets/purchase-page-illustration-light.jpg.mjs +4 -0
  10. package/dist/admin/assets/purchase-page-illustration-light.jpg.mjs.map +1 -0
  11. package/dist/admin/components/EntryValidationPopover.js +310 -0
  12. package/dist/admin/components/EntryValidationPopover.js.map +1 -0
  13. package/dist/admin/components/EntryValidationPopover.mjs +308 -0
  14. package/dist/admin/components/EntryValidationPopover.mjs.map +1 -0
  15. package/dist/admin/components/RelativeTime.js +77 -0
  16. package/dist/admin/components/RelativeTime.js.map +1 -0
  17. package/dist/admin/components/RelativeTime.mjs +55 -0
  18. package/dist/admin/components/RelativeTime.mjs.map +1 -0
  19. package/dist/admin/components/ReleaseAction.js +203 -0
  20. package/dist/admin/components/ReleaseAction.js.map +1 -0
  21. package/dist/admin/components/ReleaseAction.mjs +201 -0
  22. package/dist/admin/components/ReleaseAction.mjs.map +1 -0
  23. package/dist/admin/components/ReleaseActionMenu.js +194 -0
  24. package/dist/admin/components/ReleaseActionMenu.js.map +1 -0
  25. package/dist/admin/components/ReleaseActionMenu.mjs +172 -0
  26. package/dist/admin/components/ReleaseActionMenu.mjs.map +1 -0
  27. package/dist/admin/components/ReleaseActionModal.js +269 -0
  28. package/dist/admin/components/ReleaseActionModal.js.map +1 -0
  29. package/dist/admin/components/ReleaseActionModal.mjs +244 -0
  30. package/dist/admin/components/ReleaseActionModal.mjs.map +1 -0
  31. package/dist/admin/components/ReleaseActionOptions.js +104 -0
  32. package/dist/admin/components/ReleaseActionOptions.js.map +1 -0
  33. package/dist/admin/components/ReleaseActionOptions.mjs +102 -0
  34. package/dist/admin/components/ReleaseActionOptions.mjs.map +1 -0
  35. package/dist/admin/components/ReleaseListCell.js +109 -0
  36. package/dist/admin/components/ReleaseListCell.js.map +1 -0
  37. package/dist/admin/components/ReleaseListCell.mjs +106 -0
  38. package/dist/admin/components/ReleaseListCell.mjs.map +1 -0
  39. package/dist/admin/components/ReleaseModal.js +332 -0
  40. package/dist/admin/components/ReleaseModal.js.map +1 -0
  41. package/dist/admin/components/ReleaseModal.mjs +310 -0
  42. package/dist/admin/components/ReleaseModal.mjs.map +1 -0
  43. package/dist/admin/components/ReleasesPanel.js +138 -0
  44. package/dist/admin/components/ReleasesPanel.js.map +1 -0
  45. package/dist/admin/components/ReleasesPanel.mjs +136 -0
  46. package/dist/admin/components/ReleasesPanel.mjs.map +1 -0
  47. package/dist/admin/components/Widgets.js +122 -0
  48. package/dist/admin/components/Widgets.js.map +1 -0
  49. package/dist/admin/components/Widgets.mjs +120 -0
  50. package/dist/admin/components/Widgets.mjs.map +1 -0
  51. package/dist/admin/constants.js +79 -0
  52. package/dist/admin/constants.js.map +1 -0
  53. package/dist/admin/constants.mjs +76 -0
  54. package/dist/admin/constants.mjs.map +1 -0
  55. package/dist/admin/index.js +155 -0
  56. package/dist/admin/index.js.map +1 -0
  57. package/dist/admin/index.mjs +151 -0
  58. package/dist/admin/index.mjs.map +1 -0
  59. package/dist/admin/modules/hooks.js +8 -0
  60. package/dist/admin/modules/hooks.js.map +1 -0
  61. package/dist/admin/modules/hooks.mjs +6 -0
  62. package/dist/admin/modules/hooks.mjs.map +1 -0
  63. package/dist/admin/pages/App.js +29 -0
  64. package/dist/admin/pages/App.js.map +1 -0
  65. package/dist/admin/pages/App.mjs +27 -0
  66. package/dist/admin/pages/App.mjs.map +1 -0
  67. package/dist/admin/pages/PurchaseContentReleases.js +192 -0
  68. package/dist/admin/pages/PurchaseContentReleases.js.map +1 -0
  69. package/dist/admin/pages/PurchaseContentReleases.mjs +190 -0
  70. package/dist/admin/pages/PurchaseContentReleases.mjs.map +1 -0
  71. package/dist/admin/pages/ReleaseDetailsPage.js +780 -0
  72. package/dist/admin/pages/ReleaseDetailsPage.js.map +1 -0
  73. package/dist/admin/pages/ReleaseDetailsPage.mjs +755 -0
  74. package/dist/admin/pages/ReleaseDetailsPage.mjs.map +1 -0
  75. package/dist/admin/pages/ReleasesPage.js +407 -0
  76. package/dist/admin/pages/ReleasesPage.js.map +1 -0
  77. package/dist/admin/pages/ReleasesPage.mjs +384 -0
  78. package/dist/admin/pages/ReleasesPage.mjs.map +1 -0
  79. package/dist/admin/pages/ReleasesSettingsPage.js +226 -0
  80. package/dist/admin/pages/ReleasesSettingsPage.js.map +1 -0
  81. package/dist/admin/pages/ReleasesSettingsPage.mjs +224 -0
  82. package/dist/admin/pages/ReleasesSettingsPage.mjs.map +1 -0
  83. package/dist/admin/pluginId.js +6 -0
  84. package/dist/admin/pluginId.js.map +1 -0
  85. package/dist/admin/pluginId.mjs +4 -0
  86. package/dist/admin/pluginId.mjs.map +1 -0
  87. package/dist/admin/services/homepage.js +24 -0
  88. package/dist/admin/services/homepage.js.map +1 -0
  89. package/dist/admin/services/homepage.mjs +22 -0
  90. package/dist/admin/services/homepage.mjs.map +1 -0
  91. package/dist/admin/services/release.js +473 -0
  92. package/dist/admin/services/release.js.map +1 -0
  93. package/dist/admin/services/release.mjs +456 -0
  94. package/dist/admin/services/release.mjs.map +1 -0
  95. package/dist/admin/src/components/EntryValidationPopover.d.ts +13 -0
  96. package/dist/admin/src/components/RelativeTime.d.ts +28 -0
  97. package/dist/admin/src/components/ReleaseAction.d.ts +3 -0
  98. package/dist/admin/src/components/ReleaseActionMenu.d.ts +26 -0
  99. package/dist/admin/src/components/ReleaseActionModal.d.ts +24 -0
  100. package/dist/admin/src/components/ReleaseActionOptions.d.ts +9 -0
  101. package/dist/admin/src/components/ReleaseListCell.d.ts +28 -0
  102. package/dist/admin/src/components/ReleaseModal.d.ts +17 -0
  103. package/dist/admin/src/components/ReleasesPanel.d.ts +3 -0
  104. package/dist/admin/src/components/Widgets.d.ts +2 -0
  105. package/dist/admin/src/constants.d.ts +77 -0
  106. package/dist/admin/src/index.d.ts +3 -0
  107. package/dist/admin/src/modules/hooks.d.ts +7 -0
  108. package/dist/admin/src/pages/App.d.ts +1 -0
  109. package/dist/admin/src/pages/PurchaseContentReleases.d.ts +2 -0
  110. package/dist/admin/src/pages/ReleaseDetailsPage.d.ts +2 -0
  111. package/dist/admin/src/pages/ReleasesPage.d.ts +8 -0
  112. package/dist/admin/src/pages/ReleasesSettingsPage.d.ts +1 -0
  113. package/dist/admin/src/pages/tests/mockReleaseDetailsPageData.d.ts +181 -0
  114. package/dist/admin/src/pages/tests/mockReleasesPageData.d.ts +39 -0
  115. package/dist/admin/src/pluginId.d.ts +1 -0
  116. package/dist/admin/src/services/homepage.d.ts +9 -0
  117. package/dist/admin/src/services/release.d.ts +112 -0
  118. package/dist/admin/src/store/hooks.d.ts +7 -0
  119. package/dist/admin/src/utils/api.d.ts +6 -0
  120. package/dist/admin/src/utils/prefixPluginTranslations.d.ts +3 -0
  121. package/dist/admin/src/utils/time.d.ts +10 -0
  122. package/dist/admin/src/validation/schemas.d.ts +6 -0
  123. package/dist/admin/store/hooks.js +8 -0
  124. package/dist/admin/store/hooks.js.map +1 -0
  125. package/dist/admin/store/hooks.mjs +6 -0
  126. package/dist/admin/store/hooks.mjs.map +1 -0
  127. package/dist/admin/translations/cs.json.js +111 -0
  128. package/dist/admin/translations/cs.json.js.map +1 -0
  129. package/dist/admin/translations/cs.json.mjs +109 -0
  130. package/dist/admin/translations/cs.json.mjs.map +1 -0
  131. package/dist/admin/translations/en.json.js +111 -0
  132. package/dist/admin/translations/en.json.js.map +1 -0
  133. package/dist/admin/translations/en.json.mjs +109 -0
  134. package/dist/admin/translations/en.json.mjs.map +1 -0
  135. package/dist/admin/translations/es.json.js +103 -0
  136. package/dist/admin/translations/es.json.js.map +1 -0
  137. package/dist/admin/translations/es.json.mjs +101 -0
  138. package/dist/admin/translations/es.json.mjs.map +1 -0
  139. package/dist/admin/translations/fa.json.js +111 -0
  140. package/dist/admin/translations/fa.json.js.map +1 -0
  141. package/dist/admin/translations/fa.json.mjs +109 -0
  142. package/dist/admin/translations/fa.json.mjs.map +1 -0
  143. package/dist/admin/translations/ja.json.js +111 -0
  144. package/dist/admin/translations/ja.json.js.map +1 -0
  145. package/dist/admin/translations/ja.json.mjs +109 -0
  146. package/dist/admin/translations/ja.json.mjs.map +1 -0
  147. package/dist/admin/translations/ko.json.js +111 -0
  148. package/dist/admin/translations/ko.json.js.map +1 -0
  149. package/dist/admin/translations/ko.json.mjs +109 -0
  150. package/dist/admin/translations/ko.json.mjs.map +1 -0
  151. package/dist/admin/translations/nl.json.js +111 -0
  152. package/dist/admin/translations/nl.json.js.map +1 -0
  153. package/dist/admin/translations/nl.json.mjs +109 -0
  154. package/dist/admin/translations/nl.json.mjs.map +1 -0
  155. package/dist/admin/translations/pl.json.js +111 -0
  156. package/dist/admin/translations/pl.json.js.map +1 -0
  157. package/dist/admin/translations/pl.json.mjs +109 -0
  158. package/dist/admin/translations/pl.json.mjs.map +1 -0
  159. package/dist/admin/translations/sk.json.js +111 -0
  160. package/dist/admin/translations/sk.json.js.map +1 -0
  161. package/dist/admin/translations/sk.json.mjs +109 -0
  162. package/dist/admin/translations/sk.json.mjs.map +1 -0
  163. package/dist/admin/translations/uk.json.js +103 -0
  164. package/dist/admin/translations/uk.json.js.map +1 -0
  165. package/dist/admin/translations/uk.json.mjs +101 -0
  166. package/dist/admin/translations/uk.json.mjs.map +1 -0
  167. package/dist/admin/utils/api.js +8 -0
  168. package/dist/admin/utils/api.js.map +1 -0
  169. package/dist/admin/utils/api.mjs +6 -0
  170. package/dist/admin/utils/api.mjs.map +1 -0
  171. package/dist/admin/utils/prefixPluginTranslations.js +11 -0
  172. package/dist/admin/utils/prefixPluginTranslations.js.map +1 -0
  173. package/dist/admin/utils/prefixPluginTranslations.mjs +9 -0
  174. package/dist/admin/utils/prefixPluginTranslations.mjs.map +1 -0
  175. package/dist/admin/utils/time.js +42 -0
  176. package/dist/admin/utils/time.js.map +1 -0
  177. package/dist/admin/utils/time.mjs +39 -0
  178. package/dist/admin/utils/time.mjs.map +1 -0
  179. package/dist/admin/validation/schemas.js +66 -0
  180. package/dist/admin/validation/schemas.js.map +1 -0
  181. package/dist/admin/validation/schemas.mjs +43 -0
  182. package/dist/admin/validation/schemas.mjs.map +1 -0
  183. package/dist/server/bootstrap.js +68 -0
  184. package/dist/server/bootstrap.js.map +1 -0
  185. package/dist/server/bootstrap.mjs +66 -0
  186. package/dist/server/bootstrap.mjs.map +1 -0
  187. package/dist/server/constants.js +74 -0
  188. package/dist/server/constants.js.map +1 -0
  189. package/dist/server/constants.mjs +69 -0
  190. package/dist/server/constants.mjs.map +1 -0
  191. package/dist/server/content-types/index.js +12 -0
  192. package/dist/server/content-types/index.js.map +1 -0
  193. package/dist/server/content-types/index.mjs +10 -0
  194. package/dist/server/content-types/index.mjs.map +1 -0
  195. package/dist/server/content-types/release/index.js +10 -0
  196. package/dist/server/content-types/release/index.js.map +1 -0
  197. package/dist/server/content-types/release/index.mjs +8 -0
  198. package/dist/server/content-types/release/index.mjs.map +1 -0
  199. package/dist/server/content-types/release/schema.js +58 -0
  200. package/dist/server/content-types/release/schema.js.map +1 -0
  201. package/dist/server/content-types/release/schema.mjs +56 -0
  202. package/dist/server/content-types/release/schema.mjs.map +1 -0
  203. package/dist/server/content-types/release-action/index.js +10 -0
  204. package/dist/server/content-types/release-action/index.js.map +1 -0
  205. package/dist/server/content-types/release-action/index.mjs +8 -0
  206. package/dist/server/content-types/release-action/index.mjs.map +1 -0
  207. package/dist/server/content-types/release-action/schema.js +55 -0
  208. package/dist/server/content-types/release-action/schema.js.map +1 -0
  209. package/dist/server/content-types/release-action/schema.mjs +53 -0
  210. package/dist/server/content-types/release-action/schema.mjs.map +1 -0
  211. package/dist/server/controllers/homepage.js +15 -0
  212. package/dist/server/controllers/homepage.js.map +1 -0
  213. package/dist/server/controllers/homepage.mjs +13 -0
  214. package/dist/server/controllers/homepage.mjs.map +1 -0
  215. package/dist/server/controllers/index.js +16 -0
  216. package/dist/server/controllers/index.js.map +1 -0
  217. package/dist/server/controllers/index.mjs +14 -0
  218. package/dist/server/controllers/index.mjs.map +1 -0
  219. package/dist/server/controllers/release-action.js +150 -0
  220. package/dist/server/controllers/release-action.js.map +1 -0
  221. package/dist/server/controllers/release-action.mjs +148 -0
  222. package/dist/server/controllers/release-action.mjs.map +1 -0
  223. package/dist/server/controllers/release.js +302 -0
  224. package/dist/server/controllers/release.js.map +1 -0
  225. package/dist/server/controllers/release.mjs +300 -0
  226. package/dist/server/controllers/release.mjs.map +1 -0
  227. package/dist/server/controllers/settings.js +37 -0
  228. package/dist/server/controllers/settings.js.map +1 -0
  229. package/dist/server/controllers/settings.mjs +35 -0
  230. package/dist/server/controllers/settings.mjs.map +1 -0
  231. package/dist/server/controllers/validation/release-action.js +34 -0
  232. package/dist/server/controllers/validation/release-action.js.map +1 -0
  233. package/dist/server/controllers/validation/release-action.mjs +30 -0
  234. package/dist/server/controllers/validation/release-action.mjs.map +1 -0
  235. package/dist/server/controllers/validation/release.js +26 -0
  236. package/dist/server/controllers/validation/release.js.map +1 -0
  237. package/dist/server/controllers/validation/release.mjs +22 -0
  238. package/dist/server/controllers/validation/release.mjs.map +1 -0
  239. package/dist/server/controllers/validation/settings.js +33 -0
  240. package/dist/server/controllers/validation/settings.js.map +1 -0
  241. package/dist/server/controllers/validation/settings.mjs +10 -0
  242. package/dist/server/controllers/validation/settings.mjs.map +1 -0
  243. package/dist/server/destroy.js +15 -0
  244. package/dist/server/destroy.js.map +1 -0
  245. package/dist/server/destroy.mjs +13 -0
  246. package/dist/server/destroy.mjs.map +1 -0
  247. package/dist/server/index.js +33 -0
  248. package/dist/server/index.js.map +1 -0
  249. package/dist/server/index.mjs +31 -0
  250. package/dist/server/index.mjs.map +1 -0
  251. package/dist/server/middlewares/documents.js +104 -0
  252. package/dist/server/middlewares/documents.js.map +1 -0
  253. package/dist/server/middlewares/documents.mjs +101 -0
  254. package/dist/server/middlewares/documents.mjs.map +1 -0
  255. package/dist/server/migrations/database/5.0.0-document-id-in-actions.js +51 -0
  256. package/dist/server/migrations/database/5.0.0-document-id-in-actions.js.map +1 -0
  257. package/dist/server/migrations/database/5.0.0-document-id-in-actions.mjs +49 -0
  258. package/dist/server/migrations/database/5.0.0-document-id-in-actions.mjs.map +1 -0
  259. package/dist/server/migrations/index.js +209 -0
  260. package/dist/server/migrations/index.js.map +1 -0
  261. package/dist/server/migrations/index.mjs +198 -0
  262. package/dist/server/migrations/index.mjs.map +1 -0
  263. package/dist/server/register.js +23 -0
  264. package/dist/server/register.js.map +1 -0
  265. package/dist/server/register.mjs +21 -0
  266. package/dist/server/register.mjs.map +1 -0
  267. package/dist/server/routes/homepage.js +25 -0
  268. package/dist/server/routes/homepage.js.map +1 -0
  269. package/dist/server/routes/homepage.mjs +23 -0
  270. package/dist/server/routes/homepage.mjs.map +1 -0
  271. package/dist/server/routes/index.js +16 -0
  272. package/dist/server/routes/index.js.map +1 -0
  273. package/dist/server/routes/index.mjs +14 -0
  274. package/dist/server/routes/index.mjs.map +1 -0
  275. package/dist/server/routes/release-action.js +100 -0
  276. package/dist/server/routes/release-action.js.map +1 -0
  277. package/dist/server/routes/release-action.mjs +98 -0
  278. package/dist/server/routes/release-action.mjs.map +1 -0
  279. package/dist/server/routes/release.js +154 -0
  280. package/dist/server/routes/release.js.map +1 -0
  281. package/dist/server/routes/release.mjs +152 -0
  282. package/dist/server/routes/release.mjs.map +1 -0
  283. package/dist/server/routes/settings.js +46 -0
  284. package/dist/server/routes/settings.js.map +1 -0
  285. package/dist/server/routes/settings.mjs +44 -0
  286. package/dist/server/routes/settings.mjs.map +1 -0
  287. package/dist/server/services/homepage.js +31 -0
  288. package/dist/server/services/homepage.js.map +1 -0
  289. package/dist/server/services/homepage.mjs +29 -0
  290. package/dist/server/services/homepage.mjs.map +1 -0
  291. package/dist/server/services/index.js +20 -0
  292. package/dist/server/services/index.js.map +1 -0
  293. package/dist/server/services/index.mjs +18 -0
  294. package/dist/server/services/index.mjs.map +1 -0
  295. package/dist/server/services/release-action.js +328 -0
  296. package/dist/server/services/release-action.js.map +1 -0
  297. package/dist/server/services/release-action.mjs +322 -0
  298. package/dist/server/services/release-action.mjs.map +1 -0
  299. package/dist/server/services/release.js +337 -0
  300. package/dist/server/services/release.js.map +1 -0
  301. package/dist/server/services/release.mjs +335 -0
  302. package/dist/server/services/release.mjs.map +1 -0
  303. package/dist/server/services/scheduling.js +71 -0
  304. package/dist/server/services/scheduling.js.map +1 -0
  305. package/dist/server/services/scheduling.mjs +69 -0
  306. package/dist/server/services/scheduling.mjs.map +1 -0
  307. package/dist/server/services/settings.js +34 -0
  308. package/dist/server/services/settings.js.map +1 -0
  309. package/dist/server/services/settings.mjs +32 -0
  310. package/dist/server/services/settings.mjs.map +1 -0
  311. package/dist/server/services/validation.js +91 -0
  312. package/dist/server/services/validation.js.map +1 -0
  313. package/dist/server/services/validation.mjs +86 -0
  314. package/dist/server/services/validation.mjs.map +1 -0
  315. package/dist/server/src/bootstrap.d.ts +5 -0
  316. package/dist/server/src/bootstrap.d.ts.map +1 -0
  317. package/dist/server/src/constants.d.ts +21 -0
  318. package/dist/server/src/constants.d.ts.map +1 -0
  319. package/dist/server/src/content-types/index.d.ts +97 -0
  320. package/dist/server/src/content-types/index.d.ts.map +1 -0
  321. package/dist/server/src/content-types/release/index.d.ts +48 -0
  322. package/dist/server/src/content-types/release/index.d.ts.map +1 -0
  323. package/dist/server/src/content-types/release/schema.d.ts +47 -0
  324. package/dist/server/src/content-types/release/schema.d.ts.map +1 -0
  325. package/dist/server/src/content-types/release-action/index.d.ts +48 -0
  326. package/dist/server/src/content-types/release-action/index.d.ts.map +1 -0
  327. package/dist/server/src/content-types/release-action/schema.d.ts +47 -0
  328. package/dist/server/src/content-types/release-action/schema.d.ts.map +1 -0
  329. package/dist/server/src/controllers/homepage.d.ts +6 -0
  330. package/dist/server/src/controllers/homepage.d.ts.map +1 -0
  331. package/dist/server/src/controllers/index.d.ts +27 -0
  332. package/dist/server/src/controllers/index.d.ts.map +1 -0
  333. package/dist/server/src/controllers/release-action.d.ts +10 -0
  334. package/dist/server/src/controllers/release-action.d.ts.map +1 -0
  335. package/dist/server/src/controllers/release.d.ts +18 -0
  336. package/dist/server/src/controllers/release.d.ts.map +1 -0
  337. package/dist/server/src/controllers/settings.d.ts +11 -0
  338. package/dist/server/src/controllers/settings.d.ts.map +1 -0
  339. package/dist/server/src/controllers/validation/release-action.d.ts +14 -0
  340. package/dist/server/src/controllers/validation/release-action.d.ts.map +1 -0
  341. package/dist/server/src/controllers/validation/release.d.ts +4 -0
  342. package/dist/server/src/controllers/validation/release.d.ts.map +1 -0
  343. package/dist/server/src/controllers/validation/settings.d.ts +3 -0
  344. package/dist/server/src/controllers/validation/settings.d.ts.map +1 -0
  345. package/dist/server/src/destroy.d.ts +5 -0
  346. package/dist/server/src/destroy.d.ts.map +1 -0
  347. package/dist/server/src/index.d.ts +372 -0
  348. package/dist/server/src/index.d.ts.map +1 -0
  349. package/dist/server/src/middlewares/documents.d.ts +6 -0
  350. package/dist/server/src/middlewares/documents.d.ts.map +1 -0
  351. package/dist/server/src/migrations/database/5.0.0-document-id-in-actions.d.ts +9 -0
  352. package/dist/server/src/migrations/database/5.0.0-document-id-in-actions.d.ts.map +1 -0
  353. package/dist/server/src/migrations/index.d.ts +13 -0
  354. package/dist/server/src/migrations/index.d.ts.map +1 -0
  355. package/dist/server/src/register.d.ts +5 -0
  356. package/dist/server/src/register.d.ts.map +1 -0
  357. package/dist/server/src/routes/homepage.d.ts +4 -0
  358. package/dist/server/src/routes/homepage.d.ts.map +1 -0
  359. package/dist/server/src/routes/index.d.ts +54 -0
  360. package/dist/server/src/routes/index.d.ts.map +1 -0
  361. package/dist/server/src/routes/release-action.d.ts +18 -0
  362. package/dist/server/src/routes/release-action.d.ts.map +1 -0
  363. package/dist/server/src/routes/release.d.ts +18 -0
  364. package/dist/server/src/routes/release.d.ts.map +1 -0
  365. package/dist/server/src/routes/settings.d.ts +18 -0
  366. package/dist/server/src/routes/settings.d.ts.map +1 -0
  367. package/dist/server/src/services/homepage.d.ts +9 -0
  368. package/dist/server/src/services/homepage.d.ts.map +1 -0
  369. package/dist/server/src/services/index.d.ts +80 -0
  370. package/dist/server/src/services/index.d.ts.map +1 -0
  371. package/dist/server/src/services/release-action.d.ts +33 -0
  372. package/dist/server/src/services/release-action.d.ts.map +1 -0
  373. package/dist/server/src/services/release.d.ts +31 -0
  374. package/dist/server/src/services/release.d.ts.map +1 -0
  375. package/dist/server/src/services/scheduling.d.ts +17 -0
  376. package/dist/server/src/services/scheduling.d.ts.map +1 -0
  377. package/dist/server/src/services/settings.d.ts +13 -0
  378. package/dist/server/src/services/settings.d.ts.map +1 -0
  379. package/dist/server/src/services/validation.d.ts +18 -0
  380. package/dist/server/src/services/validation.d.ts.map +1 -0
  381. package/dist/server/src/utils/index.d.ts +51 -0
  382. package/dist/server/src/utils/index.d.ts.map +1 -0
  383. package/dist/server/utils/index.js +195 -0
  384. package/dist/server/utils/index.js.map +1 -0
  385. package/dist/server/utils/index.mjs +188 -0
  386. package/dist/server/utils/index.mjs.map +1 -0
  387. package/dist/shared/contracts/homepage.d.ts +11 -0
  388. package/dist/shared/contracts/homepage.d.ts.map +1 -0
  389. package/dist/shared/contracts/release-actions.d.ts +137 -0
  390. package/dist/shared/contracts/release-actions.d.ts.map +1 -0
  391. package/dist/shared/contracts/releases.d.ts +182 -0
  392. package/dist/shared/contracts/releases.d.ts.map +1 -0
  393. package/dist/shared/contracts/settings.d.ts +38 -0
  394. package/dist/shared/contracts/settings.d.ts.map +1 -0
  395. package/dist/shared/types.d.ts +24 -0
  396. package/dist/shared/types.d.ts.map +1 -0
  397. package/package.json +87 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EntryValidationPopover.mjs","sources":["../../../admin/src/components/EntryValidationPopover.tsx"],"sourcesContent":["import * as React from 'react';\r\n\r\nimport { FormErrors, FormValues } from '@strapi/admin/strapi-admin';\r\nimport { unstable_useDocument } from '@strapi/content-manager/strapi-admin';\r\nimport { Button, LinkButton, Flex, Typography, Popover } from '@strapi/design-system';\r\nimport { CheckCircle, CrossCircle, ArrowsCounterClockwise, CaretDown } from '@strapi/icons';\r\nimport { stringify } from 'qs';\r\nimport { useIntl, MessageDescriptor } from 'react-intl';\r\nimport { Link } from 'react-router-dom';\r\nimport { styled } from 'styled-components';\r\n\r\nimport type {\r\n ReleaseAction,\r\n ReleaseActionEntry,\r\n Stage,\r\n} from '../../../shared/contracts/release-actions';\r\nimport type { Struct } from '@strapi/types';\r\n\r\nconst StyledPopoverFlex = styled(Flex)`\r\n width: 100%;\r\n max-width: 256px;\r\n\r\n & > * {\r\n border-bottom: 1px solid ${({ theme }) => theme.colors.neutral150};\r\n }\r\n\r\n & > *:last-child {\r\n border-bottom: none;\r\n }\r\n`;\r\n\r\nconst ButtonContent = styled(Flex)`\r\n svg {\r\n fill: currentColor;\r\n }\r\n`;\r\n\r\nconst CustomStatusButton = ({\r\n children,\r\n icon,\r\n color,\r\n}: {\r\n icon: React.ReactElement;\r\n color: string;\r\n} & React.PropsWithChildren) => {\r\n return (\r\n <Popover.Trigger>\r\n <Button variant=\"ghost\" endIcon={<CaretDown />}>\r\n <ButtonContent color={color} gap={2}>\r\n {icon}\r\n <Typography textColor={color} variant=\"omega\" fontWeight=\"bold\">\r\n {children}\r\n </Typography>\r\n </ButtonContent>\r\n </Button>\r\n </Popover.Trigger>\r\n );\r\n};\r\n\r\ninterface EntryValidationPopoverProps {\r\n action: ReleaseAction['type'];\r\n schema?: Struct.ContentTypeSchema & {\r\n hasReviewWorkflow: boolean;\r\n stageRequiredToPublish?: Stage;\r\n };\r\n entry: ReleaseActionEntry;\r\n status: ReleaseAction['status'];\r\n}\r\n\r\ninterface ValidationStatusProps {\r\n action: ReleaseAction['type'];\r\n status: ReleaseAction['status'];\r\n hasErrors: boolean | null;\r\n requiredStage?: Stage;\r\n entryStage?: Stage;\r\n}\r\n\r\nconst EntryStatusTrigger = ({\r\n action,\r\n status,\r\n hasErrors,\r\n requiredStage,\r\n entryStage,\r\n}: ValidationStatusProps) => {\r\n const { formatMessage } = useIntl();\r\n\r\n if (action === 'publish') {\r\n if (hasErrors || (requiredStage && requiredStage.id !== entryStage?.id)) {\r\n return (\r\n <CustomStatusButton icon={<CrossCircle />} color=\"danger600\">\r\n {formatMessage({\r\n id: 'content-releases.pages.ReleaseDetails.entry-validation.not-ready',\r\n defaultMessage: 'Not ready to publish',\r\n })}\r\n </CustomStatusButton>\r\n );\r\n }\r\n\r\n if (status === 'draft') {\r\n return (\r\n <CustomStatusButton icon={<CheckCircle />} color=\"success600\">\r\n {formatMessage({\r\n id: 'content-releases.pages.ReleaseDetails.entry-validation.ready-to-publish',\r\n defaultMessage: 'Ready to publish',\r\n })}\r\n </CustomStatusButton>\r\n );\r\n }\r\n\r\n if (status === 'modified') {\r\n return (\r\n <CustomStatusButton icon={<ArrowsCounterClockwise />} color=\"alternative600\">\r\n {formatMessage({\r\n id: 'content-releases.pages.ReleaseDetails.entry-validation.modified',\r\n defaultMessage: 'Ready to publish changes',\r\n })}\r\n </CustomStatusButton>\r\n );\r\n }\r\n\r\n return (\r\n <CustomStatusButton icon={<CheckCircle />} color=\"success600\">\r\n {formatMessage({\r\n id: 'content-releases.pages.ReleaseDetails.entry-validation.already-published',\r\n defaultMessage: 'Already published',\r\n })}\r\n </CustomStatusButton>\r\n );\r\n }\r\n\r\n if (status === 'published') {\r\n return (\r\n <CustomStatusButton icon={<CheckCircle />} color=\"success600\">\r\n {formatMessage({\r\n id: 'content-releases.pages.ReleaseDetails.entry-validation.ready-to-unpublish',\r\n defaultMessage: 'Ready to unpublish',\r\n })}\r\n </CustomStatusButton>\r\n );\r\n }\r\n\r\n return (\r\n <CustomStatusButton icon={<CheckCircle />} color=\"success600\">\r\n {formatMessage({\r\n id: 'content-releases.pages.ReleaseDetails.entry-validation.already-unpublished',\r\n defaultMessage: 'Already unpublished',\r\n })}\r\n </CustomStatusButton>\r\n );\r\n};\r\n\r\ninterface FieldsValidationProps {\r\n hasErrors: boolean;\r\n errors: FormErrors<FormValues> | null;\r\n kind?: string;\r\n contentTypeUid?: string;\r\n documentId?: string;\r\n locale?: string;\r\n}\r\n\r\nconst FieldsValidation = ({\r\n hasErrors,\r\n errors,\r\n kind,\r\n contentTypeUid,\r\n documentId,\r\n locale,\r\n}: FieldsValidationProps) => {\r\n const { formatMessage } = useIntl();\r\n\r\n return (\r\n <Flex direction=\"column\" gap={1} width=\"100%\" padding={5}>\r\n <Flex gap={2} width=\"100%\">\r\n <Typography fontWeight=\"bold\">\r\n {formatMessage({\r\n id: 'content-releases.pages.ReleaseDetails.entry-validation.fields',\r\n defaultMessage: 'Fields',\r\n })}\r\n </Typography>\r\n {hasErrors ? <CrossCircle fill=\"danger600\" /> : <CheckCircle fill=\"success600\" />}\r\n </Flex>\r\n <Typography width=\"100%\" textColor=\"neutral600\">\r\n {hasErrors\r\n ? formatMessage(\r\n {\r\n id: 'content-releases.pages.ReleaseDetails.entry-validation.fields.error',\r\n defaultMessage: '{errors} errors on fields.',\r\n },\r\n { errors: errors ? Object.keys(errors).length : 0 }\r\n )\r\n : formatMessage({\r\n id: 'content-releases.pages.ReleaseDetails.entry-validation.fields.success',\r\n defaultMessage: 'All fields are filled correctly.',\r\n })}\r\n </Typography>\r\n {hasErrors && (\r\n <LinkButton\r\n tag={Link}\r\n to={{\r\n pathname: `/content-manager/${kind === 'collectionType' ? 'collection-types' : 'single-types'}/${contentTypeUid}/${documentId}`,\r\n search: locale\r\n ? stringify({\r\n plugins: {\r\n i18n: {\r\n locale,\r\n },\r\n },\r\n })\r\n : '',\r\n }}\r\n variant=\"secondary\"\r\n fullWidth\r\n state={{ forceValidation: true }}\r\n >\r\n {formatMessage({\r\n id: 'content-releases.pages.ReleaseDetails.entry-validation.fields.see-errors',\r\n defaultMessage: 'See errors',\r\n })}\r\n </LinkButton>\r\n )}\r\n </Flex>\r\n );\r\n};\r\n\r\nconst getReviewStageIcon = ({\r\n contentTypeHasReviewWorkflow,\r\n requiredStage,\r\n entryStage,\r\n}: {\r\n contentTypeHasReviewWorkflow: boolean;\r\n requiredStage?: Stage;\r\n entryStage?: Stage;\r\n}) => {\r\n if (!contentTypeHasReviewWorkflow) {\r\n return <CheckCircle fill=\"neutral200\" />;\r\n }\r\n if (requiredStage && requiredStage.id !== entryStage?.id) {\r\n return <CrossCircle fill=\"danger600\" />;\r\n }\r\n return <CheckCircle fill=\"success600\" />;\r\n};\r\n\r\nconst getReviewStageMessage = ({\r\n contentTypeHasReviewWorkflow,\r\n requiredStage,\r\n entryStage,\r\n formatMessage,\r\n}: {\r\n contentTypeHasReviewWorkflow: boolean;\r\n requiredStage?: Stage;\r\n entryStage?: Stage;\r\n formatMessage: (messageDescriptor: MessageDescriptor, values?: Record<string, string>) => string;\r\n}) => {\r\n if (!contentTypeHasReviewWorkflow) {\r\n return formatMessage({\r\n id: 'content-releases.pages.ReleaseDetails.entry-validation.review-stage.not-enabled',\r\n defaultMessage: 'This entry is not associated to any workflow.',\r\n });\r\n }\r\n\r\n if (requiredStage && requiredStage.id !== entryStage?.id) {\r\n return formatMessage(\r\n {\r\n id: 'content-releases.pages.ReleaseDetails.entry-validation.review-stage.not-ready',\r\n defaultMessage: 'This entry is not at the required stage for publishing. ({stageName})',\r\n },\r\n {\r\n stageName: requiredStage?.name ?? '',\r\n }\r\n );\r\n }\r\n\r\n if (requiredStage && requiredStage.id === entryStage?.id) {\r\n return formatMessage(\r\n {\r\n id: 'content-releases.pages.ReleaseDetails.entry-validation.review-stage.ready',\r\n defaultMessage: 'This entry is at the required stage for publishing. ({stageName})',\r\n },\r\n {\r\n stageName: requiredStage?.name ?? '',\r\n }\r\n );\r\n }\r\n\r\n return formatMessage({\r\n id: 'content-releases.pages.ReleaseDetails.entry-validation.review-stage.stage-not-required',\r\n defaultMessage: 'No required stage for publication',\r\n });\r\n};\r\n\r\nconst ReviewStageValidation = ({\r\n contentTypeHasReviewWorkflow,\r\n requiredStage,\r\n entryStage,\r\n}: {\r\n contentTypeHasReviewWorkflow: boolean;\r\n requiredStage?: Stage;\r\n entryStage?: Stage;\r\n}) => {\r\n const { formatMessage } = useIntl();\r\n\r\n const Icon = getReviewStageIcon({\r\n contentTypeHasReviewWorkflow,\r\n requiredStage,\r\n entryStage,\r\n });\r\n\r\n return (\r\n <Flex direction=\"column\" gap={1} width=\"100%\" padding={5}>\r\n <Flex gap={2} width=\"100%\">\r\n <Typography fontWeight=\"bold\">\r\n {formatMessage({\r\n id: 'content-releases.pages.ReleaseDetails.entry-validation.review-stage',\r\n defaultMessage: 'Review stage',\r\n })}\r\n </Typography>\r\n {Icon}\r\n </Flex>\r\n <Typography textColor=\"neutral600\">\r\n {getReviewStageMessage({\r\n contentTypeHasReviewWorkflow,\r\n requiredStage,\r\n entryStage,\r\n formatMessage,\r\n })}\r\n </Typography>\r\n </Flex>\r\n );\r\n};\r\n\r\nexport const EntryValidationPopover = ({\r\n schema,\r\n entry,\r\n status,\r\n action,\r\n}: EntryValidationPopoverProps) => {\r\n const { validate, isLoading } = unstable_useDocument(\r\n {\r\n collectionType: schema?.kind ?? '',\r\n model: schema?.uid ?? '',\r\n },\r\n {\r\n // useDocument makes a request to get more data about the entry, but we only want to have the validation function so we skip the request\r\n skip: true,\r\n }\r\n );\r\n\r\n // Validation errors\r\n const errors = isLoading ? null : validate(entry);\r\n const hasErrors = errors ? Object.keys(errors).length > 0 : false;\r\n\r\n // Entry stage\r\n const contentTypeHasReviewWorkflow = schema?.hasReviewWorkflow ?? false;\r\n const requiredStage = schema?.stageRequiredToPublish;\r\n const entryStage = entry.strapi_stage;\r\n\r\n if (isLoading) {\r\n return null;\r\n }\r\n\r\n return (\r\n <Popover.Root>\r\n <EntryStatusTrigger\r\n action={action}\r\n status={status}\r\n hasErrors={hasErrors}\r\n requiredStage={requiredStage}\r\n entryStage={entryStage}\r\n />\r\n <Popover.Content>\r\n <StyledPopoverFlex direction=\"column\">\r\n <FieldsValidation\r\n hasErrors={hasErrors}\r\n errors={errors}\r\n contentTypeUid={schema?.uid}\r\n kind={schema?.kind}\r\n documentId={entry.documentId}\r\n locale={entry.locale}\r\n />\r\n <ReviewStageValidation\r\n contentTypeHasReviewWorkflow={contentTypeHasReviewWorkflow}\r\n requiredStage={requiredStage}\r\n entryStage={entryStage}\r\n />\r\n </StyledPopoverFlex>\r\n </Popover.Content>\r\n </Popover.Root>\r\n );\r\n};\r\n"],"names":["StyledPopoverFlex","styled","Flex","theme","colors","neutral150","ButtonContent","CustomStatusButton","children","icon","color","_jsx","Popover","Trigger","Button","variant","endIcon","CaretDown","_jsxs","gap","Typography","textColor","fontWeight","EntryStatusTrigger","action","status","hasErrors","requiredStage","entryStage","formatMessage","useIntl","id","CrossCircle","defaultMessage","CheckCircle","ArrowsCounterClockwise","FieldsValidation","errors","kind","contentTypeUid","documentId","locale","direction","width","padding","fill","Object","keys","length","LinkButton","tag","Link","to","pathname","search","stringify","plugins","i18n","fullWidth","state","forceValidation","getReviewStageIcon","contentTypeHasReviewWorkflow","getReviewStageMessage","stageName","name","ReviewStageValidation","Icon","EntryValidationPopover","schema","entry","validate","isLoading","unstable_useDocument","collectionType","model","uid","skip","hasReviewWorkflow","stageRequiredToPublish","strapi_stage","Root","Content"],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var React = require('react');
5
+ var dateFns = require('date-fns');
6
+ var reactIntl = require('react-intl');
7
+
8
+ function _interopNamespace(e) {
9
+ if (e && e.__esModule) return e;
10
+ var n = Object.create(null);
11
+ if (e) {
12
+ Object.keys(e).forEach(function (k) {
13
+ if (k !== 'default') {
14
+ var d = Object.getOwnPropertyDescriptor(e, k);
15
+ Object.defineProperty(n, k, d.get ? d : {
16
+ enumerable: true,
17
+ get: function () { return e[k]; }
18
+ });
19
+ }
20
+ });
21
+ }
22
+ n.default = e;
23
+ return Object.freeze(n);
24
+ }
25
+
26
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
27
+
28
+ const intervals = [
29
+ 'years',
30
+ 'months',
31
+ 'days',
32
+ 'hours',
33
+ 'minutes',
34
+ 'seconds'
35
+ ];
36
+ /**
37
+ * Displays the relative time between a given timestamp and the current time.
38
+ * You can display a custom message for given time intervals by passing an array of custom intervals.
39
+ *
40
+ * @example
41
+ * ```jsx
42
+ * <caption>Display "last hour" if the timestamp is less than an hour ago</caption>
43
+ * <RelativeTime
44
+ * timestamp={new Date('2021-01-01')}
45
+ * customIntervals={[
46
+ * { unit: 'hours', threshold: 1, text: 'last hour' },
47
+ * ]}
48
+ * ```
49
+ */ const RelativeTime = /*#__PURE__*/ React__namespace.forwardRef(({ timestamp, customIntervals = [], ...restProps }, forwardedRef)=>{
50
+ const { formatRelativeTime, formatDate, formatTime } = reactIntl.useIntl();
51
+ /**
52
+ * TODO: make this auto-update, like a clock.
53
+ */ const interval = dateFns.intervalToDuration({
54
+ start: timestamp,
55
+ end: Date.now()
56
+ });
57
+ const unit = intervals.find((intervalUnit)=>{
58
+ return interval[intervalUnit] > 0 && Object.keys(interval).includes(intervalUnit);
59
+ });
60
+ const relativeTime = dateFns.isPast(timestamp) ? -interval[unit] : interval[unit];
61
+ // Display custom text if interval is less than the threshold
62
+ const customInterval = customIntervals.find((custom)=>interval[custom.unit] < custom.threshold);
63
+ const displayText = customInterval ? customInterval.text : formatRelativeTime(relativeTime, unit, {
64
+ numeric: 'auto'
65
+ });
66
+ return /*#__PURE__*/ jsxRuntime.jsx("time", {
67
+ ref: forwardedRef,
68
+ dateTime: timestamp.toISOString(),
69
+ role: "time",
70
+ title: `${formatDate(timestamp)} ${formatTime(timestamp)}`,
71
+ ...restProps,
72
+ children: displayText
73
+ });
74
+ });
75
+
76
+ exports.RelativeTime = RelativeTime;
77
+ //# sourceMappingURL=RelativeTime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RelativeTime.js","sources":["../../../admin/src/components/RelativeTime.tsx"],"sourcesContent":["import * as React from 'react';\r\n\r\nimport { Duration, intervalToDuration, isPast } from 'date-fns';\r\nimport { useIntl } from 'react-intl';\r\n\r\nconst intervals: Array<keyof Duration> = ['years', 'months', 'days', 'hours', 'minutes', 'seconds'];\r\n\r\ninterface CustomInterval {\r\n unit: keyof Duration;\r\n text: string;\r\n threshold: number;\r\n}\r\n\r\ninterface RelativeTimeProps extends React.ComponentPropsWithoutRef<'time'> {\r\n timestamp: Date;\r\n customIntervals?: CustomInterval[];\r\n}\r\n\r\n/**\r\n * Displays the relative time between a given timestamp and the current time.\r\n * You can display a custom message for given time intervals by passing an array of custom intervals.\r\n *\r\n * @example\r\n * ```jsx\r\n * <caption>Display \"last hour\" if the timestamp is less than an hour ago</caption>\r\n * <RelativeTime\r\n * timestamp={new Date('2021-01-01')}\r\n * customIntervals={[\r\n * { unit: 'hours', threshold: 1, text: 'last hour' },\r\n * ]}\r\n * ```\r\n */\r\nconst RelativeTime = React.forwardRef<HTMLTimeElement, RelativeTimeProps>(\r\n ({ timestamp, customIntervals = [], ...restProps }, forwardedRef) => {\r\n const { formatRelativeTime, formatDate, formatTime } = useIntl();\r\n\r\n /**\r\n * TODO: make this auto-update, like a clock.\r\n */\r\n const interval = intervalToDuration({\r\n start: timestamp,\r\n end: Date.now(),\r\n // see https://github.com/date-fns/date-fns/issues/2891 – No idea why it's all partial it returns it every time.\r\n }) as Required<Duration>;\r\n\r\n const unit = intervals.find((intervalUnit) => {\r\n return interval[intervalUnit] > 0 && Object.keys(interval).includes(intervalUnit);\r\n })!;\r\n\r\n const relativeTime = isPast(timestamp) ? -interval[unit] : interval[unit];\r\n\r\n // Display custom text if interval is less than the threshold\r\n const customInterval = customIntervals.find(\r\n (custom) => interval[custom.unit] < custom.threshold\r\n );\r\n\r\n const displayText = customInterval\r\n ? customInterval.text\r\n : formatRelativeTime(relativeTime, unit, { numeric: 'auto' });\r\n\r\n return (\r\n <time\r\n ref={forwardedRef}\r\n dateTime={timestamp.toISOString()}\r\n role=\"time\"\r\n title={`${formatDate(timestamp)} ${formatTime(timestamp)}`}\r\n {...restProps}\r\n >\r\n {displayText}\r\n </time>\r\n );\r\n }\r\n);\r\n\r\nexport { RelativeTime };\r\nexport type { CustomInterval, RelativeTimeProps };\r\n"],"names":["intervals","RelativeTime","React","forwardRef","timestamp","customIntervals","restProps","forwardedRef","formatRelativeTime","formatDate","formatTime","useIntl","interval","intervalToDuration","start","end","Date","now","unit","find","intervalUnit","Object","keys","includes","relativeTime","isPast","customInterval","custom","threshold","displayText","text","numeric","_jsx","time","ref","dateTime","toISOString","role","title"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,MAAMA,SAAAA,GAAmC;AAAC,IAAA,OAAA;AAAS,IAAA,QAAA;AAAU,IAAA,MAAA;AAAQ,IAAA,OAAA;AAAS,IAAA,SAAA;AAAW,IAAA;AAAU,CAAA;AAanG;;;;;;;;;;;;;AAaC,IACD,MAAMC,YAAAA,iBAAeC,gBAAAA,CAAMC,UAAU,CACnC,CAAC,EAAEC,SAAS,EAAEC,eAAAA,GAAkB,EAAE,EAAE,GAAGC,WAAW,EAAEC,YAAAA,GAAAA;AAClD,IAAA,MAAM,EAAEC,kBAAkB,EAAEC,UAAU,EAAEC,UAAU,EAAE,GAAGC,iBAAAA,EAAAA;AAEvD;;QAGA,MAAMC,WAAWC,0BAAAA,CAAmB;QAClCC,KAAAA,EAAOV,SAAAA;AACPW,QAAAA,GAAAA,EAAKC,KAAKC,GAAG;AAEf,KAAA,CAAA;AAEA,IAAA,MAAMC,IAAAA,GAAOlB,SAAAA,CAAUmB,IAAI,CAAC,CAACC,YAAAA,GAAAA;QAC3B,OAAOR,QAAQ,CAACQ,YAAAA,CAAa,GAAG,CAAA,IAAKC,OAAOC,IAAI,CAACV,QAAAA,CAAAA,CAAUW,QAAQ,CAACH,YAAAA,CAAAA;AACtE,IAAA,CAAA,CAAA;IAEA,MAAMI,YAAAA,GAAeC,cAAAA,CAAOrB,SAAAA,CAAAA,GAAa,CAACQ,QAAQ,CAACM,IAAAA,CAAK,GAAGN,QAAQ,CAACM,IAAAA,CAAK;;AAGzE,IAAA,MAAMQ,cAAAA,GAAiBrB,eAAAA,CAAgBc,IAAI,CACzC,CAACQ,MAAAA,GAAWf,QAAQ,CAACe,MAAAA,CAAOT,IAAI,CAAC,GAAGS,OAAOC,SAAS,CAAA;AAGtD,IAAA,MAAMC,cAAcH,cAAAA,GAChBA,cAAAA,CAAeI,IAAI,GACnBtB,kBAAAA,CAAmBgB,cAAcN,IAAAA,EAAM;QAAEa,OAAAA,EAAS;AAAO,KAAA,CAAA;AAE7D,IAAA,qBACEC,cAAA,CAACC,MAAAA,EAAAA;QACCC,GAAAA,EAAK3B,YAAAA;AACL4B,QAAAA,QAAAA,EAAU/B,UAAUgC,WAAW,EAAA;QAC/BC,IAAAA,EAAK,MAAA;AACLC,QAAAA,KAAAA,EAAO,GAAG7B,UAAAA,CAAWL,SAAAA,CAAAA,CAAW,CAAC,EAAEM,WAAWN,SAAAA,CAAAA,CAAAA,CAAY;AACzD,QAAA,GAAGE,SAAS;AAEZuB,QAAAA,QAAAA,EAAAA;;AAGP,CAAA;;;;"}
@@ -0,0 +1,55 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import * as React from 'react';
3
+ import { intervalToDuration, isPast } from 'date-fns';
4
+ import { useIntl } from 'react-intl';
5
+
6
+ const intervals = [
7
+ 'years',
8
+ 'months',
9
+ 'days',
10
+ 'hours',
11
+ 'minutes',
12
+ 'seconds'
13
+ ];
14
+ /**
15
+ * Displays the relative time between a given timestamp and the current time.
16
+ * You can display a custom message for given time intervals by passing an array of custom intervals.
17
+ *
18
+ * @example
19
+ * ```jsx
20
+ * <caption>Display "last hour" if the timestamp is less than an hour ago</caption>
21
+ * <RelativeTime
22
+ * timestamp={new Date('2021-01-01')}
23
+ * customIntervals={[
24
+ * { unit: 'hours', threshold: 1, text: 'last hour' },
25
+ * ]}
26
+ * ```
27
+ */ const RelativeTime = /*#__PURE__*/ React.forwardRef(({ timestamp, customIntervals = [], ...restProps }, forwardedRef)=>{
28
+ const { formatRelativeTime, formatDate, formatTime } = useIntl();
29
+ /**
30
+ * TODO: make this auto-update, like a clock.
31
+ */ const interval = intervalToDuration({
32
+ start: timestamp,
33
+ end: Date.now()
34
+ });
35
+ const unit = intervals.find((intervalUnit)=>{
36
+ return interval[intervalUnit] > 0 && Object.keys(interval).includes(intervalUnit);
37
+ });
38
+ const relativeTime = isPast(timestamp) ? -interval[unit] : interval[unit];
39
+ // Display custom text if interval is less than the threshold
40
+ const customInterval = customIntervals.find((custom)=>interval[custom.unit] < custom.threshold);
41
+ const displayText = customInterval ? customInterval.text : formatRelativeTime(relativeTime, unit, {
42
+ numeric: 'auto'
43
+ });
44
+ return /*#__PURE__*/ jsx("time", {
45
+ ref: forwardedRef,
46
+ dateTime: timestamp.toISOString(),
47
+ role: "time",
48
+ title: `${formatDate(timestamp)} ${formatTime(timestamp)}`,
49
+ ...restProps,
50
+ children: displayText
51
+ });
52
+ });
53
+
54
+ export { RelativeTime };
55
+ //# sourceMappingURL=RelativeTime.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RelativeTime.mjs","sources":["../../../admin/src/components/RelativeTime.tsx"],"sourcesContent":["import * as React from 'react';\r\n\r\nimport { Duration, intervalToDuration, isPast } from 'date-fns';\r\nimport { useIntl } from 'react-intl';\r\n\r\nconst intervals: Array<keyof Duration> = ['years', 'months', 'days', 'hours', 'minutes', 'seconds'];\r\n\r\ninterface CustomInterval {\r\n unit: keyof Duration;\r\n text: string;\r\n threshold: number;\r\n}\r\n\r\ninterface RelativeTimeProps extends React.ComponentPropsWithoutRef<'time'> {\r\n timestamp: Date;\r\n customIntervals?: CustomInterval[];\r\n}\r\n\r\n/**\r\n * Displays the relative time between a given timestamp and the current time.\r\n * You can display a custom message for given time intervals by passing an array of custom intervals.\r\n *\r\n * @example\r\n * ```jsx\r\n * <caption>Display \"last hour\" if the timestamp is less than an hour ago</caption>\r\n * <RelativeTime\r\n * timestamp={new Date('2021-01-01')}\r\n * customIntervals={[\r\n * { unit: 'hours', threshold: 1, text: 'last hour' },\r\n * ]}\r\n * ```\r\n */\r\nconst RelativeTime = React.forwardRef<HTMLTimeElement, RelativeTimeProps>(\r\n ({ timestamp, customIntervals = [], ...restProps }, forwardedRef) => {\r\n const { formatRelativeTime, formatDate, formatTime } = useIntl();\r\n\r\n /**\r\n * TODO: make this auto-update, like a clock.\r\n */\r\n const interval = intervalToDuration({\r\n start: timestamp,\r\n end: Date.now(),\r\n // see https://github.com/date-fns/date-fns/issues/2891 – No idea why it's all partial it returns it every time.\r\n }) as Required<Duration>;\r\n\r\n const unit = intervals.find((intervalUnit) => {\r\n return interval[intervalUnit] > 0 && Object.keys(interval).includes(intervalUnit);\r\n })!;\r\n\r\n const relativeTime = isPast(timestamp) ? -interval[unit] : interval[unit];\r\n\r\n // Display custom text if interval is less than the threshold\r\n const customInterval = customIntervals.find(\r\n (custom) => interval[custom.unit] < custom.threshold\r\n );\r\n\r\n const displayText = customInterval\r\n ? customInterval.text\r\n : formatRelativeTime(relativeTime, unit, { numeric: 'auto' });\r\n\r\n return (\r\n <time\r\n ref={forwardedRef}\r\n dateTime={timestamp.toISOString()}\r\n role=\"time\"\r\n title={`${formatDate(timestamp)} ${formatTime(timestamp)}`}\r\n {...restProps}\r\n >\r\n {displayText}\r\n </time>\r\n );\r\n }\r\n);\r\n\r\nexport { RelativeTime };\r\nexport type { CustomInterval, RelativeTimeProps };\r\n"],"names":["intervals","RelativeTime","React","forwardRef","timestamp","customIntervals","restProps","forwardedRef","formatRelativeTime","formatDate","formatTime","useIntl","interval","intervalToDuration","start","end","Date","now","unit","find","intervalUnit","Object","keys","includes","relativeTime","isPast","customInterval","custom","threshold","displayText","text","numeric","_jsx","time","ref","dateTime","toISOString","role","title"],"mappings":";;;;;AAKA,MAAMA,SAAAA,GAAmC;AAAC,IAAA,OAAA;AAAS,IAAA,QAAA;AAAU,IAAA,MAAA;AAAQ,IAAA,OAAA;AAAS,IAAA,SAAA;AAAW,IAAA;AAAU,CAAA;AAanG;;;;;;;;;;;;;AAaC,IACD,MAAMC,YAAAA,iBAAeC,KAAAA,CAAMC,UAAU,CACnC,CAAC,EAAEC,SAAS,EAAEC,eAAAA,GAAkB,EAAE,EAAE,GAAGC,WAAW,EAAEC,YAAAA,GAAAA;AAClD,IAAA,MAAM,EAAEC,kBAAkB,EAAEC,UAAU,EAAEC,UAAU,EAAE,GAAGC,OAAAA,EAAAA;AAEvD;;QAGA,MAAMC,WAAWC,kBAAAA,CAAmB;QAClCC,KAAAA,EAAOV,SAAAA;AACPW,QAAAA,GAAAA,EAAKC,KAAKC,GAAG;AAEf,KAAA,CAAA;AAEA,IAAA,MAAMC,IAAAA,GAAOlB,SAAAA,CAAUmB,IAAI,CAAC,CAACC,YAAAA,GAAAA;QAC3B,OAAOR,QAAQ,CAACQ,YAAAA,CAAa,GAAG,CAAA,IAAKC,OAAOC,IAAI,CAACV,QAAAA,CAAAA,CAAUW,QAAQ,CAACH,YAAAA,CAAAA;AACtE,IAAA,CAAA,CAAA;IAEA,MAAMI,YAAAA,GAAeC,MAAAA,CAAOrB,SAAAA,CAAAA,GAAa,CAACQ,QAAQ,CAACM,IAAAA,CAAK,GAAGN,QAAQ,CAACM,IAAAA,CAAK;;AAGzE,IAAA,MAAMQ,cAAAA,GAAiBrB,eAAAA,CAAgBc,IAAI,CACzC,CAACQ,MAAAA,GAAWf,QAAQ,CAACe,MAAAA,CAAOT,IAAI,CAAC,GAAGS,OAAOC,SAAS,CAAA;AAGtD,IAAA,MAAMC,cAAcH,cAAAA,GAChBA,cAAAA,CAAeI,IAAI,GACnBtB,kBAAAA,CAAmBgB,cAAcN,IAAAA,EAAM;QAAEa,OAAAA,EAAS;AAAO,KAAA,CAAA;AAE7D,IAAA,qBACEC,GAAA,CAACC,MAAAA,EAAAA;QACCC,GAAAA,EAAK3B,YAAAA;AACL4B,QAAAA,QAAAA,EAAU/B,UAAUgC,WAAW,EAAA;QAC/BC,IAAAA,EAAK,MAAA;AACLC,QAAAA,KAAAA,EAAO,GAAG7B,UAAAA,CAAWL,SAAAA,CAAAA,CAAW,CAAC,EAAEM,WAAWN,SAAAA,CAAAA,CAAAA,CAAY;AACzD,QAAA,GAAGE,SAAS;AAEZuB,QAAAA,QAAAA,EAAAA;;AAGP,CAAA;;;;"}
@@ -0,0 +1,203 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ require('react');
5
+ var strapiAdmin = require('@strapi/admin/strapi-admin');
6
+ var strapiAdmin$1 = require('@strapi/content-manager/strapi-admin');
7
+ var designSystem = require('@strapi/design-system');
8
+ var formik = require('formik');
9
+ var reactIntl = require('react-intl');
10
+ var constants = require('../constants.js');
11
+ var release = require('../services/release.js');
12
+ var ReleaseActionModal = require('./ReleaseActionModal.js');
13
+ var ReleaseActionOptions = require('./ReleaseActionOptions.js');
14
+
15
+ const getContentPermissions = (subject)=>{
16
+ const permissions = {
17
+ publish: [
18
+ {
19
+ action: 'plugin::content-manager.explorer.publish',
20
+ subject,
21
+ id: '',
22
+ actionParameters: {},
23
+ properties: {},
24
+ conditions: []
25
+ }
26
+ ]
27
+ };
28
+ return permissions;
29
+ };
30
+ const ReleaseAction = ({ documents, model })=>{
31
+ const { formatMessage } = reactIntl.useIntl();
32
+ const { toggleNotification } = strapiAdmin.useNotification();
33
+ const { formatAPIError } = strapiAdmin.useAPIErrorHandler();
34
+ const [{ query }] = strapiAdmin.useQueryParams();
35
+ const contentPermissions = getContentPermissions(model);
36
+ const { allowedActions: { canPublish } } = strapiAdmin.useRBAC(contentPermissions);
37
+ const { allowedActions: { canCreate } } = strapiAdmin.useRBAC(constants.PERMISSIONS);
38
+ const { hasDraftAndPublish } = strapiAdmin$1.unstable_useContentManagerContext();
39
+ // Get all the releases not published
40
+ const response = release.useGetReleasesQuery();
41
+ const releases = response.data?.data;
42
+ const [createManyReleaseActions, { isLoading }] = release.useCreateManyReleaseActionsMutation();
43
+ const documentIds = documents.map((doc)=>doc.documentId);
44
+ const handleSubmit = async (values)=>{
45
+ const locale = query.plugins?.i18n?.locale;
46
+ const releaseActionEntries = documentIds.map((entryDocumentId)=>({
47
+ type: values.type,
48
+ contentType: model,
49
+ entryDocumentId,
50
+ locale
51
+ }));
52
+ const response = await createManyReleaseActions({
53
+ body: releaseActionEntries,
54
+ params: {
55
+ releaseId: values.releaseId
56
+ }
57
+ });
58
+ if ('data' in response) {
59
+ // Handle success
60
+ const notificationMessage = formatMessage({
61
+ id: 'content-releases.content-manager-list-view.add-to-release.notification.success.message',
62
+ defaultMessage: '{entriesAlreadyInRelease} out of {totalEntries} entries were already in the release.'
63
+ }, {
64
+ entriesAlreadyInRelease: response.data.meta.entriesAlreadyInRelease,
65
+ totalEntries: response.data.meta.totalEntries
66
+ });
67
+ const notification = {
68
+ type: 'success',
69
+ title: formatMessage({
70
+ id: 'content-releases.content-manager-list-view.add-to-release.notification.success.title',
71
+ defaultMessage: 'Successfully added to release.'
72
+ }, {
73
+ entriesAlreadyInRelease: response.data.meta.entriesAlreadyInRelease,
74
+ totalEntries: response.data.meta.totalEntries
75
+ }),
76
+ message: response.data.meta.entriesAlreadyInRelease ? notificationMessage : ''
77
+ };
78
+ toggleNotification(notification);
79
+ return true;
80
+ }
81
+ if ('error' in response) {
82
+ if (strapiAdmin.isFetchError(response.error)) {
83
+ // Handle fetch error
84
+ toggleNotification({
85
+ type: 'warning',
86
+ message: formatAPIError(response.error)
87
+ });
88
+ } else {
89
+ // Handle generic error
90
+ toggleNotification({
91
+ type: 'warning',
92
+ message: formatMessage({
93
+ id: 'notification.error',
94
+ defaultMessage: 'An error occurred'
95
+ })
96
+ });
97
+ }
98
+ }
99
+ };
100
+ if (!hasDraftAndPublish || !canCreate || !canPublish) return null;
101
+ return {
102
+ actionType: 'release',
103
+ variant: 'tertiary',
104
+ label: formatMessage({
105
+ id: 'content-manager-list-view.add-to-release',
106
+ defaultMessage: 'Add to Release'
107
+ }),
108
+ dialog: {
109
+ type: 'modal',
110
+ title: formatMessage({
111
+ id: 'content-manager-list-view.add-to-release',
112
+ defaultMessage: 'Add to Release'
113
+ }),
114
+ content: ({ onClose })=>{
115
+ return /*#__PURE__*/ jsxRuntime.jsx(formik.Formik, {
116
+ onSubmit: async (values)=>{
117
+ const data = await handleSubmit(values);
118
+ if (data) {
119
+ return onClose();
120
+ }
121
+ },
122
+ validationSchema: ReleaseActionModal.RELEASE_ACTION_FORM_SCHEMA,
123
+ initialValues: ReleaseActionModal.INITIAL_VALUES,
124
+ children: ({ values, setFieldValue })=>/*#__PURE__*/ jsxRuntime.jsxs(formik.Form, {
125
+ children: [
126
+ releases?.length === 0 ? /*#__PURE__*/ jsxRuntime.jsx(ReleaseActionModal.NoReleases, {}) : /*#__PURE__*/ jsxRuntime.jsx(designSystem.Modal.Body, {
127
+ children: /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
128
+ direction: "column",
129
+ alignItems: "stretch",
130
+ gap: 2,
131
+ children: [
132
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
133
+ paddingBottom: 6,
134
+ children: /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Field.Root, {
135
+ required: true,
136
+ children: [
137
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Field.Label, {
138
+ children: formatMessage({
139
+ id: 'content-releases.content-manager-list-view.add-to-release.select-label',
140
+ defaultMessage: 'Select a release'
141
+ })
142
+ }),
143
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.SingleSelect, {
144
+ placeholder: formatMessage({
145
+ id: 'content-releases.content-manager-list-view.add-to-release.select-placeholder',
146
+ defaultMessage: 'Select'
147
+ }),
148
+ onChange: (value)=>setFieldValue('releaseId', value),
149
+ value: values.releaseId,
150
+ children: releases?.map((release)=>/*#__PURE__*/ jsxRuntime.jsx(designSystem.SingleSelectOption, {
151
+ value: release.id,
152
+ children: release.name
153
+ }, release.id))
154
+ })
155
+ ]
156
+ })
157
+ }),
158
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Field.Label, {
159
+ children: formatMessage({
160
+ id: 'content-releases.content-manager-list-view.add-to-release.action-type-label',
161
+ defaultMessage: 'What do you want to do with these entries?'
162
+ })
163
+ }),
164
+ /*#__PURE__*/ jsxRuntime.jsx(ReleaseActionOptions.ReleaseActionOptions, {
165
+ selected: values.type,
166
+ handleChange: (e)=>setFieldValue('type', e.target.value),
167
+ name: "type"
168
+ })
169
+ ]
170
+ })
171
+ }),
172
+ /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Modal.Footer, {
173
+ children: [
174
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Button, {
175
+ onClick: onClose,
176
+ variant: "tertiary",
177
+ name: "cancel",
178
+ children: formatMessage({
179
+ id: 'content-releases.content-manager-list-view.add-to-release.cancel-button',
180
+ defaultMessage: 'Cancel'
181
+ })
182
+ }),
183
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Button, {
184
+ type: "submit",
185
+ disabled: !values.releaseId,
186
+ loading: isLoading,
187
+ children: formatMessage({
188
+ id: 'content-releases.content-manager-list-view.add-to-release.continue-button',
189
+ defaultMessage: 'Continue'
190
+ })
191
+ })
192
+ ]
193
+ })
194
+ ]
195
+ })
196
+ });
197
+ }
198
+ }
199
+ };
200
+ };
201
+
202
+ exports.ReleaseAction = ReleaseAction;
203
+ //# sourceMappingURL=ReleaseAction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReleaseAction.js","sources":["../../../admin/src/components/ReleaseAction.tsx"],"sourcesContent":["import * as React from 'react';\r\n\r\nimport {\r\n useAPIErrorHandler,\r\n useNotification,\r\n useQueryParams,\r\n useRBAC,\r\n isFetchError,\r\n} from '@strapi/admin/strapi-admin';\r\nimport { unstable_useContentManagerContext as useContentManagerContext } from '@strapi/content-manager/strapi-admin';\r\nimport {\r\n Box,\r\n Button,\r\n Flex,\r\n SingleSelect,\r\n SingleSelectOption,\r\n Modal,\r\n Field,\r\n} from '@strapi/design-system';\r\nimport { Formik, Form } from 'formik';\r\nimport { useIntl } from 'react-intl';\r\n\r\nimport { CreateManyReleaseActions } from '../../../shared/contracts/release-actions';\r\nimport { PERMISSIONS as releasePermissions } from '../constants';\r\nimport { useCreateManyReleaseActionsMutation, useGetReleasesQuery } from '../services/release';\r\n\r\nimport {\r\n type FormValues,\r\n INITIAL_VALUES,\r\n RELEASE_ACTION_FORM_SCHEMA,\r\n NoReleases,\r\n} from './ReleaseActionModal';\r\nimport { ReleaseActionOptions } from './ReleaseActionOptions';\r\n\r\nimport type { BulkActionComponent } from '@strapi/content-manager/strapi-admin';\r\nimport type { UID } from '@strapi/types';\r\n\r\nconst getContentPermissions = (subject: string) => {\r\n const permissions = {\r\n publish: [\r\n {\r\n action: 'plugin::content-manager.explorer.publish',\r\n subject,\r\n id: '',\r\n actionParameters: {},\r\n properties: {},\r\n conditions: [],\r\n },\r\n ],\r\n };\r\n\r\n return permissions;\r\n};\r\n\r\nconst ReleaseAction: BulkActionComponent = ({ documents, model }) => {\r\n const { formatMessage } = useIntl();\r\n const { toggleNotification } = useNotification();\r\n const { formatAPIError } = useAPIErrorHandler();\r\n const [{ query }] = useQueryParams<{ plugins?: { i18n?: { locale?: string } } }>();\r\n const contentPermissions = getContentPermissions(model);\r\n const {\r\n allowedActions: { canPublish },\r\n } = useRBAC(contentPermissions);\r\n const {\r\n allowedActions: { canCreate },\r\n } = useRBAC(releasePermissions);\r\n const { hasDraftAndPublish } = useContentManagerContext();\r\n\r\n // Get all the releases not published\r\n const response = useGetReleasesQuery();\r\n const releases = response.data?.data;\r\n const [createManyReleaseActions, { isLoading }] = useCreateManyReleaseActionsMutation();\r\n const documentIds = documents.map((doc) => doc.documentId);\r\n\r\n const handleSubmit = async (values: FormValues) => {\r\n const locale = query.plugins?.i18n?.locale;\r\n\r\n const releaseActionEntries: CreateManyReleaseActions.Request['body'] = documentIds.map(\r\n (entryDocumentId) => ({\r\n type: values.type,\r\n contentType: model as UID.ContentType,\r\n entryDocumentId,\r\n locale,\r\n })\r\n );\r\n\r\n const response = await createManyReleaseActions({\r\n body: releaseActionEntries,\r\n params: { releaseId: values.releaseId },\r\n });\r\n\r\n if ('data' in response) {\r\n // Handle success\r\n\r\n const notificationMessage = formatMessage(\r\n {\r\n id: 'content-releases.content-manager-list-view.add-to-release.notification.success.message',\r\n defaultMessage:\r\n '{entriesAlreadyInRelease} out of {totalEntries} entries were already in the release.',\r\n },\r\n {\r\n entriesAlreadyInRelease: response.data.meta.entriesAlreadyInRelease,\r\n totalEntries: response.data.meta.totalEntries,\r\n }\r\n );\r\n\r\n const notification = {\r\n type: 'success' as const,\r\n title: formatMessage(\r\n {\r\n id: 'content-releases.content-manager-list-view.add-to-release.notification.success.title',\r\n defaultMessage: 'Successfully added to release.',\r\n },\r\n {\r\n entriesAlreadyInRelease: response.data.meta.entriesAlreadyInRelease,\r\n totalEntries: response.data.meta.totalEntries,\r\n }\r\n ),\r\n message: response.data.meta.entriesAlreadyInRelease ? notificationMessage : '',\r\n };\r\n\r\n toggleNotification(notification);\r\n\r\n return true;\r\n }\r\n\r\n if ('error' in response) {\r\n if (isFetchError(response.error)) {\r\n // Handle fetch error\r\n toggleNotification({\r\n type: 'warning',\r\n message: formatAPIError(response.error),\r\n });\r\n } else {\r\n // Handle generic error\r\n toggleNotification({\r\n type: 'warning',\r\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\r\n });\r\n }\r\n }\r\n };\r\n\r\n if (!hasDraftAndPublish || !canCreate || !canPublish) return null;\r\n\r\n return {\r\n actionType: 'release',\r\n variant: 'tertiary',\r\n label: formatMessage({\r\n id: 'content-manager-list-view.add-to-release',\r\n defaultMessage: 'Add to Release',\r\n }),\r\n dialog: {\r\n type: 'modal',\r\n title: formatMessage({\r\n id: 'content-manager-list-view.add-to-release',\r\n defaultMessage: 'Add to Release',\r\n }),\r\n content: ({ onClose }) => {\r\n return (\r\n <Formik\r\n onSubmit={async (values) => {\r\n const data = await handleSubmit(values);\r\n if (data) {\r\n return onClose();\r\n }\r\n }}\r\n validationSchema={RELEASE_ACTION_FORM_SCHEMA}\r\n initialValues={INITIAL_VALUES}\r\n >\r\n {({ values, setFieldValue }) => (\r\n <Form>\r\n {releases?.length === 0 ? (\r\n <NoReleases />\r\n ) : (\r\n <Modal.Body>\r\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2}>\r\n <Box paddingBottom={6}>\r\n <Field.Root required>\r\n <Field.Label>\r\n {formatMessage({\r\n id: 'content-releases.content-manager-list-view.add-to-release.select-label',\r\n defaultMessage: 'Select a release',\r\n })}\r\n </Field.Label>\r\n <SingleSelect\r\n placeholder={formatMessage({\r\n id: 'content-releases.content-manager-list-view.add-to-release.select-placeholder',\r\n defaultMessage: 'Select',\r\n })}\r\n onChange={(value) => setFieldValue('releaseId', value)}\r\n value={values.releaseId}\r\n >\r\n {releases?.map((release) => (\r\n <SingleSelectOption key={release.id} value={release.id}>\r\n {release.name}\r\n </SingleSelectOption>\r\n ))}\r\n </SingleSelect>\r\n </Field.Root>\r\n </Box>\r\n <Field.Label>\r\n {formatMessage({\r\n id: 'content-releases.content-manager-list-view.add-to-release.action-type-label',\r\n defaultMessage: 'What do you want to do with these entries?',\r\n })}\r\n </Field.Label>\r\n <ReleaseActionOptions\r\n selected={values.type}\r\n handleChange={(e) => setFieldValue('type', e.target.value)}\r\n name=\"type\"\r\n />\r\n </Flex>\r\n </Modal.Body>\r\n )}\r\n <Modal.Footer>\r\n <Button onClick={onClose} variant=\"tertiary\" name=\"cancel\">\r\n {formatMessage({\r\n id: 'content-releases.content-manager-list-view.add-to-release.cancel-button',\r\n defaultMessage: 'Cancel',\r\n })}\r\n </Button>\r\n {/** * TODO: Ideally we would use isValid from Formik to disable the button,\r\n however currently it always returns true * for yup.string().required(), even when\r\n the value is falsy (including empty string) */}\r\n <Button type=\"submit\" disabled={!values.releaseId} loading={isLoading}>\r\n {formatMessage({\r\n id: 'content-releases.content-manager-list-view.add-to-release.continue-button',\r\n defaultMessage: 'Continue',\r\n })}\r\n </Button>\r\n </Modal.Footer>\r\n </Form>\r\n )}\r\n </Formik>\r\n );\r\n },\r\n },\r\n };\r\n};\r\n\r\nexport { ReleaseAction };\r\n"],"names":["getContentPermissions","subject","permissions","publish","action","id","actionParameters","properties","conditions","ReleaseAction","documents","model","formatMessage","useIntl","toggleNotification","useNotification","formatAPIError","useAPIErrorHandler","query","useQueryParams","contentPermissions","allowedActions","canPublish","useRBAC","canCreate","releasePermissions","hasDraftAndPublish","useContentManagerContext","response","useGetReleasesQuery","releases","data","createManyReleaseActions","isLoading","useCreateManyReleaseActionsMutation","documentIds","map","doc","documentId","handleSubmit","values","locale","plugins","i18n","releaseActionEntries","entryDocumentId","type","contentType","body","params","releaseId","notificationMessage","defaultMessage","entriesAlreadyInRelease","meta","totalEntries","notification","title","message","isFetchError","error","actionType","variant","label","dialog","content","onClose","_jsx","Formik","onSubmit","validationSchema","RELEASE_ACTION_FORM_SCHEMA","initialValues","INITIAL_VALUES","setFieldValue","_jsxs","Form","length","NoReleases","Modal","Body","Flex","direction","alignItems","gap","Box","paddingBottom","Field","Root","required","Label","SingleSelect","placeholder","onChange","value","release","SingleSelectOption","name","ReleaseActionOptions","selected","handleChange","e","target","Footer","Button","onClick","disabled","loading"],"mappings":"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"}