@strapi/admin 5.49.0 → 5.50.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 (369) hide show
  1. package/dist/admin/admin/src/components/ErrorElement.js +97 -2
  2. package/dist/admin/admin/src/components/ErrorElement.js.map +1 -1
  3. package/dist/admin/admin/src/components/ErrorElement.mjs +99 -4
  4. package/dist/admin/admin/src/components/ErrorElement.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/LazyOutlet.js +57 -0
  10. package/dist/admin/admin/src/components/LazyOutlet.js.map +1 -0
  11. package/dist/admin/admin/src/components/LazyOutlet.mjs +35 -0
  12. package/dist/admin/admin/src/components/LazyOutlet.mjs.map +1 -0
  13. package/dist/admin/admin/src/components/MainNav/NavUser.js +10 -0
  14. package/dist/admin/admin/src/components/MainNav/NavUser.js.map +1 -1
  15. package/dist/admin/admin/src/components/MainNav/NavUser.mjs +10 -0
  16. package/dist/admin/admin/src/components/MainNav/NavUser.mjs.map +1 -1
  17. package/dist/admin/admin/src/components/RelativeTime.js +3 -2
  18. package/dist/admin/admin/src/components/RelativeTime.js.map +1 -1
  19. package/dist/admin/admin/src/components/RelativeTime.mjs +3 -2
  20. package/dist/admin/admin/src/components/RelativeTime.mjs.map +1 -1
  21. package/dist/admin/admin/src/core/apis/router.js +19 -17
  22. package/dist/admin/admin/src/core/apis/router.js.map +1 -1
  23. package/dist/admin/admin/src/core/apis/router.mjs +19 -17
  24. package/dist/admin/admin/src/core/apis/router.mjs.map +1 -1
  25. package/dist/admin/admin/src/hooks/useQueryParams.js +0 -1
  26. package/dist/admin/admin/src/hooks/useQueryParams.js.map +1 -1
  27. package/dist/admin/admin/src/hooks/useQueryParams.mjs +0 -1
  28. package/dist/admin/admin/src/hooks/useQueryParams.mjs.map +1 -1
  29. package/dist/admin/admin/src/layouts/AuthenticatedLayout.js +4 -2
  30. package/dist/admin/admin/src/layouts/AuthenticatedLayout.js.map +1 -1
  31. package/dist/admin/admin/src/layouts/AuthenticatedLayout.mjs +4 -2
  32. package/dist/admin/admin/src/layouts/AuthenticatedLayout.mjs.map +1 -1
  33. package/dist/admin/admin/src/pages/Auth/AuthPage.js +3 -2
  34. package/dist/admin/admin/src/pages/Auth/AuthPage.js.map +1 -1
  35. package/dist/admin/admin/src/pages/Auth/AuthPage.mjs +3 -2
  36. package/dist/admin/admin/src/pages/Auth/AuthPage.mjs.map +1 -1
  37. package/dist/admin/admin/src/pages/SessionsPage.js +318 -0
  38. package/dist/admin/admin/src/pages/SessionsPage.js.map +1 -0
  39. package/dist/admin/admin/src/pages/SessionsPage.mjs +296 -0
  40. package/dist/admin/admin/src/pages/SessionsPage.mjs.map +1 -0
  41. package/dist/admin/admin/src/pages/Settings/Layout.js +4 -1
  42. package/dist/admin/admin/src/pages/Settings/Layout.js.map +1 -1
  43. package/dist/admin/admin/src/pages/Settings/Layout.mjs +5 -2
  44. package/dist/admin/admin/src/pages/Settings/Layout.mjs.map +1 -1
  45. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.js +1 -0
  46. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.js.map +1 -1
  47. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.mjs +1 -0
  48. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.mjs.map +1 -1
  49. package/dist/admin/admin/src/pages/Settings/pages/Roles/CreatePage.js +7 -0
  50. package/dist/admin/admin/src/pages/Settings/pages/Roles/CreatePage.js.map +1 -1
  51. package/dist/admin/admin/src/pages/Settings/pages/Roles/CreatePage.mjs +7 -0
  52. package/dist/admin/admin/src/pages/Settings/pages/Roles/CreatePage.mjs.map +1 -1
  53. package/dist/admin/admin/src/pages/Settings/pages/Roles/EditPage.js +7 -1
  54. package/dist/admin/admin/src/pages/Settings/pages/Roles/EditPage.js.map +1 -1
  55. package/dist/admin/admin/src/pages/Settings/pages/Roles/EditPage.mjs +7 -1
  56. package/dist/admin/admin/src/pages/Settings/pages/Roles/EditPage.mjs.map +1 -1
  57. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.js +34 -0
  58. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.js.map +1 -1
  59. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.mjs +34 -0
  60. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.mjs.map +1 -1
  61. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/Permissions.js +38 -2
  62. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/Permissions.js.map +1 -1
  63. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/Permissions.mjs +38 -2
  64. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/Permissions.mjs.map +1 -1
  65. package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/forms.js +18 -1
  66. package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/forms.js.map +1 -1
  67. package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/forms.mjs +18 -1
  68. package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/forms.mjs.map +1 -1
  69. package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/localePermissionValidation.js +59 -0
  70. package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/localePermissionValidation.js.map +1 -0
  71. package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/localePermissionValidation.mjs +52 -0
  72. package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/localePermissionValidation.mjs.map +1 -0
  73. package/dist/admin/admin/src/router.js +9 -0
  74. package/dist/admin/admin/src/router.js.map +1 -1
  75. package/dist/admin/admin/src/router.mjs +9 -0
  76. package/dist/admin/admin/src/router.mjs.map +1 -1
  77. package/dist/admin/admin/src/services/auth.js +43 -2
  78. package/dist/admin/admin/src/services/auth.js.map +1 -1
  79. package/dist/admin/admin/src/services/auth.mjs +41 -3
  80. package/dist/admin/admin/src/services/auth.mjs.map +1 -1
  81. package/dist/admin/admin/src/translations/en.json.js +22 -0
  82. package/dist/admin/admin/src/translations/en.json.js.map +1 -1
  83. package/dist/admin/admin/src/translations/en.json.mjs +22 -0
  84. package/dist/admin/admin/src/translations/en.json.mjs.map +1 -1
  85. package/dist/admin/admin/src/translations/ja.json.js +748 -265
  86. package/dist/admin/admin/src/translations/ja.json.js.map +1 -1
  87. package/dist/admin/admin/src/translations/ja.json.mjs +745 -266
  88. package/dist/admin/admin/src/translations/ja.json.mjs.map +1 -1
  89. package/dist/admin/admin/src/translations/languageNativeNames.js +1 -0
  90. package/dist/admin/admin/src/translations/languageNativeNames.js.map +1 -1
  91. package/dist/admin/admin/src/translations/languageNativeNames.mjs +1 -0
  92. package/dist/admin/admin/src/translations/languageNativeNames.mjs.map +1 -1
  93. package/dist/admin/admin/src/utils/retryDynamicImport.js +85 -0
  94. package/dist/admin/admin/src/utils/retryDynamicImport.js.map +1 -0
  95. package/dist/admin/admin/src/utils/retryDynamicImport.mjs +80 -0
  96. package/dist/admin/admin/src/utils/retryDynamicImport.mjs.map +1 -0
  97. package/dist/admin/admin/tests/server.js +25 -0
  98. package/dist/admin/admin/tests/server.js.map +1 -1
  99. package/dist/admin/admin/tests/server.mjs +25 -0
  100. package/dist/admin/admin/tests/server.mjs.map +1 -1
  101. package/dist/admin/index.js +2 -0
  102. package/dist/admin/index.js.map +1 -1
  103. package/dist/admin/index.mjs +1 -0
  104. package/dist/admin/index.mjs.map +1 -1
  105. package/dist/admin/src/StrapiApp.d.ts +5 -5
  106. package/dist/admin/src/components/FormInputs/Boolean.d.ts +0 -1
  107. package/dist/admin/src/components/FormInputs/Checkbox.d.ts +0 -1
  108. package/dist/admin/src/components/FormInputs/DateTime.d.ts +0 -1
  109. package/dist/admin/src/components/FormInputs/Email.d.ts +0 -1
  110. package/dist/admin/src/components/FormInputs/Enumeration.d.ts +0 -1
  111. package/dist/admin/src/components/FormInputs/Number.d.ts +0 -1
  112. package/dist/admin/src/components/FormInputs/Password.d.ts +0 -1
  113. package/dist/admin/src/components/FormInputs/Renderer.d.ts +0 -1
  114. package/dist/admin/src/components/FormInputs/String.d.ts +0 -1
  115. package/dist/admin/src/components/FormInputs/Textarea.d.ts +0 -1
  116. package/dist/admin/src/components/FormInputs/Time.d.ts +0 -1
  117. package/dist/admin/src/components/GuidedTour/GuidedTourProvider.d.ts +0 -1
  118. package/dist/admin/src/components/LazyOutlet.d.ts +20 -0
  119. package/dist/admin/src/components/MainNav/MainNav.d.ts +1 -1
  120. package/dist/admin/src/components/MainNav/NavUser.d.ts +0 -1
  121. package/dist/admin/src/components/SubNav.d.ts +5 -6
  122. package/dist/admin/src/core/apis/Plugin.d.ts +1 -1
  123. package/dist/admin/src/core/apis/Widgets.d.ts +0 -1
  124. package/dist/admin/src/core/apis/router.d.ts +1 -1
  125. package/dist/admin/src/core/store/configure.d.ts +2 -2
  126. package/dist/admin/src/core/utils/createHook.d.ts +4 -4
  127. package/dist/admin/src/features/AppInfo.d.ts +1 -2
  128. package/dist/admin/src/features/StrapiApp.d.ts +1 -2
  129. package/dist/admin/src/hooks/useAPIErrorHandler.d.ts +1 -1
  130. package/dist/admin/src/hooks/useAdminRoles.d.ts +2 -2
  131. package/dist/admin/src/hooks/useFetchClient.d.ts +1 -1
  132. package/dist/admin/src/hooks/usePersistentState.d.ts +0 -1
  133. package/dist/admin/src/hooks/useQueryParams.d.ts +1 -1
  134. package/dist/admin/src/hooks/useThrottledCallback.d.ts +0 -1
  135. package/dist/admin/src/index.d.ts +1 -0
  136. package/dist/admin/src/layouts/UnauthenticatedLayout.d.ts +2 -2
  137. package/dist/admin/src/pages/SessionsPage.d.ts +2 -0
  138. package/dist/admin/src/pages/Settings/pages/Roles/components/CollapseLabel.d.ts +2 -3
  139. package/dist/admin/src/pages/Settings/pages/Roles/components/ConditionsButton.d.ts +2 -2
  140. package/dist/admin/src/pages/Settings/pages/Roles/components/HiddenAction.d.ts +0 -1
  141. package/dist/admin/src/pages/Settings/pages/Roles/components/Permissions.d.ts +2 -0
  142. package/dist/admin/src/pages/Settings/pages/Roles/utils/forms.d.ts +1 -1
  143. package/dist/admin/src/pages/Settings/pages/Roles/utils/localePermissionValidation.d.ts +5 -0
  144. package/dist/admin/src/pages/Settings/pages/Roles/utils/permissions.d.ts +3 -1
  145. package/dist/admin/src/pages/Settings/pages/Webhooks/hooks/useWebhooks.d.ts +8 -8
  146. package/dist/admin/src/reducer.d.ts +1 -1
  147. package/dist/admin/src/services/admin.d.ts +2 -2
  148. package/dist/admin/src/services/api.d.ts +1 -1
  149. package/dist/admin/src/services/apiTokens.d.ts +1 -1
  150. package/dist/admin/src/services/auth.d.ts +29 -27
  151. package/dist/admin/src/services/contentApi.d.ts +1 -1
  152. package/dist/admin/src/services/users.d.ts +7 -7
  153. package/dist/admin/src/services/webhooks.d.ts +2 -2
  154. package/dist/admin/src/translations/languageNativeNames.d.ts +1 -0
  155. package/dist/admin/src/utils/locales.d.ts +0 -1
  156. package/dist/admin/src/utils/retryDynamicImport.d.ts +19 -0
  157. package/dist/admin/src/utils/shims.d.ts +1 -1
  158. package/dist/admin/tests/store.d.ts +4 -4
  159. package/dist/admin/tests/utils.d.ts +5 -5
  160. package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getDisplayedFilters.d.ts +1 -1
  161. package/dist/ee/admin/src/services/ai.d.ts +2 -2
  162. package/dist/ee/server/src/audit-logs/services/audit-logs.d.ts +1 -1
  163. package/dist/ee/server/src/audit-logs/services/audit-logs.d.ts.map +1 -1
  164. package/dist/ee/server/src/audit-logs/services/lifecycles.d.ts +3 -3
  165. package/dist/ee/server/src/audit-logs/services/lifecycles.d.ts.map +1 -1
  166. package/dist/ee/server/src/audit-logs/validation/audit-logs.d.ts +2 -2
  167. package/dist/ee/server/src/audit-logs/validation/audit-logs.d.ts.map +1 -1
  168. package/dist/ee/server/src/bootstrap.d.ts.map +1 -1
  169. package/dist/ee/server/src/controllers/authentication-utils/utils.d.ts +30 -31
  170. package/dist/ee/server/src/controllers/authentication-utils/utils.d.ts.map +1 -1
  171. package/dist/ee/server/src/controllers/index.d.ts +1 -2
  172. package/dist/ee/server/src/controllers/index.d.ts.map +1 -1
  173. package/dist/ee/server/src/controllers/user.d.ts +1 -1
  174. package/dist/ee/server/src/destroy.d.ts.map +1 -1
  175. package/dist/ee/server/src/index.d.ts +2 -3
  176. package/dist/ee/server/src/index.d.ts.map +1 -1
  177. package/dist/ee/server/src/register.d.ts.map +1 -1
  178. package/dist/ee/server/src/routes/utils.d.ts.map +1 -1
  179. package/dist/ee/server/src/services/auth.d.ts.map +1 -1
  180. package/dist/ee/server/src/services/index.d.ts +1 -1
  181. package/dist/ee/server/src/services/metrics.d.ts.map +1 -1
  182. package/dist/ee/server/src/services/passport/sso.d.ts.map +1 -1
  183. package/dist/ee/server/src/services/persist-tables.d.ts +1 -1
  184. package/dist/ee/server/src/services/persist-tables.d.ts.map +1 -1
  185. package/dist/ee/server/src/services/role.d.ts.map +1 -1
  186. package/dist/ee/server/src/services/user.d.ts.map +1 -1
  187. package/dist/ee/server/src/utils/index.d.ts.map +1 -1
  188. package/dist/ee/server/src/utils/sso-lock.d.ts.map +1 -1
  189. package/dist/ee/server/src/validation/authentication.d.ts +2 -2
  190. package/dist/ee/server/src/validation/role.d.ts +6 -6
  191. package/dist/ee/server/src/validation/role.d.ts.map +1 -1
  192. package/dist/ee/server/src/validation/user.d.ts.map +1 -1
  193. package/dist/server/server/src/content-types/session.js +6 -0
  194. package/dist/server/server/src/content-types/session.js.map +1 -1
  195. package/dist/server/server/src/content-types/session.mjs +6 -0
  196. package/dist/server/server/src/content-types/session.mjs.map +1 -1
  197. package/dist/server/server/src/controllers/admin.js.map +1 -1
  198. package/dist/server/server/src/controllers/admin.mjs.map +1 -1
  199. package/dist/server/server/src/controllers/authenticated-session.js +61 -0
  200. package/dist/server/server/src/controllers/authenticated-session.js.map +1 -0
  201. package/dist/server/server/src/controllers/authenticated-session.mjs +59 -0
  202. package/dist/server/server/src/controllers/authenticated-session.mjs.map +1 -0
  203. package/dist/server/server/src/controllers/authentication.js +11 -4
  204. package/dist/server/server/src/controllers/authentication.js.map +1 -1
  205. package/dist/server/server/src/controllers/authentication.mjs +12 -5
  206. package/dist/server/server/src/controllers/authentication.mjs.map +1 -1
  207. package/dist/server/server/src/controllers/index.js +2 -0
  208. package/dist/server/server/src/controllers/index.js.map +1 -1
  209. package/dist/server/server/src/controllers/index.mjs +2 -0
  210. package/dist/server/server/src/controllers/index.mjs.map +1 -1
  211. package/dist/server/server/src/controllers/role.js +2 -4
  212. package/dist/server/server/src/controllers/role.js.map +1 -1
  213. package/dist/server/server/src/controllers/role.mjs +2 -4
  214. package/dist/server/server/src/controllers/role.mjs.map +1 -1
  215. package/dist/server/server/src/routes/serve-admin-panel.js +1 -1
  216. package/dist/server/server/src/routes/serve-admin-panel.js.map +1 -1
  217. package/dist/server/server/src/routes/serve-admin-panel.mjs +1 -1
  218. package/dist/server/server/src/routes/serve-admin-panel.mjs.map +1 -1
  219. package/dist/server/server/src/routes/users.js +12 -26
  220. package/dist/server/server/src/routes/users.js.map +1 -1
  221. package/dist/server/server/src/routes/users.mjs +12 -26
  222. package/dist/server/server/src/routes/users.mjs.map +1 -1
  223. package/dist/server/server/src/services/permission/permissions-manager/sanitize.js +0 -2
  224. package/dist/server/server/src/services/permission/permissions-manager/sanitize.js.map +1 -1
  225. package/dist/server/server/src/services/permission/permissions-manager/sanitize.mjs +0 -2
  226. package/dist/server/server/src/services/permission/permissions-manager/sanitize.mjs.map +1 -1
  227. package/dist/server/server/src/services/role.js +2 -1
  228. package/dist/server/server/src/services/role.js.map +1 -1
  229. package/dist/server/server/src/services/role.mjs +2 -1
  230. package/dist/server/server/src/services/role.mjs.map +1 -1
  231. package/dist/server/server/src/strategies/admin.js +4 -0
  232. package/dist/server/server/src/strategies/admin.js.map +1 -1
  233. package/dist/server/server/src/strategies/admin.mjs +4 -0
  234. package/dist/server/server/src/strategies/admin.mjs.map +1 -1
  235. package/dist/server/src/ai/controllers/ai.d.ts +3 -3
  236. package/dist/server/src/ai/services/ai.d.ts.map +1 -1
  237. package/dist/server/src/bootstrap.d.ts.map +1 -1
  238. package/dist/server/src/config/admin-conditions.d.ts +2 -2
  239. package/dist/server/src/config/admin-conditions.d.ts.map +1 -1
  240. package/dist/server/src/content-types/index.d.ts +6 -0
  241. package/dist/server/src/content-types/index.d.ts.map +1 -1
  242. package/dist/server/src/content-types/session.d.ts +6 -0
  243. package/dist/server/src/content-types/session.d.ts.map +1 -1
  244. package/dist/server/src/controllers/admin-token.d.ts +5 -5
  245. package/dist/server/src/controllers/api-token.d.ts +1 -1
  246. package/dist/server/src/controllers/authenticated-session.d.ts +8 -0
  247. package/dist/server/src/controllers/authenticated-session.d.ts.map +1 -0
  248. package/dist/server/src/controllers/authenticated-user.d.ts +1 -1
  249. package/dist/server/src/controllers/authentication.d.ts +4 -4
  250. package/dist/server/src/controllers/authentication.d.ts.map +1 -1
  251. package/dist/server/src/controllers/formatters/conditions.d.ts +0 -1
  252. package/dist/server/src/controllers/formatters/conditions.d.ts.map +1 -1
  253. package/dist/server/src/controllers/formatters/format-actions-by-sections.d.ts.map +1 -1
  254. package/dist/server/src/controllers/homepage.d.ts +2 -2
  255. package/dist/server/src/controllers/homepage.d.ts.map +1 -1
  256. package/dist/server/src/controllers/index.d.ts +33 -43
  257. package/dist/server/src/controllers/index.d.ts.map +1 -1
  258. package/dist/server/src/controllers/role.d.ts +4 -4
  259. package/dist/server/src/controllers/transfer/runner.d.ts +4 -4
  260. package/dist/server/src/controllers/transfer/runner.d.ts.map +1 -1
  261. package/dist/server/src/controllers/transfer/token.d.ts +1 -1
  262. package/dist/server/src/controllers/user.d.ts +2 -2
  263. package/dist/server/src/controllers/webhooks.d.ts +4 -4
  264. package/dist/server/src/domain/action/index.d.ts +4 -65
  265. package/dist/server/src/domain/action/index.d.ts.map +1 -1
  266. package/dist/server/src/domain/action/provider.d.ts +30 -3
  267. package/dist/server/src/domain/action/provider.d.ts.map +1 -1
  268. package/dist/server/src/domain/condition/index.d.ts.map +1 -1
  269. package/dist/server/src/domain/condition/provider.d.ts +19 -2
  270. package/dist/server/src/domain/condition/provider.d.ts.map +1 -1
  271. package/dist/server/src/domain/permission/index.d.ts +0 -1
  272. package/dist/server/src/domain/permission/index.d.ts.map +1 -1
  273. package/dist/server/src/domain/user.d.ts.map +1 -1
  274. package/dist/server/src/index.d.ts +51 -63
  275. package/dist/server/src/index.d.ts.map +1 -1
  276. package/dist/server/src/middlewares/data-transfer.d.ts.map +1 -1
  277. package/dist/server/src/middlewares/index.d.ts +0 -1
  278. package/dist/server/src/middlewares/index.d.ts.map +1 -1
  279. package/dist/server/src/middlewares/rateLimit.d.ts.map +1 -1
  280. package/dist/server/src/policies/hasPermissions.d.ts.map +1 -1
  281. package/dist/server/src/policies/index.d.ts.map +1 -1
  282. package/dist/server/src/policies/isAuthenticatedAdmin.d.ts.map +1 -1
  283. package/dist/server/src/policies/isTelemetryEnabled.d.ts.map +1 -1
  284. package/dist/server/src/register.d.ts.map +1 -1
  285. package/dist/server/src/routes/index.d.ts +0 -1
  286. package/dist/server/src/routes/index.d.ts.map +1 -1
  287. package/dist/server/src/routes/serve-admin-panel.d.ts.map +1 -1
  288. package/dist/server/src/routes/transfer.d.ts +0 -1
  289. package/dist/server/src/routes/transfer.d.ts.map +1 -1
  290. package/dist/server/src/routes/users.d.ts.map +1 -1
  291. package/dist/server/src/services/action.d.ts.map +1 -1
  292. package/dist/server/src/services/api-token.d.ts +5 -6
  293. package/dist/server/src/services/api-token.d.ts.map +1 -1
  294. package/dist/server/src/services/auth.d.ts.map +1 -1
  295. package/dist/server/src/services/condition.d.ts.map +1 -1
  296. package/dist/server/src/services/content-type.d.ts.map +1 -1
  297. package/dist/server/src/services/encryption.d.ts.map +1 -1
  298. package/dist/server/src/services/homepage.d.ts.map +1 -1
  299. package/dist/server/src/services/index.d.ts +12 -21
  300. package/dist/server/src/services/index.d.ts.map +1 -1
  301. package/dist/server/src/services/metrics.d.ts.map +1 -1
  302. package/dist/server/src/services/passport/local-strategy.d.ts.map +1 -1
  303. package/dist/server/src/services/passport.d.ts +0 -1
  304. package/dist/server/src/services/passport.d.ts.map +1 -1
  305. package/dist/server/src/services/permission/engine.d.ts +1 -2
  306. package/dist/server/src/services/permission/engine.d.ts.map +1 -1
  307. package/dist/server/src/services/permission/permissions-manager/index.d.ts +5 -5
  308. package/dist/server/src/services/permission/permissions-manager/index.d.ts.map +1 -1
  309. package/dist/server/src/services/permission/permissions-manager/permission-fields.d.ts.map +1 -1
  310. package/dist/server/src/services/permission/permissions-manager/query-builders.d.ts.map +1 -1
  311. package/dist/server/src/services/permission/permissions-manager/sanitize.d.ts +3 -3
  312. package/dist/server/src/services/permission/permissions-manager/sanitize.d.ts.map +1 -1
  313. package/dist/server/src/services/permission/permissions-manager/validate.d.ts.map +1 -1
  314. package/dist/server/src/services/permission/queries.d.ts.map +1 -1
  315. package/dist/server/src/services/permission/sections-builder/builder.d.ts +4 -4
  316. package/dist/server/src/services/permission/sections-builder/builder.d.ts.map +1 -1
  317. package/dist/server/src/services/permission/sections-builder/handlers.d.ts.map +1 -1
  318. package/dist/server/src/services/permission/sections-builder/index.d.ts +4 -4
  319. package/dist/server/src/services/permission/sections-builder/section.d.ts.map +1 -1
  320. package/dist/server/src/services/permission/sections-builder/utils.d.ts +0 -1
  321. package/dist/server/src/services/permission/sections-builder/utils.d.ts.map +1 -1
  322. package/dist/server/src/services/permission.d.ts +13 -38
  323. package/dist/server/src/services/permission.d.ts.map +1 -1
  324. package/dist/server/src/services/project-settings.d.ts +2 -4
  325. package/dist/server/src/services/project-settings.d.ts.map +1 -1
  326. package/dist/server/src/services/role.d.ts +7 -1
  327. package/dist/server/src/services/role.d.ts.map +1 -1
  328. package/dist/server/src/services/token.d.ts +1 -1
  329. package/dist/server/src/services/token.d.ts.map +1 -1
  330. package/dist/server/src/services/transfer/token.d.ts +11 -11
  331. package/dist/server/src/services/transfer/token.d.ts.map +1 -1
  332. package/dist/server/src/services/user.d.ts +3 -3
  333. package/dist/server/src/services/user.d.ts.map +1 -1
  334. package/dist/server/src/strategies/admin-token.d.ts +4 -4
  335. package/dist/server/src/strategies/admin-token.d.ts.map +1 -1
  336. package/dist/server/src/strategies/admin.d.ts.map +1 -1
  337. package/dist/server/src/strategies/api-token-utils.d.ts.map +1 -1
  338. package/dist/server/src/strategies/content-api-token.d.ts.map +1 -1
  339. package/dist/server/src/strategies/data-transfer.d.ts.map +1 -1
  340. package/dist/server/src/utils/normalize-email.d.ts.map +1 -1
  341. package/dist/server/src/validation/action-provider.d.ts +2 -2
  342. package/dist/server/src/validation/action-provider.d.ts.map +1 -1
  343. package/dist/server/src/validation/admin-tokens.d.ts +2 -2
  344. package/dist/server/src/validation/api-tokens.d.ts +4 -4
  345. package/dist/server/src/validation/authentication/forgot-password.d.ts +1 -1
  346. package/dist/server/src/validation/authentication/login.d.ts +1 -1
  347. package/dist/server/src/validation/authentication/register.d.ts +6 -6
  348. package/dist/server/src/validation/authentication/register.d.ts.map +1 -1
  349. package/dist/server/src/validation/authentication/reset-password.d.ts +1 -1
  350. package/dist/server/src/validation/common-functions/check-fields-are-correctly-nested.d.ts.map +1 -1
  351. package/dist/server/src/validation/common-functions/check-fields-dont-have-duplicates.d.ts.map +1 -1
  352. package/dist/server/src/validation/common-validators.d.ts.map +1 -1
  353. package/dist/server/src/validation/permission.d.ts +6 -6
  354. package/dist/server/src/validation/permission.d.ts.map +1 -1
  355. package/dist/server/src/validation/policies/hasPermissions.d.ts +2 -2
  356. package/dist/server/src/validation/project-settings.d.ts +6 -6
  357. package/dist/server/src/validation/role.d.ts +8 -8
  358. package/dist/server/src/validation/role.d.ts.map +1 -1
  359. package/dist/server/src/validation/transfer/token.d.ts +4 -4
  360. package/dist/server/src/validation/user.d.ts +8 -8
  361. package/dist/shared/contracts/permissions.d.ts +1 -0
  362. package/dist/shared/contracts/permissions.d.ts.map +1 -1
  363. package/dist/shared/contracts/sessions.d.ts +62 -0
  364. package/dist/shared/contracts/sessions.d.ts.map +1 -0
  365. package/dist/shared/contracts/shared.d.ts +1 -1
  366. package/dist/shared/contracts/shared.d.ts.map +1 -1
  367. package/dist/shared/utils/session-auth.d.ts +1 -1
  368. package/dist/shared/utils/session-auth.d.ts.map +1 -1
  369. package/package.json +11 -11
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionsPage.js","sources":["../../../../../admin/src/pages/SessionsPage.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Badge,\n Box,\n Button,\n Dialog,\n Flex,\n IconButton,\n Table,\n Tbody,\n Td,\n Th,\n Thead,\n Tr,\n Typography,\n} from '@strapi/design-system';\nimport { SignOut } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { useNavigate } from 'react-router-dom';\n\nimport { ConfirmDialog } from '../components/ConfirmDialog';\nimport { Layouts } from '../components/Layouts/Layout';\nimport { Page } from '../components/PageHelpers';\nimport { RelativeTime } from '../components/RelativeTime';\nimport { useAuth } from '../features/Auth';\nimport { useNotification } from '../features/Notifications';\nimport { useAPIErrorHandler } from '../hooks/useAPIErrorHandler';\nimport {\n useGetActiveSessionsQuery,\n useRevokeAllSessionsMutation,\n useRevokeSessionMutation,\n} from '../services/auth';\nimport { isBaseQueryError } from '../utils/baseQuery';\n\nimport type { SanitizedAdminSession } from '../../../shared/contracts/sessions';\n\n/* -------------------------------------------------------------------------------------------------\n * SessionsPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst SessionsPage = () => {\n const { formatMessage } = useIntl();\n const navigate = useNavigate();\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n const logout = useAuth('SessionsPage', (state) => state.logout);\n\n const { data: sessions = [], isLoading, error } = useGetActiveSessionsQuery();\n const [revokeSession] = useRevokeSessionMutation();\n const [revokeAllSessions] = useRevokeAllSessionsMutation();\n\n const handleLogoutAndRedirect = React.useCallback(async () => {\n await logout();\n navigate('/auth/login');\n }, [logout, navigate]);\n\n const notifyError = React.useCallback(\n (error?: unknown) => {\n toggleNotification({\n type: 'danger',\n message:\n error && isBaseQueryError(error)\n ? formatAPIError(error)\n : formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n },\n [formatAPIError, formatMessage, toggleNotification]\n );\n\n const runSessionMutation = React.useCallback(\n async (\n action: () => Promise<{ error?: unknown } | { data: unknown } | void>,\n onSuccess: () => void | Promise<void>\n ) => {\n try {\n const res = await action();\n\n if (res && 'error' in res && res.error) {\n notifyError(res.error);\n return;\n }\n\n await onSuccess();\n } catch {\n notifyError();\n }\n },\n [notifyError]\n );\n\n const handleRevoke = async (session: SanitizedAdminSession) => {\n await runSessionMutation(\n () => revokeSession(session.id),\n async () => {\n if (session.current) {\n await handleLogoutAndRedirect();\n return;\n }\n\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: 'Settings.sessions.revoke.success',\n defaultMessage: 'Session ended',\n }),\n });\n }\n );\n };\n\n const handleRevokeOthers = async () => {\n await runSessionMutation(\n () => revokeAllSessions({ keepCurrent: true }),\n () => {\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: 'Settings.sessions.revokeOthers.success',\n defaultMessage: 'Other sessions ended',\n }),\n });\n }\n );\n };\n\n const handleRevokeAll = async () => {\n await runSessionMutation(() => revokeAllSessions(undefined), handleLogoutAndRedirect);\n };\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n if (error) {\n return <Page.Error />;\n }\n\n return (\n <Page.Main>\n <Page.Title>\n {formatMessage({\n id: 'Settings.sessions.title',\n defaultMessage: 'Active Devices',\n })}\n </Page.Title>\n <Layouts.Header\n title={formatMessage({\n id: 'Settings.sessions.title',\n defaultMessage: 'Active Devices',\n })}\n subtitle={formatMessage({\n id: 'Settings.sessions.subtitle',\n defaultMessage: 'These are the devices and sessions currently signed in to your account.',\n })}\n primaryAction={\n sessions.length > 0 ? (\n <Flex gap={2}>\n {sessions.length > 1 ? (\n <Dialog.Root>\n <Dialog.Trigger>\n <Button variant=\"secondary\" startIcon={<SignOut />}>\n {formatMessage({\n id: 'Settings.sessions.revokeOthers',\n defaultMessage: 'Log out of other devices',\n })}\n </Button>\n </Dialog.Trigger>\n <ConfirmDialog onConfirm={handleRevokeOthers}>\n {formatMessage({\n id: 'Settings.sessions.revokeOthers.confirm',\n defaultMessage:\n 'Are you sure? This will end every other active session. You will stay signed in on this device.',\n })}\n </ConfirmDialog>\n </Dialog.Root>\n ) : null}\n <Dialog.Root>\n <Dialog.Trigger>\n <Button variant=\"danger-light\" startIcon={<SignOut />}>\n {formatMessage({\n id: 'Settings.sessions.revokeAll',\n defaultMessage: 'Log out of all devices',\n })}\n </Button>\n </Dialog.Trigger>\n <ConfirmDialog onConfirm={handleRevokeAll}>\n {formatMessage({\n id: 'Settings.sessions.revokeAll.confirm',\n defaultMessage:\n 'Are you sure? This will end every active session, including this one, and you will need to log in again.',\n })}\n </ConfirmDialog>\n </Dialog.Root>\n </Flex>\n ) : undefined\n }\n />\n <Layouts.Content>\n <Box background=\"neutral0\" hasRadius shadow=\"filterShadow\">\n <Table colCount={4} rowCount={sessions.length}>\n <Thead>\n <Tr>\n <Th>\n <Typography variant=\"sigma\">\n {formatMessage({ id: 'Settings.sessions.device', defaultMessage: 'Device' })}\n </Typography>\n </Th>\n <Th>\n <Typography variant=\"sigma\">\n {formatMessage({\n id: 'Settings.sessions.loginAt',\n defaultMessage: 'Signed in',\n })}\n </Typography>\n </Th>\n <Th>\n <Typography variant=\"sigma\">\n {formatMessage({\n id: 'Settings.sessions.lastActiveAt',\n defaultMessage: 'Last used',\n })}\n </Typography>\n </Th>\n <Th>\n <Typography variant=\"sigma\">\n {formatMessage({ id: 'Settings.sessions.actions', defaultMessage: 'Actions' })}\n </Typography>\n </Th>\n </Tr>\n </Thead>\n <Tbody>\n {sessions.map((session) => (\n <Tr key={session.id}>\n <Td>\n <Flex gap={2}>\n <Typography textColor=\"neutral800\">\n {session.deviceName ??\n (session.deviceId\n ? session.deviceId.slice(0, 8)\n : formatMessage({\n id: 'Settings.sessions.unknownDevice',\n defaultMessage: 'Unknown device',\n }))}\n </Typography>\n {session.current && (\n <Badge>\n {formatMessage({\n id: 'Settings.sessions.current',\n defaultMessage: 'This device',\n })}\n </Badge>\n )}\n </Flex>\n </Td>\n <Td>\n <Typography textColor=\"neutral800\">\n {session.loginAt ? (\n <RelativeTime timestamp={new Date(session.loginAt)} />\n ) : (\n '-'\n )}\n </Typography>\n </Td>\n <Td>\n <Typography textColor=\"neutral800\">\n {session.lastActiveAt ? (\n <RelativeTime timestamp={new Date(session.lastActiveAt)} />\n ) : (\n '-'\n )}\n </Typography>\n </Td>\n <Td>\n <Flex justifyContent=\"end\" onClick={(e) => e.stopPropagation()}>\n <Dialog.Root>\n <Dialog.Trigger>\n <IconButton\n label={formatMessage({\n id: 'Settings.sessions.revoke',\n defaultMessage: 'End session',\n })}\n variant=\"ghost\"\n >\n <SignOut />\n </IconButton>\n </Dialog.Trigger>\n <ConfirmDialog onConfirm={() => handleRevoke(session)}>\n {session.current\n ? formatMessage({\n id: 'Settings.sessions.revoke.confirmCurrent',\n defaultMessage:\n 'This is the device you are currently using. Ending this session will log you out.',\n })\n : formatMessage({\n id: 'Settings.sessions.revoke.confirm',\n defaultMessage:\n 'Are you sure you want to end this session? The device will need to log in again.',\n })}\n </ConfirmDialog>\n </Dialog.Root>\n </Flex>\n </Td>\n </Tr>\n ))}\n </Tbody>\n </Table>\n </Box>\n </Layouts.Content>\n </Page.Main>\n );\n};\n\nexport { SessionsPage };\n"],"names":["SessionsPage","formatMessage","useIntl","navigate","useNavigate","toggleNotification","useNotification","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","logout","useAuth","state","data","sessions","isLoading","error","useGetActiveSessionsQuery","revokeSession","useRevokeSessionMutation","revokeAllSessions","useRevokeAllSessionsMutation","handleLogoutAndRedirect","React","useCallback","notifyError","type","message","isBaseQueryError","id","defaultMessage","runSessionMutation","action","onSuccess","res","handleRevoke","session","current","handleRevokeOthers","keepCurrent","handleRevokeAll","undefined","_jsx","Page","Loading","Error","_jsxs","Main","Title","Layouts","Header","title","subtitle","primaryAction","length","Flex","gap","Dialog","Root","Trigger","Button","variant","startIcon","SignOut","ConfirmDialog","onConfirm","Content","Box","background","hasRadius","shadow","Table","colCount","rowCount","Thead","Tr","Th","Typography","Tbody","map","Td","textColor","deviceName","deviceId","slice","Badge","loginAt","RelativeTime","timestamp","Date","lastActiveAt","justifyContent","onClick","e","stopPropagation","IconButton","label"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCA;;AAEkG,2GAE5FA,YAAAA,GAAe,IAAA;IACnB,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;AAC1B,IAAA,MAAMC,QAAAA,GAAWC,0BAAAA,EAAAA;IACjB,MAAM,EAAEC,kBAAkB,EAAE,GAAGC,6BAAAA,EAAAA;AAC/B,IAAA,MAAM,EAAEC,uBAAAA,EAAyBC,cAAc,EAAE,GAAGC,qCAAAA,EAAAA;AACpD,IAAA,MAAMC,SAASC,YAAAA,CAAQ,cAAA,EAAgB,CAACC,KAAAA,GAAUA,MAAMF,MAAM,CAAA;IAE9D,MAAM,EAAEG,MAAMC,QAAAA,GAAW,EAAE,EAAEC,SAAS,EAAEC,KAAK,EAAE,GAAGC,8BAAAA,EAAAA;IAClD,MAAM,CAACC,cAAc,GAAGC,6BAAAA,EAAAA;IACxB,MAAM,CAACC,kBAAkB,GAAGC,iCAAAA,EAAAA;IAE5B,MAAMC,uBAAAA,GAA0BC,gBAAAA,CAAMC,WAAW,CAAC,UAAA;QAChD,MAAMd,MAAAA,EAAAA;QACNP,QAAAA,CAAS,aAAA,CAAA;IACX,CAAA,EAAG;AAACO,QAAAA,MAAAA;AAAQP,QAAAA;AAAS,KAAA,CAAA;AAErB,IAAA,MAAMsB,WAAAA,GAAcF,gBAAAA,CAAMC,WAAW,CACnC,CAACR,KAAAA,GAAAA;QACCX,kBAAAA,CAAmB;YACjBqB,IAAAA,EAAM,QAAA;AACNC,YAAAA,OAAAA,EACEX,KAAAA,IAASY,0BAAAA,CAAiBZ,KAAAA,CAAAA,GACtBR,cAAAA,CAAeQ,SACff,aAAAA,CAAc;gBAAE4B,EAAAA,EAAI,oBAAA;gBAAsBC,cAAAA,EAAgB;AAAoB,aAAA;AACtF,SAAA,CAAA;IACF,CAAA,EACA;AAACtB,QAAAA,cAAAA;AAAgBP,QAAAA,aAAAA;AAAeI,QAAAA;AAAmB,KAAA,CAAA;AAGrD,IAAA,MAAM0B,kBAAAA,GAAqBR,gBAAAA,CAAMC,WAAW,CAC1C,OACEQ,MAAAA,EACAC,SAAAA,GAAAA;QAEA,IAAI;AACF,YAAA,MAAMC,MAAM,MAAMF,MAAAA,EAAAA;AAElB,YAAA,IAAIE,GAAAA,IAAO,OAAA,IAAWA,GAAAA,IAAOA,GAAAA,CAAIlB,KAAK,EAAE;AACtCS,gBAAAA,WAAAA,CAAYS,IAAIlB,KAAK,CAAA;AACrB,gBAAA;AACF,YAAA;YAEA,MAAMiB,SAAAA,EAAAA;AACR,QAAA,CAAA,CAAE,OAAM;AACNR,YAAAA,WAAAA,EAAAA;AACF,QAAA;IACF,CAAA,EACA;AAACA,QAAAA;AAAY,KAAA,CAAA;AAGf,IAAA,MAAMU,eAAe,OAAOC,OAAAA,GAAAA;AAC1B,QAAA,MAAML,kBAAAA,CACJ,IAAMb,aAAAA,CAAckB,OAAAA,CAAQP,EAAE,CAAA,EAC9B,UAAA;YACE,IAAIO,OAAAA,CAAQC,OAAO,EAAE;gBACnB,MAAMf,uBAAAA,EAAAA;AACN,gBAAA;AACF,YAAA;YAEAjB,kBAAAA,CAAmB;gBACjBqB,IAAAA,EAAM,SAAA;AACNC,gBAAAA,OAAAA,EAAS1B,aAAAA,CAAc;oBACrB4B,EAAAA,EAAI,kCAAA;oBACJC,cAAAA,EAAgB;AAClB,iBAAA;AACF,aAAA,CAAA;AACF,QAAA,CAAA,CAAA;AAEJ,IAAA,CAAA;AAEA,IAAA,MAAMQ,kBAAAA,GAAqB,UAAA;QACzB,MAAMP,kBAAAA,CACJ,IAAMX,iBAAAA,CAAkB;gBAAEmB,WAAAA,EAAa;aAAK,CAAA,EAC5C,IAAA;YACElC,kBAAAA,CAAmB;gBACjBqB,IAAAA,EAAM,SAAA;AACNC,gBAAAA,OAAAA,EAAS1B,aAAAA,CAAc;oBACrB4B,EAAAA,EAAI,wCAAA;oBACJC,cAAAA,EAAgB;AAClB,iBAAA;AACF,aAAA,CAAA;AACF,QAAA,CAAA,CAAA;AAEJ,IAAA,CAAA;AAEA,IAAA,MAAMU,eAAAA,GAAkB,UAAA;QACtB,MAAMT,kBAAAA,CAAmB,IAAMX,iBAAAA,CAAkBqB,SAAAA,CAAAA,EAAYnB,uBAAAA,CAAAA;AAC/D,IAAA,CAAA;AAEA,IAAA,IAAIP,SAAAA,EAAW;QACb,qBAAO2B,cAAA,CAACC,iBAAKC,OAAO,EAAA,EAAA,CAAA;AACtB,IAAA;AAEA,IAAA,IAAI5B,KAAAA,EAAO;QACT,qBAAO0B,cAAA,CAACC,iBAAKE,KAAK,EAAA,EAAA,CAAA;AACpB,IAAA;IAEA,qBACEC,eAAA,CAACH,iBAAKI,IAAI,EAAA;;AACR,0BAAAL,cAAA,CAACC,iBAAKK,KAAK,EAAA;0BACR/C,aAAAA,CAAc;oBACb4B,EAAAA,EAAI,yBAAA;oBACJC,cAAAA,EAAgB;AAClB,iBAAA;;AAEF,0BAAAY,cAAA,CAACO,eAAQC,MAAM,EAAA;AACbC,gBAAAA,KAAAA,EAAOlD,aAAAA,CAAc;oBACnB4B,EAAAA,EAAI,yBAAA;oBACJC,cAAAA,EAAgB;AAClB,iBAAA,CAAA;AACAsB,gBAAAA,QAAAA,EAAUnD,aAAAA,CAAc;oBACtB4B,EAAAA,EAAI,4BAAA;oBACJC,cAAAA,EAAgB;AAClB,iBAAA,CAAA;AACAuB,gBAAAA,aAAAA,EACEvC,QAAAA,CAASwC,MAAM,GAAG,CAAA,iBAChBR,eAAA,CAACS,iBAAAA,EAAAA;oBAAKC,GAAAA,EAAK,CAAA;;AACR1C,wBAAAA,QAAAA,CAASwC,MAAM,GAAG,CAAA,iBACjBR,eAAA,CAACW,oBAAOC,IAAI,EAAA;;AACV,8CAAAhB,cAAA,CAACe,oBAAOE,OAAO,EAAA;AACb,oCAAA,QAAA,gBAAAjB,cAAA,CAACkB,mBAAAA,EAAAA;wCAAOC,OAAAA,EAAQ,WAAA;AAAYC,wCAAAA,SAAAA,gBAAWpB,cAAA,CAACqB,aAAAA,EAAAA,EAAAA,CAAAA;kDACrC9D,aAAAA,CAAc;4CACb4B,EAAAA,EAAI,gCAAA;4CACJC,cAAAA,EAAgB;AAClB,yCAAA;;;8CAGJY,cAAA,CAACsB,2BAAAA,EAAAA;oCAAcC,SAAAA,EAAW3B,kBAAAA;8CACvBrC,aAAAA,CAAc;wCACb4B,EAAAA,EAAI,wCAAA;wCACJC,cAAAA,EACE;AACJ,qCAAA;;;AAGF,yBAAA,CAAA,GAAA,IAAA;AACJ,sCAAAgB,eAAA,CAACW,oBAAOC,IAAI,EAAA;;AACV,8CAAAhB,cAAA,CAACe,oBAAOE,OAAO,EAAA;AACb,oCAAA,QAAA,gBAAAjB,cAAA,CAACkB,mBAAAA,EAAAA;wCAAOC,OAAAA,EAAQ,cAAA;AAAeC,wCAAAA,SAAAA,gBAAWpB,cAAA,CAACqB,aAAAA,EAAAA,EAAAA,CAAAA;kDACxC9D,aAAAA,CAAc;4CACb4B,EAAAA,EAAI,6BAAA;4CACJC,cAAAA,EAAgB;AAClB,yCAAA;;;8CAGJY,cAAA,CAACsB,2BAAAA,EAAAA;oCAAcC,SAAAA,EAAWzB,eAAAA;8CACvBvC,aAAAA,CAAc;wCACb4B,EAAAA,EAAI,qCAAA;wCACJC,cAAAA,EACE;AACJ,qCAAA;;;;;AAIJW,iBAAAA,CAAAA,GAAAA;;AAGR,0BAAAC,cAAA,CAACO,eAAQiB,OAAO,EAAA;AACd,gBAAA,QAAA,gBAAAxB,cAAA,CAACyB,gBAAAA,EAAAA;oBAAIC,UAAAA,EAAW,UAAA;oBAAWC,SAAS,EAAA,IAAA;oBAACC,MAAAA,EAAO,cAAA;AAC1C,oBAAA,QAAA,gBAAAxB,eAAA,CAACyB,kBAAAA,EAAAA;wBAAMC,QAAAA,EAAU,CAAA;AAAGC,wBAAAA,QAAAA,EAAU3D,SAASwC,MAAM;;0CAC3CZ,cAAA,CAACgC,kBAAAA,EAAAA;AACC,gCAAA,QAAA,gBAAA5B,eAAA,CAAC6B,eAAAA,EAAAA;;sDACCjC,cAAA,CAACkC,eAAAA,EAAAA;AACC,4CAAA,QAAA,gBAAAlC,cAAA,CAACmC,uBAAAA,EAAAA;gDAAWhB,OAAAA,EAAQ,OAAA;0DACjB5D,aAAAA,CAAc;oDAAE4B,EAAAA,EAAI,0BAAA;oDAA4BC,cAAAA,EAAgB;AAAS,iDAAA;;;sDAG9EY,cAAA,CAACkC,eAAAA,EAAAA;AACC,4CAAA,QAAA,gBAAAlC,cAAA,CAACmC,uBAAAA,EAAAA;gDAAWhB,OAAAA,EAAQ,OAAA;0DACjB5D,aAAAA,CAAc;oDACb4B,EAAAA,EAAI,2BAAA;oDACJC,cAAAA,EAAgB;AAClB,iDAAA;;;sDAGJY,cAAA,CAACkC,eAAAA,EAAAA;AACC,4CAAA,QAAA,gBAAAlC,cAAA,CAACmC,uBAAAA,EAAAA;gDAAWhB,OAAAA,EAAQ,OAAA;0DACjB5D,aAAAA,CAAc;oDACb4B,EAAAA,EAAI,gCAAA;oDACJC,cAAAA,EAAgB;AAClB,iDAAA;;;sDAGJY,cAAA,CAACkC,eAAAA,EAAAA;AACC,4CAAA,QAAA,gBAAAlC,cAAA,CAACmC,uBAAAA,EAAAA;gDAAWhB,OAAAA,EAAQ,OAAA;0DACjB5D,aAAAA,CAAc;oDAAE4B,EAAAA,EAAI,2BAAA;oDAA6BC,cAAAA,EAAgB;AAAU,iDAAA;;;;;;0CAKpFY,cAAA,CAACoC,kBAAAA,EAAAA;AACEhE,gCAAAA,QAAAA,EAAAA,QAAAA,CAASiE,GAAG,CAAC,CAAC3C,OAAAA,iBACbU,eAAA,CAAC6B,eAAAA,EAAAA;;0DACCjC,cAAA,CAACsC,eAAAA,EAAAA;AACC,gDAAA,QAAA,gBAAAlC,eAAA,CAACS,iBAAAA,EAAAA;oDAAKC,GAAAA,EAAK,CAAA;;sEACTd,cAAA,CAACmC,uBAAAA,EAAAA;4DAAWI,SAAAA,EAAU,YAAA;AACnB7C,4DAAAA,QAAAA,EAAAA,OAAAA,CAAQ8C,UAAU,KAChB9C,OAAAA,CAAQ+C,QAAQ,GACb/C,OAAAA,CAAQ+C,QAAQ,CAACC,KAAK,CAAC,CAAA,EAAG,KAC1BnF,aAAAA,CAAc;gEACZ4B,EAAAA,EAAI,iCAAA;gEACJC,cAAAA,EAAgB;6DAClB,CAAC;;wDAERM,OAAAA,CAAQC,OAAO,kBACdK,cAAA,CAAC2C,kBAAAA,EAAAA;sEACEpF,aAAAA,CAAc;gEACb4B,EAAAA,EAAI,2BAAA;gEACJC,cAAAA,EAAgB;AAClB,6DAAA;;;;;0DAKRY,cAAA,CAACsC,eAAAA,EAAAA;AACC,gDAAA,QAAA,gBAAAtC,cAAA,CAACmC,uBAAAA,EAAAA;oDAAWI,SAAAA,EAAU,YAAA;8DACnB7C,OAAAA,CAAQkD,OAAO,iBACd5C,cAAA,CAAC6C,yBAAAA,EAAAA;wDAAaC,SAAAA,EAAW,IAAIC,IAAAA,CAAKrD,OAAAA,CAAQkD,OAAO;AAEjD,qDAAA,CAAA,GAAA;;;0DAIN5C,cAAA,CAACsC,eAAAA,EAAAA;AACC,gDAAA,QAAA,gBAAAtC,cAAA,CAACmC,uBAAAA,EAAAA;oDAAWI,SAAAA,EAAU,YAAA;8DACnB7C,OAAAA,CAAQsD,YAAY,iBACnBhD,cAAA,CAAC6C,yBAAAA,EAAAA;wDAAaC,SAAAA,EAAW,IAAIC,IAAAA,CAAKrD,OAAAA,CAAQsD,YAAY;AAEtD,qDAAA,CAAA,GAAA;;;0DAINhD,cAAA,CAACsC,eAAAA,EAAAA;AACC,gDAAA,QAAA,gBAAAtC,cAAA,CAACa,iBAAAA,EAAAA;oDAAKoC,cAAAA,EAAe,KAAA;oDAAMC,OAAAA,EAAS,CAACC,CAAAA,GAAMA,CAAAA,CAAEC,eAAe,EAAA;4EAC1DhD,eAAA,CAACW,oBAAOC,IAAI,EAAA;;AACV,0EAAAhB,cAAA,CAACe,oBAAOE,OAAO,EAAA;AACb,gEAAA,QAAA,gBAAAjB,cAAA,CAACqD,uBAAAA,EAAAA;AACCC,oEAAAA,KAAAA,EAAO/F,aAAAA,CAAc;wEACnB4B,EAAAA,EAAI,0BAAA;wEACJC,cAAAA,EAAgB;AAClB,qEAAA,CAAA;oEACA+B,OAAAA,EAAQ,OAAA;AAER,oEAAA,QAAA,gBAAAnB,cAAA,CAACqB,aAAAA,EAAAA,EAAAA;;;0EAGLrB,cAAA,CAACsB,2BAAAA,EAAAA;AAAcC,gEAAAA,SAAAA,EAAW,IAAM9B,YAAAA,CAAaC,OAAAA,CAAAA;0EAC1CA,OAAAA,CAAQC,OAAO,GACZpC,aAAAA,CAAc;oEACZ4B,EAAAA,EAAI,yCAAA;oEACJC,cAAAA,EACE;AACJ,iEAAA,CAAA,GACA7B,aAAAA,CAAc;oEACZ4B,EAAAA,EAAI,kCAAA;oEACJC,cAAAA,EACE;AACJ,iEAAA;;;;;;;AAjELM,qCAAAA,EAAAA,OAAAA,CAAQP,EAAE,CAAA;;;;;;;;AA8EnC;;;;"}
@@ -0,0 +1,296 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import * as React from 'react';
3
+ import { Flex, Dialog, Button, Box, Table, Thead, Tr, Th, Typography, Tbody, Td, Badge, IconButton } from '@strapi/design-system';
4
+ import { SignOut } from '@strapi/icons';
5
+ import { useIntl } from 'react-intl';
6
+ import { useNavigate } from 'react-router-dom';
7
+ import { ConfirmDialog } from '../components/ConfirmDialog.mjs';
8
+ import { Layouts } from '../components/Layouts/Layout.mjs';
9
+ import { Page } from '../components/PageHelpers.mjs';
10
+ import { RelativeTime } from '../components/RelativeTime.mjs';
11
+ import { useAuth } from '../features/Auth.mjs';
12
+ import { useNotification } from '../features/Notifications.mjs';
13
+ import { useAPIErrorHandler } from '../hooks/useAPIErrorHandler.mjs';
14
+ import { useGetActiveSessionsQuery, useRevokeSessionMutation, useRevokeAllSessionsMutation } from '../services/auth.mjs';
15
+ import { isBaseQueryError } from '../utils/baseQuery.mjs';
16
+
17
+ /* -------------------------------------------------------------------------------------------------
18
+ * SessionsPage
19
+ * -----------------------------------------------------------------------------------------------*/ const SessionsPage = ()=>{
20
+ const { formatMessage } = useIntl();
21
+ const navigate = useNavigate();
22
+ const { toggleNotification } = useNotification();
23
+ const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();
24
+ const logout = useAuth('SessionsPage', (state)=>state.logout);
25
+ const { data: sessions = [], isLoading, error } = useGetActiveSessionsQuery();
26
+ const [revokeSession] = useRevokeSessionMutation();
27
+ const [revokeAllSessions] = useRevokeAllSessionsMutation();
28
+ const handleLogoutAndRedirect = React.useCallback(async ()=>{
29
+ await logout();
30
+ navigate('/auth/login');
31
+ }, [
32
+ logout,
33
+ navigate
34
+ ]);
35
+ const notifyError = React.useCallback((error)=>{
36
+ toggleNotification({
37
+ type: 'danger',
38
+ message: error && isBaseQueryError(error) ? formatAPIError(error) : formatMessage({
39
+ id: 'notification.error',
40
+ defaultMessage: 'An error occurred'
41
+ })
42
+ });
43
+ }, [
44
+ formatAPIError,
45
+ formatMessage,
46
+ toggleNotification
47
+ ]);
48
+ const runSessionMutation = React.useCallback(async (action, onSuccess)=>{
49
+ try {
50
+ const res = await action();
51
+ if (res && 'error' in res && res.error) {
52
+ notifyError(res.error);
53
+ return;
54
+ }
55
+ await onSuccess();
56
+ } catch {
57
+ notifyError();
58
+ }
59
+ }, [
60
+ notifyError
61
+ ]);
62
+ const handleRevoke = async (session)=>{
63
+ await runSessionMutation(()=>revokeSession(session.id), async ()=>{
64
+ if (session.current) {
65
+ await handleLogoutAndRedirect();
66
+ return;
67
+ }
68
+ toggleNotification({
69
+ type: 'success',
70
+ message: formatMessage({
71
+ id: 'Settings.sessions.revoke.success',
72
+ defaultMessage: 'Session ended'
73
+ })
74
+ });
75
+ });
76
+ };
77
+ const handleRevokeOthers = async ()=>{
78
+ await runSessionMutation(()=>revokeAllSessions({
79
+ keepCurrent: true
80
+ }), ()=>{
81
+ toggleNotification({
82
+ type: 'success',
83
+ message: formatMessage({
84
+ id: 'Settings.sessions.revokeOthers.success',
85
+ defaultMessage: 'Other sessions ended'
86
+ })
87
+ });
88
+ });
89
+ };
90
+ const handleRevokeAll = async ()=>{
91
+ await runSessionMutation(()=>revokeAllSessions(undefined), handleLogoutAndRedirect);
92
+ };
93
+ if (isLoading) {
94
+ return /*#__PURE__*/ jsx(Page.Loading, {});
95
+ }
96
+ if (error) {
97
+ return /*#__PURE__*/ jsx(Page.Error, {});
98
+ }
99
+ return /*#__PURE__*/ jsxs(Page.Main, {
100
+ children: [
101
+ /*#__PURE__*/ jsx(Page.Title, {
102
+ children: formatMessage({
103
+ id: 'Settings.sessions.title',
104
+ defaultMessage: 'Active Devices'
105
+ })
106
+ }),
107
+ /*#__PURE__*/ jsx(Layouts.Header, {
108
+ title: formatMessage({
109
+ id: 'Settings.sessions.title',
110
+ defaultMessage: 'Active Devices'
111
+ }),
112
+ subtitle: formatMessage({
113
+ id: 'Settings.sessions.subtitle',
114
+ defaultMessage: 'These are the devices and sessions currently signed in to your account.'
115
+ }),
116
+ primaryAction: sessions.length > 0 ? /*#__PURE__*/ jsxs(Flex, {
117
+ gap: 2,
118
+ children: [
119
+ sessions.length > 1 ? /*#__PURE__*/ jsxs(Dialog.Root, {
120
+ children: [
121
+ /*#__PURE__*/ jsx(Dialog.Trigger, {
122
+ children: /*#__PURE__*/ jsx(Button, {
123
+ variant: "secondary",
124
+ startIcon: /*#__PURE__*/ jsx(SignOut, {}),
125
+ children: formatMessage({
126
+ id: 'Settings.sessions.revokeOthers',
127
+ defaultMessage: 'Log out of other devices'
128
+ })
129
+ })
130
+ }),
131
+ /*#__PURE__*/ jsx(ConfirmDialog, {
132
+ onConfirm: handleRevokeOthers,
133
+ children: formatMessage({
134
+ id: 'Settings.sessions.revokeOthers.confirm',
135
+ defaultMessage: 'Are you sure? This will end every other active session. You will stay signed in on this device.'
136
+ })
137
+ })
138
+ ]
139
+ }) : null,
140
+ /*#__PURE__*/ jsxs(Dialog.Root, {
141
+ children: [
142
+ /*#__PURE__*/ jsx(Dialog.Trigger, {
143
+ children: /*#__PURE__*/ jsx(Button, {
144
+ variant: "danger-light",
145
+ startIcon: /*#__PURE__*/ jsx(SignOut, {}),
146
+ children: formatMessage({
147
+ id: 'Settings.sessions.revokeAll',
148
+ defaultMessage: 'Log out of all devices'
149
+ })
150
+ })
151
+ }),
152
+ /*#__PURE__*/ jsx(ConfirmDialog, {
153
+ onConfirm: handleRevokeAll,
154
+ children: formatMessage({
155
+ id: 'Settings.sessions.revokeAll.confirm',
156
+ defaultMessage: 'Are you sure? This will end every active session, including this one, and you will need to log in again.'
157
+ })
158
+ })
159
+ ]
160
+ })
161
+ ]
162
+ }) : undefined
163
+ }),
164
+ /*#__PURE__*/ jsx(Layouts.Content, {
165
+ children: /*#__PURE__*/ jsx(Box, {
166
+ background: "neutral0",
167
+ hasRadius: true,
168
+ shadow: "filterShadow",
169
+ children: /*#__PURE__*/ jsxs(Table, {
170
+ colCount: 4,
171
+ rowCount: sessions.length,
172
+ children: [
173
+ /*#__PURE__*/ jsx(Thead, {
174
+ children: /*#__PURE__*/ jsxs(Tr, {
175
+ children: [
176
+ /*#__PURE__*/ jsx(Th, {
177
+ children: /*#__PURE__*/ jsx(Typography, {
178
+ variant: "sigma",
179
+ children: formatMessage({
180
+ id: 'Settings.sessions.device',
181
+ defaultMessage: 'Device'
182
+ })
183
+ })
184
+ }),
185
+ /*#__PURE__*/ jsx(Th, {
186
+ children: /*#__PURE__*/ jsx(Typography, {
187
+ variant: "sigma",
188
+ children: formatMessage({
189
+ id: 'Settings.sessions.loginAt',
190
+ defaultMessage: 'Signed in'
191
+ })
192
+ })
193
+ }),
194
+ /*#__PURE__*/ jsx(Th, {
195
+ children: /*#__PURE__*/ jsx(Typography, {
196
+ variant: "sigma",
197
+ children: formatMessage({
198
+ id: 'Settings.sessions.lastActiveAt',
199
+ defaultMessage: 'Last used'
200
+ })
201
+ })
202
+ }),
203
+ /*#__PURE__*/ jsx(Th, {
204
+ children: /*#__PURE__*/ jsx(Typography, {
205
+ variant: "sigma",
206
+ children: formatMessage({
207
+ id: 'Settings.sessions.actions',
208
+ defaultMessage: 'Actions'
209
+ })
210
+ })
211
+ })
212
+ ]
213
+ })
214
+ }),
215
+ /*#__PURE__*/ jsx(Tbody, {
216
+ children: sessions.map((session)=>/*#__PURE__*/ jsxs(Tr, {
217
+ children: [
218
+ /*#__PURE__*/ jsx(Td, {
219
+ children: /*#__PURE__*/ jsxs(Flex, {
220
+ gap: 2,
221
+ children: [
222
+ /*#__PURE__*/ jsx(Typography, {
223
+ textColor: "neutral800",
224
+ children: session.deviceName ?? (session.deviceId ? session.deviceId.slice(0, 8) : formatMessage({
225
+ id: 'Settings.sessions.unknownDevice',
226
+ defaultMessage: 'Unknown device'
227
+ }))
228
+ }),
229
+ session.current && /*#__PURE__*/ jsx(Badge, {
230
+ children: formatMessage({
231
+ id: 'Settings.sessions.current',
232
+ defaultMessage: 'This device'
233
+ })
234
+ })
235
+ ]
236
+ })
237
+ }),
238
+ /*#__PURE__*/ jsx(Td, {
239
+ children: /*#__PURE__*/ jsx(Typography, {
240
+ textColor: "neutral800",
241
+ children: session.loginAt ? /*#__PURE__*/ jsx(RelativeTime, {
242
+ timestamp: new Date(session.loginAt)
243
+ }) : '-'
244
+ })
245
+ }),
246
+ /*#__PURE__*/ jsx(Td, {
247
+ children: /*#__PURE__*/ jsx(Typography, {
248
+ textColor: "neutral800",
249
+ children: session.lastActiveAt ? /*#__PURE__*/ jsx(RelativeTime, {
250
+ timestamp: new Date(session.lastActiveAt)
251
+ }) : '-'
252
+ })
253
+ }),
254
+ /*#__PURE__*/ jsx(Td, {
255
+ children: /*#__PURE__*/ jsx(Flex, {
256
+ justifyContent: "end",
257
+ onClick: (e)=>e.stopPropagation(),
258
+ children: /*#__PURE__*/ jsxs(Dialog.Root, {
259
+ children: [
260
+ /*#__PURE__*/ jsx(Dialog.Trigger, {
261
+ children: /*#__PURE__*/ jsx(IconButton, {
262
+ label: formatMessage({
263
+ id: 'Settings.sessions.revoke',
264
+ defaultMessage: 'End session'
265
+ }),
266
+ variant: "ghost",
267
+ children: /*#__PURE__*/ jsx(SignOut, {})
268
+ })
269
+ }),
270
+ /*#__PURE__*/ jsx(ConfirmDialog, {
271
+ onConfirm: ()=>handleRevoke(session),
272
+ children: session.current ? formatMessage({
273
+ id: 'Settings.sessions.revoke.confirmCurrent',
274
+ defaultMessage: 'This is the device you are currently using. Ending this session will log you out.'
275
+ }) : formatMessage({
276
+ id: 'Settings.sessions.revoke.confirm',
277
+ defaultMessage: 'Are you sure you want to end this session? The device will need to log in again.'
278
+ })
279
+ })
280
+ ]
281
+ })
282
+ })
283
+ })
284
+ ]
285
+ }, session.id))
286
+ })
287
+ ]
288
+ })
289
+ })
290
+ })
291
+ ]
292
+ });
293
+ };
294
+
295
+ export { SessionsPage };
296
+ //# sourceMappingURL=SessionsPage.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionsPage.mjs","sources":["../../../../../admin/src/pages/SessionsPage.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Badge,\n Box,\n Button,\n Dialog,\n Flex,\n IconButton,\n Table,\n Tbody,\n Td,\n Th,\n Thead,\n Tr,\n Typography,\n} from '@strapi/design-system';\nimport { SignOut } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { useNavigate } from 'react-router-dom';\n\nimport { ConfirmDialog } from '../components/ConfirmDialog';\nimport { Layouts } from '../components/Layouts/Layout';\nimport { Page } from '../components/PageHelpers';\nimport { RelativeTime } from '../components/RelativeTime';\nimport { useAuth } from '../features/Auth';\nimport { useNotification } from '../features/Notifications';\nimport { useAPIErrorHandler } from '../hooks/useAPIErrorHandler';\nimport {\n useGetActiveSessionsQuery,\n useRevokeAllSessionsMutation,\n useRevokeSessionMutation,\n} from '../services/auth';\nimport { isBaseQueryError } from '../utils/baseQuery';\n\nimport type { SanitizedAdminSession } from '../../../shared/contracts/sessions';\n\n/* -------------------------------------------------------------------------------------------------\n * SessionsPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst SessionsPage = () => {\n const { formatMessage } = useIntl();\n const navigate = useNavigate();\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n const logout = useAuth('SessionsPage', (state) => state.logout);\n\n const { data: sessions = [], isLoading, error } = useGetActiveSessionsQuery();\n const [revokeSession] = useRevokeSessionMutation();\n const [revokeAllSessions] = useRevokeAllSessionsMutation();\n\n const handleLogoutAndRedirect = React.useCallback(async () => {\n await logout();\n navigate('/auth/login');\n }, [logout, navigate]);\n\n const notifyError = React.useCallback(\n (error?: unknown) => {\n toggleNotification({\n type: 'danger',\n message:\n error && isBaseQueryError(error)\n ? formatAPIError(error)\n : formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n },\n [formatAPIError, formatMessage, toggleNotification]\n );\n\n const runSessionMutation = React.useCallback(\n async (\n action: () => Promise<{ error?: unknown } | { data: unknown } | void>,\n onSuccess: () => void | Promise<void>\n ) => {\n try {\n const res = await action();\n\n if (res && 'error' in res && res.error) {\n notifyError(res.error);\n return;\n }\n\n await onSuccess();\n } catch {\n notifyError();\n }\n },\n [notifyError]\n );\n\n const handleRevoke = async (session: SanitizedAdminSession) => {\n await runSessionMutation(\n () => revokeSession(session.id),\n async () => {\n if (session.current) {\n await handleLogoutAndRedirect();\n return;\n }\n\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: 'Settings.sessions.revoke.success',\n defaultMessage: 'Session ended',\n }),\n });\n }\n );\n };\n\n const handleRevokeOthers = async () => {\n await runSessionMutation(\n () => revokeAllSessions({ keepCurrent: true }),\n () => {\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: 'Settings.sessions.revokeOthers.success',\n defaultMessage: 'Other sessions ended',\n }),\n });\n }\n );\n };\n\n const handleRevokeAll = async () => {\n await runSessionMutation(() => revokeAllSessions(undefined), handleLogoutAndRedirect);\n };\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n if (error) {\n return <Page.Error />;\n }\n\n return (\n <Page.Main>\n <Page.Title>\n {formatMessage({\n id: 'Settings.sessions.title',\n defaultMessage: 'Active Devices',\n })}\n </Page.Title>\n <Layouts.Header\n title={formatMessage({\n id: 'Settings.sessions.title',\n defaultMessage: 'Active Devices',\n })}\n subtitle={formatMessage({\n id: 'Settings.sessions.subtitle',\n defaultMessage: 'These are the devices and sessions currently signed in to your account.',\n })}\n primaryAction={\n sessions.length > 0 ? (\n <Flex gap={2}>\n {sessions.length > 1 ? (\n <Dialog.Root>\n <Dialog.Trigger>\n <Button variant=\"secondary\" startIcon={<SignOut />}>\n {formatMessage({\n id: 'Settings.sessions.revokeOthers',\n defaultMessage: 'Log out of other devices',\n })}\n </Button>\n </Dialog.Trigger>\n <ConfirmDialog onConfirm={handleRevokeOthers}>\n {formatMessage({\n id: 'Settings.sessions.revokeOthers.confirm',\n defaultMessage:\n 'Are you sure? This will end every other active session. You will stay signed in on this device.',\n })}\n </ConfirmDialog>\n </Dialog.Root>\n ) : null}\n <Dialog.Root>\n <Dialog.Trigger>\n <Button variant=\"danger-light\" startIcon={<SignOut />}>\n {formatMessage({\n id: 'Settings.sessions.revokeAll',\n defaultMessage: 'Log out of all devices',\n })}\n </Button>\n </Dialog.Trigger>\n <ConfirmDialog onConfirm={handleRevokeAll}>\n {formatMessage({\n id: 'Settings.sessions.revokeAll.confirm',\n defaultMessage:\n 'Are you sure? This will end every active session, including this one, and you will need to log in again.',\n })}\n </ConfirmDialog>\n </Dialog.Root>\n </Flex>\n ) : undefined\n }\n />\n <Layouts.Content>\n <Box background=\"neutral0\" hasRadius shadow=\"filterShadow\">\n <Table colCount={4} rowCount={sessions.length}>\n <Thead>\n <Tr>\n <Th>\n <Typography variant=\"sigma\">\n {formatMessage({ id: 'Settings.sessions.device', defaultMessage: 'Device' })}\n </Typography>\n </Th>\n <Th>\n <Typography variant=\"sigma\">\n {formatMessage({\n id: 'Settings.sessions.loginAt',\n defaultMessage: 'Signed in',\n })}\n </Typography>\n </Th>\n <Th>\n <Typography variant=\"sigma\">\n {formatMessage({\n id: 'Settings.sessions.lastActiveAt',\n defaultMessage: 'Last used',\n })}\n </Typography>\n </Th>\n <Th>\n <Typography variant=\"sigma\">\n {formatMessage({ id: 'Settings.sessions.actions', defaultMessage: 'Actions' })}\n </Typography>\n </Th>\n </Tr>\n </Thead>\n <Tbody>\n {sessions.map((session) => (\n <Tr key={session.id}>\n <Td>\n <Flex gap={2}>\n <Typography textColor=\"neutral800\">\n {session.deviceName ??\n (session.deviceId\n ? session.deviceId.slice(0, 8)\n : formatMessage({\n id: 'Settings.sessions.unknownDevice',\n defaultMessage: 'Unknown device',\n }))}\n </Typography>\n {session.current && (\n <Badge>\n {formatMessage({\n id: 'Settings.sessions.current',\n defaultMessage: 'This device',\n })}\n </Badge>\n )}\n </Flex>\n </Td>\n <Td>\n <Typography textColor=\"neutral800\">\n {session.loginAt ? (\n <RelativeTime timestamp={new Date(session.loginAt)} />\n ) : (\n '-'\n )}\n </Typography>\n </Td>\n <Td>\n <Typography textColor=\"neutral800\">\n {session.lastActiveAt ? (\n <RelativeTime timestamp={new Date(session.lastActiveAt)} />\n ) : (\n '-'\n )}\n </Typography>\n </Td>\n <Td>\n <Flex justifyContent=\"end\" onClick={(e) => e.stopPropagation()}>\n <Dialog.Root>\n <Dialog.Trigger>\n <IconButton\n label={formatMessage({\n id: 'Settings.sessions.revoke',\n defaultMessage: 'End session',\n })}\n variant=\"ghost\"\n >\n <SignOut />\n </IconButton>\n </Dialog.Trigger>\n <ConfirmDialog onConfirm={() => handleRevoke(session)}>\n {session.current\n ? formatMessage({\n id: 'Settings.sessions.revoke.confirmCurrent',\n defaultMessage:\n 'This is the device you are currently using. Ending this session will log you out.',\n })\n : formatMessage({\n id: 'Settings.sessions.revoke.confirm',\n defaultMessage:\n 'Are you sure you want to end this session? The device will need to log in again.',\n })}\n </ConfirmDialog>\n </Dialog.Root>\n </Flex>\n </Td>\n </Tr>\n ))}\n </Tbody>\n </Table>\n </Box>\n </Layouts.Content>\n </Page.Main>\n );\n};\n\nexport { SessionsPage };\n"],"names":["SessionsPage","formatMessage","useIntl","navigate","useNavigate","toggleNotification","useNotification","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","logout","useAuth","state","data","sessions","isLoading","error","useGetActiveSessionsQuery","revokeSession","useRevokeSessionMutation","revokeAllSessions","useRevokeAllSessionsMutation","handleLogoutAndRedirect","React","useCallback","notifyError","type","message","isBaseQueryError","id","defaultMessage","runSessionMutation","action","onSuccess","res","handleRevoke","session","current","handleRevokeOthers","keepCurrent","handleRevokeAll","undefined","_jsx","Page","Loading","Error","_jsxs","Main","Title","Layouts","Header","title","subtitle","primaryAction","length","Flex","gap","Dialog","Root","Trigger","Button","variant","startIcon","SignOut","ConfirmDialog","onConfirm","Content","Box","background","hasRadius","shadow","Table","colCount","rowCount","Thead","Tr","Th","Typography","Tbody","map","Td","textColor","deviceName","deviceId","slice","Badge","loginAt","RelativeTime","timestamp","Date","lastActiveAt","justifyContent","onClick","e","stopPropagation","IconButton","label"],"mappings":"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"}
@@ -5,6 +5,7 @@ var designSystem = require('@strapi/design-system');
5
5
  var reactIntl = require('react-intl');
6
6
  var reactRouterDom = require('react-router-dom');
7
7
  var Layout$1 = require('../../components/Layouts/Layout.js');
8
+ var LazyOutlet = require('../../components/LazyOutlet.js');
8
9
  var PageHelpers = require('../../components/PageHelpers.js');
9
10
  var SubNav = require('../../components/SubNav.js');
10
11
  var theme = require('../../constants/theme.js');
@@ -72,7 +73,9 @@ const Layout = ()=>{
72
73
  fallback: "/settings"
73
74
  })
74
75
  }),
75
- /*#__PURE__*/ jsxRuntime.jsx(reactRouterDom.Outlet, {})
76
+ /*#__PURE__*/ jsxRuntime.jsx(LazyOutlet.LazyOutlet, {
77
+ nested: true
78
+ })
76
79
  ]
77
80
  });
78
81
  };
@@ -1 +1 @@
1
- {"version":3,"file":"Layout.js","sources":["../../../../../../admin/src/pages/Settings/Layout.tsx"],"sourcesContent":["import { Box } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { Navigate, Outlet, useMatch } from 'react-router-dom';\n\nimport { Layouts } from '../../components/Layouts/Layout';\nimport { Page } from '../../components/PageHelpers';\nimport { SubNav } from '../../components/SubNav';\nimport { RESPONSIVE_DEFAULT_SPACING } from '../../constants/theme';\nimport { BackButton } from '../../features/BackButton';\nimport { useIsMobile } from '../../hooks/useMediaQuery';\nimport { useSettingsMenu } from '../../hooks/useSettingsMenu';\n\nimport { SettingsNav } from './components/SettingsNav';\n\nconst Layout = () => {\n /**\n * This ensures we're capturing the settingId from the URL\n * but also lets any nesting after that pass.\n */\n const match = useMatch('/settings/:settingId/*');\n const { formatMessage } = useIntl();\n const { isLoading } = useSettingsMenu();\n const isMobile = useIsMobile();\n\n // Since the useSettingsMenu hook can make API calls in order to check the links permissions\n // We need to add a loading state to prevent redirecting the user while permissions are being checked\n if (isLoading) {\n return <Page.Loading />;\n }\n\n // On /settings base route\n if (!match?.params.settingId) {\n // On desktop: redirect to first settings page\n if (!isMobile) {\n return <Navigate to=\"application-infos\" />;\n }\n\n // On mobile: show navigation page\n return (\n <>\n <Page.Title>\n {formatMessage({\n id: 'global.settings',\n defaultMessage: 'Settings',\n })}\n </Page.Title>\n <SubNav.PageWrapper>\n <SettingsNav isFullPage />\n </SubNav.PageWrapper>\n </>\n );\n }\n\n return (\n <Layouts.Root sideNav={<SettingsNav />}>\n <Page.Title>\n {formatMessage({\n id: 'global.settings',\n defaultMessage: 'Settings',\n })}\n </Page.Title>\n <Box\n display={{ initial: 'block', medium: 'none' }}\n paddingLeft={RESPONSIVE_DEFAULT_SPACING}\n paddingRight={RESPONSIVE_DEFAULT_SPACING}\n paddingTop={RESPONSIVE_DEFAULT_SPACING}\n >\n <BackButton fallback=\"/settings\" />\n </Box>\n <Outlet />\n </Layouts.Root>\n );\n};\n\nexport { Layout };\n"],"names":["Layout","match","useMatch","formatMessage","useIntl","isLoading","useSettingsMenu","isMobile","useIsMobile","_jsx","Page","Loading","params","settingId","Navigate","to","_jsxs","_Fragment","Title","id","defaultMessage","SubNav","PageWrapper","SettingsNav","isFullPage","Layouts","Root","sideNav","Box","display","initial","medium","paddingLeft","RESPONSIVE_DEFAULT_SPACING","paddingRight","paddingTop","BackButton","fallback","Outlet"],"mappings":";;;;;;;;;;;;;;;AAcA,MAAMA,MAAAA,GAAS,IAAA;AACb;;;MAIA,MAAMC,QAAQC,uBAAAA,CAAS,wBAAA,CAAA;IACvB,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;IAC1B,MAAM,EAAEC,SAAS,EAAE,GAAGC,+BAAAA,EAAAA;AACtB,IAAA,MAAMC,QAAAA,GAAWC,yBAAAA,EAAAA;;;AAIjB,IAAA,IAAIH,SAAAA,EAAW;QACb,qBAAOI,cAAA,CAACC,iBAAKC,OAAO,EAAA,EAAA,CAAA;AACtB,IAAA;;IAGA,IAAI,CAACV,KAAAA,EAAOW,MAAAA,CAAOC,SAAAA,EAAW;;AAE5B,QAAA,IAAI,CAACN,QAAAA,EAAU;AACb,YAAA,qBAAOE,cAAA,CAACK,uBAAAA,EAAAA;gBAASC,EAAAA,EAAG;;AACtB,QAAA;;QAGA,qBACEC,eAAA,CAAAC,mBAAA,EAAA;;AACE,8BAAAR,cAAA,CAACC,iBAAKQ,KAAK,EAAA;8BACRf,aAAAA,CAAc;wBACbgB,EAAAA,EAAI,iBAAA;wBACJC,cAAAA,EAAgB;AAClB,qBAAA;;AAEF,8BAAAX,cAAA,CAACY,cAAOC,WAAW,EAAA;AACjB,oBAAA,QAAA,gBAAAb,cAAA,CAACc,uBAAAA,EAAAA;wBAAYC,UAAU,EAAA;;;;;AAI/B,IAAA;IAEA,qBACER,eAAA,CAACS,iBAAQC,IAAI,EAAA;AAACC,QAAAA,OAAAA,gBAASlB,cAAA,CAACc,uBAAAA,EAAAA,EAAAA,CAAAA;;AACtB,0BAAAd,cAAA,CAACC,iBAAKQ,KAAK,EAAA;0BACRf,aAAAA,CAAc;oBACbgB,EAAAA,EAAI,iBAAA;oBACJC,cAAAA,EAAgB;AAClB,iBAAA;;0BAEFX,cAAA,CAACmB,gBAAAA,EAAAA;gBACCC,OAAAA,EAAS;oBAAEC,OAAAA,EAAS,OAAA;oBAASC,MAAAA,EAAQ;AAAO,iBAAA;gBAC5CC,WAAAA,EAAaC,gCAAAA;gBACbC,YAAAA,EAAcD,gCAAAA;gBACdE,UAAAA,EAAYF,gCAAAA;AAEZ,gBAAA,QAAA,gBAAAxB,cAAA,CAAC2B,qBAAAA,EAAAA;oBAAWC,QAAAA,EAAS;;;0BAEvB5B,cAAA,CAAC6B,qBAAAA,EAAAA,EAAAA;;;AAGP;;;;"}
1
+ {"version":3,"file":"Layout.js","sources":["../../../../../../admin/src/pages/Settings/Layout.tsx"],"sourcesContent":["import { Box } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { Navigate, useMatch } from 'react-router-dom';\n\nimport { Layouts } from '../../components/Layouts/Layout';\nimport { LazyOutlet } from '../../components/LazyOutlet';\nimport { Page } from '../../components/PageHelpers';\nimport { SubNav } from '../../components/SubNav';\nimport { RESPONSIVE_DEFAULT_SPACING } from '../../constants/theme';\nimport { BackButton } from '../../features/BackButton';\nimport { useIsMobile } from '../../hooks/useMediaQuery';\nimport { useSettingsMenu } from '../../hooks/useSettingsMenu';\n\nimport { SettingsNav } from './components/SettingsNav';\n\nconst Layout = () => {\n /**\n * This ensures we're capturing the settingId from the URL\n * but also lets any nesting after that pass.\n */\n const match = useMatch('/settings/:settingId/*');\n const { formatMessage } = useIntl();\n const { isLoading } = useSettingsMenu();\n const isMobile = useIsMobile();\n\n // Since the useSettingsMenu hook can make API calls in order to check the links permissions\n // We need to add a loading state to prevent redirecting the user while permissions are being checked\n if (isLoading) {\n return <Page.Loading />;\n }\n\n // On /settings base route\n if (!match?.params.settingId) {\n // On desktop: redirect to first settings page\n if (!isMobile) {\n return <Navigate to=\"application-infos\" />;\n }\n\n // On mobile: show navigation page\n return (\n <>\n <Page.Title>\n {formatMessage({\n id: 'global.settings',\n defaultMessage: 'Settings',\n })}\n </Page.Title>\n <SubNav.PageWrapper>\n <SettingsNav isFullPage />\n </SubNav.PageWrapper>\n </>\n );\n }\n\n return (\n <Layouts.Root sideNav={<SettingsNav />}>\n <Page.Title>\n {formatMessage({\n id: 'global.settings',\n defaultMessage: 'Settings',\n })}\n </Page.Title>\n <Box\n display={{ initial: 'block', medium: 'none' }}\n paddingLeft={RESPONSIVE_DEFAULT_SPACING}\n paddingRight={RESPONSIVE_DEFAULT_SPACING}\n paddingTop={RESPONSIVE_DEFAULT_SPACING}\n >\n <BackButton fallback=\"/settings\" />\n </Box>\n <LazyOutlet nested />\n </Layouts.Root>\n );\n};\n\nexport { Layout };\n"],"names":["Layout","match","useMatch","formatMessage","useIntl","isLoading","useSettingsMenu","isMobile","useIsMobile","_jsx","Page","Loading","params","settingId","Navigate","to","_jsxs","_Fragment","Title","id","defaultMessage","SubNav","PageWrapper","SettingsNav","isFullPage","Layouts","Root","sideNav","Box","display","initial","medium","paddingLeft","RESPONSIVE_DEFAULT_SPACING","paddingRight","paddingTop","BackButton","fallback","LazyOutlet","nested"],"mappings":";;;;;;;;;;;;;;;;AAeA,MAAMA,MAAAA,GAAS,IAAA;AACb;;;MAIA,MAAMC,QAAQC,uBAAAA,CAAS,wBAAA,CAAA;IACvB,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;IAC1B,MAAM,EAAEC,SAAS,EAAE,GAAGC,+BAAAA,EAAAA;AACtB,IAAA,MAAMC,QAAAA,GAAWC,yBAAAA,EAAAA;;;AAIjB,IAAA,IAAIH,SAAAA,EAAW;QACb,qBAAOI,cAAA,CAACC,iBAAKC,OAAO,EAAA,EAAA,CAAA;AACtB,IAAA;;IAGA,IAAI,CAACV,KAAAA,EAAOW,MAAAA,CAAOC,SAAAA,EAAW;;AAE5B,QAAA,IAAI,CAACN,QAAAA,EAAU;AACb,YAAA,qBAAOE,cAAA,CAACK,uBAAAA,EAAAA;gBAASC,EAAAA,EAAG;;AACtB,QAAA;;QAGA,qBACEC,eAAA,CAAAC,mBAAA,EAAA;;AACE,8BAAAR,cAAA,CAACC,iBAAKQ,KAAK,EAAA;8BACRf,aAAAA,CAAc;wBACbgB,EAAAA,EAAI,iBAAA;wBACJC,cAAAA,EAAgB;AAClB,qBAAA;;AAEF,8BAAAX,cAAA,CAACY,cAAOC,WAAW,EAAA;AACjB,oBAAA,QAAA,gBAAAb,cAAA,CAACc,uBAAAA,EAAAA;wBAAYC,UAAU,EAAA;;;;;AAI/B,IAAA;IAEA,qBACER,eAAA,CAACS,iBAAQC,IAAI,EAAA;AAACC,QAAAA,OAAAA,gBAASlB,cAAA,CAACc,uBAAAA,EAAAA,EAAAA,CAAAA;;AACtB,0BAAAd,cAAA,CAACC,iBAAKQ,KAAK,EAAA;0BACRf,aAAAA,CAAc;oBACbgB,EAAAA,EAAI,iBAAA;oBACJC,cAAAA,EAAgB;AAClB,iBAAA;;0BAEFX,cAAA,CAACmB,gBAAAA,EAAAA;gBACCC,OAAAA,EAAS;oBAAEC,OAAAA,EAAS,OAAA;oBAASC,MAAAA,EAAQ;AAAO,iBAAA;gBAC5CC,WAAAA,EAAaC,gCAAAA;gBACbC,YAAAA,EAAcD,gCAAAA;gBACdE,UAAAA,EAAYF,gCAAAA;AAEZ,gBAAA,QAAA,gBAAAxB,cAAA,CAAC2B,qBAAAA,EAAAA;oBAAWC,QAAAA,EAAS;;;0BAEvB5B,cAAA,CAAC6B,qBAAAA,EAAAA;gBAAWC,MAAM,EAAA;;;;AAGxB;;;;"}
@@ -1,8 +1,9 @@
1
1
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
2
  import { Box } from '@strapi/design-system';
3
3
  import { useIntl } from 'react-intl';
4
- import { useMatch, Navigate, Outlet } from 'react-router-dom';
4
+ import { useMatch, Navigate } from 'react-router-dom';
5
5
  import { Layouts } from '../../components/Layouts/Layout.mjs';
6
+ import { LazyOutlet } from '../../components/LazyOutlet.mjs';
6
7
  import { Page } from '../../components/PageHelpers.mjs';
7
8
  import { SubNav } from '../../components/SubNav.mjs';
8
9
  import { RESPONSIVE_DEFAULT_SPACING } from '../../constants/theme.mjs';
@@ -70,7 +71,9 @@ const Layout = ()=>{
70
71
  fallback: "/settings"
71
72
  })
72
73
  }),
73
- /*#__PURE__*/ jsx(Outlet, {})
74
+ /*#__PURE__*/ jsx(LazyOutlet, {
75
+ nested: true
76
+ })
74
77
  ]
75
78
  });
76
79
  };
@@ -1 +1 @@
1
- {"version":3,"file":"Layout.mjs","sources":["../../../../../../admin/src/pages/Settings/Layout.tsx"],"sourcesContent":["import { Box } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { Navigate, Outlet, useMatch } from 'react-router-dom';\n\nimport { Layouts } from '../../components/Layouts/Layout';\nimport { Page } from '../../components/PageHelpers';\nimport { SubNav } from '../../components/SubNav';\nimport { RESPONSIVE_DEFAULT_SPACING } from '../../constants/theme';\nimport { BackButton } from '../../features/BackButton';\nimport { useIsMobile } from '../../hooks/useMediaQuery';\nimport { useSettingsMenu } from '../../hooks/useSettingsMenu';\n\nimport { SettingsNav } from './components/SettingsNav';\n\nconst Layout = () => {\n /**\n * This ensures we're capturing the settingId from the URL\n * but also lets any nesting after that pass.\n */\n const match = useMatch('/settings/:settingId/*');\n const { formatMessage } = useIntl();\n const { isLoading } = useSettingsMenu();\n const isMobile = useIsMobile();\n\n // Since the useSettingsMenu hook can make API calls in order to check the links permissions\n // We need to add a loading state to prevent redirecting the user while permissions are being checked\n if (isLoading) {\n return <Page.Loading />;\n }\n\n // On /settings base route\n if (!match?.params.settingId) {\n // On desktop: redirect to first settings page\n if (!isMobile) {\n return <Navigate to=\"application-infos\" />;\n }\n\n // On mobile: show navigation page\n return (\n <>\n <Page.Title>\n {formatMessage({\n id: 'global.settings',\n defaultMessage: 'Settings',\n })}\n </Page.Title>\n <SubNav.PageWrapper>\n <SettingsNav isFullPage />\n </SubNav.PageWrapper>\n </>\n );\n }\n\n return (\n <Layouts.Root sideNav={<SettingsNav />}>\n <Page.Title>\n {formatMessage({\n id: 'global.settings',\n defaultMessage: 'Settings',\n })}\n </Page.Title>\n <Box\n display={{ initial: 'block', medium: 'none' }}\n paddingLeft={RESPONSIVE_DEFAULT_SPACING}\n paddingRight={RESPONSIVE_DEFAULT_SPACING}\n paddingTop={RESPONSIVE_DEFAULT_SPACING}\n >\n <BackButton fallback=\"/settings\" />\n </Box>\n <Outlet />\n </Layouts.Root>\n );\n};\n\nexport { Layout };\n"],"names":["Layout","match","useMatch","formatMessage","useIntl","isLoading","useSettingsMenu","isMobile","useIsMobile","_jsx","Page","Loading","params","settingId","Navigate","to","_jsxs","_Fragment","Title","id","defaultMessage","SubNav","PageWrapper","SettingsNav","isFullPage","Layouts","Root","sideNav","Box","display","initial","medium","paddingLeft","RESPONSIVE_DEFAULT_SPACING","paddingRight","paddingTop","BackButton","fallback","Outlet"],"mappings":";;;;;;;;;;;;;AAcA,MAAMA,MAAAA,GAAS,IAAA;AACb;;;MAIA,MAAMC,QAAQC,QAAAA,CAAS,wBAAA,CAAA;IACvB,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;IAC1B,MAAM,EAAEC,SAAS,EAAE,GAAGC,eAAAA,EAAAA;AACtB,IAAA,MAAMC,QAAAA,GAAWC,WAAAA,EAAAA;;;AAIjB,IAAA,IAAIH,SAAAA,EAAW;QACb,qBAAOI,GAAA,CAACC,KAAKC,OAAO,EAAA,EAAA,CAAA;AACtB,IAAA;;IAGA,IAAI,CAACV,KAAAA,EAAOW,MAAAA,CAAOC,SAAAA,EAAW;;AAE5B,QAAA,IAAI,CAACN,QAAAA,EAAU;AACb,YAAA,qBAAOE,GAAA,CAACK,QAAAA,EAAAA;gBAASC,EAAAA,EAAG;;AACtB,QAAA;;QAGA,qBACEC,IAAA,CAAAC,QAAA,EAAA;;AACE,8BAAAR,GAAA,CAACC,KAAKQ,KAAK,EAAA;8BACRf,aAAAA,CAAc;wBACbgB,EAAAA,EAAI,iBAAA;wBACJC,cAAAA,EAAgB;AAClB,qBAAA;;AAEF,8BAAAX,GAAA,CAACY,OAAOC,WAAW,EAAA;AACjB,oBAAA,QAAA,gBAAAb,GAAA,CAACc,WAAAA,EAAAA;wBAAYC,UAAU,EAAA;;;;;AAI/B,IAAA;IAEA,qBACER,IAAA,CAACS,QAAQC,IAAI,EAAA;AAACC,QAAAA,OAAAA,gBAASlB,GAAA,CAACc,WAAAA,EAAAA,EAAAA,CAAAA;;AACtB,0BAAAd,GAAA,CAACC,KAAKQ,KAAK,EAAA;0BACRf,aAAAA,CAAc;oBACbgB,EAAAA,EAAI,iBAAA;oBACJC,cAAAA,EAAgB;AAClB,iBAAA;;0BAEFX,GAAA,CAACmB,GAAAA,EAAAA;gBACCC,OAAAA,EAAS;oBAAEC,OAAAA,EAAS,OAAA;oBAASC,MAAAA,EAAQ;AAAO,iBAAA;gBAC5CC,WAAAA,EAAaC,0BAAAA;gBACbC,YAAAA,EAAcD,0BAAAA;gBACdE,UAAAA,EAAYF,0BAAAA;AAEZ,gBAAA,QAAA,gBAAAxB,GAAA,CAAC2B,UAAAA,EAAAA;oBAAWC,QAAAA,EAAS;;;0BAEvB5B,GAAA,CAAC6B,MAAAA,EAAAA,EAAAA;;;AAGP;;;;"}
1
+ {"version":3,"file":"Layout.mjs","sources":["../../../../../../admin/src/pages/Settings/Layout.tsx"],"sourcesContent":["import { Box } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { Navigate, useMatch } from 'react-router-dom';\n\nimport { Layouts } from '../../components/Layouts/Layout';\nimport { LazyOutlet } from '../../components/LazyOutlet';\nimport { Page } from '../../components/PageHelpers';\nimport { SubNav } from '../../components/SubNav';\nimport { RESPONSIVE_DEFAULT_SPACING } from '../../constants/theme';\nimport { BackButton } from '../../features/BackButton';\nimport { useIsMobile } from '../../hooks/useMediaQuery';\nimport { useSettingsMenu } from '../../hooks/useSettingsMenu';\n\nimport { SettingsNav } from './components/SettingsNav';\n\nconst Layout = () => {\n /**\n * This ensures we're capturing the settingId from the URL\n * but also lets any nesting after that pass.\n */\n const match = useMatch('/settings/:settingId/*');\n const { formatMessage } = useIntl();\n const { isLoading } = useSettingsMenu();\n const isMobile = useIsMobile();\n\n // Since the useSettingsMenu hook can make API calls in order to check the links permissions\n // We need to add a loading state to prevent redirecting the user while permissions are being checked\n if (isLoading) {\n return <Page.Loading />;\n }\n\n // On /settings base route\n if (!match?.params.settingId) {\n // On desktop: redirect to first settings page\n if (!isMobile) {\n return <Navigate to=\"application-infos\" />;\n }\n\n // On mobile: show navigation page\n return (\n <>\n <Page.Title>\n {formatMessage({\n id: 'global.settings',\n defaultMessage: 'Settings',\n })}\n </Page.Title>\n <SubNav.PageWrapper>\n <SettingsNav isFullPage />\n </SubNav.PageWrapper>\n </>\n );\n }\n\n return (\n <Layouts.Root sideNav={<SettingsNav />}>\n <Page.Title>\n {formatMessage({\n id: 'global.settings',\n defaultMessage: 'Settings',\n })}\n </Page.Title>\n <Box\n display={{ initial: 'block', medium: 'none' }}\n paddingLeft={RESPONSIVE_DEFAULT_SPACING}\n paddingRight={RESPONSIVE_DEFAULT_SPACING}\n paddingTop={RESPONSIVE_DEFAULT_SPACING}\n >\n <BackButton fallback=\"/settings\" />\n </Box>\n <LazyOutlet nested />\n </Layouts.Root>\n );\n};\n\nexport { Layout };\n"],"names":["Layout","match","useMatch","formatMessage","useIntl","isLoading","useSettingsMenu","isMobile","useIsMobile","_jsx","Page","Loading","params","settingId","Navigate","to","_jsxs","_Fragment","Title","id","defaultMessage","SubNav","PageWrapper","SettingsNav","isFullPage","Layouts","Root","sideNav","Box","display","initial","medium","paddingLeft","RESPONSIVE_DEFAULT_SPACING","paddingRight","paddingTop","BackButton","fallback","LazyOutlet","nested"],"mappings":";;;;;;;;;;;;;;AAeA,MAAMA,MAAAA,GAAS,IAAA;AACb;;;MAIA,MAAMC,QAAQC,QAAAA,CAAS,wBAAA,CAAA;IACvB,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;IAC1B,MAAM,EAAEC,SAAS,EAAE,GAAGC,eAAAA,EAAAA;AACtB,IAAA,MAAMC,QAAAA,GAAWC,WAAAA,EAAAA;;;AAIjB,IAAA,IAAIH,SAAAA,EAAW;QACb,qBAAOI,GAAA,CAACC,KAAKC,OAAO,EAAA,EAAA,CAAA;AACtB,IAAA;;IAGA,IAAI,CAACV,KAAAA,EAAOW,MAAAA,CAAOC,SAAAA,EAAW;;AAE5B,QAAA,IAAI,CAACN,QAAAA,EAAU;AACb,YAAA,qBAAOE,GAAA,CAACK,QAAAA,EAAAA;gBAASC,EAAAA,EAAG;;AACtB,QAAA;;QAGA,qBACEC,IAAA,CAAAC,QAAA,EAAA;;AACE,8BAAAR,GAAA,CAACC,KAAKQ,KAAK,EAAA;8BACRf,aAAAA,CAAc;wBACbgB,EAAAA,EAAI,iBAAA;wBACJC,cAAAA,EAAgB;AAClB,qBAAA;;AAEF,8BAAAX,GAAA,CAACY,OAAOC,WAAW,EAAA;AACjB,oBAAA,QAAA,gBAAAb,GAAA,CAACc,WAAAA,EAAAA;wBAAYC,UAAU,EAAA;;;;;AAI/B,IAAA;IAEA,qBACER,IAAA,CAACS,QAAQC,IAAI,EAAA;AAACC,QAAAA,OAAAA,gBAASlB,GAAA,CAACc,WAAAA,EAAAA,EAAAA,CAAAA;;AACtB,0BAAAd,GAAA,CAACC,KAAKQ,KAAK,EAAA;0BACRf,aAAAA,CAAc;oBACbgB,EAAAA,EAAI,iBAAA;oBACJC,cAAAA,EAAgB;AAClB,iBAAA;;0BAEFX,GAAA,CAACmB,GAAAA,EAAAA;gBACCC,OAAAA,EAAS;oBAAEC,OAAAA,EAAS,OAAA;oBAASC,MAAAA,EAAQ;AAAO,iBAAA;gBAC5CC,WAAAA,EAAaC,0BAAAA;gBACbC,YAAAA,EAAcD,0BAAAA;gBACdE,UAAAA,EAAYF,0BAAAA;AAEZ,gBAAA,QAAA,gBAAAxB,GAAA,CAAC2B,UAAAA,EAAAA;oBAAWC,QAAAA,EAAS;;;0BAEvB5B,GAAA,CAAC6B,UAAAA,EAAAA;gBAAWC,MAAM,EAAA;;;;AAGxB;;;;"}
@@ -200,6 +200,7 @@ const AIUageDataCE = ()=>null;
200
200
  href: `https://github.com/strapi/strapi/releases/tag/${latestStrapiReleaseTag}`,
201
201
  endIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.ExternalLink, {}),
202
202
  target: "_blank",
203
+ rel: "noopener noreferrer",
203
204
  children: formatMessage({
204
205
  id: 'Settings.application.link-upgrade',
205
206
  defaultMessage: 'Upgrade your admin panel'