@strapi/admin 5.26.0 → 5.28.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 (318) hide show
  1. package/dist/admin/admin/src/components/DragLayer.js +67 -0
  2. package/dist/admin/admin/src/components/DragLayer.js.map +1 -0
  3. package/dist/admin/admin/src/components/DragLayer.mjs +64 -0
  4. package/dist/admin/admin/src/components/DragLayer.mjs.map +1 -0
  5. package/dist/admin/admin/src/components/ErrorElement.js +10 -3
  6. package/dist/admin/admin/src/components/ErrorElement.js.map +1 -1
  7. package/dist/admin/admin/src/components/ErrorElement.mjs +10 -3
  8. package/dist/admin/admin/src/components/ErrorElement.mjs.map +1 -1
  9. package/dist/admin/admin/src/components/GapDropZone.js +292 -0
  10. package/dist/admin/admin/src/components/GapDropZone.js.map +1 -0
  11. package/dist/admin/admin/src/components/GapDropZone.mjs +268 -0
  12. package/dist/admin/admin/src/components/GapDropZone.mjs.map +1 -0
  13. package/dist/admin/admin/src/components/GuidedTour/Context.js +15 -0
  14. package/dist/admin/admin/src/components/GuidedTour/Context.js.map +1 -1
  15. package/dist/admin/admin/src/components/GuidedTour/Context.mjs +15 -0
  16. package/dist/admin/admin/src/components/GuidedTour/Context.mjs.map +1 -1
  17. package/dist/admin/admin/src/components/GuidedTour/GuidedTourProvider.js +15 -0
  18. package/dist/admin/admin/src/components/GuidedTour/GuidedTourProvider.js.map +1 -0
  19. package/dist/admin/admin/src/components/GuidedTour/GuidedTourProvider.mjs +13 -0
  20. package/dist/admin/admin/src/components/GuidedTour/GuidedTourProvider.mjs.map +1 -0
  21. package/dist/admin/admin/src/components/GuidedTour/Overview.js +2 -1
  22. package/dist/admin/admin/src/components/GuidedTour/Overview.js.map +1 -1
  23. package/dist/admin/admin/src/components/GuidedTour/Overview.mjs +2 -1
  24. package/dist/admin/admin/src/components/GuidedTour/Overview.mjs.map +1 -1
  25. package/dist/admin/admin/src/components/GuidedTour/Steps/ContentTypeBuilderSteps.js +2 -2
  26. package/dist/admin/admin/src/components/GuidedTour/Steps/ContentTypeBuilderSteps.js.map +1 -1
  27. package/dist/admin/admin/src/components/GuidedTour/Steps/ContentTypeBuilderSteps.mjs +2 -2
  28. package/dist/admin/admin/src/components/GuidedTour/Steps/ContentTypeBuilderSteps.mjs.map +1 -1
  29. package/dist/admin/admin/src/components/GuidedTour/Tours.js +1 -1
  30. package/dist/admin/admin/src/components/GuidedTour/Tours.js.map +1 -1
  31. package/dist/admin/admin/src/components/GuidedTour/Tours.mjs +1 -1
  32. package/dist/admin/admin/src/components/GuidedTour/Tours.mjs.map +1 -1
  33. package/dist/admin/admin/src/components/Layouts/ActionLayout.js +3 -2
  34. package/dist/admin/admin/src/components/Layouts/ActionLayout.js.map +1 -1
  35. package/dist/admin/admin/src/components/Layouts/ActionLayout.mjs +3 -2
  36. package/dist/admin/admin/src/components/Layouts/ActionLayout.mjs.map +1 -1
  37. package/dist/admin/admin/src/components/Layouts/ContentLayout.js +3 -2
  38. package/dist/admin/admin/src/components/Layouts/ContentLayout.js.map +1 -1
  39. package/dist/admin/admin/src/components/Layouts/ContentLayout.mjs +3 -2
  40. package/dist/admin/admin/src/components/Layouts/ContentLayout.mjs.map +1 -1
  41. package/dist/admin/admin/src/components/Layouts/HeaderLayout.js +65 -32
  42. package/dist/admin/admin/src/components/Layouts/HeaderLayout.js.map +1 -1
  43. package/dist/admin/admin/src/components/Layouts/HeaderLayout.mjs +66 -33
  44. package/dist/admin/admin/src/components/Layouts/HeaderLayout.mjs.map +1 -1
  45. package/dist/admin/admin/src/components/Layouts/Layout.js +29 -6
  46. package/dist/admin/admin/src/components/Layouts/Layout.js.map +1 -1
  47. package/dist/admin/admin/src/components/Layouts/Layout.mjs +30 -7
  48. package/dist/admin/admin/src/components/Layouts/Layout.mjs.map +1 -1
  49. package/dist/admin/admin/src/components/LeftMenu.js +147 -92
  50. package/dist/admin/admin/src/components/LeftMenu.js.map +1 -1
  51. package/dist/admin/admin/src/components/LeftMenu.mjs +131 -95
  52. package/dist/admin/admin/src/components/LeftMenu.mjs.map +1 -1
  53. package/dist/admin/admin/src/components/MainNav/MainNav.js +20 -6
  54. package/dist/admin/admin/src/components/MainNav/MainNav.js.map +1 -1
  55. package/dist/admin/admin/src/components/MainNav/MainNav.mjs +20 -6
  56. package/dist/admin/admin/src/components/MainNav/MainNav.mjs.map +1 -1
  57. package/dist/admin/admin/src/components/MainNav/MainNavLinks.js +157 -0
  58. package/dist/admin/admin/src/components/MainNav/MainNavLinks.js.map +1 -0
  59. package/dist/admin/admin/src/components/MainNav/MainNavLinks.mjs +154 -0
  60. package/dist/admin/admin/src/components/MainNav/MainNavLinks.mjs.map +1 -0
  61. package/dist/admin/admin/src/components/MainNav/NavBurgerMenu.js +65 -0
  62. package/dist/admin/admin/src/components/MainNav/NavBurgerMenu.js.map +1 -0
  63. package/dist/admin/admin/src/components/MainNav/NavBurgerMenu.mjs +63 -0
  64. package/dist/admin/admin/src/components/MainNav/NavBurgerMenu.mjs.map +1 -0
  65. package/dist/admin/admin/src/components/MainNav/NavLink.js +2 -1
  66. package/dist/admin/admin/src/components/MainNav/NavLink.js.map +1 -1
  67. package/dist/admin/admin/src/components/MainNav/NavLink.mjs +2 -1
  68. package/dist/admin/admin/src/components/MainNav/NavLink.mjs.map +1 -1
  69. package/dist/admin/admin/src/components/MainNav/NavUser.js +39 -22
  70. package/dist/admin/admin/src/components/MainNav/NavUser.js.map +1 -1
  71. package/dist/admin/admin/src/components/MainNav/NavUser.mjs +39 -22
  72. package/dist/admin/admin/src/components/MainNav/NavUser.mjs.map +1 -1
  73. package/dist/admin/admin/src/components/MainNav/TrialCountdown.js +8 -1
  74. package/dist/admin/admin/src/components/MainNav/TrialCountdown.js.map +1 -1
  75. package/dist/admin/admin/src/components/MainNav/TrialCountdown.mjs +9 -2
  76. package/dist/admin/admin/src/components/MainNav/TrialCountdown.mjs.map +1 -1
  77. package/dist/admin/admin/src/components/NpsSurvey.js +159 -119
  78. package/dist/admin/admin/src/components/NpsSurvey.js.map +1 -1
  79. package/dist/admin/admin/src/components/NpsSurvey.mjs +160 -120
  80. package/dist/admin/admin/src/components/NpsSurvey.mjs.map +1 -1
  81. package/dist/admin/admin/src/components/PageHelpers.js +1 -1
  82. package/dist/admin/admin/src/components/PageHelpers.js.map +1 -1
  83. package/dist/admin/admin/src/components/PageHelpers.mjs +1 -1
  84. package/dist/admin/admin/src/components/PageHelpers.mjs.map +1 -1
  85. package/dist/admin/admin/src/components/Providers.js +2 -4
  86. package/dist/admin/admin/src/components/Providers.js.map +1 -1
  87. package/dist/admin/admin/src/components/Providers.mjs +2 -4
  88. package/dist/admin/admin/src/components/Providers.mjs.map +1 -1
  89. package/dist/admin/admin/src/components/ResizeIndicator.js +353 -0
  90. package/dist/admin/admin/src/components/ResizeIndicator.js.map +1 -0
  91. package/dist/admin/admin/src/components/ResizeIndicator.mjs +332 -0
  92. package/dist/admin/admin/src/components/ResizeIndicator.mjs.map +1 -0
  93. package/dist/admin/admin/src/components/SubNav.js +98 -33
  94. package/dist/admin/admin/src/components/SubNav.js.map +1 -1
  95. package/dist/admin/admin/src/components/SubNav.mjs +99 -34
  96. package/dist/admin/admin/src/components/SubNav.mjs.map +1 -1
  97. package/dist/admin/admin/src/components/UpsellBanner.js +3 -2
  98. package/dist/admin/admin/src/components/UpsellBanner.js.map +1 -1
  99. package/dist/admin/admin/src/components/UpsellBanner.mjs +3 -2
  100. package/dist/admin/admin/src/components/UpsellBanner.mjs.map +1 -1
  101. package/dist/admin/admin/src/components/WidgetRoot.js +216 -0
  102. package/dist/admin/admin/src/components/WidgetRoot.js.map +1 -0
  103. package/dist/admin/admin/src/components/WidgetRoot.mjs +195 -0
  104. package/dist/admin/admin/src/components/WidgetRoot.mjs.map +1 -0
  105. package/dist/admin/admin/src/constants/theme.js +12 -0
  106. package/dist/admin/admin/src/constants/theme.js.map +1 -0
  107. package/dist/admin/admin/src/constants/theme.mjs +9 -0
  108. package/dist/admin/admin/src/constants/theme.mjs.map +1 -0
  109. package/dist/admin/admin/src/features/Notifications.js +14 -7
  110. package/dist/admin/admin/src/features/Notifications.js.map +1 -1
  111. package/dist/admin/admin/src/features/Notifications.mjs +15 -8
  112. package/dist/admin/admin/src/features/Notifications.mjs.map +1 -1
  113. package/dist/admin/admin/src/features/Tracking.js +5 -1
  114. package/dist/admin/admin/src/features/Tracking.js.map +1 -1
  115. package/dist/admin/admin/src/features/Tracking.mjs +5 -1
  116. package/dist/admin/admin/src/features/Tracking.mjs.map +1 -1
  117. package/dist/admin/admin/src/features/Widgets.js +276 -0
  118. package/dist/admin/admin/src/features/Widgets.js.map +1 -0
  119. package/dist/admin/admin/src/features/Widgets.mjs +255 -0
  120. package/dist/admin/admin/src/features/Widgets.mjs.map +1 -0
  121. package/dist/admin/admin/src/hooks/useAPIErrorHandler.js +1 -1
  122. package/dist/admin/admin/src/hooks/useAPIErrorHandler.js.map +1 -1
  123. package/dist/admin/admin/src/hooks/useAPIErrorHandler.mjs +1 -1
  124. package/dist/admin/admin/src/hooks/useAPIErrorHandler.mjs.map +1 -1
  125. package/dist/admin/admin/src/hooks/useDeviceType.js +43 -0
  126. package/dist/admin/admin/src/hooks/useDeviceType.js.map +1 -0
  127. package/dist/admin/admin/src/hooks/useDeviceType.mjs +22 -0
  128. package/dist/admin/admin/src/hooks/useDeviceType.mjs.map +1 -0
  129. package/dist/admin/admin/src/hooks/useMediaQuery.js +70 -0
  130. package/dist/admin/admin/src/hooks/useMediaQuery.js.map +1 -0
  131. package/dist/admin/admin/src/hooks/useMediaQuery.mjs +46 -0
  132. package/dist/admin/admin/src/hooks/useMediaQuery.mjs.map +1 -0
  133. package/dist/admin/admin/src/hooks/useMenu.js +19 -0
  134. package/dist/admin/admin/src/hooks/useMenu.js.map +1 -1
  135. package/dist/admin/admin/src/hooks/useMenu.mjs +19 -0
  136. package/dist/admin/admin/src/hooks/useMenu.mjs.map +1 -1
  137. package/dist/admin/admin/src/layouts/AuthenticatedLayout.js +15 -2
  138. package/dist/admin/admin/src/layouts/AuthenticatedLayout.js.map +1 -1
  139. package/dist/admin/admin/src/layouts/AuthenticatedLayout.mjs +15 -2
  140. package/dist/admin/admin/src/layouts/AuthenticatedLayout.mjs.map +1 -1
  141. package/dist/admin/admin/src/layouts/UnauthenticatedLayout.js +11 -7
  142. package/dist/admin/admin/src/layouts/UnauthenticatedLayout.js.map +1 -1
  143. package/dist/admin/admin/src/layouts/UnauthenticatedLayout.mjs +11 -7
  144. package/dist/admin/admin/src/layouts/UnauthenticatedLayout.mjs.map +1 -1
  145. package/dist/admin/admin/src/pages/Auth/components/Login.js +3 -0
  146. package/dist/admin/admin/src/pages/Auth/components/Login.js.map +1 -1
  147. package/dist/admin/admin/src/pages/Auth/components/Login.mjs +3 -0
  148. package/dist/admin/admin/src/pages/Auth/components/Login.mjs.map +1 -1
  149. package/dist/admin/admin/src/pages/Home/HomePage.js +200 -130
  150. package/dist/admin/admin/src/pages/Home/HomePage.js.map +1 -1
  151. package/dist/admin/admin/src/pages/Home/HomePage.mjs +202 -132
  152. package/dist/admin/admin/src/pages/Home/HomePage.mjs.map +1 -1
  153. package/dist/admin/admin/src/pages/Home/components/AddWidgetModal.js +189 -0
  154. package/dist/admin/admin/src/pages/Home/components/AddWidgetModal.js.map +1 -0
  155. package/dist/admin/admin/src/pages/Home/components/AddWidgetModal.mjs +168 -0
  156. package/dist/admin/admin/src/pages/Home/components/AddWidgetModal.mjs.map +1 -0
  157. package/dist/admin/admin/src/pages/ProfilePage.js +54 -51
  158. package/dist/admin/admin/src/pages/ProfilePage.js.map +1 -1
  159. package/dist/admin/admin/src/pages/ProfilePage.mjs +55 -52
  160. package/dist/admin/admin/src/pages/ProfilePage.mjs.map +1 -1
  161. package/dist/admin/admin/src/pages/Settings/Layout.js +42 -6
  162. package/dist/admin/admin/src/pages/Settings/Layout.js.map +1 -1
  163. package/dist/admin/admin/src/pages/Settings/Layout.mjs +43 -7
  164. package/dist/admin/admin/src/pages/Settings/Layout.mjs.map +1 -1
  165. package/dist/admin/admin/src/pages/Settings/components/SettingsNav.js +44 -32
  166. package/dist/admin/admin/src/pages/Settings/components/SettingsNav.js.map +1 -1
  167. package/dist/admin/admin/src/pages/Settings/components/SettingsNav.mjs +45 -33
  168. package/dist/admin/admin/src/pages/Settings/components/SettingsNav.mjs.map +1 -1
  169. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.js +1 -1
  170. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.js.map +1 -1
  171. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.mjs +2 -2
  172. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.mjs.map +1 -1
  173. package/dist/admin/admin/src/pages/Settings/pages/InstalledPlugins.js +1 -1
  174. package/dist/admin/admin/src/pages/Settings/pages/InstalledPlugins.js.map +1 -1
  175. package/dist/admin/admin/src/pages/Settings/pages/InstalledPlugins.mjs +2 -2
  176. package/dist/admin/admin/src/pages/Settings/pages/InstalledPlugins.mjs.map +1 -1
  177. package/dist/admin/admin/src/pages/Settings/pages/PurchaseAuditLogs.js +4 -3
  178. package/dist/admin/admin/src/pages/Settings/pages/PurchaseAuditLogs.js.map +1 -1
  179. package/dist/admin/admin/src/pages/Settings/pages/PurchaseAuditLogs.mjs +5 -4
  180. package/dist/admin/admin/src/pages/Settings/pages/PurchaseAuditLogs.mjs.map +1 -1
  181. package/dist/admin/admin/src/pages/Settings/pages/PurchaseContentHistory.js +4 -3
  182. package/dist/admin/admin/src/pages/Settings/pages/PurchaseContentHistory.js.map +1 -1
  183. package/dist/admin/admin/src/pages/Settings/pages/PurchaseContentHistory.mjs +5 -4
  184. package/dist/admin/admin/src/pages/Settings/pages/PurchaseContentHistory.mjs.map +1 -1
  185. package/dist/admin/admin/src/pages/Settings/pages/PurchaseSingleSignOn.js +4 -3
  186. package/dist/admin/admin/src/pages/Settings/pages/PurchaseSingleSignOn.js.map +1 -1
  187. package/dist/admin/admin/src/pages/Settings/pages/PurchaseSingleSignOn.mjs +5 -4
  188. package/dist/admin/admin/src/pages/Settings/pages/PurchaseSingleSignOn.mjs.map +1 -1
  189. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.js +36 -32
  190. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.js.map +1 -1
  191. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.mjs +36 -32
  192. package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.mjs.map +1 -1
  193. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/ListPage.js +1 -1
  194. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/ListPage.js.map +1 -1
  195. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/ListPage.mjs +1 -1
  196. package/dist/admin/admin/src/pages/Settings/pages/Webhooks/ListPage.mjs.map +1 -1
  197. package/dist/admin/admin/src/services/api.js +2 -1
  198. package/dist/admin/admin/src/services/api.js.map +1 -1
  199. package/dist/admin/admin/src/services/api.mjs +2 -1
  200. package/dist/admin/admin/src/services/api.mjs.map +1 -1
  201. package/dist/admin/admin/src/services/auth.js +13 -2
  202. package/dist/admin/admin/src/services/auth.js.map +1 -1
  203. package/dist/admin/admin/src/services/auth.mjs +12 -3
  204. package/dist/admin/admin/src/services/auth.mjs.map +1 -1
  205. package/dist/admin/admin/src/services/homepage.js +11 -4
  206. package/dist/admin/admin/src/services/homepage.js.map +1 -1
  207. package/dist/admin/admin/src/services/homepage.mjs +11 -4
  208. package/dist/admin/admin/src/services/homepage.mjs.map +1 -1
  209. package/dist/admin/admin/src/translations/en.json.js +7 -1
  210. package/dist/admin/admin/src/translations/en.json.js.map +1 -1
  211. package/dist/admin/admin/src/translations/en.json.mjs +7 -1
  212. package/dist/admin/admin/src/translations/en.json.mjs.map +1 -1
  213. package/dist/admin/admin/src/translations/uk.json.js +9 -9
  214. package/dist/admin/admin/src/translations/uk.json.mjs +9 -9
  215. package/dist/admin/admin/src/utils/resizeHandlers.js +109 -0
  216. package/dist/admin/admin/src/utils/resizeHandlers.js.map +1 -0
  217. package/dist/admin/admin/src/utils/resizeHandlers.mjs +100 -0
  218. package/dist/admin/admin/src/utils/resizeHandlers.mjs.map +1 -0
  219. package/dist/admin/admin/src/utils/widgetLayout.js +293 -0
  220. package/dist/admin/admin/src/utils/widgetLayout.js.map +1 -0
  221. package/dist/admin/admin/src/utils/widgetLayout.mjs +273 -0
  222. package/dist/admin/admin/src/utils/widgetLayout.mjs.map +1 -0
  223. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.js +1 -1
  224. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.js.map +1 -1
  225. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.mjs +1 -1
  226. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.mjs.map +1 -1
  227. package/dist/admin/ee/admin/src/services/ai.js +5 -2
  228. package/dist/admin/ee/admin/src/services/ai.js.map +1 -1
  229. package/dist/admin/ee/admin/src/services/ai.mjs +5 -2
  230. package/dist/admin/ee/admin/src/services/ai.mjs.map +1 -1
  231. package/dist/admin/index.js +11 -0
  232. package/dist/admin/index.js.map +1 -1
  233. package/dist/admin/index.mjs +4 -0
  234. package/dist/admin/index.mjs.map +1 -1
  235. package/dist/admin/src/components/DragLayer.d.ts +8 -4
  236. package/dist/admin/src/components/GapDropZone.d.ts +36 -0
  237. package/dist/admin/src/components/GuidedTour/Context.d.ts +4 -0
  238. package/dist/admin/src/components/GuidedTour/GuidedTourProvider.d.ts +6 -0
  239. package/dist/admin/src/components/LeftMenu.d.ts +2 -2
  240. package/dist/admin/src/components/MainNav/MainNavLinks.d.ts +11 -0
  241. package/dist/admin/src/components/MainNav/NavBurgerMenu.d.ts +9 -0
  242. package/dist/admin/src/components/MainNav/NavUser.d.ts +5 -4
  243. package/dist/admin/src/components/ResizeIndicator.d.ts +12 -0
  244. package/dist/admin/src/components/SubNav.d.ts +18 -5
  245. package/dist/admin/src/components/WidgetRoot.d.ts +14 -0
  246. package/dist/admin/src/constants/theme.d.ts +7 -0
  247. package/dist/admin/src/core/store/configure.d.ts +2 -2
  248. package/dist/admin/src/core/store/hooks.d.ts +2 -2
  249. package/dist/admin/src/features/Tracking.d.ts +1 -1
  250. package/dist/admin/src/features/Widgets.d.ts +29 -0
  251. package/dist/admin/src/hooks/useAdminRoles.d.ts +1 -1
  252. package/dist/admin/src/hooks/useDeviceType.d.ts +6 -0
  253. package/dist/admin/src/hooks/useMediaQuery.d.ts +21 -0
  254. package/dist/admin/src/hooks/useMenu.d.ts +9 -1
  255. package/dist/admin/src/index.d.ts +4 -0
  256. package/dist/admin/src/pages/Home/HomePage.d.ts +4 -5
  257. package/dist/admin/src/pages/Home/components/AddWidgetModal.d.ts +10 -0
  258. package/dist/admin/src/pages/Settings/components/SettingsNav.d.ts +3 -6
  259. package/dist/admin/src/pages/Settings/pages/Webhooks/hooks/useWebhooks.d.ts +4 -4
  260. package/dist/admin/src/selectors.d.ts +2 -2
  261. package/dist/admin/src/services/admin.d.ts +6 -6
  262. package/dist/admin/src/services/api.d.ts +1 -1
  263. package/dist/admin/src/services/apiTokens.d.ts +1 -1
  264. package/dist/admin/src/services/auth.d.ts +21 -12
  265. package/dist/admin/src/services/contentApi.d.ts +1 -1
  266. package/dist/admin/src/services/contentManager.d.ts +1 -1
  267. package/dist/admin/src/services/homepage.d.ts +3 -3
  268. package/dist/admin/src/services/transferTokens.d.ts +1 -1
  269. package/dist/admin/src/services/users.d.ts +8 -8
  270. package/dist/admin/src/services/webhooks.d.ts +2 -2
  271. package/dist/admin/src/utils/resizeHandlers.d.ts +58 -0
  272. package/dist/admin/src/utils/widgetLayout.d.ts +78 -0
  273. package/dist/admin/tests/utils.d.ts +1 -1
  274. package/dist/ee/admin/src/services/ai.d.ts +2 -2
  275. package/dist/ee/admin/src/services/auditLogs.d.ts +1 -1
  276. package/dist/ee/server/src/controllers/authentication-utils/middlewares.d.ts.map +1 -1
  277. package/dist/server/ee/server/src/controllers/authentication-utils/middlewares.js +4 -2
  278. package/dist/server/ee/server/src/controllers/authentication-utils/middlewares.js.map +1 -1
  279. package/dist/server/ee/server/src/controllers/authentication-utils/middlewares.mjs +4 -2
  280. package/dist/server/ee/server/src/controllers/authentication-utils/middlewares.mjs.map +1 -1
  281. package/dist/server/server/src/bootstrap.js +5 -0
  282. package/dist/server/server/src/bootstrap.js.map +1 -1
  283. package/dist/server/server/src/bootstrap.mjs +5 -0
  284. package/dist/server/server/src/bootstrap.mjs.map +1 -1
  285. package/dist/server/server/src/controllers/authenticated-user.js +15 -0
  286. package/dist/server/server/src/controllers/authenticated-user.js.map +1 -1
  287. package/dist/server/server/src/controllers/authenticated-user.mjs +15 -0
  288. package/dist/server/server/src/controllers/authenticated-user.mjs.map +1 -1
  289. package/dist/server/server/src/routes/users.js +10 -0
  290. package/dist/server/server/src/routes/users.js.map +1 -1
  291. package/dist/server/server/src/routes/users.mjs +10 -0
  292. package/dist/server/server/src/routes/users.mjs.map +1 -1
  293. package/dist/server/server/src/services/user.js +113 -1
  294. package/dist/server/server/src/services/user.js.map +1 -1
  295. package/dist/server/server/src/services/user.mjs +113 -1
  296. package/dist/server/server/src/services/user.mjs.map +1 -1
  297. package/dist/server/shared/utils/session-auth.js +4 -2
  298. package/dist/server/shared/utils/session-auth.js.map +1 -1
  299. package/dist/server/shared/utils/session-auth.mjs +4 -2
  300. package/dist/server/shared/utils/session-auth.mjs.map +1 -1
  301. package/dist/server/src/bootstrap.d.ts.map +1 -1
  302. package/dist/server/src/controllers/authenticated-user.d.ts +1 -0
  303. package/dist/server/src/controllers/authenticated-user.d.ts.map +1 -1
  304. package/dist/server/src/controllers/index.d.ts +1 -0
  305. package/dist/server/src/controllers/index.d.ts.map +1 -1
  306. package/dist/server/src/index.d.ts +5 -0
  307. package/dist/server/src/index.d.ts.map +1 -1
  308. package/dist/server/src/routes/users.d.ts.map +1 -1
  309. package/dist/server/src/services/index.d.ts +4 -0
  310. package/dist/server/src/services/index.d.ts.map +1 -1
  311. package/dist/server/src/services/user.d.ts +4 -0
  312. package/dist/server/src/services/user.d.ts.map +1 -1
  313. package/dist/shared/contracts/homepage.d.ts +8 -4
  314. package/dist/shared/contracts/homepage.d.ts.map +1 -1
  315. package/dist/shared/contracts/users.d.ts +16 -0
  316. package/dist/shared/contracts/users.d.ts.map +1 -1
  317. package/dist/shared/utils/session-auth.d.ts.map +1 -1
  318. package/package.json +7 -7
@@ -0,0 +1,273 @@
1
+ /**
2
+ *
3
+ * Comprehensive utilities for widget layout operations including sizing, positioning, and layout calculations.
4
+ *
5
+ * Constraints:
6
+ * - Maximum 3 widgets per row (since minimum widget width is 4 columns)
7
+ * - Widget widths are snapped to discrete values: 4 (1/3), 6 (1/2), 8 (2/3), 12 (3/3)
8
+ */ const WIDGET_SIZING = {
9
+ TOTAL_COLUMNS: 12,
10
+ MIN_WIDGET_WIDTH: 4,
11
+ DISCRETE_SIZES: [
12
+ 4,
13
+ 6,
14
+ 8,
15
+ 12
16
+ ]
17
+ };
18
+ const WIDGET_DATA_ATTRIBUTES = {
19
+ WIDGET_ID: 'data-strapi-widget-id',
20
+ GRID_CONTAINER: 'data-strapi-grid-container'
21
+ };
22
+ const getWidgetElement = (uid)=>{
23
+ return document.querySelector(`[${WIDGET_DATA_ATTRIBUTES.WIDGET_ID}="${uid}"]`);
24
+ };
25
+ const getWidgetGridContainer = ()=>{
26
+ return document.querySelector(`[${WIDGET_DATA_ATTRIBUTES.GRID_CONTAINER}]`);
27
+ };
28
+ /**
29
+ * Validates if a widget width is valid (within constraints)
30
+ */ const isValidWidgetWidth = (width)=>{
31
+ return width >= WIDGET_SIZING.MIN_WIDGET_WIDTH && width <= WIDGET_SIZING.TOTAL_COLUMNS;
32
+ };
33
+ /**
34
+ * Validates if a resize operation is allowed between two widgets
35
+ */ const isValidResizeOperation = (leftWidth, rightWidth)=>{
36
+ // Check minimum size constraints
37
+ if (!isValidWidgetWidth(leftWidth) || !isValidWidgetWidth(rightWidth)) {
38
+ return false;
39
+ }
40
+ // Check if the total doesn't exceed row capacity
41
+ if (leftWidth + rightWidth > WIDGET_SIZING.TOTAL_COLUMNS) {
42
+ return false;
43
+ }
44
+ return true;
45
+ };
46
+ /**
47
+ * Gets widget width with fallback to default value
48
+ */ const getWidgetWidth = (columnWidths, widgetId, defaultWidth = 6)=>{
49
+ return widgetId ? columnWidths[widgetId] || defaultWidth : defaultWidth;
50
+ };
51
+ /**
52
+ * Calculates the current row structure from widgets and their widths
53
+ */ const calculateWidgetRows = (widgets, columnWidths)=>{
54
+ const rows = [];
55
+ let currentRow = [];
56
+ let currentRowWidth = 0;
57
+ let startIndex = 0;
58
+ widgets.forEach((widget, index)=>{
59
+ const widgetWidth = getWidgetWidth(columnWidths, widget.uid);
60
+ // If adding this widget would exceed 12 columns, start a new row
61
+ if (currentRowWidth + widgetWidth > WIDGET_SIZING.TOTAL_COLUMNS) {
62
+ if (currentRow.length > 0) {
63
+ rows.push({
64
+ widgets: currentRow,
65
+ totalWidth: currentRowWidth,
66
+ startIndex,
67
+ endIndex: startIndex + currentRow.length - 1
68
+ });
69
+ }
70
+ currentRow = [
71
+ widget
72
+ ];
73
+ currentRowWidth = widgetWidth;
74
+ startIndex = index;
75
+ } else {
76
+ currentRow.push(widget);
77
+ currentRowWidth += widgetWidth;
78
+ }
79
+ });
80
+ // Add the last row if it has widgets
81
+ if (currentRow.length > 0) {
82
+ rows.push({
83
+ widgets: currentRow,
84
+ totalWidth: currentRowWidth,
85
+ startIndex,
86
+ endIndex: startIndex + currentRow.length - 1
87
+ });
88
+ }
89
+ return rows;
90
+ };
91
+ /**
92
+ * Calculates optimal layout for a specific row based on widget count
93
+ * Only enforces constraints when necessary:
94
+ * - 1 widget in row: must be 3/3 (12 columns)
95
+ * - 3 widgets in row: must be 1/3+1/3+1/3 (4+4+4 columns)
96
+ * - 2 widgets in row: preserves existing proportions or uses 1/2+1/2
97
+ */ const calculateOptimalLayoutForRow = (widgetsInRow, currentColumnWidths)=>{
98
+ const newWidths = {
99
+ ...currentColumnWidths
100
+ };
101
+ const widgetCount = widgetsInRow.length;
102
+ if (widgetCount === 1) {
103
+ // Single widget must take full width (12)
104
+ newWidths[widgetsInRow[0].uid] = 12;
105
+ } else if (widgetCount === 3) {
106
+ // Three widgets must be equal (4 + 4 + 4)
107
+ widgetsInRow.forEach((widget)=>{
108
+ newWidths[widget.uid] = 4;
109
+ });
110
+ } else if (widgetCount === 2) {
111
+ // Two widgets can be flexible - preserve existing proportions or use 6 + 6
112
+ const currentWidths = widgetsInRow.map((widget)=>getWidgetWidth(currentColumnWidths, widget.uid));
113
+ const totalWidth = currentWidths.reduce((sum, width)=>sum + width, 0);
114
+ if (totalWidth === 12) {
115
+ // Row is already properly sized, preserve proportions
116
+ widgetsInRow.forEach((widget, index)=>{
117
+ newWidths[widget.uid] = currentWidths[index];
118
+ });
119
+ } else {
120
+ // Row needs adjustment, use equal split
121
+ widgetsInRow.forEach((widget)=>{
122
+ newWidths[widget.uid] = 6;
123
+ });
124
+ }
125
+ }
126
+ return newWidths;
127
+ };
128
+ const moveWidgetInArray = (widgets, widgetId, insertIndex)=>{
129
+ const currentIndex = widgets.findIndex((w)=>w.uid === widgetId);
130
+ if (currentIndex === -1) return widgets;
131
+ // Remove widget from current position
132
+ const widgetsWithoutMoved = widgets.filter((w)=>w.uid !== widgetId);
133
+ // Insert at new position (adjust index if moving forward)
134
+ const adjustedInsertIndex = insertIndex > currentIndex ? insertIndex - 1 : insertIndex;
135
+ const newWidgets = [
136
+ ...widgetsWithoutMoved
137
+ ];
138
+ newWidgets.splice(adjustedInsertIndex, 0, widgets[currentIndex]);
139
+ return newWidgets;
140
+ };
141
+ const findRowContainingWidget = (widgetRows, widgetId, widgets)=>{
142
+ const widgetIndex = widgets.findIndex((w)=>w.uid === widgetId);
143
+ if (widgetIndex === -1) return undefined;
144
+ return widgetRows.find((row)=>widgetIndex >= row.startIndex && widgetIndex <= row.endIndex);
145
+ };
146
+ const resizeRowAfterRemoval = (row, removedWidgetId, currentWidths)=>{
147
+ if (!row) return currentWidths;
148
+ const remainingWidgets = row.widgets.filter((w)=>w.uid !== removedWidgetId);
149
+ return calculateOptimalLayoutForRow(remainingWidgets, currentWidths);
150
+ };
151
+ const resizeRowAfterAddition = (row, addedWidget, insertIndex, currentWidths)=>{
152
+ if (!row) return currentWidths;
153
+ // Calculate the new widget arrangement for the target row
154
+ const targetRowWidgets = [
155
+ ...row.widgets
156
+ ];
157
+ const existingIndex = targetRowWidgets.findIndex((w)=>w.uid === addedWidget.uid);
158
+ if (existingIndex !== -1) {
159
+ // Widget was already in this row, just reorder
160
+ targetRowWidgets.splice(existingIndex, 1);
161
+ }
162
+ // Insert at the new position within the row
163
+ let insertPosition = insertIndex - row.startIndex;
164
+ // If insertIndex is at the end of the row (row.endIndex + 1),
165
+ // insert at the end of the row instead of beyond it
166
+ if (insertIndex === row.endIndex + 1) {
167
+ insertPosition = row.widgets.length;
168
+ }
169
+ targetRowWidgets.splice(insertPosition, 0, addedWidget);
170
+ return calculateOptimalLayoutForRow(targetRowWidgets, currentWidths);
171
+ };
172
+ const isLastWidgetInRow = (widgetIndex, widgets, columnWidths)=>{
173
+ if (widgetIndex >= widgets.length - 1) {
174
+ return true; // Last widget overall
175
+ }
176
+ let currentRowWidth = 0;
177
+ // Calculate the current row width by going through widgets from the start
178
+ for(let i = 0; i <= widgetIndex; i++){
179
+ const widgetWidth = getWidgetWidth(columnWidths, widgets[i]?.uid);
180
+ if (currentRowWidth + widgetWidth > WIDGET_SIZING.TOTAL_COLUMNS) {
181
+ // This widget starts a new row, so the previous widget was the last in its row
182
+ currentRowWidth = widgetWidth;
183
+ } else {
184
+ currentRowWidth += widgetWidth;
185
+ }
186
+ }
187
+ // Check if the next widget would fit in the current row
188
+ const nextWidgetWidth = getWidgetWidth(columnWidths, widgets[widgetIndex + 1]?.uid);
189
+ return currentRowWidth + nextWidgetWidth > WIDGET_SIZING.TOTAL_COLUMNS;
190
+ };
191
+ const canResizeBetweenWidgets = (leftWidgetId, rightWidgetId, columnWidths, widgets)=>{
192
+ const leftWidth = getWidgetWidth(columnWidths, leftWidgetId);
193
+ const rightWidth = getWidgetWidth(columnWidths, rightWidgetId);
194
+ // First check if the widgets are actually adjacent in the same row
195
+ const leftIndex = widgets.findIndex((w)=>w.uid === leftWidgetId);
196
+ const rightIndex = widgets.findIndex((w)=>w.uid === rightWidgetId);
197
+ // Widgets must be consecutive in the array and in the same row
198
+ if (rightIndex !== leftIndex + 1) {
199
+ return false;
200
+ }
201
+ // Check if they're in the same row by verifying the right widget isn't the first in a new row
202
+ if (isLastWidgetInRow(leftIndex, widgets, columnWidths)) {
203
+ return false; // Left widget is last in its row, so right widget starts a new row
204
+ }
205
+ // Check if either widget can be made smaller (must be > 4 columns)
206
+ // or if either widget can be made bigger (must be < 12 columns)
207
+ const canLeftShrink = leftWidth > WIDGET_SIZING.MIN_WIDGET_WIDTH;
208
+ const canRightShrink = rightWidth > WIDGET_SIZING.MIN_WIDGET_WIDTH;
209
+ const canLeftGrow = leftWidth < WIDGET_SIZING.TOTAL_COLUMNS;
210
+ const canRightGrow = rightWidth < WIDGET_SIZING.TOTAL_COLUMNS;
211
+ // Resizing is possible if either widget can shrink AND the other can grow
212
+ return canLeftShrink && canRightGrow || canRightShrink && canLeftGrow;
213
+ };
214
+ /**
215
+ * Filters widgets to only include those present in the homepage layout
216
+ */ const filterWidgetsByHomepageLayout = (widgets, homepageLayout)=>{
217
+ const createHomepageWidgetUidsSet = (homepageLayout)=>new Set(homepageLayout.widgets.map((w)=>w.uid));
218
+ const homepageWidgetUids = createHomepageWidgetUidsSet(homepageLayout);
219
+ return widgets.filter((widget)=>homepageWidgetUids.has(widget.uid));
220
+ };
221
+ /**
222
+ * Sorts widgets according to the homepage layout order
223
+ */ const sortWidgetsByHomepageLayout = (widgets, homepageLayout)=>{
224
+ const widgetOrderMap = new Map(homepageLayout.widgets.map((widget, index)=>[
225
+ widget.uid,
226
+ index
227
+ ]));
228
+ return [
229
+ ...widgets
230
+ ].sort((a, b)=>{
231
+ const aIndex = widgetOrderMap.get(a.uid) ?? Number.MAX_SAFE_INTEGER;
232
+ const bIndex = widgetOrderMap.get(b.uid) ?? Number.MAX_SAFE_INTEGER;
233
+ return aIndex - bIndex;
234
+ });
235
+ };
236
+ /**
237
+ * Applies homepage layout to widgets (filters, sorts, and extracts widths)
238
+ */ const applyHomepageLayout = (authorizedWidgets, homepageLayout)=>{
239
+ const layoutWidgets = filterWidgetsByHomepageLayout(authorizedWidgets, homepageLayout);
240
+ const sortedWidgets = sortWidgetsByHomepageLayout(layoutWidgets, homepageLayout);
241
+ // Extract widths from homepage layout
242
+ const widths = {};
243
+ homepageLayout.widgets.forEach(({ uid, width })=>{
244
+ widths[uid] = width;
245
+ });
246
+ return {
247
+ filteredWidgets: sortedWidgets,
248
+ widths
249
+ };
250
+ };
251
+ /**
252
+ * Creates default widget widths based on widget count
253
+ * Even count: all widgets get width 6
254
+ * Odd count: all widgets get width 6 except the last one which gets width 12
255
+ */ const createDefaultWidgetWidths = (widgets)=>{
256
+ const defaultWidths = {};
257
+ const widgetCount = widgets.length;
258
+ if (widgetCount > 0) {
259
+ if (widgetCount % 2 === 0) {
260
+ widgets.forEach((widget)=>{
261
+ defaultWidths[widget.uid] = 6;
262
+ });
263
+ } else {
264
+ widgets.forEach((widget, index)=>{
265
+ defaultWidths[widget.uid] = index === widgetCount - 1 ? 12 : 6;
266
+ });
267
+ }
268
+ }
269
+ return defaultWidths;
270
+ };
271
+
272
+ export { WIDGET_DATA_ATTRIBUTES, WIDGET_SIZING, applyHomepageLayout, calculateOptimalLayoutForRow, calculateWidgetRows, canResizeBetweenWidgets, createDefaultWidgetWidths, filterWidgetsByHomepageLayout, findRowContainingWidget, getWidgetElement, getWidgetGridContainer, getWidgetWidth, isLastWidgetInRow, isValidResizeOperation, isValidWidgetWidth, moveWidgetInArray, resizeRowAfterAddition, resizeRowAfterRemoval, sortWidgetsByHomepageLayout };
273
+ //# sourceMappingURL=widgetLayout.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"widgetLayout.mjs","sources":["../../../../../admin/src/utils/widgetLayout.ts"],"sourcesContent":["/**\n *\n * Comprehensive utilities for widget layout operations including sizing, positioning, and layout calculations.\n *\n * Constraints:\n * - Maximum 3 widgets per row (since minimum widget width is 4 columns)\n * - Widget widths are snapped to discrete values: 4 (1/3), 6 (1/2), 8 (2/3), 12 (3/3)\n */\n\nimport type { Homepage } from '../../../shared/contracts/homepage';\nimport type { WidgetWithUID } from '../core/apis/Widgets';\n\nexport const WIDGET_SIZING = {\n TOTAL_COLUMNS: 12,\n MIN_WIDGET_WIDTH: 4,\n DISCRETE_SIZES: [4, 6, 8, 12] as const,\n} as const;\n\nexport const WIDGET_DATA_ATTRIBUTES = {\n WIDGET_ID: 'data-strapi-widget-id',\n GRID_CONTAINER: 'data-strapi-grid-container',\n} as const;\n\nexport const getWidgetElement = (uid: string): HTMLElement | null => {\n return document.querySelector(`[${WIDGET_DATA_ATTRIBUTES.WIDGET_ID}=\"${uid}\"]`);\n};\n\nexport const getWidgetGridContainer = (): HTMLElement | null => {\n return document.querySelector(`[${WIDGET_DATA_ATTRIBUTES.GRID_CONTAINER}]`);\n};\n\nexport interface WidgetRow {\n widgets: WidgetWithUID[];\n totalWidth: number;\n startIndex: number;\n endIndex: number;\n}\n\n/**\n * Validates if a widget width is valid (within constraints)\n */\nexport const isValidWidgetWidth = (width: number): boolean => {\n return width >= WIDGET_SIZING.MIN_WIDGET_WIDTH && width <= WIDGET_SIZING.TOTAL_COLUMNS;\n};\n\n/**\n * Validates if a resize operation is allowed between two widgets\n */\nexport const isValidResizeOperation = (leftWidth: number, rightWidth: number): boolean => {\n // Check minimum size constraints\n if (!isValidWidgetWidth(leftWidth) || !isValidWidgetWidth(rightWidth)) {\n return false;\n }\n\n // Check if the total doesn't exceed row capacity\n if (leftWidth + rightWidth > WIDGET_SIZING.TOTAL_COLUMNS) {\n return false;\n }\n\n return true;\n};\n\n/**\n * Gets widget width with fallback to default value\n */\nexport const getWidgetWidth = (\n columnWidths: Record<string, number>,\n widgetId: string | undefined,\n defaultWidth: number = 6\n): number => {\n return widgetId ? columnWidths[widgetId] || defaultWidth : defaultWidth;\n};\n\n/**\n * Calculates the current row structure from widgets and their widths\n */\nexport const calculateWidgetRows = (\n widgets: WidgetWithUID[],\n columnWidths: Record<string, number>\n): WidgetRow[] => {\n const rows: WidgetRow[] = [];\n let currentRow: WidgetWithUID[] = [];\n let currentRowWidth = 0;\n let startIndex = 0;\n\n widgets.forEach((widget, index) => {\n const widgetWidth = getWidgetWidth(columnWidths, widget.uid);\n\n // If adding this widget would exceed 12 columns, start a new row\n if (currentRowWidth + widgetWidth > WIDGET_SIZING.TOTAL_COLUMNS) {\n if (currentRow.length > 0) {\n rows.push({\n widgets: currentRow,\n totalWidth: currentRowWidth,\n startIndex,\n endIndex: startIndex + currentRow.length - 1,\n });\n }\n currentRow = [widget];\n currentRowWidth = widgetWidth;\n startIndex = index;\n } else {\n currentRow.push(widget);\n currentRowWidth += widgetWidth;\n }\n });\n\n // Add the last row if it has widgets\n if (currentRow.length > 0) {\n rows.push({\n widgets: currentRow,\n totalWidth: currentRowWidth,\n startIndex,\n endIndex: startIndex + currentRow.length - 1,\n });\n }\n\n return rows;\n};\n\n/**\n * Calculates optimal layout for a specific row based on widget count\n * Only enforces constraints when necessary:\n * - 1 widget in row: must be 3/3 (12 columns)\n * - 3 widgets in row: must be 1/3+1/3+1/3 (4+4+4 columns)\n * - 2 widgets in row: preserves existing proportions or uses 1/2+1/2\n */\nexport const calculateOptimalLayoutForRow = (\n widgetsInRow: WidgetWithUID[],\n currentColumnWidths: Record<string, number>\n): Record<string, number> => {\n const newWidths = { ...currentColumnWidths };\n const widgetCount = widgetsInRow.length;\n\n if (widgetCount === 1) {\n // Single widget must take full width (12)\n newWidths[widgetsInRow[0].uid] = 12;\n } else if (widgetCount === 3) {\n // Three widgets must be equal (4 + 4 + 4)\n widgetsInRow.forEach((widget) => {\n newWidths[widget.uid] = 4;\n });\n } else if (widgetCount === 2) {\n // Two widgets can be flexible - preserve existing proportions or use 6 + 6\n const currentWidths = widgetsInRow.map((widget) =>\n getWidgetWidth(currentColumnWidths, widget.uid)\n );\n const totalWidth = currentWidths.reduce((sum, width) => sum + width, 0);\n\n if (totalWidth === 12) {\n // Row is already properly sized, preserve proportions\n widgetsInRow.forEach((widget, index) => {\n newWidths[widget.uid] = currentWidths[index];\n });\n } else {\n // Row needs adjustment, use equal split\n widgetsInRow.forEach((widget) => {\n newWidths[widget.uid] = 6;\n });\n }\n }\n\n return newWidths;\n};\n\nexport const moveWidgetInArray = (\n widgets: WidgetWithUID[],\n widgetId: string,\n insertIndex: number\n): WidgetWithUID[] => {\n const currentIndex = widgets.findIndex((w) => w.uid === widgetId);\n if (currentIndex === -1) return widgets;\n\n // Remove widget from current position\n const widgetsWithoutMoved = widgets.filter((w) => w.uid !== widgetId);\n\n // Insert at new position (adjust index if moving forward)\n const adjustedInsertIndex = insertIndex > currentIndex ? insertIndex - 1 : insertIndex;\n const newWidgets = [...widgetsWithoutMoved];\n newWidgets.splice(adjustedInsertIndex, 0, widgets[currentIndex]);\n\n return newWidgets;\n};\n\nexport const findRowContainingWidget = (\n widgetRows: WidgetRow[],\n widgetId: string,\n widgets: WidgetWithUID[]\n): WidgetRow | undefined => {\n const widgetIndex = widgets.findIndex((w) => w.uid === widgetId);\n if (widgetIndex === -1) return undefined;\n\n return widgetRows.find((row) => widgetIndex >= row.startIndex && widgetIndex <= row.endIndex);\n};\n\nexport const resizeRowAfterRemoval = (\n row: WidgetRow | undefined,\n removedWidgetId: string,\n currentWidths: Record<string, number>\n): Record<string, number> => {\n if (!row) return currentWidths;\n\n const remainingWidgets = row.widgets.filter((w) => w.uid !== removedWidgetId);\n return calculateOptimalLayoutForRow(remainingWidgets, currentWidths);\n};\n\nexport const resizeRowAfterAddition = (\n row: WidgetRow | undefined,\n addedWidget: WidgetWithUID,\n insertIndex: number,\n currentWidths: Record<string, number>\n): Record<string, number> => {\n if (!row) return currentWidths;\n\n // Calculate the new widget arrangement for the target row\n const targetRowWidgets = [...row.widgets];\n const existingIndex = targetRowWidgets.findIndex((w) => w.uid === addedWidget.uid);\n\n if (existingIndex !== -1) {\n // Widget was already in this row, just reorder\n targetRowWidgets.splice(existingIndex, 1);\n }\n\n // Insert at the new position within the row\n let insertPosition = insertIndex - row.startIndex;\n\n // If insertIndex is at the end of the row (row.endIndex + 1),\n // insert at the end of the row instead of beyond it\n if (insertIndex === row.endIndex + 1) {\n insertPosition = row.widgets.length;\n }\n\n targetRowWidgets.splice(insertPosition, 0, addedWidget);\n\n return calculateOptimalLayoutForRow(targetRowWidgets, currentWidths);\n};\n\nexport const isLastWidgetInRow = (\n widgetIndex: number,\n widgets: WidgetWithUID[],\n columnWidths: Record<string, number>\n): boolean => {\n if (widgetIndex >= widgets.length - 1) {\n return true; // Last widget overall\n }\n\n let currentRowWidth = 0;\n\n // Calculate the current row width by going through widgets from the start\n for (let i = 0; i <= widgetIndex; i++) {\n const widgetWidth = getWidgetWidth(columnWidths, widgets[i]?.uid);\n if (currentRowWidth + widgetWidth > WIDGET_SIZING.TOTAL_COLUMNS) {\n // This widget starts a new row, so the previous widget was the last in its row\n currentRowWidth = widgetWidth;\n } else {\n currentRowWidth += widgetWidth;\n }\n }\n\n // Check if the next widget would fit in the current row\n const nextWidgetWidth = getWidgetWidth(columnWidths, widgets[widgetIndex + 1]?.uid);\n return currentRowWidth + nextWidgetWidth > WIDGET_SIZING.TOTAL_COLUMNS;\n};\n\nexport const canResizeBetweenWidgets = (\n leftWidgetId: string,\n rightWidgetId: string,\n columnWidths: Record<string, number>,\n widgets: WidgetWithUID[]\n): boolean => {\n const leftWidth = getWidgetWidth(columnWidths, leftWidgetId);\n const rightWidth = getWidgetWidth(columnWidths, rightWidgetId);\n\n // First check if the widgets are actually adjacent in the same row\n const leftIndex = widgets.findIndex((w) => w.uid === leftWidgetId);\n const rightIndex = widgets.findIndex((w) => w.uid === rightWidgetId);\n\n // Widgets must be consecutive in the array and in the same row\n if (rightIndex !== leftIndex + 1) {\n return false;\n }\n\n // Check if they're in the same row by verifying the right widget isn't the first in a new row\n if (isLastWidgetInRow(leftIndex, widgets, columnWidths)) {\n return false; // Left widget is last in its row, so right widget starts a new row\n }\n\n // Check if either widget can be made smaller (must be > 4 columns)\n // or if either widget can be made bigger (must be < 12 columns)\n const canLeftShrink = leftWidth > WIDGET_SIZING.MIN_WIDGET_WIDTH;\n const canRightShrink = rightWidth > WIDGET_SIZING.MIN_WIDGET_WIDTH;\n const canLeftGrow = leftWidth < WIDGET_SIZING.TOTAL_COLUMNS;\n const canRightGrow = rightWidth < WIDGET_SIZING.TOTAL_COLUMNS;\n\n // Resizing is possible if either widget can shrink AND the other can grow\n return (canLeftShrink && canRightGrow) || (canRightShrink && canLeftGrow);\n};\n\n/**\n * Filters widgets to only include those present in the homepage layout\n */\nexport const filterWidgetsByHomepageLayout = (\n widgets: WidgetWithUID[],\n homepageLayout: Homepage.Layout\n): WidgetWithUID[] => {\n const createHomepageWidgetUidsSet = (homepageLayout: Homepage.Layout): Set<string> =>\n new Set(homepageLayout.widgets.map((w) => w.uid));\n const homepageWidgetUids = createHomepageWidgetUidsSet(homepageLayout);\n return widgets.filter((widget) => homepageWidgetUids.has(widget.uid));\n};\n\n/**\n * Sorts widgets according to the homepage layout order\n */\nexport const sortWidgetsByHomepageLayout = (\n widgets: WidgetWithUID[],\n homepageLayout: Homepage.Layout\n): WidgetWithUID[] => {\n const widgetOrderMap = new Map(\n homepageLayout.widgets.map((widget, index) => [widget.uid, index])\n );\n\n return [...widgets].sort((a, b) => {\n const aIndex = widgetOrderMap.get(a.uid) ?? Number.MAX_SAFE_INTEGER;\n const bIndex = widgetOrderMap.get(b.uid) ?? Number.MAX_SAFE_INTEGER;\n return aIndex - bIndex;\n });\n};\n\n/**\n * Applies homepage layout to widgets (filters, sorts, and extracts widths)\n */\nexport const applyHomepageLayout = (\n authorizedWidgets: WidgetWithUID[],\n homepageLayout: Homepage.Layout\n): {\n filteredWidgets: WidgetWithUID[];\n widths: Record<string, number>;\n} => {\n const layoutWidgets = filterWidgetsByHomepageLayout(authorizedWidgets, homepageLayout);\n const sortedWidgets = sortWidgetsByHomepageLayout(layoutWidgets, homepageLayout);\n\n // Extract widths from homepage layout\n const widths: Record<string, number> = {};\n homepageLayout.widgets.forEach(({ uid, width }) => {\n widths[uid] = width;\n });\n\n return {\n filteredWidgets: sortedWidgets,\n widths,\n };\n};\n\n/**\n * Creates default widget widths based on widget count\n * Even count: all widgets get width 6\n * Odd count: all widgets get width 6 except the last one which gets width 12\n */\nexport const createDefaultWidgetWidths = (widgets: WidgetWithUID[]): Record<string, number> => {\n const defaultWidths: Record<string, number> = {};\n const widgetCount = widgets.length;\n\n if (widgetCount > 0) {\n if (widgetCount % 2 === 0) {\n widgets.forEach((widget) => {\n defaultWidths[widget.uid] = 6;\n });\n } else {\n widgets.forEach((widget, index) => {\n defaultWidths[widget.uid] = index === widgetCount - 1 ? 12 : 6;\n });\n }\n }\n\n return defaultWidths;\n};\n"],"names":["WIDGET_SIZING","TOTAL_COLUMNS","MIN_WIDGET_WIDTH","DISCRETE_SIZES","WIDGET_DATA_ATTRIBUTES","WIDGET_ID","GRID_CONTAINER","getWidgetElement","uid","document","querySelector","getWidgetGridContainer","isValidWidgetWidth","width","isValidResizeOperation","leftWidth","rightWidth","getWidgetWidth","columnWidths","widgetId","defaultWidth","calculateWidgetRows","widgets","rows","currentRow","currentRowWidth","startIndex","forEach","widget","index","widgetWidth","length","push","totalWidth","endIndex","calculateOptimalLayoutForRow","widgetsInRow","currentColumnWidths","newWidths","widgetCount","currentWidths","map","reduce","sum","moveWidgetInArray","insertIndex","currentIndex","findIndex","w","widgetsWithoutMoved","filter","adjustedInsertIndex","newWidgets","splice","findRowContainingWidget","widgetRows","widgetIndex","undefined","find","row","resizeRowAfterRemoval","removedWidgetId","remainingWidgets","resizeRowAfterAddition","addedWidget","targetRowWidgets","existingIndex","insertPosition","isLastWidgetInRow","i","nextWidgetWidth","canResizeBetweenWidgets","leftWidgetId","rightWidgetId","leftIndex","rightIndex","canLeftShrink","canRightShrink","canLeftGrow","canRightGrow","filterWidgetsByHomepageLayout","homepageLayout","createHomepageWidgetUidsSet","Set","homepageWidgetUids","has","sortWidgetsByHomepageLayout","widgetOrderMap","Map","sort","a","b","aIndex","get","Number","MAX_SAFE_INTEGER","bIndex","applyHomepageLayout","authorizedWidgets","layoutWidgets","sortedWidgets","widths","filteredWidgets","createDefaultWidgetWidths","defaultWidths"],"mappings":"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"}
@@ -92,7 +92,7 @@ const SingleSignOnPage = ()=>{
92
92
  }
93
93
  };
94
94
  const isLoadingData = isLoadingRoles || isLoadingPermissions || isLoadingProviderOptions;
95
- return /*#__PURE__*/ jsxRuntime.jsxs(Layout.Layouts.Root, {
95
+ return /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
96
96
  children: [
97
97
  /*#__PURE__*/ jsxRuntime.jsx(PageHelpers.Page.Title, {
98
98
  children: formatMessage({
@@ -1 +1 @@
1
- {"version":3,"file":"SingleSignOnPage.js","sources":["../../../../../../../../ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.tsx"],"sourcesContent":["import {\n Button,\n Flex,\n Grid,\n MultiSelect,\n MultiSelectOption,\n Typography,\n Field,\n} from '@strapi/design-system';\nimport { Check } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport * as yup from 'yup';\n\nimport {\n Form,\n FormHelpers,\n InputProps,\n useField,\n} from '../../../../../../admin/src/components/Form';\nimport { InputRenderer } from '../../../../../../admin/src/components/FormInputs/Renderer';\nimport { GradientBadge } from '../../../../../../admin/src/components/GradientBadge';\nimport { Layouts } from '../../../../../../admin/src/components/Layouts/Layout';\nimport { Page } from '../../../../../../admin/src/components/PageHelpers';\nimport { useTypedSelector } from '../../../../../../admin/src/core/store/hooks';\nimport { useNotification } from '../../../../../../admin/src/features/Notifications';\nimport { useAdminRoles } from '../../../../../../admin/src/hooks/useAdminRoles';\nimport { useAPIErrorHandler } from '../../../../../../admin/src/hooks/useAPIErrorHandler';\nimport { useRBAC } from '../../../../../../admin/src/hooks/useRBAC';\nimport {\n useGetProviderOptionsQuery,\n useUpdateProviderOptionsMutation,\n} from '../../../../../../admin/src/services/auth';\nimport { isBaseQueryError } from '../../../../../../admin/src/utils/baseQuery';\nimport { translatedErrors } from '../../../../../../admin/src/utils/translatedErrors';\nimport { ProvidersOptions } from '../../../../../../shared/contracts/admin';\n\nconst SCHEMA = yup.object().shape({\n autoRegister: yup.bool().required(translatedErrors.required),\n defaultRole: yup.mixed().when('autoRegister', (value, initSchema) => {\n return value ? initSchema.required(translatedErrors.required) : initSchema.nullable();\n }),\n ssoLockedRoles: yup\n .array()\n .nullable()\n .of(\n yup.mixed().when('ssoLockedRoles', (value, initSchema) => {\n return value ? initSchema.required(translatedErrors.required) : initSchema.nullable();\n })\n ),\n});\n\nexport const SingleSignOnPage = () => {\n const { formatMessage } = useIntl();\n const permissions = useTypedSelector((state) => state.admin_app.permissions);\n const { toggleNotification } = useNotification();\n const {\n _unstableFormatAPIError: formatAPIError,\n _unstableFormatValidationErrors: formatValidationErrors,\n } = useAPIErrorHandler();\n\n const { isLoading: isLoadingProviderOptions, data } = useGetProviderOptionsQuery();\n\n const [updateProviderOptions, { isLoading: isSubmittingForm }] =\n useUpdateProviderOptionsMutation();\n\n const {\n isLoading: isLoadingPermissions,\n allowedActions: { canUpdate, canRead: canReadRoles },\n } = useRBAC({\n ...permissions.settings?.sso,\n readRoles: permissions.settings?.roles.read ?? [],\n });\n\n const { roles, isLoading: isLoadingRoles } = useAdminRoles(undefined, {\n skip: !canReadRoles,\n });\n\n const handleSubmit = async (\n body: ProvidersOptions.Request['body'],\n helpers: FormHelpers<ProvidersOptions.Request['body']>\n ) => {\n try {\n const res = await updateProviderOptions(body);\n\n if ('error' in res) {\n if (isBaseQueryError(res.error) && res.error.name === 'ValidationError') {\n helpers.setErrors(formatValidationErrors(res.error));\n } else {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(res.error),\n });\n }\n\n return;\n }\n\n toggleNotification({\n type: 'success',\n message: formatMessage({ id: 'notification.success.saved' }),\n });\n } catch (err) {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: 'notification.error',\n defaultMessage: 'An error occurred, please try again.',\n }),\n });\n }\n };\n\n const isLoadingData = isLoadingRoles || isLoadingPermissions || isLoadingProviderOptions;\n\n return (\n <Layouts.Root>\n <Page.Title>\n {formatMessage(\n { id: 'Settings.PageTitle', defaultMessage: 'Settings - {name}' },\n {\n name: 'SSO',\n }\n )}\n </Page.Title>\n <Page.Main aria-busy={isSubmittingForm || isLoadingData} tabIndex={-1}>\n <Form\n method=\"PUT\"\n onSubmit={handleSubmit}\n validationSchema={SCHEMA}\n disabled={!canUpdate}\n initialValues={\n data || {\n autoRegister: false,\n defaultRole: null,\n ssoLockedRoles: null,\n }\n }\n >\n {({ modified, isSubmitting }) => (\n <>\n <Layouts.Header\n primaryAction={\n <Button\n disabled={!modified}\n loading={isSubmitting}\n startIcon={<Check />}\n type=\"submit\"\n >\n {formatMessage({\n id: 'global.save',\n defaultMessage: 'Save',\n })}\n </Button>\n }\n title={formatMessage({\n id: 'Settings.sso.title',\n defaultMessage: 'Single Sign-On',\n })}\n subtitle={formatMessage({\n id: 'Settings.sso.description',\n defaultMessage: 'Configure the settings for the Single Sign-On feature.',\n })}\n secondaryAction={\n <GradientBadge\n label={formatMessage({\n id: 'components.premiumFeature.title',\n defaultMessage: 'Premium feature',\n })}\n />\n }\n />\n <Layouts.Content>\n {isSubmitting || isLoadingData ? (\n <Page.Loading />\n ) : (\n <Flex\n direction=\"column\"\n alignItems=\"stretch\"\n gap={4}\n background=\"neutral0\"\n padding={6}\n shadow=\"filterShadow\"\n hasRadius\n >\n <Typography variant=\"delta\" tag=\"h2\">\n {formatMessage({\n id: 'global.settings',\n defaultMessage: 'Settings',\n })}\n </Typography>\n <Grid.Root gap={4}>\n {[\n {\n hint: formatMessage({\n id: 'Settings.sso.form.registration.description',\n defaultMessage: 'Create new user on SSO login if no account exists',\n }),\n label: formatMessage({\n id: 'Settings.sso.form.registration.label',\n defaultMessage: 'Auto-registration',\n }),\n name: 'autoRegister',\n size: 6,\n type: 'boolean' as const,\n },\n {\n hint: formatMessage({\n id: 'Settings.sso.form.defaultRole.description',\n defaultMessage:\n 'It will attach the new authenticated user to the selected role',\n }),\n label: formatMessage({\n id: 'Settings.sso.form.defaultRole.label',\n defaultMessage: 'Default role',\n }),\n name: 'defaultRole',\n options: roles.map(({ id, name }) => ({\n label: name,\n value: id.toString(),\n })),\n placeholder: formatMessage({\n id: 'components.InputSelect.option.placeholder',\n defaultMessage: 'Choose here',\n }),\n size: 6,\n type: 'enumeration' as const,\n },\n {\n hint: formatMessage({\n id: 'Settings.sso.form.localAuthenticationLock.description',\n defaultMessage:\n 'Select the roles for which you want to disable the local authentication',\n }),\n label: formatMessage({\n id: 'Settings.sso.form.localAuthenticationLock.label',\n defaultMessage: 'Local authentication lock-out',\n }),\n name: 'ssoLockedRoles',\n options: roles.map(({ id, name }) => ({\n label: name,\n value: id.toString(),\n })),\n placeholder: formatMessage({\n id: 'components.InputSelect.option.placeholder',\n defaultMessage: 'Choose here',\n }),\n size: 6,\n type: 'multi' as const,\n },\n ].map(({ size, ...field }) => (\n <Grid.Item\n key={field.name}\n col={size}\n direction=\"column\"\n alignItems=\"stretch\"\n >\n <FormInputRenderer {...field} />\n </Grid.Item>\n ))}\n </Grid.Root>\n </Flex>\n )}\n </Layouts.Content>\n </>\n )}\n </Form>\n </Page.Main>\n </Layouts.Root>\n );\n};\n\ntype FormInputProps = InputProps | MultiSelectInputProps;\n\nconst FormInputRenderer = (props: FormInputProps) => {\n switch (props.type) {\n case 'multi':\n return <MultiSelectInput {...props} />;\n default:\n return <InputRenderer {...props} />;\n }\n};\n\ntype MultiSelectInputProps = Omit<Extract<InputProps, { type: 'enumeration' }>, 'type'> & {\n type: 'multi';\n};\n\nconst MultiSelectInput = ({ hint, label, name, options, ...props }: MultiSelectInputProps) => {\n const field = useField(name);\n\n return (\n <Field.Root name={name} hint={hint} error={field.error}>\n <Field.Label>{label}</Field.Label>\n <MultiSelect\n onChange={(value) => field.onChange('ssoLockedRoles', value)}\n onClear={() => field.onChange('ssoLockedRoles', [])}\n value={field.value ?? []}\n withTags\n {...props}\n >\n {options.map(({ label, value }) => (\n <MultiSelectOption key={value} value={value}>\n {label}\n </MultiSelectOption>\n ))}\n </MultiSelect>\n <Field.Hint />\n <Field.Error />\n </Field.Root>\n );\n};\n\nexport const ProtectedSSO = () => {\n const permissions = useTypedSelector((state) => state.admin_app.permissions.settings?.sso?.main);\n\n return (\n <Page.Protect permissions={permissions}>\n <SingleSignOnPage />\n </Page.Protect>\n );\n};\n"],"names":["SCHEMA","yup","object","shape","autoRegister","bool","required","translatedErrors","defaultRole","mixed","when","value","initSchema","nullable","ssoLockedRoles","array","of","SingleSignOnPage","formatMessage","useIntl","permissions","useTypedSelector","state","admin_app","toggleNotification","useNotification","_unstableFormatAPIError","formatAPIError","_unstableFormatValidationErrors","formatValidationErrors","useAPIErrorHandler","isLoading","isLoadingProviderOptions","data","useGetProviderOptionsQuery","updateProviderOptions","isSubmittingForm","useUpdateProviderOptionsMutation","isLoadingPermissions","allowedActions","canUpdate","canRead","canReadRoles","useRBAC","settings","sso","readRoles","roles","read","isLoadingRoles","useAdminRoles","undefined","skip","handleSubmit","body","helpers","res","isBaseQueryError","error","name","setErrors","type","message","id","err","defaultMessage","isLoadingData","_jsxs","Layouts","Root","_jsx","Page","Title","Main","aria-busy","tabIndex","Form","method","onSubmit","validationSchema","disabled","initialValues","modified","isSubmitting","_Fragment","Header","primaryAction","Button","loading","startIcon","Check","title","subtitle","secondaryAction","GradientBadge","label","Content","Loading","Flex","direction","alignItems","gap","background","padding","shadow","hasRadius","Typography","variant","tag","Grid","hint","size","options","map","toString","placeholder","field","Item","col","FormInputRenderer","props","MultiSelectInput","InputRenderer","useField","Field","Label","MultiSelect","onChange","onClear","withTags","MultiSelectOption","Hint","Error","ProtectedSSO","main","Protect"],"mappings":"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"}
1
+ {"version":3,"file":"SingleSignOnPage.js","sources":["../../../../../../../../ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.tsx"],"sourcesContent":["import {\n Button,\n Flex,\n Grid,\n MultiSelect,\n MultiSelectOption,\n Typography,\n Field,\n} from '@strapi/design-system';\nimport { Check } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport * as yup from 'yup';\n\nimport {\n Form,\n FormHelpers,\n InputProps,\n useField,\n} from '../../../../../../admin/src/components/Form';\nimport { InputRenderer } from '../../../../../../admin/src/components/FormInputs/Renderer';\nimport { GradientBadge } from '../../../../../../admin/src/components/GradientBadge';\nimport { Layouts } from '../../../../../../admin/src/components/Layouts/Layout';\nimport { Page } from '../../../../../../admin/src/components/PageHelpers';\nimport { useTypedSelector } from '../../../../../../admin/src/core/store/hooks';\nimport { useNotification } from '../../../../../../admin/src/features/Notifications';\nimport { useAdminRoles } from '../../../../../../admin/src/hooks/useAdminRoles';\nimport { useAPIErrorHandler } from '../../../../../../admin/src/hooks/useAPIErrorHandler';\nimport { useRBAC } from '../../../../../../admin/src/hooks/useRBAC';\nimport {\n useGetProviderOptionsQuery,\n useUpdateProviderOptionsMutation,\n} from '../../../../../../admin/src/services/auth';\nimport { isBaseQueryError } from '../../../../../../admin/src/utils/baseQuery';\nimport { translatedErrors } from '../../../../../../admin/src/utils/translatedErrors';\nimport { ProvidersOptions } from '../../../../../../shared/contracts/admin';\n\nconst SCHEMA = yup.object().shape({\n autoRegister: yup.bool().required(translatedErrors.required),\n defaultRole: yup.mixed().when('autoRegister', (value, initSchema) => {\n return value ? initSchema.required(translatedErrors.required) : initSchema.nullable();\n }),\n ssoLockedRoles: yup\n .array()\n .nullable()\n .of(\n yup.mixed().when('ssoLockedRoles', (value, initSchema) => {\n return value ? initSchema.required(translatedErrors.required) : initSchema.nullable();\n })\n ),\n});\n\nexport const SingleSignOnPage = () => {\n const { formatMessage } = useIntl();\n const permissions = useTypedSelector((state) => state.admin_app.permissions);\n const { toggleNotification } = useNotification();\n const {\n _unstableFormatAPIError: formatAPIError,\n _unstableFormatValidationErrors: formatValidationErrors,\n } = useAPIErrorHandler();\n\n const { isLoading: isLoadingProviderOptions, data } = useGetProviderOptionsQuery();\n\n const [updateProviderOptions, { isLoading: isSubmittingForm }] =\n useUpdateProviderOptionsMutation();\n\n const {\n isLoading: isLoadingPermissions,\n allowedActions: { canUpdate, canRead: canReadRoles },\n } = useRBAC({\n ...permissions.settings?.sso,\n readRoles: permissions.settings?.roles.read ?? [],\n });\n\n const { roles, isLoading: isLoadingRoles } = useAdminRoles(undefined, {\n skip: !canReadRoles,\n });\n\n const handleSubmit = async (\n body: ProvidersOptions.Request['body'],\n helpers: FormHelpers<ProvidersOptions.Request['body']>\n ) => {\n try {\n const res = await updateProviderOptions(body);\n\n if ('error' in res) {\n if (isBaseQueryError(res.error) && res.error.name === 'ValidationError') {\n helpers.setErrors(formatValidationErrors(res.error));\n } else {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(res.error),\n });\n }\n\n return;\n }\n\n toggleNotification({\n type: 'success',\n message: formatMessage({ id: 'notification.success.saved' }),\n });\n } catch (err) {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: 'notification.error',\n defaultMessage: 'An error occurred, please try again.',\n }),\n });\n }\n };\n\n const isLoadingData = isLoadingRoles || isLoadingPermissions || isLoadingProviderOptions;\n\n return (\n <>\n <Page.Title>\n {formatMessage(\n { id: 'Settings.PageTitle', defaultMessage: 'Settings - {name}' },\n {\n name: 'SSO',\n }\n )}\n </Page.Title>\n <Page.Main aria-busy={isSubmittingForm || isLoadingData} tabIndex={-1}>\n <Form\n method=\"PUT\"\n onSubmit={handleSubmit}\n validationSchema={SCHEMA}\n disabled={!canUpdate}\n initialValues={\n data || {\n autoRegister: false,\n defaultRole: null,\n ssoLockedRoles: null,\n }\n }\n >\n {({ modified, isSubmitting }) => (\n <>\n <Layouts.Header\n primaryAction={\n <Button\n disabled={!modified}\n loading={isSubmitting}\n startIcon={<Check />}\n type=\"submit\"\n >\n {formatMessage({\n id: 'global.save',\n defaultMessage: 'Save',\n })}\n </Button>\n }\n title={formatMessage({\n id: 'Settings.sso.title',\n defaultMessage: 'Single Sign-On',\n })}\n subtitle={formatMessage({\n id: 'Settings.sso.description',\n defaultMessage: 'Configure the settings for the Single Sign-On feature.',\n })}\n secondaryAction={\n <GradientBadge\n label={formatMessage({\n id: 'components.premiumFeature.title',\n defaultMessage: 'Premium feature',\n })}\n />\n }\n />\n <Layouts.Content>\n {isSubmitting || isLoadingData ? (\n <Page.Loading />\n ) : (\n <Flex\n direction=\"column\"\n alignItems=\"stretch\"\n gap={4}\n background=\"neutral0\"\n padding={6}\n shadow=\"filterShadow\"\n hasRadius\n >\n <Typography variant=\"delta\" tag=\"h2\">\n {formatMessage({\n id: 'global.settings',\n defaultMessage: 'Settings',\n })}\n </Typography>\n <Grid.Root gap={4}>\n {[\n {\n hint: formatMessage({\n id: 'Settings.sso.form.registration.description',\n defaultMessage: 'Create new user on SSO login if no account exists',\n }),\n label: formatMessage({\n id: 'Settings.sso.form.registration.label',\n defaultMessage: 'Auto-registration',\n }),\n name: 'autoRegister',\n size: 6,\n type: 'boolean' as const,\n },\n {\n hint: formatMessage({\n id: 'Settings.sso.form.defaultRole.description',\n defaultMessage:\n 'It will attach the new authenticated user to the selected role',\n }),\n label: formatMessage({\n id: 'Settings.sso.form.defaultRole.label',\n defaultMessage: 'Default role',\n }),\n name: 'defaultRole',\n options: roles.map(({ id, name }) => ({\n label: name,\n value: id.toString(),\n })),\n placeholder: formatMessage({\n id: 'components.InputSelect.option.placeholder',\n defaultMessage: 'Choose here',\n }),\n size: 6,\n type: 'enumeration' as const,\n },\n {\n hint: formatMessage({\n id: 'Settings.sso.form.localAuthenticationLock.description',\n defaultMessage:\n 'Select the roles for which you want to disable the local authentication',\n }),\n label: formatMessage({\n id: 'Settings.sso.form.localAuthenticationLock.label',\n defaultMessage: 'Local authentication lock-out',\n }),\n name: 'ssoLockedRoles',\n options: roles.map(({ id, name }) => ({\n label: name,\n value: id.toString(),\n })),\n placeholder: formatMessage({\n id: 'components.InputSelect.option.placeholder',\n defaultMessage: 'Choose here',\n }),\n size: 6,\n type: 'multi' as const,\n },\n ].map(({ size, ...field }) => (\n <Grid.Item\n key={field.name}\n col={size}\n direction=\"column\"\n alignItems=\"stretch\"\n >\n <FormInputRenderer {...field} />\n </Grid.Item>\n ))}\n </Grid.Root>\n </Flex>\n )}\n </Layouts.Content>\n </>\n )}\n </Form>\n </Page.Main>\n </>\n );\n};\n\ntype FormInputProps = InputProps | MultiSelectInputProps;\n\nconst FormInputRenderer = (props: FormInputProps) => {\n switch (props.type) {\n case 'multi':\n return <MultiSelectInput {...props} />;\n default:\n return <InputRenderer {...props} />;\n }\n};\n\ntype MultiSelectInputProps = Omit<Extract<InputProps, { type: 'enumeration' }>, 'type'> & {\n type: 'multi';\n};\n\nconst MultiSelectInput = ({ hint, label, name, options, ...props }: MultiSelectInputProps) => {\n const field = useField(name);\n\n return (\n <Field.Root name={name} hint={hint} error={field.error}>\n <Field.Label>{label}</Field.Label>\n <MultiSelect\n onChange={(value) => field.onChange('ssoLockedRoles', value)}\n onClear={() => field.onChange('ssoLockedRoles', [])}\n value={field.value ?? []}\n withTags\n {...props}\n >\n {options.map(({ label, value }) => (\n <MultiSelectOption key={value} value={value}>\n {label}\n </MultiSelectOption>\n ))}\n </MultiSelect>\n <Field.Hint />\n <Field.Error />\n </Field.Root>\n );\n};\n\nexport const ProtectedSSO = () => {\n const permissions = useTypedSelector((state) => state.admin_app.permissions.settings?.sso?.main);\n\n return (\n <Page.Protect permissions={permissions}>\n <SingleSignOnPage />\n </Page.Protect>\n );\n};\n"],"names":["SCHEMA","yup","object","shape","autoRegister","bool","required","translatedErrors","defaultRole","mixed","when","value","initSchema","nullable","ssoLockedRoles","array","of","SingleSignOnPage","formatMessage","useIntl","permissions","useTypedSelector","state","admin_app","toggleNotification","useNotification","_unstableFormatAPIError","formatAPIError","_unstableFormatValidationErrors","formatValidationErrors","useAPIErrorHandler","isLoading","isLoadingProviderOptions","data","useGetProviderOptionsQuery","updateProviderOptions","isSubmittingForm","useUpdateProviderOptionsMutation","isLoadingPermissions","allowedActions","canUpdate","canRead","canReadRoles","useRBAC","settings","sso","readRoles","roles","read","isLoadingRoles","useAdminRoles","undefined","skip","handleSubmit","body","helpers","res","isBaseQueryError","error","name","setErrors","type","message","id","err","defaultMessage","isLoadingData","_jsxs","_Fragment","_jsx","Page","Title","Main","aria-busy","tabIndex","Form","method","onSubmit","validationSchema","disabled","initialValues","modified","isSubmitting","Layouts","Header","primaryAction","Button","loading","startIcon","Check","title","subtitle","secondaryAction","GradientBadge","label","Content","Loading","Flex","direction","alignItems","gap","background","padding","shadow","hasRadius","Typography","variant","tag","Grid","Root","hint","size","options","map","toString","placeholder","field","Item","col","FormInputRenderer","props","MultiSelectInput","InputRenderer","useField","Field","Label","MultiSelect","onChange","onClear","withTags","MultiSelectOption","Hint","Error","ProtectedSSO","main","Protect"],"mappings":"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"}
@@ -71,7 +71,7 @@ const SingleSignOnPage = ()=>{
71
71
  }
72
72
  };
73
73
  const isLoadingData = isLoadingRoles || isLoadingPermissions || isLoadingProviderOptions;
74
- return /*#__PURE__*/ jsxs(Layouts.Root, {
74
+ return /*#__PURE__*/ jsxs(Fragment, {
75
75
  children: [
76
76
  /*#__PURE__*/ jsx(Page.Title, {
77
77
  children: formatMessage({
@@ -1 +1 @@
1
- {"version":3,"file":"SingleSignOnPage.mjs","sources":["../../../../../../../../ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.tsx"],"sourcesContent":["import {\n Button,\n Flex,\n Grid,\n MultiSelect,\n MultiSelectOption,\n Typography,\n Field,\n} from '@strapi/design-system';\nimport { Check } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport * as yup from 'yup';\n\nimport {\n Form,\n FormHelpers,\n InputProps,\n useField,\n} from '../../../../../../admin/src/components/Form';\nimport { InputRenderer } from '../../../../../../admin/src/components/FormInputs/Renderer';\nimport { GradientBadge } from '../../../../../../admin/src/components/GradientBadge';\nimport { Layouts } from '../../../../../../admin/src/components/Layouts/Layout';\nimport { Page } from '../../../../../../admin/src/components/PageHelpers';\nimport { useTypedSelector } from '../../../../../../admin/src/core/store/hooks';\nimport { useNotification } from '../../../../../../admin/src/features/Notifications';\nimport { useAdminRoles } from '../../../../../../admin/src/hooks/useAdminRoles';\nimport { useAPIErrorHandler } from '../../../../../../admin/src/hooks/useAPIErrorHandler';\nimport { useRBAC } from '../../../../../../admin/src/hooks/useRBAC';\nimport {\n useGetProviderOptionsQuery,\n useUpdateProviderOptionsMutation,\n} from '../../../../../../admin/src/services/auth';\nimport { isBaseQueryError } from '../../../../../../admin/src/utils/baseQuery';\nimport { translatedErrors } from '../../../../../../admin/src/utils/translatedErrors';\nimport { ProvidersOptions } from '../../../../../../shared/contracts/admin';\n\nconst SCHEMA = yup.object().shape({\n autoRegister: yup.bool().required(translatedErrors.required),\n defaultRole: yup.mixed().when('autoRegister', (value, initSchema) => {\n return value ? initSchema.required(translatedErrors.required) : initSchema.nullable();\n }),\n ssoLockedRoles: yup\n .array()\n .nullable()\n .of(\n yup.mixed().when('ssoLockedRoles', (value, initSchema) => {\n return value ? initSchema.required(translatedErrors.required) : initSchema.nullable();\n })\n ),\n});\n\nexport const SingleSignOnPage = () => {\n const { formatMessage } = useIntl();\n const permissions = useTypedSelector((state) => state.admin_app.permissions);\n const { toggleNotification } = useNotification();\n const {\n _unstableFormatAPIError: formatAPIError,\n _unstableFormatValidationErrors: formatValidationErrors,\n } = useAPIErrorHandler();\n\n const { isLoading: isLoadingProviderOptions, data } = useGetProviderOptionsQuery();\n\n const [updateProviderOptions, { isLoading: isSubmittingForm }] =\n useUpdateProviderOptionsMutation();\n\n const {\n isLoading: isLoadingPermissions,\n allowedActions: { canUpdate, canRead: canReadRoles },\n } = useRBAC({\n ...permissions.settings?.sso,\n readRoles: permissions.settings?.roles.read ?? [],\n });\n\n const { roles, isLoading: isLoadingRoles } = useAdminRoles(undefined, {\n skip: !canReadRoles,\n });\n\n const handleSubmit = async (\n body: ProvidersOptions.Request['body'],\n helpers: FormHelpers<ProvidersOptions.Request['body']>\n ) => {\n try {\n const res = await updateProviderOptions(body);\n\n if ('error' in res) {\n if (isBaseQueryError(res.error) && res.error.name === 'ValidationError') {\n helpers.setErrors(formatValidationErrors(res.error));\n } else {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(res.error),\n });\n }\n\n return;\n }\n\n toggleNotification({\n type: 'success',\n message: formatMessage({ id: 'notification.success.saved' }),\n });\n } catch (err) {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: 'notification.error',\n defaultMessage: 'An error occurred, please try again.',\n }),\n });\n }\n };\n\n const isLoadingData = isLoadingRoles || isLoadingPermissions || isLoadingProviderOptions;\n\n return (\n <Layouts.Root>\n <Page.Title>\n {formatMessage(\n { id: 'Settings.PageTitle', defaultMessage: 'Settings - {name}' },\n {\n name: 'SSO',\n }\n )}\n </Page.Title>\n <Page.Main aria-busy={isSubmittingForm || isLoadingData} tabIndex={-1}>\n <Form\n method=\"PUT\"\n onSubmit={handleSubmit}\n validationSchema={SCHEMA}\n disabled={!canUpdate}\n initialValues={\n data || {\n autoRegister: false,\n defaultRole: null,\n ssoLockedRoles: null,\n }\n }\n >\n {({ modified, isSubmitting }) => (\n <>\n <Layouts.Header\n primaryAction={\n <Button\n disabled={!modified}\n loading={isSubmitting}\n startIcon={<Check />}\n type=\"submit\"\n >\n {formatMessage({\n id: 'global.save',\n defaultMessage: 'Save',\n })}\n </Button>\n }\n title={formatMessage({\n id: 'Settings.sso.title',\n defaultMessage: 'Single Sign-On',\n })}\n subtitle={formatMessage({\n id: 'Settings.sso.description',\n defaultMessage: 'Configure the settings for the Single Sign-On feature.',\n })}\n secondaryAction={\n <GradientBadge\n label={formatMessage({\n id: 'components.premiumFeature.title',\n defaultMessage: 'Premium feature',\n })}\n />\n }\n />\n <Layouts.Content>\n {isSubmitting || isLoadingData ? (\n <Page.Loading />\n ) : (\n <Flex\n direction=\"column\"\n alignItems=\"stretch\"\n gap={4}\n background=\"neutral0\"\n padding={6}\n shadow=\"filterShadow\"\n hasRadius\n >\n <Typography variant=\"delta\" tag=\"h2\">\n {formatMessage({\n id: 'global.settings',\n defaultMessage: 'Settings',\n })}\n </Typography>\n <Grid.Root gap={4}>\n {[\n {\n hint: formatMessage({\n id: 'Settings.sso.form.registration.description',\n defaultMessage: 'Create new user on SSO login if no account exists',\n }),\n label: formatMessage({\n id: 'Settings.sso.form.registration.label',\n defaultMessage: 'Auto-registration',\n }),\n name: 'autoRegister',\n size: 6,\n type: 'boolean' as const,\n },\n {\n hint: formatMessage({\n id: 'Settings.sso.form.defaultRole.description',\n defaultMessage:\n 'It will attach the new authenticated user to the selected role',\n }),\n label: formatMessage({\n id: 'Settings.sso.form.defaultRole.label',\n defaultMessage: 'Default role',\n }),\n name: 'defaultRole',\n options: roles.map(({ id, name }) => ({\n label: name,\n value: id.toString(),\n })),\n placeholder: formatMessage({\n id: 'components.InputSelect.option.placeholder',\n defaultMessage: 'Choose here',\n }),\n size: 6,\n type: 'enumeration' as const,\n },\n {\n hint: formatMessage({\n id: 'Settings.sso.form.localAuthenticationLock.description',\n defaultMessage:\n 'Select the roles for which you want to disable the local authentication',\n }),\n label: formatMessage({\n id: 'Settings.sso.form.localAuthenticationLock.label',\n defaultMessage: 'Local authentication lock-out',\n }),\n name: 'ssoLockedRoles',\n options: roles.map(({ id, name }) => ({\n label: name,\n value: id.toString(),\n })),\n placeholder: formatMessage({\n id: 'components.InputSelect.option.placeholder',\n defaultMessage: 'Choose here',\n }),\n size: 6,\n type: 'multi' as const,\n },\n ].map(({ size, ...field }) => (\n <Grid.Item\n key={field.name}\n col={size}\n direction=\"column\"\n alignItems=\"stretch\"\n >\n <FormInputRenderer {...field} />\n </Grid.Item>\n ))}\n </Grid.Root>\n </Flex>\n )}\n </Layouts.Content>\n </>\n )}\n </Form>\n </Page.Main>\n </Layouts.Root>\n );\n};\n\ntype FormInputProps = InputProps | MultiSelectInputProps;\n\nconst FormInputRenderer = (props: FormInputProps) => {\n switch (props.type) {\n case 'multi':\n return <MultiSelectInput {...props} />;\n default:\n return <InputRenderer {...props} />;\n }\n};\n\ntype MultiSelectInputProps = Omit<Extract<InputProps, { type: 'enumeration' }>, 'type'> & {\n type: 'multi';\n};\n\nconst MultiSelectInput = ({ hint, label, name, options, ...props }: MultiSelectInputProps) => {\n const field = useField(name);\n\n return (\n <Field.Root name={name} hint={hint} error={field.error}>\n <Field.Label>{label}</Field.Label>\n <MultiSelect\n onChange={(value) => field.onChange('ssoLockedRoles', value)}\n onClear={() => field.onChange('ssoLockedRoles', [])}\n value={field.value ?? []}\n withTags\n {...props}\n >\n {options.map(({ label, value }) => (\n <MultiSelectOption key={value} value={value}>\n {label}\n </MultiSelectOption>\n ))}\n </MultiSelect>\n <Field.Hint />\n <Field.Error />\n </Field.Root>\n );\n};\n\nexport const ProtectedSSO = () => {\n const permissions = useTypedSelector((state) => state.admin_app.permissions.settings?.sso?.main);\n\n return (\n <Page.Protect permissions={permissions}>\n <SingleSignOnPage />\n </Page.Protect>\n );\n};\n"],"names":["SCHEMA","yup","object","shape","autoRegister","bool","required","translatedErrors","defaultRole","mixed","when","value","initSchema","nullable","ssoLockedRoles","array","of","SingleSignOnPage","formatMessage","useIntl","permissions","useTypedSelector","state","admin_app","toggleNotification","useNotification","_unstableFormatAPIError","formatAPIError","_unstableFormatValidationErrors","formatValidationErrors","useAPIErrorHandler","isLoading","isLoadingProviderOptions","data","useGetProviderOptionsQuery","updateProviderOptions","isSubmittingForm","useUpdateProviderOptionsMutation","isLoadingPermissions","allowedActions","canUpdate","canRead","canReadRoles","useRBAC","settings","sso","readRoles","roles","read","isLoadingRoles","useAdminRoles","undefined","skip","handleSubmit","body","helpers","res","isBaseQueryError","error","name","setErrors","type","message","id","err","defaultMessage","isLoadingData","_jsxs","Layouts","Root","_jsx","Page","Title","Main","aria-busy","tabIndex","Form","method","onSubmit","validationSchema","disabled","initialValues","modified","isSubmitting","_Fragment","Header","primaryAction","Button","loading","startIcon","Check","title","subtitle","secondaryAction","GradientBadge","label","Content","Loading","Flex","direction","alignItems","gap","background","padding","shadow","hasRadius","Typography","variant","tag","Grid","hint","size","options","map","toString","placeholder","field","Item","col","FormInputRenderer","props","MultiSelectInput","InputRenderer","useField","Field","Label","MultiSelect","onChange","onClear","withTags","MultiSelectOption","Hint","Error","ProtectedSSO","main","Protect"],"mappings":"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"}
1
+ {"version":3,"file":"SingleSignOnPage.mjs","sources":["../../../../../../../../ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.tsx"],"sourcesContent":["import {\n Button,\n Flex,\n Grid,\n MultiSelect,\n MultiSelectOption,\n Typography,\n Field,\n} from '@strapi/design-system';\nimport { Check } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport * as yup from 'yup';\n\nimport {\n Form,\n FormHelpers,\n InputProps,\n useField,\n} from '../../../../../../admin/src/components/Form';\nimport { InputRenderer } from '../../../../../../admin/src/components/FormInputs/Renderer';\nimport { GradientBadge } from '../../../../../../admin/src/components/GradientBadge';\nimport { Layouts } from '../../../../../../admin/src/components/Layouts/Layout';\nimport { Page } from '../../../../../../admin/src/components/PageHelpers';\nimport { useTypedSelector } from '../../../../../../admin/src/core/store/hooks';\nimport { useNotification } from '../../../../../../admin/src/features/Notifications';\nimport { useAdminRoles } from '../../../../../../admin/src/hooks/useAdminRoles';\nimport { useAPIErrorHandler } from '../../../../../../admin/src/hooks/useAPIErrorHandler';\nimport { useRBAC } from '../../../../../../admin/src/hooks/useRBAC';\nimport {\n useGetProviderOptionsQuery,\n useUpdateProviderOptionsMutation,\n} from '../../../../../../admin/src/services/auth';\nimport { isBaseQueryError } from '../../../../../../admin/src/utils/baseQuery';\nimport { translatedErrors } from '../../../../../../admin/src/utils/translatedErrors';\nimport { ProvidersOptions } from '../../../../../../shared/contracts/admin';\n\nconst SCHEMA = yup.object().shape({\n autoRegister: yup.bool().required(translatedErrors.required),\n defaultRole: yup.mixed().when('autoRegister', (value, initSchema) => {\n return value ? initSchema.required(translatedErrors.required) : initSchema.nullable();\n }),\n ssoLockedRoles: yup\n .array()\n .nullable()\n .of(\n yup.mixed().when('ssoLockedRoles', (value, initSchema) => {\n return value ? initSchema.required(translatedErrors.required) : initSchema.nullable();\n })\n ),\n});\n\nexport const SingleSignOnPage = () => {\n const { formatMessage } = useIntl();\n const permissions = useTypedSelector((state) => state.admin_app.permissions);\n const { toggleNotification } = useNotification();\n const {\n _unstableFormatAPIError: formatAPIError,\n _unstableFormatValidationErrors: formatValidationErrors,\n } = useAPIErrorHandler();\n\n const { isLoading: isLoadingProviderOptions, data } = useGetProviderOptionsQuery();\n\n const [updateProviderOptions, { isLoading: isSubmittingForm }] =\n useUpdateProviderOptionsMutation();\n\n const {\n isLoading: isLoadingPermissions,\n allowedActions: { canUpdate, canRead: canReadRoles },\n } = useRBAC({\n ...permissions.settings?.sso,\n readRoles: permissions.settings?.roles.read ?? [],\n });\n\n const { roles, isLoading: isLoadingRoles } = useAdminRoles(undefined, {\n skip: !canReadRoles,\n });\n\n const handleSubmit = async (\n body: ProvidersOptions.Request['body'],\n helpers: FormHelpers<ProvidersOptions.Request['body']>\n ) => {\n try {\n const res = await updateProviderOptions(body);\n\n if ('error' in res) {\n if (isBaseQueryError(res.error) && res.error.name === 'ValidationError') {\n helpers.setErrors(formatValidationErrors(res.error));\n } else {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(res.error),\n });\n }\n\n return;\n }\n\n toggleNotification({\n type: 'success',\n message: formatMessage({ id: 'notification.success.saved' }),\n });\n } catch (err) {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: 'notification.error',\n defaultMessage: 'An error occurred, please try again.',\n }),\n });\n }\n };\n\n const isLoadingData = isLoadingRoles || isLoadingPermissions || isLoadingProviderOptions;\n\n return (\n <>\n <Page.Title>\n {formatMessage(\n { id: 'Settings.PageTitle', defaultMessage: 'Settings - {name}' },\n {\n name: 'SSO',\n }\n )}\n </Page.Title>\n <Page.Main aria-busy={isSubmittingForm || isLoadingData} tabIndex={-1}>\n <Form\n method=\"PUT\"\n onSubmit={handleSubmit}\n validationSchema={SCHEMA}\n disabled={!canUpdate}\n initialValues={\n data || {\n autoRegister: false,\n defaultRole: null,\n ssoLockedRoles: null,\n }\n }\n >\n {({ modified, isSubmitting }) => (\n <>\n <Layouts.Header\n primaryAction={\n <Button\n disabled={!modified}\n loading={isSubmitting}\n startIcon={<Check />}\n type=\"submit\"\n >\n {formatMessage({\n id: 'global.save',\n defaultMessage: 'Save',\n })}\n </Button>\n }\n title={formatMessage({\n id: 'Settings.sso.title',\n defaultMessage: 'Single Sign-On',\n })}\n subtitle={formatMessage({\n id: 'Settings.sso.description',\n defaultMessage: 'Configure the settings for the Single Sign-On feature.',\n })}\n secondaryAction={\n <GradientBadge\n label={formatMessage({\n id: 'components.premiumFeature.title',\n defaultMessage: 'Premium feature',\n })}\n />\n }\n />\n <Layouts.Content>\n {isSubmitting || isLoadingData ? (\n <Page.Loading />\n ) : (\n <Flex\n direction=\"column\"\n alignItems=\"stretch\"\n gap={4}\n background=\"neutral0\"\n padding={6}\n shadow=\"filterShadow\"\n hasRadius\n >\n <Typography variant=\"delta\" tag=\"h2\">\n {formatMessage({\n id: 'global.settings',\n defaultMessage: 'Settings',\n })}\n </Typography>\n <Grid.Root gap={4}>\n {[\n {\n hint: formatMessage({\n id: 'Settings.sso.form.registration.description',\n defaultMessage: 'Create new user on SSO login if no account exists',\n }),\n label: formatMessage({\n id: 'Settings.sso.form.registration.label',\n defaultMessage: 'Auto-registration',\n }),\n name: 'autoRegister',\n size: 6,\n type: 'boolean' as const,\n },\n {\n hint: formatMessage({\n id: 'Settings.sso.form.defaultRole.description',\n defaultMessage:\n 'It will attach the new authenticated user to the selected role',\n }),\n label: formatMessage({\n id: 'Settings.sso.form.defaultRole.label',\n defaultMessage: 'Default role',\n }),\n name: 'defaultRole',\n options: roles.map(({ id, name }) => ({\n label: name,\n value: id.toString(),\n })),\n placeholder: formatMessage({\n id: 'components.InputSelect.option.placeholder',\n defaultMessage: 'Choose here',\n }),\n size: 6,\n type: 'enumeration' as const,\n },\n {\n hint: formatMessage({\n id: 'Settings.sso.form.localAuthenticationLock.description',\n defaultMessage:\n 'Select the roles for which you want to disable the local authentication',\n }),\n label: formatMessage({\n id: 'Settings.sso.form.localAuthenticationLock.label',\n defaultMessage: 'Local authentication lock-out',\n }),\n name: 'ssoLockedRoles',\n options: roles.map(({ id, name }) => ({\n label: name,\n value: id.toString(),\n })),\n placeholder: formatMessage({\n id: 'components.InputSelect.option.placeholder',\n defaultMessage: 'Choose here',\n }),\n size: 6,\n type: 'multi' as const,\n },\n ].map(({ size, ...field }) => (\n <Grid.Item\n key={field.name}\n col={size}\n direction=\"column\"\n alignItems=\"stretch\"\n >\n <FormInputRenderer {...field} />\n </Grid.Item>\n ))}\n </Grid.Root>\n </Flex>\n )}\n </Layouts.Content>\n </>\n )}\n </Form>\n </Page.Main>\n </>\n );\n};\n\ntype FormInputProps = InputProps | MultiSelectInputProps;\n\nconst FormInputRenderer = (props: FormInputProps) => {\n switch (props.type) {\n case 'multi':\n return <MultiSelectInput {...props} />;\n default:\n return <InputRenderer {...props} />;\n }\n};\n\ntype MultiSelectInputProps = Omit<Extract<InputProps, { type: 'enumeration' }>, 'type'> & {\n type: 'multi';\n};\n\nconst MultiSelectInput = ({ hint, label, name, options, ...props }: MultiSelectInputProps) => {\n const field = useField(name);\n\n return (\n <Field.Root name={name} hint={hint} error={field.error}>\n <Field.Label>{label}</Field.Label>\n <MultiSelect\n onChange={(value) => field.onChange('ssoLockedRoles', value)}\n onClear={() => field.onChange('ssoLockedRoles', [])}\n value={field.value ?? []}\n withTags\n {...props}\n >\n {options.map(({ label, value }) => (\n <MultiSelectOption key={value} value={value}>\n {label}\n </MultiSelectOption>\n ))}\n </MultiSelect>\n <Field.Hint />\n <Field.Error />\n </Field.Root>\n );\n};\n\nexport const ProtectedSSO = () => {\n const permissions = useTypedSelector((state) => state.admin_app.permissions.settings?.sso?.main);\n\n return (\n <Page.Protect permissions={permissions}>\n <SingleSignOnPage />\n </Page.Protect>\n );\n};\n"],"names":["SCHEMA","yup","object","shape","autoRegister","bool","required","translatedErrors","defaultRole","mixed","when","value","initSchema","nullable","ssoLockedRoles","array","of","SingleSignOnPage","formatMessage","useIntl","permissions","useTypedSelector","state","admin_app","toggleNotification","useNotification","_unstableFormatAPIError","formatAPIError","_unstableFormatValidationErrors","formatValidationErrors","useAPIErrorHandler","isLoading","isLoadingProviderOptions","data","useGetProviderOptionsQuery","updateProviderOptions","isSubmittingForm","useUpdateProviderOptionsMutation","isLoadingPermissions","allowedActions","canUpdate","canRead","canReadRoles","useRBAC","settings","sso","readRoles","roles","read","isLoadingRoles","useAdminRoles","undefined","skip","handleSubmit","body","helpers","res","isBaseQueryError","error","name","setErrors","type","message","id","err","defaultMessage","isLoadingData","_jsxs","_Fragment","_jsx","Page","Title","Main","aria-busy","tabIndex","Form","method","onSubmit","validationSchema","disabled","initialValues","modified","isSubmitting","Layouts","Header","primaryAction","Button","loading","startIcon","Check","title","subtitle","secondaryAction","GradientBadge","label","Content","Loading","Flex","direction","alignItems","gap","background","padding","shadow","hasRadius","Typography","variant","tag","Grid","Root","hint","size","options","map","toString","placeholder","field","Item","col","FormInputRenderer","props","MultiSelectInput","InputRenderer","useField","Field","Label","MultiSelect","onChange","onClear","withTags","MultiSelectOption","Hint","Error","ProtectedSSO","main","Protect"],"mappings":"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"}
@@ -8,7 +8,10 @@ const aiService = api.adminApi.injectEndpoints({
8
8
  query: ()=>({
9
9
  method: 'GET',
10
10
  url: `/admin/ai-usage`
11
- })
11
+ }),
12
+ providesTags: [
13
+ 'AIUsage'
14
+ ]
12
15
  }),
13
16
  getAiToken: builder.query({
14
17
  query: ()=>({
@@ -20,7 +23,7 @@ const aiService = api.adminApi.injectEndpoints({
20
23
  }
21
24
  })
22
25
  }),
23
- overrideExisting: false
26
+ overrideExisting: true
24
27
  });
25
28
  const { useGetAIUsageQuery, useGetAiTokenQuery, useLazyGetAiTokenQuery } = aiService;
26
29
 
@@ -1 +1 @@
1
- {"version":3,"file":"ai.js","sources":["../../../../../../ee/admin/src/services/ai.ts"],"sourcesContent":["import { adminApi } from '../../../../admin/src/services/api';\nimport { GetAiUsage, GetAiToken } from '../../../../shared/contracts/ai';\n\nconst aiService = adminApi.injectEndpoints({\n endpoints: (builder) => ({\n getAIUsage: builder.query<GetAiUsage.Response, void>({\n query: () => ({\n method: 'GET',\n url: `/admin/ai-usage`,\n }),\n }),\n getAiToken: builder.query<GetAiToken.Response['data'], void>({\n query: () => ({\n method: 'GET',\n url: '/admin/ai-token',\n }),\n transformResponse(res: GetAiToken.Response) {\n return res.data;\n },\n }),\n }),\n overrideExisting: false,\n});\n\nconst { useGetAIUsageQuery, useGetAiTokenQuery, useLazyGetAiTokenQuery } = aiService;\n\nexport { useGetAIUsageQuery, useGetAiTokenQuery, useLazyGetAiTokenQuery };\n"],"names":["aiService","adminApi","injectEndpoints","endpoints","builder","getAIUsage","query","method","url","getAiToken","transformResponse","res","data","overrideExisting","useGetAIUsageQuery","useGetAiTokenQuery","useLazyGetAiTokenQuery"],"mappings":";;;;AAGA,MAAMA,SAAAA,GAAYC,YAASC,CAAAA,eAAe,CAAC;IACzCC,SAAW,EAAA,CAACC,WAAa;YACvBC,UAAYD,EAAAA,OAAAA,CAAQE,KAAK,CAA4B;AACnDA,gBAAAA,KAAAA,EAAO,KAAO;wBACZC,MAAQ,EAAA,KAAA;wBACRC,GAAK,EAAA,CAAC,eAAe;qBACvB;AACF,aAAA,CAAA;YACAC,UAAYL,EAAAA,OAAAA,CAAQE,KAAK,CAAoC;AAC3DA,gBAAAA,KAAAA,EAAO,KAAO;wBACZC,MAAQ,EAAA,KAAA;wBACRC,GAAK,EAAA;qBACP,CAAA;AACAE,gBAAAA,iBAAAA,CAAAA,CAAkBC,GAAwB,EAAA;AACxC,oBAAA,OAAOA,IAAIC,IAAI;AACjB;AACF,aAAA;SACF,CAAA;IACAC,gBAAkB,EAAA;AACpB,CAAA,CAAA;AAEA,MAAM,EAAEC,kBAAkB,EAAEC,kBAAkB,EAAEC,sBAAsB,EAAE,GAAGhB;;;;;;"}
1
+ {"version":3,"file":"ai.js","sources":["../../../../../../ee/admin/src/services/ai.ts"],"sourcesContent":["import { adminApi } from '../../../../admin/src/services/api';\nimport { GetAiUsage, GetAiToken } from '../../../../shared/contracts/ai';\n\nconst aiService = adminApi.injectEndpoints({\n endpoints: (builder) => ({\n getAIUsage: builder.query<GetAiUsage.Response, void>({\n query: () => ({\n method: 'GET',\n url: `/admin/ai-usage`,\n }),\n providesTags: ['AIUsage'],\n }),\n getAiToken: builder.query<GetAiToken.Response['data'], void>({\n query: () => ({\n method: 'GET',\n url: '/admin/ai-token',\n }),\n transformResponse(res: GetAiToken.Response) {\n return res.data;\n },\n }),\n }),\n overrideExisting: true,\n});\n\nconst { useGetAIUsageQuery, useGetAiTokenQuery, useLazyGetAiTokenQuery } = aiService;\n\nexport { useGetAIUsageQuery, useGetAiTokenQuery, useLazyGetAiTokenQuery };\n"],"names":["aiService","adminApi","injectEndpoints","endpoints","builder","getAIUsage","query","method","url","providesTags","getAiToken","transformResponse","res","data","overrideExisting","useGetAIUsageQuery","useGetAiTokenQuery","useLazyGetAiTokenQuery"],"mappings":";;;;AAGA,MAAMA,SAAAA,GAAYC,YAASC,CAAAA,eAAe,CAAC;IACzCC,SAAW,EAAA,CAACC,WAAa;YACvBC,UAAYD,EAAAA,OAAAA,CAAQE,KAAK,CAA4B;AACnDA,gBAAAA,KAAAA,EAAO,KAAO;wBACZC,MAAQ,EAAA,KAAA;wBACRC,GAAK,EAAA,CAAC,eAAe;qBACvB,CAAA;gBACAC,YAAc,EAAA;AAAC,oBAAA;AAAU;AAC3B,aAAA,CAAA;YACAC,UAAYN,EAAAA,OAAAA,CAAQE,KAAK,CAAoC;AAC3DA,gBAAAA,KAAAA,EAAO,KAAO;wBACZC,MAAQ,EAAA,KAAA;wBACRC,GAAK,EAAA;qBACP,CAAA;AACAG,gBAAAA,iBAAAA,CAAAA,CAAkBC,GAAwB,EAAA;AACxC,oBAAA,OAAOA,IAAIC,IAAI;AACjB;AACF,aAAA;SACF,CAAA;IACAC,gBAAkB,EAAA;AACpB,CAAA,CAAA;AAEA,MAAM,EAAEC,kBAAkB,EAAEC,kBAAkB,EAAEC,sBAAsB,EAAE,GAAGjB;;;;;;"}
@@ -6,7 +6,10 @@ const aiService = adminApi.injectEndpoints({
6
6
  query: ()=>({
7
7
  method: 'GET',
8
8
  url: `/admin/ai-usage`
9
- })
9
+ }),
10
+ providesTags: [
11
+ 'AIUsage'
12
+ ]
10
13
  }),
11
14
  getAiToken: builder.query({
12
15
  query: ()=>({
@@ -18,7 +21,7 @@ const aiService = adminApi.injectEndpoints({
18
21
  }
19
22
  })
20
23
  }),
21
- overrideExisting: false
24
+ overrideExisting: true
22
25
  });
23
26
  const { useGetAIUsageQuery, useGetAiTokenQuery, useLazyGetAiTokenQuery } = aiService;
24
27