@strapi/content-releases 0.0.0-next.f09bff0783c6e3dfd3c34ed73b6f1a47de7b8d80 → 0.0.0-next.f0bfcece1007e5aa527570187635aefc86db536e

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 (306) hide show
  1. package/dist/admin/assets/purchase-page-illustration-dark.svg.js +6 -0
  2. package/dist/admin/assets/purchase-page-illustration-dark.svg.js.map +1 -0
  3. package/dist/admin/assets/purchase-page-illustration-dark.svg.mjs +4 -0
  4. package/dist/admin/assets/purchase-page-illustration-dark.svg.mjs.map +1 -0
  5. package/dist/admin/assets/purchase-page-illustration-light.svg.js +6 -0
  6. package/dist/admin/assets/purchase-page-illustration-light.svg.js.map +1 -0
  7. package/dist/admin/assets/purchase-page-illustration-light.svg.mjs +4 -0
  8. package/dist/admin/assets/purchase-page-illustration-light.svg.mjs.map +1 -0
  9. package/dist/admin/components/EntryValidationPopover.js +310 -0
  10. package/dist/admin/components/EntryValidationPopover.js.map +1 -0
  11. package/dist/admin/components/EntryValidationPopover.mjs +308 -0
  12. package/dist/admin/components/EntryValidationPopover.mjs.map +1 -0
  13. package/dist/admin/components/RelativeTime.js +76 -0
  14. package/dist/admin/components/RelativeTime.js.map +1 -0
  15. package/dist/admin/components/RelativeTime.mjs +55 -0
  16. package/dist/admin/components/RelativeTime.mjs.map +1 -0
  17. package/dist/admin/components/ReleaseAction.js +203 -0
  18. package/dist/admin/components/ReleaseAction.js.map +1 -0
  19. package/dist/admin/components/ReleaseAction.mjs +201 -0
  20. package/dist/admin/components/ReleaseAction.mjs.map +1 -0
  21. package/dist/admin/components/ReleaseActionMenu.js +194 -0
  22. package/dist/admin/components/ReleaseActionMenu.js.map +1 -0
  23. package/dist/admin/components/ReleaseActionMenu.mjs +173 -0
  24. package/dist/admin/components/ReleaseActionMenu.mjs.map +1 -0
  25. package/dist/admin/components/ReleaseActionModal.js +268 -0
  26. package/dist/admin/components/ReleaseActionModal.js.map +1 -0
  27. package/dist/admin/components/ReleaseActionModal.mjs +244 -0
  28. package/dist/admin/components/ReleaseActionModal.mjs.map +1 -0
  29. package/dist/admin/components/ReleaseActionOptions.js +104 -0
  30. package/dist/admin/components/ReleaseActionOptions.js.map +1 -0
  31. package/dist/admin/components/ReleaseActionOptions.mjs +102 -0
  32. package/dist/admin/components/ReleaseActionOptions.mjs.map +1 -0
  33. package/dist/admin/components/ReleaseListCell.js +103 -0
  34. package/dist/admin/components/ReleaseListCell.js.map +1 -0
  35. package/dist/admin/components/ReleaseListCell.mjs +100 -0
  36. package/dist/admin/components/ReleaseListCell.mjs.map +1 -0
  37. package/dist/admin/components/ReleaseModal.js +323 -0
  38. package/dist/admin/components/ReleaseModal.js.map +1 -0
  39. package/dist/admin/components/ReleaseModal.mjs +302 -0
  40. package/dist/admin/components/ReleaseModal.mjs.map +1 -0
  41. package/dist/admin/components/ReleasesPanel.js +138 -0
  42. package/dist/admin/components/ReleasesPanel.js.map +1 -0
  43. package/dist/admin/components/ReleasesPanel.mjs +136 -0
  44. package/dist/admin/components/ReleasesPanel.mjs.map +1 -0
  45. package/dist/admin/components/Widgets.js +122 -0
  46. package/dist/admin/components/Widgets.js.map +1 -0
  47. package/dist/admin/components/Widgets.mjs +120 -0
  48. package/dist/admin/components/Widgets.mjs.map +1 -0
  49. package/dist/admin/constants.js +79 -0
  50. package/dist/admin/constants.js.map +1 -0
  51. package/dist/admin/constants.mjs +76 -0
  52. package/dist/admin/constants.mjs.map +1 -0
  53. package/dist/admin/index.js +143 -14
  54. package/dist/admin/index.js.map +1 -1
  55. package/dist/admin/index.mjs +144 -13
  56. package/dist/admin/index.mjs.map +1 -1
  57. package/dist/admin/{chunks/hooks-DA5VbUAp.js → modules/hooks.js} +1 -1
  58. package/dist/admin/modules/hooks.js.map +1 -0
  59. package/dist/admin/{chunks/hooks-CFk_8Q0b.mjs → modules/hooks.mjs} +2 -2
  60. package/dist/admin/modules/hooks.mjs.map +1 -0
  61. package/dist/admin/pages/App.js +29 -0
  62. package/dist/admin/pages/App.js.map +1 -0
  63. package/dist/admin/pages/App.mjs +27 -0
  64. package/dist/admin/pages/App.mjs.map +1 -0
  65. package/dist/admin/pages/PurchaseContentReleases.js +192 -0
  66. package/dist/admin/pages/PurchaseContentReleases.js.map +1 -0
  67. package/dist/admin/pages/PurchaseContentReleases.mjs +190 -0
  68. package/dist/admin/pages/PurchaseContentReleases.mjs.map +1 -0
  69. package/dist/admin/pages/ReleaseDetailsPage.js +772 -0
  70. package/dist/admin/pages/ReleaseDetailsPage.js.map +1 -0
  71. package/dist/admin/pages/ReleaseDetailsPage.mjs +751 -0
  72. package/dist/admin/pages/ReleaseDetailsPage.mjs.map +1 -0
  73. package/dist/admin/pages/ReleasesPage.js +403 -0
  74. package/dist/admin/pages/ReleasesPage.js.map +1 -0
  75. package/dist/admin/pages/ReleasesPage.mjs +381 -0
  76. package/dist/admin/pages/ReleasesPage.mjs.map +1 -0
  77. package/dist/admin/{chunks/ReleasesSettingsPage-DV_y1NJZ.js → pages/ReleasesSettingsPage.js} +44 -26
  78. package/dist/admin/pages/ReleasesSettingsPage.js.map +1 -0
  79. package/dist/admin/{chunks/ReleasesSettingsPage-lky_0-wG.mjs → pages/ReleasesSettingsPage.mjs} +41 -23
  80. package/dist/admin/pages/ReleasesSettingsPage.mjs.map +1 -0
  81. package/dist/admin/pluginId.js +6 -0
  82. package/dist/admin/pluginId.js.map +1 -0
  83. package/dist/admin/pluginId.mjs +4 -0
  84. package/dist/admin/pluginId.mjs.map +1 -0
  85. package/dist/admin/services/homepage.js +24 -0
  86. package/dist/admin/services/homepage.js.map +1 -0
  87. package/dist/admin/services/homepage.mjs +22 -0
  88. package/dist/admin/services/homepage.mjs.map +1 -0
  89. package/dist/admin/services/release.js +474 -0
  90. package/dist/admin/services/release.js.map +1 -0
  91. package/dist/admin/services/release.mjs +457 -0
  92. package/dist/admin/services/release.mjs.map +1 -0
  93. package/dist/admin/src/components/Widgets.d.ts +2 -0
  94. package/dist/admin/src/constants.d.ts +1 -0
  95. package/dist/admin/src/services/homepage.d.ts +9 -0
  96. package/dist/admin/src/services/release.d.ts +28 -28
  97. package/dist/admin/store/hooks.js +8 -0
  98. package/dist/admin/store/hooks.js.map +1 -0
  99. package/dist/admin/store/hooks.mjs +6 -0
  100. package/dist/admin/store/hooks.mjs.map +1 -0
  101. package/dist/admin/{chunks/en-BOpqX2t_.js → translations/en.json.js} +8 -5
  102. package/dist/admin/translations/en.json.js.map +1 -0
  103. package/dist/admin/{chunks/en-aQo8Bn_U.mjs → translations/en.json.mjs} +7 -4
  104. package/dist/admin/translations/en.json.mjs.map +1 -0
  105. package/dist/admin/{chunks/uk-9T9su-bj.js → translations/uk.json.js} +2 -2
  106. package/dist/admin/translations/uk.json.js.map +1 -0
  107. package/dist/admin/{chunks/uk-Bp9HotPq.mjs → translations/uk.json.mjs} +1 -1
  108. package/dist/admin/translations/uk.json.mjs.map +1 -0
  109. package/dist/admin/utils/api.js +8 -0
  110. package/dist/admin/utils/api.js.map +1 -0
  111. package/dist/admin/utils/api.mjs +6 -0
  112. package/dist/admin/utils/api.mjs.map +1 -0
  113. package/dist/admin/utils/prefixPluginTranslations.js +11 -0
  114. package/dist/admin/utils/prefixPluginTranslations.js.map +1 -0
  115. package/dist/admin/utils/prefixPluginTranslations.mjs +9 -0
  116. package/dist/admin/utils/prefixPluginTranslations.mjs.map +1 -0
  117. package/dist/admin/utils/time.js +42 -0
  118. package/dist/admin/utils/time.js.map +1 -0
  119. package/dist/admin/utils/time.mjs +39 -0
  120. package/dist/admin/utils/time.mjs.map +1 -0
  121. package/dist/admin/{chunks/schemas-DS7NeFDN.js → validation/schemas.js} +1 -1
  122. package/dist/admin/validation/schemas.js.map +1 -0
  123. package/dist/admin/{chunks/schemas-DMt8h1z-.mjs → validation/schemas.mjs} +2 -2
  124. package/dist/admin/validation/schemas.mjs.map +1 -0
  125. package/dist/server/bootstrap.js +68 -0
  126. package/dist/server/bootstrap.js.map +1 -0
  127. package/dist/server/bootstrap.mjs +66 -0
  128. package/dist/server/bootstrap.mjs.map +1 -0
  129. package/dist/server/constants.js +74 -0
  130. package/dist/server/constants.js.map +1 -0
  131. package/dist/server/constants.mjs +69 -0
  132. package/dist/server/constants.mjs.map +1 -0
  133. package/dist/server/content-types/index.js +12 -0
  134. package/dist/server/content-types/index.js.map +1 -0
  135. package/dist/server/content-types/index.mjs +10 -0
  136. package/dist/server/content-types/index.mjs.map +1 -0
  137. package/dist/server/content-types/release/index.js +10 -0
  138. package/dist/server/content-types/release/index.js.map +1 -0
  139. package/dist/server/content-types/release/index.mjs +8 -0
  140. package/dist/server/content-types/release/index.mjs.map +1 -0
  141. package/dist/server/content-types/release/schema.js +58 -0
  142. package/dist/server/content-types/release/schema.js.map +1 -0
  143. package/dist/server/content-types/release/schema.mjs +56 -0
  144. package/dist/server/content-types/release/schema.mjs.map +1 -0
  145. package/dist/server/content-types/release-action/index.js +10 -0
  146. package/dist/server/content-types/release-action/index.js.map +1 -0
  147. package/dist/server/content-types/release-action/index.mjs +8 -0
  148. package/dist/server/content-types/release-action/index.mjs.map +1 -0
  149. package/dist/server/content-types/release-action/schema.js +55 -0
  150. package/dist/server/content-types/release-action/schema.js.map +1 -0
  151. package/dist/server/content-types/release-action/schema.mjs +53 -0
  152. package/dist/server/content-types/release-action/schema.mjs.map +1 -0
  153. package/dist/server/controllers/homepage.js +15 -0
  154. package/dist/server/controllers/homepage.js.map +1 -0
  155. package/dist/server/controllers/homepage.mjs +13 -0
  156. package/dist/server/controllers/homepage.mjs.map +1 -0
  157. package/dist/server/controllers/index.js +16 -0
  158. package/dist/server/controllers/index.js.map +1 -0
  159. package/dist/server/controllers/index.mjs +14 -0
  160. package/dist/server/controllers/index.mjs.map +1 -0
  161. package/dist/server/controllers/release-action.js +150 -0
  162. package/dist/server/controllers/release-action.js.map +1 -0
  163. package/dist/server/controllers/release-action.mjs +148 -0
  164. package/dist/server/controllers/release-action.mjs.map +1 -0
  165. package/dist/server/controllers/release.js +302 -0
  166. package/dist/server/controllers/release.js.map +1 -0
  167. package/dist/server/controllers/release.mjs +300 -0
  168. package/dist/server/controllers/release.mjs.map +1 -0
  169. package/dist/server/controllers/settings.js +37 -0
  170. package/dist/server/controllers/settings.js.map +1 -0
  171. package/dist/server/controllers/settings.mjs +35 -0
  172. package/dist/server/controllers/settings.mjs.map +1 -0
  173. package/dist/server/controllers/validation/release-action.js +34 -0
  174. package/dist/server/controllers/validation/release-action.js.map +1 -0
  175. package/dist/server/controllers/validation/release-action.mjs +30 -0
  176. package/dist/server/controllers/validation/release-action.mjs.map +1 -0
  177. package/dist/server/controllers/validation/release.js +26 -0
  178. package/dist/server/controllers/validation/release.js.map +1 -0
  179. package/dist/server/controllers/validation/release.mjs +22 -0
  180. package/dist/server/controllers/validation/release.mjs.map +1 -0
  181. package/dist/server/controllers/validation/settings.js +32 -0
  182. package/dist/server/controllers/validation/settings.js.map +1 -0
  183. package/dist/server/controllers/validation/settings.mjs +10 -0
  184. package/dist/server/controllers/validation/settings.mjs.map +1 -0
  185. package/dist/server/destroy.js +15 -0
  186. package/dist/server/destroy.js.map +1 -0
  187. package/dist/server/destroy.mjs +13 -0
  188. package/dist/server/destroy.mjs.map +1 -0
  189. package/dist/server/index.js +16 -2336
  190. package/dist/server/index.js.map +1 -1
  191. package/dist/server/index.mjs +7 -2308
  192. package/dist/server/index.mjs.map +1 -1
  193. package/dist/server/middlewares/documents.js +104 -0
  194. package/dist/server/middlewares/documents.js.map +1 -0
  195. package/dist/server/middlewares/documents.mjs +101 -0
  196. package/dist/server/middlewares/documents.mjs.map +1 -0
  197. package/dist/server/migrations/database/5.0.0-document-id-in-actions.js +51 -0
  198. package/dist/server/migrations/database/5.0.0-document-id-in-actions.js.map +1 -0
  199. package/dist/server/migrations/database/5.0.0-document-id-in-actions.mjs +49 -0
  200. package/dist/server/migrations/database/5.0.0-document-id-in-actions.mjs.map +1 -0
  201. package/dist/server/migrations/index.js +205 -0
  202. package/dist/server/migrations/index.js.map +1 -0
  203. package/dist/server/migrations/index.mjs +198 -0
  204. package/dist/server/migrations/index.mjs.map +1 -0
  205. package/dist/server/register.js +23 -0
  206. package/dist/server/register.js.map +1 -0
  207. package/dist/server/register.mjs +21 -0
  208. package/dist/server/register.mjs.map +1 -0
  209. package/dist/server/routes/homepage.js +25 -0
  210. package/dist/server/routes/homepage.js.map +1 -0
  211. package/dist/server/routes/homepage.mjs +23 -0
  212. package/dist/server/routes/homepage.mjs.map +1 -0
  213. package/dist/server/routes/index.js +16 -0
  214. package/dist/server/routes/index.js.map +1 -0
  215. package/dist/server/routes/index.mjs +14 -0
  216. package/dist/server/routes/index.mjs.map +1 -0
  217. package/dist/server/routes/release-action.js +100 -0
  218. package/dist/server/routes/release-action.js.map +1 -0
  219. package/dist/server/routes/release-action.mjs +98 -0
  220. package/dist/server/routes/release-action.mjs.map +1 -0
  221. package/dist/server/routes/release.js +154 -0
  222. package/dist/server/routes/release.js.map +1 -0
  223. package/dist/server/routes/release.mjs +152 -0
  224. package/dist/server/routes/release.mjs.map +1 -0
  225. package/dist/server/routes/settings.js +46 -0
  226. package/dist/server/routes/settings.js.map +1 -0
  227. package/dist/server/routes/settings.mjs +44 -0
  228. package/dist/server/routes/settings.mjs.map +1 -0
  229. package/dist/server/services/homepage.js +26 -0
  230. package/dist/server/services/homepage.js.map +1 -0
  231. package/dist/server/services/homepage.mjs +24 -0
  232. package/dist/server/services/homepage.mjs.map +1 -0
  233. package/dist/server/services/index.js +20 -0
  234. package/dist/server/services/index.js.map +1 -0
  235. package/dist/server/services/index.mjs +18 -0
  236. package/dist/server/services/index.mjs.map +1 -0
  237. package/dist/server/services/release-action.js +324 -0
  238. package/dist/server/services/release-action.js.map +1 -0
  239. package/dist/server/services/release-action.mjs +322 -0
  240. package/dist/server/services/release-action.mjs.map +1 -0
  241. package/dist/server/services/release.js +324 -0
  242. package/dist/server/services/release.js.map +1 -0
  243. package/dist/server/services/release.mjs +322 -0
  244. package/dist/server/services/release.mjs.map +1 -0
  245. package/dist/server/services/scheduling.js +74 -0
  246. package/dist/server/services/scheduling.js.map +1 -0
  247. package/dist/server/services/scheduling.mjs +72 -0
  248. package/dist/server/services/scheduling.mjs.map +1 -0
  249. package/dist/server/services/settings.js +34 -0
  250. package/dist/server/services/settings.js.map +1 -0
  251. package/dist/server/services/settings.mjs +32 -0
  252. package/dist/server/services/settings.mjs.map +1 -0
  253. package/dist/server/services/validation.js +91 -0
  254. package/dist/server/services/validation.js.map +1 -0
  255. package/dist/server/services/validation.mjs +86 -0
  256. package/dist/server/services/validation.mjs.map +1 -0
  257. package/dist/server/src/controllers/homepage.d.ts +6 -0
  258. package/dist/server/src/controllers/homepage.d.ts.map +1 -0
  259. package/dist/server/src/controllers/index.d.ts +3 -0
  260. package/dist/server/src/controllers/index.d.ts.map +1 -1
  261. package/dist/server/src/destroy.d.ts.map +1 -1
  262. package/dist/server/src/index.d.ts +13 -4
  263. package/dist/server/src/index.d.ts.map +1 -1
  264. package/dist/server/src/routes/homepage.d.ts +4 -0
  265. package/dist/server/src/routes/homepage.d.ts.map +1 -0
  266. package/dist/server/src/routes/index.d.ts +1 -0
  267. package/dist/server/src/routes/index.d.ts.map +1 -1
  268. package/dist/server/src/services/homepage.d.ts +9 -0
  269. package/dist/server/src/services/homepage.d.ts.map +1 -0
  270. package/dist/server/src/services/index.d.ts +9 -4
  271. package/dist/server/src/services/index.d.ts.map +1 -1
  272. package/dist/server/src/services/release-action.d.ts.map +1 -1
  273. package/dist/server/src/services/scheduling.d.ts +4 -5
  274. package/dist/server/src/services/scheduling.d.ts.map +1 -1
  275. package/dist/server/src/utils/index.d.ts.map +1 -1
  276. package/dist/server/utils/index.js +94 -0
  277. package/dist/server/utils/index.js.map +1 -0
  278. package/dist/server/utils/index.mjs +88 -0
  279. package/dist/server/utils/index.mjs.map +1 -0
  280. package/dist/shared/contracts/homepage.d.ts +11 -0
  281. package/dist/shared/contracts/homepage.d.ts.map +1 -0
  282. package/dist/shared/types.d.ts +1 -0
  283. package/dist/shared/types.d.ts.map +1 -1
  284. package/package.json +10 -11
  285. package/dist/admin/chunks/App-BEyv0kMo.mjs +0 -1845
  286. package/dist/admin/chunks/App-BEyv0kMo.mjs.map +0 -1
  287. package/dist/admin/chunks/App-BG-3LItb.js +0 -1866
  288. package/dist/admin/chunks/App-BG-3LItb.js.map +0 -1
  289. package/dist/admin/chunks/PurchaseContentReleases-U5sGMPgR.mjs +0 -173
  290. package/dist/admin/chunks/PurchaseContentReleases-U5sGMPgR.mjs.map +0 -1
  291. package/dist/admin/chunks/PurchaseContentReleases-hRg6ejD7.js +0 -175
  292. package/dist/admin/chunks/PurchaseContentReleases-hRg6ejD7.js.map +0 -1
  293. package/dist/admin/chunks/ReleasesSettingsPage-DV_y1NJZ.js.map +0 -1
  294. package/dist/admin/chunks/ReleasesSettingsPage-lky_0-wG.mjs.map +0 -1
  295. package/dist/admin/chunks/en-BOpqX2t_.js.map +0 -1
  296. package/dist/admin/chunks/en-aQo8Bn_U.mjs.map +0 -1
  297. package/dist/admin/chunks/hooks-CFk_8Q0b.mjs.map +0 -1
  298. package/dist/admin/chunks/hooks-DA5VbUAp.js.map +0 -1
  299. package/dist/admin/chunks/index-BZaFIG8z.js +0 -1658
  300. package/dist/admin/chunks/index-BZaFIG8z.js.map +0 -1
  301. package/dist/admin/chunks/index-DEy-8PzZ.mjs +0 -1619
  302. package/dist/admin/chunks/index-DEy-8PzZ.mjs.map +0 -1
  303. package/dist/admin/chunks/schemas-DMt8h1z-.mjs.map +0 -1
  304. package/dist/admin/chunks/schemas-DS7NeFDN.js.map +0 -1
  305. package/dist/admin/chunks/uk-9T9su-bj.js.map +0 -1
  306. package/dist/admin/chunks/uk-Bp9HotPq.mjs.map +0 -1
@@ -0,0 +1,381 @@
1
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
+ import * as React from 'react';
3
+ import { useNotification, useAPIErrorHandler, useQueryParams, useTracking, useRBAC, Page, Layouts, GradientBadge, Pagination, isFetchError } from '@strapi/admin/strapi-admin';
4
+ import { useLicenseLimits } from '@strapi/admin/strapi-admin/ee';
5
+ import { Link, Alert, Main, Button, Tabs, Box, Divider, EmptyStateLayout, Grid, Flex, Typography, Badge } from '@strapi/design-system';
6
+ import { Plus } from '@strapi/icons';
7
+ import { EmptyDocuments } from '@strapi/icons/symbols';
8
+ import { format } from 'date-fns';
9
+ import { useIntl } from 'react-intl';
10
+ import { useLocation, useNavigate, NavLink } from 'react-router-dom';
11
+ import { styled } from 'styled-components';
12
+ import { RelativeTime as RelativeTime$1 } from '../components/RelativeTime.mjs';
13
+ import { ReleaseModal } from '../components/ReleaseModal.mjs';
14
+ import { PERMISSIONS } from '../constants.mjs';
15
+ import { useGetReleasesQuery, useGetReleaseSettingsQuery, useCreateReleaseMutation } from '../services/release.mjs';
16
+
17
+ const LinkCard = styled(Link)`
18
+ display: block;
19
+ `;
20
+ const RelativeTime = styled(RelativeTime$1)`
21
+ display: inline-block;
22
+ &::first-letter {
23
+ text-transform: uppercase;
24
+ }
25
+ `;
26
+ const getBadgeProps = (status)=>{
27
+ let color;
28
+ switch(status){
29
+ case 'ready':
30
+ color = 'success';
31
+ break;
32
+ case 'blocked':
33
+ color = 'warning';
34
+ break;
35
+ case 'failed':
36
+ color = 'danger';
37
+ break;
38
+ case 'done':
39
+ color = 'primary';
40
+ break;
41
+ case 'empty':
42
+ default:
43
+ color = 'neutral';
44
+ }
45
+ return {
46
+ textColor: `${color}600`,
47
+ backgroundColor: `${color}100`,
48
+ borderColor: `${color}200`
49
+ };
50
+ };
51
+ const ReleasesGrid = ({ sectionTitle, releases = [], isError = false })=>{
52
+ const { formatMessage } = useIntl();
53
+ if (isError) {
54
+ return /*#__PURE__*/ jsx(Page.Error, {});
55
+ }
56
+ if (releases?.length === 0) {
57
+ return /*#__PURE__*/ jsx(EmptyStateLayout, {
58
+ content: formatMessage({
59
+ id: 'content-releases.page.Releases.tab.emptyEntries',
60
+ defaultMessage: 'No releases'
61
+ }, {
62
+ target: sectionTitle
63
+ }),
64
+ icon: /*#__PURE__*/ jsx(EmptyDocuments, {
65
+ width: "16rem"
66
+ })
67
+ });
68
+ }
69
+ return /*#__PURE__*/ jsx(Grid.Root, {
70
+ gap: 4,
71
+ children: releases.map(({ id, name, scheduledAt, status })=>/*#__PURE__*/ jsx(Grid.Item, {
72
+ col: 3,
73
+ s: 6,
74
+ xs: 12,
75
+ direction: "column",
76
+ alignItems: "stretch",
77
+ children: /*#__PURE__*/ jsx(LinkCard, {
78
+ tag: NavLink,
79
+ to: `${id}`,
80
+ isExternal: false,
81
+ children: /*#__PURE__*/ jsxs(Flex, {
82
+ direction: "column",
83
+ justifyContent: "space-between",
84
+ padding: 4,
85
+ hasRadius: true,
86
+ background: "neutral0",
87
+ shadow: "tableShadow",
88
+ height: "100%",
89
+ width: "100%",
90
+ alignItems: "start",
91
+ gap: 4,
92
+ children: [
93
+ /*#__PURE__*/ jsxs(Flex, {
94
+ direction: "column",
95
+ alignItems: "start",
96
+ gap: 1,
97
+ children: [
98
+ /*#__PURE__*/ jsx(Typography, {
99
+ textColor: "neutral800",
100
+ tag: "h3",
101
+ variant: "delta",
102
+ fontWeight: "bold",
103
+ children: name
104
+ }),
105
+ /*#__PURE__*/ jsx(Typography, {
106
+ variant: "pi",
107
+ textColor: "neutral600",
108
+ children: scheduledAt ? /*#__PURE__*/ jsx(RelativeTime, {
109
+ timestamp: new Date(scheduledAt)
110
+ }) : formatMessage({
111
+ id: 'content-releases.pages.Releases.not-scheduled',
112
+ defaultMessage: 'Not scheduled'
113
+ })
114
+ })
115
+ ]
116
+ }),
117
+ /*#__PURE__*/ jsx(Badge, {
118
+ ...getBadgeProps(status),
119
+ children: status
120
+ })
121
+ ]
122
+ })
123
+ })
124
+ }, id))
125
+ });
126
+ };
127
+ /* -------------------------------------------------------------------------------------------------
128
+ * ReleasesPage
129
+ * -----------------------------------------------------------------------------------------------*/ const StyledAlert = styled(Alert)`
130
+ button {
131
+ display: none;
132
+ }
133
+ p + div {
134
+ margin-left: auto;
135
+ }
136
+ `;
137
+ const INITIAL_FORM_VALUES = {
138
+ name: '',
139
+ date: format(new Date(), 'yyyy-MM-dd'),
140
+ time: '',
141
+ isScheduled: true,
142
+ scheduledAt: null,
143
+ timezone: null
144
+ };
145
+ const ReleasesPage = ()=>{
146
+ const location = useLocation();
147
+ const [releaseModalShown, setReleaseModalShown] = React.useState(false);
148
+ const { toggleNotification } = useNotification();
149
+ const { formatMessage } = useIntl();
150
+ const navigate = useNavigate();
151
+ const { formatAPIError } = useAPIErrorHandler();
152
+ const [{ query }, setQuery] = useQueryParams();
153
+ const response = useGetReleasesQuery(query);
154
+ const { data, isLoading: isLoadingSettings } = useGetReleaseSettingsQuery();
155
+ const [createRelease, { isLoading: isSubmittingForm }] = useCreateReleaseMutation();
156
+ const { getFeature } = useLicenseLimits();
157
+ const { maximumReleases = 3 } = getFeature('cms-content-releases');
158
+ const { trackUsage } = useTracking();
159
+ const { allowedActions: { canCreate } } = useRBAC(PERMISSIONS);
160
+ const { isLoading: isLoadingReleases, isSuccess, isError } = response;
161
+ const activeTab = response?.currentData?.meta?.activeTab || 'pending';
162
+ // Check if we have some errors and show a notification to the user to explain the error
163
+ React.useEffect(()=>{
164
+ if (location?.state?.errors) {
165
+ toggleNotification({
166
+ type: 'danger',
167
+ title: formatMessage({
168
+ id: 'content-releases.pages.Releases.notification.error.title',
169
+ defaultMessage: 'Your request could not be processed.'
170
+ }),
171
+ message: formatMessage({
172
+ id: 'content-releases.pages.Releases.notification.error.message',
173
+ defaultMessage: 'Please try again or open another release.'
174
+ })
175
+ });
176
+ navigate('', {
177
+ replace: true,
178
+ state: null
179
+ });
180
+ }
181
+ }, [
182
+ formatMessage,
183
+ location?.state?.errors,
184
+ navigate,
185
+ toggleNotification
186
+ ]);
187
+ const toggleAddReleaseModal = ()=>{
188
+ setReleaseModalShown((prev)=>!prev);
189
+ };
190
+ if (isLoadingReleases || isLoadingSettings) {
191
+ return /*#__PURE__*/ jsx(Page.Loading, {});
192
+ }
193
+ const totalPendingReleases = isSuccess && response.currentData?.meta?.pendingReleasesCount || 0;
194
+ const hasReachedMaximumPendingReleases = totalPendingReleases >= maximumReleases;
195
+ const handleTabChange = (tabValue)=>{
196
+ setQuery({
197
+ ...query,
198
+ page: 1,
199
+ pageSize: response?.currentData?.meta?.pagination?.pageSize || 16,
200
+ filters: {
201
+ releasedAt: {
202
+ $notNull: tabValue !== 'pending'
203
+ }
204
+ }
205
+ });
206
+ };
207
+ const handleAddRelease = async ({ name, scheduledAt, timezone })=>{
208
+ const response = await createRelease({
209
+ name,
210
+ scheduledAt,
211
+ timezone
212
+ });
213
+ if ('data' in response) {
214
+ // When the response returns an object with 'data', handle success
215
+ toggleNotification({
216
+ type: 'success',
217
+ message: formatMessage({
218
+ id: 'content-releases.modal.release-created-notification-success',
219
+ defaultMessage: 'Release created.'
220
+ })
221
+ });
222
+ trackUsage('didCreateRelease');
223
+ navigate(response.data.data.id.toString());
224
+ } else if (isFetchError(response.error)) {
225
+ // When the response returns an object with 'error', handle fetch error
226
+ toggleNotification({
227
+ type: 'danger',
228
+ message: formatAPIError(response.error)
229
+ });
230
+ } else {
231
+ // Otherwise, the response returns an object with 'error', handle a generic error
232
+ toggleNotification({
233
+ type: 'danger',
234
+ message: formatMessage({
235
+ id: 'notification.error',
236
+ defaultMessage: 'An error occurred'
237
+ })
238
+ });
239
+ }
240
+ };
241
+ return /*#__PURE__*/ jsxs(Main, {
242
+ "aria-busy": isLoadingReleases || isLoadingSettings,
243
+ children: [
244
+ /*#__PURE__*/ jsx(Layouts.Header, {
245
+ title: formatMessage({
246
+ id: 'content-releases.pages.Releases.title',
247
+ defaultMessage: 'Releases'
248
+ }),
249
+ secondaryAction: /*#__PURE__*/ jsx(GradientBadge, {
250
+ label: formatMessage({
251
+ id: 'components.premiumFeature.title',
252
+ defaultMessage: 'Premium feature'
253
+ })
254
+ }),
255
+ subtitle: formatMessage({
256
+ id: 'content-releases.pages.Releases.header-subtitle',
257
+ defaultMessage: 'Create and manage content updates'
258
+ }),
259
+ primaryAction: canCreate ? /*#__PURE__*/ jsx(Button, {
260
+ startIcon: /*#__PURE__*/ jsx(Plus, {}),
261
+ onClick: toggleAddReleaseModal,
262
+ disabled: hasReachedMaximumPendingReleases,
263
+ children: formatMessage({
264
+ id: 'content-releases.header.actions.add-release',
265
+ defaultMessage: 'New release'
266
+ })
267
+ }) : null
268
+ }),
269
+ /*#__PURE__*/ jsx(Layouts.Content, {
270
+ children: /*#__PURE__*/ jsxs(Fragment, {
271
+ children: [
272
+ hasReachedMaximumPendingReleases && /*#__PURE__*/ jsx(StyledAlert, {
273
+ marginBottom: 6,
274
+ action: /*#__PURE__*/ jsx(Link, {
275
+ href: "https://strapi.io/pricing-cloud",
276
+ isExternal: true,
277
+ children: formatMessage({
278
+ id: 'content-releases.pages.Releases.max-limit-reached.action',
279
+ defaultMessage: 'Explore plans'
280
+ })
281
+ }),
282
+ title: formatMessage({
283
+ id: 'content-releases.pages.Releases.max-limit-reached.title',
284
+ defaultMessage: 'You have reached the {number} pending {number, plural, one {release} other {releases}} limit.'
285
+ }, {
286
+ number: maximumReleases
287
+ }),
288
+ onClose: ()=>{},
289
+ closeLabel: "",
290
+ children: formatMessage({
291
+ id: 'content-releases.pages.Releases.max-limit-reached.message',
292
+ defaultMessage: 'Upgrade to manage an unlimited number of releases.'
293
+ })
294
+ }),
295
+ /*#__PURE__*/ jsxs(Tabs.Root, {
296
+ variant: "simple",
297
+ onValueChange: handleTabChange,
298
+ value: activeTab,
299
+ children: [
300
+ /*#__PURE__*/ jsxs(Box, {
301
+ paddingBottom: 8,
302
+ children: [
303
+ /*#__PURE__*/ jsxs(Tabs.List, {
304
+ "aria-label": formatMessage({
305
+ id: 'content-releases.pages.Releases.tab-group.label',
306
+ defaultMessage: 'Releases list'
307
+ }),
308
+ children: [
309
+ /*#__PURE__*/ jsx(Tabs.Trigger, {
310
+ value: "pending",
311
+ children: formatMessage({
312
+ id: 'content-releases.pages.Releases.tab.pending',
313
+ defaultMessage: 'Pending ({count})'
314
+ }, {
315
+ count: totalPendingReleases
316
+ })
317
+ }),
318
+ /*#__PURE__*/ jsx(Tabs.Trigger, {
319
+ value: "done",
320
+ children: formatMessage({
321
+ id: 'content-releases.pages.Releases.tab.done',
322
+ defaultMessage: 'Done'
323
+ })
324
+ })
325
+ ]
326
+ }),
327
+ /*#__PURE__*/ jsx(Divider, {})
328
+ ]
329
+ }),
330
+ /*#__PURE__*/ jsx(Tabs.Content, {
331
+ value: "pending",
332
+ children: /*#__PURE__*/ jsx(ReleasesGrid, {
333
+ sectionTitle: "pending",
334
+ releases: response?.currentData?.data,
335
+ isError: isError
336
+ })
337
+ }),
338
+ /*#__PURE__*/ jsx(Tabs.Content, {
339
+ value: "done",
340
+ children: /*#__PURE__*/ jsx(ReleasesGrid, {
341
+ sectionTitle: "done",
342
+ releases: response?.currentData?.data,
343
+ isError: isError
344
+ })
345
+ })
346
+ ]
347
+ }),
348
+ /*#__PURE__*/ jsxs(Pagination.Root, {
349
+ ...response?.currentData?.meta?.pagination,
350
+ defaultPageSize: response?.currentData?.meta?.pagination?.pageSize,
351
+ children: [
352
+ /*#__PURE__*/ jsx(Pagination.PageSize, {
353
+ options: [
354
+ '8',
355
+ '16',
356
+ '32',
357
+ '64'
358
+ ]
359
+ }),
360
+ /*#__PURE__*/ jsx(Pagination.Links, {})
361
+ ]
362
+ })
363
+ ]
364
+ })
365
+ }),
366
+ /*#__PURE__*/ jsx(ReleaseModal, {
367
+ open: releaseModalShown,
368
+ handleClose: toggleAddReleaseModal,
369
+ handleSubmit: handleAddRelease,
370
+ isLoading: isSubmittingForm,
371
+ initialValues: {
372
+ ...INITIAL_FORM_VALUES,
373
+ timezone: data?.data.defaultTimezone ? data.data.defaultTimezone.split('&')[1] : null
374
+ }
375
+ })
376
+ ]
377
+ });
378
+ };
379
+
380
+ export { ReleasesPage, getBadgeProps };
381
+ //# sourceMappingURL=ReleasesPage.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReleasesPage.mjs","sources":["../../../admin/src/pages/ReleasesPage.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Page,\n Pagination,\n useTracking,\n useAPIErrorHandler,\n useNotification,\n useQueryParams,\n useRBAC,\n isFetchError,\n Layouts,\n GradientBadge,\n} from '@strapi/admin/strapi-admin';\nimport { useLicenseLimits } from '@strapi/admin/strapi-admin/ee';\nimport {\n Alert,\n Badge,\n Box,\n Button,\n Divider,\n EmptyStateLayout,\n Flex,\n Grid,\n Main,\n Tabs,\n Typography,\n Link,\n} from '@strapi/design-system';\nimport { Plus } from '@strapi/icons';\nimport { EmptyDocuments } from '@strapi/icons/symbols';\nimport { format } from 'date-fns';\nimport { useIntl } from 'react-intl';\nimport { useNavigate, useLocation, NavLink } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { GetReleases, type Release } from '../../../shared/contracts/releases';\nimport { RelativeTime as BaseRelativeTime } from '../components/RelativeTime';\nimport { ReleaseModal, FormValues } from '../components/ReleaseModal';\nimport { PERMISSIONS } from '../constants';\nimport {\n useGetReleasesQuery,\n useGetReleaseSettingsQuery,\n GetReleasesQueryParams,\n useCreateReleaseMutation,\n} from '../services/release';\n\n/* -------------------------------------------------------------------------------------------------\n * ReleasesGrid\n * -----------------------------------------------------------------------------------------------*/\ninterface ReleasesGridProps {\n sectionTitle: 'pending' | 'done';\n releases?: GetReleases.Response['data'];\n isError?: boolean;\n}\n\nconst LinkCard = styled(Link)`\n display: block;\n`;\n\nconst RelativeTime = styled(BaseRelativeTime)`\n display: inline-block;\n &::first-letter {\n text-transform: uppercase;\n }\n`;\n\nconst getBadgeProps = (status: Release['status']) => {\n let color;\n switch (status) {\n case 'ready':\n color = 'success';\n break;\n case 'blocked':\n color = 'warning';\n break;\n case 'failed':\n color = 'danger';\n break;\n case 'done':\n color = 'primary';\n break;\n case 'empty':\n default:\n color = 'neutral';\n }\n\n return {\n textColor: `${color}600`,\n backgroundColor: `${color}100`,\n borderColor: `${color}200`,\n };\n};\n\nconst ReleasesGrid = ({ sectionTitle, releases = [], isError = false }: ReleasesGridProps) => {\n const { formatMessage } = useIntl();\n\n if (isError) {\n return <Page.Error />;\n }\n\n if (releases?.length === 0) {\n return (\n <EmptyStateLayout\n content={formatMessage(\n {\n id: 'content-releases.page.Releases.tab.emptyEntries',\n defaultMessage: 'No releases',\n },\n {\n target: sectionTitle,\n }\n )}\n icon={<EmptyDocuments width=\"16rem\" />}\n />\n );\n }\n\n return (\n <Grid.Root gap={4}>\n {releases.map(({ id, name, scheduledAt, status }) => (\n <Grid.Item col={3} s={6} xs={12} key={id} direction=\"column\" alignItems=\"stretch\">\n <LinkCard tag={NavLink} to={`${id}`} isExternal={false}>\n <Flex\n direction=\"column\"\n justifyContent=\"space-between\"\n padding={4}\n hasRadius\n background=\"neutral0\"\n shadow=\"tableShadow\"\n height=\"100%\"\n width=\"100%\"\n alignItems=\"start\"\n gap={4}\n >\n <Flex direction=\"column\" alignItems=\"start\" gap={1}>\n <Typography textColor=\"neutral800\" tag=\"h3\" variant=\"delta\" fontWeight=\"bold\">\n {name}\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {scheduledAt ? (\n <RelativeTime timestamp={new Date(scheduledAt)} />\n ) : (\n formatMessage({\n id: 'content-releases.pages.Releases.not-scheduled',\n defaultMessage: 'Not scheduled',\n })\n )}\n </Typography>\n </Flex>\n <Badge {...getBadgeProps(status)}>{status}</Badge>\n </Flex>\n </LinkCard>\n </Grid.Item>\n ))}\n </Grid.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ReleasesPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst StyledAlert = styled(Alert)`\n button {\n display: none;\n }\n p + div {\n margin-left: auto;\n }\n`;\n\nconst INITIAL_FORM_VALUES = {\n name: '',\n date: format(new Date(), 'yyyy-MM-dd'),\n time: '',\n isScheduled: true,\n scheduledAt: null,\n timezone: null,\n} satisfies FormValues;\n\nconst ReleasesPage = () => {\n const location = useLocation();\n const [releaseModalShown, setReleaseModalShown] = React.useState(false);\n const { toggleNotification } = useNotification();\n const { formatMessage } = useIntl();\n const navigate = useNavigate();\n const { formatAPIError } = useAPIErrorHandler();\n const [{ query }, setQuery] = useQueryParams<GetReleasesQueryParams>();\n const response = useGetReleasesQuery(query);\n const { data, isLoading: isLoadingSettings } = useGetReleaseSettingsQuery();\n const [createRelease, { isLoading: isSubmittingForm }] = useCreateReleaseMutation();\n const { getFeature } = useLicenseLimits();\n const { maximumReleases = 3 } = getFeature('cms-content-releases') as {\n maximumReleases: number;\n };\n const { trackUsage } = useTracking();\n const {\n allowedActions: { canCreate },\n } = useRBAC(PERMISSIONS);\n\n const { isLoading: isLoadingReleases, isSuccess, isError } = response;\n const activeTab = response?.currentData?.meta?.activeTab || 'pending';\n\n // Check if we have some errors and show a notification to the user to explain the error\n React.useEffect(() => {\n if (location?.state?.errors) {\n toggleNotification({\n type: 'danger',\n title: formatMessage({\n id: 'content-releases.pages.Releases.notification.error.title',\n defaultMessage: 'Your request could not be processed.',\n }),\n message: formatMessage({\n id: 'content-releases.pages.Releases.notification.error.message',\n defaultMessage: 'Please try again or open another release.',\n }),\n });\n navigate('', { replace: true, state: null });\n }\n }, [formatMessage, location?.state?.errors, navigate, toggleNotification]);\n\n const toggleAddReleaseModal = () => {\n setReleaseModalShown((prev) => !prev);\n };\n\n if (isLoadingReleases || isLoadingSettings) {\n return <Page.Loading />;\n }\n\n const totalPendingReleases = (isSuccess && response.currentData?.meta?.pendingReleasesCount) || 0;\n const hasReachedMaximumPendingReleases = totalPendingReleases >= maximumReleases;\n\n const handleTabChange = (tabValue: string) => {\n setQuery({\n ...query,\n page: 1,\n pageSize: response?.currentData?.meta?.pagination?.pageSize || 16,\n filters: {\n releasedAt: {\n $notNull: tabValue !== 'pending',\n },\n },\n });\n };\n\n const handleAddRelease = async ({ name, scheduledAt, timezone }: FormValues) => {\n const response = await createRelease({\n name,\n scheduledAt,\n timezone,\n });\n if ('data' in response) {\n // When the response returns an object with 'data', handle success\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: 'content-releases.modal.release-created-notification-success',\n defaultMessage: 'Release created.',\n }),\n });\n\n trackUsage('didCreateRelease');\n navigate(response.data.data.id.toString());\n } else if (isFetchError(response.error)) {\n // When the response returns an object with 'error', handle fetch error\n toggleNotification({\n type: 'danger',\n message: formatAPIError(response.error),\n });\n } else {\n // Otherwise, the response returns an object with 'error', handle a generic error\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n };\n\n return (\n <Main aria-busy={isLoadingReleases || isLoadingSettings}>\n <Layouts.Header\n title={formatMessage({\n id: 'content-releases.pages.Releases.title',\n defaultMessage: 'Releases',\n })}\n secondaryAction={\n <GradientBadge\n label={formatMessage({\n id: 'components.premiumFeature.title',\n defaultMessage: 'Premium feature',\n })}\n />\n }\n subtitle={formatMessage({\n id: 'content-releases.pages.Releases.header-subtitle',\n defaultMessage: 'Create and manage content updates',\n })}\n primaryAction={\n canCreate ? (\n <Button\n startIcon={<Plus />}\n onClick={toggleAddReleaseModal}\n disabled={hasReachedMaximumPendingReleases}\n >\n {formatMessage({\n id: 'content-releases.header.actions.add-release',\n defaultMessage: 'New release',\n })}\n </Button>\n ) : null\n }\n />\n <Layouts.Content>\n <>\n {hasReachedMaximumPendingReleases && (\n <StyledAlert\n marginBottom={6}\n action={\n <Link href=\"https://strapi.io/pricing-cloud\" isExternal>\n {formatMessage({\n id: 'content-releases.pages.Releases.max-limit-reached.action',\n defaultMessage: 'Explore plans',\n })}\n </Link>\n }\n title={formatMessage(\n {\n id: 'content-releases.pages.Releases.max-limit-reached.title',\n defaultMessage:\n 'You have reached the {number} pending {number, plural, one {release} other {releases}} limit.',\n },\n { number: maximumReleases }\n )}\n onClose={() => {}}\n closeLabel=\"\"\n >\n {formatMessage({\n id: 'content-releases.pages.Releases.max-limit-reached.message',\n defaultMessage: 'Upgrade to manage an unlimited number of releases.',\n })}\n </StyledAlert>\n )}\n <Tabs.Root variant=\"simple\" onValueChange={handleTabChange} value={activeTab}>\n <Box paddingBottom={8}>\n <Tabs.List\n aria-label={formatMessage({\n id: 'content-releases.pages.Releases.tab-group.label',\n defaultMessage: 'Releases list',\n })}\n >\n <Tabs.Trigger value=\"pending\">\n {formatMessage(\n {\n id: 'content-releases.pages.Releases.tab.pending',\n defaultMessage: 'Pending ({count})',\n },\n {\n count: totalPendingReleases,\n }\n )}\n </Tabs.Trigger>\n <Tabs.Trigger value=\"done\">\n {formatMessage({\n id: 'content-releases.pages.Releases.tab.done',\n defaultMessage: 'Done',\n })}\n </Tabs.Trigger>\n </Tabs.List>\n <Divider />\n </Box>\n {/* Pending releases */}\n <Tabs.Content value=\"pending\">\n <ReleasesGrid\n sectionTitle=\"pending\"\n releases={response?.currentData?.data}\n isError={isError}\n />\n </Tabs.Content>\n {/* Done releases */}\n <Tabs.Content value=\"done\">\n <ReleasesGrid\n sectionTitle=\"done\"\n releases={response?.currentData?.data}\n isError={isError}\n />\n </Tabs.Content>\n </Tabs.Root>\n <Pagination.Root\n {...response?.currentData?.meta?.pagination}\n defaultPageSize={response?.currentData?.meta?.pagination?.pageSize}\n >\n <Pagination.PageSize options={['8', '16', '32', '64']} />\n <Pagination.Links />\n </Pagination.Root>\n </>\n </Layouts.Content>\n <ReleaseModal\n open={releaseModalShown}\n handleClose={toggleAddReleaseModal}\n handleSubmit={handleAddRelease}\n isLoading={isSubmittingForm}\n initialValues={{\n ...INITIAL_FORM_VALUES,\n timezone: data?.data.defaultTimezone ? data.data.defaultTimezone.split('&')[1] : null,\n }}\n />\n </Main>\n );\n};\n\nexport { ReleasesPage, getBadgeProps };\n"],"names":["LinkCard","styled","Link","RelativeTime","BaseRelativeTime","getBadgeProps","status","color","textColor","backgroundColor","borderColor","ReleasesGrid","sectionTitle","releases","isError","formatMessage","useIntl","_jsx","Page","Error","length","EmptyStateLayout","content","id","defaultMessage","target","icon","EmptyDocuments","width","Grid","Root","gap","map","name","scheduledAt","Item","col","s","xs","direction","alignItems","tag","NavLink","to","isExternal","_jsxs","Flex","justifyContent","padding","hasRadius","background","shadow","height","Typography","variant","fontWeight","timestamp","Date","Badge","StyledAlert","Alert","INITIAL_FORM_VALUES","date","format","time","isScheduled","timezone","ReleasesPage","location","useLocation","releaseModalShown","setReleaseModalShown","React","useState","toggleNotification","useNotification","navigate","useNavigate","formatAPIError","useAPIErrorHandler","query","setQuery","useQueryParams","response","useGetReleasesQuery","data","isLoading","isLoadingSettings","useGetReleaseSettingsQuery","createRelease","isSubmittingForm","useCreateReleaseMutation","getFeature","useLicenseLimits","maximumReleases","trackUsage","useTracking","allowedActions","canCreate","useRBAC","PERMISSIONS","isLoadingReleases","isSuccess","activeTab","currentData","meta","useEffect","state","errors","type","title","message","replace","toggleAddReleaseModal","prev","Loading","totalPendingReleases","pendingReleasesCount","hasReachedMaximumPendingReleases","handleTabChange","tabValue","page","pageSize","pagination","filters","releasedAt","$notNull","handleAddRelease","toString","isFetchError","error","Main","aria-busy","Layouts","Header","secondaryAction","GradientBadge","label","subtitle","primaryAction","Button","startIcon","Plus","onClick","disabled","Content","_Fragment","marginBottom","action","href","number","onClose","closeLabel","Tabs","onValueChange","value","Box","paddingBottom","List","aria-label","Trigger","count","Divider","Pagination","defaultPageSize","PageSize","options","Links","ReleaseModal","open","handleClose","handleSubmit","initialValues","defaultTimezone","split"],"mappings":";;;;;;;;;;;;;;;;AAwDA,MAAMA,QAAAA,GAAWC,MAAOC,CAAAA,IAAAA,CAAK;;AAE7B,CAAC;AAED,MAAMC,YAAAA,GAAeF,MAAOG,CAAAA,cAAAA,CAAiB;;;;;AAK7C,CAAC;AAED,MAAMC,gBAAgB,CAACC,MAAAA,GAAAA;IACrB,IAAIC,KAAAA;IACJ,OAAQD,MAAAA;QACN,KAAK,OAAA;YACHC,KAAQ,GAAA,SAAA;AACR,YAAA;QACF,KAAK,SAAA;YACHA,KAAQ,GAAA,SAAA;AACR,YAAA;QACF,KAAK,QAAA;YACHA,KAAQ,GAAA,QAAA;AACR,YAAA;QACF,KAAK,MAAA;YACHA,KAAQ,GAAA,SAAA;AACR,YAAA;QACF,KAAK,OAAA;AACL,QAAA;YACEA,KAAQ,GAAA,SAAA;AACZ;IAEA,OAAO;AACLC,QAAAA,SAAAA,EAAW,CAAC,EAAED,KAAM,CAAA,GAAG,CAAC;AACxBE,QAAAA,eAAAA,EAAiB,CAAC,EAAEF,KAAM,CAAA,GAAG,CAAC;AAC9BG,QAAAA,WAAAA,EAAa,CAAC,EAAEH,KAAM,CAAA,GAAG;AAC3B,KAAA;AACF;AAEA,MAAMI,YAAAA,GAAe,CAAC,EAAEC,YAAY,EAAEC,WAAW,EAAE,EAAEC,OAAU,GAAA,KAAK,EAAqB,GAAA;IACvF,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;AAE1B,IAAA,IAAIF,OAAS,EAAA;QACX,qBAAOG,GAAA,CAACC,KAAKC,KAAK,EAAA,EAAA,CAAA;AACpB;IAEA,IAAIN,QAAAA,EAAUO,WAAW,CAAG,EAAA;AAC1B,QAAA,qBACEH,GAACI,CAAAA,gBAAAA,EAAAA;AACCC,YAAAA,OAAAA,EAASP,aACP,CAAA;gBACEQ,EAAI,EAAA,iDAAA;gBACJC,cAAgB,EAAA;aAElB,EAAA;gBACEC,MAAQb,EAAAA;AACV,aAAA,CAAA;AAEFc,YAAAA,IAAAA,gBAAMT,GAACU,CAAAA,cAAAA,EAAAA;gBAAeC,KAAM,EAAA;;;AAGlC;IAEA,qBACEX,GAAA,CAACY,KAAKC,IAAI,EAAA;QAACC,GAAK,EAAA,CAAA;AACblB,QAAAA,QAAAA,EAAAA,QAAAA,CAASmB,GAAG,CAAC,CAAC,EAAET,EAAE,EAAEU,IAAI,EAAEC,WAAW,EAAE5B,MAAM,EAAE,iBAC9CW,GAAA,CAACY,KAAKM,IAAI,EAAA;gBAACC,GAAK,EAAA,CAAA;gBAAGC,CAAG,EAAA,CAAA;gBAAGC,EAAI,EAAA,EAAA;gBAAaC,SAAU,EAAA,QAAA;gBAASC,UAAW,EAAA,SAAA;AACtE,gBAAA,QAAA,gBAAAvB,GAACjB,CAAAA,QAAAA,EAAAA;oBAASyC,GAAKC,EAAAA,OAAAA;oBAASC,EAAI,EAAA,CAAC,EAAEpB,EAAAA,CAAG,CAAC;oBAAEqB,UAAY,EAAA,KAAA;AAC/C,oBAAA,QAAA,gBAAAC,IAACC,CAAAA,IAAAA,EAAAA;wBACCP,SAAU,EAAA,QAAA;wBACVQ,cAAe,EAAA,eAAA;wBACfC,OAAS,EAAA,CAAA;wBACTC,SAAS,EAAA,IAAA;wBACTC,UAAW,EAAA,UAAA;wBACXC,MAAO,EAAA,aAAA;wBACPC,MAAO,EAAA,MAAA;wBACPxB,KAAM,EAAA,MAAA;wBACNY,UAAW,EAAA,OAAA;wBACXT,GAAK,EAAA,CAAA;;0CAELc,IAACC,CAAAA,IAAAA,EAAAA;gCAAKP,SAAU,EAAA,QAAA;gCAASC,UAAW,EAAA,OAAA;gCAAQT,GAAK,EAAA,CAAA;;kDAC/Cd,GAACoC,CAAAA,UAAAA,EAAAA;wCAAW7C,SAAU,EAAA,YAAA;wCAAaiC,GAAI,EAAA,IAAA;wCAAKa,OAAQ,EAAA,OAAA;wCAAQC,UAAW,EAAA,MAAA;AACpEtB,wCAAAA,QAAAA,EAAAA;;kDAEHhB,GAACoC,CAAAA,UAAAA,EAAAA;wCAAWC,OAAQ,EAAA,IAAA;wCAAK9C,SAAU,EAAA,YAAA;AAChC0B,wCAAAA,QAAAA,EAAAA,WAAAA,iBACCjB,GAACd,CAAAA,YAAAA,EAAAA;AAAaqD,4CAAAA,SAAAA,EAAW,IAAIC,IAAKvB,CAAAA,WAAAA;6CAElCnB,aAAc,CAAA;4CACZQ,EAAI,EAAA,+CAAA;4CACJC,cAAgB,EAAA;AAClB,yCAAA;;;;0CAINP,GAACyC,CAAAA,KAAAA,EAAAA;AAAO,gCAAA,GAAGrD,cAAcC,MAAO,CAAA;AAAGA,gCAAAA,QAAAA,EAAAA;;;;;AA7BHiB,aAAAA,EAAAA,EAAAA,CAAAA;;AAoC9C,CAAA;AAEA;;AAEkG,qGAElG,MAAMoC,WAAAA,GAAc1D,MAAO2D,CAAAA,KAAAA,CAAM;;;;;;;AAOjC,CAAC;AAED,MAAMC,mBAAsB,GAAA;IAC1B5B,IAAM,EAAA,EAAA;IACN6B,IAAMC,EAAAA,MAAAA,CAAO,IAAIN,IAAQ,EAAA,EAAA,YAAA,CAAA;IACzBO,IAAM,EAAA,EAAA;IACNC,WAAa,EAAA,IAAA;IACb/B,WAAa,EAAA,IAAA;IACbgC,QAAU,EAAA;AACZ,CAAA;AAEA,MAAMC,YAAe,GAAA,IAAA;AACnB,IAAA,MAAMC,QAAWC,GAAAA,WAAAA,EAAAA;AACjB,IAAA,MAAM,CAACC,iBAAmBC,EAAAA,oBAAAA,CAAqB,GAAGC,KAAAA,CAAMC,QAAQ,CAAC,KAAA,CAAA;IACjE,MAAM,EAAEC,kBAAkB,EAAE,GAAGC,eAAAA,EAAAA;IAC/B,MAAM,EAAE5D,aAAa,EAAE,GAAGC,OAAAA,EAAAA;AAC1B,IAAA,MAAM4D,QAAWC,GAAAA,WAAAA,EAAAA;IACjB,MAAM,EAAEC,cAAc,EAAE,GAAGC,kBAAAA,EAAAA;AAC3B,IAAA,MAAM,CAAC,EAAEC,KAAK,EAAE,EAAEC,SAAS,GAAGC,cAAAA,EAAAA;AAC9B,IAAA,MAAMC,WAAWC,mBAAoBJ,CAAAA,KAAAA,CAAAA;AACrC,IAAA,MAAM,EAAEK,IAAI,EAAEC,SAAWC,EAAAA,iBAAiB,EAAE,GAAGC,0BAAAA,EAAAA;AAC/C,IAAA,MAAM,CAACC,aAAe,EAAA,EAAEH,WAAWI,gBAAgB,EAAE,CAAC,GAAGC,wBAAAA,EAAAA;IACzD,MAAM,EAAEC,UAAU,EAAE,GAAGC,gBAAAA,EAAAA;AACvB,IAAA,MAAM,EAAEC,eAAAA,GAAkB,CAAC,EAAE,GAAGF,UAAW,CAAA,sBAAA,CAAA;IAG3C,MAAM,EAAEG,UAAU,EAAE,GAAGC,WAAAA,EAAAA;AACvB,IAAA,MAAM,EACJC,cAAgB,EAAA,EAAEC,SAAS,EAAE,EAC9B,GAAGC,OAAQC,CAAAA,WAAAA,CAAAA;IAEZ,MAAM,EAAEd,WAAWe,iBAAiB,EAAEC,SAAS,EAAExF,OAAO,EAAE,GAAGqE,QAAAA;AAC7D,IAAA,MAAMoB,SAAYpB,GAAAA,QAAAA,EAAUqB,WAAaC,EAAAA,IAAAA,EAAMF,SAAa,IAAA,SAAA;;AAG5D/B,IAAAA,KAAAA,CAAMkC,SAAS,CAAC,IAAA;QACd,IAAItC,QAAAA,EAAUuC,OAAOC,MAAQ,EAAA;YAC3BlC,kBAAmB,CAAA;gBACjBmC,IAAM,EAAA,QAAA;AACNC,gBAAAA,KAAAA,EAAO/F,aAAc,CAAA;oBACnBQ,EAAI,EAAA,0DAAA;oBACJC,cAAgB,EAAA;AAClB,iBAAA,CAAA;AACAuF,gBAAAA,OAAAA,EAAShG,aAAc,CAAA;oBACrBQ,EAAI,EAAA,4DAAA;oBACJC,cAAgB,EAAA;AAClB,iBAAA;AACF,aAAA,CAAA;AACAoD,YAAAA,QAAAA,CAAS,EAAI,EAAA;gBAAEoC,OAAS,EAAA,IAAA;gBAAML,KAAO,EAAA;AAAK,aAAA,CAAA;AAC5C;KACC,EAAA;AAAC5F,QAAAA,aAAAA;AAAeqD,QAAAA,QAAAA,EAAUuC,KAAOC,EAAAA,MAAAA;AAAQhC,QAAAA,QAAAA;AAAUF,QAAAA;AAAmB,KAAA,CAAA;AAEzE,IAAA,MAAMuC,qBAAwB,GAAA,IAAA;QAC5B1C,oBAAqB,CAAA,CAAC2C,OAAS,CAACA,IAAAA,CAAAA;AAClC,KAAA;AAEA,IAAA,IAAIb,qBAAqBd,iBAAmB,EAAA;QAC1C,qBAAOtE,GAAA,CAACC,KAAKiG,OAAO,EAAA,EAAA,CAAA;AACtB;AAEA,IAAA,MAAMC,uBAAuB,SAACd,IAAanB,SAASqB,WAAW,EAAEC,MAAMY,oBAAyB,IAAA,CAAA;AAChG,IAAA,MAAMC,mCAAmCF,oBAAwBtB,IAAAA,eAAAA;AAEjE,IAAA,MAAMyB,kBAAkB,CAACC,QAAAA,GAAAA;QACvBvC,QAAS,CAAA;AACP,YAAA,GAAGD,KAAK;YACRyC,IAAM,EAAA,CAAA;AACNC,YAAAA,QAAAA,EAAUvC,QAAUqB,EAAAA,WAAAA,EAAaC,IAAMkB,EAAAA,UAAAA,EAAYD,QAAY,IAAA,EAAA;YAC/DE,OAAS,EAAA;gBACPC,UAAY,EAAA;AACVC,oBAAAA,QAAAA,EAAUN,QAAa,KAAA;AACzB;AACF;AACF,SAAA,CAAA;AACF,KAAA;IAEA,MAAMO,gBAAAA,GAAmB,OAAO,EAAE9F,IAAI,EAAEC,WAAW,EAAEgC,QAAQ,EAAc,GAAA;QACzE,MAAMiB,QAAAA,GAAW,MAAMM,aAAc,CAAA;AACnCxD,YAAAA,IAAAA;AACAC,YAAAA,WAAAA;AACAgC,YAAAA;AACF,SAAA,CAAA;AACA,QAAA,IAAI,UAAUiB,QAAU,EAAA;;YAEtBT,kBAAmB,CAAA;gBACjBmC,IAAM,EAAA,SAAA;AACNE,gBAAAA,OAAAA,EAAShG,aAAc,CAAA;oBACrBQ,EAAI,EAAA,6DAAA;oBACJC,cAAgB,EAAA;AAClB,iBAAA;AACF,aAAA,CAAA;YAEAuE,UAAW,CAAA,kBAAA,CAAA;AACXnB,YAAAA,QAAAA,CAASO,SAASE,IAAI,CAACA,IAAI,CAAC9D,EAAE,CAACyG,QAAQ,EAAA,CAAA;AACzC,SAAA,MAAO,IAAIC,YAAAA,CAAa9C,QAAS+C,CAAAA,KAAK,CAAG,EAAA;;YAEvCxD,kBAAmB,CAAA;gBACjBmC,IAAM,EAAA,QAAA;gBACNE,OAASjC,EAAAA,cAAAA,CAAeK,SAAS+C,KAAK;AACxC,aAAA,CAAA;SACK,MAAA;;YAELxD,kBAAmB,CAAA;gBACjBmC,IAAM,EAAA,QAAA;AACNE,gBAAAA,OAAAA,EAAShG,aAAc,CAAA;oBAAEQ,EAAI,EAAA,oBAAA;oBAAsBC,cAAgB,EAAA;AAAoB,iBAAA;AACzF,aAAA,CAAA;AACF;AACF,KAAA;AAEA,IAAA,qBACEqB,IAACsF,CAAAA,IAAAA,EAAAA;AAAKC,QAAAA,WAAAA,EAAW/B,iBAAqBd,IAAAA,iBAAAA;;AACpC,0BAAAtE,GAAA,CAACoH,QAAQC,MAAM,EAAA;AACbxB,gBAAAA,KAAAA,EAAO/F,aAAc,CAAA;oBACnBQ,EAAI,EAAA,uCAAA;oBACJC,cAAgB,EAAA;AAClB,iBAAA,CAAA;AACA+G,gBAAAA,eAAAA,gBACEtH,GAACuH,CAAAA,aAAAA,EAAAA;AACCC,oBAAAA,KAAAA,EAAO1H,aAAc,CAAA;wBACnBQ,EAAI,EAAA,iCAAA;wBACJC,cAAgB,EAAA;AAClB,qBAAA;;AAGJkH,gBAAAA,QAAAA,EAAU3H,aAAc,CAAA;oBACtBQ,EAAI,EAAA,iDAAA;oBACJC,cAAgB,EAAA;AAClB,iBAAA,CAAA;AACAmH,gBAAAA,aAAAA,EACEzC,0BACEjF,GAAC2H,CAAAA,MAAAA,EAAAA;AACCC,oBAAAA,SAAAA,gBAAW5H,GAAC6H,CAAAA,IAAAA,EAAAA,EAAAA,CAAAA;oBACZC,OAAS9B,EAAAA,qBAAAA;oBACT+B,QAAU1B,EAAAA,gCAAAA;8BAETvG,aAAc,CAAA;wBACbQ,EAAI,EAAA,6CAAA;wBACJC,cAAgB,EAAA;AAClB,qBAAA;AAEA,iBAAA,CAAA,GAAA;;AAGR,0BAAAP,GAAA,CAACoH,QAAQY,OAAO,EAAA;wCACdpG,IAAA,CAAAqG,QAAA,EAAA;;AACG5B,wBAAAA,gCAAAA,kBACCrG,GAAC0C,CAAAA,WAAAA,EAAAA;4BACCwF,YAAc,EAAA,CAAA;AACdC,4BAAAA,MAAAA,gBACEnI,GAACf,CAAAA,IAAAA,EAAAA;gCAAKmJ,IAAK,EAAA,iCAAA;gCAAkCzG,UAAU,EAAA,IAAA;0CACpD7B,aAAc,CAAA;oCACbQ,EAAI,EAAA,0DAAA;oCACJC,cAAgB,EAAA;AAClB,iCAAA;;AAGJsF,4BAAAA,KAAAA,EAAO/F,aACL,CAAA;gCACEQ,EAAI,EAAA,yDAAA;gCACJC,cACE,EAAA;6BAEJ,EAAA;gCAAE8H,MAAQxD,EAAAA;AAAgB,6BAAA,CAAA;AAE5ByD,4BAAAA,OAAAA,EAAS,IAAO,EAAA;4BAChBC,UAAW,EAAA,EAAA;sCAEVzI,aAAc,CAAA;gCACbQ,EAAI,EAAA,2DAAA;gCACJC,cAAgB,EAAA;AAClB,6BAAA;;AAGJ,sCAAAqB,IAAA,CAAC4G,KAAK3H,IAAI,EAAA;4BAACwB,OAAQ,EAAA,QAAA;4BAASoG,aAAenC,EAAAA,eAAAA;4BAAiBoC,KAAOpD,EAAAA,SAAAA;;8CACjE1D,IAAC+G,CAAAA,GAAAA,EAAAA;oCAAIC,aAAe,EAAA,CAAA;;AAClB,sDAAAhH,IAAA,CAAC4G,KAAKK,IAAI,EAAA;AACRC,4CAAAA,YAAAA,EAAYhJ,aAAc,CAAA;gDACxBQ,EAAI,EAAA,iDAAA;gDACJC,cAAgB,EAAA;AAClB,6CAAA,CAAA;;AAEA,8DAAAP,GAAA,CAACwI,KAAKO,OAAO,EAAA;oDAACL,KAAM,EAAA,SAAA;8DACjB5I,aACC,CAAA;wDACEQ,EAAI,EAAA,6CAAA;wDACJC,cAAgB,EAAA;qDAElB,EAAA;wDACEyI,KAAO7C,EAAAA;AACT,qDAAA;;AAGJ,8DAAAnG,GAAA,CAACwI,KAAKO,OAAO,EAAA;oDAACL,KAAM,EAAA,MAAA;8DACjB5I,aAAc,CAAA;wDACbQ,EAAI,EAAA,0CAAA;wDACJC,cAAgB,EAAA;AAClB,qDAAA;;;;sDAGJP,GAACiJ,CAAAA,OAAAA,EAAAA,EAAAA;;;AAGH,8CAAAjJ,GAAA,CAACwI,KAAKR,OAAO,EAAA;oCAACU,KAAM,EAAA,SAAA;AAClB,oCAAA,QAAA,gBAAA1I,GAACN,CAAAA,YAAAA,EAAAA;wCACCC,YAAa,EAAA,SAAA;AACbC,wCAAAA,QAAAA,EAAUsE,UAAUqB,WAAanB,EAAAA,IAAAA;wCACjCvE,OAASA,EAAAA;;;AAIb,8CAAAG,GAAA,CAACwI,KAAKR,OAAO,EAAA;oCAACU,KAAM,EAAA,MAAA;AAClB,oCAAA,QAAA,gBAAA1I,GAACN,CAAAA,YAAAA,EAAAA;wCACCC,YAAa,EAAA,MAAA;AACbC,wCAAAA,QAAAA,EAAUsE,UAAUqB,WAAanB,EAAAA,IAAAA;wCACjCvE,OAASA,EAAAA;;;;;AAIf,sCAAA+B,IAAA,CAACsH,WAAWrI,IAAI,EAAA;4BACb,GAAGqD,QAAAA,EAAUqB,WAAaC,EAAAA,IAAAA,EAAMkB,UAAU;4BAC3CyC,eAAiBjF,EAAAA,QAAAA,EAAUqB,WAAaC,EAAAA,IAAAA,EAAMkB,UAAYD,EAAAA,QAAAA;;AAE1D,8CAAAzG,GAAA,CAACkJ,WAAWE,QAAQ,EAAA;oCAACC,OAAS,EAAA;AAAC,wCAAA,GAAA;AAAK,wCAAA,IAAA;AAAM,wCAAA,IAAA;AAAM,wCAAA;AAAK;;AACrD,8CAAArJ,GAAA,CAACkJ,WAAWI,KAAK,EAAA,EAAA;;;;;;0BAIvBtJ,GAACuJ,CAAAA,YAAAA,EAAAA;gBACCC,IAAMnG,EAAAA,iBAAAA;gBACNoG,WAAazD,EAAAA,qBAAAA;gBACb0D,YAAc5C,EAAAA,gBAAAA;gBACdzC,SAAWI,EAAAA,gBAAAA;gBACXkF,aAAe,EAAA;AACb,oBAAA,GAAG/G,mBAAmB;AACtBK,oBAAAA,QAAAA,EAAUmB,IAAMA,EAAAA,IAAAA,CAAKwF,eAAkBxF,GAAAA,IAAAA,CAAKA,IAAI,CAACwF,eAAe,CAACC,KAAK,CAAC,GAAI,CAAA,CAAC,EAAE,GAAG;AACnF;;;;AAIR;;;;"}
@@ -5,35 +5,42 @@ var strapiAdmin = require('@strapi/admin/strapi-admin');
5
5
  var designSystem = require('@strapi/design-system');
6
6
  var icons = require('@strapi/icons');
7
7
  var reactIntl = require('react-intl');
8
- var hooks = require('./hooks-DA5VbUAp.js');
9
- var index = require('./index-BZaFIG8z.js');
10
- var schemas = require('./schemas-DS7NeFDN.js');
11
- require('react-redux');
12
- require('react');
13
- require('formik');
14
- require('@strapi/content-manager/strapi-admin');
15
- require('@strapi/icons/symbols');
16
- require('react-router-dom');
17
- require('yup');
18
- require('styled-components');
19
- require('date-fns-tz');
8
+ var hooks = require('../modules/hooks.js');
9
+ var release = require('../services/release.js');
10
+ var time = require('../utils/time.js');
11
+ var schemas = require('../validation/schemas.js');
20
12
 
21
13
  const ReleasesSettingsPage = ()=>{
22
14
  const { formatMessage } = reactIntl.useIntl();
23
15
  const { formatAPIError } = strapiAdmin.useAPIErrorHandler();
24
16
  const { toggleNotification } = strapiAdmin.useNotification();
25
- const { data, isLoading: isLoadingSettings } = index.useGetReleaseSettingsQuery();
26
- const [updateReleaseSettings, { isLoading: isSubmittingForm }] = index.useUpdateReleaseSettingsMutation();
17
+ const { data, isLoading: isLoadingSettings } = release.useGetReleaseSettingsQuery();
18
+ const [updateReleaseSettings, { isLoading: isSubmittingForm }] = release.useUpdateReleaseSettingsMutation();
27
19
  const permissions = hooks.useTypedSelector((state)=>state.admin_app.permissions['settings']?.['releases']);
28
20
  const { allowedActions: { canUpdate } } = strapiAdmin.useRBAC(permissions);
29
- const { timezoneList } = index.getTimezones(new Date());
30
- const handleSubmit = async (body)=>{
21
+ const { timezoneList } = time.getTimezones(new Date());
22
+ const handleSubmit = async (body, { setErrors })=>{
31
23
  const { defaultTimezone } = body;
32
- const isBodyTimezoneValid = timezoneList.some((timezone)=>timezone.value === defaultTimezone);
24
+ const formattedDefaultTimezone = defaultTimezone;
25
+ const isBodyTimezoneValid = timezoneList.some((timezone)=>timezone.value === formattedDefaultTimezone);
26
+ if (!isBodyTimezoneValid && defaultTimezone) {
27
+ const errorMessage = formatMessage({
28
+ id: 'components.Input.error.validation.combobox.invalid',
29
+ defaultMessage: 'The value provided is not valid'
30
+ });
31
+ setErrors({
32
+ defaultTimezone: errorMessage
33
+ });
34
+ toggleNotification({
35
+ type: 'danger',
36
+ message: errorMessage
37
+ });
38
+ return;
39
+ }
33
40
  const newBody = !defaultTimezone || !isBodyTimezoneValid ? {
34
41
  defaultTimezone: null
35
42
  } : {
36
- ...body
43
+ defaultTimezone: formattedDefaultTimezone
37
44
  };
38
45
  try {
39
46
  const response = await updateReleaseSettings(newBody);
@@ -72,6 +79,10 @@ const ReleasesSettingsPage = ()=>{
72
79
  if (isLoadingSettings) {
73
80
  return /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Page.Loading, {});
74
81
  }
82
+ const releasePageTitle = formatMessage({
83
+ id: 'content-releases.pages.Releases.title',
84
+ defaultMessage: 'Releases'
85
+ });
75
86
  return /*#__PURE__*/ jsxRuntime.jsxs(strapiAdmin.Layouts.Root, {
76
87
  children: [
77
88
  /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Page.Title, {
@@ -79,7 +90,7 @@ const ReleasesSettingsPage = ()=>{
79
90
  id: 'Settings.PageTitle',
80
91
  defaultMessage: 'Settings - {name}'
81
92
  }, {
82
- name: 'Releases'
93
+ name: releasePageTitle
83
94
  })
84
95
  }),
85
96
  /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Page.Main, {
@@ -106,10 +117,13 @@ const ReleasesSettingsPage = ()=>{
106
117
  defaultMessage: 'Save'
107
118
  })
108
119
  }) : null,
109
- title: formatMessage({
110
- id: 'content-releases.pages.Settings.releases.title',
111
- defaultMessage: 'Releases'
120
+ secondaryAction: /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.GradientBadge, {
121
+ label: formatMessage({
122
+ id: 'components.premiumFeature.title',
123
+ defaultMessage: 'Premium feature'
124
+ })
112
125
  }),
126
+ title: releasePageTitle,
113
127
  subtitle: formatMessage({
114
128
  id: 'content-releases.pages.Settings.releases.description',
115
129
  defaultMessage: 'Create and manage content updates'
@@ -157,13 +171,13 @@ const TimezoneDropdown = ()=>{
157
171
  const permissions = hooks.useTypedSelector((state)=>state.admin_app.permissions['settings']?.['releases']);
158
172
  const { allowedActions: { canUpdate } } = strapiAdmin.useRBAC(permissions);
159
173
  const { formatMessage } = reactIntl.useIntl();
160
- const { timezoneList } = index.getTimezones(new Date());
174
+ const { timezoneList } = time.getTimezones(new Date());
161
175
  const field = strapiAdmin.useField('defaultTimezone');
162
176
  return /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Field.Root, {
163
177
  name: "defaultTimezone",
164
178
  hint: formatMessage({
165
179
  id: 'content-releases.pages.Settings.releases.timezone.hint',
166
- defaultMessage: 'The timezone of every release can still be changed individually. '
180
+ defaultMessage: 'The timezone of every release can still be changed individually.'
167
181
  }),
168
182
  error: field.error,
169
183
  children: [
@@ -178,8 +192,12 @@ const TimezoneDropdown = ()=>{
178
192
  type: 'list',
179
193
  filter: 'contains'
180
194
  },
181
- onChange: (value)=>field.onChange('defaultTimezone', value),
182
195
  onTextValueChange: (value)=>field.onChange('defaultTimezone', value),
196
+ onChange: (value)=>{
197
+ if (field.value && value || !field.value) {
198
+ field.onChange('defaultTimezone', value);
199
+ }
200
+ },
183
201
  onClear: ()=>field.onChange('defaultTimezone', ''),
184
202
  value: field.value,
185
203
  disabled: !canUpdate,
@@ -204,4 +222,4 @@ const TimezoneDropdown = ()=>{
204
222
  };
205
223
 
206
224
  exports.ProtectedReleasesSettingsPage = ProtectedReleasesSettingsPage;
207
- //# sourceMappingURL=ReleasesSettingsPage-DV_y1NJZ.js.map
225
+ //# sourceMappingURL=ReleasesSettingsPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReleasesSettingsPage.js","sources":["../../../admin/src/pages/ReleasesSettingsPage.tsx"],"sourcesContent":["import {\n Form,\n Layouts,\n Page,\n useAPIErrorHandler,\n isFetchError,\n GradientBadge,\n useNotification,\n useField,\n useRBAC,\n FormHelpers,\n} from '@strapi/admin/strapi-admin';\nimport {\n Button,\n Combobox,\n ComboboxOption,\n Field,\n Flex,\n Grid,\n Typography,\n} from '@strapi/design-system';\nimport { Check } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { useTypedSelector } from '../modules/hooks';\nimport { useGetReleaseSettingsQuery, useUpdateReleaseSettingsMutation } from '../services/release';\nimport { getTimezones } from '../utils/time';\nimport { SETTINGS_SCHEMA } from '../validation/schemas';\n\nimport type { UpdateSettings } from '../../../shared/contracts/settings';\n\ninterface UpdateDefaultTimezone {\n defaultTimezone: string;\n}\n\nconst ReleasesSettingsPage = () => {\n const { formatMessage } = useIntl();\n const { formatAPIError } = useAPIErrorHandler();\n const { toggleNotification } = useNotification();\n const { data, isLoading: isLoadingSettings } = useGetReleaseSettingsQuery();\n const [updateReleaseSettings, { isLoading: isSubmittingForm }] =\n useUpdateReleaseSettingsMutation();\n const permissions = useTypedSelector(\n (state) => state.admin_app.permissions['settings']?.['releases']\n );\n const {\n allowedActions: { canUpdate },\n } = useRBAC(permissions);\n\n const { timezoneList } = getTimezones(new Date());\n\n const handleSubmit = async (\n body: UpdateSettings.Request['body'],\n { setErrors }: FormHelpers<UpdateDefaultTimezone>\n ) => {\n const { defaultTimezone } = body;\n const formattedDefaultTimezone = defaultTimezone;\n const isBodyTimezoneValid = timezoneList.some(\n (timezone) => timezone.value === formattedDefaultTimezone\n );\n\n if (!isBodyTimezoneValid && defaultTimezone) {\n const errorMessage = formatMessage({\n id: 'components.Input.error.validation.combobox.invalid',\n defaultMessage: 'The value provided is not valid',\n });\n setErrors({\n defaultTimezone: errorMessage,\n });\n toggleNotification({\n type: 'danger',\n message: errorMessage,\n });\n return;\n }\n\n const newBody =\n !defaultTimezone || !isBodyTimezoneValid\n ? { defaultTimezone: null }\n : { defaultTimezone: formattedDefaultTimezone };\n\n try {\n const response = await updateReleaseSettings(newBody);\n\n if ('data' in response) {\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: 'content-releases.pages.Settings.releases.setting.default-timezone-notification-success',\n defaultMessage: 'Default timezone updated.',\n }),\n });\n } else if (isFetchError(response.error)) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(response.error),\n });\n } else {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: 'notification.error',\n defaultMessage: 'An error occurred',\n }),\n });\n }\n } catch (error) {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: 'notification.error',\n defaultMessage: 'An error occurred',\n }),\n });\n }\n };\n\n if (isLoadingSettings) {\n return <Page.Loading />;\n }\n\n const releasePageTitle = formatMessage({\n id: 'content-releases.pages.Releases.title',\n defaultMessage: 'Releases',\n });\n\n return (\n <Layouts.Root>\n <Page.Title>\n {formatMessage(\n { id: 'Settings.PageTitle', defaultMessage: 'Settings - {name}' },\n {\n name: releasePageTitle,\n }\n )}\n </Page.Title>\n <Page.Main aria-busy={isLoadingSettings} tabIndex={-1}>\n <Form\n method=\"PUT\"\n initialValues={{\n defaultTimezone: data?.data.defaultTimezone,\n }}\n onSubmit={handleSubmit}\n validationSchema={SETTINGS_SCHEMA}\n >\n {({ modified, isSubmitting }: { modified: boolean; isSubmitting: boolean }) => {\n return (\n <>\n <Layouts.Header\n primaryAction={\n canUpdate ? (\n <Button\n disabled={!modified || isSubmittingForm}\n loading={isSubmitting}\n startIcon={<Check />}\n type=\"submit\"\n >\n {formatMessage({\n id: 'global.save',\n defaultMessage: 'Save',\n })}\n </Button>\n ) : null\n }\n secondaryAction={\n <GradientBadge\n label={formatMessage({\n id: 'components.premiumFeature.title',\n defaultMessage: 'Premium feature',\n })}\n />\n }\n title={releasePageTitle}\n subtitle={formatMessage({\n id: 'content-releases.pages.Settings.releases.description',\n defaultMessage: 'Create and manage content updates',\n })}\n />\n <Layouts.Content>\n <Flex\n direction=\"column\"\n background=\"neutral0\"\n alignItems=\"stretch\"\n padding={6}\n gap={6}\n shadow=\"filterShadow\"\n hasRadius\n >\n <Typography variant=\"delta\" tag=\"h2\">\n {formatMessage({\n id: 'content-releases.pages.Settings.releases.preferences.title',\n defaultMessage: 'Preferences',\n })}\n </Typography>\n <Grid.Root>\n <Grid.Item col={6} s={12} direction=\"column\" alignItems=\"stretch\">\n <TimezoneDropdown />\n </Grid.Item>\n </Grid.Root>\n </Flex>\n </Layouts.Content>\n </>\n );\n }}\n </Form>\n </Page.Main>\n </Layouts.Root>\n );\n};\n\nconst TimezoneDropdown = () => {\n const permissions = useTypedSelector(\n (state) => state.admin_app.permissions['settings']?.['releases']\n );\n const {\n allowedActions: { canUpdate },\n } = useRBAC(permissions);\n const { formatMessage } = useIntl();\n const { timezoneList } = getTimezones(new Date());\n const field = useField('defaultTimezone');\n return (\n <Field.Root\n name=\"defaultTimezone\"\n hint={formatMessage({\n id: 'content-releases.pages.Settings.releases.timezone.hint',\n defaultMessage: 'The timezone of every release can still be changed individually.',\n })}\n error={field.error}\n >\n <Field.Label>\n {formatMessage({\n id: 'content-releases.pages.Settings.releases.timezone.label',\n defaultMessage: 'Default timezone',\n })}\n </Field.Label>\n <Combobox\n autocomplete={{ type: 'list', filter: 'contains' }}\n onTextValueChange={(value) => field.onChange('defaultTimezone', value)}\n onChange={(value) => {\n if ((field.value && value) || !field.value) {\n field.onChange('defaultTimezone', value);\n }\n }}\n onClear={() => field.onChange('defaultTimezone', '')}\n value={field.value}\n disabled={!canUpdate}\n >\n {timezoneList.map((timezone) => (\n <ComboboxOption key={timezone.value} value={timezone.value}>\n {timezone.value.replace(/&/, ' ')}\n </ComboboxOption>\n ))}\n </Combobox>\n <Field.Hint />\n <Field.Error />\n </Field.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ProtectedSettingsPage\n * -----------------------------------------------------------------------------------------------*/\n\nexport const ProtectedReleasesSettingsPage = () => {\n const permissions = useTypedSelector(\n (state) => state.admin_app.permissions['settings']?.['releases']?.read\n );\n\n return (\n <Page.Protect permissions={permissions}>\n <ReleasesSettingsPage />\n </Page.Protect>\n );\n};\n"],"names":["ReleasesSettingsPage","formatMessage","useIntl","formatAPIError","useAPIErrorHandler","toggleNotification","useNotification","data","isLoading","isLoadingSettings","useGetReleaseSettingsQuery","updateReleaseSettings","isSubmittingForm","useUpdateReleaseSettingsMutation","permissions","useTypedSelector","state","admin_app","allowedActions","canUpdate","useRBAC","timezoneList","getTimezones","Date","handleSubmit","body","setErrors","defaultTimezone","formattedDefaultTimezone","isBodyTimezoneValid","some","timezone","value","errorMessage","id","defaultMessage","type","message","newBody","response","isFetchError","error","_jsx","Page","Loading","releasePageTitle","_jsxs","Layouts","Root","Title","name","Main","aria-busy","tabIndex","Form","method","initialValues","onSubmit","validationSchema","SETTINGS_SCHEMA","modified","isSubmitting","_Fragment","Header","primaryAction","Button","disabled","loading","startIcon","Check","secondaryAction","GradientBadge","label","title","subtitle","Content","Flex","direction","background","alignItems","padding","gap","shadow","hasRadius","Typography","variant","tag","Grid","Item","col","s","TimezoneDropdown","field","useField","Field","hint","Label","Combobox","autocomplete","filter","onTextValueChange","onChange","onClear","map","ComboboxOption","replace","Hint","Error","ProtectedReleasesSettingsPage","read","Protect"],"mappings":"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"}