@strapi/admin 5.56.0 → 5.58.0

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 (465) hide show
  1. package/dist/admin/admin/src/components/Filters.js +1 -1
  2. package/dist/admin/admin/src/components/Filters.js.map +1 -1
  3. package/dist/admin/admin/src/components/Filters.mjs +1 -1
  4. package/dist/admin/admin/src/components/Filters.mjs.map +1 -1
  5. package/dist/admin/admin/src/components/FormInputs/Boolean.js +3 -2
  6. package/dist/admin/admin/src/components/FormInputs/Boolean.js.map +1 -1
  7. package/dist/admin/admin/src/components/FormInputs/Boolean.mjs +3 -2
  8. package/dist/admin/admin/src/components/FormInputs/Boolean.mjs.map +1 -1
  9. package/dist/admin/admin/src/components/FormInputs/Enumeration.js +2 -2
  10. package/dist/admin/admin/src/components/FormInputs/Enumeration.js.map +1 -1
  11. package/dist/admin/admin/src/components/FormInputs/Enumeration.mjs +2 -2
  12. package/dist/admin/admin/src/components/FormInputs/Enumeration.mjs.map +1 -1
  13. package/dist/admin/admin/src/components/MediaLibraryBanner.js +38 -2
  14. package/dist/admin/admin/src/components/MediaLibraryBanner.js.map +1 -1
  15. package/dist/admin/admin/src/components/MediaLibraryBanner.mjs +18 -2
  16. package/dist/admin/admin/src/components/MediaLibraryBanner.mjs.map +1 -1
  17. package/dist/admin/admin/src/components/RelativeTime.js +9 -0
  18. package/dist/admin/admin/src/components/RelativeTime.js.map +1 -1
  19. package/dist/admin/admin/src/components/RelativeTime.mjs +10 -1
  20. package/dist/admin/admin/src/components/RelativeTime.mjs.map +1 -1
  21. package/dist/admin/admin/src/components/TopBanners.js +52 -0
  22. package/dist/admin/admin/src/components/TopBanners.js.map +1 -0
  23. package/dist/admin/admin/src/components/TopBanners.mjs +30 -0
  24. package/dist/admin/admin/src/components/TopBanners.mjs.map +1 -0
  25. package/dist/admin/admin/src/constants.js +14 -0
  26. package/dist/admin/admin/src/constants.js.map +1 -1
  27. package/dist/admin/admin/src/constants.mjs +14 -0
  28. package/dist/admin/admin/src/constants.mjs.map +1 -1
  29. package/dist/admin/admin/src/features/Tracking.js +28 -8
  30. package/dist/admin/admin/src/features/Tracking.js.map +1 -1
  31. package/dist/admin/admin/src/features/Tracking.mjs +29 -10
  32. package/dist/admin/admin/src/features/Tracking.mjs.map +1 -1
  33. package/dist/admin/admin/src/layouts/AuthenticatedLayout.js +4 -20
  34. package/dist/admin/admin/src/layouts/AuthenticatedLayout.js.map +1 -1
  35. package/dist/admin/admin/src/layouts/AuthenticatedLayout.mjs +4 -20
  36. package/dist/admin/admin/src/layouts/AuthenticatedLayout.mjs.map +1 -1
  37. package/dist/admin/admin/src/layouts/useAuthenticatedAccessTracking.js +59 -0
  38. package/dist/admin/admin/src/layouts/useAuthenticatedAccessTracking.js.map +1 -0
  39. package/dist/admin/admin/src/layouts/useAuthenticatedAccessTracking.mjs +37 -0
  40. package/dist/admin/admin/src/layouts/useAuthenticatedAccessTracking.mjs.map +1 -0
  41. package/dist/admin/admin/src/pages/Auth/components/ResetPassword.js +6 -12
  42. package/dist/admin/admin/src/pages/Auth/components/ResetPassword.js.map +1 -1
  43. package/dist/admin/admin/src/pages/Auth/components/ResetPassword.mjs +6 -12
  44. package/dist/admin/admin/src/pages/Auth/components/ResetPassword.mjs.map +1 -1
  45. package/dist/admin/admin/src/pages/Settings/components/SettingsNav.js +10 -2
  46. package/dist/admin/admin/src/pages/Settings/components/SettingsNav.js.map +1 -1
  47. package/dist/admin/admin/src/pages/Settings/components/SettingsNav.mjs +10 -2
  48. package/dist/admin/admin/src/pages/Settings/components/SettingsNav.mjs.map +1 -1
  49. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.js +6 -56
  50. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.js.map +1 -1
  51. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.mjs +6 -56
  52. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.mjs.map +1 -1
  53. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/DiagnosticSnapshotModal.js +217 -0
  54. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/DiagnosticSnapshotModal.js.map +1 -0
  55. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/DiagnosticSnapshotModal.mjs +195 -0
  56. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/DiagnosticSnapshotModal.mjs.map +1 -0
  57. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/PlanCard.js +185 -0
  58. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/PlanCard.js.map +1 -0
  59. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/PlanCard.mjs +162 -0
  60. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/PlanCard.mjs.map +1 -0
  61. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/SupportCard.js +342 -0
  62. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/SupportCard.js.map +1 -0
  63. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/SupportCard.mjs +320 -0
  64. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/SupportCard.mjs.map +1 -0
  65. package/dist/admin/admin/src/services/admin.js +11 -1
  66. package/dist/admin/admin/src/services/admin.js.map +1 -1
  67. package/dist/admin/admin/src/services/admin.mjs +11 -2
  68. package/dist/admin/admin/src/services/admin.mjs.map +1 -1
  69. package/dist/admin/admin/src/translations/en.json.js +76 -4
  70. package/dist/admin/admin/src/translations/en.json.js.map +1 -1
  71. package/dist/admin/admin/src/translations/en.json.mjs +76 -4
  72. package/dist/admin/admin/src/translations/en.json.mjs.map +1 -1
  73. package/dist/admin/admin/src/utils/browserStrapi.js +1 -1
  74. package/dist/admin/admin/src/utils/browserStrapi.js.map +1 -1
  75. package/dist/admin/admin/src/utils/browserStrapi.mjs +1 -1
  76. package/dist/admin/admin/src/utils/browserStrapi.mjs.map +1 -1
  77. package/dist/admin/admin/src/utils/getFetchClient.js +27 -3
  78. package/dist/admin/admin/src/utils/getFetchClient.js.map +1 -1
  79. package/dist/admin/admin/src/utils/getFetchClient.mjs +26 -3
  80. package/dist/admin/admin/src/utils/getFetchClient.mjs.map +1 -1
  81. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.js +52 -22
  82. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.js.map +1 -1
  83. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.mjs +53 -23
  84. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.mjs.map +1 -1
  85. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AdminSeatInfo.js +16 -29
  86. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AdminSeatInfo.js.map +1 -1
  87. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AdminSeatInfo.mjs +18 -31
  88. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AdminSeatInfo.mjs.map +1 -1
  89. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/LicenseInfo.js +473 -0
  90. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/LicenseInfo.js.map +1 -0
  91. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/LicenseInfo.mjs +471 -0
  92. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/LicenseInfo.mjs.map +1 -0
  93. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.js +8 -1
  94. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.js.map +1 -1
  95. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.mjs +8 -1
  96. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.mjs.map +1 -1
  97. package/dist/admin/index.js +1 -0
  98. package/dist/admin/index.js.map +1 -1
  99. package/dist/admin/index.mjs +1 -1
  100. package/dist/admin/shared/utils/get-project-type.js +49 -0
  101. package/dist/admin/shared/utils/get-project-type.js.map +1 -0
  102. package/dist/admin/shared/utils/get-project-type.mjs +46 -0
  103. package/dist/admin/shared/utils/get-project-type.mjs.map +1 -0
  104. package/dist/admin/src/components/MediaLibraryBanner.d.ts +10 -1
  105. package/dist/admin/src/components/TopBanners.d.ts +8 -0
  106. package/dist/admin/src/constants.d.ts +10 -0
  107. package/dist/admin/src/features/Tracking.d.ts +12 -1
  108. package/dist/admin/src/layouts/useAuthenticatedAccessTracking.d.ts +6 -0
  109. package/dist/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.d.ts +1 -1
  110. package/dist/admin/src/pages/Settings/pages/ApplicationInfo/components/DiagnosticSnapshotModal.d.ts +12 -0
  111. package/dist/admin/src/pages/Settings/pages/ApplicationInfo/components/PlanCard.d.ts +14 -0
  112. package/dist/admin/src/pages/Settings/pages/ApplicationInfo/components/SupportCard.d.ts +2 -0
  113. package/dist/admin/src/services/admin.d.ts +2 -2
  114. package/dist/admin/src/types/permissions.d.ts +1 -0
  115. package/dist/admin/src/utils/getFetchClient.d.ts +25 -0
  116. package/dist/ee/admin/src/hooks/useLicenseLimits.d.ts +29 -0
  117. package/dist/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.d.ts +6 -1
  118. package/dist/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/LicenseInfo.d.ts +2 -0
  119. package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.d.ts +7 -0
  120. package/dist/ee/server/src/audit-logs/entitlements.d.ts +8 -0
  121. package/dist/ee/server/src/audit-logs/entitlements.d.ts.map +1 -0
  122. package/dist/ee/server/src/audit-logs/services/lifecycles.d.ts +16 -0
  123. package/dist/ee/server/src/audit-logs/services/lifecycles.d.ts.map +1 -1
  124. package/dist/ee/server/src/controllers/admin.d.ts +36 -10
  125. package/dist/ee/server/src/controllers/admin.d.ts.map +1 -1
  126. package/dist/ee/server/src/controllers/authentication-utils/middlewares.d.ts.map +1 -1
  127. package/dist/ee/server/src/controllers/authentication-utils/utils.d.ts +8 -2
  128. package/dist/ee/server/src/controllers/authentication-utils/utils.d.ts.map +1 -1
  129. package/dist/ee/server/src/controllers/authentication.d.ts.map +1 -1
  130. package/dist/ee/server/src/controllers/index.d.ts +36 -10
  131. package/dist/ee/server/src/controllers/index.d.ts.map +1 -1
  132. package/dist/ee/server/src/controllers/user.d.ts.map +1 -1
  133. package/dist/ee/server/src/index.d.ts +40 -11
  134. package/dist/ee/server/src/index.d.ts.map +1 -1
  135. package/dist/ee/server/src/services/index.d.ts +4 -1
  136. package/dist/ee/server/src/services/index.d.ts.map +1 -1
  137. package/dist/ee/server/src/services/metrics.d.ts.map +1 -1
  138. package/dist/ee/server/src/services/persist-tables.d.ts.map +1 -1
  139. package/dist/ee/server/src/services/seat-enforcement.d.ts +3 -1
  140. package/dist/ee/server/src/services/seat-enforcement.d.ts.map +1 -1
  141. package/dist/server/ee/server/src/audit-logs/entitlements.js +25 -0
  142. package/dist/server/ee/server/src/audit-logs/entitlements.js.map +1 -0
  143. package/dist/server/ee/server/src/audit-logs/entitlements.mjs +23 -0
  144. package/dist/server/ee/server/src/audit-logs/entitlements.mjs.map +1 -0
  145. package/dist/server/ee/server/src/audit-logs/services/lifecycles.js +20 -8
  146. package/dist/server/ee/server/src/audit-logs/services/lifecycles.js.map +1 -1
  147. package/dist/server/ee/server/src/audit-logs/services/lifecycles.mjs +19 -9
  148. package/dist/server/ee/server/src/audit-logs/services/lifecycles.mjs.map +1 -1
  149. package/dist/server/ee/server/src/controllers/admin.js +79 -7
  150. package/dist/server/ee/server/src/controllers/admin.js.map +1 -1
  151. package/dist/server/ee/server/src/controllers/admin.mjs +79 -7
  152. package/dist/server/ee/server/src/controllers/admin.mjs.map +1 -1
  153. package/dist/server/ee/server/src/controllers/authentication-utils/middlewares.js +28 -10
  154. package/dist/server/ee/server/src/controllers/authentication-utils/middlewares.js.map +1 -1
  155. package/dist/server/ee/server/src/controllers/authentication-utils/middlewares.mjs +28 -10
  156. package/dist/server/ee/server/src/controllers/authentication-utils/middlewares.mjs.map +1 -1
  157. package/dist/server/ee/server/src/controllers/authentication-utils/utils.js +2 -2
  158. package/dist/server/ee/server/src/controllers/authentication-utils/utils.js.map +1 -1
  159. package/dist/server/ee/server/src/controllers/authentication-utils/utils.mjs +2 -2
  160. package/dist/server/ee/server/src/controllers/authentication-utils/utils.mjs.map +1 -1
  161. package/dist/server/ee/server/src/controllers/authentication.js +11 -11
  162. package/dist/server/ee/server/src/controllers/authentication.js.map +1 -1
  163. package/dist/server/ee/server/src/controllers/authentication.mjs +11 -11
  164. package/dist/server/ee/server/src/controllers/authentication.mjs.map +1 -1
  165. package/dist/server/ee/server/src/controllers/user.js +7 -8
  166. package/dist/server/ee/server/src/controllers/user.js.map +1 -1
  167. package/dist/server/ee/server/src/controllers/user.mjs +8 -9
  168. package/dist/server/ee/server/src/controllers/user.mjs.map +1 -1
  169. package/dist/server/ee/server/src/index.js +2 -0
  170. package/dist/server/ee/server/src/index.js.map +1 -1
  171. package/dist/server/ee/server/src/index.mjs +2 -0
  172. package/dist/server/ee/server/src/index.mjs.map +1 -1
  173. package/dist/server/ee/server/src/services/metrics.js +9 -7
  174. package/dist/server/ee/server/src/services/metrics.js.map +1 -1
  175. package/dist/server/ee/server/src/services/metrics.mjs +9 -7
  176. package/dist/server/ee/server/src/services/metrics.mjs.map +1 -1
  177. package/dist/server/ee/server/src/services/persist-tables.js +3 -4
  178. package/dist/server/ee/server/src/services/persist-tables.js.map +1 -1
  179. package/dist/server/ee/server/src/services/persist-tables.mjs +3 -4
  180. package/dist/server/ee/server/src/services/persist-tables.mjs.map +1 -1
  181. package/dist/server/ee/server/src/services/role.js +2 -2
  182. package/dist/server/ee/server/src/services/role.js.map +1 -1
  183. package/dist/server/ee/server/src/services/role.mjs +1 -1
  184. package/dist/server/ee/server/src/services/role.mjs.map +1 -1
  185. package/dist/server/ee/server/src/services/seat-enforcement.js +20 -20
  186. package/dist/server/ee/server/src/services/seat-enforcement.js.map +1 -1
  187. package/dist/server/ee/server/src/services/seat-enforcement.mjs +20 -20
  188. package/dist/server/ee/server/src/services/seat-enforcement.mjs.map +1 -1
  189. package/dist/server/ee/server/src/services/user.js +1 -2
  190. package/dist/server/ee/server/src/services/user.js.map +1 -1
  191. package/dist/server/ee/server/src/services/user.mjs +2 -3
  192. package/dist/server/ee/server/src/services/user.mjs.map +1 -1
  193. package/dist/server/ee/server/src/utils/sso-lock.js +2 -2
  194. package/dist/server/ee/server/src/utils/sso-lock.js.map +1 -1
  195. package/dist/server/ee/server/src/utils/sso-lock.mjs +1 -1
  196. package/dist/server/ee/server/src/utils/sso-lock.mjs.map +1 -1
  197. package/dist/server/server/src/audit-logs/admin-users.js +3 -3
  198. package/dist/server/server/src/audit-logs/admin-users.js.map +1 -1
  199. package/dist/server/server/src/audit-logs/admin-users.mjs +2 -2
  200. package/dist/server/server/src/audit-logs/admin-users.mjs.map +1 -1
  201. package/dist/server/server/src/audit-logs/auth.js +72 -0
  202. package/dist/server/server/src/audit-logs/auth.js.map +1 -0
  203. package/dist/server/server/src/audit-logs/auth.mjs +67 -0
  204. package/dist/server/server/src/audit-logs/auth.mjs.map +1 -0
  205. package/dist/server/server/src/audit-logs/tokens.js +3 -3
  206. package/dist/server/server/src/audit-logs/tokens.js.map +1 -1
  207. package/dist/server/server/src/audit-logs/tokens.mjs +2 -2
  208. package/dist/server/server/src/audit-logs/tokens.mjs.map +1 -1
  209. package/dist/server/server/src/audit-logs/webhooks.js +2 -2
  210. package/dist/server/server/src/audit-logs/webhooks.js.map +1 -1
  211. package/dist/server/server/src/audit-logs/webhooks.mjs +1 -1
  212. package/dist/server/server/src/audit-logs/webhooks.mjs.map +1 -1
  213. package/dist/server/server/src/bootstrap.js +6 -4
  214. package/dist/server/server/src/bootstrap.js.map +1 -1
  215. package/dist/server/server/src/bootstrap.mjs +6 -4
  216. package/dist/server/server/src/bootstrap.mjs.map +1 -1
  217. package/dist/server/server/src/config/admin-actions.js +7 -0
  218. package/dist/server/server/src/config/admin-actions.js.map +1 -1
  219. package/dist/server/server/src/config/admin-actions.mjs +7 -0
  220. package/dist/server/server/src/config/admin-actions.mjs.map +1 -1
  221. package/dist/server/server/src/controllers/admin-token.js +8 -8
  222. package/dist/server/server/src/controllers/admin-token.js.map +1 -1
  223. package/dist/server/server/src/controllers/admin-token.mjs +4 -4
  224. package/dist/server/server/src/controllers/admin-token.mjs.map +1 -1
  225. package/dist/server/server/src/controllers/admin.js +9 -5
  226. package/dist/server/server/src/controllers/admin.js.map +1 -1
  227. package/dist/server/server/src/controllers/admin.mjs +8 -4
  228. package/dist/server/server/src/controllers/admin.mjs.map +1 -1
  229. package/dist/server/server/src/controllers/api-token.js +8 -8
  230. package/dist/server/server/src/controllers/api-token.js.map +1 -1
  231. package/dist/server/server/src/controllers/api-token.mjs +4 -4
  232. package/dist/server/server/src/controllers/api-token.mjs.map +1 -1
  233. package/dist/server/server/src/controllers/authentication.js +34 -8
  234. package/dist/server/server/src/controllers/authentication.js.map +1 -1
  235. package/dist/server/server/src/controllers/authentication.mjs +34 -8
  236. package/dist/server/server/src/controllers/authentication.mjs.map +1 -1
  237. package/dist/server/server/src/controllers/formatters/conditions.js +2 -2
  238. package/dist/server/server/src/controllers/formatters/conditions.js.map +1 -1
  239. package/dist/server/server/src/controllers/formatters/conditions.mjs +2 -2
  240. package/dist/server/server/src/controllers/formatters/conditions.mjs.map +1 -1
  241. package/dist/server/server/src/controllers/transfer/index.js +2 -2
  242. package/dist/server/server/src/controllers/transfer/index.js.map +1 -1
  243. package/dist/server/server/src/controllers/transfer/index.mjs +2 -2
  244. package/dist/server/server/src/controllers/transfer/index.mjs.map +1 -1
  245. package/dist/server/server/src/controllers/transfer/token.js +8 -8
  246. package/dist/server/server/src/controllers/transfer/token.js.map +1 -1
  247. package/dist/server/server/src/controllers/transfer/token.mjs +4 -4
  248. package/dist/server/server/src/controllers/transfer/token.mjs.map +1 -1
  249. package/dist/server/server/src/domain/action/index.js +18 -16
  250. package/dist/server/server/src/domain/action/index.js.map +1 -1
  251. package/dist/server/server/src/domain/action/index.mjs +16 -14
  252. package/dist/server/server/src/domain/action/index.mjs.map +1 -1
  253. package/dist/server/server/src/domain/action/provider.mjs +4 -4
  254. package/dist/server/server/src/domain/action/provider.mjs.map +1 -1
  255. package/dist/server/server/src/domain/condition/index.js +7 -4
  256. package/dist/server/server/src/domain/condition/index.js.map +1 -1
  257. package/dist/server/server/src/domain/condition/index.mjs +7 -4
  258. package/dist/server/server/src/domain/condition/index.mjs.map +1 -1
  259. package/dist/server/server/src/domain/permission/index.js +24 -15
  260. package/dist/server/server/src/domain/permission/index.js.map +1 -1
  261. package/dist/server/server/src/domain/permission/index.mjs +21 -12
  262. package/dist/server/server/src/domain/permission/index.mjs.map +1 -1
  263. package/dist/server/server/src/middlewares/rateLimit.js +5 -5
  264. package/dist/server/server/src/middlewares/rateLimit.js.map +1 -1
  265. package/dist/server/server/src/middlewares/rateLimit.mjs +4 -4
  266. package/dist/server/server/src/middlewares/rateLimit.mjs.map +1 -1
  267. package/dist/server/server/src/register.js +10 -0
  268. package/dist/server/server/src/register.js.map +1 -1
  269. package/dist/server/server/src/register.mjs +10 -0
  270. package/dist/server/server/src/register.mjs.map +1 -1
  271. package/dist/server/server/src/routes/admin.js +18 -0
  272. package/dist/server/server/src/routes/admin.js.map +1 -1
  273. package/dist/server/server/src/routes/admin.mjs +18 -0
  274. package/dist/server/server/src/routes/admin.mjs.map +1 -1
  275. package/dist/server/server/src/services/action.js +1 -2
  276. package/dist/server/server/src/services/action.js.map +1 -1
  277. package/dist/server/server/src/services/action.mjs +1 -2
  278. package/dist/server/server/src/services/action.mjs.map +1 -1
  279. package/dist/server/server/src/services/api-token.js +61 -49
  280. package/dist/server/server/src/services/api-token.js.map +1 -1
  281. package/dist/server/server/src/services/api-token.mjs +53 -41
  282. package/dist/server/server/src/services/api-token.mjs.map +1 -1
  283. package/dist/server/server/src/services/auth.js +4 -2
  284. package/dist/server/server/src/services/auth.js.map +1 -1
  285. package/dist/server/server/src/services/auth.mjs +4 -3
  286. package/dist/server/server/src/services/auth.mjs.map +1 -1
  287. package/dist/server/server/src/services/condition.js +2 -2
  288. package/dist/server/server/src/services/condition.js.map +1 -1
  289. package/dist/server/server/src/services/condition.mjs +1 -1
  290. package/dist/server/server/src/services/condition.mjs.map +1 -1
  291. package/dist/server/server/src/services/content-type.js +5 -4
  292. package/dist/server/server/src/services/content-type.js.map +1 -1
  293. package/dist/server/server/src/services/content-type.mjs +8 -7
  294. package/dist/server/server/src/services/content-type.mjs.map +1 -1
  295. package/dist/server/server/src/services/debug-dump.js +173 -0
  296. package/dist/server/server/src/services/debug-dump.js.map +1 -0
  297. package/dist/server/server/src/services/debug-dump.mjs +166 -0
  298. package/dist/server/server/src/services/debug-dump.mjs.map +1 -0
  299. package/dist/server/server/src/services/homepage.js +2 -1
  300. package/dist/server/server/src/services/homepage.js.map +1 -1
  301. package/dist/server/server/src/services/homepage.mjs +2 -1
  302. package/dist/server/server/src/services/homepage.mjs.map +1 -1
  303. package/dist/server/server/src/services/index.js +3 -1
  304. package/dist/server/server/src/services/index.js.map +1 -1
  305. package/dist/server/server/src/services/index.mjs +3 -1
  306. package/dist/server/server/src/services/index.mjs.map +1 -1
  307. package/dist/server/server/src/services/passport/local-strategy.js +2 -2
  308. package/dist/server/server/src/services/passport/local-strategy.js.map +1 -1
  309. package/dist/server/server/src/services/passport/local-strategy.mjs +1 -1
  310. package/dist/server/server/src/services/passport/local-strategy.mjs.map +1 -1
  311. package/dist/server/server/src/services/passport.js +1 -2
  312. package/dist/server/server/src/services/passport.js.map +1 -1
  313. package/dist/server/server/src/services/passport.mjs +1 -2
  314. package/dist/server/server/src/services/passport.mjs.map +1 -1
  315. package/dist/server/server/src/services/permission/engine.js +4 -4
  316. package/dist/server/server/src/services/permission/engine.js.map +1 -1
  317. package/dist/server/server/src/services/permission/engine.mjs +2 -2
  318. package/dist/server/server/src/services/permission/engine.mjs.map +1 -1
  319. package/dist/server/server/src/services/permission/permissions-manager/index.js +2 -3
  320. package/dist/server/server/src/services/permission/permissions-manager/index.js.map +1 -1
  321. package/dist/server/server/src/services/permission/permissions-manager/index.mjs +1 -2
  322. package/dist/server/server/src/services/permission/permissions-manager/index.mjs.map +1 -1
  323. package/dist/server/server/src/services/permission/permissions-manager/permission-fields.js +6 -6
  324. package/dist/server/server/src/services/permission/permissions-manager/permission-fields.js.map +1 -1
  325. package/dist/server/server/src/services/permission/permissions-manager/permission-fields.mjs +4 -4
  326. package/dist/server/server/src/services/permission/permissions-manager/permission-fields.mjs.map +1 -1
  327. package/dist/server/server/src/services/permission/permissions-manager/sanitize.js +47 -41
  328. package/dist/server/server/src/services/permission/permissions-manager/sanitize.js.map +1 -1
  329. package/dist/server/server/src/services/permission/permissions-manager/sanitize.mjs +44 -38
  330. package/dist/server/server/src/services/permission/permissions-manager/sanitize.mjs.map +1 -1
  331. package/dist/server/server/src/services/permission/permissions-manager/validate.js +30 -26
  332. package/dist/server/server/src/services/permission/permissions-manager/validate.js.map +1 -1
  333. package/dist/server/server/src/services/permission/permissions-manager/validate.mjs +28 -24
  334. package/dist/server/server/src/services/permission/permissions-manager/validate.mjs.map +1 -1
  335. package/dist/server/server/src/services/permission/queries.js +9 -9
  336. package/dist/server/server/src/services/permission/queries.js.map +1 -1
  337. package/dist/server/server/src/services/permission/queries.mjs +9 -9
  338. package/dist/server/server/src/services/permission/queries.mjs.map +1 -1
  339. package/dist/server/server/src/services/permission/rename-fields.js +118 -0
  340. package/dist/server/server/src/services/permission/rename-fields.js.map +1 -0
  341. package/dist/server/server/src/services/permission/rename-fields.mjs +116 -0
  342. package/dist/server/server/src/services/permission/rename-fields.mjs.map +1 -0
  343. package/dist/server/server/src/services/permission/sections-builder/index.js +2 -2
  344. package/dist/server/server/src/services/permission/sections-builder/index.js.map +1 -1
  345. package/dist/server/server/src/services/permission/sections-builder/index.mjs +2 -2
  346. package/dist/server/server/src/services/permission/sections-builder/index.mjs.map +1 -1
  347. package/dist/server/server/src/services/permission/sections-builder/section.js +1 -2
  348. package/dist/server/server/src/services/permission/sections-builder/section.js.map +1 -1
  349. package/dist/server/server/src/services/permission/sections-builder/section.mjs +1 -2
  350. package/dist/server/server/src/services/permission/sections-builder/section.mjs.map +1 -1
  351. package/dist/server/server/src/services/permission/sections-builder/utils.js +6 -6
  352. package/dist/server/server/src/services/permission/sections-builder/utils.js.map +1 -1
  353. package/dist/server/server/src/services/permission/sections-builder/utils.mjs +4 -4
  354. package/dist/server/server/src/services/permission/sections-builder/utils.mjs.map +1 -1
  355. package/dist/server/server/src/services/role.js +20 -19
  356. package/dist/server/server/src/services/role.js.map +1 -1
  357. package/dist/server/server/src/services/role.mjs +20 -19
  358. package/dist/server/server/src/services/role.mjs.map +1 -1
  359. package/dist/server/server/src/services/transfer/token.js +20 -16
  360. package/dist/server/server/src/services/transfer/token.js.map +1 -1
  361. package/dist/server/server/src/services/transfer/token.mjs +14 -10
  362. package/dist/server/server/src/services/transfer/token.mjs.map +1 -1
  363. package/dist/server/server/src/services/user.js +2 -3
  364. package/dist/server/server/src/services/user.js.map +1 -1
  365. package/dist/server/server/src/services/user.mjs +3 -4
  366. package/dist/server/server/src/services/user.mjs.map +1 -1
  367. package/dist/server/server/src/strategies/api-token-utils.js +2 -3
  368. package/dist/server/server/src/strategies/api-token-utils.js.map +1 -1
  369. package/dist/server/server/src/strategies/api-token-utils.mjs +2 -3
  370. package/dist/server/server/src/strategies/api-token-utils.mjs.map +1 -1
  371. package/dist/server/server/src/strategies/content-api-token.js +3 -3
  372. package/dist/server/server/src/strategies/content-api-token.js.map +1 -1
  373. package/dist/server/server/src/strategies/content-api-token.mjs +1 -1
  374. package/dist/server/server/src/strategies/content-api-token.mjs.map +1 -1
  375. package/dist/server/server/src/strategies/data-transfer.js +4 -4
  376. package/dist/server/server/src/strategies/data-transfer.js.map +1 -1
  377. package/dist/server/server/src/strategies/data-transfer.mjs +3 -3
  378. package/dist/server/server/src/strategies/data-transfer.mjs.map +1 -1
  379. package/dist/server/server/src/utils/debug-dump/redact.js +197 -0
  380. package/dist/server/server/src/utils/debug-dump/redact.js.map +1 -0
  381. package/dist/server/server/src/utils/debug-dump/redact.mjs +194 -0
  382. package/dist/server/server/src/utils/debug-dump/redact.mjs.map +1 -0
  383. package/dist/server/server/src/validation/common-validators.js +9 -10
  384. package/dist/server/server/src/validation/common-validators.js.map +1 -1
  385. package/dist/server/server/src/validation/common-validators.mjs +13 -14
  386. package/dist/server/server/src/validation/common-validators.mjs.map +1 -1
  387. package/dist/server/server/src/validation/user.js +1 -2
  388. package/dist/server/server/src/validation/user.js.map +1 -1
  389. package/dist/server/server/src/validation/user.mjs +1 -2
  390. package/dist/server/server/src/validation/user.mjs.map +1 -1
  391. package/dist/server/shared/utils/get-project-type.js +49 -0
  392. package/dist/server/shared/utils/get-project-type.js.map +1 -0
  393. package/dist/server/shared/utils/get-project-type.mjs +46 -0
  394. package/dist/server/shared/utils/get-project-type.mjs.map +1 -0
  395. package/dist/server/src/audit-logs/auth.d.ts +72 -0
  396. package/dist/server/src/audit-logs/auth.d.ts.map +1 -0
  397. package/dist/server/src/audit-logs/tokens.d.ts.map +1 -1
  398. package/dist/server/src/bootstrap.d.ts.map +1 -1
  399. package/dist/server/src/config/admin-actions.d.ts.map +1 -1
  400. package/dist/server/src/controllers/admin-token.d.ts.map +1 -1
  401. package/dist/server/src/controllers/admin.d.ts +3 -0
  402. package/dist/server/src/controllers/admin.d.ts.map +1 -1
  403. package/dist/server/src/controllers/api-token.d.ts.map +1 -1
  404. package/dist/server/src/controllers/authentication.d.ts.map +1 -1
  405. package/dist/server/src/controllers/formatters/conditions.d.ts +1 -1
  406. package/dist/server/src/controllers/formatters/conditions.d.ts.map +1 -1
  407. package/dist/server/src/controllers/homepage.d.ts +1 -1
  408. package/dist/server/src/controllers/index.d.ts +4 -1
  409. package/dist/server/src/controllers/index.d.ts.map +1 -1
  410. package/dist/server/src/controllers/transfer/index.d.ts.map +1 -1
  411. package/dist/server/src/controllers/transfer/token.d.ts.map +1 -1
  412. package/dist/server/src/domain/action/index.d.ts +1 -0
  413. package/dist/server/src/domain/action/index.d.ts.map +1 -1
  414. package/dist/server/src/domain/condition/index.d.ts +2 -2
  415. package/dist/server/src/domain/condition/index.d.ts.map +1 -1
  416. package/dist/server/src/domain/permission/index.d.ts.map +1 -1
  417. package/dist/server/src/index.d.ts +11 -3
  418. package/dist/server/src/index.d.ts.map +1 -1
  419. package/dist/server/src/middlewares/index.d.ts.map +1 -1
  420. package/dist/server/src/middlewares/rateLimit.d.ts.map +1 -1
  421. package/dist/server/src/register.d.ts.map +1 -1
  422. package/dist/server/src/routes/admin.d.ts.map +1 -1
  423. package/dist/server/src/services/action.d.ts.map +1 -1
  424. package/dist/server/src/services/api-token.d.ts.map +1 -1
  425. package/dist/server/src/services/auth.d.ts +6 -0
  426. package/dist/server/src/services/auth.d.ts.map +1 -1
  427. package/dist/server/src/services/condition.d.ts.map +1 -1
  428. package/dist/server/src/services/content-type.d.ts.map +1 -1
  429. package/dist/server/src/services/debug-dump.d.ts +9 -0
  430. package/dist/server/src/services/debug-dump.d.ts.map +1 -0
  431. package/dist/server/src/services/homepage.d.ts +1 -1
  432. package/dist/server/src/services/homepage.d.ts.map +1 -1
  433. package/dist/server/src/services/index.d.ts +7 -2
  434. package/dist/server/src/services/index.d.ts.map +1 -1
  435. package/dist/server/src/services/passport/local-strategy.d.ts.map +1 -1
  436. package/dist/server/src/services/passport.d.ts.map +1 -1
  437. package/dist/server/src/services/permission/engine.d.ts.map +1 -1
  438. package/dist/server/src/services/permission/permissions-manager/permission-fields.d.ts.map +1 -1
  439. package/dist/server/src/services/permission/permissions-manager/sanitize.d.ts.map +1 -1
  440. package/dist/server/src/services/permission/permissions-manager/validate.d.ts.map +1 -1
  441. package/dist/server/src/services/permission/queries.d.ts.map +1 -1
  442. package/dist/server/src/services/permission/rename-fields.d.ts +21 -0
  443. package/dist/server/src/services/permission/rename-fields.d.ts.map +1 -0
  444. package/dist/server/src/services/permission/sections-builder/section.d.ts.map +1 -1
  445. package/dist/server/src/services/permission/sections-builder/utils.d.ts +1 -1
  446. package/dist/server/src/services/permission/sections-builder/utils.d.ts.map +1 -1
  447. package/dist/server/src/services/role.d.ts +1 -1
  448. package/dist/server/src/services/role.d.ts.map +1 -1
  449. package/dist/server/src/services/transfer/token.d.ts.map +1 -1
  450. package/dist/server/src/strategies/content-api-token.d.ts.map +1 -1
  451. package/dist/server/src/utils/debug-dump/redact.d.ts +8 -0
  452. package/dist/server/src/utils/debug-dump/redact.d.ts.map +1 -0
  453. package/dist/server/src/validation/user.d.ts.map +1 -1
  454. package/dist/shared/contracts/admin.d.ts +106 -0
  455. package/dist/shared/contracts/admin.d.ts.map +1 -1
  456. package/dist/shared/utils/__tests__/get-project-type.test.d.ts +1 -0
  457. package/dist/shared/utils/__tests__/get-project-type.test.d.ts.map +1 -0
  458. package/dist/shared/utils/get-project-type.d.ts +37 -0
  459. package/dist/shared/utils/get-project-type.d.ts.map +1 -0
  460. package/package.json +10 -10
  461. package/dist/admin/admin/src/utils/getProjectType.js +0 -22
  462. package/dist/admin/admin/src/utils/getProjectType.js.map +0 -1
  463. package/dist/admin/admin/src/utils/getProjectType.mjs +0 -20
  464. package/dist/admin/admin/src/utils/getProjectType.mjs.map +0 -1
  465. package/dist/admin/src/utils/getProjectType.d.ts +0 -16
@@ -1 +1 @@
1
- {"version":3,"file":"AuthenticatedLayout.mjs","sources":["../../../../../admin/src/layouts/AuthenticatedLayout.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport packageInfo from '@strapi/admin/package.json';\nimport { Box, Flex, SkipToContent } from '@strapi/design-system';\nimport { DndProvider } from 'react-dnd';\nimport { HTML5Backend } from 'react-dnd-html5-backend';\nimport { useIntl } from 'react-intl';\nimport lt from 'semver/functions/lt';\nimport valid from 'semver/functions/valid';\n\nimport { LazyOutlet } from '../components/LazyOutlet';\nimport { LeftMenu } from '../components/LeftMenu';\nimport { MediaLibraryBanner } from '../components/MediaLibraryBanner';\nimport { NpsSurvey } from '../components/NpsSurvey';\nimport { Page } from '../components/PageHelpers';\nimport { PluginsInitializer } from '../components/PluginsInitializer';\nimport { PrivateRoute } from '../components/PrivateRoute';\nimport { UpsellBanner } from '../components/UpsellBanner';\nimport { AppInfoProvider } from '../features/AppInfo';\nimport { useAuth } from '../features/Auth';\nimport { useConfiguration } from '../features/Configuration';\nimport { useStrapiApp } from '../features/StrapiApp';\nimport { useTracking } from '../features/Tracking';\nimport { useMenu } from '../hooks/useMenu';\nimport { useInformationQuery } from '../services/admin';\nimport { hashAdminUserEmail } from '../utils/users';\n\nconst { version: strapiVersion } = packageInfo;\n\nconst AdminLayout = () => {\n const { formatMessage } = useIntl();\n const userInfo = useAuth('AuthenticatedApp', (state) => state.user);\n const [userId, setUserId] = React.useState<string>();\n const { showReleaseNotification } = useConfiguration('AuthenticatedApp');\n\n const { data: appInfo, isLoading: isLoadingAppInfo } = useInformationQuery();\n const [tagName, setTagName] = React.useState<string>(strapiVersion);\n\n React.useEffect(() => {\n if (showReleaseNotification) {\n fetch('https://api.github.com/repos/strapi/strapi/releases/latest')\n .then(async (res) => {\n if (!res.ok) {\n return;\n }\n\n const response = (await res.json()) as { tag_name: string | null | undefined };\n\n if (!response.tag_name) {\n throw new Error();\n }\n\n setTagName(response.tag_name);\n })\n .catch(() => {\n /**\n * silence is golden & we'll use the strapiVersion as a fallback\n */\n });\n }\n }, [showReleaseNotification]);\n\n React.useEffect(() => {\n hashAdminUserEmail(userInfo).then((id) => {\n if (id) {\n setUserId(id);\n }\n });\n }, [userInfo]);\n\n const { trackUsage } = useTracking();\n\n const {\n isLoading: isLoadingMenu,\n generalSectionLinks,\n pluginsSectionLinks,\n topMobileNavigation,\n burgerMobileNavigation,\n } = useMenu(checkLatestStrapiVersion(strapiVersion, tagName), appInfo?.currentEnvironment);\n\n const getAllWidgets = useStrapiApp('TrackingProvider', (state) => state.widgets.getAll);\n const projectId = appInfo?.projectId;\n React.useEffect(() => {\n if (projectId) {\n trackUsage('didAccessAuthenticatedAdministration', {\n registeredWidgets: getAllWidgets().map((widget) => widget.uid),\n projectId,\n });\n }\n }, [projectId, getAllWidgets, trackUsage]);\n\n // We don't need to wait for the release query to be fetched before rendering the plugins\n // however, we need the appInfos and the permissions\n if (isLoadingMenu || isLoadingAppInfo) {\n return <Page.Loading />;\n }\n\n return (\n <AppInfoProvider\n {...appInfo}\n userId={userId}\n latestStrapiReleaseTag={tagName}\n shouldUpdateStrapi={checkLatestStrapiVersion(strapiVersion, tagName)}\n >\n <NpsSurvey />\n <PluginsInitializer>\n <DndProvider backend={HTML5Backend}>\n <Box background=\"neutral100\">\n <SkipToContent>\n {formatMessage({ id: 'skipToContent', defaultMessage: 'Skip to content' })}\n </SkipToContent>\n <Flex\n height=\"100dvh\"\n direction={{\n initial: 'column',\n large: 'row',\n }}\n alignItems=\"flex-start\"\n >\n <LeftMenu\n generalSectionLinks={generalSectionLinks}\n pluginsSectionLinks={pluginsSectionLinks}\n topMobileNavigation={topMobileNavigation}\n burgerMobileNavigation={burgerMobileNavigation}\n />\n <Flex\n direction=\"column\"\n alignItems=\"stretch\"\n flex={1}\n overflow=\"auto\"\n width=\"100%\"\n height={{\n initial: 'auto',\n large: '100%',\n }}\n >\n <UpsellBanner />\n <MediaLibraryBanner />\n {/*\n * Top-level Suspense only — nested layouts (Settings, Content Manager) use\n * LazyOutlet with useNavigation so in-app navigations show loading in the content\n * column without hiding section side navs.\n */}\n <LazyOutlet suspenseOnly />\n </Flex>\n </Flex>\n </Box>\n </DndProvider>\n </PluginsInitializer>\n </AppInfoProvider>\n );\n};\n\nconst PrivateAdminLayout = () => {\n return (\n <PrivateRoute>\n <AdminLayout />\n </PrivateRoute>\n );\n};\n\nconst checkLatestStrapiVersion = (\n currentPackageVersion: string,\n latestPublishedVersion: string = ''\n): boolean => {\n if (!valid(currentPackageVersion) || !valid(latestPublishedVersion)) {\n return false;\n }\n\n return lt(currentPackageVersion, latestPublishedVersion);\n};\n\nexport { AdminLayout, PrivateAdminLayout };\n"],"names":["version","strapiVersion","packageInfo","AdminLayout","formatMessage","useIntl","userInfo","useAuth","state","user","userId","setUserId","React","useState","showReleaseNotification","useConfiguration","data","appInfo","isLoading","isLoadingAppInfo","useInformationQuery","tagName","setTagName","useEffect","fetch","then","res","ok","response","json","tag_name","Error","catch","hashAdminUserEmail","id","trackUsage","useTracking","isLoadingMenu","generalSectionLinks","pluginsSectionLinks","topMobileNavigation","burgerMobileNavigation","useMenu","checkLatestStrapiVersion","currentEnvironment","getAllWidgets","useStrapiApp","widgets","getAll","projectId","registeredWidgets","map","widget","uid","_jsx","Page","Loading","_jsxs","AppInfoProvider","latestStrapiReleaseTag","shouldUpdateStrapi","NpsSurvey","PluginsInitializer","DndProvider","backend","HTML5Backend","Box","background","SkipToContent","defaultMessage","Flex","height","direction","initial","large","alignItems","LeftMenu","flex","overflow","width","UpsellBanner","MediaLibraryBanner","LazyOutlet","suspenseOnly","PrivateAdminLayout","PrivateRoute","currentPackageVersion","latestPublishedVersion","valid","lt"],"mappings":"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"}
1
+ {"version":3,"file":"AuthenticatedLayout.mjs","sources":["../../../../../admin/src/layouts/AuthenticatedLayout.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport packageInfo from '@strapi/admin/package.json';\nimport { Box, Flex, SkipToContent } from '@strapi/design-system';\nimport { DndProvider } from 'react-dnd';\nimport { HTML5Backend } from 'react-dnd-html5-backend';\nimport { useIntl } from 'react-intl';\nimport lt from 'semver/functions/lt';\nimport valid from 'semver/functions/valid';\n\nimport { LazyOutlet } from '../components/LazyOutlet';\nimport { LeftMenu } from '../components/LeftMenu';\nimport { NpsSurvey } from '../components/NpsSurvey';\nimport { Page } from '../components/PageHelpers';\nimport { PluginsInitializer } from '../components/PluginsInitializer';\nimport { PrivateRoute } from '../components/PrivateRoute';\nimport { TopBanners } from '../components/TopBanners';\nimport { AppInfoProvider } from '../features/AppInfo';\nimport { useAuth } from '../features/Auth';\nimport { useConfiguration } from '../features/Configuration';\nimport { useMenu } from '../hooks/useMenu';\nimport { useInformationQuery } from '../services/admin';\nimport { hashAdminUserEmail } from '../utils/users';\n\nimport { useAuthenticatedAccessTracking } from './useAuthenticatedAccessTracking';\n\nconst { version: strapiVersion } = packageInfo;\n\nconst AdminLayout = () => {\n const { formatMessage } = useIntl();\n const userInfo = useAuth('AuthenticatedApp', (state) => state.user);\n const [userId, setUserId] = React.useState<string>();\n const { showReleaseNotification } = useConfiguration('AuthenticatedApp');\n\n const { data: appInfo, isLoading: isLoadingAppInfo } = useInformationQuery();\n const [tagName, setTagName] = React.useState<string>(strapiVersion);\n\n React.useEffect(() => {\n if (showReleaseNotification) {\n fetch('https://api.github.com/repos/strapi/strapi/releases/latest')\n .then(async (res) => {\n if (!res.ok) {\n return;\n }\n\n const response = (await res.json()) as { tag_name: string | null | undefined };\n\n if (!response.tag_name) {\n throw new Error();\n }\n\n setTagName(response.tag_name);\n })\n .catch(() => {\n /**\n * silence is golden & we'll use the strapiVersion as a fallback\n */\n });\n }\n }, [showReleaseNotification]);\n\n React.useEffect(() => {\n hashAdminUserEmail(userInfo).then((id) => {\n if (id) {\n setUserId(id);\n }\n });\n }, [userInfo]);\n\n const {\n isLoading: isLoadingMenu,\n generalSectionLinks,\n pluginsSectionLinks,\n topMobileNavigation,\n burgerMobileNavigation,\n } = useMenu(checkLatestStrapiVersion(strapiVersion, tagName), appInfo?.currentEnvironment);\n\n const projectId = appInfo?.projectId;\n useAuthenticatedAccessTracking(projectId);\n\n // We don't need to wait for the release query to be fetched before rendering the plugins\n // however, we need the appInfos and the permissions\n if (isLoadingMenu || isLoadingAppInfo) {\n return <Page.Loading />;\n }\n\n return (\n <AppInfoProvider\n {...appInfo}\n userId={userId}\n latestStrapiReleaseTag={tagName}\n shouldUpdateStrapi={checkLatestStrapiVersion(strapiVersion, tagName)}\n >\n <NpsSurvey />\n <PluginsInitializer>\n <DndProvider backend={HTML5Backend}>\n <Box background=\"neutral100\">\n <SkipToContent>\n {formatMessage({ id: 'skipToContent', defaultMessage: 'Skip to content' })}\n </SkipToContent>\n <Flex\n height=\"100dvh\"\n direction={{\n initial: 'column',\n large: 'row',\n }}\n alignItems=\"flex-start\"\n >\n <LeftMenu\n generalSectionLinks={generalSectionLinks}\n pluginsSectionLinks={pluginsSectionLinks}\n topMobileNavigation={topMobileNavigation}\n burgerMobileNavigation={burgerMobileNavigation}\n />\n <Flex\n direction=\"column\"\n alignItems=\"stretch\"\n flex={1}\n overflow=\"auto\"\n width=\"100%\"\n height={{\n initial: 'auto',\n large: '100%',\n }}\n >\n <TopBanners />\n {/*\n * Top-level Suspense only — nested layouts (Settings, Content Manager) use\n * LazyOutlet with useNavigation so in-app navigations show loading in the content\n * column without hiding section side navs.\n */}\n <LazyOutlet suspenseOnly />\n </Flex>\n </Flex>\n </Box>\n </DndProvider>\n </PluginsInitializer>\n </AppInfoProvider>\n );\n};\n\nconst PrivateAdminLayout = () => {\n return (\n <PrivateRoute>\n <AdminLayout />\n </PrivateRoute>\n );\n};\n\nconst checkLatestStrapiVersion = (\n currentPackageVersion: string,\n latestPublishedVersion: string = ''\n): boolean => {\n if (!valid(currentPackageVersion) || !valid(latestPublishedVersion)) {\n return false;\n }\n\n return lt(currentPackageVersion, latestPublishedVersion);\n};\n\nexport { AdminLayout, PrivateAdminLayout };\n"],"names":["version","strapiVersion","packageInfo","AdminLayout","formatMessage","useIntl","userInfo","useAuth","state","user","userId","setUserId","React","useState","showReleaseNotification","useConfiguration","data","appInfo","isLoading","isLoadingAppInfo","useInformationQuery","tagName","setTagName","useEffect","fetch","then","res","ok","response","json","tag_name","Error","catch","hashAdminUserEmail","id","isLoadingMenu","generalSectionLinks","pluginsSectionLinks","topMobileNavigation","burgerMobileNavigation","useMenu","checkLatestStrapiVersion","currentEnvironment","projectId","useAuthenticatedAccessTracking","_jsx","Page","Loading","_jsxs","AppInfoProvider","latestStrapiReleaseTag","shouldUpdateStrapi","NpsSurvey","PluginsInitializer","DndProvider","backend","HTML5Backend","Box","background","SkipToContent","defaultMessage","Flex","height","direction","initial","large","alignItems","LeftMenu","flex","overflow","width","TopBanners","LazyOutlet","suspenseOnly","PrivateAdminLayout","PrivateRoute","currentPackageVersion","latestPublishedVersion","valid","lt"],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+ var StrapiApp = require('../features/StrapiApp.js');
5
+ var Tracking = require('../features/Tracking.js');
6
+ var admin = require('../services/admin.js');
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
+ /**
29
+ * Sends `didAccessAuthenticatedAdministration` once per mount, after the Strapi
30
+ * version is ready and the telemetry-properties query has settled.
31
+ */ const useAuthenticatedAccessTracking = (projectId)=>{
32
+ const { trackUsage } = Tracking.useTracking();
33
+ const isStrapiVersionReady = Tracking.useStrapiVersionReady();
34
+ const { isSuccess: hasTelemetryProperties, isError: didTelemetryPropertiesFail } = admin.useTelemetryPropertiesQuery(undefined, {
35
+ skip: !isStrapiVersionReady
36
+ });
37
+ const getAllWidgets = StrapiApp.useStrapiApp('TrackingProvider', (state)=>state.widgets.getAll);
38
+ const didTrackAccess = React__namespace.useRef(false);
39
+ const hasTelemetryPropertiesSettled = hasTelemetryProperties || didTelemetryPropertiesFail;
40
+ React__namespace.useEffect(()=>{
41
+ if (!projectId || !isStrapiVersionReady || !hasTelemetryPropertiesSettled || didTrackAccess.current) {
42
+ return;
43
+ }
44
+ didTrackAccess.current = true;
45
+ trackUsage('didAccessAuthenticatedAdministration', {
46
+ registeredWidgets: getAllWidgets().map((widget)=>widget.uid),
47
+ projectId
48
+ });
49
+ }, [
50
+ projectId,
51
+ isStrapiVersionReady,
52
+ hasTelemetryPropertiesSettled,
53
+ getAllWidgets,
54
+ trackUsage
55
+ ]);
56
+ };
57
+
58
+ exports.useAuthenticatedAccessTracking = useAuthenticatedAccessTracking;
59
+ //# sourceMappingURL=useAuthenticatedAccessTracking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAuthenticatedAccessTracking.js","sources":["../../../../../admin/src/layouts/useAuthenticatedAccessTracking.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { useStrapiApp } from '../features/StrapiApp';\nimport { useTracking, useStrapiVersionReady } from '../features/Tracking';\nimport { useTelemetryPropertiesQuery } from '../services/admin';\n\n/**\n * Sends `didAccessAuthenticatedAdministration` once per mount, after the Strapi\n * version is ready and the telemetry-properties query has settled.\n */\nconst useAuthenticatedAccessTracking = (projectId?: string | null) => {\n const { trackUsage } = useTracking();\n const isStrapiVersionReady = useStrapiVersionReady();\n const { isSuccess: hasTelemetryProperties, isError: didTelemetryPropertiesFail } =\n useTelemetryPropertiesQuery(undefined, {\n skip: !isStrapiVersionReady,\n });\n const getAllWidgets = useStrapiApp('TrackingProvider', (state) => state.widgets.getAll);\n const didTrackAccess = React.useRef(false);\n const hasTelemetryPropertiesSettled = hasTelemetryProperties || didTelemetryPropertiesFail;\n\n React.useEffect(() => {\n if (\n !projectId ||\n !isStrapiVersionReady ||\n !hasTelemetryPropertiesSettled ||\n didTrackAccess.current\n ) {\n return;\n }\n\n didTrackAccess.current = true;\n trackUsage('didAccessAuthenticatedAdministration', {\n registeredWidgets: getAllWidgets().map((widget) => widget.uid),\n projectId,\n });\n }, [projectId, isStrapiVersionReady, hasTelemetryPropertiesSettled, getAllWidgets, trackUsage]);\n};\n\nexport { useAuthenticatedAccessTracking };\n"],"names":["useAuthenticatedAccessTracking","projectId","trackUsage","useTracking","isStrapiVersionReady","useStrapiVersionReady","isSuccess","hasTelemetryProperties","isError","didTelemetryPropertiesFail","useTelemetryPropertiesQuery","undefined","skip","getAllWidgets","useStrapiApp","state","widgets","getAll","didTrackAccess","React","useRef","hasTelemetryPropertiesSettled","useEffect","current","registeredWidgets","map","widget","uid"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA;;;IAIA,MAAMA,iCAAiC,CAACC,SAAAA,GAAAA;IACtC,MAAM,EAAEC,UAAU,EAAE,GAAGC,oBAAAA,EAAAA;AACvB,IAAA,MAAMC,oBAAAA,GAAuBC,8BAAAA,EAAAA;IAC7B,MAAM,EAAEC,WAAWC,sBAAsB,EAAEC,SAASC,0BAA0B,EAAE,GAC9EC,iCAAAA,CAA4BC,SAAAA,EAAW;AACrCC,QAAAA,IAAAA,EAAM,CAACR;AACT,KAAA,CAAA;IACF,MAAMS,aAAAA,GAAgBC,uBAAa,kBAAA,EAAoB,CAACC,QAAUA,KAAAA,CAAMC,OAAO,CAACC,MAAM,CAAA;IACtF,MAAMC,cAAAA,GAAiBC,gBAAAA,CAAMC,MAAM,CAAC,KAAA,CAAA;AACpC,IAAA,MAAMC,gCAAgCd,sBAAAA,IAA0BE,0BAAAA;AAEhEU,IAAAA,gBAAAA,CAAMG,SAAS,CAAC,IAAA;QACd,IACE,CAACrB,aACD,CAACG,oBAAAA,IACD,CAACiB,6BAAAA,IACDH,cAAAA,CAAeK,OAAO,EACtB;AACA,YAAA;AACF,QAAA;AAEAL,QAAAA,cAAAA,CAAeK,OAAO,GAAG,IAAA;AACzBrB,QAAAA,UAAAA,CAAW,sCAAA,EAAwC;AACjDsB,YAAAA,iBAAAA,EAAmBX,gBAAgBY,GAAG,CAAC,CAACC,MAAAA,GAAWA,OAAOC,GAAG,CAAA;AAC7D1B,YAAAA;AACF,SAAA,CAAA;IACF,CAAA,EAAG;AAACA,QAAAA,SAAAA;AAAWG,QAAAA,oBAAAA;AAAsBiB,QAAAA,6BAAAA;AAA+BR,QAAAA,aAAAA;AAAeX,QAAAA;AAAW,KAAA,CAAA;AAChG;;;;"}
@@ -0,0 +1,37 @@
1
+ import * as React from 'react';
2
+ import { useStrapiApp } from '../features/StrapiApp.mjs';
3
+ import { useTracking, useStrapiVersionReady } from '../features/Tracking.mjs';
4
+ import { useTelemetryPropertiesQuery } from '../services/admin.mjs';
5
+
6
+ /**
7
+ * Sends `didAccessAuthenticatedAdministration` once per mount, after the Strapi
8
+ * version is ready and the telemetry-properties query has settled.
9
+ */ const useAuthenticatedAccessTracking = (projectId)=>{
10
+ const { trackUsage } = useTracking();
11
+ const isStrapiVersionReady = useStrapiVersionReady();
12
+ const { isSuccess: hasTelemetryProperties, isError: didTelemetryPropertiesFail } = useTelemetryPropertiesQuery(undefined, {
13
+ skip: !isStrapiVersionReady
14
+ });
15
+ const getAllWidgets = useStrapiApp('TrackingProvider', (state)=>state.widgets.getAll);
16
+ const didTrackAccess = React.useRef(false);
17
+ const hasTelemetryPropertiesSettled = hasTelemetryProperties || didTelemetryPropertiesFail;
18
+ React.useEffect(()=>{
19
+ if (!projectId || !isStrapiVersionReady || !hasTelemetryPropertiesSettled || didTrackAccess.current) {
20
+ return;
21
+ }
22
+ didTrackAccess.current = true;
23
+ trackUsage('didAccessAuthenticatedAdministration', {
24
+ registeredWidgets: getAllWidgets().map((widget)=>widget.uid),
25
+ projectId
26
+ });
27
+ }, [
28
+ projectId,
29
+ isStrapiVersionReady,
30
+ hasTelemetryPropertiesSettled,
31
+ getAllWidgets,
32
+ trackUsage
33
+ ]);
34
+ };
35
+
36
+ export { useAuthenticatedAccessTracking };
37
+ //# sourceMappingURL=useAuthenticatedAccessTracking.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAuthenticatedAccessTracking.mjs","sources":["../../../../../admin/src/layouts/useAuthenticatedAccessTracking.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { useStrapiApp } from '../features/StrapiApp';\nimport { useTracking, useStrapiVersionReady } from '../features/Tracking';\nimport { useTelemetryPropertiesQuery } from '../services/admin';\n\n/**\n * Sends `didAccessAuthenticatedAdministration` once per mount, after the Strapi\n * version is ready and the telemetry-properties query has settled.\n */\nconst useAuthenticatedAccessTracking = (projectId?: string | null) => {\n const { trackUsage } = useTracking();\n const isStrapiVersionReady = useStrapiVersionReady();\n const { isSuccess: hasTelemetryProperties, isError: didTelemetryPropertiesFail } =\n useTelemetryPropertiesQuery(undefined, {\n skip: !isStrapiVersionReady,\n });\n const getAllWidgets = useStrapiApp('TrackingProvider', (state) => state.widgets.getAll);\n const didTrackAccess = React.useRef(false);\n const hasTelemetryPropertiesSettled = hasTelemetryProperties || didTelemetryPropertiesFail;\n\n React.useEffect(() => {\n if (\n !projectId ||\n !isStrapiVersionReady ||\n !hasTelemetryPropertiesSettled ||\n didTrackAccess.current\n ) {\n return;\n }\n\n didTrackAccess.current = true;\n trackUsage('didAccessAuthenticatedAdministration', {\n registeredWidgets: getAllWidgets().map((widget) => widget.uid),\n projectId,\n });\n }, [projectId, isStrapiVersionReady, hasTelemetryPropertiesSettled, getAllWidgets, trackUsage]);\n};\n\nexport { useAuthenticatedAccessTracking };\n"],"names":["useAuthenticatedAccessTracking","projectId","trackUsage","useTracking","isStrapiVersionReady","useStrapiVersionReady","isSuccess","hasTelemetryProperties","isError","didTelemetryPropertiesFail","useTelemetryPropertiesQuery","undefined","skip","getAllWidgets","useStrapiApp","state","widgets","getAll","didTrackAccess","React","useRef","hasTelemetryPropertiesSettled","useEffect","current","registeredWidgets","map","widget","uid"],"mappings":";;;;;AAMA;;;IAIA,MAAMA,iCAAiC,CAACC,SAAAA,GAAAA;IACtC,MAAM,EAAEC,UAAU,EAAE,GAAGC,WAAAA,EAAAA;AACvB,IAAA,MAAMC,oBAAAA,GAAuBC,qBAAAA,EAAAA;IAC7B,MAAM,EAAEC,WAAWC,sBAAsB,EAAEC,SAASC,0BAA0B,EAAE,GAC9EC,2BAAAA,CAA4BC,SAAAA,EAAW;AACrCC,QAAAA,IAAAA,EAAM,CAACR;AACT,KAAA,CAAA;IACF,MAAMS,aAAAA,GAAgBC,aAAa,kBAAA,EAAoB,CAACC,QAAUA,KAAAA,CAAMC,OAAO,CAACC,MAAM,CAAA;IACtF,MAAMC,cAAAA,GAAiBC,KAAAA,CAAMC,MAAM,CAAC,KAAA,CAAA;AACpC,IAAA,MAAMC,gCAAgCd,sBAAAA,IAA0BE,0BAAAA;AAEhEU,IAAAA,KAAAA,CAAMG,SAAS,CAAC,IAAA;QACd,IACE,CAACrB,aACD,CAACG,oBAAAA,IACD,CAACiB,6BAAAA,IACDH,cAAAA,CAAeK,OAAO,EACtB;AACA,YAAA;AACF,QAAA;AAEAL,QAAAA,cAAAA,CAAeK,OAAO,GAAG,IAAA;AACzBrB,QAAAA,UAAAA,CAAW,sCAAA,EAAwC;AACjDsB,YAAAA,iBAAAA,EAAmBX,gBAAgBY,GAAG,CAAC,CAACC,MAAAA,GAAWA,OAAOC,GAAG,CAAA;AAC7D1B,YAAAA;AACF,SAAA,CAAA;IACF,CAAA,EAAG;AAACA,QAAAA,SAAAA;AAAWG,QAAAA,oBAAAA;AAAsBiB,QAAAA,6BAAAA;AAA+BR,QAAAA,aAAAA;AAAeX,QAAAA;AAAW,KAAA,CAAA;AAChG;;;;"}
@@ -55,26 +55,20 @@ const RESET_PASSWORD_SCHEMA = yup__namespace.object().shape({
55
55
  const byteSize = strings.getByteSize(value);
56
56
  return byteSize <= 72;
57
57
  }).test('lowercase', {
58
- message: {
59
- id: 'components.Input.error.contain.lowercase',
60
- defaultMessage: 'Password must contain at least 1 lowercase letter'
61
- }
58
+ id: 'components.Input.error.contain.lowercase',
59
+ defaultMessage: 'Password must contain at least 1 lowercase letter'
62
60
  }, (value)=>{
63
61
  if (!value) return true;
64
62
  return /[a-z]/.test(value);
65
63
  }).test('uppercase', {
66
- message: {
67
- id: 'components.Input.error.contain.uppercase',
68
- defaultMessage: 'Password must contain at least 1 uppercase letter'
69
- }
64
+ id: 'components.Input.error.contain.uppercase',
65
+ defaultMessage: 'Password must contain at least 1 uppercase letter'
70
66
  }, (value)=>{
71
67
  if (!value) return true;
72
68
  return /[A-Z]/.test(value);
73
69
  }).test('number', {
74
- message: {
75
- id: 'components.Input.error.contain.number',
76
- defaultMessage: 'Password must contain at least 1 number'
77
- }
70
+ id: 'components.Input.error.contain.number',
71
+ defaultMessage: 'Password must contain at least 1 number'
78
72
  }, (value)=>{
79
73
  if (!value) return true;
80
74
  return /\d/.test(value);
@@ -1 +1 @@
1
- {"version":3,"file":"ResetPassword.js","sources":["../../../../../../../admin/src/pages/Auth/components/ResetPassword.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, Button, Flex, Main, Typography, Link } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { NavLink, useNavigate, Navigate, useLocation } from 'react-router-dom';\nimport * as yup from 'yup';\n\nimport { ResetPassword } from '../../../../../shared/contracts/authentication';\nimport { Form } from '../../../components/Form';\nimport { InputRenderer } from '../../../components/FormInputs/Renderer';\nimport { Logo } from '../../../components/UnauthenticatedLogo';\nimport { useTypedDispatch } from '../../../core/store/hooks';\nimport { useAPIErrorHandler } from '../../../hooks/useAPIErrorHandler';\nimport {\n Column,\n LayoutContent,\n UnauthenticatedLayout,\n} from '../../../layouts/UnauthenticatedLayout';\nimport { login } from '../../../reducer';\nimport { useResetPasswordMutation } from '../../../services/auth';\nimport { isBaseQueryError } from '../../../utils/baseQuery';\nimport { getByteSize } from '../../../utils/strings';\nimport { translatedErrors } from '../../../utils/translatedErrors';\n\nconst RESET_PASSWORD_SCHEMA = yup.object().shape({\n password: yup\n .string()\n .min(8, {\n id: translatedErrors.minLength.id,\n defaultMessage: 'Password must be at least 8 characters',\n values: { min: 8 },\n })\n // bcrypt has a max length of 72 bytes (not characters!)\n .test(\n 'required-byte-size',\n {\n id: 'components.Input.error.contain.maxBytes',\n defaultMessage: 'Password must be less than 73 bytes',\n },\n function (value) {\n if (!value || typeof value !== 'string') return true; // validated elsewhere\n\n const byteSize = getByteSize(value);\n return byteSize <= 72;\n }\n )\n .test(\n 'lowercase',\n {\n message: {\n id: 'components.Input.error.contain.lowercase',\n defaultMessage: 'Password must contain at least 1 lowercase letter',\n },\n },\n (value) => {\n if (!value) return true;\n return /[a-z]/.test(value);\n }\n )\n .test(\n 'uppercase',\n {\n message: {\n id: 'components.Input.error.contain.uppercase',\n defaultMessage: 'Password must contain at least 1 uppercase letter',\n },\n },\n (value) => {\n if (!value) return true;\n return /[A-Z]/.test(value);\n }\n )\n .test(\n 'number',\n {\n message: {\n id: 'components.Input.error.contain.number',\n defaultMessage: 'Password must contain at least 1 number',\n },\n },\n (value) => {\n if (!value) return true;\n return /\\d/.test(value);\n }\n )\n .required({\n id: translatedErrors.required.id,\n defaultMessage: 'Password is required',\n })\n .nullable(),\n confirmPassword: yup\n .string()\n .required({\n id: translatedErrors.required.id,\n defaultMessage: 'Confirm password is required',\n })\n .oneOf([yup.ref('password'), null], {\n id: 'components.Input.error.password.noMatch',\n defaultMessage: 'Passwords must match',\n })\n .nullable(),\n});\n\nconst ResetPassword = () => {\n const { formatMessage } = useIntl();\n const dispatch = useTypedDispatch();\n const navigate = useNavigate();\n const { search: searchString } = useLocation();\n const query = React.useMemo(() => new URLSearchParams(searchString), [searchString]);\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n\n const [resetPassword, { error }] = useResetPasswordMutation();\n\n const handleSubmit = async (body: ResetPassword.Request['body']) => {\n const res = await resetPassword(body);\n\n if ('data' in res) {\n dispatch(login({ token: res.data.token }));\n navigate('/');\n }\n };\n /**\n * If someone doesn't have a reset password token\n * then they should just be redirected back to the login page.\n */\n if (!query.get('code')) {\n return <Navigate to=\"/auth/login\" />;\n }\n\n return (\n <UnauthenticatedLayout>\n <Main>\n <LayoutContent>\n <Column>\n <Logo />\n <Box paddingTop={6} paddingBottom={7}>\n <Typography tag=\"h1\" variant=\"alpha\">\n {formatMessage({\n id: 'global.reset-password',\n defaultMessage: 'Reset password',\n })}\n </Typography>\n </Box>\n {error ? (\n <Typography id=\"global-form-error\" role=\"alert\" tabIndex={-1} textColor=\"danger600\">\n {isBaseQueryError(error)\n ? formatAPIError(error)\n : formatMessage({\n id: 'notification.error',\n defaultMessage: 'An error occurred',\n })}\n </Typography>\n ) : null}\n </Column>\n <Form\n method=\"POST\"\n initialValues={{\n password: '',\n confirmPassword: '',\n }}\n onSubmit={(values) => {\n // We know query.code is defined because we check for it above.\n handleSubmit({ password: values.password, resetPasswordToken: query.get('code')! });\n }}\n validationSchema={RESET_PASSWORD_SCHEMA}\n >\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n {[\n {\n hint: formatMessage({\n id: 'Auth.form.password.hint',\n defaultMessage:\n 'Password must contain at least 8 characters, 1 uppercase, 1 lowercase and 1 number',\n }),\n label: formatMessage({\n id: 'global.password',\n defaultMessage: 'Password',\n }),\n name: 'password',\n required: true,\n type: 'password' as const,\n },\n {\n label: formatMessage({\n id: 'Auth.form.confirmPassword.label',\n defaultMessage: 'Confirm Password',\n }),\n name: 'confirmPassword',\n required: true,\n type: 'password' as const,\n },\n ].map((field) => (\n <InputRenderer key={field.name} {...field} />\n ))}\n <Button fullWidth type=\"submit\">\n {formatMessage({\n id: 'global.change-password',\n defaultMessage: 'Change password',\n })}\n </Button>\n </Flex>\n </Form>\n </LayoutContent>\n <Flex justifyContent=\"center\">\n <Box paddingTop={4}>\n <Link tag={NavLink} to=\"/auth/login\">\n {formatMessage({ id: 'Auth.link.ready', defaultMessage: 'Ready to sign in?' })}\n </Link>\n </Box>\n </Flex>\n </Main>\n </UnauthenticatedLayout>\n );\n};\n\nexport { ResetPassword };\n"],"names":["RESET_PASSWORD_SCHEMA","yup","object","shape","password","string","min","id","translatedErrors","minLength","defaultMessage","values","test","value","byteSize","getByteSize","message","required","nullable","confirmPassword","oneOf","ref","ResetPassword","formatMessage","useIntl","dispatch","useTypedDispatch","navigate","useNavigate","search","searchString","useLocation","query","React","useMemo","URLSearchParams","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","resetPassword","error","useResetPasswordMutation","handleSubmit","body","res","login","token","data","get","_jsx","Navigate","to","UnauthenticatedLayout","_jsxs","Main","LayoutContent","Column","Logo","Box","paddingTop","paddingBottom","Typography","tag","variant","role","tabIndex","textColor","isBaseQueryError","Form","method","initialValues","onSubmit","resetPasswordToken","validationSchema","Flex","direction","alignItems","gap","hint","label","name","type","map","field","InputRenderer","Button","fullWidth","justifyContent","Link","NavLink"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwBA,MAAMA,qBAAAA,GAAwBC,cAAAA,CAAIC,MAAM,EAAA,CAAGC,KAAK,CAAC;AAC/CC,IAAAA,QAAAA,EAAUH,cAAAA,CACPI,MAAM,EAAA,CACNC,GAAG,CAAC,CAAA,EAAG;QACNC,EAAAA,EAAIC,iCAAAA,CAAiBC,SAAS,CAACF,EAAE;QACjCG,cAAAA,EAAgB,wCAAA;QAChBC,MAAAA,EAAQ;YAAEL,GAAAA,EAAK;AAAE;AACnB,KAAA,CACA;AACCM,KAAAA,IAAI,CACH,oBAAA,EACA;QACEL,EAAAA,EAAI,yCAAA;QACJG,cAAAA,EAAgB;AAClB,KAAA,EACA,SAAUG,KAAK,EAAA;AACb,QAAA,IAAI,CAACA,KAAAA,IAAS,OAAOA,UAAU,QAAA,EAAU,OAAO;AAEhD,QAAA,MAAMC,WAAWC,mBAAAA,CAAYF,KAAAA,CAAAA;AAC7B,QAAA,OAAOC,QAAAA,IAAY,EAAA;IACrB,CAAA,CAAA,CAEDF,IAAI,CACH,WAAA,EACA;QACEI,OAAAA,EAAS;YACPT,EAAAA,EAAI,0CAAA;YACJG,cAAAA,EAAgB;AAClB;AACF,KAAA,EACA,CAACG,KAAAA,GAAAA;QACC,IAAI,CAACA,OAAO,OAAO,IAAA;QACnB,OAAO,OAAA,CAAQD,IAAI,CAACC,KAAAA,CAAAA;IACtB,CAAA,CAAA,CAEDD,IAAI,CACH,WAAA,EACA;QACEI,OAAAA,EAAS;YACPT,EAAAA,EAAI,0CAAA;YACJG,cAAAA,EAAgB;AAClB;AACF,KAAA,EACA,CAACG,KAAAA,GAAAA;QACC,IAAI,CAACA,OAAO,OAAO,IAAA;QACnB,OAAO,OAAA,CAAQD,IAAI,CAACC,KAAAA,CAAAA;IACtB,CAAA,CAAA,CAEDD,IAAI,CACH,QAAA,EACA;QACEI,OAAAA,EAAS;YACPT,EAAAA,EAAI,uCAAA;YACJG,cAAAA,EAAgB;AAClB;AACF,KAAA,EACA,CAACG,KAAAA,GAAAA;QACC,IAAI,CAACA,OAAO,OAAO,IAAA;QACnB,OAAO,IAAA,CAAKD,IAAI,CAACC,KAAAA,CAAAA;AACnB,IAAA,CAAA,CAAA,CAEDI,QAAQ,CAAC;QACRV,EAAAA,EAAIC,iCAAAA,CAAiBS,QAAQ,CAACV,EAAE;QAChCG,cAAAA,EAAgB;AAClB,KAAA,CAAA,CACCQ,QAAQ,EAAA;AACXC,IAAAA,eAAAA,EAAiBlB,cAAAA,CACdI,MAAM,EAAA,CACNY,QAAQ,CAAC;QACRV,EAAAA,EAAIC,iCAAAA,CAAiBS,QAAQ,CAACV,EAAE;QAChCG,cAAAA,EAAgB;AAClB,KAAA,CAAA,CACCU,KAAK,CAAC;AAACnB,QAAAA,cAAAA,CAAIoB,GAAG,CAAC,UAAA,CAAA;AAAa,QAAA;KAAK,EAAE;QAClCd,EAAAA,EAAI,yCAAA;QACJG,cAAAA,EAAgB;AAClB,KAAA,CAAA,CACCQ,QAAQ;AACb,CAAA,CAAA;AAEA,MAAMI,aAAAA,GAAgB,IAAA;IACpB,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;AAC1B,IAAA,MAAMC,QAAAA,GAAWC,sBAAAA,EAAAA;AACjB,IAAA,MAAMC,QAAAA,GAAWC,0BAAAA,EAAAA;AACjB,IAAA,MAAM,EAAEC,MAAAA,EAAQC,YAAY,EAAE,GAAGC,0BAAAA,EAAAA;AACjC,IAAA,MAAMC,QAAQC,gBAAAA,CAAMC,OAAO,CAAC,IAAM,IAAIC,gBAAgBL,YAAAA,CAAAA,EAAe;AAACA,QAAAA;AAAa,KAAA,CAAA;AACnF,IAAA,MAAM,EAAEM,uBAAAA,EAAyBC,cAAc,EAAE,GAAGC,qCAAAA,EAAAA;AAEpD,IAAA,MAAM,CAACC,aAAAA,EAAe,EAAEC,KAAK,EAAE,CAAC,GAAGC,6BAAAA,EAAAA;AAEnC,IAAA,MAAMC,eAAe,OAAOC,IAAAA,GAAAA;QAC1B,MAAMC,GAAAA,GAAM,MAAML,aAAAA,CAAcI,IAAAA,CAAAA;AAEhC,QAAA,IAAI,UAAUC,GAAAA,EAAK;AACjBnB,YAAAA,QAAAA,CAASoB,aAAAA,CAAM;gBAAEC,KAAAA,EAAOF,GAAAA,CAAIG,IAAI,CAACD;AAAM,aAAA,CAAA,CAAA;YACvCnB,QAAAA,CAAS,GAAA,CAAA;AACX,QAAA;AACF,IAAA,CAAA;AACA;;;AAGC,MACD,IAAI,CAACK,KAAAA,CAAMgB,GAAG,CAAC,MAAA,CAAA,EAAS;AACtB,QAAA,qBAAOC,cAAA,CAACC,uBAAAA,EAAAA;YAASC,EAAAA,EAAG;;AACtB,IAAA;AAEA,IAAA,qBACEF,cAAA,CAACG,2CAAAA,EAAAA;AACC,QAAA,QAAA,gBAAAC,eAAA,CAACC,iBAAAA,EAAAA;;8BACCD,eAAA,CAACE,mCAAAA,EAAAA;;sCACCF,eAAA,CAACG,4BAAAA,EAAAA;;8CACCP,cAAA,CAACQ,wBAAAA,EAAAA,EAAAA,CAAAA;8CACDR,cAAA,CAACS,gBAAAA,EAAAA;oCAAIC,UAAAA,EAAY,CAAA;oCAAGC,aAAAA,EAAe,CAAA;AACjC,oCAAA,QAAA,gBAAAX,cAAA,CAACY,uBAAAA,EAAAA;wCAAWC,GAAAA,EAAI,IAAA;wCAAKC,OAAAA,EAAQ,OAAA;kDAC1BxC,aAAAA,CAAc;4CACbhB,EAAAA,EAAI,uBAAA;4CACJG,cAAAA,EAAgB;AAClB,yCAAA;;;AAGH8B,gCAAAA,KAAAA,iBACCS,cAAA,CAACY,uBAAAA,EAAAA;oCAAWtD,EAAAA,EAAG,mBAAA;oCAAoByD,IAAAA,EAAK,OAAA;AAAQC,oCAAAA,QAAAA,EAAU,EAAC;oCAAGC,SAAAA,EAAU,WAAA;8CACrEC,0BAAAA,CAAiB3B,KAAAA,CAAAA,GACdH,cAAAA,CAAeG,KAAAA,CAAAA,GACfjB,aAAAA,CAAc;wCACZhB,EAAAA,EAAI,oBAAA;wCACJG,cAAAA,EAAgB;AAClB,qCAAA;AAEJ,iCAAA,CAAA,GAAA;;;sCAENuC,cAAA,CAACmB,SAAAA,EAAAA;4BACCC,MAAAA,EAAO,MAAA;4BACPC,aAAAA,EAAe;gCACblE,QAAAA,EAAU,EAAA;gCACVe,eAAAA,EAAiB;AACnB,6BAAA;AACAoD,4BAAAA,QAAAA,EAAU,CAAC5D,MAAAA,GAAAA;;gCAET+B,YAAAA,CAAa;AAAEtC,oCAAAA,QAAAA,EAAUO,OAAOP,QAAQ;oCAAEoE,kBAAAA,EAAoBxC,KAAAA,CAAMgB,GAAG,CAAC,MAAA;AAAS,iCAAA,CAAA;AACnF,4BAAA,CAAA;4BACAyB,gBAAAA,EAAkBzE,qBAAAA;AAElB,4BAAA,QAAA,gBAAAqD,eAAA,CAACqB,iBAAAA,EAAAA;gCAAKC,SAAAA,EAAU,QAAA;gCAASC,UAAAA,EAAW,SAAA;gCAAUC,GAAAA,EAAK,CAAA;;AAChD,oCAAA;AACC,wCAAA;AACEC,4CAAAA,IAAAA,EAAMvD,aAAAA,CAAc;gDAClBhB,EAAAA,EAAI,yBAAA;gDACJG,cAAAA,EACE;AACJ,6CAAA,CAAA;AACAqE,4CAAAA,KAAAA,EAAOxD,aAAAA,CAAc;gDACnBhB,EAAAA,EAAI,iBAAA;gDACJG,cAAAA,EAAgB;AAClB,6CAAA,CAAA;4CACAsE,IAAAA,EAAM,UAAA;4CACN/D,QAAAA,EAAU,IAAA;4CACVgE,IAAAA,EAAM;AACR,yCAAA;AACA,wCAAA;AACEF,4CAAAA,KAAAA,EAAOxD,aAAAA,CAAc;gDACnBhB,EAAAA,EAAI,iCAAA;gDACJG,cAAAA,EAAgB;AAClB,6CAAA,CAAA;4CACAsE,IAAAA,EAAM,iBAAA;4CACN/D,QAAAA,EAAU,IAAA;4CACVgE,IAAAA,EAAM;AACR;AACD,qCAAA,CAACC,GAAG,CAAC,CAACC,KAAAA,iBACLlC,cAAA,CAACmC,sBAAAA,EAAAA;AAAgC,4CAAA,GAAGD;AAAhBA,yCAAAA,EAAAA,KAAAA,CAAMH,IAAI,CAAA,CAAA;kDAEhC/B,cAAA,CAACoC,mBAAAA,EAAAA;wCAAOC,SAAS,EAAA,IAAA;wCAACL,IAAAA,EAAK,QAAA;kDACpB1D,aAAAA,CAAc;4CACbhB,EAAAA,EAAI,wBAAA;4CACJG,cAAAA,EAAgB;AAClB,yCAAA;;;;;;;8BAKRuC,cAAA,CAACyB,iBAAAA,EAAAA;oBAAKa,cAAAA,EAAe,QAAA;AACnB,oBAAA,QAAA,gBAAAtC,cAAA,CAACS,gBAAAA,EAAAA;wBAAIC,UAAAA,EAAY,CAAA;AACf,wBAAA,QAAA,gBAAAV,cAAA,CAACuC,iBAAAA,EAAAA;4BAAK1B,GAAAA,EAAK2B,sBAAAA;4BAAStC,EAAAA,EAAG,aAAA;sCACpB5B,aAAAA,CAAc;gCAAEhB,EAAAA,EAAI,iBAAA;gCAAmBG,cAAAA,EAAgB;AAAoB,6BAAA;;;;;;;AAO1F;;;;"}
1
+ {"version":3,"file":"ResetPassword.js","sources":["../../../../../../../admin/src/pages/Auth/components/ResetPassword.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, Button, Flex, Main, Typography, Link } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { NavLink, useNavigate, Navigate, useLocation } from 'react-router-dom';\nimport * as yup from 'yup';\n\nimport { ResetPassword } from '../../../../../shared/contracts/authentication';\nimport { Form } from '../../../components/Form';\nimport { InputRenderer } from '../../../components/FormInputs/Renderer';\nimport { Logo } from '../../../components/UnauthenticatedLogo';\nimport { useTypedDispatch } from '../../../core/store/hooks';\nimport { useAPIErrorHandler } from '../../../hooks/useAPIErrorHandler';\nimport {\n Column,\n LayoutContent,\n UnauthenticatedLayout,\n} from '../../../layouts/UnauthenticatedLayout';\nimport { login } from '../../../reducer';\nimport { useResetPasswordMutation } from '../../../services/auth';\nimport { isBaseQueryError } from '../../../utils/baseQuery';\nimport { getByteSize } from '../../../utils/strings';\nimport { translatedErrors } from '../../../utils/translatedErrors';\n\nconst RESET_PASSWORD_SCHEMA = yup.object().shape({\n password: yup\n .string()\n .min(8, {\n id: translatedErrors.minLength.id,\n defaultMessage: 'Password must be at least 8 characters',\n values: { min: 8 },\n })\n // bcrypt has a max length of 72 bytes (not characters!)\n .test(\n 'required-byte-size',\n {\n id: 'components.Input.error.contain.maxBytes',\n defaultMessage: 'Password must be less than 73 bytes',\n },\n function (value) {\n if (!value || typeof value !== 'string') return true; // validated elsewhere\n\n const byteSize = getByteSize(value);\n return byteSize <= 72;\n }\n )\n .test(\n 'lowercase',\n {\n id: 'components.Input.error.contain.lowercase',\n defaultMessage: 'Password must contain at least 1 lowercase letter',\n },\n (value) => {\n if (!value) return true;\n return /[a-z]/.test(value);\n }\n )\n .test(\n 'uppercase',\n {\n id: 'components.Input.error.contain.uppercase',\n defaultMessage: 'Password must contain at least 1 uppercase letter',\n },\n (value) => {\n if (!value) return true;\n return /[A-Z]/.test(value);\n }\n )\n .test(\n 'number',\n {\n id: 'components.Input.error.contain.number',\n defaultMessage: 'Password must contain at least 1 number',\n },\n (value) => {\n if (!value) return true;\n return /\\d/.test(value);\n }\n )\n .required({\n id: translatedErrors.required.id,\n defaultMessage: 'Password is required',\n })\n .nullable(),\n confirmPassword: yup\n .string()\n .required({\n id: translatedErrors.required.id,\n defaultMessage: 'Confirm password is required',\n })\n .oneOf([yup.ref('password'), null], {\n id: 'components.Input.error.password.noMatch',\n defaultMessage: 'Passwords must match',\n })\n .nullable(),\n});\n\nconst ResetPassword = () => {\n const { formatMessage } = useIntl();\n const dispatch = useTypedDispatch();\n const navigate = useNavigate();\n const { search: searchString } = useLocation();\n const query = React.useMemo(() => new URLSearchParams(searchString), [searchString]);\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n\n const [resetPassword, { error }] = useResetPasswordMutation();\n\n const handleSubmit = async (body: ResetPassword.Request['body']) => {\n const res = await resetPassword(body);\n\n if ('data' in res) {\n dispatch(login({ token: res.data.token }));\n navigate('/');\n }\n };\n /**\n * If someone doesn't have a reset password token\n * then they should just be redirected back to the login page.\n */\n if (!query.get('code')) {\n return <Navigate to=\"/auth/login\" />;\n }\n\n return (\n <UnauthenticatedLayout>\n <Main>\n <LayoutContent>\n <Column>\n <Logo />\n <Box paddingTop={6} paddingBottom={7}>\n <Typography tag=\"h1\" variant=\"alpha\">\n {formatMessage({\n id: 'global.reset-password',\n defaultMessage: 'Reset password',\n })}\n </Typography>\n </Box>\n {error ? (\n <Typography id=\"global-form-error\" role=\"alert\" tabIndex={-1} textColor=\"danger600\">\n {isBaseQueryError(error)\n ? formatAPIError(error)\n : formatMessage({\n id: 'notification.error',\n defaultMessage: 'An error occurred',\n })}\n </Typography>\n ) : null}\n </Column>\n <Form\n method=\"POST\"\n initialValues={{\n password: '',\n confirmPassword: '',\n }}\n onSubmit={(values) => {\n // We know query.code is defined because we check for it above.\n handleSubmit({ password: values.password, resetPasswordToken: query.get('code')! });\n }}\n validationSchema={RESET_PASSWORD_SCHEMA}\n >\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n {[\n {\n hint: formatMessage({\n id: 'Auth.form.password.hint',\n defaultMessage:\n 'Password must contain at least 8 characters, 1 uppercase, 1 lowercase and 1 number',\n }),\n label: formatMessage({\n id: 'global.password',\n defaultMessage: 'Password',\n }),\n name: 'password',\n required: true,\n type: 'password' as const,\n },\n {\n label: formatMessage({\n id: 'Auth.form.confirmPassword.label',\n defaultMessage: 'Confirm Password',\n }),\n name: 'confirmPassword',\n required: true,\n type: 'password' as const,\n },\n ].map((field) => (\n <InputRenderer key={field.name} {...field} />\n ))}\n <Button fullWidth type=\"submit\">\n {formatMessage({\n id: 'global.change-password',\n defaultMessage: 'Change password',\n })}\n </Button>\n </Flex>\n </Form>\n </LayoutContent>\n <Flex justifyContent=\"center\">\n <Box paddingTop={4}>\n <Link tag={NavLink} to=\"/auth/login\">\n {formatMessage({ id: 'Auth.link.ready', defaultMessage: 'Ready to sign in?' })}\n </Link>\n </Box>\n </Flex>\n </Main>\n </UnauthenticatedLayout>\n );\n};\n\nexport { ResetPassword };\n"],"names":["RESET_PASSWORD_SCHEMA","yup","object","shape","password","string","min","id","translatedErrors","minLength","defaultMessage","values","test","value","byteSize","getByteSize","required","nullable","confirmPassword","oneOf","ref","ResetPassword","formatMessage","useIntl","dispatch","useTypedDispatch","navigate","useNavigate","search","searchString","useLocation","query","React","useMemo","URLSearchParams","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","resetPassword","error","useResetPasswordMutation","handleSubmit","body","res","login","token","data","get","_jsx","Navigate","to","UnauthenticatedLayout","_jsxs","Main","LayoutContent","Column","Logo","Box","paddingTop","paddingBottom","Typography","tag","variant","role","tabIndex","textColor","isBaseQueryError","Form","method","initialValues","onSubmit","resetPasswordToken","validationSchema","Flex","direction","alignItems","gap","hint","label","name","type","map","field","InputRenderer","Button","fullWidth","justifyContent","Link","NavLink"],"mappings":"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"}
@@ -32,26 +32,20 @@ const RESET_PASSWORD_SCHEMA = yup.object().shape({
32
32
  const byteSize = getByteSize(value);
33
33
  return byteSize <= 72;
34
34
  }).test('lowercase', {
35
- message: {
36
- id: 'components.Input.error.contain.lowercase',
37
- defaultMessage: 'Password must contain at least 1 lowercase letter'
38
- }
35
+ id: 'components.Input.error.contain.lowercase',
36
+ defaultMessage: 'Password must contain at least 1 lowercase letter'
39
37
  }, (value)=>{
40
38
  if (!value) return true;
41
39
  return /[a-z]/.test(value);
42
40
  }).test('uppercase', {
43
- message: {
44
- id: 'components.Input.error.contain.uppercase',
45
- defaultMessage: 'Password must contain at least 1 uppercase letter'
46
- }
41
+ id: 'components.Input.error.contain.uppercase',
42
+ defaultMessage: 'Password must contain at least 1 uppercase letter'
47
43
  }, (value)=>{
48
44
  if (!value) return true;
49
45
  return /[A-Z]/.test(value);
50
46
  }).test('number', {
51
- message: {
52
- id: 'components.Input.error.contain.number',
53
- defaultMessage: 'Password must contain at least 1 number'
54
- }
47
+ id: 'components.Input.error.contain.number',
48
+ defaultMessage: 'Password must contain at least 1 number'
55
49
  }, (value)=>{
56
50
  if (!value) return true;
57
51
  return /\d/.test(value);
@@ -1 +1 @@
1
- {"version":3,"file":"ResetPassword.mjs","sources":["../../../../../../../admin/src/pages/Auth/components/ResetPassword.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, Button, Flex, Main, Typography, Link } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { NavLink, useNavigate, Navigate, useLocation } from 'react-router-dom';\nimport * as yup from 'yup';\n\nimport { ResetPassword } from '../../../../../shared/contracts/authentication';\nimport { Form } from '../../../components/Form';\nimport { InputRenderer } from '../../../components/FormInputs/Renderer';\nimport { Logo } from '../../../components/UnauthenticatedLogo';\nimport { useTypedDispatch } from '../../../core/store/hooks';\nimport { useAPIErrorHandler } from '../../../hooks/useAPIErrorHandler';\nimport {\n Column,\n LayoutContent,\n UnauthenticatedLayout,\n} from '../../../layouts/UnauthenticatedLayout';\nimport { login } from '../../../reducer';\nimport { useResetPasswordMutation } from '../../../services/auth';\nimport { isBaseQueryError } from '../../../utils/baseQuery';\nimport { getByteSize } from '../../../utils/strings';\nimport { translatedErrors } from '../../../utils/translatedErrors';\n\nconst RESET_PASSWORD_SCHEMA = yup.object().shape({\n password: yup\n .string()\n .min(8, {\n id: translatedErrors.minLength.id,\n defaultMessage: 'Password must be at least 8 characters',\n values: { min: 8 },\n })\n // bcrypt has a max length of 72 bytes (not characters!)\n .test(\n 'required-byte-size',\n {\n id: 'components.Input.error.contain.maxBytes',\n defaultMessage: 'Password must be less than 73 bytes',\n },\n function (value) {\n if (!value || typeof value !== 'string') return true; // validated elsewhere\n\n const byteSize = getByteSize(value);\n return byteSize <= 72;\n }\n )\n .test(\n 'lowercase',\n {\n message: {\n id: 'components.Input.error.contain.lowercase',\n defaultMessage: 'Password must contain at least 1 lowercase letter',\n },\n },\n (value) => {\n if (!value) return true;\n return /[a-z]/.test(value);\n }\n )\n .test(\n 'uppercase',\n {\n message: {\n id: 'components.Input.error.contain.uppercase',\n defaultMessage: 'Password must contain at least 1 uppercase letter',\n },\n },\n (value) => {\n if (!value) return true;\n return /[A-Z]/.test(value);\n }\n )\n .test(\n 'number',\n {\n message: {\n id: 'components.Input.error.contain.number',\n defaultMessage: 'Password must contain at least 1 number',\n },\n },\n (value) => {\n if (!value) return true;\n return /\\d/.test(value);\n }\n )\n .required({\n id: translatedErrors.required.id,\n defaultMessage: 'Password is required',\n })\n .nullable(),\n confirmPassword: yup\n .string()\n .required({\n id: translatedErrors.required.id,\n defaultMessage: 'Confirm password is required',\n })\n .oneOf([yup.ref('password'), null], {\n id: 'components.Input.error.password.noMatch',\n defaultMessage: 'Passwords must match',\n })\n .nullable(),\n});\n\nconst ResetPassword = () => {\n const { formatMessage } = useIntl();\n const dispatch = useTypedDispatch();\n const navigate = useNavigate();\n const { search: searchString } = useLocation();\n const query = React.useMemo(() => new URLSearchParams(searchString), [searchString]);\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n\n const [resetPassword, { error }] = useResetPasswordMutation();\n\n const handleSubmit = async (body: ResetPassword.Request['body']) => {\n const res = await resetPassword(body);\n\n if ('data' in res) {\n dispatch(login({ token: res.data.token }));\n navigate('/');\n }\n };\n /**\n * If someone doesn't have a reset password token\n * then they should just be redirected back to the login page.\n */\n if (!query.get('code')) {\n return <Navigate to=\"/auth/login\" />;\n }\n\n return (\n <UnauthenticatedLayout>\n <Main>\n <LayoutContent>\n <Column>\n <Logo />\n <Box paddingTop={6} paddingBottom={7}>\n <Typography tag=\"h1\" variant=\"alpha\">\n {formatMessage({\n id: 'global.reset-password',\n defaultMessage: 'Reset password',\n })}\n </Typography>\n </Box>\n {error ? (\n <Typography id=\"global-form-error\" role=\"alert\" tabIndex={-1} textColor=\"danger600\">\n {isBaseQueryError(error)\n ? formatAPIError(error)\n : formatMessage({\n id: 'notification.error',\n defaultMessage: 'An error occurred',\n })}\n </Typography>\n ) : null}\n </Column>\n <Form\n method=\"POST\"\n initialValues={{\n password: '',\n confirmPassword: '',\n }}\n onSubmit={(values) => {\n // We know query.code is defined because we check for it above.\n handleSubmit({ password: values.password, resetPasswordToken: query.get('code')! });\n }}\n validationSchema={RESET_PASSWORD_SCHEMA}\n >\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n {[\n {\n hint: formatMessage({\n id: 'Auth.form.password.hint',\n defaultMessage:\n 'Password must contain at least 8 characters, 1 uppercase, 1 lowercase and 1 number',\n }),\n label: formatMessage({\n id: 'global.password',\n defaultMessage: 'Password',\n }),\n name: 'password',\n required: true,\n type: 'password' as const,\n },\n {\n label: formatMessage({\n id: 'Auth.form.confirmPassword.label',\n defaultMessage: 'Confirm Password',\n }),\n name: 'confirmPassword',\n required: true,\n type: 'password' as const,\n },\n ].map((field) => (\n <InputRenderer key={field.name} {...field} />\n ))}\n <Button fullWidth type=\"submit\">\n {formatMessage({\n id: 'global.change-password',\n defaultMessage: 'Change password',\n })}\n </Button>\n </Flex>\n </Form>\n </LayoutContent>\n <Flex justifyContent=\"center\">\n <Box paddingTop={4}>\n <Link tag={NavLink} to=\"/auth/login\">\n {formatMessage({ id: 'Auth.link.ready', defaultMessage: 'Ready to sign in?' })}\n </Link>\n </Box>\n </Flex>\n </Main>\n </UnauthenticatedLayout>\n );\n};\n\nexport { ResetPassword };\n"],"names":["RESET_PASSWORD_SCHEMA","yup","object","shape","password","string","min","id","translatedErrors","minLength","defaultMessage","values","test","value","byteSize","getByteSize","message","required","nullable","confirmPassword","oneOf","ref","ResetPassword","formatMessage","useIntl","dispatch","useTypedDispatch","navigate","useNavigate","search","searchString","useLocation","query","React","useMemo","URLSearchParams","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","resetPassword","error","useResetPasswordMutation","handleSubmit","body","res","login","token","data","get","_jsx","Navigate","to","UnauthenticatedLayout","_jsxs","Main","LayoutContent","Column","Logo","Box","paddingTop","paddingBottom","Typography","tag","variant","role","tabIndex","textColor","isBaseQueryError","Form","method","initialValues","onSubmit","resetPasswordToken","validationSchema","Flex","direction","alignItems","gap","hint","label","name","type","map","field","InputRenderer","Button","fullWidth","justifyContent","Link","NavLink"],"mappings":"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"}
1
+ {"version":3,"file":"ResetPassword.mjs","sources":["../../../../../../../admin/src/pages/Auth/components/ResetPassword.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, Button, Flex, Main, Typography, Link } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { NavLink, useNavigate, Navigate, useLocation } from 'react-router-dom';\nimport * as yup from 'yup';\n\nimport { ResetPassword } from '../../../../../shared/contracts/authentication';\nimport { Form } from '../../../components/Form';\nimport { InputRenderer } from '../../../components/FormInputs/Renderer';\nimport { Logo } from '../../../components/UnauthenticatedLogo';\nimport { useTypedDispatch } from '../../../core/store/hooks';\nimport { useAPIErrorHandler } from '../../../hooks/useAPIErrorHandler';\nimport {\n Column,\n LayoutContent,\n UnauthenticatedLayout,\n} from '../../../layouts/UnauthenticatedLayout';\nimport { login } from '../../../reducer';\nimport { useResetPasswordMutation } from '../../../services/auth';\nimport { isBaseQueryError } from '../../../utils/baseQuery';\nimport { getByteSize } from '../../../utils/strings';\nimport { translatedErrors } from '../../../utils/translatedErrors';\n\nconst RESET_PASSWORD_SCHEMA = yup.object().shape({\n password: yup\n .string()\n .min(8, {\n id: translatedErrors.minLength.id,\n defaultMessage: 'Password must be at least 8 characters',\n values: { min: 8 },\n })\n // bcrypt has a max length of 72 bytes (not characters!)\n .test(\n 'required-byte-size',\n {\n id: 'components.Input.error.contain.maxBytes',\n defaultMessage: 'Password must be less than 73 bytes',\n },\n function (value) {\n if (!value || typeof value !== 'string') return true; // validated elsewhere\n\n const byteSize = getByteSize(value);\n return byteSize <= 72;\n }\n )\n .test(\n 'lowercase',\n {\n id: 'components.Input.error.contain.lowercase',\n defaultMessage: 'Password must contain at least 1 lowercase letter',\n },\n (value) => {\n if (!value) return true;\n return /[a-z]/.test(value);\n }\n )\n .test(\n 'uppercase',\n {\n id: 'components.Input.error.contain.uppercase',\n defaultMessage: 'Password must contain at least 1 uppercase letter',\n },\n (value) => {\n if (!value) return true;\n return /[A-Z]/.test(value);\n }\n )\n .test(\n 'number',\n {\n id: 'components.Input.error.contain.number',\n defaultMessage: 'Password must contain at least 1 number',\n },\n (value) => {\n if (!value) return true;\n return /\\d/.test(value);\n }\n )\n .required({\n id: translatedErrors.required.id,\n defaultMessage: 'Password is required',\n })\n .nullable(),\n confirmPassword: yup\n .string()\n .required({\n id: translatedErrors.required.id,\n defaultMessage: 'Confirm password is required',\n })\n .oneOf([yup.ref('password'), null], {\n id: 'components.Input.error.password.noMatch',\n defaultMessage: 'Passwords must match',\n })\n .nullable(),\n});\n\nconst ResetPassword = () => {\n const { formatMessage } = useIntl();\n const dispatch = useTypedDispatch();\n const navigate = useNavigate();\n const { search: searchString } = useLocation();\n const query = React.useMemo(() => new URLSearchParams(searchString), [searchString]);\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n\n const [resetPassword, { error }] = useResetPasswordMutation();\n\n const handleSubmit = async (body: ResetPassword.Request['body']) => {\n const res = await resetPassword(body);\n\n if ('data' in res) {\n dispatch(login({ token: res.data.token }));\n navigate('/');\n }\n };\n /**\n * If someone doesn't have a reset password token\n * then they should just be redirected back to the login page.\n */\n if (!query.get('code')) {\n return <Navigate to=\"/auth/login\" />;\n }\n\n return (\n <UnauthenticatedLayout>\n <Main>\n <LayoutContent>\n <Column>\n <Logo />\n <Box paddingTop={6} paddingBottom={7}>\n <Typography tag=\"h1\" variant=\"alpha\">\n {formatMessage({\n id: 'global.reset-password',\n defaultMessage: 'Reset password',\n })}\n </Typography>\n </Box>\n {error ? (\n <Typography id=\"global-form-error\" role=\"alert\" tabIndex={-1} textColor=\"danger600\">\n {isBaseQueryError(error)\n ? formatAPIError(error)\n : formatMessage({\n id: 'notification.error',\n defaultMessage: 'An error occurred',\n })}\n </Typography>\n ) : null}\n </Column>\n <Form\n method=\"POST\"\n initialValues={{\n password: '',\n confirmPassword: '',\n }}\n onSubmit={(values) => {\n // We know query.code is defined because we check for it above.\n handleSubmit({ password: values.password, resetPasswordToken: query.get('code')! });\n }}\n validationSchema={RESET_PASSWORD_SCHEMA}\n >\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n {[\n {\n hint: formatMessage({\n id: 'Auth.form.password.hint',\n defaultMessage:\n 'Password must contain at least 8 characters, 1 uppercase, 1 lowercase and 1 number',\n }),\n label: formatMessage({\n id: 'global.password',\n defaultMessage: 'Password',\n }),\n name: 'password',\n required: true,\n type: 'password' as const,\n },\n {\n label: formatMessage({\n id: 'Auth.form.confirmPassword.label',\n defaultMessage: 'Confirm Password',\n }),\n name: 'confirmPassword',\n required: true,\n type: 'password' as const,\n },\n ].map((field) => (\n <InputRenderer key={field.name} {...field} />\n ))}\n <Button fullWidth type=\"submit\">\n {formatMessage({\n id: 'global.change-password',\n defaultMessage: 'Change password',\n })}\n </Button>\n </Flex>\n </Form>\n </LayoutContent>\n <Flex justifyContent=\"center\">\n <Box paddingTop={4}>\n <Link tag={NavLink} to=\"/auth/login\">\n {formatMessage({ id: 'Auth.link.ready', defaultMessage: 'Ready to sign in?' })}\n </Link>\n </Box>\n </Flex>\n </Main>\n </UnauthenticatedLayout>\n );\n};\n\nexport { ResetPassword };\n"],"names":["RESET_PASSWORD_SCHEMA","yup","object","shape","password","string","min","id","translatedErrors","minLength","defaultMessage","values","test","value","byteSize","getByteSize","required","nullable","confirmPassword","oneOf","ref","ResetPassword","formatMessage","useIntl","dispatch","useTypedDispatch","navigate","useNavigate","search","searchString","useLocation","query","React","useMemo","URLSearchParams","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","resetPassword","error","useResetPasswordMutation","handleSubmit","body","res","login","token","data","get","_jsx","Navigate","to","UnauthenticatedLayout","_jsxs","Main","LayoutContent","Column","Logo","Box","paddingTop","paddingBottom","Typography","tag","variant","role","tabIndex","textColor","isBaseQueryError","Form","method","initialValues","onSubmit","resetPasswordToken","validationSchema","Flex","direction","alignItems","gap","hint","label","name","type","map","field","InputRenderer","Button","fullWidth","justifyContent","Link","NavLink"],"mappings":"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"}
@@ -22,13 +22,21 @@ const SettingsNav = ({ isFullPage = false })=>{
22
22
  const { trackUsage } = Tracking.useTracking();
23
23
  const { pathname } = reactRouterDom.useLocation();
24
24
  const { license } = useLicenseLimits.useLicenseLimits();
25
- const availableFeatureNames = license?.features.map((feature)=>feature.name);
25
+ // The live license's features, plus what a lapsed license granted: the same availability the
26
+ // Plan card shows, kept until the license key or file is removed.
27
+ const availableFeatureNames = [
28
+ ...(license?.features ?? []).map((feature)=>feature.name),
29
+ ...(license?.planEntitlements ?? []).filter((entitlement)=>entitlement.available).map((entitlement)=>entitlement.feature)
30
+ ];
26
31
  const linksIdsToLicenseFeaturesNames = {
27
32
  'content-releases': 'cms-content-releases',
28
33
  'review-workflows': 'review-workflows',
29
34
  sso: 'sso',
30
35
  auditLogs: 'audit-logs',
31
- 'auditLogs-purchase-page': 'audit-logs'
36
+ 'auditLogs-purchase-page': 'audit-logs',
37
+ // A lapsed license renders these as purchase links, under their own ids
38
+ 'sso-purchase-page': 'sso',
39
+ 'content-history-purchase-page': 'cms-content-history'
32
40
  };
33
41
  const filteredMenu = menu.filter((section)=>!section.links.every((link)=>link.isDisplayed === false));
34
42
  const sections = filteredMenu.map((section)=>{
@@ -1 +1 @@
1
- {"version":3,"file":"SettingsNav.js","sources":["../../../../../../../admin/src/pages/Settings/components/SettingsNav.tsx"],"sourcesContent":["import { Badge, Divider } from '@strapi/design-system';\nimport { Lightning } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { useLocation } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { useLicenseLimits } from '../../../../../ee/admin/src/hooks/useLicenseLimits';\nimport { SubNav } from '../../../components/SubNav';\nimport { useTracking } from '../../../features/Tracking';\nimport { useSettingsMenu } from '../../../hooks/useSettingsMenu';\n\ntype LinkId =\n | 'content-releases'\n | 'review-workflows'\n | 'sso'\n | 'auditLogs'\n | 'auditLogs-purchase-page';\n\ntype FeatureName = 'cms-content-releases' | 'review-workflows' | 'sso' | 'audit-logs';\n\nconst StyledBadge = styled(Badge)`\n border-radius: 50%;\n padding: ${({ theme }) => theme.spaces[2]};\n height: 2rem;\n`;\n\nconst SettingsNav = ({ isFullPage = false }: { isFullPage?: boolean }) => {\n const { menu } = useSettingsMenu();\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const { pathname } = useLocation();\n const { license } = useLicenseLimits();\n\n const availableFeatureNames = license?.features.map((feature) => feature.name);\n\n const linksIdsToLicenseFeaturesNames: Record<LinkId, FeatureName> = {\n 'content-releases': 'cms-content-releases',\n 'review-workflows': 'review-workflows',\n sso: 'sso',\n auditLogs: 'audit-logs',\n 'auditLogs-purchase-page': 'audit-logs',\n };\n\n const filteredMenu = menu.filter(\n (section) => !section.links.every((link) => link.isDisplayed === false)\n );\n\n const sections = filteredMenu.map((section) => {\n return {\n ...section,\n title: section.intlLabel,\n links: section.links.map((link) => {\n return {\n ...link,\n id: link.id as LinkId,\n title: link.intlLabel,\n name: link.id,\n to: link.to.startsWith('/') ? link.to : `/settings/${link.to}`,\n };\n }),\n };\n });\n\n const label = formatMessage({\n id: 'global.settings',\n defaultMessage: 'Settings',\n });\n\n const handleClickOnLink = (destination: string) => () => {\n trackUsage('willNavigate', { from: pathname, to: destination });\n };\n\n return (\n <SubNav.Main aria-label={label}>\n {!isFullPage && (\n <>\n <SubNav.Header label={label} />\n <Divider />\n </>\n )}\n <SubNav.Content>\n {isFullPage && (\n <>\n <SubNav.Header label={label} />\n <Divider />\n </>\n )}\n <SubNav.Sections>\n {sections.map((section) => (\n <SubNav.Section key={section.id} label={formatMessage(section.intlLabel)}>\n {section.links.map((link) => {\n return (\n <SubNav.Link\n to={link.to}\n onClick={handleClickOnLink(link.to)}\n key={link.id}\n label={formatMessage(link.intlLabel)}\n endAction={\n <>\n {link?.licenseOnly && (\n <Lightning\n fill={\n (availableFeatureNames || []).includes(\n linksIdsToLicenseFeaturesNames[link.id]\n )\n ? 'primary600'\n : 'neutral300'\n }\n width=\"1.5rem\"\n height=\"1.5rem\"\n />\n )}\n {link?.hasNotification && (\n <StyledBadge\n aria-label=\"Notification\"\n backgroundColor=\"primary600\"\n textColor=\"neutral0\"\n >\n 1\n </StyledBadge>\n )}\n </>\n }\n >\n {formatMessage(link.intlLabel)}\n </SubNav.Link>\n );\n })}\n </SubNav.Section>\n ))}\n </SubNav.Sections>\n </SubNav.Content>\n </SubNav.Main>\n );\n};\n\nexport { SettingsNav };\n"],"names":["StyledBadge","styled","Badge","theme","spaces","SettingsNav","isFullPage","menu","useSettingsMenu","formatMessage","useIntl","trackUsage","useTracking","pathname","useLocation","license","useLicenseLimits","availableFeatureNames","features","map","feature","name","linksIdsToLicenseFeaturesNames","sso","auditLogs","filteredMenu","filter","section","links","every","link","isDisplayed","sections","title","intlLabel","id","to","startsWith","label","defaultMessage","handleClickOnLink","destination","from","_jsxs","SubNav","Main","aria-label","_Fragment","_jsx","Header","Divider","Content","Sections","Section","Link","onClick","endAction","licenseOnly","Lightning","fill","includes","width","height","hasNotification","backgroundColor","textColor"],"mappings":"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"}
1
+ {"version":3,"file":"SettingsNav.js","sources":["../../../../../../../admin/src/pages/Settings/components/SettingsNav.tsx"],"sourcesContent":["import { Badge, Divider } from '@strapi/design-system';\nimport { Lightning } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { useLocation } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { useLicenseLimits } from '../../../../../ee/admin/src/hooks/useLicenseLimits';\nimport { SubNav } from '../../../components/SubNav';\nimport { useTracking } from '../../../features/Tracking';\nimport { useSettingsMenu } from '../../../hooks/useSettingsMenu';\n\ntype LinkId =\n | 'content-releases'\n | 'review-workflows'\n | 'sso'\n | 'auditLogs'\n | 'auditLogs-purchase-page'\n | 'sso-purchase-page'\n | 'content-history-purchase-page';\n\ntype FeatureName =\n | 'cms-content-releases'\n | 'review-workflows'\n | 'sso'\n | 'audit-logs'\n | 'cms-content-history';\n\nconst StyledBadge = styled(Badge)`\n border-radius: 50%;\n padding: ${({ theme }) => theme.spaces[2]};\n height: 2rem;\n`;\n\nconst SettingsNav = ({ isFullPage = false }: { isFullPage?: boolean }) => {\n const { menu } = useSettingsMenu();\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const { pathname } = useLocation();\n const { license } = useLicenseLimits();\n\n // The live license's features, plus what a lapsed license granted: the same availability the\n // Plan card shows, kept until the license key or file is removed.\n const availableFeatureNames = [\n ...(license?.features ?? []).map((feature) => feature.name),\n ...(license?.planEntitlements ?? [])\n .filter((entitlement) => entitlement.available)\n .map((entitlement) => entitlement.feature),\n ];\n\n const linksIdsToLicenseFeaturesNames: Record<LinkId, FeatureName> = {\n 'content-releases': 'cms-content-releases',\n 'review-workflows': 'review-workflows',\n sso: 'sso',\n auditLogs: 'audit-logs',\n 'auditLogs-purchase-page': 'audit-logs',\n // A lapsed license renders these as purchase links, under their own ids\n 'sso-purchase-page': 'sso',\n 'content-history-purchase-page': 'cms-content-history',\n };\n\n const filteredMenu = menu.filter(\n (section) => !section.links.every((link) => link.isDisplayed === false)\n );\n\n const sections = filteredMenu.map((section) => {\n return {\n ...section,\n title: section.intlLabel,\n links: section.links.map((link) => {\n return {\n ...link,\n id: link.id as LinkId,\n title: link.intlLabel,\n name: link.id,\n to: link.to.startsWith('/') ? link.to : `/settings/${link.to}`,\n };\n }),\n };\n });\n\n const label = formatMessage({\n id: 'global.settings',\n defaultMessage: 'Settings',\n });\n\n const handleClickOnLink = (destination: string) => () => {\n trackUsage('willNavigate', { from: pathname, to: destination });\n };\n\n return (\n <SubNav.Main aria-label={label}>\n {!isFullPage && (\n <>\n <SubNav.Header label={label} />\n <Divider />\n </>\n )}\n <SubNav.Content>\n {isFullPage && (\n <>\n <SubNav.Header label={label} />\n <Divider />\n </>\n )}\n <SubNav.Sections>\n {sections.map((section) => (\n <SubNav.Section key={section.id} label={formatMessage(section.intlLabel)}>\n {section.links.map((link) => {\n return (\n <SubNav.Link\n to={link.to}\n onClick={handleClickOnLink(link.to)}\n key={link.id}\n label={formatMessage(link.intlLabel)}\n endAction={\n <>\n {link?.licenseOnly && (\n <Lightning\n fill={\n (availableFeatureNames || []).includes(\n linksIdsToLicenseFeaturesNames[link.id]\n )\n ? 'primary600'\n : 'neutral300'\n }\n width=\"1.5rem\"\n height=\"1.5rem\"\n />\n )}\n {link?.hasNotification && (\n <StyledBadge\n aria-label=\"Notification\"\n backgroundColor=\"primary600\"\n textColor=\"neutral0\"\n >\n 1\n </StyledBadge>\n )}\n </>\n }\n >\n {formatMessage(link.intlLabel)}\n </SubNav.Link>\n );\n })}\n </SubNav.Section>\n ))}\n </SubNav.Sections>\n </SubNav.Content>\n </SubNav.Main>\n );\n};\n\nexport { SettingsNav };\n"],"names":["StyledBadge","styled","Badge","theme","spaces","SettingsNav","isFullPage","menu","useSettingsMenu","formatMessage","useIntl","trackUsage","useTracking","pathname","useLocation","license","useLicenseLimits","availableFeatureNames","features","map","feature","name","planEntitlements","filter","entitlement","available","linksIdsToLicenseFeaturesNames","sso","auditLogs","filteredMenu","section","links","every","link","isDisplayed","sections","title","intlLabel","id","to","startsWith","label","defaultMessage","handleClickOnLink","destination","from","_jsxs","SubNav","Main","aria-label","_Fragment","_jsx","Header","Divider","Content","Sections","Section","Link","onClick","endAction","licenseOnly","Lightning","fill","includes","width","height","hasNotification","backgroundColor","textColor"],"mappings":"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"}
@@ -20,13 +20,21 @@ const SettingsNav = ({ isFullPage = false })=>{
20
20
  const { trackUsage } = useTracking();
21
21
  const { pathname } = useLocation();
22
22
  const { license } = useLicenseLimits();
23
- const availableFeatureNames = license?.features.map((feature)=>feature.name);
23
+ // The live license's features, plus what a lapsed license granted: the same availability the
24
+ // Plan card shows, kept until the license key or file is removed.
25
+ const availableFeatureNames = [
26
+ ...(license?.features ?? []).map((feature)=>feature.name),
27
+ ...(license?.planEntitlements ?? []).filter((entitlement)=>entitlement.available).map((entitlement)=>entitlement.feature)
28
+ ];
24
29
  const linksIdsToLicenseFeaturesNames = {
25
30
  'content-releases': 'cms-content-releases',
26
31
  'review-workflows': 'review-workflows',
27
32
  sso: 'sso',
28
33
  auditLogs: 'audit-logs',
29
- 'auditLogs-purchase-page': 'audit-logs'
34
+ 'auditLogs-purchase-page': 'audit-logs',
35
+ // A lapsed license renders these as purchase links, under their own ids
36
+ 'sso-purchase-page': 'sso',
37
+ 'content-history-purchase-page': 'cms-content-history'
30
38
  };
31
39
  const filteredMenu = menu.filter((section)=>!section.links.every((link)=>link.isDisplayed === false));
32
40
  const sections = filteredMenu.map((section)=>{
@@ -1 +1 @@
1
- {"version":3,"file":"SettingsNav.mjs","sources":["../../../../../../../admin/src/pages/Settings/components/SettingsNav.tsx"],"sourcesContent":["import { Badge, Divider } from '@strapi/design-system';\nimport { Lightning } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { useLocation } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { useLicenseLimits } from '../../../../../ee/admin/src/hooks/useLicenseLimits';\nimport { SubNav } from '../../../components/SubNav';\nimport { useTracking } from '../../../features/Tracking';\nimport { useSettingsMenu } from '../../../hooks/useSettingsMenu';\n\ntype LinkId =\n | 'content-releases'\n | 'review-workflows'\n | 'sso'\n | 'auditLogs'\n | 'auditLogs-purchase-page';\n\ntype FeatureName = 'cms-content-releases' | 'review-workflows' | 'sso' | 'audit-logs';\n\nconst StyledBadge = styled(Badge)`\n border-radius: 50%;\n padding: ${({ theme }) => theme.spaces[2]};\n height: 2rem;\n`;\n\nconst SettingsNav = ({ isFullPage = false }: { isFullPage?: boolean }) => {\n const { menu } = useSettingsMenu();\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const { pathname } = useLocation();\n const { license } = useLicenseLimits();\n\n const availableFeatureNames = license?.features.map((feature) => feature.name);\n\n const linksIdsToLicenseFeaturesNames: Record<LinkId, FeatureName> = {\n 'content-releases': 'cms-content-releases',\n 'review-workflows': 'review-workflows',\n sso: 'sso',\n auditLogs: 'audit-logs',\n 'auditLogs-purchase-page': 'audit-logs',\n };\n\n const filteredMenu = menu.filter(\n (section) => !section.links.every((link) => link.isDisplayed === false)\n );\n\n const sections = filteredMenu.map((section) => {\n return {\n ...section,\n title: section.intlLabel,\n links: section.links.map((link) => {\n return {\n ...link,\n id: link.id as LinkId,\n title: link.intlLabel,\n name: link.id,\n to: link.to.startsWith('/') ? link.to : `/settings/${link.to}`,\n };\n }),\n };\n });\n\n const label = formatMessage({\n id: 'global.settings',\n defaultMessage: 'Settings',\n });\n\n const handleClickOnLink = (destination: string) => () => {\n trackUsage('willNavigate', { from: pathname, to: destination });\n };\n\n return (\n <SubNav.Main aria-label={label}>\n {!isFullPage && (\n <>\n <SubNav.Header label={label} />\n <Divider />\n </>\n )}\n <SubNav.Content>\n {isFullPage && (\n <>\n <SubNav.Header label={label} />\n <Divider />\n </>\n )}\n <SubNav.Sections>\n {sections.map((section) => (\n <SubNav.Section key={section.id} label={formatMessage(section.intlLabel)}>\n {section.links.map((link) => {\n return (\n <SubNav.Link\n to={link.to}\n onClick={handleClickOnLink(link.to)}\n key={link.id}\n label={formatMessage(link.intlLabel)}\n endAction={\n <>\n {link?.licenseOnly && (\n <Lightning\n fill={\n (availableFeatureNames || []).includes(\n linksIdsToLicenseFeaturesNames[link.id]\n )\n ? 'primary600'\n : 'neutral300'\n }\n width=\"1.5rem\"\n height=\"1.5rem\"\n />\n )}\n {link?.hasNotification && (\n <StyledBadge\n aria-label=\"Notification\"\n backgroundColor=\"primary600\"\n textColor=\"neutral0\"\n >\n 1\n </StyledBadge>\n )}\n </>\n }\n >\n {formatMessage(link.intlLabel)}\n </SubNav.Link>\n );\n })}\n </SubNav.Section>\n ))}\n </SubNav.Sections>\n </SubNav.Content>\n </SubNav.Main>\n );\n};\n\nexport { SettingsNav };\n"],"names":["StyledBadge","styled","Badge","theme","spaces","SettingsNav","isFullPage","menu","useSettingsMenu","formatMessage","useIntl","trackUsage","useTracking","pathname","useLocation","license","useLicenseLimits","availableFeatureNames","features","map","feature","name","linksIdsToLicenseFeaturesNames","sso","auditLogs","filteredMenu","filter","section","links","every","link","isDisplayed","sections","title","intlLabel","id","to","startsWith","label","defaultMessage","handleClickOnLink","destination","from","_jsxs","SubNav","Main","aria-label","_Fragment","_jsx","Header","Divider","Content","Sections","Section","Link","onClick","endAction","licenseOnly","Lightning","fill","includes","width","height","hasNotification","backgroundColor","textColor"],"mappings":"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"}
1
+ {"version":3,"file":"SettingsNav.mjs","sources":["../../../../../../../admin/src/pages/Settings/components/SettingsNav.tsx"],"sourcesContent":["import { Badge, Divider } from '@strapi/design-system';\nimport { Lightning } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { useLocation } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { useLicenseLimits } from '../../../../../ee/admin/src/hooks/useLicenseLimits';\nimport { SubNav } from '../../../components/SubNav';\nimport { useTracking } from '../../../features/Tracking';\nimport { useSettingsMenu } from '../../../hooks/useSettingsMenu';\n\ntype LinkId =\n | 'content-releases'\n | 'review-workflows'\n | 'sso'\n | 'auditLogs'\n | 'auditLogs-purchase-page'\n | 'sso-purchase-page'\n | 'content-history-purchase-page';\n\ntype FeatureName =\n | 'cms-content-releases'\n | 'review-workflows'\n | 'sso'\n | 'audit-logs'\n | 'cms-content-history';\n\nconst StyledBadge = styled(Badge)`\n border-radius: 50%;\n padding: ${({ theme }) => theme.spaces[2]};\n height: 2rem;\n`;\n\nconst SettingsNav = ({ isFullPage = false }: { isFullPage?: boolean }) => {\n const { menu } = useSettingsMenu();\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const { pathname } = useLocation();\n const { license } = useLicenseLimits();\n\n // The live license's features, plus what a lapsed license granted: the same availability the\n // Plan card shows, kept until the license key or file is removed.\n const availableFeatureNames = [\n ...(license?.features ?? []).map((feature) => feature.name),\n ...(license?.planEntitlements ?? [])\n .filter((entitlement) => entitlement.available)\n .map((entitlement) => entitlement.feature),\n ];\n\n const linksIdsToLicenseFeaturesNames: Record<LinkId, FeatureName> = {\n 'content-releases': 'cms-content-releases',\n 'review-workflows': 'review-workflows',\n sso: 'sso',\n auditLogs: 'audit-logs',\n 'auditLogs-purchase-page': 'audit-logs',\n // A lapsed license renders these as purchase links, under their own ids\n 'sso-purchase-page': 'sso',\n 'content-history-purchase-page': 'cms-content-history',\n };\n\n const filteredMenu = menu.filter(\n (section) => !section.links.every((link) => link.isDisplayed === false)\n );\n\n const sections = filteredMenu.map((section) => {\n return {\n ...section,\n title: section.intlLabel,\n links: section.links.map((link) => {\n return {\n ...link,\n id: link.id as LinkId,\n title: link.intlLabel,\n name: link.id,\n to: link.to.startsWith('/') ? link.to : `/settings/${link.to}`,\n };\n }),\n };\n });\n\n const label = formatMessage({\n id: 'global.settings',\n defaultMessage: 'Settings',\n });\n\n const handleClickOnLink = (destination: string) => () => {\n trackUsage('willNavigate', { from: pathname, to: destination });\n };\n\n return (\n <SubNav.Main aria-label={label}>\n {!isFullPage && (\n <>\n <SubNav.Header label={label} />\n <Divider />\n </>\n )}\n <SubNav.Content>\n {isFullPage && (\n <>\n <SubNav.Header label={label} />\n <Divider />\n </>\n )}\n <SubNav.Sections>\n {sections.map((section) => (\n <SubNav.Section key={section.id} label={formatMessage(section.intlLabel)}>\n {section.links.map((link) => {\n return (\n <SubNav.Link\n to={link.to}\n onClick={handleClickOnLink(link.to)}\n key={link.id}\n label={formatMessage(link.intlLabel)}\n endAction={\n <>\n {link?.licenseOnly && (\n <Lightning\n fill={\n (availableFeatureNames || []).includes(\n linksIdsToLicenseFeaturesNames[link.id]\n )\n ? 'primary600'\n : 'neutral300'\n }\n width=\"1.5rem\"\n height=\"1.5rem\"\n />\n )}\n {link?.hasNotification && (\n <StyledBadge\n aria-label=\"Notification\"\n backgroundColor=\"primary600\"\n textColor=\"neutral0\"\n >\n 1\n </StyledBadge>\n )}\n </>\n }\n >\n {formatMessage(link.intlLabel)}\n </SubNav.Link>\n );\n })}\n </SubNav.Section>\n ))}\n </SubNav.Sections>\n </SubNav.Content>\n </SubNav.Main>\n );\n};\n\nexport { SettingsNav };\n"],"names":["StyledBadge","styled","Badge","theme","spaces","SettingsNav","isFullPage","menu","useSettingsMenu","formatMessage","useIntl","trackUsage","useTracking","pathname","useLocation","license","useLicenseLimits","availableFeatureNames","features","map","feature","name","planEntitlements","filter","entitlement","available","linksIdsToLicenseFeaturesNames","sso","auditLogs","filteredMenu","section","links","every","link","isDisplayed","sections","title","intlLabel","id","to","startsWith","label","defaultMessage","handleClickOnLink","destination","from","_jsxs","SubNav","Main","aria-label","_Fragment","_jsx","Header","Divider","Content","Sections","Section","Link","onClick","endAction","licenseOnly","Lightning","fill","includes","width","height","hasNotification","backgroundColor","textColor"],"mappings":"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"}