@thunderid/react 1.14.0 → 1.15.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 (621) hide show
  1. package/dist/ThunderIDReactClient.d.ts.map +1 -1
  2. package/dist/ThunderIDReactClient.js +6 -2
  3. package/dist/ThunderIDReactClient.js.map +1 -1
  4. package/dist/api/account/getAccessibleOrganizationUnits.d.ts +27 -0
  5. package/dist/api/account/getAccessibleOrganizationUnits.d.ts.map +1 -0
  6. package/dist/api/account/getAccessibleOrganizationUnits.js +24 -0
  7. package/dist/api/account/getAccessibleOrganizationUnits.js.map +1 -0
  8. package/dist/cjs/ThunderIDReactClient.cjs +6 -2
  9. package/dist/cjs/ThunderIDReactClient.cjs.map +1 -1
  10. package/dist/cjs/api/account/getAccessibleOrganizationUnits.cjs +26 -0
  11. package/dist/cjs/api/account/getAccessibleOrganizationUnits.cjs.map +1 -0
  12. package/dist/cjs/components/account/OrganizationUnitSwitcher/BaseOrganizationUnitSwitcher.cjs +214 -0
  13. package/dist/cjs/components/account/OrganizationUnitSwitcher/BaseOrganizationUnitSwitcher.cjs.map +1 -0
  14. package/dist/cjs/components/account/OrganizationUnitSwitcher/BaseOrganizationUnitSwitcher.styles.cjs +184 -0
  15. package/dist/cjs/components/account/OrganizationUnitSwitcher/BaseOrganizationUnitSwitcher.styles.cjs.map +1 -0
  16. package/dist/cjs/components/account/OrganizationUnitSwitcher/OrganizationUnitSwitcher.cjs +139 -0
  17. package/dist/cjs/components/account/OrganizationUnitSwitcher/OrganizationUnitSwitcher.cjs.map +1 -0
  18. package/dist/cjs/components/auth/SignIn/SignIn.cjs +23 -20
  19. package/dist/cjs/components/auth/SignIn/SignIn.cjs.map +1 -1
  20. package/dist/cjs/components/auth/SignUp/BaseSignUp.cjs +13 -9
  21. package/dist/cjs/components/auth/SignUp/BaseSignUp.cjs.map +1 -1
  22. package/dist/cjs/components/auth/flow/AuthOptionFactory.cjs +2 -2
  23. package/dist/cjs/components/auth/flow/AuthOptionFactory.cjs.map +1 -1
  24. package/dist/cjs/components/common/LanguageSwitcher/BaseLanguageSwitcher.cjs +1 -1
  25. package/dist/cjs/components/{admin → management}/AgentCreate/AgentCreate.cjs +8 -7
  26. package/dist/cjs/components/management/AgentCreate/AgentCreate.cjs.map +1 -0
  27. package/dist/cjs/components/{admin → management}/AgentCreate/BaseAgentCreate.cjs +1 -1
  28. package/dist/cjs/components/management/AgentCreate/BaseAgentCreate.cjs.map +1 -0
  29. package/dist/cjs/components/{admin → management}/AgentDetails/AgentDetails.cjs +1 -1
  30. package/dist/cjs/components/management/AgentDetails/AgentDetails.cjs.map +1 -0
  31. package/dist/cjs/components/{admin → management}/AgentDetails/BaseAgentDetails.cjs +1 -1
  32. package/dist/cjs/components/management/AgentDetails/BaseAgentDetails.cjs.map +1 -0
  33. package/dist/cjs/components/{admin → management}/AgentList/AgentList.cjs +11 -6
  34. package/dist/cjs/components/management/AgentList/AgentList.cjs.map +1 -0
  35. package/dist/cjs/components/{admin → management}/AgentList/BaseAgentList.cjs +1 -1
  36. package/dist/cjs/components/management/AgentList/BaseAgentList.cjs.map +1 -0
  37. package/dist/cjs/components/{admin → management}/ApplicationCreate/ApplicationCreate.cjs +10 -5
  38. package/dist/cjs/components/management/ApplicationCreate/ApplicationCreate.cjs.map +1 -0
  39. package/dist/cjs/components/{admin → management}/ApplicationCreate/BaseApplicationCreate.cjs +1 -1
  40. package/dist/cjs/components/management/ApplicationCreate/BaseApplicationCreate.cjs.map +1 -0
  41. package/dist/cjs/components/{admin → management}/ApplicationDetails/ApplicationDetails.cjs +1 -1
  42. package/dist/cjs/components/management/ApplicationDetails/ApplicationDetails.cjs.map +1 -0
  43. package/dist/cjs/components/{admin → management}/ApplicationDetails/BaseApplicationDetails.cjs +1 -1
  44. package/dist/cjs/components/management/ApplicationDetails/BaseApplicationDetails.cjs.map +1 -0
  45. package/dist/cjs/components/{admin → management}/ApplicationList/ApplicationList.cjs +9 -4
  46. package/dist/cjs/components/management/ApplicationList/ApplicationList.cjs.map +1 -0
  47. package/dist/cjs/components/{admin → management}/ApplicationList/BaseApplicationList.cjs +1 -1
  48. package/dist/cjs/components/management/ApplicationList/BaseApplicationList.cjs.map +1 -0
  49. package/dist/cjs/components/{admin → management}/GroupCreate/BaseGroupCreate.cjs +1 -1
  50. package/dist/cjs/components/management/GroupCreate/BaseGroupCreate.cjs.map +1 -0
  51. package/dist/cjs/components/{admin → management}/GroupCreate/GroupCreate.cjs +1 -1
  52. package/dist/cjs/components/management/GroupCreate/GroupCreate.cjs.map +1 -0
  53. package/dist/cjs/components/management/GroupDetails/BaseGroupDetails.cjs +86 -0
  54. package/dist/cjs/components/management/GroupDetails/BaseGroupDetails.cjs.map +1 -0
  55. package/dist/cjs/components/management/GroupDetails/GroupDetails.cjs +60 -0
  56. package/dist/cjs/components/management/GroupDetails/GroupDetails.cjs.map +1 -0
  57. package/dist/cjs/components/{admin → management}/GroupList/BaseGroupList.cjs +1 -1
  58. package/dist/cjs/components/management/GroupList/BaseGroupList.cjs.map +1 -0
  59. package/dist/cjs/components/{admin → management}/GroupList/GroupList.cjs +1 -1
  60. package/dist/cjs/components/management/GroupList/GroupList.cjs.map +1 -0
  61. package/dist/cjs/components/{admin → management}/GroupMembers/BaseGroupMembers.cjs +1 -1
  62. package/dist/cjs/components/management/GroupMembers/BaseGroupMembers.cjs.map +1 -0
  63. package/dist/cjs/components/{admin → management}/GroupMembers/GroupMembers.cjs +1 -1
  64. package/dist/cjs/components/management/GroupMembers/GroupMembers.cjs.map +1 -0
  65. package/dist/cjs/components/management/OrganizationUnitCreate/BaseOrganizationUnitCreate.cjs +140 -0
  66. package/dist/cjs/components/management/OrganizationUnitCreate/BaseOrganizationUnitCreate.cjs.map +1 -0
  67. package/dist/cjs/components/management/OrganizationUnitCreate/OrganizationUnitCreate.cjs +83 -0
  68. package/dist/cjs/components/management/OrganizationUnitCreate/OrganizationUnitCreate.cjs.map +1 -0
  69. package/dist/cjs/components/management/OrganizationUnitDetails/BaseOrganizationUnitDetails.cjs +276 -0
  70. package/dist/cjs/components/management/OrganizationUnitDetails/BaseOrganizationUnitDetails.cjs.map +1 -0
  71. package/dist/cjs/components/management/OrganizationUnitDetails/OrganizationUnitDetails.cjs +142 -0
  72. package/dist/cjs/components/management/OrganizationUnitDetails/OrganizationUnitDetails.cjs.map +1 -0
  73. package/dist/cjs/components/management/OrganizationUnitList/BaseOrganizationUnitList.cjs +78 -0
  74. package/dist/cjs/components/management/OrganizationUnitList/BaseOrganizationUnitList.cjs.map +1 -0
  75. package/dist/cjs/components/management/OrganizationUnitList/OrganizationUnitList.cjs +69 -0
  76. package/dist/cjs/components/management/OrganizationUnitList/OrganizationUnitList.cjs.map +1 -0
  77. package/dist/cjs/components/management/ProjectCreate/BaseProjectCreate.cjs +116 -0
  78. package/dist/cjs/components/management/ProjectCreate/BaseProjectCreate.cjs.map +1 -0
  79. package/dist/cjs/components/management/ProjectCreate/ProjectCreate.cjs +43 -0
  80. package/dist/cjs/components/management/ProjectCreate/ProjectCreate.cjs.map +1 -0
  81. package/dist/cjs/components/management/ProjectDetails/BaseProjectDetails.cjs +172 -0
  82. package/dist/cjs/components/management/ProjectDetails/BaseProjectDetails.cjs.map +1 -0
  83. package/dist/cjs/components/management/ProjectDetails/ProjectDetails.cjs +68 -0
  84. package/dist/cjs/components/management/ProjectDetails/ProjectDetails.cjs.map +1 -0
  85. package/dist/cjs/components/management/ProjectList/BaseProjectList.cjs +78 -0
  86. package/dist/cjs/components/management/ProjectList/BaseProjectList.cjs.map +1 -0
  87. package/dist/cjs/components/management/ProjectList/ProjectList.cjs +51 -0
  88. package/dist/cjs/components/management/ProjectList/ProjectList.cjs.map +1 -0
  89. package/dist/cjs/components/management/ProjectSwitcher/BaseProjectSwitcher.cjs +58 -0
  90. package/dist/cjs/components/management/ProjectSwitcher/BaseProjectSwitcher.cjs.map +1 -0
  91. package/dist/cjs/components/management/ProjectSwitcher/ProjectSwitcher.cjs +72 -0
  92. package/dist/cjs/components/management/ProjectSwitcher/ProjectSwitcher.cjs.map +1 -0
  93. package/dist/cjs/components/{admin → management}/RoleAssignments/BaseRoleAssignments.cjs +1 -1
  94. package/dist/cjs/components/management/RoleAssignments/BaseRoleAssignments.cjs.map +1 -0
  95. package/dist/cjs/components/{admin → management}/RoleAssignments/RoleAssignments.cjs +1 -1
  96. package/dist/cjs/components/management/RoleAssignments/RoleAssignments.cjs.map +1 -0
  97. package/dist/cjs/components/{admin → management}/RoleCreate/BaseRoleCreate.cjs +1 -1
  98. package/dist/cjs/components/management/RoleCreate/BaseRoleCreate.cjs.map +1 -0
  99. package/dist/cjs/components/{admin → management}/RoleCreate/RoleCreate.cjs +1 -1
  100. package/dist/cjs/components/management/RoleCreate/RoleCreate.cjs.map +1 -0
  101. package/dist/cjs/components/management/RoleDetails/BaseRoleDetails.cjs +87 -0
  102. package/dist/cjs/components/management/RoleDetails/BaseRoleDetails.cjs.map +1 -0
  103. package/dist/cjs/components/management/RoleDetails/RoleDetails.cjs +68 -0
  104. package/dist/cjs/components/management/RoleDetails/RoleDetails.cjs.map +1 -0
  105. package/dist/cjs/components/{admin → management}/RoleList/BaseRoleList.cjs +1 -1
  106. package/dist/cjs/components/management/RoleList/BaseRoleList.cjs.map +1 -0
  107. package/dist/cjs/components/{admin → management}/RoleList/RoleList.cjs +1 -1
  108. package/dist/cjs/components/management/RoleList/RoleList.cjs.map +1 -0
  109. package/dist/cjs/components/management/RolePermissions/BaseRolePermissions.cjs +181 -0
  110. package/dist/cjs/components/management/RolePermissions/BaseRolePermissions.cjs.map +1 -0
  111. package/dist/cjs/components/management/RolePermissions/RolePermissions.cjs +112 -0
  112. package/dist/cjs/components/management/RolePermissions/RolePermissions.cjs.map +1 -0
  113. package/dist/cjs/components/management/SharingPolicies/BaseSharingPolicies.cjs +308 -0
  114. package/dist/cjs/components/management/SharingPolicies/BaseSharingPolicies.cjs.map +1 -0
  115. package/dist/cjs/components/management/SharingPolicies/SharingPolicies.cjs +126 -0
  116. package/dist/cjs/components/management/SharingPolicies/SharingPolicies.cjs.map +1 -0
  117. package/dist/cjs/components/{admin → management}/UserCreate/BaseUserCreate.cjs +1 -1
  118. package/dist/cjs/components/management/UserCreate/BaseUserCreate.cjs.map +1 -0
  119. package/dist/cjs/components/{admin → management}/UserCreate/UserCreate.cjs +1 -1
  120. package/dist/cjs/components/management/UserCreate/UserCreate.cjs.map +1 -0
  121. package/dist/cjs/components/{admin → management}/UserCreate/userCreateFields.cjs +1 -1
  122. package/dist/cjs/components/management/UserCreate/userCreateFields.cjs.map +1 -0
  123. package/dist/cjs/components/{admin → management}/UserDetails/BaseUserDetails.cjs +1 -1
  124. package/dist/cjs/components/management/UserDetails/BaseUserDetails.cjs.map +1 -0
  125. package/dist/cjs/components/{admin → management}/UserDetails/UserDetails.cjs +1 -1
  126. package/dist/cjs/components/management/UserDetails/UserDetails.cjs.map +1 -0
  127. package/dist/cjs/components/{admin → management}/UserList/BaseUserList.cjs +1 -1
  128. package/dist/cjs/components/management/UserList/BaseUserList.cjs.map +1 -0
  129. package/dist/cjs/components/{admin → management}/UserList/UserList.cjs +1 -1
  130. package/dist/cjs/components/management/UserList/UserList.cjs.map +1 -0
  131. package/dist/cjs/components/{admin → management}/shared/AccountLifecycleParts.cjs +1 -1
  132. package/dist/cjs/components/management/shared/AccountLifecycleParts.cjs.map +1 -0
  133. package/dist/cjs/components/{admin → management}/shared/AdminParts.cjs +1 -1
  134. package/dist/cjs/components/management/shared/AdminParts.cjs.map +1 -0
  135. package/dist/cjs/components/{admin → management}/shared/AdminParts.styles.cjs +1 -1
  136. package/dist/cjs/components/management/shared/AdminParts.styles.cjs.map +1 -0
  137. package/dist/cjs/components/{admin → management}/shared/AdminSearch.cjs +1 -1
  138. package/dist/cjs/components/management/shared/AdminSearch.cjs.map +1 -0
  139. package/dist/cjs/components/{admin → management}/shared/AdminSection.cjs +1 -1
  140. package/dist/cjs/components/management/shared/AdminSection.cjs.map +1 -0
  141. package/dist/cjs/components/{admin → management}/shared/AdminSection.styles.cjs +1 -1
  142. package/dist/cjs/components/management/shared/AdminSection.styles.cjs.map +1 -0
  143. package/dist/cjs/components/{admin → management}/shared/ApplicationFormFields.cjs +1 -1
  144. package/dist/cjs/components/management/shared/ApplicationFormFields.cjs.map +1 -0
  145. package/dist/cjs/components/{admin → management}/shared/ClientSecretNotice.cjs +1 -1
  146. package/dist/cjs/components/management/shared/ClientSecretNotice.cjs.map +1 -0
  147. package/dist/cjs/components/{admin → management}/shared/IdentityPicker.cjs +1 -1
  148. package/dist/cjs/components/management/shared/IdentityPicker.cjs.map +1 -0
  149. package/dist/cjs/components/management/shared/formatTimestamp.cjs +18 -0
  150. package/dist/cjs/components/management/shared/formatTimestamp.cjs.map +1 -0
  151. package/dist/cjs/components/{admin → management}/shared/useAdminPartStyles.cjs +1 -1
  152. package/dist/cjs/components/management/shared/useAdminPartStyles.cjs.map +1 -0
  153. package/dist/cjs/components/{admin → management}/shared/useDefaultOuId.cjs +1 -1
  154. package/dist/cjs/components/management/shared/useDefaultOuId.cjs.map +1 -0
  155. package/dist/cjs/components/management/shared/useProjectPlacement.cjs +23 -0
  156. package/dist/cjs/components/management/shared/useProjectPlacement.cjs.map +1 -0
  157. package/dist/cjs/contexts/ThunderID/ThunderIDContext.cjs +5 -0
  158. package/dist/cjs/contexts/ThunderID/ThunderIDContext.cjs.map +1 -1
  159. package/dist/cjs/contexts/ThunderID/ThunderIDProvider.cjs +27 -1
  160. package/dist/cjs/contexts/ThunderID/ThunderIDProvider.cjs.map +1 -1
  161. package/dist/cjs/contexts/ThunderID/useCurrentProjectState.cjs +33 -0
  162. package/dist/cjs/contexts/ThunderID/useCurrentProjectState.cjs.map +1 -0
  163. package/dist/cjs/hooks/management/useManagementEndpoint.cjs.map +1 -1
  164. package/dist/cjs/index.cjs +377 -33
  165. package/dist/cjs/utils/flowTransformer.cjs +9 -0
  166. package/dist/cjs/utils/flowTransformer.cjs.map +1 -1
  167. package/dist/cjs/utils/getOrganizationUnitSwitchErrorKey.cjs +24 -0
  168. package/dist/cjs/utils/getOrganizationUnitSwitchErrorKey.cjs.map +1 -0
  169. package/dist/components/account/OrganizationUnitSwitcher/BaseOrganizationUnitSwitcher.d.ts +85 -0
  170. package/dist/components/account/OrganizationUnitSwitcher/BaseOrganizationUnitSwitcher.d.ts.map +1 -0
  171. package/dist/components/account/OrganizationUnitSwitcher/BaseOrganizationUnitSwitcher.js +209 -0
  172. package/dist/components/account/OrganizationUnitSwitcher/BaseOrganizationUnitSwitcher.js.map +1 -0
  173. package/dist/components/account/OrganizationUnitSwitcher/BaseOrganizationUnitSwitcher.styles.d.ts +11 -0
  174. package/dist/components/account/OrganizationUnitSwitcher/BaseOrganizationUnitSwitcher.styles.d.ts.map +1 -0
  175. package/dist/components/account/OrganizationUnitSwitcher/BaseOrganizationUnitSwitcher.styles.js +184 -0
  176. package/dist/components/account/OrganizationUnitSwitcher/BaseOrganizationUnitSwitcher.styles.js.map +1 -0
  177. package/dist/components/account/OrganizationUnitSwitcher/OrganizationUnitSwitcher.d.ts +54 -0
  178. package/dist/components/account/OrganizationUnitSwitcher/OrganizationUnitSwitcher.d.ts.map +1 -0
  179. package/dist/components/account/OrganizationUnitSwitcher/OrganizationUnitSwitcher.js +135 -0
  180. package/dist/components/account/OrganizationUnitSwitcher/OrganizationUnitSwitcher.js.map +1 -0
  181. package/dist/components/auth/SignIn/SignIn.d.ts +5 -0
  182. package/dist/components/auth/SignIn/SignIn.d.ts.map +1 -1
  183. package/dist/components/auth/SignIn/SignIn.js +25 -22
  184. package/dist/components/auth/SignIn/SignIn.js.map +1 -1
  185. package/dist/components/auth/SignUp/BaseSignUp.d.ts.map +1 -1
  186. package/dist/components/auth/SignUp/BaseSignUp.js +14 -10
  187. package/dist/components/auth/SignUp/BaseSignUp.js.map +1 -1
  188. package/dist/components/auth/flow/AuthOptionFactory.js +2 -2
  189. package/dist/components/auth/flow/AuthOptionFactory.js.map +1 -1
  190. package/dist/components/common/LanguageSwitcher/BaseLanguageSwitcher.js +1 -1
  191. package/dist/components/{admin → management}/AgentCreate/AgentCreate.d.ts +2 -1
  192. package/dist/components/management/AgentCreate/AgentCreate.d.ts.map +1 -0
  193. package/dist/components/{admin → management}/AgentCreate/AgentCreate.js +8 -7
  194. package/dist/components/management/AgentCreate/AgentCreate.js.map +1 -0
  195. package/dist/components/management/AgentCreate/BaseAgentCreate.d.ts.map +1 -0
  196. package/dist/components/{admin → management}/AgentCreate/BaseAgentCreate.js +1 -1
  197. package/dist/components/management/AgentCreate/BaseAgentCreate.js.map +1 -0
  198. package/dist/components/management/AgentDetails/AgentDetails.d.ts.map +1 -0
  199. package/dist/components/{admin → management}/AgentDetails/AgentDetails.js +1 -1
  200. package/dist/components/management/AgentDetails/AgentDetails.js.map +1 -0
  201. package/dist/components/management/AgentDetails/BaseAgentDetails.d.ts.map +1 -0
  202. package/dist/components/{admin → management}/AgentDetails/BaseAgentDetails.js +1 -1
  203. package/dist/components/management/AgentDetails/BaseAgentDetails.js.map +1 -0
  204. package/dist/components/{admin → management}/AgentList/AgentList.d.ts +7 -1
  205. package/dist/components/management/AgentList/AgentList.d.ts.map +1 -0
  206. package/dist/components/{admin → management}/AgentList/AgentList.js +11 -6
  207. package/dist/components/management/AgentList/AgentList.js.map +1 -0
  208. package/dist/components/management/AgentList/BaseAgentList.d.ts.map +1 -0
  209. package/dist/components/{admin → management}/AgentList/BaseAgentList.js +1 -1
  210. package/dist/components/management/AgentList/BaseAgentList.js.map +1 -0
  211. package/dist/components/{admin → management}/ApplicationCreate/ApplicationCreate.d.ts +2 -1
  212. package/dist/components/management/ApplicationCreate/ApplicationCreate.d.ts.map +1 -0
  213. package/dist/components/{admin → management}/ApplicationCreate/ApplicationCreate.js +10 -5
  214. package/dist/components/management/ApplicationCreate/ApplicationCreate.js.map +1 -0
  215. package/dist/components/management/ApplicationCreate/BaseApplicationCreate.d.ts.map +1 -0
  216. package/dist/components/{admin → management}/ApplicationCreate/BaseApplicationCreate.js +1 -1
  217. package/dist/components/management/ApplicationCreate/BaseApplicationCreate.js.map +1 -0
  218. package/dist/components/management/ApplicationDetails/ApplicationDetails.d.ts.map +1 -0
  219. package/dist/components/{admin → management}/ApplicationDetails/ApplicationDetails.js +1 -1
  220. package/dist/components/management/ApplicationDetails/ApplicationDetails.js.map +1 -0
  221. package/dist/components/management/ApplicationDetails/BaseApplicationDetails.d.ts.map +1 -0
  222. package/dist/components/{admin → management}/ApplicationDetails/BaseApplicationDetails.js +1 -1
  223. package/dist/components/management/ApplicationDetails/BaseApplicationDetails.js.map +1 -0
  224. package/dist/components/{admin → management}/ApplicationList/ApplicationList.d.ts +7 -1
  225. package/dist/components/management/ApplicationList/ApplicationList.d.ts.map +1 -0
  226. package/dist/components/{admin → management}/ApplicationList/ApplicationList.js +9 -4
  227. package/dist/components/management/ApplicationList/ApplicationList.js.map +1 -0
  228. package/dist/components/management/ApplicationList/BaseApplicationList.d.ts.map +1 -0
  229. package/dist/components/{admin → management}/ApplicationList/BaseApplicationList.js +1 -1
  230. package/dist/components/management/ApplicationList/BaseApplicationList.js.map +1 -0
  231. package/dist/components/management/GroupCreate/BaseGroupCreate.d.ts.map +1 -0
  232. package/dist/components/{admin → management}/GroupCreate/BaseGroupCreate.js +1 -1
  233. package/dist/components/management/GroupCreate/BaseGroupCreate.js.map +1 -0
  234. package/dist/components/management/GroupCreate/GroupCreate.d.ts.map +1 -0
  235. package/dist/components/{admin → management}/GroupCreate/GroupCreate.js +1 -1
  236. package/dist/components/management/GroupCreate/GroupCreate.js.map +1 -0
  237. package/dist/components/management/GroupDetails/BaseGroupDetails.d.ts +47 -0
  238. package/dist/components/management/GroupDetails/BaseGroupDetails.d.ts.map +1 -0
  239. package/dist/components/management/GroupDetails/BaseGroupDetails.js +84 -0
  240. package/dist/components/management/GroupDetails/BaseGroupDetails.js.map +1 -0
  241. package/dist/components/management/GroupDetails/GroupDetails.d.ts +37 -0
  242. package/dist/components/management/GroupDetails/GroupDetails.d.ts.map +1 -0
  243. package/dist/components/management/GroupDetails/GroupDetails.js +57 -0
  244. package/dist/components/management/GroupDetails/GroupDetails.js.map +1 -0
  245. package/dist/components/management/GroupList/BaseGroupList.d.ts.map +1 -0
  246. package/dist/components/{admin → management}/GroupList/BaseGroupList.js +1 -1
  247. package/dist/components/management/GroupList/BaseGroupList.js.map +1 -0
  248. package/dist/components/management/GroupList/GroupList.d.ts.map +1 -0
  249. package/dist/components/{admin → management}/GroupList/GroupList.js +1 -1
  250. package/dist/components/management/GroupList/GroupList.js.map +1 -0
  251. package/dist/components/management/GroupMembers/BaseGroupMembers.d.ts.map +1 -0
  252. package/dist/components/{admin → management}/GroupMembers/BaseGroupMembers.js +1 -1
  253. package/dist/components/management/GroupMembers/BaseGroupMembers.js.map +1 -0
  254. package/dist/components/management/GroupMembers/GroupMembers.d.ts.map +1 -0
  255. package/dist/components/{admin → management}/GroupMembers/GroupMembers.js +1 -1
  256. package/dist/components/management/GroupMembers/GroupMembers.js.map +1 -0
  257. package/dist/components/management/OrganizationUnitCreate/BaseOrganizationUnitCreate.d.ts +85 -0
  258. package/dist/components/management/OrganizationUnitCreate/BaseOrganizationUnitCreate.d.ts.map +1 -0
  259. package/dist/components/management/OrganizationUnitCreate/BaseOrganizationUnitCreate.js +137 -0
  260. package/dist/components/management/OrganizationUnitCreate/BaseOrganizationUnitCreate.js.map +1 -0
  261. package/dist/components/management/OrganizationUnitCreate/OrganizationUnitCreate.d.ts +21 -0
  262. package/dist/components/management/OrganizationUnitCreate/OrganizationUnitCreate.d.ts.map +1 -0
  263. package/dist/components/management/OrganizationUnitCreate/OrganizationUnitCreate.js +79 -0
  264. package/dist/components/management/OrganizationUnitCreate/OrganizationUnitCreate.js.map +1 -0
  265. package/dist/components/management/OrganizationUnitDetails/BaseOrganizationUnitDetails.d.ts +105 -0
  266. package/dist/components/management/OrganizationUnitDetails/BaseOrganizationUnitDetails.d.ts.map +1 -0
  267. package/dist/components/management/OrganizationUnitDetails/BaseOrganizationUnitDetails.js +273 -0
  268. package/dist/components/management/OrganizationUnitDetails/BaseOrganizationUnitDetails.js.map +1 -0
  269. package/dist/components/management/OrganizationUnitDetails/OrganizationUnitDetails.d.ts +42 -0
  270. package/dist/components/management/OrganizationUnitDetails/OrganizationUnitDetails.d.ts.map +1 -0
  271. package/dist/components/management/OrganizationUnitDetails/OrganizationUnitDetails.js +139 -0
  272. package/dist/components/management/OrganizationUnitDetails/OrganizationUnitDetails.js.map +1 -0
  273. package/dist/components/management/OrganizationUnitList/BaseOrganizationUnitList.d.ts +54 -0
  274. package/dist/components/management/OrganizationUnitList/BaseOrganizationUnitList.d.ts.map +1 -0
  275. package/dist/components/management/OrganizationUnitList/BaseOrganizationUnitList.js +76 -0
  276. package/dist/components/management/OrganizationUnitList/BaseOrganizationUnitList.js.map +1 -0
  277. package/dist/components/management/OrganizationUnitList/OrganizationUnitList.d.ts +19 -0
  278. package/dist/components/management/OrganizationUnitList/OrganizationUnitList.d.ts.map +1 -0
  279. package/dist/components/management/OrganizationUnitList/OrganizationUnitList.js +65 -0
  280. package/dist/components/management/OrganizationUnitList/OrganizationUnitList.js.map +1 -0
  281. package/dist/components/management/ProjectCreate/BaseProjectCreate.d.ts +60 -0
  282. package/dist/components/management/ProjectCreate/BaseProjectCreate.d.ts.map +1 -0
  283. package/dist/components/management/ProjectCreate/BaseProjectCreate.js +113 -0
  284. package/dist/components/management/ProjectCreate/BaseProjectCreate.js.map +1 -0
  285. package/dist/components/management/ProjectCreate/ProjectCreate.d.ts +20 -0
  286. package/dist/components/management/ProjectCreate/ProjectCreate.d.ts.map +1 -0
  287. package/dist/components/management/ProjectCreate/ProjectCreate.js +40 -0
  288. package/dist/components/management/ProjectCreate/ProjectCreate.js.map +1 -0
  289. package/dist/components/management/ProjectDetails/BaseProjectDetails.d.ts +60 -0
  290. package/dist/components/management/ProjectDetails/BaseProjectDetails.d.ts.map +1 -0
  291. package/dist/components/management/ProjectDetails/BaseProjectDetails.js +169 -0
  292. package/dist/components/management/ProjectDetails/BaseProjectDetails.js.map +1 -0
  293. package/dist/components/management/ProjectDetails/ProjectDetails.d.ts +36 -0
  294. package/dist/components/management/ProjectDetails/ProjectDetails.d.ts.map +1 -0
  295. package/dist/components/management/ProjectDetails/ProjectDetails.js +65 -0
  296. package/dist/components/management/ProjectDetails/ProjectDetails.js.map +1 -0
  297. package/dist/components/management/ProjectList/BaseProjectList.d.ts +53 -0
  298. package/dist/components/management/ProjectList/BaseProjectList.d.ts.map +1 -0
  299. package/dist/components/management/ProjectList/BaseProjectList.js +76 -0
  300. package/dist/components/management/ProjectList/BaseProjectList.js.map +1 -0
  301. package/dist/components/management/ProjectList/ProjectList.d.ts +14 -0
  302. package/dist/components/management/ProjectList/ProjectList.d.ts.map +1 -0
  303. package/dist/components/management/ProjectList/ProjectList.js +47 -0
  304. package/dist/components/management/ProjectList/ProjectList.js.map +1 -0
  305. package/dist/components/management/ProjectSwitcher/BaseProjectSwitcher.d.ts +69 -0
  306. package/dist/components/management/ProjectSwitcher/BaseProjectSwitcher.d.ts.map +1 -0
  307. package/dist/components/management/ProjectSwitcher/BaseProjectSwitcher.js +55 -0
  308. package/dist/components/management/ProjectSwitcher/BaseProjectSwitcher.js.map +1 -0
  309. package/dist/components/management/ProjectSwitcher/ProjectSwitcher.d.ts +25 -0
  310. package/dist/components/management/ProjectSwitcher/ProjectSwitcher.d.ts.map +1 -0
  311. package/dist/components/management/ProjectSwitcher/ProjectSwitcher.js +68 -0
  312. package/dist/components/management/ProjectSwitcher/ProjectSwitcher.js.map +1 -0
  313. package/dist/components/management/RoleAssignments/BaseRoleAssignments.d.ts.map +1 -0
  314. package/dist/components/{admin → management}/RoleAssignments/BaseRoleAssignments.js +1 -1
  315. package/dist/components/management/RoleAssignments/BaseRoleAssignments.js.map +1 -0
  316. package/dist/components/management/RoleAssignments/RoleAssignments.d.ts.map +1 -0
  317. package/dist/components/{admin → management}/RoleAssignments/RoleAssignments.js +1 -1
  318. package/dist/components/management/RoleAssignments/RoleAssignments.js.map +1 -0
  319. package/dist/components/management/RoleCreate/BaseRoleCreate.d.ts.map +1 -0
  320. package/dist/components/{admin → management}/RoleCreate/BaseRoleCreate.js +1 -1
  321. package/dist/components/management/RoleCreate/BaseRoleCreate.js.map +1 -0
  322. package/dist/components/management/RoleCreate/RoleCreate.d.ts.map +1 -0
  323. package/dist/components/{admin → management}/RoleCreate/RoleCreate.js +1 -1
  324. package/dist/components/management/RoleCreate/RoleCreate.js.map +1 -0
  325. package/dist/components/management/RoleDetails/BaseRoleDetails.d.ts +51 -0
  326. package/dist/components/management/RoleDetails/BaseRoleDetails.d.ts.map +1 -0
  327. package/dist/components/management/RoleDetails/BaseRoleDetails.js +85 -0
  328. package/dist/components/management/RoleDetails/BaseRoleDetails.js.map +1 -0
  329. package/dist/components/management/RoleDetails/RoleDetails.d.ts +39 -0
  330. package/dist/components/management/RoleDetails/RoleDetails.d.ts.map +1 -0
  331. package/dist/components/management/RoleDetails/RoleDetails.js +65 -0
  332. package/dist/components/management/RoleDetails/RoleDetails.js.map +1 -0
  333. package/dist/components/management/RoleList/BaseRoleList.d.ts.map +1 -0
  334. package/dist/components/{admin → management}/RoleList/BaseRoleList.js +1 -1
  335. package/dist/components/management/RoleList/BaseRoleList.js.map +1 -0
  336. package/dist/components/management/RoleList/RoleList.d.ts.map +1 -0
  337. package/dist/components/{admin → management}/RoleList/RoleList.js +1 -1
  338. package/dist/components/management/RoleList/RoleList.js.map +1 -0
  339. package/dist/components/management/RolePermissions/BaseRolePermissions.d.ts +104 -0
  340. package/dist/components/management/RolePermissions/BaseRolePermissions.d.ts.map +1 -0
  341. package/dist/components/management/RolePermissions/BaseRolePermissions.js +178 -0
  342. package/dist/components/management/RolePermissions/BaseRolePermissions.js.map +1 -0
  343. package/dist/components/management/RolePermissions/RolePermissions.d.ts +29 -0
  344. package/dist/components/management/RolePermissions/RolePermissions.d.ts.map +1 -0
  345. package/dist/components/management/RolePermissions/RolePermissions.js +108 -0
  346. package/dist/components/management/RolePermissions/RolePermissions.js.map +1 -0
  347. package/dist/components/management/SharingPolicies/BaseSharingPolicies.d.ts +124 -0
  348. package/dist/components/management/SharingPolicies/BaseSharingPolicies.d.ts.map +1 -0
  349. package/dist/components/management/SharingPolicies/BaseSharingPolicies.js +304 -0
  350. package/dist/components/management/SharingPolicies/BaseSharingPolicies.js.map +1 -0
  351. package/dist/components/management/SharingPolicies/SharingPolicies.d.ts +36 -0
  352. package/dist/components/management/SharingPolicies/SharingPolicies.d.ts.map +1 -0
  353. package/dist/components/management/SharingPolicies/SharingPolicies.js +122 -0
  354. package/dist/components/management/SharingPolicies/SharingPolicies.js.map +1 -0
  355. package/dist/components/management/UserCreate/BaseUserCreate.d.ts.map +1 -0
  356. package/dist/components/{admin → management}/UserCreate/BaseUserCreate.js +1 -1
  357. package/dist/components/management/UserCreate/BaseUserCreate.js.map +1 -0
  358. package/dist/components/management/UserCreate/UserCreate.d.ts.map +1 -0
  359. package/dist/components/{admin → management}/UserCreate/UserCreate.js +1 -1
  360. package/dist/components/management/UserCreate/UserCreate.js.map +1 -0
  361. package/dist/components/management/UserCreate/userCreateFields.d.ts.map +1 -0
  362. package/dist/components/{admin → management}/UserCreate/userCreateFields.js +1 -1
  363. package/dist/components/management/UserCreate/userCreateFields.js.map +1 -0
  364. package/dist/components/management/UserDetails/BaseUserDetails.d.ts.map +1 -0
  365. package/dist/components/{admin → management}/UserDetails/BaseUserDetails.js +1 -1
  366. package/dist/components/management/UserDetails/BaseUserDetails.js.map +1 -0
  367. package/dist/components/management/UserDetails/UserDetails.d.ts.map +1 -0
  368. package/dist/components/{admin → management}/UserDetails/UserDetails.js +1 -1
  369. package/dist/components/management/UserDetails/UserDetails.js.map +1 -0
  370. package/dist/components/management/UserList/BaseUserList.d.ts.map +1 -0
  371. package/dist/components/{admin → management}/UserList/BaseUserList.js +1 -1
  372. package/dist/components/management/UserList/BaseUserList.js.map +1 -0
  373. package/dist/components/management/UserList/UserList.d.ts.map +1 -0
  374. package/dist/components/{admin → management}/UserList/UserList.js +1 -1
  375. package/dist/components/management/UserList/UserList.js.map +1 -0
  376. package/dist/components/management/shared/AccountLifecycleParts.d.ts.map +1 -0
  377. package/dist/components/{admin → management}/shared/AccountLifecycleParts.js +1 -1
  378. package/dist/components/management/shared/AccountLifecycleParts.js.map +1 -0
  379. package/dist/components/management/shared/AdminListRenderProps.d.ts.map +1 -0
  380. package/dist/components/management/shared/AdminParts.d.ts.map +1 -0
  381. package/dist/components/{admin → management}/shared/AdminParts.js +1 -1
  382. package/dist/components/management/shared/AdminParts.js.map +1 -0
  383. package/dist/components/management/shared/AdminParts.styles.d.ts.map +1 -0
  384. package/dist/components/{admin → management}/shared/AdminParts.styles.js +1 -1
  385. package/dist/components/management/shared/AdminParts.styles.js.map +1 -0
  386. package/dist/components/management/shared/AdminSearch.d.ts.map +1 -0
  387. package/dist/components/{admin → management}/shared/AdminSearch.js +1 -1
  388. package/dist/components/management/shared/AdminSearch.js.map +1 -0
  389. package/dist/components/management/shared/AdminSection.d.ts.map +1 -0
  390. package/dist/components/{admin → management}/shared/AdminSection.js +1 -1
  391. package/dist/components/management/shared/AdminSection.js.map +1 -0
  392. package/dist/components/management/shared/AdminSection.styles.d.ts.map +1 -0
  393. package/dist/components/{admin → management}/shared/AdminSection.styles.js +1 -1
  394. package/dist/components/management/shared/AdminSection.styles.js.map +1 -0
  395. package/dist/components/management/shared/ApplicationFormFields.d.ts.map +1 -0
  396. package/dist/components/{admin → management}/shared/ApplicationFormFields.js +1 -1
  397. package/dist/components/management/shared/ApplicationFormFields.js.map +1 -0
  398. package/dist/components/management/shared/ClientSecretNotice.d.ts.map +1 -0
  399. package/dist/components/{admin → management}/shared/ClientSecretNotice.js +1 -1
  400. package/dist/components/management/shared/ClientSecretNotice.js.map +1 -0
  401. package/dist/components/management/shared/IdentityPicker.d.ts.map +1 -0
  402. package/dist/components/{admin → management}/shared/IdentityPicker.js +1 -1
  403. package/dist/components/management/shared/IdentityPicker.js.map +1 -0
  404. package/dist/components/management/shared/formatTimestamp.d.ts +9 -0
  405. package/dist/components/management/shared/formatTimestamp.d.ts.map +1 -0
  406. package/dist/components/management/shared/formatTimestamp.js +17 -0
  407. package/dist/components/management/shared/formatTimestamp.js.map +1 -0
  408. package/dist/components/management/shared/useAdminPartStyles.d.ts.map +1 -0
  409. package/dist/components/{admin → management}/shared/useAdminPartStyles.js +1 -1
  410. package/dist/components/management/shared/useAdminPartStyles.js.map +1 -0
  411. package/dist/components/management/shared/useDefaultOuId.d.ts.map +1 -0
  412. package/dist/components/{admin → management}/shared/useDefaultOuId.js +1 -1
  413. package/dist/components/management/shared/useDefaultOuId.js.map +1 -0
  414. package/dist/components/management/shared/useProjectPlacement.d.ts +26 -0
  415. package/dist/components/management/shared/useProjectPlacement.d.ts.map +1 -0
  416. package/dist/components/management/shared/useProjectPlacement.js +23 -0
  417. package/dist/components/management/shared/useProjectPlacement.js.map +1 -0
  418. package/dist/contexts/ThunderID/ThunderIDContext.d.ts +27 -1
  419. package/dist/contexts/ThunderID/ThunderIDContext.d.ts.map +1 -1
  420. package/dist/contexts/ThunderID/ThunderIDContext.js +5 -0
  421. package/dist/contexts/ThunderID/ThunderIDContext.js.map +1 -1
  422. package/dist/contexts/ThunderID/ThunderIDProvider.d.ts.map +1 -1
  423. package/dist/contexts/ThunderID/ThunderIDProvider.js +28 -2
  424. package/dist/contexts/ThunderID/ThunderIDProvider.js.map +1 -1
  425. package/dist/contexts/ThunderID/useCurrentProjectState.d.ts +26 -0
  426. package/dist/contexts/ThunderID/useCurrentProjectState.d.ts.map +1 -0
  427. package/dist/contexts/ThunderID/useCurrentProjectState.js +30 -0
  428. package/dist/contexts/ThunderID/useCurrentProjectState.js.map +1 -0
  429. package/dist/hooks/management/useManagementEndpoint.d.ts +1 -1
  430. package/dist/hooks/management/useManagementEndpoint.d.ts.map +1 -1
  431. package/dist/hooks/management/useManagementEndpoint.js.map +1 -1
  432. package/dist/index.d.ts +120 -69
  433. package/dist/index.d.ts.map +1 -1
  434. package/dist/index.js +59 -34
  435. package/dist/utils/flowTransformer.d.ts +7 -0
  436. package/dist/utils/flowTransformer.d.ts.map +1 -1
  437. package/dist/utils/flowTransformer.js +9 -1
  438. package/dist/utils/flowTransformer.js.map +1 -1
  439. package/dist/utils/getOrganizationUnitSwitchErrorKey.d.ts +11 -0
  440. package/dist/utils/getOrganizationUnitSwitchErrorKey.d.ts.map +1 -0
  441. package/dist/utils/getOrganizationUnitSwitchErrorKey.js +22 -0
  442. package/dist/utils/getOrganizationUnitSwitchErrorKey.js.map +1 -0
  443. package/package.json +2 -2
  444. package/dist/cjs/components/admin/AgentCreate/AgentCreate.cjs.map +0 -1
  445. package/dist/cjs/components/admin/AgentCreate/BaseAgentCreate.cjs.map +0 -1
  446. package/dist/cjs/components/admin/AgentDetails/AgentDetails.cjs.map +0 -1
  447. package/dist/cjs/components/admin/AgentDetails/BaseAgentDetails.cjs.map +0 -1
  448. package/dist/cjs/components/admin/AgentList/AgentList.cjs.map +0 -1
  449. package/dist/cjs/components/admin/AgentList/BaseAgentList.cjs.map +0 -1
  450. package/dist/cjs/components/admin/ApplicationCreate/ApplicationCreate.cjs.map +0 -1
  451. package/dist/cjs/components/admin/ApplicationCreate/BaseApplicationCreate.cjs.map +0 -1
  452. package/dist/cjs/components/admin/ApplicationDetails/ApplicationDetails.cjs.map +0 -1
  453. package/dist/cjs/components/admin/ApplicationDetails/BaseApplicationDetails.cjs.map +0 -1
  454. package/dist/cjs/components/admin/ApplicationList/ApplicationList.cjs.map +0 -1
  455. package/dist/cjs/components/admin/ApplicationList/BaseApplicationList.cjs.map +0 -1
  456. package/dist/cjs/components/admin/GroupCreate/BaseGroupCreate.cjs.map +0 -1
  457. package/dist/cjs/components/admin/GroupCreate/GroupCreate.cjs.map +0 -1
  458. package/dist/cjs/components/admin/GroupList/BaseGroupList.cjs.map +0 -1
  459. package/dist/cjs/components/admin/GroupList/GroupList.cjs.map +0 -1
  460. package/dist/cjs/components/admin/GroupMembers/BaseGroupMembers.cjs.map +0 -1
  461. package/dist/cjs/components/admin/GroupMembers/GroupMembers.cjs.map +0 -1
  462. package/dist/cjs/components/admin/RoleAssignments/BaseRoleAssignments.cjs.map +0 -1
  463. package/dist/cjs/components/admin/RoleAssignments/RoleAssignments.cjs.map +0 -1
  464. package/dist/cjs/components/admin/RoleCreate/BaseRoleCreate.cjs.map +0 -1
  465. package/dist/cjs/components/admin/RoleCreate/RoleCreate.cjs.map +0 -1
  466. package/dist/cjs/components/admin/RoleList/BaseRoleList.cjs.map +0 -1
  467. package/dist/cjs/components/admin/RoleList/RoleList.cjs.map +0 -1
  468. package/dist/cjs/components/admin/RolePermissions/BaseRolePermissions.cjs +0 -69
  469. package/dist/cjs/components/admin/RolePermissions/BaseRolePermissions.cjs.map +0 -1
  470. package/dist/cjs/components/admin/RolePermissions/RolePermissions.cjs +0 -40
  471. package/dist/cjs/components/admin/RolePermissions/RolePermissions.cjs.map +0 -1
  472. package/dist/cjs/components/admin/UserCreate/BaseUserCreate.cjs.map +0 -1
  473. package/dist/cjs/components/admin/UserCreate/UserCreate.cjs.map +0 -1
  474. package/dist/cjs/components/admin/UserCreate/userCreateFields.cjs.map +0 -1
  475. package/dist/cjs/components/admin/UserDetails/BaseUserDetails.cjs.map +0 -1
  476. package/dist/cjs/components/admin/UserDetails/UserDetails.cjs.map +0 -1
  477. package/dist/cjs/components/admin/UserList/BaseUserList.cjs.map +0 -1
  478. package/dist/cjs/components/admin/UserList/UserList.cjs.map +0 -1
  479. package/dist/cjs/components/admin/shared/AccountLifecycleParts.cjs.map +0 -1
  480. package/dist/cjs/components/admin/shared/AdminParts.cjs.map +0 -1
  481. package/dist/cjs/components/admin/shared/AdminParts.styles.cjs.map +0 -1
  482. package/dist/cjs/components/admin/shared/AdminSearch.cjs.map +0 -1
  483. package/dist/cjs/components/admin/shared/AdminSection.cjs.map +0 -1
  484. package/dist/cjs/components/admin/shared/AdminSection.styles.cjs.map +0 -1
  485. package/dist/cjs/components/admin/shared/ApplicationFormFields.cjs.map +0 -1
  486. package/dist/cjs/components/admin/shared/ClientSecretNotice.cjs.map +0 -1
  487. package/dist/cjs/components/admin/shared/IdentityPicker.cjs.map +0 -1
  488. package/dist/cjs/components/admin/shared/useAdminPartStyles.cjs.map +0 -1
  489. package/dist/cjs/components/admin/shared/useDefaultOuId.cjs.map +0 -1
  490. package/dist/components/admin/AgentCreate/AgentCreate.d.ts.map +0 -1
  491. package/dist/components/admin/AgentCreate/AgentCreate.js.map +0 -1
  492. package/dist/components/admin/AgentCreate/BaseAgentCreate.d.ts.map +0 -1
  493. package/dist/components/admin/AgentCreate/BaseAgentCreate.js.map +0 -1
  494. package/dist/components/admin/AgentDetails/AgentDetails.d.ts.map +0 -1
  495. package/dist/components/admin/AgentDetails/AgentDetails.js.map +0 -1
  496. package/dist/components/admin/AgentDetails/BaseAgentDetails.d.ts.map +0 -1
  497. package/dist/components/admin/AgentDetails/BaseAgentDetails.js.map +0 -1
  498. package/dist/components/admin/AgentList/AgentList.d.ts.map +0 -1
  499. package/dist/components/admin/AgentList/AgentList.js.map +0 -1
  500. package/dist/components/admin/AgentList/BaseAgentList.d.ts.map +0 -1
  501. package/dist/components/admin/AgentList/BaseAgentList.js.map +0 -1
  502. package/dist/components/admin/ApplicationCreate/ApplicationCreate.d.ts.map +0 -1
  503. package/dist/components/admin/ApplicationCreate/ApplicationCreate.js.map +0 -1
  504. package/dist/components/admin/ApplicationCreate/BaseApplicationCreate.d.ts.map +0 -1
  505. package/dist/components/admin/ApplicationCreate/BaseApplicationCreate.js.map +0 -1
  506. package/dist/components/admin/ApplicationDetails/ApplicationDetails.d.ts.map +0 -1
  507. package/dist/components/admin/ApplicationDetails/ApplicationDetails.js.map +0 -1
  508. package/dist/components/admin/ApplicationDetails/BaseApplicationDetails.d.ts.map +0 -1
  509. package/dist/components/admin/ApplicationDetails/BaseApplicationDetails.js.map +0 -1
  510. package/dist/components/admin/ApplicationList/ApplicationList.d.ts.map +0 -1
  511. package/dist/components/admin/ApplicationList/ApplicationList.js.map +0 -1
  512. package/dist/components/admin/ApplicationList/BaseApplicationList.d.ts.map +0 -1
  513. package/dist/components/admin/ApplicationList/BaseApplicationList.js.map +0 -1
  514. package/dist/components/admin/GroupCreate/BaseGroupCreate.d.ts.map +0 -1
  515. package/dist/components/admin/GroupCreate/BaseGroupCreate.js.map +0 -1
  516. package/dist/components/admin/GroupCreate/GroupCreate.d.ts.map +0 -1
  517. package/dist/components/admin/GroupCreate/GroupCreate.js.map +0 -1
  518. package/dist/components/admin/GroupList/BaseGroupList.d.ts.map +0 -1
  519. package/dist/components/admin/GroupList/BaseGroupList.js.map +0 -1
  520. package/dist/components/admin/GroupList/GroupList.d.ts.map +0 -1
  521. package/dist/components/admin/GroupList/GroupList.js.map +0 -1
  522. package/dist/components/admin/GroupMembers/BaseGroupMembers.d.ts.map +0 -1
  523. package/dist/components/admin/GroupMembers/BaseGroupMembers.js.map +0 -1
  524. package/dist/components/admin/GroupMembers/GroupMembers.d.ts.map +0 -1
  525. package/dist/components/admin/GroupMembers/GroupMembers.js.map +0 -1
  526. package/dist/components/admin/RoleAssignments/BaseRoleAssignments.d.ts.map +0 -1
  527. package/dist/components/admin/RoleAssignments/BaseRoleAssignments.js.map +0 -1
  528. package/dist/components/admin/RoleAssignments/RoleAssignments.d.ts.map +0 -1
  529. package/dist/components/admin/RoleAssignments/RoleAssignments.js.map +0 -1
  530. package/dist/components/admin/RoleCreate/BaseRoleCreate.d.ts.map +0 -1
  531. package/dist/components/admin/RoleCreate/BaseRoleCreate.js.map +0 -1
  532. package/dist/components/admin/RoleCreate/RoleCreate.d.ts.map +0 -1
  533. package/dist/components/admin/RoleCreate/RoleCreate.js.map +0 -1
  534. package/dist/components/admin/RoleList/BaseRoleList.d.ts.map +0 -1
  535. package/dist/components/admin/RoleList/BaseRoleList.js.map +0 -1
  536. package/dist/components/admin/RoleList/RoleList.d.ts.map +0 -1
  537. package/dist/components/admin/RoleList/RoleList.js.map +0 -1
  538. package/dist/components/admin/RolePermissions/BaseRolePermissions.d.ts +0 -42
  539. package/dist/components/admin/RolePermissions/BaseRolePermissions.d.ts.map +0 -1
  540. package/dist/components/admin/RolePermissions/BaseRolePermissions.js +0 -67
  541. package/dist/components/admin/RolePermissions/BaseRolePermissions.js.map +0 -1
  542. package/dist/components/admin/RolePermissions/RolePermissions.d.ts +0 -16
  543. package/dist/components/admin/RolePermissions/RolePermissions.d.ts.map +0 -1
  544. package/dist/components/admin/RolePermissions/RolePermissions.js +0 -37
  545. package/dist/components/admin/RolePermissions/RolePermissions.js.map +0 -1
  546. package/dist/components/admin/UserCreate/BaseUserCreate.d.ts.map +0 -1
  547. package/dist/components/admin/UserCreate/BaseUserCreate.js.map +0 -1
  548. package/dist/components/admin/UserCreate/UserCreate.d.ts.map +0 -1
  549. package/dist/components/admin/UserCreate/UserCreate.js.map +0 -1
  550. package/dist/components/admin/UserCreate/userCreateFields.d.ts.map +0 -1
  551. package/dist/components/admin/UserCreate/userCreateFields.js.map +0 -1
  552. package/dist/components/admin/UserDetails/BaseUserDetails.d.ts.map +0 -1
  553. package/dist/components/admin/UserDetails/BaseUserDetails.js.map +0 -1
  554. package/dist/components/admin/UserDetails/UserDetails.d.ts.map +0 -1
  555. package/dist/components/admin/UserDetails/UserDetails.js.map +0 -1
  556. package/dist/components/admin/UserList/BaseUserList.d.ts.map +0 -1
  557. package/dist/components/admin/UserList/BaseUserList.js.map +0 -1
  558. package/dist/components/admin/UserList/UserList.d.ts.map +0 -1
  559. package/dist/components/admin/UserList/UserList.js.map +0 -1
  560. package/dist/components/admin/shared/AccountLifecycleParts.d.ts.map +0 -1
  561. package/dist/components/admin/shared/AccountLifecycleParts.js.map +0 -1
  562. package/dist/components/admin/shared/AdminListRenderProps.d.ts.map +0 -1
  563. package/dist/components/admin/shared/AdminParts.d.ts.map +0 -1
  564. package/dist/components/admin/shared/AdminParts.js.map +0 -1
  565. package/dist/components/admin/shared/AdminParts.styles.d.ts.map +0 -1
  566. package/dist/components/admin/shared/AdminParts.styles.js.map +0 -1
  567. package/dist/components/admin/shared/AdminSearch.d.ts.map +0 -1
  568. package/dist/components/admin/shared/AdminSearch.js.map +0 -1
  569. package/dist/components/admin/shared/AdminSection.d.ts.map +0 -1
  570. package/dist/components/admin/shared/AdminSection.js.map +0 -1
  571. package/dist/components/admin/shared/AdminSection.styles.d.ts.map +0 -1
  572. package/dist/components/admin/shared/AdminSection.styles.js.map +0 -1
  573. package/dist/components/admin/shared/ApplicationFormFields.d.ts.map +0 -1
  574. package/dist/components/admin/shared/ApplicationFormFields.js.map +0 -1
  575. package/dist/components/admin/shared/ClientSecretNotice.d.ts.map +0 -1
  576. package/dist/components/admin/shared/ClientSecretNotice.js.map +0 -1
  577. package/dist/components/admin/shared/IdentityPicker.d.ts.map +0 -1
  578. package/dist/components/admin/shared/IdentityPicker.js.map +0 -1
  579. package/dist/components/admin/shared/useAdminPartStyles.d.ts.map +0 -1
  580. package/dist/components/admin/shared/useAdminPartStyles.js.map +0 -1
  581. package/dist/components/admin/shared/useDefaultOuId.d.ts.map +0 -1
  582. package/dist/components/admin/shared/useDefaultOuId.js.map +0 -1
  583. /package/dist/components/{admin → management}/AgentCreate/BaseAgentCreate.d.ts +0 -0
  584. /package/dist/components/{admin → management}/AgentDetails/AgentDetails.d.ts +0 -0
  585. /package/dist/components/{admin → management}/AgentDetails/BaseAgentDetails.d.ts +0 -0
  586. /package/dist/components/{admin → management}/AgentList/BaseAgentList.d.ts +0 -0
  587. /package/dist/components/{admin → management}/ApplicationCreate/BaseApplicationCreate.d.ts +0 -0
  588. /package/dist/components/{admin → management}/ApplicationDetails/ApplicationDetails.d.ts +0 -0
  589. /package/dist/components/{admin → management}/ApplicationDetails/BaseApplicationDetails.d.ts +0 -0
  590. /package/dist/components/{admin → management}/ApplicationList/BaseApplicationList.d.ts +0 -0
  591. /package/dist/components/{admin → management}/GroupCreate/BaseGroupCreate.d.ts +0 -0
  592. /package/dist/components/{admin → management}/GroupCreate/GroupCreate.d.ts +0 -0
  593. /package/dist/components/{admin → management}/GroupList/BaseGroupList.d.ts +0 -0
  594. /package/dist/components/{admin → management}/GroupList/GroupList.d.ts +0 -0
  595. /package/dist/components/{admin → management}/GroupMembers/BaseGroupMembers.d.ts +0 -0
  596. /package/dist/components/{admin → management}/GroupMembers/GroupMembers.d.ts +0 -0
  597. /package/dist/components/{admin → management}/RoleAssignments/BaseRoleAssignments.d.ts +0 -0
  598. /package/dist/components/{admin → management}/RoleAssignments/RoleAssignments.d.ts +0 -0
  599. /package/dist/components/{admin → management}/RoleCreate/BaseRoleCreate.d.ts +0 -0
  600. /package/dist/components/{admin → management}/RoleCreate/RoleCreate.d.ts +0 -0
  601. /package/dist/components/{admin → management}/RoleList/BaseRoleList.d.ts +0 -0
  602. /package/dist/components/{admin → management}/RoleList/RoleList.d.ts +0 -0
  603. /package/dist/components/{admin → management}/UserCreate/BaseUserCreate.d.ts +0 -0
  604. /package/dist/components/{admin → management}/UserCreate/UserCreate.d.ts +0 -0
  605. /package/dist/components/{admin → management}/UserCreate/userCreateFields.d.ts +0 -0
  606. /package/dist/components/{admin → management}/UserDetails/BaseUserDetails.d.ts +0 -0
  607. /package/dist/components/{admin → management}/UserDetails/UserDetails.d.ts +0 -0
  608. /package/dist/components/{admin → management}/UserList/BaseUserList.d.ts +0 -0
  609. /package/dist/components/{admin → management}/UserList/UserList.d.ts +0 -0
  610. /package/dist/components/{admin → management}/shared/AccountLifecycleParts.d.ts +0 -0
  611. /package/dist/components/{admin → management}/shared/AdminListRenderProps.d.ts +0 -0
  612. /package/dist/components/{admin → management}/shared/AdminParts.d.ts +0 -0
  613. /package/dist/components/{admin → management}/shared/AdminParts.styles.d.ts +0 -0
  614. /package/dist/components/{admin → management}/shared/AdminSearch.d.ts +0 -0
  615. /package/dist/components/{admin → management}/shared/AdminSection.d.ts +0 -0
  616. /package/dist/components/{admin → management}/shared/AdminSection.styles.d.ts +0 -0
  617. /package/dist/components/{admin → management}/shared/ApplicationFormFields.d.ts +0 -0
  618. /package/dist/components/{admin → management}/shared/ClientSecretNotice.d.ts +0 -0
  619. /package/dist/components/{admin → management}/shared/IdentityPicker.d.ts +0 -0
  620. /package/dist/components/{admin → management}/shared/useAdminPartStyles.d.ts +0 -0
  621. /package/dist/components/{admin → management}/shared/useDefaultOuId.d.ts +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"AccountLifecycleParts.cjs","names":["AccessStatusBadge: FC<AccessStatusBadgeProps>","styles: Record<string, string>","useAdminPartStyles","useTranslation","labels: Record<AccessStatusValue, string>","AccountLifecycleButtons: FC<AccountLifecycleButtonsProps>","labels: Record<AccountLifecycleAction, string>","question: string","withNote: boolean","TextField","Button"],"sources":["../../../../../src/components/admin/shared/AccountLifecycleParts.tsx"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {AccessStatusValue, AccountLifecycleAction} from '@thunderid/browser';\nimport {ChangeEvent, FC, ReactElement, useState} from 'react';\nimport useAdminPartStyles from './useAdminPartStyles';\nimport useTranslation from '../../../hooks/useTranslation';\nimport Button from '../../primitives/Button/Button';\nimport TextField from '../../primitives/TextField/TextField';\n\n/**\n * Matches the server's limit on an operator note.\n */\nconst OPERATOR_NOTE_MAX_LENGTH = 100;\n\nexport interface AccessStatusBadgeProps {\n status?: AccessStatusValue;\n}\n\n/**\n * The translated access status of an identity, or its raw value when the status is one this SDK does\n * not know. Renders nothing when the server reports no status.\n */\nexport const AccessStatusBadge: FC<AccessStatusBadgeProps> = ({\n status,\n}: AccessStatusBadgeProps): ReactElement | null => {\n const styles: Record<string, string> = useAdminPartStyles();\n const {t} = useTranslation();\n\n if (!status) {\n return null;\n }\n\n const labels: Record<AccessStatusValue, string> = {\n ACTIVE: t('admin.common.status.active'),\n LOCKED: t('admin.common.status.locked'),\n SUSPENDED: t('admin.common.status.suspended'),\n };\n\n return <span className={styles['chip']}>{labels[status] ?? status}</span>;\n};\n\nexport interface AccountLifecycleButtonsProps {\n /**\n * The actions to offer, most expected first.\n */\n actions: AccountLifecycleAction[];\n /**\n * Whether a suspension asks for an optional operator note. The note is recorded by the flow.\n */\n collectsOperatorNote?: boolean;\n isRunning?: boolean;\n /**\n * Name of the identity, already resolved, used in the confirmation question.\n */\n name: string;\n onAction: (action: AccountLifecycleAction, operatorNote?: string) => void;\n}\n\n/**\n * One button per account lifecycle action. Suspending and unsuspending ask for confirmation inline;\n * unlocking is remedial and runs straight away.\n */\nexport const AccountLifecycleButtons: FC<AccountLifecycleButtonsProps> = ({\n actions,\n collectsOperatorNote = false,\n isRunning = false,\n name,\n onAction,\n}: AccountLifecycleButtonsProps): ReactElement | null => {\n const styles: Record<string, string> = useAdminPartStyles();\n const {t} = useTranslation();\n const [confirming, setConfirming] = useState<AccountLifecycleAction | null>(null);\n const [operatorNote, setOperatorNote] = useState<string>('');\n\n if (actions.length === 0) {\n return null;\n }\n\n const labels: Record<AccountLifecycleAction, string> = {\n suspend: t('admin.common.lifecycle.suspend'),\n unlock: t('admin.common.lifecycle.unlock'),\n unsuspend: t('admin.common.lifecycle.unsuspend'),\n };\n\n if (confirming && actions.includes(confirming)) {\n const question: string =\n confirming === 'suspend'\n ? t('admin.common.lifecycle.suspend_confirm', {name})\n : t('admin.common.lifecycle.unsuspend_confirm', {name});\n const withNote: boolean = collectsOperatorNote && confirming === 'suspend';\n const close = (): void => {\n setConfirming(null);\n setOperatorNote('');\n };\n\n return (\n <span className={styles['confirm']} role=\"group\" aria-label={question}>\n <span>{question}</span>\n {withNote && (\n <TextField\n name=\"operatorNote\"\n label={t('admin.common.lifecycle.operator_note')}\n aria-label={t('admin.common.lifecycle.operator_note')}\n value={operatorNote}\n maxLength={OPERATOR_NOTE_MAX_LENGTH}\n disabled={isRunning}\n onChange={(event: ChangeEvent<HTMLInputElement>): void => setOperatorNote(event.target.value)}\n />\n )}\n <Button variant=\"text\" size=\"small\" disabled={isRunning} onClick={close}>\n {t('admin.common.actions.cancel')}\n </Button>\n <Button\n color={confirming === 'suspend' ? 'error' : 'primary'}\n size=\"small\"\n loading={isRunning}\n disabled={isRunning}\n onClick={(): void => {\n onAction(confirming, withNote ? operatorNote.trim() || undefined : undefined);\n close();\n }}\n >\n {labels[confirming]}\n </Button>\n </span>\n );\n }\n\n return (\n <>\n {actions.map((action: AccountLifecycleAction) => (\n <Button\n key={action}\n variant=\"outline\"\n color={action === 'suspend' ? 'error' : 'primary'}\n disabled={isRunning}\n loading={isRunning && action === 'unlock'}\n onClick={(): void => (action === 'unlock' ? onAction(action) : setConfirming(action))}\n >\n {labels[action]}\n </Button>\n ))}\n </>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;AAaA,MAAM,2BAA2B;;;;;AAUjC,MAAaA,qBAAiD,EAC5D,aACiD;CACjD,MAAMC,SAAiCC,oCAAoB;CAC3D,MAAM,EAAC,MAAKC,gCAAgB;AAE5B,KAAI,CAAC,OACH,QAAO;CAGT,MAAMC,SAA4C;EAChD,QAAQ,EAAE,6BAA6B;EACvC,QAAQ,EAAE,6BAA6B;EACvC,WAAW,EAAE,gCAAgC;EAC9C;AAED,QAAO,2CAAC;EAAK,WAAW,OAAO;YAAU,OAAO,WAAW;GAAc;;;;;;AAwB3E,MAAaC,2BAA6D,EACxE,SACA,uBAAuB,OACvB,YAAY,OACZ,MACA,eACuD;CACvD,MAAMJ,SAAiCC,oCAAoB;CAC3D,MAAM,EAAC,MAAKC,gCAAgB;CAC5B,MAAM,CAAC,YAAY,qCAAyD,KAAK;CACjF,MAAM,CAAC,cAAc,uCAAoC,GAAG;AAE5D,KAAI,QAAQ,WAAW,EACrB,QAAO;CAGT,MAAMG,SAAiD;EACrD,SAAS,EAAE,iCAAiC;EAC5C,QAAQ,EAAE,gCAAgC;EAC1C,WAAW,EAAE,mCAAmC;EACjD;AAED,KAAI,cAAc,QAAQ,SAAS,WAAW,EAAE;EAC9C,MAAMC,WACJ,eAAe,YACX,EAAE,0CAA0C,EAAC,MAAK,CAAC,GACnD,EAAE,4CAA4C,EAAC,MAAK,CAAC;EAC3D,MAAMC,WAAoB,wBAAwB,eAAe;EACjE,MAAM,cAAoB;AACxB,iBAAc,KAAK;AACnB,mBAAgB,GAAG;;AAGrB,SACE,4CAAC;GAAK,WAAW,OAAO;GAAY,MAAK;GAAQ,cAAY;;IAC3D,2CAAC,oBAAM,WAAgB;IACtB,YACC,2CAACC;KACC,MAAK;KACL,OAAO,EAAE,uCAAuC;KAChD,cAAY,EAAE,uCAAuC;KACrD,OAAO;KACP,WAAW;KACX,UAAU;KACV,WAAW,UAA+C,gBAAgB,MAAM,OAAO,MAAM;MAC7F;IAEJ,2CAACC;KAAO,SAAQ;KAAO,MAAK;KAAQ,UAAU;KAAW,SAAS;eAC/D,EAAE,8BAA8B;MAC1B;IACT,2CAACA;KACC,OAAO,eAAe,YAAY,UAAU;KAC5C,MAAK;KACL,SAAS;KACT,UAAU;KACV,eAAqB;AACnB,eAAS,YAAY,WAAW,aAAa,MAAM,IAAI,SAAY,OAAU;AAC7E,aAAO;;eAGR,OAAO;MACD;;IACJ;;AAIX,QACE,mFACG,QAAQ,KAAK,WACZ,2CAACA;EAEC,SAAQ;EACR,OAAO,WAAW,YAAY,UAAU;EACxC,UAAU;EACV,SAAS,aAAa,WAAW;EACjC,eAAsB,WAAW,WAAW,SAAS,OAAO,GAAG,cAAc,OAAO;YAEnF,OAAO;IAPH,OAQE,CACT,GACD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"AdminParts.cjs","names":["DetailList: FC<DetailListProps>","styles: Record<string, string>","useAdminPartStyles","Panel: FC<PanelProps>","ChipList: FC<ChipListProps>","Button","ConfirmButton: FC<ConfirmButtonProps>","useTranslation"],"sources":["../../../../../src/components/admin/shared/AdminParts.tsx"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {FC, ReactElement, ReactNode, useState} from 'react';\nimport useAdminPartStyles from './useAdminPartStyles';\nimport useTranslation from '../../../hooks/useTranslation';\nimport Button from '../../primitives/Button/Button';\n\n/**\n * One label and value pair of a {@link DetailList}.\n */\nexport interface DetailListItem {\n label: string;\n value: ReactNode;\n}\n\nexport interface DetailListProps {\n items: DetailListItem[];\n}\n\n/**\n * Renders label and value pairs as a description list.\n */\nexport const DetailList: FC<DetailListProps> = ({items}: DetailListProps): ReactElement => {\n const styles: Record<string, string> = useAdminPartStyles();\n\n return (\n <dl className={styles['detail']}>\n {items.map((item: DetailListItem) => (\n <div key={item.label} style={{display: 'contents'}}>\n <dt className={styles['detailLabel']}>{item.label}</dt>\n <dd className={styles['detailValue']}>{item.value}</dd>\n </div>\n ))}\n </dl>\n );\n};\n\nexport interface PanelProps {\n actions?: ReactNode;\n children?: ReactNode;\n title: string;\n}\n\n/**\n * A bordered block with a heading, used to group parts of a details view.\n */\nexport const Panel: FC<PanelProps> = ({actions, children, title}: PanelProps): ReactElement => {\n const styles: Record<string, string> = useAdminPartStyles();\n\n return (\n <section className={styles['panel']}>\n <div className={styles['row']} style={{justifyContent: 'space-between'}}>\n <h3 className={styles['panelTitle']}>{title}</h3>\n {actions}\n </div>\n {children}\n </section>\n );\n};\n\nexport interface ChipListProps {\n /**\n * Accessible name of the list, already translated.\n */\n label: string;\n /**\n * Message shown when there are no items, already translated.\n */\n emptyText: string;\n items: {id: string; label: string; onRemove?: () => void; removeLabel?: string}[];\n}\n\n/**\n * Renders a list of named items, each optionally removable.\n */\nexport const ChipList: FC<ChipListProps> = ({emptyText, items, label}: ChipListProps): ReactElement => {\n const styles: Record<string, string> = useAdminPartStyles();\n\n if (items.length === 0) {\n return <span className={styles['muted']}>{emptyText}</span>;\n }\n\n return (\n <ul className={styles['chipList']} aria-label={label}>\n {items.map((item: ChipListProps['items'][number]) => (\n <li key={item.id} className={styles['chip']}>\n {item.label}\n {item.onRemove && (\n <Button variant=\"icon\" size=\"small\" aria-label={item.removeLabel} onClick={item.onRemove}>\n <span aria-hidden=\"true\">×</span>\n </Button>\n )}\n </li>\n ))}\n </ul>\n );\n};\n\nexport interface ConfirmButtonProps {\n /**\n * Label of the button that starts the action, already translated.\n */\n children: ReactNode;\n /**\n * Question asked before the action runs, already translated.\n */\n confirmText: string;\n disabled?: boolean;\n isLoading?: boolean;\n onConfirm: () => void;\n}\n\n/**\n * A destructive action that asks for confirmation inline before it runs.\n */\nexport const ConfirmButton: FC<ConfirmButtonProps> = ({\n children,\n confirmText,\n disabled = false,\n isLoading = false,\n onConfirm,\n}: ConfirmButtonProps): ReactElement => {\n const styles: Record<string, string> = useAdminPartStyles();\n const {t} = useTranslation();\n const [isConfirming, setIsConfirming] = useState<boolean>(false);\n\n if (!isConfirming) {\n return (\n <Button variant=\"outline\" color=\"error\" disabled={disabled} onClick={(): void => setIsConfirming(true)}>\n {children}\n </Button>\n );\n }\n\n return (\n <span className={styles['confirm']} role=\"group\" aria-label={confirmText}>\n <span>{confirmText}</span>\n <Button variant=\"text\" size=\"small\" disabled={isLoading} onClick={(): void => setIsConfirming(false)}>\n {t('admin.common.actions.cancel')}\n </Button>\n <Button color=\"error\" size=\"small\" loading={isLoading} disabled={isLoading} onClick={onConfirm}>\n {t('admin.common.actions.confirm')}\n </Button>\n </span>\n );\n};\n"],"mappings":";;;;;;;;;;;;;AAuBA,MAAaA,cAAmC,EAAC,YAA0C;CACzF,MAAMC,SAAiCC,oCAAoB;AAE3D,QACE,2CAAC;EAAG,WAAW,OAAO;YACnB,MAAM,KAAK,SACV,4CAAC;GAAqB,OAAO,EAAC,SAAS,YAAW;cAChD,2CAAC;IAAG,WAAW,OAAO;cAAiB,KAAK;KAAW,EACvD,2CAAC;IAAG,WAAW,OAAO;cAAiB,KAAK;KAAW;KAF/C,KAAK,MAGT,CACN;GACC;;;;;AAaT,MAAaC,SAAyB,EAAC,SAAS,UAAU,YAAqC;CAC7F,MAAMF,SAAiCC,oCAAoB;AAE3D,QACE,4CAAC;EAAQ,WAAW,OAAO;aACzB,4CAAC;GAAI,WAAW,OAAO;GAAQ,OAAO,EAAC,gBAAgB,iBAAgB;cACrE,2CAAC;IAAG,WAAW,OAAO;cAAgB;KAAW,EAChD;IACG,EACL;GACO;;;;;AAmBd,MAAaE,YAA+B,EAAC,WAAW,OAAO,YAAwC;CACrG,MAAMH,SAAiCC,oCAAoB;AAE3D,KAAI,MAAM,WAAW,EACnB,QAAO,2CAAC;EAAK,WAAW,OAAO;YAAW;GAAiB;AAG7D,QACE,2CAAC;EAAG,WAAW,OAAO;EAAa,cAAY;YAC5C,MAAM,KAAK,SACV,4CAAC;GAAiB,WAAW,OAAO;cACjC,KAAK,OACL,KAAK,YACJ,2CAACG;IAAO,SAAQ;IAAO,MAAK;IAAQ,cAAY,KAAK;IAAa,SAAS,KAAK;cAC9E,2CAAC;KAAK,eAAY;eAAO;MAAQ;KAC1B;KALJ,KAAK,GAOT,CACL;GACC;;;;;AAqBT,MAAaC,iBAAyC,EACpD,UACA,aACA,WAAW,OACX,YAAY,OACZ,gBACsC;CACtC,MAAML,SAAiCC,oCAAoB;CAC3D,MAAM,EAAC,MAAKK,gCAAgB;CAC5B,MAAM,CAAC,cAAc,uCAAqC,MAAM;AAEhE,KAAI,CAAC,aACH,QACE,2CAACF;EAAO,SAAQ;EAAU,OAAM;EAAkB;EAAU,eAAqB,gBAAgB,KAAK;EACnG;GACM;AAIb,QACE,4CAAC;EAAK,WAAW,OAAO;EAAY,MAAK;EAAQ,cAAY;;GAC3D,2CAAC,oBAAM,cAAmB;GAC1B,2CAACA;IAAO,SAAQ;IAAO,MAAK;IAAQ,UAAU;IAAW,eAAqB,gBAAgB,MAAM;cACjG,EAAE,8BAA8B;KAC1B;GACT,2CAACA;IAAO,OAAM;IAAQ,MAAK;IAAQ,SAAS;IAAW,UAAU;IAAW,SAAS;cAClF,EAAE,+BAA+B;KAC3B;;GACJ"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"AdminParts.styles.cjs","names":["unit: string"],"sources":["../../../../../src/components/admin/shared/AdminParts.styles.ts"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {Theme} from '@thunderid/browser';\nimport {useMemo} from 'react';\nimport {css} from '../../../styles/emotion';\n\n/**\n * Creates the styles for the detail list, chip list and inline confirmation used by the admin\n * components.\n *\n * @param theme - The theme object containing design tokens.\n * @param colorScheme - The current color scheme, used for memoization.\n * @returns The CSS class names for each part.\n */\nconst useStyles = (theme: Theme, colorScheme: string): Record<string, string> =>\n useMemo(() => {\n const unit: string = theme.vars.spacing.unit;\n\n return {\n chip: css`\n display: inline-flex;\n align-items: center;\n gap: calc(${unit} / 2);\n padding: calc(${unit} / 2) ${unit};\n border-radius: 999px;\n border: 1px solid ${theme.vars.colors.border};\n background: ${theme.vars.colors.background.surface};\n font-size: ${theme.vars.typography.fontSizes.sm};\n color: ${theme.vars.colors.text.primary};\n `,\n chipList: css`\n display: flex;\n flex-wrap: wrap;\n gap: ${unit};\n margin: 0;\n padding: 0;\n list-style: none;\n `,\n confirm: css`\n display: inline-flex;\n flex-wrap: wrap;\n align-items: center;\n gap: ${unit};\n font-size: ${theme.vars.typography.fontSizes.sm};\n `,\n detail: css`\n display: grid;\n grid-template-columns: fit-content(200px) minmax(0, 1fr);\n gap: ${unit} calc(${unit} * 2);\n margin: 0;\n font-size: ${theme.vars.typography.fontSizes.sm};\n `,\n detailLabel: css`\n color: ${theme.vars.colors.text.secondary};\n `,\n detailValue: css`\n margin: 0;\n color: ${theme.vars.colors.text.primary};\n overflow-wrap: anywhere;\n `,\n muted: css`\n color: ${theme.vars.colors.text.secondary};\n font-size: ${theme.vars.typography.fontSizes.sm};\n `,\n panel: css`\n display: flex;\n flex-direction: column;\n gap: calc(${unit} * 1.5);\n padding: calc(${unit} * 2);\n border: 1px solid ${theme.vars.colors.border};\n border-radius: ${theme.vars.borderRadius.large};\n background: ${theme.vars.colors.background.surface};\n `,\n panelTitle: css`\n margin: 0;\n font-size: ${theme.vars.typography.fontSizes.md};\n font-weight: ${theme.vars.typography.fontWeights.semibold};\n `,\n row: css`\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: calc(${unit} * 1.5);\n `,\n };\n }, [theme, colorScheme]);\n\nexport default useStyles;\n"],"mappings":";;;;;;;;;;;;;;AAeA,MAAM,aAAa,OAAc,yCACjB;CACZ,MAAMA,OAAe,MAAM,KAAK,QAAQ;AAExC,QAAO;EACL,MAAM,mBAAG;;;oBAGK,KAAK;wBACD,KAAK,QAAQ,KAAK;;4BAEd,MAAM,KAAK,OAAO,OAAO;sBAC/B,MAAM,KAAK,OAAO,WAAW,QAAQ;qBACtC,MAAM,KAAK,WAAW,UAAU,GAAG;iBACvC,MAAM,KAAK,OAAO,KAAK,QAAQ;;EAE1C,UAAU,mBAAG;;;eAGJ,KAAK;;;;;EAKd,SAAS,mBAAG;;;;eAIH,KAAK;qBACC,MAAM,KAAK,WAAW,UAAU,GAAG;;EAElD,QAAQ,mBAAG;;;eAGF,KAAK,QAAQ,KAAK;;qBAEZ,MAAM,KAAK,WAAW,UAAU,GAAG;;EAElD,aAAa,mBAAG;iBACL,MAAM,KAAK,OAAO,KAAK,UAAU;;EAE5C,aAAa,mBAAG;;iBAEL,MAAM,KAAK,OAAO,KAAK,QAAQ;;;EAG1C,OAAO,mBAAG;iBACC,MAAM,KAAK,OAAO,KAAK,UAAU;qBAC7B,MAAM,KAAK,WAAW,UAAU,GAAG;;EAElD,OAAO,mBAAG;;;oBAGI,KAAK;wBACD,KAAK;4BACD,MAAM,KAAK,OAAO,OAAO;yBAC5B,MAAM,KAAK,aAAa,MAAM;sBACjC,MAAM,KAAK,OAAO,WAAW,QAAQ;;EAErD,YAAY,mBAAG;;qBAEA,MAAM,KAAK,WAAW,UAAU,GAAG;uBACjC,MAAM,KAAK,WAAW,YAAY,SAAS;;EAE5D,KAAK,mBAAG;;;;oBAIM,KAAK;;EAEpB;GACA,CAAC,OAAO,YAAY,CAAC;AAE1B,gCAAe"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"AdminSearch.cjs","names":["styles: Record<string, string>","useAdminPartStyles","useTranslation","label: string","Select","TextField","Button"],"sources":["../../../../../src/components/admin/shared/AdminSearch.tsx"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {SelectOption} from '@thunderid/browser';\nimport {ChangeEvent, FormEvent, ReactElement, useState} from 'react';\nimport useAdminPartStyles from './useAdminPartStyles';\nimport useTranslation from '../../../hooks/useTranslation';\nimport Button from '../../primitives/Button/Button';\nimport Select from '../../primitives/Select/Select';\nimport TextField from '../../primitives/TextField/TextField';\n\n/**\n * A search an admin list applies on the server: the attribute to match and the value it must equal.\n */\nexport interface AdminSearchValue {\n attribute: string;\n value: string;\n}\n\nexport interface AdminSearchProps {\n /**\n * The attributes that can be searched, with translated labels. The attribute select is hidden when\n * there is only one.\n */\n attributes: SelectOption[];\n /**\n * Called with the search to apply when the form is submitted, or `null` when it is cleared.\n */\n onSearch: (search: AdminSearchValue | null) => void;\n /**\n * The search currently applied.\n */\n search?: AdminSearchValue | null;\n}\n\n/**\n * Searches an admin list by one attribute. The server matches the whole value, so the search runs when\n * submitted rather than on every keystroke.\n */\nconst AdminSearch = ({attributes, onSearch, search = null}: AdminSearchProps): ReactElement => {\n const styles: Record<string, string> = useAdminPartStyles();\n const {t} = useTranslation();\n const [attribute, setAttribute] = useState<string>(search?.attribute ?? attributes[0]?.value ?? '');\n const [value, setValue] = useState<string>(search?.value ?? '');\n const label: string = attributes.find((option: SelectOption) => option.value === attribute)?.label ?? attribute;\n\n const handleSubmit = (event: FormEvent<HTMLFormElement>): void => {\n event.preventDefault();\n onSearch(value.trim() ? {attribute, value: value.trim()} : null);\n };\n\n return (\n <form className={styles['row']} onSubmit={handleSubmit} role=\"search\" style={{alignItems: 'flex-end'}}>\n {attributes.length > 1 && (\n <Select\n label={t('admin.common.search.attribute')}\n name=\"searchAttribute\"\n value={attribute}\n options={attributes}\n onChange={(event: ChangeEvent<HTMLSelectElement>): void => setAttribute(event.target.value)}\n />\n )}\n <TextField\n name=\"search\"\n type=\"search\"\n label={attributes.length > 1 ? undefined : label}\n aria-label={label}\n placeholder={t('admin.common.search.placeholder', {attribute: label.toLowerCase()})}\n value={value}\n onChange={(event: ChangeEvent<HTMLInputElement>): void => setValue(event.target.value)}\n />\n <Button type=\"submit\" variant=\"outline\">\n {t('admin.common.search.submit')}\n </Button>\n {search && (\n <Button\n type=\"button\"\n variant=\"text\"\n onClick={(): void => {\n setValue('');\n onSearch(null);\n }}\n >\n {t('admin.common.search.clear')}\n </Button>\n )}\n </form>\n );\n};\n\nexport default AdminSearch;\n"],"mappings":";;;;;;;;;;;;;;;;AAuCA,MAAM,eAAe,EAAC,YAAY,UAAU,SAAS,WAA0C;CAC7F,MAAMA,SAAiCC,oCAAoB;CAC3D,MAAM,EAAC,MAAKC,gCAAgB;CAC5B,MAAM,CAAC,WAAW,oCAAiC,QAAQ,aAAa,WAAW,IAAI,SAAS,GAAG;CACnG,MAAM,CAAC,OAAO,gCAA6B,QAAQ,SAAS,GAAG;CAC/D,MAAMC,QAAgB,WAAW,MAAM,WAAyB,OAAO,UAAU,UAAU,EAAE,SAAS;CAEtG,MAAM,gBAAgB,UAA4C;AAChE,QAAM,gBAAgB;AACtB,WAAS,MAAM,MAAM,GAAG;GAAC;GAAW,OAAO,MAAM,MAAM;GAAC,GAAG,KAAK;;AAGlE,QACE,4CAAC;EAAK,WAAW,OAAO;EAAQ,UAAU;EAAc,MAAK;EAAS,OAAO,EAAC,YAAY,YAAW;;GAClG,WAAW,SAAS,KACnB,2CAACC;IACC,OAAO,EAAE,gCAAgC;IACzC,MAAK;IACL,OAAO;IACP,SAAS;IACT,WAAW,UAAgD,aAAa,MAAM,OAAO,MAAM;KAC3F;GAEJ,2CAACC;IACC,MAAK;IACL,MAAK;IACL,OAAO,WAAW,SAAS,IAAI,SAAY;IAC3C,cAAY;IACZ,aAAa,EAAE,mCAAmC,EAAC,WAAW,MAAM,aAAa,EAAC,CAAC;IAC5E;IACP,WAAW,UAA+C,SAAS,MAAM,OAAO,MAAM;KACtF;GACF,2CAACC;IAAO,MAAK;IAAS,SAAQ;cAC3B,EAAE,6BAA6B;KACzB;GACR,UACC,2CAACA;IACC,MAAK;IACL,SAAQ;IACR,eAAqB;AACnB,cAAS,GAAG;AACZ,cAAS,KAAK;;cAGf,EAAE,4BAA4B;KACxB;;GAEN;;AAIX,0BAAe"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"AdminSection.cjs","names":["AdminSection: FC<AdminSectionProps>","useTheme","styles: Record<string, string>","useStyles","Heading: `h${typeof headingLevel}`","content: ReactElement","cx","ComponentPreferencesContext"],"sources":["../../../../../src/components/admin/shared/AdminSection.tsx"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {Preferences, bem, withVendorCSSClassPrefix} from '@thunderid/browser';\nimport {FC, ReactElement, ReactNode} from 'react';\nimport useStyles from './AdminSection.styles';\nimport ComponentPreferencesContext from '../../../contexts/I18n/ComponentPreferencesContext';\nimport useTheme from '../../../contexts/Theme/useTheme';\nimport {cx} from '../../../styles/emotion';\n\nexport interface AdminSectionProps {\n /**\n * Controls rendered next to the title, such as a create button.\n */\n actions?: ReactNode;\n /**\n * BEM block name of the component that renders the section, used for its CSS class.\n */\n block: string;\n children?: ReactNode;\n className?: string;\n description?: string;\n /**\n * Heading level of the title.\n * @default 2\n */\n headingLevel?: 2 | 3 | 4;\n /**\n * Component-level preferences, applied to this section and everything rendered inside it.\n */\n preferences?: Preferences;\n title?: string;\n}\n\n/**\n * Frames an admin component with a title, a description and actions.\n */\nconst AdminSection: FC<AdminSectionProps> = ({\n actions,\n block,\n children,\n className,\n description,\n headingLevel = 2,\n preferences,\n title,\n}: AdminSectionProps): ReactElement => {\n const {theme, colorScheme} = useTheme();\n const styles: Record<string, string> = useStyles(theme, colorScheme);\n const Heading: `h${typeof headingLevel}` = `h${headingLevel}`;\n\n const content: ReactElement = (\n <section className={cx(withVendorCSSClassPrefix(bem(block)), styles['root'], className)}>\n {(Boolean(title) || Boolean(actions)) && (\n <div className={cx(withVendorCSSClassPrefix(bem(block, 'header')), styles['header'])}>\n <div>\n {title && <Heading className={styles['title']}>{title}</Heading>}\n {description && <p className={styles['description']}>{description}</p>}\n </div>\n {actions && <div className={styles['actions']}>{actions}</div>}\n </div>\n )}\n {children}\n </section>\n );\n\n return preferences ? (\n <ComponentPreferencesContext.Provider value={preferences}>{content}</ComponentPreferencesContext.Provider>\n ) : (\n content\n );\n};\n\nexport default AdminSection;\n"],"mappings":";;;;;;;;;;;;;;AAqCA,MAAMA,gBAAuC,EAC3C,SACA,OACA,UACA,WACA,aACA,eAAe,GACf,aACA,YACqC;CACrC,MAAM,EAAC,OAAO,gBAAeC,0BAAU;CACvC,MAAMC,SAAiCC,oCAAU,OAAO,YAAY;CACpE,MAAMC,UAAqC,IAAI;CAE/C,MAAMC,UACJ,4CAAC;EAAQ,WAAWC,kGAAgC,MAAM,CAAC,EAAE,OAAO,SAAS,UAAU;cACnF,QAAQ,MAAM,IAAI,QAAQ,QAAQ,KAClC,4CAAC;GAAI,WAAWA,kGAAgC,OAAO,SAAS,CAAC,EAAE,OAAO,UAAU;cAClF,4CAAC,oBACE,SAAS,2CAAC;IAAQ,WAAW,OAAO;cAAW;KAAgB,EAC/D,eAAe,2CAAC;IAAE,WAAW,OAAO;cAAiB;KAAgB,IAClE,EACL,WAAW,2CAAC;IAAI,WAAW,OAAO;cAAa;KAAc;IAC1D,EAEP;GACO;AAGZ,QAAO,cACL,2CAACC,4CAA4B;EAAS,OAAO;YAAc;GAA+C,GAE1G;;AAIJ,2BAAe"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"AdminSection.styles.cjs","names":["unit: string"],"sources":["../../../../../src/components/admin/shared/AdminSection.styles.ts"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {Theme} from '@thunderid/browser';\nimport {useMemo} from 'react';\nimport {css} from '../../../styles/emotion';\n\n/**\n * Creates the styles shared by the admin components: the section frame and the create forms.\n *\n * @param theme - The theme object containing design tokens.\n * @param colorScheme - The current color scheme, used for memoization.\n * @returns The CSS class names for each part.\n */\nconst useStyles = (theme: Theme, colorScheme: string): Record<string, string> =>\n useMemo(() => {\n const unit: string = theme.vars.spacing.unit;\n\n return {\n actions: css`\n display: flex;\n flex-wrap: wrap;\n gap: ${unit};\n `,\n description: css`\n margin: calc(${unit} / 2) 0 0;\n color: ${theme.vars.colors.text.secondary};\n font-size: ${theme.vars.typography.fontSizes.sm};\n `,\n form: css`\n display: flex;\n flex-direction: column;\n gap: calc(${unit} * 2);\n max-width: 560px;\n `,\n formActions: css`\n display: flex;\n gap: ${unit};\n justify-content: flex-end;\n `,\n header: css`\n display: flex;\n flex-wrap: wrap;\n align-items: flex-end;\n justify-content: space-between;\n gap: calc(${unit} * 1.5);\n `,\n root: css`\n display: flex;\n flex-direction: column;\n gap: calc(${unit} * 2);\n font-family: ${theme.vars.typography.fontFamily};\n color: ${theme.vars.colors.text.primary};\n `,\n title: css`\n margin: 0;\n font-size: ${theme.vars.typography.fontSizes.xl};\n font-weight: ${theme.vars.typography.fontWeights.normal};\n `,\n };\n }, [theme, colorScheme]);\n\nexport default useStyles;\n"],"mappings":";;;;;;;;;;;;;AAcA,MAAM,aAAa,OAAc,yCACjB;CACZ,MAAMA,OAAe,MAAM,KAAK,QAAQ;AAExC,QAAO;EACL,SAAS,mBAAG;;;eAGH,KAAK;;EAEd,aAAa,mBAAG;uBACC,KAAK;iBACX,MAAM,KAAK,OAAO,KAAK,UAAU;qBAC7B,MAAM,KAAK,WAAW,UAAU,GAAG;;EAElD,MAAM,mBAAG;;;oBAGK,KAAK;;;EAGnB,aAAa,mBAAG;;eAEP,KAAK;;;EAGd,QAAQ,mBAAG;;;;;oBAKG,KAAK;;EAEnB,MAAM,mBAAG;;;oBAGK,KAAK;uBACF,MAAM,KAAK,WAAW,WAAW;iBACvC,MAAM,KAAK,OAAO,KAAK,QAAQ;;EAE1C,OAAO,mBAAG;;qBAEK,MAAM,KAAK,WAAW,UAAU,GAAG;uBACjC,MAAM,KAAK,WAAW,YAAY,OAAO;;EAE3D;GACA,CAAC,OAAO,YAAY,CAAC;AAE1B,kCAAe"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ApplicationFormFields.cjs","names":["ApplicationFormFields: FC<ApplicationFormFieldsProps>","styles: Record<string, string>","useAdminPartStyles","useTranslation","TextField","APPLICATION_GRANT_TYPES","Checkbox"],"sources":["../../../../../src/components/admin/shared/ApplicationFormFields.tsx"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {APPLICATION_GRANT_TYPES, Preferences} from '@thunderid/browser';\nimport {ChangeEvent, FC, ReactElement} from 'react';\nimport useAdminPartStyles from './useAdminPartStyles';\nimport useTranslation from '../../../hooks/useTranslation';\nimport Checkbox from '../../primitives/Checkbox/Checkbox';\nimport TextField from '../../primitives/TextField/TextField';\n\n/**\n * The text fields of the application forms.\n */\nexport type ApplicationTextField = 'description' | 'logoUrl' | 'name' | 'redirectUris' | 'url';\n\n/**\n * The values of the application forms. `redirectUris` is the text of the field, URIs separated by\n * commas.\n */\nexport interface ApplicationFormValues {\n description: string;\n grantTypes: string[];\n logoUrl: string;\n name: string;\n publicClient: boolean;\n redirectUris: string;\n url: string;\n}\n\nexport interface ApplicationFormFieldsProps {\n onGrantTypesChange: (grantTypes: string[]) => void;\n onInputChange: (field: ApplicationTextField, value: string) => void;\n /**\n * Shows the public client choice. Omit it where the client type cannot change.\n */\n onPublicClientChange?: (publicClient: boolean) => void;\n preferences?: Preferences;\n values: ApplicationFormValues;\n}\n\n/**\n * The general fields and OAuth basics of an application, shared by the create form and the edit form.\n */\nconst ApplicationFormFields: FC<ApplicationFormFieldsProps> = ({\n onGrantTypesChange,\n onInputChange,\n onPublicClientChange,\n preferences,\n values,\n}: ApplicationFormFieldsProps): ReactElement => {\n const styles: Record<string, string> = useAdminPartStyles();\n const {t} = useTranslation(preferences?.i18n);\n\n const text = (field: ApplicationTextField, label: string, extra: {helperText?: string; required?: boolean} = {}) => (\n <TextField\n name={field}\n label={label}\n value={values[field]}\n autoComplete=\"off\"\n onChange={(event: ChangeEvent<HTMLInputElement>): void => onInputChange(field, event.target.value)}\n {...extra}\n />\n );\n\n return (\n <>\n {text('name', t('admin.applications.fields.name'), {required: true})}\n {text('description', t('admin.applications.fields.description'))}\n {text('url', t('admin.applications.fields.url'))}\n {text('logoUrl', t('admin.applications.fields.logo_url'))}\n {text('redirectUris', t('admin.applications.fields.redirect_uris'), {\n helperText: t('admin.applications.fields.redirect_uris_hint'),\n })}\n <fieldset className={styles['row']} style={{border: 0, flexWrap: 'wrap', margin: 0, padding: 0}}>\n <legend className={styles['muted']}>{t('admin.applications.fields.grant_types')}</legend>\n {APPLICATION_GRANT_TYPES.map((grantType: string) => (\n <Checkbox\n key={grantType}\n name={`grantType-${grantType}`}\n label={t(`admin.applications.grant_types.${grantType}`)}\n checked={values.grantTypes.includes(grantType)}\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n onGrantTypesChange(\n event.target.checked\n ? [...values.grantTypes, grantType]\n : values.grantTypes.filter((value: string) => value !== grantType),\n )\n }\n />\n ))}\n </fieldset>\n {onPublicClientChange && (\n <Checkbox\n name=\"publicClient\"\n label={t('admin.applications.fields.public_client')}\n checked={values.publicClient}\n onChange={(event: ChangeEvent<HTMLInputElement>): void => onPublicClientChange(event.target.checked)}\n />\n )}\n </>\n );\n};\n\nexport default ApplicationFormFields;\n"],"mappings":";;;;;;;;;;;;;;AA2CA,MAAMA,yBAAyD,EAC7D,oBACA,eACA,sBACA,aACA,aAC8C;CAC9C,MAAMC,SAAiCC,oCAAoB;CAC3D,MAAM,EAAC,MAAKC,+BAAe,aAAa,KAAK;CAE7C,MAAM,QAAQ,OAA6B,OAAe,QAAmD,EAAE,KAC7G,2CAACC;EACC,MAAM;EACC;EACP,OAAO,OAAO;EACd,cAAa;EACb,WAAW,UAA+C,cAAc,OAAO,MAAM,OAAO,MAAM;EAClG,GAAI;GACJ;AAGJ,QACE;EACG,KAAK,QAAQ,EAAE,iCAAiC,EAAE,EAAC,UAAU,MAAK,CAAC;EACnE,KAAK,eAAe,EAAE,wCAAwC,CAAC;EAC/D,KAAK,OAAO,EAAE,gCAAgC,CAAC;EAC/C,KAAK,WAAW,EAAE,qCAAqC,CAAC;EACxD,KAAK,gBAAgB,EAAE,0CAA0C,EAAE,EAClE,YAAY,EAAE,+CAA+C,EAC9D,CAAC;EACF,4CAAC;GAAS,WAAW,OAAO;GAAQ,OAAO;IAAC,QAAQ;IAAG,UAAU;IAAQ,QAAQ;IAAG,SAAS;IAAE;cAC7F,2CAAC;IAAO,WAAW,OAAO;cAAW,EAAE,wCAAwC;KAAU,EACxFC,4CAAwB,KAAK,cAC5B,2CAACC;IAEC,MAAM,aAAa;IACnB,OAAO,EAAE,kCAAkC,YAAY;IACvD,SAAS,OAAO,WAAW,SAAS,UAAU;IAC9C,WAAW,UACT,mBACE,MAAM,OAAO,UACT,CAAC,GAAG,OAAO,YAAY,UAAU,GACjC,OAAO,WAAW,QAAQ,UAAkB,UAAU,UAAU,CACrE;MATE,UAWL,CACF;IACO;EACV,wBACC,2CAACA;GACC,MAAK;GACL,OAAO,EAAE,0CAA0C;GACnD,SAAS,OAAO;GAChB,WAAW,UAA+C,qBAAqB,MAAM,OAAO,QAAQ;IACpG;KAEH;;AAIP,oCAAe"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ClientSecretNotice.cjs","names":["ClientSecretNotice: FC<ClientSecretNoticeProps>","styles: Record<string, string>","useAdminPartStyles","useTranslation","Alert","CopyableText","Button"],"sources":["../../../../../src/components/admin/shared/ClientSecretNotice.tsx"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {Preferences} from '@thunderid/browser';\nimport {FC, ReactElement} from 'react';\nimport useAdminPartStyles from './useAdminPartStyles';\nimport useTranslation from '../../../hooks/useTranslation';\nimport Alert from '../../primitives/Alert/Alert';\nimport Button from '../../primitives/Button/Button';\nimport CopyableText from '../../primitives/CopyableText/CopyableText';\n\nexport interface ClientSecretNoticeProps {\n /**\n * Called once the secret has been copied, after which it cannot be read again.\n */\n onDismiss?: () => void;\n preferences?: Preferences;\n secret: string;\n}\n\n/**\n * Shows a client secret the one time it can be read, masked until revealed, with a copy button.\n */\nconst ClientSecretNotice: FC<ClientSecretNoticeProps> = ({\n onDismiss,\n preferences,\n secret,\n}: ClientSecretNoticeProps): ReactElement => {\n const styles: Record<string, string> = useAdminPartStyles();\n const {t} = useTranslation(preferences?.i18n);\n\n return (\n <div className={styles['row']} style={{alignItems: 'stretch', flexDirection: 'column'}}>\n <Alert variant=\"warning\" role=\"status\">\n {t('admin.applications.secret.notice')}\n </Alert>\n <CopyableText label={t('admin.applications.secret.title')} value={secret} masked />\n {onDismiss && (\n <div className={styles['row']} style={{justifyContent: 'flex-end'}}>\n <Button onClick={onDismiss}>{t('admin.applications.secret.done')}</Button>\n </div>\n )}\n </div>\n );\n};\n\nexport default ClientSecretNotice;\n"],"mappings":";;;;;;;;;;;;;AAuBA,MAAMA,sBAAmD,EACvD,WACA,aACA,aAC2C;CAC3C,MAAMC,SAAiCC,oCAAoB;CAC3D,MAAM,EAAC,MAAKC,+BAAe,aAAa,KAAK;AAE7C,QACE,4CAAC;EAAI,WAAW,OAAO;EAAQ,OAAO;GAAC,YAAY;GAAW,eAAe;GAAS;;GACpF,2CAACC;IAAM,SAAQ;IAAU,MAAK;cAC3B,EAAE,mCAAmC;KAChC;GACR,2CAACC;IAAa,OAAO,EAAE,kCAAkC;IAAE,OAAO;IAAQ;KAAS;GAClF,aACC,2CAAC;IAAI,WAAW,OAAO;IAAQ,OAAO,EAAC,gBAAgB,YAAW;cAChE,2CAACC;KAAO,SAAS;eAAY,EAAE,iCAAiC;MAAU;KACtE;;GAEJ;;AAIV,iCAAe"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"IdentityPicker.cjs","names":["styles: Record<string, string>","useAdminPartStyles","useTranslation","options: SelectOption[]","Select","Button"],"sources":["../../../../../src/components/admin/shared/IdentityPicker.tsx"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {SelectOption} from '@thunderid/browser';\nimport {ChangeEvent, FormEvent, ReactElement, useState} from 'react';\nimport useAdminPartStyles from './useAdminPartStyles';\nimport useTranslation from '../../../hooks/useTranslation';\nimport Button from '../../primitives/Button/Button';\nimport Select from '../../primitives/Select/Select';\n\n/**\n * An identity that can be picked, such as a user, agent or group.\n */\nexport interface IdentityCandidate {\n id: string;\n label: string;\n}\n\nexport interface IdentityPickerProps<TType extends string> {\n /**\n * Label of the add button, already translated.\n */\n addLabel: string;\n /**\n * The identities to choose from, keyed by identity type.\n */\n candidates: Partial<Record<TType, IdentityCandidate[]>>;\n /**\n * Identifiers to leave out, such as current members.\n */\n excludedIds?: string[];\n isSubmitting?: boolean;\n onAdd: (identity: {id: string; type: TType}) => void;\n /**\n * The identity types to choose from, with translated labels.\n */\n types: {label: string; value: TType}[];\n}\n\n/**\n * Picks one identity of a chosen type and adds it, for example as a group member or a role assignee.\n */\nconst IdentityPicker = <TType extends string>({\n addLabel,\n candidates,\n excludedIds = [],\n isSubmitting = false,\n onAdd,\n types,\n}: IdentityPickerProps<TType>): ReactElement => {\n const styles: Record<string, string> = useAdminPartStyles();\n const {t} = useTranslation();\n const [type, setType] = useState<TType>(types[0]?.value);\n const [identityId, setIdentityId] = useState<string>('');\n\n const options: SelectOption[] = (candidates[type] ?? [])\n .filter((candidate: IdentityCandidate) => !excludedIds.includes(candidate.id))\n .map((candidate: IdentityCandidate) => ({label: candidate.label, value: candidate.id}));\n\n const handleSubmit = (event: FormEvent<HTMLFormElement>): void => {\n event.preventDefault();\n\n if (identityId) {\n onAdd({id: identityId, type});\n setIdentityId('');\n }\n };\n\n return (\n <form className={styles['row']} onSubmit={handleSubmit} style={{alignItems: 'flex-end'}}>\n <Select\n label={t('admin.common.fields.identity_type')}\n name=\"identityType\"\n value={type}\n options={types}\n onChange={(event: ChangeEvent<HTMLSelectElement>): void => {\n setType(event.target.value as TType);\n setIdentityId('');\n }}\n />\n <Select\n label={t('admin.common.fields.identity')}\n name=\"identity\"\n value={identityId}\n placeholder={t('admin.common.fields.identity_placeholder')}\n emptyText={t('admin.common.fields.identity_empty')}\n options={options}\n onChange={(event: ChangeEvent<HTMLSelectElement>): void => setIdentityId(event.target.value)}\n />\n <Button type=\"submit\" loading={isSubmitting} disabled={!identityId || isSubmitting}>\n {addLabel}\n </Button>\n </form>\n );\n};\n\nexport default IdentityPicker;\n"],"mappings":";;;;;;;;;;;;;;AA0CA,MAAM,kBAAwC,EAC5C,UACA,YACA,cAAc,EAAE,EAChB,eAAe,OACf,OACA,YAC8C;CAC9C,MAAMA,SAAiCC,oCAAoB;CAC3D,MAAM,EAAC,MAAKC,gCAAgB;CAC5B,MAAM,CAAC,MAAM,+BAA2B,MAAM,IAAI,MAAM;CACxD,MAAM,CAAC,YAAY,qCAAkC,GAAG;CAExD,MAAMC,WAA2B,WAAW,SAAS,EAAE,EACpD,QAAQ,cAAiC,CAAC,YAAY,SAAS,UAAU,GAAG,CAAC,CAC7E,KAAK,eAAkC;EAAC,OAAO,UAAU;EAAO,OAAO,UAAU;EAAG,EAAE;CAEzF,MAAM,gBAAgB,UAA4C;AAChE,QAAM,gBAAgB;AAEtB,MAAI,YAAY;AACd,SAAM;IAAC,IAAI;IAAY;IAAK,CAAC;AAC7B,iBAAc,GAAG;;;AAIrB,QACE,4CAAC;EAAK,WAAW,OAAO;EAAQ,UAAU;EAAc,OAAO,EAAC,YAAY,YAAW;;GACrF,2CAACC;IACC,OAAO,EAAE,oCAAoC;IAC7C,MAAK;IACL,OAAO;IACP,SAAS;IACT,WAAW,UAAgD;AACzD,aAAQ,MAAM,OAAO,MAAe;AACpC,mBAAc,GAAG;;KAEnB;GACF,2CAACA;IACC,OAAO,EAAE,+BAA+B;IACxC,MAAK;IACL,OAAO;IACP,aAAa,EAAE,2CAA2C;IAC1D,WAAW,EAAE,qCAAqC;IACzC;IACT,WAAW,UAAgD,cAAc,MAAM,OAAO,MAAM;KAC5F;GACF,2CAACC;IAAO,MAAK;IAAS,SAAS;IAAc,UAAU,CAAC,cAAc;cACnE;KACM;;GACJ;;AAIX,6BAAe"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useAdminPartStyles.cjs","names":["useTheme","useStyles"],"sources":["../../../../../src/components/admin/shared/useAdminPartStyles.ts"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport useStyles from './AdminParts.styles';\nimport useTheme from '../../../contexts/Theme/useTheme';\n\n/**\n * Returns the shared admin part styles for the active theme.\n *\n * @returns The CSS class names of the admin parts.\n */\nconst useAdminPartStyles = (): Record<string, string> => {\n const {theme, colorScheme} = useTheme();\n\n return useStyles(theme, colorScheme);\n};\n\nexport default useAdminPartStyles;\n"],"mappings":";;;;;;;;;AAWA,MAAM,2BAAmD;CACvD,MAAM,EAAC,OAAO,gBAAeA,0BAAU;AAEvC,QAAOC,kCAAU,OAAO,YAAY;;AAGtC,iCAAe"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"useDefaultOuId.cjs","names":["useUser","fromProfile: unknown"],"sources":["../../../../../src/components/admin/shared/useDefaultOuId.ts"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport useUser from '../../../contexts/User/useUser';\n\n/**\n * Resolves the organization unit a new resource is created in: the one passed in, otherwise the\n * signed-in user's own organization unit.\n *\n * @param ouId - The organization unit chosen by the caller.\n * @returns The organization unit identifier, or `undefined` when neither is known.\n */\nconst useDefaultOuId = (ouId?: string): string | undefined => {\n const {profile, flattenedProfile} = useUser();\n const source: Record<string, unknown> = (flattenedProfile ?? profile ?? {}) as Record<string, unknown>;\n const fromProfile: unknown = source['ouId'];\n\n return ouId ?? (typeof fromProfile === 'string' ? fromProfile : undefined);\n};\n\nexport default useDefaultOuId;\n"],"mappings":";;;;;;;;;;AAYA,MAAM,kBAAkB,SAAsC;CAC5D,MAAM,EAAC,SAAS,qBAAoBA,yBAAS;CAE7C,MAAMC,eADmC,oBAAoB,WAAW,EAAE,EACtC;AAEpC,QAAO,SAAS,OAAO,gBAAgB,WAAW,cAAc;;AAGlE,6BAAe"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"AgentCreate.d.ts","sourceRoot":"","sources":["../../../../src/components/admin/AgentCreate/AgentCreate.tsx"],"names":[],"mappings":"AAGA,OAAO,EACL,KAAK,EASN,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAC,EAAE,EAAwB,MAAM,OAAO,CAAC;AAChD,OAAwB,EAAwB,oBAAoB,EAAC,MAAM,mBAAmB,CAAC;AAO/F,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,oBAAoB,EAAE,YAAY,GAAG,OAAO,GAAG,cAAc,GAAG,UAAU,CAAC,GAAG;IAChH;;OAEG;IACH,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACnC;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;;;;;GAOG;AACH,QAAA,MAAM,WAAW,EAAE,EAAE,CAAC,gBAAgB,CAgDrC,CAAC;AAEF,eAAe,WAAW,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"AgentCreate.js","names":["AgentCreate: FC<AgentCreateProps>","useTranslation","resolvedOuId: string | undefined","useDefaultOuId","agentsEndpoint: ManagementEndpoint","useManagementEndpoint","agentTypesEndpoint: ManagementEndpoint","useResourceQuery","useResourceMutation","options: SelectOption[]","BaseAgentCreate"],"sources":["../../../../src/components/admin/AgentCreate/AgentCreate.tsx"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n Agent,\n AgentQueryKeys,\n AgentType,\n AgentTypeListResponse,\n CreateAgentRequest,\n SelectOption,\n createAgent,\n getAgentTypes,\n toManagementErrorMessage,\n} from '@thunderid/browser';\nimport {FC, ReactElement, useMemo} from 'react';\nimport BaseAgentCreate, {AgentCreateSubmission, BaseAgentCreateProps} from './BaseAgentCreate';\nimport useManagementEndpoint, {ManagementEndpoint} from '../../../hooks/management/useManagementEndpoint';\nimport useResourceMutation, {ResourceMutationResult} from '../../../hooks/management/useResourceMutation';\nimport useResourceQuery, {ResourceQueryResult} from '../../../hooks/management/useResourceQuery';\nimport useTranslation from '../../../hooks/useTranslation';\nimport useDefaultOuId from '../shared/useDefaultOuId';\n\nexport type AgentCreateProps = Omit<BaseAgentCreateProps, 'agentTypes' | 'error' | 'isSubmitting' | 'onSubmit'> & {\n /**\n * Called with the created agent.\n */\n onCreated?: (agent: Agent) => void;\n /**\n * Organization unit the agent is created in. Defaults to the signed-in user's organization unit.\n */\n ouId?: string;\n /**\n * The person responsible for the agent. Defaults to the server's choice, usually the creator.\n */\n owner?: string;\n};\n\n/**\n * Registers an agent through the management API.\n *\n * @example\n * ```tsx\n * <AgentCreate onCreated={(agent) => navigate(`/agents/${agent.id}`)} />\n * ```\n */\nconst AgentCreate: FC<AgentCreateProps> = ({\n onCreated,\n ouId,\n owner,\n preferences,\n ...rest\n}: AgentCreateProps): ReactElement => {\n const {t} = useTranslation(preferences?.i18n);\n const resolvedOuId: string | undefined = useDefaultOuId(ouId);\n const agentsEndpoint: ManagementEndpoint = useManagementEndpoint('agents');\n const agentTypesEndpoint: ManagementEndpoint = useManagementEndpoint('agentTypes');\n const {data: agentTypes}: ResourceQueryResult<AgentTypeListResponse> = useResourceQuery(\n [AgentQueryKeys.AGENT_TYPES, {limit: 100}],\n (fetcher) => getAgentTypes({...agentTypesEndpoint, fetcher, limit: 100}),\n );\n const {error, isLoading, mutate}: ResourceMutationResult<Agent, CreateAgentRequest> = useResourceMutation(\n (payload: CreateAgentRequest, fetcher) => createAgent({...agentsEndpoint, fetcher, payload}),\n () => [[AgentQueryKeys.AGENTS]],\n {onSuccess: onCreated},\n );\n\n const options: SelectOption[] = useMemo(\n () =>\n (agentTypes?.types ?? []).map((agentType: AgentType) => ({\n label: agentType.displayName,\n value: agentType.handle,\n })),\n [agentTypes],\n );\n\n const handleSubmit = ({description, name, type}: AgentCreateSubmission): void => {\n if (resolvedOuId) {\n void mutate({attributes: {name}, description, ouId: resolvedOuId, owner, type});\n }\n };\n\n return (\n <BaseAgentCreate\n agentTypes={options}\n onSubmit={handleSubmit}\n isSubmitting={isLoading}\n error={\n resolvedOuId ? toManagementErrorMessage(t, error, 'admin.agents.create.error') : t('admin.common.errors.no_ou')\n }\n preferences={preferences}\n {...rest}\n />\n );\n};\n\nexport default AgentCreate;\n"],"mappings":";;;;;;;;;;;;;;;;;;;AA6CA,MAAMA,eAAqC,EACzC,WACA,MACA,OACA,YACA,GAAG,WACiC;CACpC,MAAM,EAAC,MAAKC,uBAAe,aAAa,KAAK;CAC7C,MAAMC,eAAmCC,uBAAe,KAAK;CAC7D,MAAMC,iBAAqCC,8BAAsB,SAAS;CAC1E,MAAMC,qBAAyCD,8BAAsB,aAAa;CAClF,MAAM,EAAC,MAAM,eAA0DE,yBACrE,CAAC,eAAe,aAAa,EAAC,OAAO,KAAI,CAAC,GACzC,YAAY,cAAc;EAAC,GAAG;EAAoB;EAAS,OAAO;EAAI,CAAC,CACzE;CACD,MAAM,EAAC,OAAO,WAAW,WAA6DC,6BACnF,SAA6B,YAAY,YAAY;EAAC,GAAG;EAAgB;EAAS;EAAQ,CAAC,QACtF,CAAC,CAAC,eAAe,OAAO,CAAC,EAC/B,EAAC,WAAW,WAAU,CACvB;CAED,MAAMC,UAA0B,eAE3B,YAAY,SAAS,EAAE,EAAE,KAAK,eAA0B;EACvD,OAAO,UAAU;EACjB,OAAO,UAAU;EAClB,EAAE,EACL,CAAC,WAAW,CACb;CAED,MAAM,gBAAgB,EAAC,aAAa,MAAM,WAAuC;AAC/E,MAAI,aACF,CAAK,OAAO;GAAC,YAAY,EAAC,MAAK;GAAE;GAAa,MAAM;GAAc;GAAO;GAAK,CAAC;;AAInF,QACE,oBAACC;EACC,YAAY;EACZ,UAAU;EACV,cAAc;EACd,OACE,eAAe,yBAAyB,GAAG,OAAO,4BAA4B,GAAG,EAAE,4BAA4B;EAEpG;EACb,GAAI;GACJ;;AAIN,0BAAe"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"BaseAgentCreate.d.ts","sourceRoot":"","sources":["../../../../src/components/admin/AgentCreate/BaseAgentCreate.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAC,WAAW,EAAE,YAAY,EAAC,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAc,EAAE,EAA2B,SAAS,EAAW,MAAM,OAAO,CAAC;AAUpF;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB;;OAEG;IACH,iBAAiB,EAAE,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnF;;OAEG;IACH,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,YAAY,EAAE,OAAO,CAAC;IACtB;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,MAAM,EAAE;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAC,CAAC;CAC3D;AAED,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,UAAU,EAAE,YAAY,EAAE,CAAC;IAC3B;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,0BAA0B,KAAK,SAAS,CAAC;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,QAAQ,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,IAAI,CAAC;IACjD,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,QAAA,MAAM,eAAe,EAAE,EAAE,CAAC,oBAAoB,CAwG7C,CAAC;AAEF,eAAe,eAAe,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"BaseAgentCreate.js","names":["BaseAgentCreate: FC<BaseAgentCreateProps>","useTheme","styles: Record<string, string>","useStyles","useTranslation","type: string","isValid: boolean","setters: Record<'description' | 'name' | 'type', (value: string) => void>","AdminSection","Alert","TextField","Select","Button"],"sources":["../../../../src/components/admin/AgentCreate/BaseAgentCreate.tsx"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {Preferences, SelectOption} from '@thunderid/browser';\nimport {ChangeEvent, FC, FormEvent, ReactElement, ReactNode, useState} from 'react';\nimport useTheme from '../../../contexts/Theme/useTheme';\nimport useTranslation from '../../../hooks/useTranslation';\nimport Alert from '../../primitives/Alert/Alert';\nimport Button from '../../primitives/Button/Button';\nimport Select from '../../primitives/Select/Select';\nimport TextField from '../../primitives/TextField/TextField';\nimport AdminSection from '../shared/AdminSection';\nimport useStyles from '../shared/AdminSection.styles';\n\n/**\n * The agent {@link BaseAgentCreate} submits. The organization unit is added by the caller.\n */\nexport interface AgentCreateSubmission {\n description?: string;\n name: string;\n type: string;\n}\n\n/**\n * What {@link BaseAgentCreate} hands its `children` render function, so the form can be built with any UI.\n */\nexport interface BaseAgentCreateRenderProps {\n agentTypes: SelectOption[];\n error: string | null;\n /**\n * Sets one field of the form.\n */\n handleInputChange: (field: 'description' | 'name' | 'type', value: string) => void;\n /**\n * Submits the current values. Does nothing while they are not valid.\n */\n handleSubmit: () => void;\n isSubmitting: boolean;\n /**\n * Whether the values can be submitted.\n */\n isValid: boolean;\n onCancel?: () => void;\n values: {description: string; name: string; type: string};\n}\n\nexport interface BaseAgentCreateProps {\n /**\n * The agent types to choose from. The first one is selected by default.\n */\n agentTypes: SelectOption[];\n /**\n * Renders custom UI in place of the default form. Receives the values, their setters, the agent\n * types, the submit handler and the submission state.\n */\n children?: (props: BaseAgentCreateRenderProps) => ReactNode;\n className?: string;\n description?: string;\n error?: string | null;\n isSubmitting?: boolean;\n onCancel?: () => void;\n onSubmit: (agent: AgentCreateSubmission) => void;\n preferences?: Preferences;\n title?: string;\n}\n\n/**\n * A form that collects a new agent's name, type and description. Holds no data of its own: pass\n * the agent types and handle the submission.\n */\nconst BaseAgentCreate: FC<BaseAgentCreateProps> = ({\n agentTypes,\n children,\n className,\n description,\n error = null,\n isSubmitting = false,\n onCancel,\n onSubmit,\n preferences,\n title,\n}: BaseAgentCreateProps): ReactElement => {\n const {theme, colorScheme} = useTheme();\n const styles: Record<string, string> = useStyles(theme, colorScheme);\n const {t} = useTranslation(preferences?.i18n);\n const [name, setName] = useState<string>('');\n const [chosenType, setType] = useState<string>('');\n const type: string = chosenType || (agentTypes[0]?.value ?? '');\n const [agentDescription, setAgentDescription] = useState<string>('');\n\n const isValid: boolean = Boolean(name.trim()) && Boolean(type);\n\n const submit = (): void => {\n if (isValid) {\n onSubmit({description: agentDescription.trim() || undefined, name: name.trim(), type});\n }\n };\n\n const handleSubmit = (event: FormEvent<HTMLFormElement>): void => {\n event.preventDefault();\n submit();\n };\n\n if (children) {\n const setters: Record<'description' | 'name' | 'type', (value: string) => void> = {\n description: setAgentDescription,\n name: setName,\n type: setType,\n };\n\n return (\n <div className={className}>\n {children({\n agentTypes,\n error,\n handleInputChange: (field: 'description' | 'name' | 'type', value: string): void => setters[field](value),\n handleSubmit: submit,\n isSubmitting,\n isValid,\n onCancel,\n values: {description: agentDescription, name, type},\n })}\n </div>\n );\n }\n\n return (\n <AdminSection\n block=\"agent-create\"\n className={className}\n title={title ?? t('admin.agents.create.title')}\n description={description}\n preferences={preferences}\n >\n <form className={styles['form']} onSubmit={handleSubmit} noValidate>\n {error && (\n <Alert variant=\"error\" role=\"alert\">\n {error}\n </Alert>\n )}\n <TextField\n name=\"name\"\n label={t('admin.agents.create.fields.name')}\n required\n value={name}\n onChange={(event: ChangeEvent<HTMLInputElement>): void => setName(event.target.value)}\n />\n <Select\n label={t('admin.agents.create.fields.type')}\n name=\"type\"\n required\n value={type}\n options={agentTypes}\n onChange={(event: ChangeEvent<HTMLSelectElement>): void => setType(event.target.value)}\n />\n <TextField\n name=\"description\"\n label={t('admin.agents.create.fields.description')}\n value={agentDescription}\n onChange={(event: ChangeEvent<HTMLInputElement>): void => setAgentDescription(event.target.value)}\n />\n <div className={styles['formActions']}>\n {onCancel && (\n <Button type=\"button\" variant=\"text\" onClick={onCancel} disabled={isSubmitting}>\n {t('admin.common.actions.cancel')}\n </Button>\n )}\n <Button type=\"submit\" loading={isSubmitting} disabled={!isValid || isSubmitting}>\n {t('admin.agents.create.submit')}\n </Button>\n </div>\n </form>\n </AdminSection>\n );\n};\n\nexport default BaseAgentCreate;\n"],"mappings":";;;;;;;;;;;;;;;;AAsEA,MAAMA,mBAA6C,EACjD,YACA,UACA,WACA,aACA,QAAQ,MACR,eAAe,OACf,UACA,UACA,aACA,YACwC;CACxC,MAAM,EAAC,OAAO,gBAAeC,kBAAU;CACvC,MAAMC,SAAiCC,4BAAU,OAAO,YAAY;CACpE,MAAM,EAAC,MAAKC,uBAAe,aAAa,KAAK;CAC7C,MAAM,CAAC,MAAM,WAAW,SAAiB,GAAG;CAC5C,MAAM,CAAC,YAAY,WAAW,SAAiB,GAAG;CAClD,MAAMC,OAAe,eAAe,WAAW,IAAI,SAAS;CAC5D,MAAM,CAAC,kBAAkB,uBAAuB,SAAiB,GAAG;CAEpE,MAAMC,UAAmB,QAAQ,KAAK,MAAM,CAAC,IAAI,QAAQ,KAAK;CAE9D,MAAM,eAAqB;AACzB,MAAI,QACF,UAAS;GAAC,aAAa,iBAAiB,MAAM,IAAI;GAAW,MAAM,KAAK,MAAM;GAAE;GAAK,CAAC;;CAI1F,MAAM,gBAAgB,UAA4C;AAChE,QAAM,gBAAgB;AACtB,UAAQ;;AAGV,KAAI,UAAU;EACZ,MAAMC,UAA4E;GAChF,aAAa;GACb,MAAM;GACN,MAAM;GACP;AAED,SACE,oBAAC;GAAe;aACb,SAAS;IACR;IACA;IACA,oBAAoB,OAAwC,UAAwB,QAAQ,OAAO,MAAM;IACzG,cAAc;IACd;IACA;IACA;IACA,QAAQ;KAAC,aAAa;KAAkB;KAAM;KAAK;IACpD,CAAC;IACE;;AAIV,QACE,oBAACC;EACC,OAAM;EACK;EACX,OAAO,SAAS,EAAE,4BAA4B;EACjC;EACA;YAEb,qBAAC;GAAK,WAAW,OAAO;GAAS,UAAU;GAAc;;IACtD,SACC,oBAACC;KAAM,SAAQ;KAAQ,MAAK;eACzB;MACK;IAEV,oBAACC;KACC,MAAK;KACL,OAAO,EAAE,kCAAkC;KAC3C;KACA,OAAO;KACP,WAAW,UAA+C,QAAQ,MAAM,OAAO,MAAM;MACrF;IACF,oBAACC;KACC,OAAO,EAAE,kCAAkC;KAC3C,MAAK;KACL;KACA,OAAO;KACP,SAAS;KACT,WAAW,UAAgD,QAAQ,MAAM,OAAO,MAAM;MACtF;IACF,oBAACD;KACC,MAAK;KACL,OAAO,EAAE,yCAAyC;KAClD,OAAO;KACP,WAAW,UAA+C,oBAAoB,MAAM,OAAO,MAAM;MACjG;IACF,qBAAC;KAAI,WAAW,OAAO;gBACpB,YACC,oBAACE;MAAO,MAAK;MAAS,SAAQ;MAAO,SAAS;MAAU,UAAU;gBAC/D,EAAE,8BAA8B;OAC1B,EAEX,oBAACA;MAAO,MAAK;MAAS,SAAS;MAAc,UAAU,CAAC,WAAW;gBAChE,EAAE,6BAA6B;OACzB;MACL;;IACD;GACM;;AAInB,8BAAe"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"AgentDetails.d.ts","sourceRoot":"","sources":["../../../../src/components/admin/AgentDetails/AgentDetails.tsx"],"names":[],"mappings":"AAgBA,OAAO,EAAC,EAAE,EAAe,MAAM,OAAO,CAAC;AACvC,OAAyB,EAAC,qBAAqB,EAAC,MAAM,oBAAoB,CAAC;AAO3E,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAClC,qBAAqB,EACnB,OAAO,GACP,OAAO,GACP,QAAQ,GACR,YAAY,GACZ,WAAW,GACX,0BAA0B,GAC1B,kBAAkB,GAClB,UAAU,GACV,mBAAmB,GACnB,OAAO,CACV,GAAG;IACF,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB,CAAC;AAEF;;;;;;;;GAQG;AACH,QAAA,MAAM,YAAY,EAAE,EAAE,CAAC,iBAAiB,CA4DvC,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"AgentDetails.js","names":["AgentDetails: FC<AgentDetailsProps>","useTranslation","endpoint: ManagementEndpoint","useManagementEndpoint","agent: ResourceQueryResult<Agent>","useResourceQuery","groups: ResourceQueryResult<MembershipGroupListResponse>","roles: ResourceQueryResult<AgentRoleListResponse>","deletion: ResourceMutationResult<void, string>","useResourceMutation","lifecycle: AccountLifecycleState","useAccountLifecycle","BaseAgentDetails"],"sources":["../../../../src/components/admin/AgentDetails/AgentDetails.tsx"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n Agent,\n AgentQueryKeys,\n AgentRoleListResponse,\n GroupQueryKeys,\n MembershipGroupListResponse,\n RoleQueryKeys,\n deleteAgent,\n getAgent,\n getAgentGroups,\n getAgentRoles,\n toManagementErrorMessage,\n} from '@thunderid/browser';\nimport {FC, ReactElement} from 'react';\nimport BaseAgentDetails, {BaseAgentDetailsProps} from './BaseAgentDetails';\nimport useAccountLifecycle, {AccountLifecycleState} from '../../../hooks/management/useAccountLifecycle';\nimport useManagementEndpoint, {ManagementEndpoint} from '../../../hooks/management/useManagementEndpoint';\nimport useResourceMutation, {ResourceMutationResult} from '../../../hooks/management/useResourceMutation';\nimport useResourceQuery, {ResourceQueryResult} from '../../../hooks/management/useResourceQuery';\nimport useTranslation from '../../../hooks/useTranslation';\n\nexport type AgentDetailsProps = Omit<\n BaseAgentDetailsProps,\n | 'agent'\n | 'error'\n | 'groups'\n | 'isDeleting'\n | 'isLoading'\n | 'isRunningLifecycleAction'\n | 'lifecycleActions'\n | 'onDelete'\n | 'onLifecycleAction'\n | 'roles'\n> & {\n agentId: string;\n /**\n * Whether the agent can be deleted from this view.\n * @default false\n */\n deletable?: boolean;\n /**\n * Whether the agent can be suspended, unsuspended and unlocked from this view. Each action runs through its\n * administration flow and is offered only when the server configures that flow. Reading the configured\n * flows needs a token that may read the server configuration.\n * @default false\n */\n lifecycleActions?: boolean;\n /**\n * Called after the agent has been deleted.\n */\n onDeleted?: () => void;\n};\n\n/**\n * Shows an agent with the groups and roles it holds, and optionally lets the signed-in user delete\n * it.\n *\n * @example\n * ```tsx\n * <AgentDetails agentId={agentId} deletable onDeleted={() => navigate('/agents')} />\n * ```\n */\nconst AgentDetails: FC<AgentDetailsProps> = ({\n agentId,\n deletable = false,\n lifecycleActions = false,\n onDeleted,\n preferences,\n ...rest\n}: AgentDetailsProps): ReactElement => {\n const {t} = useTranslation(preferences?.i18n);\n const endpoint: ManagementEndpoint = useManagementEndpoint('agents');\n const agent: ResourceQueryResult<Agent> = useResourceQuery(\n [AgentQueryKeys.AGENT, agentId],\n (fetcher) => getAgent({...endpoint, agentId, fetcher}),\n {enabled: Boolean(agentId)},\n );\n const groups: ResourceQueryResult<MembershipGroupListResponse> = useResourceQuery(\n [GroupQueryKeys.MEMBERSHIPS, 'agent', agentId, {limit: 100}],\n (fetcher) => getAgentGroups({...endpoint, agentId, fetcher, limit: 100}),\n {enabled: Boolean(agentId)},\n );\n const roles: ResourceQueryResult<AgentRoleListResponse> = useResourceQuery(\n [RoleQueryKeys.ROLE_ASSIGNMENTS, 'agent', agentId, {limit: 100}],\n (fetcher) => getAgentRoles({...endpoint, agentId, fetcher, limit: 100}),\n {enabled: Boolean(agentId)},\n );\n const deletion: ResourceMutationResult<void, string> = useResourceMutation(\n (id: string, fetcher) => deleteAgent({...endpoint, agentId: id, fetcher}),\n () => [[AgentQueryKeys.AGENTS]],\n {onSuccess: onDeleted},\n );\n\n const lifecycle: AccountLifecycleState = useAccountLifecycle({\n enabled: lifecycleActions,\n invalidatedKeys: [[AgentQueryKeys.AGENT, agentId], [AgentQueryKeys.AGENTS]],\n kind: 'agent',\n status: agent.data?.status?.value,\n subject: agentId,\n });\n\n return (\n <BaseAgentDetails\n agent={agent.data}\n groups={groups.data?.groups}\n roles={roles.data?.roles}\n isLoading={agent.isLoading}\n error={\n toManagementErrorMessage(t, agent.error, 'admin.agents.details.error') ??\n toManagementErrorMessage(t, deletion.error, 'admin.agents.details.delete.error') ??\n toManagementErrorMessage(t, lifecycle.error, 'admin.common.lifecycle.error') ??\n toManagementErrorMessage(t, lifecycle.loadError, 'admin.common.lifecycle.load_error')\n }\n isDeleting={deletion.isLoading}\n onDelete={deletable ? (): void => void deletion.mutate(agentId) : undefined}\n lifecycleActions={lifecycle.actions}\n isRunningLifecycleAction={lifecycle.isRunning}\n onLifecycleAction={lifecycleActions ? lifecycle.run : undefined}\n preferences={preferences}\n {...rest}\n />\n );\n};\n\nexport default AgentDetails;\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAiEA,MAAMA,gBAAuC,EAC3C,SACA,YAAY,OACZ,mBAAmB,OACnB,WACA,YACA,GAAG,WACkC;CACrC,MAAM,EAAC,MAAKC,uBAAe,aAAa,KAAK;CAC7C,MAAMC,WAA+BC,8BAAsB,SAAS;CACpE,MAAMC,QAAoCC,yBACxC,CAAC,eAAe,OAAO,QAAQ,GAC9B,YAAY,SAAS;EAAC,GAAG;EAAU;EAAS;EAAQ,CAAC,EACtD,EAAC,SAAS,QAAQ,QAAQ,EAAC,CAC5B;CACD,MAAMC,SAA2DD,yBAC/D;EAAC,eAAe;EAAa;EAAS;EAAS,EAAC,OAAO,KAAI;EAAC,GAC3D,YAAY,eAAe;EAAC,GAAG;EAAU;EAAS;EAAS,OAAO;EAAI,CAAC,EACxE,EAAC,SAAS,QAAQ,QAAQ,EAAC,CAC5B;CACD,MAAME,QAAoDF,yBACxD;EAAC,cAAc;EAAkB;EAAS;EAAS,EAAC,OAAO,KAAI;EAAC,GAC/D,YAAY,cAAc;EAAC,GAAG;EAAU;EAAS;EAAS,OAAO;EAAI,CAAC,EACvE,EAAC,SAAS,QAAQ,QAAQ,EAAC,CAC5B;CACD,MAAMG,WAAiDC,6BACpD,IAAY,YAAY,YAAY;EAAC,GAAG;EAAU,SAAS;EAAI;EAAQ,CAAC,QACnE,CAAC,CAAC,eAAe,OAAO,CAAC,EAC/B,EAAC,WAAW,WAAU,CACvB;CAED,MAAMC,YAAmCC,4BAAoB;EAC3D,SAAS;EACT,iBAAiB,CAAC,CAAC,eAAe,OAAO,QAAQ,EAAE,CAAC,eAAe,OAAO,CAAC;EAC3E,MAAM;EACN,QAAQ,MAAM,MAAM,QAAQ;EAC5B,SAAS;EACV,CAAC;AAEF,QACE,oBAACC;EACC,OAAO,MAAM;EACb,QAAQ,OAAO,MAAM;EACrB,OAAO,MAAM,MAAM;EACnB,WAAW,MAAM;EACjB,OACE,yBAAyB,GAAG,MAAM,OAAO,6BAA6B,IACtE,yBAAyB,GAAG,SAAS,OAAO,oCAAoC,IAChF,yBAAyB,GAAG,UAAU,OAAO,+BAA+B,IAC5E,yBAAyB,GAAG,UAAU,WAAW,oCAAoC;EAEvF,YAAY,SAAS;EACrB,UAAU,kBAAwB,KAAK,SAAS,OAAO,QAAQ,GAAG;EAClE,kBAAkB,UAAU;EAC5B,0BAA0B,UAAU;EACpC,mBAAmB,mBAAmB,UAAU,MAAM;EACzC;EACb,GAAI;GACJ;;AAIN,2BAAe"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"BaseAgentDetails.d.ts","sourceRoot":"","sources":["../../../../src/components/admin/AgentDetails/BaseAgentDetails.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAC,sBAAsB,EAAE,KAAK,EAAE,eAAe,EAAE,WAAW,EAAe,MAAM,oBAAoB,CAAC;AAC7G,OAAO,EAAC,EAAE,EAAgB,SAAS,EAAC,MAAM,OAAO,CAAC;AAUlD;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,wBAAwB,EAAE,OAAO,CAAC;IAClC;;OAEG;IACH,gBAAgB,EAAE,sBAAsB,EAAE,CAAC;IAC3C;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB;;OAEG;IACH,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,sBAAsB,EAAE,YAAY,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACpF,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,qBAAqB;IACpC;;OAEG;IACH,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,2BAA2B,KAAK,SAAS,CAAC;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB;;OAEG;IACH,MAAM,CAAC,EAAE,eAAe,EAAE,CAAC;IAC3B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC;;;OAGG;IACH,gBAAgB,CAAC,EAAE,sBAAsB,EAAE,CAAC;IAC5C;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,sBAAsB,EAAE,YAAY,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACpF,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;;GAGG;AACH,QAAA,MAAM,gBAAgB,EAAE,EAAE,CAAC,qBAAqB,CA+H/C,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"BaseAgentDetails.js","names":["BaseAgentDetails: FC<BaseAgentDetailsProps>","useTranslation","styles: Record<string, string>","useAdminPartStyles","AdminSection","Spinner","Alert","details: {label: string; value: ReactNode}[]","CopyableText"],"sources":["../../../../src/components/admin/AgentDetails/BaseAgentDetails.tsx"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {AccountLifecycleAction, Agent, MembershipGroup, Preferences, getAgentName} from '@thunderid/browser';\nimport {FC, ReactElement, ReactNode} from 'react';\nimport useTranslation from '../../../hooks/useTranslation';\nimport Alert from '../../primitives/Alert/Alert';\nimport CopyableText from '../../primitives/CopyableText/CopyableText';\nimport Spinner from '../../primitives/Spinner/Spinner';\nimport {AccessStatusBadge, AccountLifecycleButtons} from '../shared/AccountLifecycleParts';\nimport {ChipList, ConfirmButton, DetailList, Panel} from '../shared/AdminParts';\nimport AdminSection from '../shared/AdminSection';\nimport useAdminPartStyles from '../shared/useAdminPartStyles';\n\n/**\n * What {@link BaseAgentDetails} hands its `children` render function, so the agent can be shown with any UI.\n */\nexport interface BaseAgentDetailsRenderProps {\n agent?: Agent;\n error: string | null;\n groups: MembershipGroup[];\n isDeleting: boolean;\n isLoading: boolean;\n isRunningLifecycleAction: boolean;\n /**\n * The account lifecycle actions offered for the agent. Empty when none is allowed.\n */\n lifecycleActions: AccountLifecycleAction[];\n /**\n * Deletes the agent. Undefined when deletion is not allowed, including for read-only agents.\n */\n onDelete?: () => void;\n /**\n * Runs an account lifecycle action, with the operator's note on a suspension. Undefined when none is allowed.\n */\n onLifecycleAction?: (action: AccountLifecycleAction, operatorNote?: string) => void;\n roles: string[];\n}\n\nexport interface BaseAgentDetailsProps {\n /**\n * Controls rendered next to the agent's name.\n */\n actions?: ReactNode;\n agent?: Agent;\n /**\n * Renders custom UI in place of the default view. Receives the agent, its groups and roles, the\n * loading and error state, and the delete handler.\n */\n children?: (props: BaseAgentDetailsRenderProps) => ReactNode;\n className?: string;\n error?: string | null;\n /**\n * The groups the agent belongs to.\n */\n groups?: MembershipGroup[];\n isDeleting?: boolean;\n isLoading?: boolean;\n isRunningLifecycleAction?: boolean;\n /**\n * The account lifecycle actions to offer (suspend, unsuspend, unlock), shown only with `onLifecycleAction`. They change\n * only runtime state, so they apply to read-only agents too.\n */\n lifecycleActions?: AccountLifecycleAction[];\n /**\n * Deletes the agent. The delete action is hidden when omitted.\n */\n onDelete?: () => void;\n /**\n * Runs an account lifecycle action. Suspending and unsuspending ask for confirmation first, and a\n * suspension takes an optional operator note.\n */\n onLifecycleAction?: (action: AccountLifecycleAction, operatorNote?: string) => void;\n preferences?: Preferences;\n /**\n * The names of the roles the agent holds, directly or through its groups.\n */\n roles?: string[];\n}\n\n/**\n * Shows an agent's type, owner, client and the groups and roles it holds. Holds no data of its own:\n * pass the agent and handle deletion.\n */\nconst BaseAgentDetails: FC<BaseAgentDetailsProps> = ({\n actions,\n agent,\n children,\n className,\n error = null,\n groups = [],\n isDeleting = false,\n isLoading = false,\n isRunningLifecycleAction = false,\n lifecycleActions = [],\n onDelete,\n onLifecycleAction,\n preferences,\n roles = [],\n}: BaseAgentDetailsProps): ReactElement => {\n const {t} = useTranslation(preferences?.i18n);\n const styles: Record<string, string> = useAdminPartStyles();\n\n if (children) {\n return (\n <div className={className}>\n {children({\n agent,\n error,\n groups,\n isDeleting,\n isLoading,\n isRunningLifecycleAction,\n lifecycleActions: onLifecycleAction && agent ? lifecycleActions : [],\n onDelete: agent && !agent.isReadOnly ? onDelete : undefined,\n onLifecycleAction: agent ? onLifecycleAction : undefined,\n roles,\n })}\n </div>\n );\n }\n\n if (isLoading && !agent) {\n return (\n <AdminSection block=\"agent-details\" className={className} preferences={preferences}>\n <span className={styles['muted']} role=\"status\">\n <Spinner size=\"small\" /> {t('admin.common.loading')}\n </span>\n </AdminSection>\n );\n }\n\n if (!agent) {\n return (\n <AdminSection block=\"agent-details\" className={className} preferences={preferences}>\n <Alert variant=\"error\" role=\"alert\">\n {error ?? t('admin.common.errors.not_found')}\n </Alert>\n </AdminSection>\n );\n }\n\n const details: {label: string; value: ReactNode}[] = [\n {label: t('admin.agents.details.type'), value: agent.type},\n {label: t('admin.agents.details.owner'), value: agent.owner ?? t('admin.agents.details.no_owner')},\n {label: t('admin.common.columns.organization_unit'), value: agent.ouHandle ?? agent.ouId},\n ];\n\n if (agent.status) {\n details.push({label: t('admin.common.columns.status'), value: <AccessStatusBadge status={agent.status.value} />});\n }\n\n if (agent.clientId) {\n details.push({label: t('admin.agents.list.columns.client_id'), value: <CopyableText value={agent.clientId} />});\n }\n\n return (\n <AdminSection\n block=\"agent-details\"\n className={className}\n title={getAgentName(agent)}\n description={agent.description}\n preferences={preferences}\n actions={\n <>\n {actions}\n {onLifecycleAction && (\n <AccountLifecycleButtons\n actions={lifecycleActions}\n collectsOperatorNote\n isRunning={isRunningLifecycleAction}\n name={getAgentName(agent)}\n onAction={onLifecycleAction}\n />\n )}\n {onDelete && !agent.isReadOnly && (\n <ConfirmButton\n confirmText={t('admin.agents.details.delete.confirm', {name: getAgentName(agent)})}\n isLoading={isDeleting}\n onConfirm={onDelete}\n >\n {t('admin.agents.details.delete.action')}\n </ConfirmButton>\n )}\n </>\n }\n >\n {error && (\n <Alert variant=\"error\" role=\"alert\">\n {error}\n </Alert>\n )}\n <Panel title={t('admin.agents.details.overview')}>\n <DetailList items={details} />\n </Panel>\n <Panel title={t('admin.agents.details.groups')}>\n <ChipList\n label={t('admin.agents.details.groups')}\n emptyText={t('admin.agents.details.no_groups')}\n items={groups.map((group: MembershipGroup) => ({id: group.id, label: group.name}))}\n />\n </Panel>\n <Panel title={t('admin.agents.details.roles')}>\n <ChipList\n label={t('admin.agents.details.roles')}\n emptyText={t('admin.agents.details.no_roles')}\n items={roles.map((role: string) => ({id: role, label: role}))}\n />\n </Panel>\n </AdminSection>\n );\n};\n\nexport default BaseAgentDetails;\n"],"mappings":";;;;;;;;;;;;;;;;AAoFA,MAAMA,oBAA+C,EACnD,SACA,OACA,UACA,WACA,QAAQ,MACR,SAAS,EAAE,EACX,aAAa,OACb,YAAY,OACZ,2BAA2B,OAC3B,mBAAmB,EAAE,EACrB,UACA,mBACA,aACA,QAAQ,EAAE,OAC+B;CACzC,MAAM,EAAC,MAAKC,uBAAe,aAAa,KAAK;CAC7C,MAAMC,SAAiCC,4BAAoB;AAE3D,KAAI,SACF,QACE,oBAAC;EAAe;YACb,SAAS;GACR;GACA;GACA;GACA;GACA;GACA;GACA,kBAAkB,qBAAqB,QAAQ,mBAAmB,EAAE;GACpE,UAAU,SAAS,CAAC,MAAM,aAAa,WAAW;GAClD,mBAAmB,QAAQ,oBAAoB;GAC/C;GACD,CAAC;GACE;AAIV,KAAI,aAAa,CAAC,MAChB,QACE,oBAACC;EAAa,OAAM;EAA2B;EAAwB;YACrE,qBAAC;GAAK,WAAW,OAAO;GAAU,MAAK;;IACrC,oBAACC,mBAAQ,MAAK,UAAU;;IAAE,EAAE,uBAAuB;;IAC9C;GACM;AAInB,KAAI,CAAC,MACH,QACE,oBAACD;EAAa,OAAM;EAA2B;EAAwB;YACrE,oBAACE;GAAM,SAAQ;GAAQ,MAAK;aACzB,SAAS,EAAE,gCAAgC;IACtC;GACK;CAInB,MAAMC,UAA+C;EACnD;GAAC,OAAO,EAAE,4BAA4B;GAAE,OAAO,MAAM;GAAK;EAC1D;GAAC,OAAO,EAAE,6BAA6B;GAAE,OAAO,MAAM,SAAS,EAAE,gCAAgC;GAAC;EAClG;GAAC,OAAO,EAAE,yCAAyC;GAAE,OAAO,MAAM,YAAY,MAAM;GAAK;EAC1F;AAED,KAAI,MAAM,OACR,SAAQ,KAAK;EAAC,OAAO,EAAE,8BAA8B;EAAE,OAAO,oBAAC,qBAAkB,QAAQ,MAAM,OAAO,QAAS;EAAC,CAAC;AAGnH,KAAI,MAAM,SACR,SAAQ,KAAK;EAAC,OAAO,EAAE,sCAAsC;EAAE,OAAO,oBAACC,wBAAa,OAAO,MAAM,WAAY;EAAC,CAAC;AAGjH,QACE,qBAACJ;EACC,OAAM;EACK;EACX,OAAO,aAAa,MAAM;EAC1B,aAAa,MAAM;EACN;EACb,SACE;GACG;GACA,qBACC,oBAAC;IACC,SAAS;IACT;IACA,WAAW;IACX,MAAM,aAAa,MAAM;IACzB,UAAU;KACV;GAEH,YAAY,CAAC,MAAM,cAClB,oBAAC;IACC,aAAa,EAAE,uCAAuC,EAAC,MAAM,aAAa,MAAM,EAAC,CAAC;IAClF,WAAW;IACX,WAAW;cAEV,EAAE,qCAAqC;KAC1B;MAEjB;;GAGJ,SACC,oBAACE;IAAM,SAAQ;IAAQ,MAAK;cACzB;KACK;GAEV,oBAAC;IAAM,OAAO,EAAE,gCAAgC;cAC9C,oBAAC,cAAW,OAAO,UAAW;KACxB;GACR,oBAAC;IAAM,OAAO,EAAE,8BAA8B;cAC5C,oBAAC;KACC,OAAO,EAAE,8BAA8B;KACvC,WAAW,EAAE,iCAAiC;KAC9C,OAAO,OAAO,KAAK,WAA4B;MAAC,IAAI,MAAM;MAAI,OAAO,MAAM;MAAK,EAAE;MAClF;KACI;GACR,oBAAC;IAAM,OAAO,EAAE,6BAA6B;cAC3C,oBAAC;KACC,OAAO,EAAE,6BAA6B;KACtC,WAAW,EAAE,gCAAgC;KAC7C,OAAO,MAAM,KAAK,UAAkB;MAAC,IAAI;MAAM,OAAO;MAAK,EAAE;MAC7D;KACI;;GACK;;AAInB,+BAAe"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"AgentList.d.ts","sourceRoot":"","sources":["../../../../src/components/admin/AgentList/AgentList.tsx"],"names":[],"mappings":"AAWA,OAAO,EAAC,EAAE,EAAyB,MAAM,OAAO,CAAC;AACjD,OAAsB,EAAC,kBAAkB,EAAC,MAAM,iBAAiB,CAAC;AAMlE,MAAM,MAAM,cAAc,GAAG,IAAI,CAC/B,kBAAkB,EAClB,QAAQ,GAAG,OAAO,GAAG,WAAW,GAAG,QAAQ,GAAG,cAAc,GAAG,UAAU,GAAG,QAAQ,GAAG,cAAc,CACtG,GAAG;IACF;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF;;;;;;;GAOG;AACH,QAAA,MAAM,SAAS,EAAE,EAAE,CAAC,cAAc,CAyCjC,CAAC;AAEF,eAAe,SAAS,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"AgentList.js","names":["AgentList: FC<AgentListProps>","useTranslation","attributes: SelectOption[]","endpoint: ManagementEndpoint","useManagementEndpoint","filter: string | undefined","useResourceQuery","BaseAgentList"],"sources":["../../../../src/components/admin/AgentList/AgentList.tsx"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n AgentListResponse,\n AgentQueryKeys,\n SelectOption,\n getAgents,\n toEqualityFilter,\n toManagementErrorMessage,\n} from '@thunderid/browser';\nimport {FC, ReactElement, useState} from 'react';\nimport BaseAgentList, {BaseAgentListProps} from './BaseAgentList';\nimport useManagementEndpoint, {ManagementEndpoint} from '../../../hooks/management/useManagementEndpoint';\nimport useResourceQuery, {ResourceQueryResult} from '../../../hooks/management/useResourceQuery';\nimport useTranslation from '../../../hooks/useTranslation';\nimport {AdminSearchValue} from '../shared/AdminSearch';\n\nexport type AgentListProps = Omit<\n BaseAgentListProps,\n 'agents' | 'error' | 'isLoading' | 'offset' | 'onPageChange' | 'onSearch' | 'search' | 'totalResults'\n> & {\n /**\n * Whether to show the search form. Agents are searched by a custom attribute, by default `name`, and\n * the server matches the whole value.\n * @default true\n */\n searchable?: boolean;\n};\n\n/**\n * Lists the agents the signed-in user is allowed to see, a page at a time.\n *\n * @example\n * ```tsx\n * <AgentList onSelect={(agent) => setSelectedAgentId(agent.id)} />\n * ```\n */\nconst AgentList: FC<AgentListProps> = ({\n limit = 20,\n preferences,\n searchable = true,\n searchAttributes,\n ...rest\n}: AgentListProps): ReactElement => {\n const {t} = useTranslation(preferences?.i18n);\n const [offset, setOffset] = useState<number>(0);\n const [search, setSearch] = useState<AdminSearchValue | null>(null);\n const attributes: SelectOption[] = searchAttributes ?? [{label: t('admin.agents.list.search.name'), value: 'name'}];\n const endpoint: ManagementEndpoint = useManagementEndpoint('agents');\n const filter: string | undefined = search ? toEqualityFilter(search.attribute, search.value) : undefined;\n const {data, error, isLoading}: ResourceQueryResult<AgentListResponse> = useResourceQuery(\n [AgentQueryKeys.AGENTS, {filter, limit, offset}],\n (fetcher) => getAgents({...endpoint, fetcher, filter, limit, offset}),\n );\n\n return (\n <BaseAgentList\n agents={data?.agents ?? []}\n totalResults={data?.totalResults}\n isLoading={isLoading}\n error={toManagementErrorMessage(t, error, 'admin.agents.list.error')}\n limit={limit}\n offset={offset}\n onPageChange={setOffset}\n search={search}\n searchAttributes={attributes}\n onSearch={\n searchable\n ? (next: AdminSearchValue | null): void => {\n setSearch(next);\n setOffset(0);\n }\n : undefined\n }\n preferences={preferences}\n {...rest}\n />\n );\n};\n\nexport default AgentList;\n"],"mappings":";;;;;;;;;;;;;;;;;AAsCA,MAAMA,aAAiC,EACrC,QAAQ,IACR,aACA,aAAa,MACb,iBACA,GAAG,WAC+B;CAClC,MAAM,EAAC,MAAKC,uBAAe,aAAa,KAAK;CAC7C,MAAM,CAAC,QAAQ,aAAa,SAAiB,EAAE;CAC/C,MAAM,CAAC,QAAQ,aAAa,SAAkC,KAAK;CACnE,MAAMC,aAA6B,oBAAoB,CAAC;EAAC,OAAO,EAAE,gCAAgC;EAAE,OAAO;EAAO,CAAC;CACnH,MAAMC,WAA+BC,8BAAsB,SAAS;CACpE,MAAMC,SAA6B,SAAS,iBAAiB,OAAO,WAAW,OAAO,MAAM,GAAG;CAC/F,MAAM,EAAC,MAAM,OAAO,cAAqDC,yBACvE,CAAC,eAAe,QAAQ;EAAC;EAAQ;EAAO;EAAO,CAAC,GAC/C,YAAY,UAAU;EAAC,GAAG;EAAU;EAAS;EAAQ;EAAO;EAAO,CAAC,CACtE;AAED,QACE,oBAACC;EACC,QAAQ,MAAM,UAAU,EAAE;EAC1B,cAAc,MAAM;EACT;EACX,OAAO,yBAAyB,GAAG,OAAO,0BAA0B;EAC7D;EACC;EACR,cAAc;EACN;EACR,kBAAkB;EAClB,UACE,cACK,SAAwC;AACvC,aAAU,KAAK;AACf,aAAU,EAAE;MAEd;EAEO;EACb,GAAI;GACJ;;AAIN,wBAAe"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"BaseAgentList.d.ts","sourceRoot":"","sources":["../../../../src/components/admin/AgentList/BaseAgentList.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAC,UAAU,EAAE,WAAW,EAAE,YAAY,EAAe,MAAM,oBAAoB,CAAC;AACvF,OAAO,EAAC,EAAE,EAAgB,SAAS,EAAC,MAAM,OAAO,CAAC;AAGlD,OAAO,EAAC,oBAAoB,EAAC,MAAM,gCAAgC,CAAC;AACpE,OAAoB,EAAC,gBAAgB,EAAC,MAAM,uBAAuB,CAAC;AAGpE;;GAEG;AACH,MAAM,MAAM,wBAAwB,GAAG,oBAAoB,CAAC,UAAU,CAAC,GAAG;IAAC,MAAM,EAAE,UAAU,EAAE,CAAA;CAAC,CAAC;AAEjG,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,wBAAwB,KAAK,SAAS,CAAC;IAC1D,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,KAAK,IAAI,CAAC;IACrD;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IACvC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B;;OAEG;IACH,MAAM,CAAC,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACjC;;OAEG;IACH,gBAAgB,CAAC,EAAE,YAAY,EAAE,CAAC;IAClC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,QAAA,MAAM,aAAa,EAAE,EAAE,CAAC,kBAAkB,CA4FzC,CAAC;AAEF,eAAe,aAAa,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"BaseAgentList.js","names":["BaseAgentList: FC<BaseAgentListProps>","useTranslation","columns: DataTableColumn<BasicAgent>[]","AdminSection","AdminSearch","DataTable"],"sources":["../../../../src/components/admin/AgentList/BaseAgentList.tsx"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {BasicAgent, Preferences, SelectOption, getAgentName} from '@thunderid/browser';\nimport {FC, ReactElement, ReactNode} from 'react';\nimport useTranslation from '../../../hooks/useTranslation';\nimport DataTable, {DataTableColumn} from '../../primitives/DataTable/DataTable';\nimport {AdminListRenderProps} from '../shared/AdminListRenderProps';\nimport AdminSearch, {AdminSearchValue} from '../shared/AdminSearch';\nimport AdminSection from '../shared/AdminSection';\n\n/**\n * What {@link BaseAgentList} hands its `children` render function. `agents` and `rows` are the same array.\n */\nexport type BaseAgentListRenderProps = AdminListRenderProps<BasicAgent> & {agents: BasicAgent[]};\n\nexport interface BaseAgentListProps {\n /**\n * Controls rendered next to the title, such as a button that opens `AgentCreate`.\n */\n actions?: ReactNode;\n className?: string;\n description?: string;\n agents: BasicAgent[];\n /**\n * Renders custom UI in place of the default table, for example a third-party data grid. Receives\n * the agents, the default columns, the loading and error state, and the pagination and selection\n * handlers.\n */\n children?: (props: BaseAgentListRenderProps) => ReactNode;\n error?: string | null;\n isLoading?: boolean;\n /**\n * Page size.\n * @default 20\n */\n limit?: number;\n offset?: number;\n /**\n * Called with the offset of the page to show. Pagination is hidden when omitted.\n */\n onPageChange?: (offset: number) => void;\n /**\n * Applies a search on the server, or clears it with `null`. The search form shows only when this and\n * `searchAttributes` are set.\n */\n onSearch?: (search: AdminSearchValue | null) => void;\n /**\n * Called when an agent is chosen. Rows are selectable only when set.\n */\n onSelect?: (agent: BasicAgent) => void;\n preferences?: Preferences;\n /**\n * The search currently applied, if any. While set, an empty page says nothing matched.\n */\n search?: AdminSearchValue | null;\n /**\n * The agent attributes that can be searched, with translated labels.\n */\n searchAttributes?: SelectOption[];\n selectedAgentId?: string;\n /**\n * Heading of the list. Pass an empty string to hide it.\n */\n title?: string;\n totalResults?: number;\n}\n\n/**\n * Lists agents with their type, client and organization unit. Holds no data of its own: pass the\n * page of agents and handle selection and pagination.\n */\nconst BaseAgentList: FC<BaseAgentListProps> = ({\n actions,\n agents,\n children,\n className,\n description,\n error = null,\n isLoading = false,\n limit = 20,\n offset = 0,\n onPageChange,\n onSearch,\n onSelect,\n preferences,\n search = null,\n searchAttributes,\n selectedAgentId,\n title,\n totalResults,\n}: BaseAgentListProps): ReactElement => {\n const {t} = useTranslation(preferences?.i18n);\n\n const columns: DataTableColumn<BasicAgent>[] = [\n {\n header: t('admin.agents.list.columns.name'),\n id: 'name',\n render: (agent: BasicAgent): ReactNode => getAgentName(agent),\n },\n {header: t('admin.agents.list.columns.type'), id: 'type', render: (agent: BasicAgent): ReactNode => agent.type},\n {\n header: t('admin.agents.list.columns.client_id'),\n id: 'clientId',\n render: (agent: BasicAgent): ReactNode => <code>{agent.clientId ?? ''}</code>,\n },\n {\n header: t('admin.common.columns.organization_unit'),\n id: 'ou',\n render: (agent: BasicAgent): ReactNode => agent.ouHandle ?? agent.ouId,\n },\n ];\n\n if (children) {\n return (\n <div className={className}>\n {children({\n columns,\n error,\n isLoading,\n limit,\n offset,\n onPageChange,\n onSelect,\n onSearch,\n rows: agents,\n search,\n searchAttributes,\n selectedRowId: selectedAgentId,\n totalResults: totalResults ?? agents.length,\n agents,\n })}\n </div>\n );\n }\n\n return (\n <AdminSection\n block=\"agent-list\"\n className={className}\n title={title ?? t('admin.agents.list.title')}\n description={description}\n actions={actions}\n preferences={preferences}\n >\n {onSearch && searchAttributes?.length ? (\n <AdminSearch attributes={searchAttributes} search={search} onSearch={onSearch} />\n ) : null}\n <DataTable\n caption={title?.length ? title : t('admin.agents.list.title')}\n columns={columns}\n rows={agents}\n getRowId={(agent: BasicAgent): string => agent.id}\n isLoading={isLoading}\n error={error}\n emptyText={search ? t('admin.common.search.no_results', {value: search.value}) : t('admin.agents.list.empty')}\n onRowClick={onSelect}\n selectedRowId={selectedAgentId}\n pagination={\n onPageChange ? {limit, offset, onChange: onPageChange, total: totalResults ?? agents.length} : undefined\n }\n />\n </AdminSection>\n );\n};\n\nexport default BaseAgentList;\n"],"mappings":";;;;;;;;;;;;AAwEA,MAAMA,iBAAyC,EAC7C,SACA,QACA,UACA,WACA,aACA,QAAQ,MACR,YAAY,OACZ,QAAQ,IACR,SAAS,GACT,cACA,UACA,UACA,aACA,SAAS,MACT,kBACA,iBACA,OACA,mBACsC;CACtC,MAAM,EAAC,MAAKC,uBAAe,aAAa,KAAK;CAE7C,MAAMC,UAAyC;EAC7C;GACE,QAAQ,EAAE,iCAAiC;GAC3C,IAAI;GACJ,SAAS,UAAiC,aAAa,MAAM;GAC9D;EACD;GAAC,QAAQ,EAAE,iCAAiC;GAAE,IAAI;GAAQ,SAAS,UAAiC,MAAM;GAAK;EAC/G;GACE,QAAQ,EAAE,sCAAsC;GAChD,IAAI;GACJ,SAAS,UAAiC,oBAAC,oBAAM,MAAM,YAAY,KAAU;GAC9E;EACD;GACE,QAAQ,EAAE,yCAAyC;GACnD,IAAI;GACJ,SAAS,UAAiC,MAAM,YAAY,MAAM;GACnE;EACF;AAED,KAAI,SACF,QACE,oBAAC;EAAe;YACb,SAAS;GACR;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA,MAAM;GACN;GACA;GACA,eAAe;GACf,cAAc,gBAAgB,OAAO;GACrC;GACD,CAAC;GACE;AAIV,QACE,qBAACC;EACC,OAAM;EACK;EACX,OAAO,SAAS,EAAE,0BAA0B;EAC/B;EACJ;EACI;aAEZ,YAAY,kBAAkB,SAC7B,oBAACC;GAAY,YAAY;GAA0B;GAAkB;IAAY,GAC/E,MACJ,oBAACC;GACC,SAAS,OAAO,SAAS,QAAQ,EAAE,0BAA0B;GACpD;GACT,MAAM;GACN,WAAW,UAA8B,MAAM;GACpC;GACJ;GACP,WAAW,SAAS,EAAE,kCAAkC,EAAC,OAAO,OAAO,OAAM,CAAC,GAAG,EAAE,0BAA0B;GAC7G,YAAY;GACZ,eAAe;GACf,YACE,eAAe;IAAC;IAAO;IAAQ,UAAU;IAAc,OAAO,gBAAgB,OAAO;IAAO,GAAG;IAEjG;GACW;;AAInB,4BAAe"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ApplicationCreate.d.ts","sourceRoot":"","sources":["../../../../src/components/admin/ApplicationCreate/ApplicationCreate.tsx"],"names":[],"mappings":"AAGA,OAAO,EACL,WAAW,EAOZ,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAC,EAAE,EAAyB,MAAM,OAAO,CAAC;AACjD,OAA8B,EAA8B,0BAA0B,EAAC,MAAM,yBAAyB,CAAC;AAMvH,MAAM,MAAM,sBAAsB,GAAG,IAAI,CACvC,0BAA0B,EAC1B,cAAc,GAAG,OAAO,GAAG,cAAc,GAAG,iBAAiB,GAAG,UAAU,CAC3E,GAAG;IACF;;;OAGG;IACH,SAAS,CAAC,EAAE,CAAC,WAAW,EAAE,WAAW,KAAK,IAAI,CAAC;IAC/C;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,QAAA,MAAM,iBAAiB,EAAE,EAAE,CAAC,sBAAsB,CAyDjD,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ApplicationCreate.js","names":["ApplicationCreate: FC<ApplicationCreateProps>","useTranslation","resolvedOuId: string | undefined","useDefaultOuId","endpoint: ManagementEndpoint","useManagementEndpoint","useResourceMutation","secret: string | undefined","BaseApplicationCreate"],"sources":["../../../../src/components/admin/ApplicationCreate/ApplicationCreate.tsx"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n Application,\n ApplicationQueryKeys,\n createApplication,\n CreateApplicationRequest,\n getApplicationClientSecret,\n toCreateApplicationRequest,\n toManagementErrorMessage,\n} from '@thunderid/browser';\nimport {FC, ReactElement, useState} from 'react';\nimport BaseApplicationCreate, {ApplicationCreateSubmission, BaseApplicationCreateProps} from './BaseApplicationCreate';\nimport useManagementEndpoint, {ManagementEndpoint} from '../../../hooks/management/useManagementEndpoint';\nimport useResourceMutation, {ResourceMutationResult} from '../../../hooks/management/useResourceMutation';\nimport useTranslation from '../../../hooks/useTranslation';\nimport useDefaultOuId from '../shared/useDefaultOuId';\n\nexport type ApplicationCreateProps = Omit<\n BaseApplicationCreateProps,\n 'clientSecret' | 'error' | 'isSubmitting' | 'onSecretDismiss' | 'onSubmit'\n> & {\n /**\n * Called with the created application. When the server returned a client secret, it is called once\n * the user has copied the secret, since the secret cannot be read again.\n */\n onCreated?: (application: Application) => void;\n /**\n * Organization unit the application is created in. Defaults to the signed-in user's organization unit.\n */\n ouId?: string;\n};\n\n/**\n * Creates an application with an OAuth client through the management API, and shows its client\n * secret once when the server returns one.\n *\n * The server guards applications with the root `system` permission, for reading and for changes alike;\n * it defines no application-specific permission. Gate the view and its actions on it with\n * `useGrantedPermissions().can('system')`.\n *\n * @example\n * ```tsx\n * <ApplicationCreate onCreated={(application) => navigate(`/applications/${application.id}`)} />\n * ```\n */\nconst ApplicationCreate: FC<ApplicationCreateProps> = ({\n onCreated,\n ouId,\n preferences,\n ...rest\n}: ApplicationCreateProps): ReactElement => {\n const {t} = useTranslation(preferences?.i18n);\n const resolvedOuId: string | undefined = useDefaultOuId(ouId);\n const endpoint: ManagementEndpoint = useManagementEndpoint('applications');\n const [created, setCreated] = useState<{application: Application; secret: string} | null>(null);\n const [formKey, setFormKey] = useState<number>(0);\n const {error, isLoading, mutate}: ResourceMutationResult<Application, CreateApplicationRequest> = useResourceMutation(\n (payload: CreateApplicationRequest, fetcher) => createApplication({...endpoint, fetcher, payload}),\n () => [[ApplicationQueryKeys.APPLICATIONS]],\n {\n onSuccess: (application: Application): void => {\n const secret: string | undefined = getApplicationClientSecret(application);\n\n if (secret) {\n setCreated({application, secret});\n } else {\n onCreated?.(application);\n }\n },\n },\n );\n\n const handleSubmit = (submission: ApplicationCreateSubmission): void => {\n if (resolvedOuId) {\n void mutate(toCreateApplicationRequest(submission, resolvedOuId));\n }\n };\n\n const handleSecretDismiss = (): void => {\n if (created) {\n setCreated(null);\n setFormKey((key: number) => key + 1);\n onCreated?.(created.application);\n }\n };\n\n return (\n <BaseApplicationCreate\n key={formKey}\n onSubmit={handleSubmit}\n isSubmitting={isLoading}\n clientSecret={created?.secret ?? null}\n onSecretDismiss={handleSecretDismiss}\n error={\n resolvedOuId\n ? toManagementErrorMessage(t, error, 'admin.applications.create.error')\n : t('admin.common.errors.no_ou')\n }\n preferences={preferences}\n {...rest}\n />\n );\n};\n\nexport default ApplicationCreate;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AA+CA,MAAMA,qBAAiD,EACrD,WACA,MACA,YACA,GAAG,WACuC;CAC1C,MAAM,EAAC,MAAKC,uBAAe,aAAa,KAAK;CAC7C,MAAMC,eAAmCC,uBAAe,KAAK;CAC7D,MAAMC,WAA+BC,8BAAsB,eAAe;CAC1E,MAAM,CAAC,SAAS,cAAc,SAA4D,KAAK;CAC/F,MAAM,CAAC,SAAS,cAAc,SAAiB,EAAE;CACjD,MAAM,EAAC,OAAO,WAAW,WAAyEC,6BAC/F,SAAmC,YAAY,kBAAkB;EAAC,GAAG;EAAU;EAAS;EAAQ,CAAC,QAC5F,CAAC,CAAC,qBAAqB,aAAa,CAAC,EAC3C,EACE,YAAY,gBAAmC;EAC7C,MAAMC,SAA6B,2BAA2B,YAAY;AAE1E,MAAI,OACF,YAAW;GAAC;GAAa;GAAO,CAAC;MAEjC,aAAY,YAAY;IAG7B,CACF;CAED,MAAM,gBAAgB,eAAkD;AACtE,MAAI,aACF,CAAK,OAAO,2BAA2B,YAAY,aAAa,CAAC;;CAIrE,MAAM,4BAAkC;AACtC,MAAI,SAAS;AACX,cAAW,KAAK;AAChB,eAAY,QAAgB,MAAM,EAAE;AACpC,eAAY,QAAQ,YAAY;;;AAIpC,QACE,oBAACC;EAEC,UAAU;EACV,cAAc;EACd,cAAc,SAAS,UAAU;EACjC,iBAAiB;EACjB,OACE,eACI,yBAAyB,GAAG,OAAO,kCAAkC,GACrE,EAAE,4BAA4B;EAEvB;EACb,GAAI;IAXC,QAYL;;AAIN,gCAAe"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"BaseApplicationCreate.d.ts","sourceRoot":"","sources":["../../../../src/components/admin/ApplicationCreate/BaseApplicationCreate.tsx"],"names":[],"mappings":"AAGA,OAAO,EAEL,qBAAqB,EAIrB,WAAW,EACX,YAAY,EACb,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAC,EAAE,EAA2B,SAAS,EAAW,MAAM,OAAO,CAAC;AAOvE,OAA8B,EAAC,qBAAqB,EAAE,oBAAoB,EAAC,MAAM,iCAAiC,CAAC;AAGnH;;GAEG;AACH,MAAM,MAAM,2BAA2B,GAAG,qBAAqB,CAAC;AAEhE;;GAEG;AACH,MAAM,WAAW,gCAAgC;IAC/C;;OAEG;IACH,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB;;OAEG;IACH,gBAAgB,EAAE,YAAY,EAAE,CAAC;IACjC;;OAEG;IACH,sBAAsB,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACvD;;OAEG;IACH,iBAAiB,EAAE,CAAC,KAAK,EAAE,oBAAoB,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxE;;OAEG;IACH,wBAAwB,EAAE,CAAC,YAAY,EAAE,OAAO,KAAK,IAAI,CAAC;IAC1D;;OAEG;IACH,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,YAAY,EAAE,OAAO,CAAC;IACtB;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;IAC7B,MAAM,EAAE,qBAAqB,CAAC;CAC/B;AAED,MAAM,WAAW,0BAA0B;IACzC;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,gCAAgC,KAAK,SAAS,CAAC;IAClE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;IAC7B,QAAQ,EAAE,CAAC,WAAW,EAAE,2BAA2B,KAAK,IAAI,CAAC;IAC7D,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,QAAA,MAAM,qBAAqB,EAAE,EAAE,CAAC,0BAA0B,CAqHzD,CAAC;AAEF,eAAe,qBAAqB,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"BaseApplicationCreate.js","names":["BaseApplicationCreate: FC<BaseApplicationCreateProps>","useTheme","styles: Record<string, string>","useStyles","useTranslation","submission: ApplicationCreateSubmission","isValid: boolean","AdminSection","ClientSecretNotice","Alert","ApplicationFormFields","Button"],"sources":["../../../../src/components/admin/ApplicationCreate/BaseApplicationCreate.tsx"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n APPLICATION_GRANT_TYPES,\n ApplicationSubmission,\n DEFAULT_APPLICATION_GRANT_TYPES,\n isApplicationSubmissionValid,\n parseRedirectUris,\n Preferences,\n SelectOption,\n} from '@thunderid/browser';\nimport {FC, FormEvent, ReactElement, ReactNode, useState} from 'react';\nimport useTheme from '../../../contexts/Theme/useTheme';\nimport useTranslation from '../../../hooks/useTranslation';\nimport Alert from '../../primitives/Alert/Alert';\nimport Button from '../../primitives/Button/Button';\nimport AdminSection from '../shared/AdminSection';\nimport useStyles from '../shared/AdminSection.styles';\nimport ApplicationFormFields, {ApplicationFormValues, ApplicationTextField} from '../shared/ApplicationFormFields';\nimport ClientSecretNotice from '../shared/ClientSecretNotice';\n\n/**\n * The application {@link BaseApplicationCreate} submits. The organization unit is added by the caller.\n */\nexport type ApplicationCreateSubmission = ApplicationSubmission;\n\n/**\n * What {@link BaseApplicationCreate} hands its `children` render function, so the form can be built with any UI.\n */\nexport interface BaseApplicationCreateRenderProps {\n /**\n * The client secret of the application just created, to show once. `null` while there is none.\n */\n clientSecret: string | null;\n error: string | null;\n /**\n * The grant types to choose from, with translated labels.\n */\n grantTypeOptions: SelectOption[];\n /**\n * Sets the chosen grant types.\n */\n handleGrantTypesChange: (grantTypes: string[]) => void;\n /**\n * Sets one text field of the form. `redirectUris` takes URIs separated by commas.\n */\n handleInputChange: (field: ApplicationTextField, value: string) => void;\n /**\n * Sets whether the client is public.\n */\n handlePublicClientChange: (publicClient: boolean) => void;\n /**\n * Submits the current values. Does nothing while they are not valid.\n */\n handleSubmit: () => void;\n isSubmitting: boolean;\n /**\n * Whether the values can be submitted.\n */\n isValid: boolean;\n onCancel?: () => void;\n /**\n * Hides the client secret once it has been copied. Undefined while there is no secret.\n */\n onSecretDismiss?: () => void;\n values: ApplicationFormValues;\n}\n\nexport interface BaseApplicationCreateProps {\n /**\n * Renders custom UI in place of the default form. Receives the values, their setters, the grant\n * types, the submit handler, the submission state and the client secret to show.\n */\n children?: (props: BaseApplicationCreateRenderProps) => ReactNode;\n className?: string;\n /**\n * The client secret of the application just created. When set, the form gives way to the secret,\n * which can be read only this once, until `onSecretDismiss` clears it.\n */\n clientSecret?: string | null;\n description?: string;\n error?: string | null;\n isSubmitting?: boolean;\n onCancel?: () => void;\n /**\n * Called when the user has copied the client secret.\n */\n onSecretDismiss?: () => void;\n onSubmit: (application: ApplicationCreateSubmission) => void;\n preferences?: Preferences;\n title?: string;\n}\n\n/**\n * A form that collects a new application's name, description, links and OAuth basics: redirect URIs,\n * grant types and whether the client is public. Holds no data of its own: handle the submission, and\n * pass back the client secret the server returned to show it once.\n */\nconst BaseApplicationCreate: FC<BaseApplicationCreateProps> = ({\n children,\n className,\n clientSecret = null,\n description,\n error = null,\n isSubmitting = false,\n onCancel,\n onSecretDismiss,\n onSubmit,\n preferences,\n title,\n}: BaseApplicationCreateProps): ReactElement => {\n const {theme, colorScheme} = useTheme();\n const styles: Record<string, string> = useStyles(theme, colorScheme);\n const {t} = useTranslation(preferences?.i18n);\n const [values, setValues] = useState<ApplicationFormValues>({\n description: '',\n grantTypes: [...DEFAULT_APPLICATION_GRANT_TYPES],\n logoUrl: '',\n name: '',\n publicClient: false,\n redirectUris: '',\n url: '',\n });\n\n const submission: ApplicationCreateSubmission = {\n description: values.description.trim() || undefined,\n grantTypes: values.grantTypes,\n logoUrl: values.logoUrl.trim() || undefined,\n name: values.name.trim(),\n publicClient: values.publicClient,\n redirectUris: parseRedirectUris(values.redirectUris),\n url: values.url.trim() || undefined,\n };\n const isValid: boolean = isApplicationSubmissionValid(submission);\n\n const setInput = (field: ApplicationTextField, value: string): void =>\n setValues((previous: ApplicationFormValues) => ({...previous, [field]: value}));\n const setGrantTypes = (grantTypes: string[]): void =>\n setValues((previous: ApplicationFormValues) => ({...previous, grantTypes}));\n const setPublicClient = (publicClient: boolean): void =>\n setValues((previous: ApplicationFormValues) => ({...previous, publicClient}));\n\n const submit = (): void => {\n if (isValid && !isSubmitting) {\n onSubmit(submission);\n }\n };\n\n const handleSubmit = (event: FormEvent<HTMLFormElement>): void => {\n event.preventDefault();\n submit();\n };\n\n if (children) {\n return (\n <div className={className}>\n {children({\n clientSecret,\n error,\n grantTypeOptions: APPLICATION_GRANT_TYPES.map((grantType: string) => ({\n label: t(`admin.applications.grant_types.${grantType}`),\n value: grantType,\n })),\n handleGrantTypesChange: setGrantTypes,\n handleInputChange: setInput,\n handlePublicClientChange: setPublicClient,\n handleSubmit: submit,\n isSubmitting,\n isValid,\n onCancel,\n onSecretDismiss: clientSecret ? onSecretDismiss : undefined,\n values,\n })}\n </div>\n );\n }\n\n return (\n <AdminSection\n block=\"application-create\"\n className={className}\n title={title ?? t('admin.applications.create.title')}\n description={description}\n preferences={preferences}\n >\n {clientSecret ? (\n <ClientSecretNotice secret={clientSecret} onDismiss={onSecretDismiss} preferences={preferences} />\n ) : (\n <form className={styles['form']} onSubmit={handleSubmit} noValidate>\n {error && (\n <Alert variant=\"error\" role=\"alert\">\n {error}\n </Alert>\n )}\n <ApplicationFormFields\n preferences={preferences}\n values={values}\n onInputChange={setInput}\n onGrantTypesChange={setGrantTypes}\n onPublicClientChange={setPublicClient}\n />\n <div className={styles['formActions']}>\n {onCancel && (\n <Button type=\"button\" variant=\"text\" onClick={onCancel} disabled={isSubmitting}>\n {t('admin.common.actions.cancel')}\n </Button>\n )}\n <Button type=\"submit\" loading={isSubmitting} disabled={!isValid || isSubmitting}>\n {t('admin.applications.create.submit')}\n </Button>\n </div>\n </form>\n )}\n </AdminSection>\n );\n};\n\nexport default BaseApplicationCreate;\n"],"mappings":";;;;;;;;;;;;;;;;;;AAmGA,MAAMA,yBAAyD,EAC7D,UACA,WACA,eAAe,MACf,aACA,QAAQ,MACR,eAAe,OACf,UACA,iBACA,UACA,aACA,YAC8C;CAC9C,MAAM,EAAC,OAAO,gBAAeC,kBAAU;CACvC,MAAMC,SAAiCC,4BAAU,OAAO,YAAY;CACpE,MAAM,EAAC,MAAKC,uBAAe,aAAa,KAAK;CAC7C,MAAM,CAAC,QAAQ,aAAa,SAAgC;EAC1D,aAAa;EACb,YAAY,CAAC,GAAG,gCAAgC;EAChD,SAAS;EACT,MAAM;EACN,cAAc;EACd,cAAc;EACd,KAAK;EACN,CAAC;CAEF,MAAMC,aAA0C;EAC9C,aAAa,OAAO,YAAY,MAAM,IAAI;EAC1C,YAAY,OAAO;EACnB,SAAS,OAAO,QAAQ,MAAM,IAAI;EAClC,MAAM,OAAO,KAAK,MAAM;EACxB,cAAc,OAAO;EACrB,cAAc,kBAAkB,OAAO,aAAa;EACpD,KAAK,OAAO,IAAI,MAAM,IAAI;EAC3B;CACD,MAAMC,UAAmB,6BAA6B,WAAW;CAEjE,MAAM,YAAY,OAA6B,UAC7C,WAAW,cAAqC;EAAC,GAAG;GAAW,QAAQ;EAAM,EAAE;CACjF,MAAM,iBAAiB,eACrB,WAAW,cAAqC;EAAC,GAAG;EAAU;EAAW,EAAE;CAC7E,MAAM,mBAAmB,iBACvB,WAAW,cAAqC;EAAC,GAAG;EAAU;EAAa,EAAE;CAE/E,MAAM,eAAqB;AACzB,MAAI,WAAW,CAAC,aACd,UAAS,WAAW;;CAIxB,MAAM,gBAAgB,UAA4C;AAChE,QAAM,gBAAgB;AACtB,UAAQ;;AAGV,KAAI,SACF,QACE,oBAAC;EAAe;YACb,SAAS;GACR;GACA;GACA,kBAAkB,wBAAwB,KAAK,eAAuB;IACpE,OAAO,EAAE,kCAAkC,YAAY;IACvD,OAAO;IACR,EAAE;GACH,wBAAwB;GACxB,mBAAmB;GACnB,0BAA0B;GAC1B,cAAc;GACd;GACA;GACA;GACA,iBAAiB,eAAe,kBAAkB;GAClD;GACD,CAAC;GACE;AAIV,QACE,oBAACC;EACC,OAAM;EACK;EACX,OAAO,SAAS,EAAE,kCAAkC;EACvC;EACA;YAEZ,eACC,oBAACC;GAAmB,QAAQ;GAAc,WAAW;GAA8B;IAAe,GAElG,qBAAC;GAAK,WAAW,OAAO;GAAS,UAAU;GAAc;;IACtD,SACC,oBAACC;KAAM,SAAQ;KAAQ,MAAK;eACzB;MACK;IAEV,oBAACC;KACc;KACL;KACR,eAAe;KACf,oBAAoB;KACpB,sBAAsB;MACtB;IACF,qBAAC;KAAI,WAAW,OAAO;gBACpB,YACC,oBAACC;MAAO,MAAK;MAAS,SAAQ;MAAO,SAAS;MAAU,UAAU;gBAC/D,EAAE,8BAA8B;OAC1B,EAEX,oBAACA;MAAO,MAAK;MAAS,SAAS;MAAc,UAAU,CAAC,WAAW;gBAChE,EAAE,mCAAmC;OAC/B;MACL;;IACD;GAEI;;AAInB,oCAAe"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ApplicationDetails.d.ts","sourceRoot":"","sources":["../../../../src/components/admin/ApplicationDetails/ApplicationDetails.tsx"],"names":[],"mappings":"AAGA,OAAO,EACL,kBAAkB,EAUnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAC,EAAE,EAAe,MAAM,OAAO,CAAC;AACvC,OAA+B,EAE7B,2BAA2B,EAC5B,MAAM,0BAA0B,CAAC;AAYlC,MAAM,MAAM,uBAAuB,GAAG,IAAI,CACxC,2BAA2B,EACzB,aAAa,GACb,cAAc,GACd,OAAO,GACP,YAAY,GACZ,WAAW,GACX,sBAAsB,GACtB,0BAA0B,GAC1B,YAAY,GACZ,kBAAkB,GAClB,UAAU,GACV,mBAAmB,GACnB,oBAAoB,GACpB,iBAAiB,GACjB,UAAU,CACb,GAAG;IACF;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC,aAAa,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,QAAA,MAAM,kBAAkB,EAAE,EAAE,CAAC,uBAAuB,CAiFnD,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ApplicationDetails.js","names":["ApplicationDetails: FC<ApplicationDetailsProps>","useTranslation","endpoint: ManagementEndpoint","useManagementEndpoint","application: ResourceQueryResult<Application>","useResourceQuery","deletion: ResourceMutationResult<void, string>","useResourceMutation","update: ResourceMutationResult<Application, UpdateApplicationVariables>","regeneration: ResourceMutationResult<RegenerateClientSecretResult, string>","lifecycle: AccountLifecycleState","useAccountLifecycle","BaseApplicationDetails"],"sources":["../../../../src/components/admin/ApplicationDetails/ApplicationDetails.tsx"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n AdministrationMode,\n Application,\n ApplicationQueryKeys,\n deleteApplication,\n getApplication,\n regenerateClientSecret,\n RegenerateClientSecretResult,\n toManagementErrorMessage,\n toUpdateApplicationRequest,\n updateApplication,\n} from '@thunderid/browser';\nimport {FC, ReactElement} from 'react';\nimport BaseApplicationDetails, {\n ApplicationUpdateSubmission,\n BaseApplicationDetailsProps,\n} from './BaseApplicationDetails';\nimport useAccountLifecycle, {AccountLifecycleState} from '../../../hooks/management/useAccountLifecycle';\nimport useManagementEndpoint, {ManagementEndpoint} from '../../../hooks/management/useManagementEndpoint';\nimport useResourceMutation, {ResourceMutationResult} from '../../../hooks/management/useResourceMutation';\nimport useResourceQuery, {ResourceQueryResult} from '../../../hooks/management/useResourceQuery';\nimport useTranslation from '../../../hooks/useTranslation';\n\ninterface UpdateApplicationVariables {\n application: Application;\n changes: ApplicationUpdateSubmission;\n}\n\nexport type ApplicationDetailsProps = Omit<\n BaseApplicationDetailsProps,\n | 'application'\n | 'clientSecret'\n | 'error'\n | 'isDeleting'\n | 'isLoading'\n | 'isRegeneratingSecret'\n | 'isRunningLifecycleAction'\n | 'isUpdating'\n | 'lifecycleActions'\n | 'onDelete'\n | 'onLifecycleAction'\n | 'onRegenerateSecret'\n | 'onSecretDismiss'\n | 'onUpdate'\n> & {\n /**\n * How the delete and the client secret regeneration run. `flow` runs the administration flow the server configures for it, which can revoke\n * grants and end sessions first. It needs `baseUrl`.\n * @default 'native'\n */\n administrationMode?: AdministrationMode;\n applicationId: string;\n /**\n * Whether the application can be deleted from this view.\n * @default false\n */\n deletable?: boolean;\n /**\n * Whether the application's general fields, redirect URIs and grant types can be edited from this view.\n * @default false\n */\n editable?: boolean;\n /**\n * Whether the application can be suspended and unsuspended from this view. Each action runs through its\n * administration flow and is offered only when the server configures that flow. Reading the configured\n * flows needs a token that may read the server configuration.\n * @default false\n */\n lifecycleActions?: boolean;\n /**\n * Called after the application has been deleted.\n */\n onDeleted?: () => void;\n /**\n * Whether the application's client secret can be regenerated from this view. The new secret is shown\n * once.\n * @default false\n */\n secretRegenerable?: boolean;\n};\n\n/**\n * Shows an application and its OAuth configuration, and optionally lets the signed-in user edit it,\n * regenerate its client secret or delete it.\n *\n * The server guards applications with the root `system` permission, for reading and for changes alike;\n * it defines no application-specific permission. Gate the view and its actions on it with\n * `useGrantedPermissions().can('system')`.\n *\n * @example\n * ```tsx\n * const {can} = useGrantedPermissions();\n * const isAdmin = can('system');\n *\n * <ApplicationDetails\n * applicationId={applicationId}\n * editable={isAdmin}\n * deletable={isAdmin}\n * secretRegenerable={isAdmin}\n * onDeleted={() => navigate('/applications')}\n * />\n * ```\n */\nconst ApplicationDetails: FC<ApplicationDetailsProps> = ({\n administrationMode,\n applicationId,\n deletable = false,\n editable = false,\n lifecycleActions = false,\n onDeleted,\n preferences,\n secretRegenerable = false,\n ...rest\n}: ApplicationDetailsProps): ReactElement => {\n const {t} = useTranslation(preferences?.i18n);\n const endpoint: ManagementEndpoint = useManagementEndpoint('applications');\n const application: ResourceQueryResult<Application> = useResourceQuery(\n [ApplicationQueryKeys.APPLICATION, applicationId],\n (fetcher) => getApplication({...endpoint, applicationId, fetcher}),\n {enabled: Boolean(applicationId)},\n );\n const deletion: ResourceMutationResult<void, string> = useResourceMutation(\n (id: string, fetcher) => deleteApplication({...endpoint, administrationMode, applicationId: id, fetcher}),\n () => [[ApplicationQueryKeys.APPLICATIONS]],\n {onSuccess: onDeleted},\n );\n const update: ResourceMutationResult<Application, UpdateApplicationVariables> = useResourceMutation(\n ({application: current, changes}: UpdateApplicationVariables, fetcher) =>\n updateApplication({\n ...endpoint,\n applicationId: current.id,\n fetcher,\n payload: toUpdateApplicationRequest(current, changes),\n }),\n ({application: current}: UpdateApplicationVariables) => [\n [ApplicationQueryKeys.APPLICATION, current.id],\n [ApplicationQueryKeys.APPLICATIONS],\n ],\n );\n const regeneration: ResourceMutationResult<RegenerateClientSecretResult, string> = useResourceMutation(\n (id: string, fetcher) => regenerateClientSecret({...endpoint, administrationMode, applicationId: id, fetcher}),\n (id: string) => [[ApplicationQueryKeys.APPLICATION, id], [ApplicationQueryKeys.APPLICATIONS]],\n );\n\n const lifecycle: AccountLifecycleState = useAccountLifecycle({\n enabled: lifecycleActions,\n invalidatedKeys: [[ApplicationQueryKeys.APPLICATION, applicationId], [ApplicationQueryKeys.APPLICATIONS]],\n kind: 'application',\n status: application.data?.status?.value,\n subject: applicationId,\n });\n\n return (\n <BaseApplicationDetails\n application={application.data}\n isLoading={application.isLoading}\n error={\n toManagementErrorMessage(t, application.error, 'admin.applications.details.error') ??\n toManagementErrorMessage(t, deletion.error, 'admin.applications.details.delete.error') ??\n toManagementErrorMessage(t, update.error, 'admin.applications.details.edit.error') ??\n toManagementErrorMessage(t, regeneration.error, 'admin.applications.details.secret.error') ??\n toManagementErrorMessage(t, lifecycle.error, 'admin.common.lifecycle.error') ??\n toManagementErrorMessage(t, lifecycle.loadError, 'admin.common.lifecycle.load_error')\n }\n isDeleting={deletion.isLoading}\n onDelete={deletable ? (): void => void deletion.mutate(applicationId) : undefined}\n lifecycleActions={lifecycle.actions}\n isRunningLifecycleAction={lifecycle.isRunning}\n onLifecycleAction={lifecycleActions ? lifecycle.run : undefined}\n isUpdating={update.isLoading}\n onUpdate={\n editable && application.data\n ? (changes: ApplicationUpdateSubmission): void =>\n void update.mutate({application: application.data!, changes})\n : undefined\n }\n isRegeneratingSecret={regeneration.isLoading}\n onRegenerateSecret={secretRegenerable ? (): void => void regeneration.mutate(applicationId) : undefined}\n clientSecret={regeneration.data?.clientSecret ?? null}\n onSecretDismiss={regeneration.reset}\n preferences={preferences}\n {...rest}\n />\n );\n};\n\nexport default ApplicationDetails;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0GA,MAAMA,sBAAmD,EACvD,oBACA,eACA,YAAY,OACZ,WAAW,OACX,mBAAmB,OACnB,WACA,aACA,oBAAoB,MACpB,GAAG,WACwC;CAC3C,MAAM,EAAC,MAAKC,uBAAe,aAAa,KAAK;CAC7C,MAAMC,WAA+BC,8BAAsB,eAAe;CAC1E,MAAMC,cAAgDC,yBACpD,CAAC,qBAAqB,aAAa,cAAc,GAChD,YAAY,eAAe;EAAC,GAAG;EAAU;EAAe;EAAQ,CAAC,EAClE,EAAC,SAAS,QAAQ,cAAc,EAAC,CAClC;CACD,MAAMC,WAAiDC,6BACpD,IAAY,YAAY,kBAAkB;EAAC,GAAG;EAAU;EAAoB,eAAe;EAAI;EAAQ,CAAC,QACnG,CAAC,CAAC,qBAAqB,aAAa,CAAC,EAC3C,EAAC,WAAW,WAAU,CACvB;CACD,MAAMC,SAA0ED,6BAC7E,EAAC,aAAa,SAAS,WAAsC,YAC5D,kBAAkB;EAChB,GAAG;EACH,eAAe,QAAQ;EACvB;EACA,SAAS,2BAA2B,SAAS,QAAQ;EACtD,CAAC,GACH,EAAC,aAAa,cAAyC,CACtD,CAAC,qBAAqB,aAAa,QAAQ,GAAG,EAC9C,CAAC,qBAAqB,aAAa,CACpC,CACF;CACD,MAAME,eAA6EF,6BAChF,IAAY,YAAY,uBAAuB;EAAC,GAAG;EAAU;EAAoB,eAAe;EAAI;EAAQ,CAAC,GAC7G,OAAe,CAAC,CAAC,qBAAqB,aAAa,GAAG,EAAE,CAAC,qBAAqB,aAAa,CAAC,CAC9F;CAED,MAAMG,YAAmCC,4BAAoB;EAC3D,SAAS;EACT,iBAAiB,CAAC,CAAC,qBAAqB,aAAa,cAAc,EAAE,CAAC,qBAAqB,aAAa,CAAC;EACzG,MAAM;EACN,QAAQ,YAAY,MAAM,QAAQ;EAClC,SAAS;EACV,CAAC;AAEF,QACE,oBAACC;EACC,aAAa,YAAY;EACzB,WAAW,YAAY;EACvB,OACE,yBAAyB,GAAG,YAAY,OAAO,mCAAmC,IAClF,yBAAyB,GAAG,SAAS,OAAO,0CAA0C,IACtF,yBAAyB,GAAG,OAAO,OAAO,wCAAwC,IAClF,yBAAyB,GAAG,aAAa,OAAO,0CAA0C,IAC1F,yBAAyB,GAAG,UAAU,OAAO,+BAA+B,IAC5E,yBAAyB,GAAG,UAAU,WAAW,oCAAoC;EAEvF,YAAY,SAAS;EACrB,UAAU,kBAAwB,KAAK,SAAS,OAAO,cAAc,GAAG;EACxE,kBAAkB,UAAU;EAC5B,0BAA0B,UAAU;EACpC,mBAAmB,mBAAmB,UAAU,MAAM;EACtD,YAAY,OAAO;EACnB,UACE,YAAY,YAAY,QACnB,YACC,KAAK,OAAO,OAAO;GAAC,aAAa,YAAY;GAAO;GAAQ,CAAC,GAC/D;EAEN,sBAAsB,aAAa;EACnC,oBAAoB,0BAAgC,KAAK,aAAa,OAAO,cAAc,GAAG;EAC9F,cAAc,aAAa,MAAM,gBAAgB;EACjD,iBAAiB,aAAa;EACjB;EACb,GAAI;GACJ;;AAIN,iCAAe"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"BaseApplicationDetails.d.ts","sourceRoot":"","sources":["../../../../src/components/admin/ApplicationDetails/BaseApplicationDetails.tsx"],"names":[],"mappings":"AAGA,OAAO,EACL,sBAAsB,EACtB,WAAW,EAEX,qBAAqB,EAGrB,YAAY,EAEZ,WAAW,EACZ,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAC,EAAE,EAA2B,SAAS,EAAW,MAAM,OAAO,CAAC;AAavE;;;GAGG;AACH,MAAM,MAAM,2BAA2B,GAAG,IAAI,CAAC,qBAAqB,EAAE,cAAc,CAAC,CAAC;AAEtF;;;GAGG;AACH,MAAM,WAAW,iCAAiC;IAChD,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B;;OAEG;IACH,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,wBAAwB,EAAE,OAAO,CAAC;IAClC,UAAU,EAAE,OAAO,CAAC;IACpB;;OAEG;IACH,gBAAgB,EAAE,sBAAsB,EAAE,CAAC;IAC3C;;OAEG;IACH,KAAK,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,cAAc,CAAC,CAAC;IAC3C;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB;;OAEG;IACH,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,sBAAsB,EAAE,YAAY,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACpF;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAC;IAChC;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;IAC7B;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,WAAW,EAAE,2BAA2B,KAAK,IAAI,CAAC;CAC/D;AAED,MAAM,WAAW,2BAA2B;IAC1C;;OAEG;IACH,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,iCAAiC,KAAK,SAAS,CAAC;IACnE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,sBAAsB,EAAE,CAAC;IAC5C;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB;;OAEG;IACH,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,sBAAsB,EAAE,YAAY,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACpF;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAC;IAChC;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,IAAI,CAAC;IAC7B;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,WAAW,EAAE,2BAA2B,KAAK,IAAI,CAAC;IAC9D,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAsBD;;;;GAIG;AACH,QAAA,MAAM,sBAAsB,EAAE,EAAE,CAAC,2BAA2B,CAgQ3D,CAAC;AAEF,eAAe,sBAAsB,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"BaseApplicationDetails.js","names":["BaseApplicationDetails: FC<BaseApplicationDetailsProps>","useTranslation","styles: Record<string, string>","useAdminPartStyles","oauthConfig: OAuth2Config | undefined","isWritable: boolean","canRegenerate: boolean","oauth: Omit<OAuth2Config, 'clientSecret'> | undefined","AdminSection","Spinner","Alert","notSet: string","overview: DetailListItem[]","CopyableText","ApplicationFormFields","Button","ClientSecretNotice"],"sources":["../../../../src/components/admin/ApplicationDetails/BaseApplicationDetails.tsx"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n AccountLifecycleAction,\n Application,\n APPLICATION_GRANT_TYPES,\n ApplicationSubmission,\n getApplicationOAuthConfig,\n isApplicationSubmissionValid,\n OAuth2Config,\n parseRedirectUris,\n Preferences,\n} from '@thunderid/browser';\nimport {FC, FormEvent, ReactElement, ReactNode, useState} from 'react';\nimport useTranslation from '../../../hooks/useTranslation';\nimport Alert from '../../primitives/Alert/Alert';\nimport Button from '../../primitives/Button/Button';\nimport CopyableText from '../../primitives/CopyableText/CopyableText';\nimport Spinner from '../../primitives/Spinner/Spinner';\nimport {AccessStatusBadge, AccountLifecycleButtons} from '../shared/AccountLifecycleParts';\nimport {ChipList, ConfirmButton, DetailList, DetailListItem, Panel} from '../shared/AdminParts';\nimport AdminSection from '../shared/AdminSection';\nimport ApplicationFormFields, {ApplicationFormValues, ApplicationTextField} from '../shared/ApplicationFormFields';\nimport ClientSecretNotice from '../shared/ClientSecretNotice';\nimport useAdminPartStyles from '../shared/useAdminPartStyles';\n\n/**\n * The edited fields {@link BaseApplicationDetails} hands `onUpdate`. Whether the client is public does\n * not change.\n */\nexport type ApplicationUpdateSubmission = Omit<ApplicationSubmission, 'publicClient'>;\n\n/**\n * What {@link BaseApplicationDetails} hands its `children` render function, so the application can be\n * shown with any UI.\n */\nexport interface BaseApplicationDetailsRenderProps {\n application?: Application;\n /**\n * The new client secret, to show once. `null` while there is none.\n */\n clientSecret: string | null;\n error: string | null;\n isDeleting: boolean;\n isLoading: boolean;\n isRegeneratingSecret: boolean;\n isRunningLifecycleAction: boolean;\n isUpdating: boolean;\n /**\n * The account lifecycle actions offered for the application. Empty when none is allowed.\n */\n lifecycleActions: AccountLifecycleAction[];\n /**\n * The application's OAuth configuration, without its client secret. Undefined when it has no OAuth client.\n */\n oauth?: Omit<OAuth2Config, 'clientSecret'>;\n /**\n * Deletes the application. Undefined when deletion is not allowed, including for read-only applications.\n */\n onDelete?: () => void;\n /**\n * Runs an account lifecycle action. Undefined when none is allowed.\n */\n onLifecycleAction?: (action: AccountLifecycleAction, operatorNote?: string) => void;\n /**\n * Gives the application a new client secret. Undefined when not allowed, for read-only applications\n * and for applications without a confidential OAuth client.\n */\n onRegenerateSecret?: () => void;\n /**\n * Hides the new client secret once it has been copied. Undefined while there is no secret.\n */\n onSecretDismiss?: () => void;\n /**\n * Saves edited fields. Undefined when editing is not allowed, including for read-only applications.\n */\n onUpdate?: (application: ApplicationUpdateSubmission) => void;\n}\n\nexport interface BaseApplicationDetailsProps {\n /**\n * Controls rendered next to the application's name.\n */\n actions?: ReactNode;\n application?: Application;\n /**\n * Renders custom UI in place of the default view. Receives the application, its OAuth configuration,\n * the loading and error state, the actions the app allows and the new client secret to show.\n */\n children?: (props: BaseApplicationDetailsRenderProps) => ReactNode;\n className?: string;\n /**\n * A client secret just generated by `onRegenerateSecret`, shown once until `onSecretDismiss` clears it.\n */\n clientSecret?: string | null;\n error?: string | null;\n isDeleting?: boolean;\n isLoading?: boolean;\n isRegeneratingSecret?: boolean;\n isRunningLifecycleAction?: boolean;\n isUpdating?: boolean;\n /**\n * The account lifecycle actions to offer (suspend, unsuspend; applications are never locked), shown only with `onLifecycleAction`. They change\n * only runtime state, so they apply to read-only applications too.\n */\n lifecycleActions?: AccountLifecycleAction[];\n /**\n * Deletes the application. The delete action is hidden when omitted.\n */\n onDelete?: () => void;\n /**\n * Runs an account lifecycle action. Suspending and unsuspending ask for confirmation first.\n */\n onLifecycleAction?: (action: AccountLifecycleAction, operatorNote?: string) => void;\n /**\n * Gives the application a new client secret. The regenerate action is hidden when omitted, and for\n * public clients, which have no secret.\n */\n onRegenerateSecret?: () => void;\n /**\n * Called when the user has copied the new client secret.\n */\n onSecretDismiss?: () => void;\n /**\n * Saves the edited general fields, redirect URIs and grant types. Editing is offered only when set.\n */\n onUpdate?: (application: ApplicationUpdateSubmission) => void;\n preferences?: Preferences;\n}\n\nconst toFormValues = (application: Application, oauth?: OAuth2Config): ApplicationFormValues => ({\n description: application.description ?? '',\n grantTypes: oauth?.grantTypes ?? [],\n logoUrl: application.logoUrl ?? '',\n name: application.name,\n publicClient: Boolean(oauth?.publicClient),\n redirectUris: (oauth?.redirectUris ?? []).join(', '),\n url: application.url ?? '',\n});\n\nconst toSubmission = (values: ApplicationFormValues): ApplicationSubmission => ({\n description: values.description.trim() || undefined,\n grantTypes: values.grantTypes,\n logoUrl: values.logoUrl.trim() || undefined,\n name: values.name.trim(),\n publicClient: values.publicClient,\n redirectUris: parseRedirectUris(values.redirectUris),\n url: values.url.trim() || undefined,\n});\n\n/**\n * Shows an application's general fields and OAuth configuration. Holds no data of its own: pass the\n * application and handle editing, deletion and client secret regeneration, each offered only when its\n * handler is set.\n */\nconst BaseApplicationDetails: FC<BaseApplicationDetailsProps> = ({\n actions,\n application,\n children,\n className,\n clientSecret = null,\n error = null,\n isDeleting = false,\n isLoading = false,\n isRegeneratingSecret = false,\n isRunningLifecycleAction = false,\n isUpdating = false,\n lifecycleActions = [],\n onDelete,\n onLifecycleAction,\n onRegenerateSecret,\n onSecretDismiss,\n onUpdate,\n preferences,\n}: BaseApplicationDetailsProps): ReactElement => {\n const {t} = useTranslation(preferences?.i18n);\n const styles: Record<string, string> = useAdminPartStyles();\n const [draft, setDraft] = useState<ApplicationFormValues | null>(null);\n\n const oauthConfig: OAuth2Config | undefined = getApplicationOAuthConfig(application);\n const isWritable: boolean = Boolean(application) && !application?.isReadOnly;\n const canRegenerate: boolean = isWritable && Boolean(oauthConfig) && !oauthConfig?.publicClient;\n\n if (children) {\n let oauth: Omit<OAuth2Config, 'clientSecret'> | undefined;\n\n if (oauthConfig) {\n const {clientSecret: storedSecret, ...rest}: OAuth2Config = oauthConfig;\n void storedSecret;\n oauth = rest;\n }\n\n return (\n <div className={className}>\n {children({\n application,\n clientSecret,\n error,\n isDeleting,\n isLoading,\n isRegeneratingSecret,\n isRunningLifecycleAction,\n isUpdating,\n lifecycleActions: onLifecycleAction && application ? lifecycleActions : [],\n oauth,\n onDelete: isWritable ? onDelete : undefined,\n onLifecycleAction: application ? onLifecycleAction : undefined,\n onRegenerateSecret: canRegenerate ? onRegenerateSecret : undefined,\n onSecretDismiss: clientSecret ? onSecretDismiss : undefined,\n onUpdate: isWritable ? onUpdate : undefined,\n })}\n </div>\n );\n }\n\n if (isLoading && !application) {\n return (\n <AdminSection block=\"application-details\" className={className} preferences={preferences}>\n <span className={styles['muted']} role=\"status\">\n <Spinner size=\"small\" /> {t('admin.common.loading')}\n </span>\n </AdminSection>\n );\n }\n\n if (!application) {\n return (\n <AdminSection block=\"application-details\" className={className} preferences={preferences}>\n <Alert variant=\"error\" role=\"alert\">\n {error ?? t('admin.common.errors.not_found')}\n </Alert>\n </AdminSection>\n );\n }\n\n const notSet: string = t('admin.applications.details.not_set');\n const overview: DetailListItem[] = [\n {\n label: t('admin.applications.list.columns.client_id'),\n value: oauthConfig?.clientId ? <CopyableText value={oauthConfig.clientId} /> : notSet,\n },\n {label: t('admin.applications.details.type'), value: application.type ?? application.template ?? notSet},\n {label: t('admin.common.columns.organization_unit'), value: application.ouId ?? notSet},\n {label: t('admin.applications.fields.url'), value: application.url ?? notSet},\n {label: t('admin.applications.fields.logo_url'), value: application.logoUrl ?? notSet},\n ];\n\n if (application.status?.value) {\n overview.push({\n label: t('admin.common.columns.status'),\n value: <AccessStatusBadge status={application.status.value} />,\n });\n }\n\n const handleSave = (event: FormEvent<HTMLFormElement>): void => {\n event.preventDefault();\n\n if (!draft) {\n return;\n }\n\n const {publicClient, ...submission}: ApplicationSubmission = toSubmission(draft);\n void publicClient;\n onUpdate?.(submission);\n setDraft(null);\n };\n\n return (\n <AdminSection\n block=\"application-details\"\n className={className}\n title={application.name}\n description={application.description}\n preferences={preferences}\n actions={\n <>\n {actions}\n {onLifecycleAction && (\n <AccountLifecycleButtons\n actions={lifecycleActions}\n isRunning={isRunningLifecycleAction}\n name={application.name}\n onAction={onLifecycleAction}\n />\n )}\n {onDelete && isWritable && (\n <ConfirmButton\n confirmText={t('admin.applications.details.delete.confirm', {name: application.name})}\n isLoading={isDeleting}\n onConfirm={onDelete}\n >\n {t('admin.applications.details.delete.action')}\n </ConfirmButton>\n )}\n </>\n }\n >\n {error && (\n <Alert variant=\"error\" role=\"alert\">\n {error}\n </Alert>\n )}\n {draft ? (\n <Panel title={t('admin.applications.details.edit.action')}>\n <form\n className={styles['row']}\n style={{alignItems: 'stretch', flexDirection: 'column'}}\n onSubmit={handleSave}\n noValidate\n >\n <ApplicationFormFields\n preferences={preferences}\n values={draft}\n onInputChange={(field: ApplicationTextField, value: string): void =>\n setDraft((previous: ApplicationFormValues | null) => previous && {...previous, [field]: value})\n }\n onGrantTypesChange={(grantTypes: string[]): void =>\n setDraft((previous: ApplicationFormValues | null) => previous && {...previous, grantTypes})\n }\n />\n <div className={styles['row']} style={{justifyContent: 'flex-end'}}>\n <Button type=\"button\" variant=\"text\" disabled={isUpdating} onClick={(): void => setDraft(null)}>\n {t('admin.common.actions.cancel')}\n </Button>\n <Button\n type=\"submit\"\n loading={isUpdating}\n disabled={isUpdating || !isApplicationSubmissionValid(toSubmission(draft))}\n >\n {t('admin.applications.details.edit.save')}\n </Button>\n </div>\n </form>\n </Panel>\n ) : (\n <>\n <Panel\n title={t('admin.applications.details.overview')}\n actions={\n onUpdate && isWritable ? (\n <Button\n variant=\"outline\"\n size=\"small\"\n onClick={(): void => setDraft(toFormValues(application, oauthConfig))}\n >\n {t('admin.applications.details.edit.action')}\n </Button>\n ) : undefined\n }\n >\n <DetailList items={overview} />\n </Panel>\n {oauthConfig && (\n <Panel\n title={t('admin.applications.details.oauth')}\n actions={\n onRegenerateSecret && canRegenerate && !clientSecret ? (\n <ConfirmButton\n confirmText={t('admin.applications.details.secret.confirm', {name: application.name})}\n isLoading={isRegeneratingSecret}\n onConfirm={onRegenerateSecret}\n >\n {t('admin.applications.details.secret.action')}\n </ConfirmButton>\n ) : undefined\n }\n >\n {clientSecret && (\n <ClientSecretNotice secret={clientSecret} onDismiss={onSecretDismiss} preferences={preferences} />\n )}\n <DetailList\n items={[\n {\n label: t('admin.applications.fields.grant_types'),\n value: (\n <ChipList\n label={t('admin.applications.fields.grant_types')}\n emptyText={t('admin.applications.details.no_grant_types')}\n items={(oauthConfig.grantTypes ?? []).map((grantType: string) => ({\n id: grantType,\n label: APPLICATION_GRANT_TYPES.includes(grantType)\n ? t(`admin.applications.grant_types.${grantType}`)\n : grantType,\n }))}\n />\n ),\n },\n {\n label: t('admin.applications.fields.redirect_uris'),\n value: (\n <ChipList\n label={t('admin.applications.fields.redirect_uris')}\n emptyText={t('admin.applications.details.no_redirect_uris')}\n items={(oauthConfig.redirectUris ?? []).map((uri: string) => ({id: uri, label: uri}))}\n />\n ),\n },\n {\n label: t('admin.applications.details.public_client'),\n value: oauthConfig.publicClient\n ? t('admin.applications.details.yes')\n : t('admin.applications.details.no'),\n },\n ]}\n />\n </Panel>\n )}\n </>\n )}\n </AdminSection>\n );\n};\n\nexport default BaseApplicationDetails;\n"],"mappings":";;;;;;;;;;;;;;;;AAmIA,MAAM,gBAAgB,aAA0B,WAAiD;CAC/F,aAAa,YAAY,eAAe;CACxC,YAAY,OAAO,cAAc,EAAE;CACnC,SAAS,YAAY,WAAW;CAChC,MAAM,YAAY;CAClB,cAAc,QAAQ,OAAO,aAAa;CAC1C,eAAe,OAAO,gBAAgB,EAAE,EAAE,KAAK,KAAK;CACpD,KAAK,YAAY,OAAO;CACzB;AAED,MAAM,gBAAgB,YAA0D;CAC9E,aAAa,OAAO,YAAY,MAAM,IAAI;CAC1C,YAAY,OAAO;CACnB,SAAS,OAAO,QAAQ,MAAM,IAAI;CAClC,MAAM,OAAO,KAAK,MAAM;CACxB,cAAc,OAAO;CACrB,cAAc,kBAAkB,OAAO,aAAa;CACpD,KAAK,OAAO,IAAI,MAAM,IAAI;CAC3B;;;;;;AAOD,MAAMA,0BAA2D,EAC/D,SACA,aACA,UACA,WACA,eAAe,MACf,QAAQ,MACR,aAAa,OACb,YAAY,OACZ,uBAAuB,OACvB,2BAA2B,OAC3B,aAAa,OACb,mBAAmB,EAAE,EACrB,UACA,mBACA,oBACA,iBACA,UACA,kBAC+C;CAC/C,MAAM,EAAC,MAAKC,uBAAe,aAAa,KAAK;CAC7C,MAAMC,SAAiCC,4BAAoB;CAC3D,MAAM,CAAC,OAAO,YAAY,SAAuC,KAAK;CAEtE,MAAMC,cAAwC,0BAA0B,YAAY;CACpF,MAAMC,aAAsB,QAAQ,YAAY,IAAI,CAAC,aAAa;CAClE,MAAMC,gBAAyB,cAAc,QAAQ,YAAY,IAAI,CAAC,aAAa;AAEnF,KAAI,UAAU;EACZ,IAAIC;AAEJ,MAAI,aAAa;GACf,MAAM,EAAC,cAAc,aAAc,GAAG,SAAsB;AAE5D,WAAQ;;AAGV,SACE,oBAAC;GAAe;aACb,SAAS;IACR;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA,kBAAkB,qBAAqB,cAAc,mBAAmB,EAAE;IAC1E;IACA,UAAU,aAAa,WAAW;IAClC,mBAAmB,cAAc,oBAAoB;IACrD,oBAAoB,gBAAgB,qBAAqB;IACzD,iBAAiB,eAAe,kBAAkB;IAClD,UAAU,aAAa,WAAW;IACnC,CAAC;IACE;;AAIV,KAAI,aAAa,CAAC,YAChB,QACE,oBAACC;EAAa,OAAM;EAAiC;EAAwB;YAC3E,qBAAC;GAAK,WAAW,OAAO;GAAU,MAAK;;IACrC,oBAACC,mBAAQ,MAAK,UAAU;;IAAE,EAAE,uBAAuB;;IAC9C;GACM;AAInB,KAAI,CAAC,YACH,QACE,oBAACD;EAAa,OAAM;EAAiC;EAAwB;YAC3E,oBAACE;GAAM,SAAQ;GAAQ,MAAK;aACzB,SAAS,EAAE,gCAAgC;IACtC;GACK;CAInB,MAAMC,SAAiB,EAAE,qCAAqC;CAC9D,MAAMC,WAA6B;EACjC;GACE,OAAO,EAAE,4CAA4C;GACrD,OAAO,aAAa,WAAW,oBAACC,wBAAa,OAAO,YAAY,WAAY,GAAG;GAChF;EACD;GAAC,OAAO,EAAE,kCAAkC;GAAE,OAAO,YAAY,QAAQ,YAAY,YAAY;GAAO;EACxG;GAAC,OAAO,EAAE,yCAAyC;GAAE,OAAO,YAAY,QAAQ;GAAO;EACvF;GAAC,OAAO,EAAE,gCAAgC;GAAE,OAAO,YAAY,OAAO;GAAO;EAC7E;GAAC,OAAO,EAAE,qCAAqC;GAAE,OAAO,YAAY,WAAW;GAAO;EACvF;AAED,KAAI,YAAY,QAAQ,MACtB,UAAS,KAAK;EACZ,OAAO,EAAE,8BAA8B;EACvC,OAAO,oBAAC,qBAAkB,QAAQ,YAAY,OAAO,QAAS;EAC/D,CAAC;CAGJ,MAAM,cAAc,UAA4C;AAC9D,QAAM,gBAAgB;AAEtB,MAAI,CAAC,MACH;EAGF,MAAM,EAAC,aAAc,GAAG,eAAqC,aAAa,MAAM;AAEhF,aAAW,WAAW;AACtB,WAAS,KAAK;;AAGhB,QACE,qBAACL;EACC,OAAM;EACK;EACX,OAAO,YAAY;EACnB,aAAa,YAAY;EACZ;EACb,SACE;GACG;GACA,qBACC,oBAAC;IACC,SAAS;IACT,WAAW;IACX,MAAM,YAAY;IAClB,UAAU;KACV;GAEH,YAAY,cACX,oBAAC;IACC,aAAa,EAAE,6CAA6C,EAAC,MAAM,YAAY,MAAK,CAAC;IACrF,WAAW;IACX,WAAW;cAEV,EAAE,2CAA2C;KAChC;MAEjB;aAGJ,SACC,oBAACE;GAAM,SAAQ;GAAQ,MAAK;aACzB;IACK,EAET,QACC,oBAAC;GAAM,OAAO,EAAE,yCAAyC;aACvD,qBAAC;IACC,WAAW,OAAO;IAClB,OAAO;KAAC,YAAY;KAAW,eAAe;KAAS;IACvD,UAAU;IACV;eAEA,oBAACI;KACc;KACb,QAAQ;KACR,gBAAgB,OAA6B,UAC3C,UAAU,aAA2C,YAAY;MAAC,GAAG;OAAW,QAAQ;MAAM,CAAC;KAEjG,qBAAqB,eACnB,UAAU,aAA2C,YAAY;MAAC,GAAG;MAAU;MAAW,CAAC;MAE7F,EACF,qBAAC;KAAI,WAAW,OAAO;KAAQ,OAAO,EAAC,gBAAgB,YAAW;gBAChE,oBAACC;MAAO,MAAK;MAAS,SAAQ;MAAO,UAAU;MAAY,eAAqB,SAAS,KAAK;gBAC3F,EAAE,8BAA8B;OAC1B,EACT,oBAACA;MACC,MAAK;MACL,SAAS;MACT,UAAU,cAAc,CAAC,6BAA6B,aAAa,MAAM,CAAC;gBAEzE,EAAE,uCAAuC;OACnC;MACL;KACD;IACD,GAER,8CACE,oBAAC;GACC,OAAO,EAAE,sCAAsC;GAC/C,SACE,YAAY,aACV,oBAACA;IACC,SAAQ;IACR,MAAK;IACL,eAAqB,SAAS,aAAa,aAAa,YAAY,CAAC;cAEpE,EAAE,yCAAyC;KACrC,GACP;aAGN,oBAAC,cAAW,OAAO,WAAY;IACzB,EACP,eACC,qBAAC;GACC,OAAO,EAAE,mCAAmC;GAC5C,SACE,sBAAsB,iBAAiB,CAAC,eACtC,oBAAC;IACC,aAAa,EAAE,6CAA6C,EAAC,MAAM,YAAY,MAAK,CAAC;IACrF,WAAW;IACX,WAAW;cAEV,EAAE,2CAA2C;KAChC,GACd;cAGL,gBACC,oBAACC;IAAmB,QAAQ;IAAc,WAAW;IAA8B;KAAe,EAEpG,oBAAC,cACC,OAAO;IACL;KACE,OAAO,EAAE,wCAAwC;KACjD,OACE,oBAAC;MACC,OAAO,EAAE,wCAAwC;MACjD,WAAW,EAAE,4CAA4C;MACzD,QAAQ,YAAY,cAAc,EAAE,EAAE,KAAK,eAAuB;OAChE,IAAI;OACJ,OAAO,wBAAwB,SAAS,UAAU,GAC9C,EAAE,kCAAkC,YAAY,GAChD;OACL,EAAE;OACH;KAEL;IACD;KACE,OAAO,EAAE,0CAA0C;KACnD,OACE,oBAAC;MACC,OAAO,EAAE,0CAA0C;MACnD,WAAW,EAAE,8CAA8C;MAC3D,QAAQ,YAAY,gBAAgB,EAAE,EAAE,KAAK,SAAiB;OAAC,IAAI;OAAK,OAAO;OAAI,EAAE;OACrF;KAEL;IACD;KACE,OAAO,EAAE,2CAA2C;KACpD,OAAO,YAAY,eACf,EAAE,iCAAiC,GACnC,EAAE,gCAAgC;KACvC;IACF,GACD;IACI,IAET;GAEQ;;AAInB,qCAAe"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ApplicationList.d.ts","sourceRoot":"","sources":["../../../../src/components/admin/ApplicationList/ApplicationList.tsx"],"names":[],"mappings":"AASA,OAAO,EAAC,EAAE,EAAyB,MAAM,OAAO,CAAC;AACjD,OAA4B,EAAC,wBAAwB,EAAC,MAAM,uBAAuB,CAAC;AAKpF,MAAM,MAAM,oBAAoB,GAAG,IAAI,CACrC,wBAAwB,EACxB,cAAc,GAAG,OAAO,GAAG,WAAW,GAAG,QAAQ,GAAG,cAAc,GAAG,cAAc,CACpF,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,QAAA,MAAM,eAAe,EAAE,EAAE,CAAC,oBAAoB,CA0B7C,CAAC;AAEF,eAAe,eAAe,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ApplicationList.js","names":["ApplicationList: FC<ApplicationListProps>","useTranslation","endpoint: ManagementEndpoint","useManagementEndpoint","useResourceQuery","BaseApplicationList"],"sources":["../../../../src/components/admin/ApplicationList/ApplicationList.tsx"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n ApplicationListResponse,\n ApplicationQueryKeys,\n getApplications,\n toManagementErrorMessage,\n} from '@thunderid/browser';\nimport {FC, ReactElement, useState} from 'react';\nimport BaseApplicationList, {BaseApplicationListProps} from './BaseApplicationList';\nimport useManagementEndpoint, {ManagementEndpoint} from '../../../hooks/management/useManagementEndpoint';\nimport useResourceQuery, {ResourceQueryResult} from '../../../hooks/management/useResourceQuery';\nimport useTranslation from '../../../hooks/useTranslation';\n\nexport type ApplicationListProps = Omit<\n BaseApplicationListProps,\n 'applications' | 'error' | 'isLoading' | 'offset' | 'onPageChange' | 'totalResults'\n>;\n\n/**\n * Lists the applications the signed-in user is allowed to see, a page at a time.\n *\n * The server guards applications with the root `system` permission, for reading and for changes alike;\n * it defines no application-specific permission. Gate the view and its actions on it with\n * `useGrantedPermissions().can('system')`.\n *\n * @example\n * ```tsx\n * <ApplicationList onSelect={(application) => setSelectedApplicationId(application.id)} />\n * ```\n */\nconst ApplicationList: FC<ApplicationListProps> = ({\n limit = 20,\n preferences,\n ...rest\n}: ApplicationListProps): ReactElement => {\n const {t} = useTranslation(preferences?.i18n);\n const [offset, setOffset] = useState<number>(0);\n const endpoint: ManagementEndpoint = useManagementEndpoint('applications');\n const {data, error, isLoading}: ResourceQueryResult<ApplicationListResponse> = useResourceQuery(\n [ApplicationQueryKeys.APPLICATIONS, {limit, offset}],\n (fetcher) => getApplications({...endpoint, fetcher, limit, offset}),\n );\n\n return (\n <BaseApplicationList\n applications={data?.applications ?? []}\n totalResults={data?.totalResults}\n isLoading={isLoading}\n error={toManagementErrorMessage(t, error, 'admin.applications.list.error')}\n limit={limit}\n offset={offset}\n onPageChange={setOffset}\n preferences={preferences}\n {...rest}\n />\n );\n};\n\nexport default ApplicationList;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAgCA,MAAMA,mBAA6C,EACjD,QAAQ,IACR,YACA,GAAG,WACqC;CACxC,MAAM,EAAC,MAAKC,uBAAe,aAAa,KAAK;CAC7C,MAAM,CAAC,QAAQ,aAAa,SAAiB,EAAE;CAC/C,MAAMC,WAA+BC,8BAAsB,eAAe;CAC1E,MAAM,EAAC,MAAM,OAAO,cAA2DC,yBAC7E,CAAC,qBAAqB,cAAc;EAAC;EAAO;EAAO,CAAC,GACnD,YAAY,gBAAgB;EAAC,GAAG;EAAU;EAAS;EAAO;EAAO,CAAC,CACpE;AAED,QACE,oBAACC;EACC,cAAc,MAAM,gBAAgB,EAAE;EACtC,cAAc,MAAM;EACT;EACX,OAAO,yBAAyB,GAAG,OAAO,gCAAgC;EACnE;EACC;EACR,cAAc;EACD;EACb,GAAI;GACJ;;AAIN,8BAAe"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"BaseApplicationList.d.ts","sourceRoot":"","sources":["../../../../src/components/admin/ApplicationList/BaseApplicationList.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAC,gBAAgB,EAAE,WAAW,EAAC,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAC,EAAE,EAAgB,SAAS,EAAC,MAAM,OAAO,CAAC;AAGlD,OAAO,EAAC,oBAAoB,EAAC,MAAM,gCAAgC,CAAC;AAGpE;;;GAGG;AACH,MAAM,MAAM,8BAA8B,GAAG,oBAAoB,CAAC,gBAAgB,CAAC,GAAG;IACpF,YAAY,EAAE,gBAAgB,EAAE,CAAC;CAClC,CAAC;AAEF,MAAM,WAAW,wBAAwB;IACvC;;OAEG;IACH,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,YAAY,EAAE,gBAAgB,EAAE,CAAC;IACjC;;;;OAIG;IACH,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,8BAA8B,KAAK,SAAS,CAAC;IAChE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,WAAW,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACnD,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAmBD;;;GAGG;AACH,QAAA,MAAM,mBAAmB,EAAE,EAAE,CAAC,wBAAwB,CA6FrD,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"BaseApplicationList.js","names":["value: string | undefined","BaseApplicationList: FC<BaseApplicationListProps>","useTranslation","columns: DataTableColumn<BasicApplication>[]","AdminSection","DataTable"],"sources":["../../../../src/components/admin/ApplicationList/BaseApplicationList.tsx"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {BasicApplication, Preferences} from '@thunderid/browser';\nimport {FC, ReactElement, ReactNode} from 'react';\nimport useTranslation from '../../../hooks/useTranslation';\nimport DataTable, {DataTableColumn} from '../../primitives/DataTable/DataTable';\nimport {AdminListRenderProps} from '../shared/AdminListRenderProps';\nimport AdminSection from '../shared/AdminSection';\n\n/**\n * What {@link BaseApplicationList} hands its `children` render function. `applications` and `rows` are\n * the same array.\n */\nexport type BaseApplicationListRenderProps = AdminListRenderProps<BasicApplication> & {\n applications: BasicApplication[];\n};\n\nexport interface BaseApplicationListProps {\n /**\n * Controls rendered next to the title, such as a button that opens `ApplicationCreate`.\n */\n actions?: ReactNode;\n applications: BasicApplication[];\n /**\n * Renders custom UI in place of the default table, for example a third-party data grid. Receives\n * the applications, the default columns, the loading and error state, and the pagination and\n * selection handlers.\n */\n children?: (props: BaseApplicationListRenderProps) => ReactNode;\n className?: string;\n description?: string;\n error?: string | null;\n isLoading?: boolean;\n /**\n * Page size.\n * @default 20\n */\n limit?: number;\n offset?: number;\n /**\n * Called with the offset of the page to show. Pagination is hidden when omitted.\n */\n onPageChange?: (offset: number) => void;\n /**\n * Called when an application is chosen. Rows are selectable only when set.\n */\n onSelect?: (application: BasicApplication) => void;\n preferences?: Preferences;\n selectedApplicationId?: string;\n /**\n * Heading of the list. Pass an empty string to hide it.\n */\n title?: string;\n totalResults?: number;\n}\n\n/**\n * The translated access status of an application, or its raw value when the status is one this SDK\n * does not know.\n */\nconst getStatusLabel = (application: BasicApplication, t: (key: string) => string): string => {\n const value: string | undefined = application.status?.value;\n\n switch (value?.toUpperCase()) {\n case 'ACTIVE':\n return t('admin.applications.status.active');\n case 'SUSPENDED':\n return t('admin.applications.status.suspended');\n default:\n return value ?? '';\n }\n};\n\n/**\n * Lists applications with their client identifier, type and, when the server reports it, access status. Holds no data of its own: pass the page\n * of applications and handle selection and pagination.\n */\nconst BaseApplicationList: FC<BaseApplicationListProps> = ({\n actions,\n applications,\n children,\n className,\n description,\n error = null,\n isLoading = false,\n limit = 20,\n offset = 0,\n onPageChange,\n onSelect,\n preferences,\n selectedApplicationId,\n title,\n totalResults,\n}: BaseApplicationListProps): ReactElement => {\n const {t} = useTranslation(preferences?.i18n);\n\n const columns: DataTableColumn<BasicApplication>[] = [\n {\n header: t('admin.applications.list.columns.name'),\n id: 'name',\n render: (application: BasicApplication): ReactNode => application.name,\n },\n {\n header: t('admin.applications.list.columns.client_id'),\n id: 'clientId',\n render: (application: BasicApplication): ReactNode =>\n application.clientId ? <code>{application.clientId}</code> : null,\n },\n {\n header: t('admin.applications.list.columns.type'),\n id: 'type',\n render: (application: BasicApplication): ReactNode => application.type ?? application.template ?? '',\n },\n // A server that does not report the access status gets no empty status column.\n ...(applications.some((application: BasicApplication) => application.status?.value)\n ? [\n {\n header: t('admin.applications.list.columns.status'),\n id: 'status',\n render: (application: BasicApplication): ReactNode => getStatusLabel(application, t),\n },\n ]\n : []),\n ];\n\n if (children) {\n return (\n <div className={className}>\n {children({\n applications,\n columns,\n error,\n isLoading,\n limit,\n offset,\n onPageChange,\n onSelect,\n rows: applications,\n selectedRowId: selectedApplicationId,\n totalResults: totalResults ?? applications.length,\n })}\n </div>\n );\n }\n\n return (\n <AdminSection\n block=\"application-list\"\n className={className}\n title={title ?? t('admin.applications.list.title')}\n description={description}\n actions={actions}\n preferences={preferences}\n >\n <DataTable\n caption={title?.length ? title : t('admin.applications.list.title')}\n columns={columns}\n rows={applications}\n getRowId={(application: BasicApplication): string => application.id}\n isLoading={isLoading}\n error={error}\n emptyText={t('admin.applications.list.empty')}\n onRowClick={onSelect}\n selectedRowId={selectedApplicationId}\n pagination={\n onPageChange ? {limit, offset, onChange: onPageChange, total: totalResults ?? applications.length} : undefined\n }\n />\n </AdminSection>\n );\n};\n\nexport default BaseApplicationList;\n"],"mappings":";;;;;;;;;;AA6DA,MAAM,kBAAkB,aAA+B,MAAuC;CAC5F,MAAMA,QAA4B,YAAY,QAAQ;AAEtD,SAAQ,OAAO,aAAa,EAA5B;EACE,KAAK,SACH,QAAO,EAAE,mCAAmC;EAC9C,KAAK,YACH,QAAO,EAAE,sCAAsC;EACjD,QACE,QAAO,SAAS;;;;;;;AAQtB,MAAMC,uBAAqD,EACzD,SACA,cACA,UACA,WACA,aACA,QAAQ,MACR,YAAY,OACZ,QAAQ,IACR,SAAS,GACT,cACA,UACA,aACA,uBACA,OACA,mBAC4C;CAC5C,MAAM,EAAC,MAAKC,uBAAe,aAAa,KAAK;CAE7C,MAAMC,UAA+C;EACnD;GACE,QAAQ,EAAE,uCAAuC;GACjD,IAAI;GACJ,SAAS,gBAA6C,YAAY;GACnE;EACD;GACE,QAAQ,EAAE,4CAA4C;GACtD,IAAI;GACJ,SAAS,gBACP,YAAY,WAAW,oBAAC,oBAAM,YAAY,WAAgB,GAAG;GAChE;EACD;GACE,QAAQ,EAAE,uCAAuC;GACjD,IAAI;GACJ,SAAS,gBAA6C,YAAY,QAAQ,YAAY,YAAY;GACnG;EAED,GAAI,aAAa,MAAM,gBAAkC,YAAY,QAAQ,MAAM,GAC/E,CACE;GACE,QAAQ,EAAE,yCAAyC;GACnD,IAAI;GACJ,SAAS,gBAA6C,eAAe,aAAa,EAAE;GACrF,CACF,GACD,EAAE;EACP;AAED,KAAI,SACF,QACE,oBAAC;EAAe;YACb,SAAS;GACR;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA,MAAM;GACN,eAAe;GACf,cAAc,gBAAgB,aAAa;GAC5C,CAAC;GACE;AAIV,QACE,oBAACC;EACC,OAAM;EACK;EACX,OAAO,SAAS,EAAE,gCAAgC;EACrC;EACJ;EACI;YAEb,oBAACC;GACC,SAAS,OAAO,SAAS,QAAQ,EAAE,gCAAgC;GAC1D;GACT,MAAM;GACN,WAAW,gBAA0C,YAAY;GACtD;GACJ;GACP,WAAW,EAAE,gCAAgC;GAC7C,YAAY;GACZ,eAAe;GACf,YACE,eAAe;IAAC;IAAO;IAAQ,UAAU;IAAc,OAAO,gBAAgB,aAAa;IAAO,GAAG;IAEvG;GACW;;AAInB,kCAAe"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"BaseGroupCreate.d.ts","sourceRoot":"","sources":["../../../../src/components/admin/GroupCreate/BaseGroupCreate.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAC,WAAW,EAAC,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAc,EAAE,EAA2B,SAAS,EAAW,MAAM,OAAO,CAAC;AASpF;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB;;OAEG;IACH,iBAAiB,EAAE,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1E;;OAEG;IACH,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,YAAY,EAAE,OAAO,CAAC;IACtB;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,MAAM,EAAE;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAC,CAAC;CAC7C;AAED,MAAM,WAAW,oBAAoB;IACnC;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,0BAA0B,KAAK,SAAS,CAAC;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,QAAQ,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,IAAI,CAAC;IACjD,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,QAAA,MAAM,eAAe,EAAE,EAAE,CAAC,oBAAoB,CAuF7C,CAAC;AAEF,eAAe,eAAe,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"BaseGroupCreate.js","names":["BaseGroupCreate: FC<BaseGroupCreateProps>","useTheme","styles: Record<string, string>","useStyles","useTranslation","isValid: boolean","AdminSection","Alert","TextField","Button"],"sources":["../../../../src/components/admin/GroupCreate/BaseGroupCreate.tsx"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {Preferences} from '@thunderid/browser';\nimport {ChangeEvent, FC, FormEvent, ReactElement, ReactNode, useState} from 'react';\nimport useTheme from '../../../contexts/Theme/useTheme';\nimport useTranslation from '../../../hooks/useTranslation';\nimport Alert from '../../primitives/Alert/Alert';\nimport Button from '../../primitives/Button/Button';\nimport TextField from '../../primitives/TextField/TextField';\nimport AdminSection from '../shared/AdminSection';\nimport useStyles from '../shared/AdminSection.styles';\n\n/**\n * The group {@link BaseGroupCreate} submits. The organization unit is added by the caller.\n */\nexport interface GroupCreateSubmission {\n description?: string;\n name: string;\n}\n\n/**\n * What {@link BaseGroupCreate} hands its `children` render function, so the form can be built with any UI.\n */\nexport interface BaseGroupCreateRenderProps {\n error: string | null;\n /**\n * Sets one field of the form.\n */\n handleInputChange: (field: 'description' | 'name', value: string) => void;\n /**\n * Submits the current values. Does nothing while they are not valid.\n */\n handleSubmit: () => void;\n isSubmitting: boolean;\n /**\n * Whether the values can be submitted.\n */\n isValid: boolean;\n onCancel?: () => void;\n values: {description: string; name: string};\n}\n\nexport interface BaseGroupCreateProps {\n /**\n * Renders custom UI in place of the default form. Receives the values, their setters, the submit\n * handler and the submission state.\n */\n children?: (props: BaseGroupCreateRenderProps) => ReactNode;\n className?: string;\n description?: string;\n error?: string | null;\n isSubmitting?: boolean;\n onCancel?: () => void;\n onSubmit: (group: GroupCreateSubmission) => void;\n preferences?: Preferences;\n title?: string;\n}\n\n/**\n * A form that collects a new group's name and description. Holds no data of its own: handle the\n * submission.\n */\nconst BaseGroupCreate: FC<BaseGroupCreateProps> = ({\n children,\n className,\n description,\n error = null,\n isSubmitting = false,\n onCancel,\n onSubmit,\n preferences,\n title,\n}: BaseGroupCreateProps): ReactElement => {\n const {theme, colorScheme} = useTheme();\n const styles: Record<string, string> = useStyles(theme, colorScheme);\n const {t} = useTranslation(preferences?.i18n);\n const [name, setName] = useState<string>('');\n const [groupDescription, setGroupDescription] = useState<string>('');\n\n const isValid: boolean = name.trim().length > 0;\n\n const submit = (): void => {\n if (isValid) {\n onSubmit({description: groupDescription.trim() || undefined, name: name.trim()});\n }\n };\n\n const handleSubmit = (event: FormEvent<HTMLFormElement>): void => {\n event.preventDefault();\n submit();\n };\n\n if (children) {\n return (\n <div className={className}>\n {children({\n error,\n handleInputChange: (field: 'description' | 'name', value: string): void =>\n field === 'name' ? setName(value) : setGroupDescription(value),\n handleSubmit: submit,\n isSubmitting,\n isValid,\n onCancel,\n values: {description: groupDescription, name},\n })}\n </div>\n );\n }\n\n return (\n <AdminSection\n block=\"group-create\"\n className={className}\n title={title ?? t('admin.groups.create.title')}\n description={description}\n preferences={preferences}\n >\n <form className={styles['form']} onSubmit={handleSubmit} noValidate>\n {error && (\n <Alert variant=\"error\" role=\"alert\">\n {error}\n </Alert>\n )}\n <TextField\n name=\"name\"\n label={t('admin.groups.create.fields.name')}\n required\n value={name}\n onChange={(event: ChangeEvent<HTMLInputElement>): void => setName(event.target.value)}\n />\n <TextField\n name=\"description\"\n label={t('admin.groups.create.fields.description')}\n value={groupDescription}\n onChange={(event: ChangeEvent<HTMLInputElement>): void => setGroupDescription(event.target.value)}\n />\n <div className={styles['formActions']}>\n {onCancel && (\n <Button type=\"button\" variant=\"text\" onClick={onCancel} disabled={isSubmitting}>\n {t('admin.common.actions.cancel')}\n </Button>\n )}\n <Button type=\"submit\" loading={isSubmitting} disabled={!isValid || isSubmitting}>\n {t('admin.groups.create.submit')}\n </Button>\n </div>\n </form>\n </AdminSection>\n );\n};\n\nexport default BaseGroupCreate;\n"],"mappings":";;;;;;;;;;;;;;;AA+DA,MAAMA,mBAA6C,EACjD,UACA,WACA,aACA,QAAQ,MACR,eAAe,OACf,UACA,UACA,aACA,YACwC;CACxC,MAAM,EAAC,OAAO,gBAAeC,kBAAU;CACvC,MAAMC,SAAiCC,4BAAU,OAAO,YAAY;CACpE,MAAM,EAAC,MAAKC,uBAAe,aAAa,KAAK;CAC7C,MAAM,CAAC,MAAM,WAAW,SAAiB,GAAG;CAC5C,MAAM,CAAC,kBAAkB,uBAAuB,SAAiB,GAAG;CAEpE,MAAMC,UAAmB,KAAK,MAAM,CAAC,SAAS;CAE9C,MAAM,eAAqB;AACzB,MAAI,QACF,UAAS;GAAC,aAAa,iBAAiB,MAAM,IAAI;GAAW,MAAM,KAAK,MAAM;GAAC,CAAC;;CAIpF,MAAM,gBAAgB,UAA4C;AAChE,QAAM,gBAAgB;AACtB,UAAQ;;AAGV,KAAI,SACF,QACE,oBAAC;EAAe;YACb,SAAS;GACR;GACA,oBAAoB,OAA+B,UACjD,UAAU,SAAS,QAAQ,MAAM,GAAG,oBAAoB,MAAM;GAChE,cAAc;GACd;GACA;GACA;GACA,QAAQ;IAAC,aAAa;IAAkB;IAAK;GAC9C,CAAC;GACE;AAIV,QACE,oBAACC;EACC,OAAM;EACK;EACX,OAAO,SAAS,EAAE,4BAA4B;EACjC;EACA;YAEb,qBAAC;GAAK,WAAW,OAAO;GAAS,UAAU;GAAc;;IACtD,SACC,oBAACC;KAAM,SAAQ;KAAQ,MAAK;eACzB;MACK;IAEV,oBAACC;KACC,MAAK;KACL,OAAO,EAAE,kCAAkC;KAC3C;KACA,OAAO;KACP,WAAW,UAA+C,QAAQ,MAAM,OAAO,MAAM;MACrF;IACF,oBAACA;KACC,MAAK;KACL,OAAO,EAAE,yCAAyC;KAClD,OAAO;KACP,WAAW,UAA+C,oBAAoB,MAAM,OAAO,MAAM;MACjG;IACF,qBAAC;KAAI,WAAW,OAAO;gBACpB,YACC,oBAACC;MAAO,MAAK;MAAS,SAAQ;MAAO,SAAS;MAAU,UAAU;gBAC/D,EAAE,8BAA8B;OAC1B,EAEX,oBAACA;MAAO,MAAK;MAAS,SAAS;MAAc,UAAU,CAAC,WAAW;gBAChE,EAAE,6BAA6B;OACzB;MACL;;IACD;GACM;;AAInB,8BAAe"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"GroupCreate.d.ts","sourceRoot":"","sources":["../../../../src/components/admin/GroupCreate/GroupCreate.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAqB,KAAK,EAAwD,MAAM,oBAAoB,CAAC;AACpH,OAAO,EAAC,EAAE,EAAe,MAAM,OAAO,CAAC;AACvC,OAAwB,EAAC,oBAAoB,EAAwB,MAAM,mBAAmB,CAAC;AAM/F,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,oBAAoB,EAAE,OAAO,GAAG,cAAc,GAAG,UAAU,CAAC,GAAG;IACjG;;OAEG;IACH,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACnC;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF;;;;;;;GAOG;AACH,QAAA,MAAM,WAAW,EAAE,EAAE,CAAC,gBAAgB,CA2BrC,CAAC;AAEF,eAAe,WAAW,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"GroupCreate.js","names":["GroupCreate: FC<GroupCreateProps>","useTranslation","resolvedOuId: string | undefined","useDefaultOuId","endpoint: ManagementEndpoint","useManagementEndpoint","useResourceMutation","BaseGroupCreate"],"sources":["../../../../src/components/admin/GroupCreate/GroupCreate.tsx"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {CreateGroupRequest, Group, GroupQueryKeys, createGroup, toManagementErrorMessage} from '@thunderid/browser';\nimport {FC, ReactElement} from 'react';\nimport BaseGroupCreate, {BaseGroupCreateProps, GroupCreateSubmission} from './BaseGroupCreate';\nimport useManagementEndpoint, {ManagementEndpoint} from '../../../hooks/management/useManagementEndpoint';\nimport useResourceMutation, {ResourceMutationResult} from '../../../hooks/management/useResourceMutation';\nimport useTranslation from '../../../hooks/useTranslation';\nimport useDefaultOuId from '../shared/useDefaultOuId';\n\nexport type GroupCreateProps = Omit<BaseGroupCreateProps, 'error' | 'isSubmitting' | 'onSubmit'> & {\n /**\n * Called with the created group.\n */\n onCreated?: (group: Group) => void;\n /**\n * Organization unit the group is created in. Defaults to the signed-in user's organization unit.\n */\n ouId?: string;\n};\n\n/**\n * Creates a group through the management API.\n *\n * @example\n * ```tsx\n * <GroupCreate onCreated={(group) => navigate(`/groups/${group.id}`)} />\n * ```\n */\nconst GroupCreate: FC<GroupCreateProps> = ({onCreated, ouId, preferences, ...rest}: GroupCreateProps): ReactElement => {\n const {t} = useTranslation(preferences?.i18n);\n const resolvedOuId: string | undefined = useDefaultOuId(ouId);\n const endpoint: ManagementEndpoint = useManagementEndpoint('groups');\n const {error, isLoading, mutate}: ResourceMutationResult<Group, CreateGroupRequest> = useResourceMutation(\n (payload: CreateGroupRequest, fetcher) => createGroup({...endpoint, fetcher, payload}),\n () => [[GroupQueryKeys.GROUPS], [GroupQueryKeys.MEMBERSHIPS]],\n {onSuccess: onCreated},\n );\n\n const handleSubmit = ({description, name}: GroupCreateSubmission): void => {\n if (resolvedOuId) {\n void mutate({description, name, ouId: resolvedOuId});\n }\n };\n\n return (\n <BaseGroupCreate\n onSubmit={handleSubmit}\n isSubmitting={isLoading}\n error={\n resolvedOuId ? toManagementErrorMessage(t, error, 'admin.groups.create.error') : t('admin.common.errors.no_ou')\n }\n preferences={preferences}\n {...rest}\n />\n );\n};\n\nexport default GroupCreate;\n"],"mappings":";;;;;;;;;;;;;;;;;AA8BA,MAAMA,eAAqC,EAAC,WAAW,MAAM,YAAa,GAAG,WAA0C;CACrH,MAAM,EAAC,MAAKC,uBAAe,aAAa,KAAK;CAC7C,MAAMC,eAAmCC,uBAAe,KAAK;CAC7D,MAAMC,WAA+BC,8BAAsB,SAAS;CACpE,MAAM,EAAC,OAAO,WAAW,WAA6DC,6BACnF,SAA6B,YAAY,YAAY;EAAC,GAAG;EAAU;EAAS;EAAQ,CAAC,QAChF,CAAC,CAAC,eAAe,OAAO,EAAE,CAAC,eAAe,YAAY,CAAC,EAC7D,EAAC,WAAW,WAAU,CACvB;CAED,MAAM,gBAAgB,EAAC,aAAa,WAAuC;AACzE,MAAI,aACF,CAAK,OAAO;GAAC;GAAa;GAAM,MAAM;GAAa,CAAC;;AAIxD,QACE,oBAACC;EACC,UAAU;EACV,cAAc;EACd,OACE,eAAe,yBAAyB,GAAG,OAAO,4BAA4B,GAAG,EAAE,4BAA4B;EAEpG;EACb,GAAI;GACJ;;AAIN,0BAAe"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"BaseGroupList.d.ts","sourceRoot":"","sources":["../../../../src/components/admin/GroupList/BaseGroupList.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAC,KAAK,EAAE,WAAW,EAAC,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAC,EAAE,EAAgB,SAAS,EAAC,MAAM,OAAO,CAAC;AAGlD,OAAO,EAAC,oBAAoB,EAAC,MAAM,gCAAgC,CAAC;AAGpE;;GAEG;AACH,MAAM,MAAM,wBAAwB,GAAG,oBAAoB,CAAC,KAAK,CAAC,GAAG;IAAC,MAAM,EAAE,KAAK,EAAE,CAAA;CAAC,CAAC;AAEvF,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,wBAAwB,KAAK,SAAS,CAAC;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAClC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;GAGG;AACH,QAAA,MAAM,aAAa,EAAE,EAAE,CAAC,kBAAkB,CA8EzC,CAAC;AAEF,eAAe,aAAa,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"BaseGroupList.js","names":["BaseGroupList: FC<BaseGroupListProps>","useTranslation","columns: DataTableColumn<Group>[]","AdminSection","DataTable"],"sources":["../../../../src/components/admin/GroupList/BaseGroupList.tsx"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {Group, Preferences} from '@thunderid/browser';\nimport {FC, ReactElement, ReactNode} from 'react';\nimport useTranslation from '../../../hooks/useTranslation';\nimport DataTable, {DataTableColumn} from '../../primitives/DataTable/DataTable';\nimport {AdminListRenderProps} from '../shared/AdminListRenderProps';\nimport AdminSection from '../shared/AdminSection';\n\n/**\n * What {@link BaseGroupList} hands its `children` render function. `groups` and `rows` are the same array.\n */\nexport type BaseGroupListRenderProps = AdminListRenderProps<Group> & {groups: Group[]};\n\nexport interface BaseGroupListProps {\n /**\n * Controls rendered next to the title, such as a button that opens `GroupCreate`.\n */\n actions?: ReactNode;\n /**\n * Renders custom UI in place of the default table, for example a third-party data grid. Receives\n * the groups, the default columns, the loading and error state, and the pagination and selection\n * handlers.\n */\n children?: (props: BaseGroupListRenderProps) => ReactNode;\n className?: string;\n description?: string;\n error?: string | null;\n groups: Group[];\n isLoading?: boolean;\n /**\n * Page size.\n * @default 20\n */\n limit?: number;\n offset?: number;\n /**\n * Called with the offset of the page to show. Pagination is hidden when omitted.\n */\n onPageChange?: (offset: number) => void;\n /**\n * Called when a group is chosen. Rows are selectable only when set.\n */\n onSelect?: (group: Group) => void;\n preferences?: Preferences;\n selectedGroupId?: string;\n /**\n * Heading of the list. Pass an empty string to hide it.\n */\n title?: string;\n totalResults?: number;\n}\n\n/**\n * Lists groups with their description and organization unit. Holds no data of its own: pass the\n * page of groups and handle selection and pagination.\n */\nconst BaseGroupList: FC<BaseGroupListProps> = ({\n actions,\n children,\n className,\n description,\n error = null,\n groups,\n isLoading = false,\n limit = 20,\n offset = 0,\n onPageChange,\n onSelect,\n preferences,\n selectedGroupId,\n title,\n totalResults,\n}: BaseGroupListProps): ReactElement => {\n const {t} = useTranslation(preferences?.i18n);\n\n const columns: DataTableColumn<Group>[] = [\n {header: t('admin.groups.list.columns.name'), id: 'name', render: (group: Group): ReactNode => group.name},\n {\n header: t('admin.groups.list.columns.description'),\n id: 'description',\n render: (group: Group): ReactNode => group.description ?? '',\n },\n {\n header: t('admin.common.columns.organization_unit'),\n id: 'ou',\n render: (group: Group): ReactNode => group.ouHandle ?? group.ouId,\n },\n ];\n\n if (children) {\n return (\n <div className={className}>\n {children({\n columns,\n error,\n isLoading,\n limit,\n offset,\n onPageChange,\n onSelect,\n rows: groups,\n selectedRowId: selectedGroupId,\n totalResults: totalResults ?? groups.length,\n groups,\n })}\n </div>\n );\n }\n\n return (\n <AdminSection\n block=\"group-list\"\n className={className}\n title={title ?? t('admin.groups.list.title')}\n description={description}\n actions={actions}\n preferences={preferences}\n >\n <DataTable\n caption={title?.length ? title : t('admin.groups.list.title')}\n columns={columns}\n rows={groups}\n getRowId={(group: Group): string => group.id}\n isLoading={isLoading}\n error={error}\n emptyText={t('admin.groups.list.empty')}\n onRowClick={onSelect}\n selectedRowId={selectedGroupId}\n pagination={\n onPageChange ? {limit, offset, onChange: onPageChange, total: totalResults ?? groups.length} : undefined\n }\n />\n </AdminSection>\n );\n};\n\nexport default BaseGroupList;\n"],"mappings":";;;;;;;;;;AA0DA,MAAMA,iBAAyC,EAC7C,SACA,UACA,WACA,aACA,QAAQ,MACR,QACA,YAAY,OACZ,QAAQ,IACR,SAAS,GACT,cACA,UACA,aACA,iBACA,OACA,mBACsC;CACtC,MAAM,EAAC,MAAKC,uBAAe,aAAa,KAAK;CAE7C,MAAMC,UAAoC;EACxC;GAAC,QAAQ,EAAE,iCAAiC;GAAE,IAAI;GAAQ,SAAS,UAA4B,MAAM;GAAK;EAC1G;GACE,QAAQ,EAAE,wCAAwC;GAClD,IAAI;GACJ,SAAS,UAA4B,MAAM,eAAe;GAC3D;EACD;GACE,QAAQ,EAAE,yCAAyC;GACnD,IAAI;GACJ,SAAS,UAA4B,MAAM,YAAY,MAAM;GAC9D;EACF;AAED,KAAI,SACF,QACE,oBAAC;EAAe;YACb,SAAS;GACR;GACA;GACA;GACA;GACA;GACA;GACA;GACA,MAAM;GACN,eAAe;GACf,cAAc,gBAAgB,OAAO;GACrC;GACD,CAAC;GACE;AAIV,QACE,oBAACC;EACC,OAAM;EACK;EACX,OAAO,SAAS,EAAE,0BAA0B;EAC/B;EACJ;EACI;YAEb,oBAACC;GACC,SAAS,OAAO,SAAS,QAAQ,EAAE,0BAA0B;GACpD;GACT,MAAM;GACN,WAAW,UAAyB,MAAM;GAC/B;GACJ;GACP,WAAW,EAAE,0BAA0B;GACvC,YAAY;GACZ,eAAe;GACf,YACE,eAAe;IAAC;IAAO;IAAQ,UAAU;IAAc,OAAO,gBAAgB,OAAO;IAAO,GAAG;IAEjG;GACW;;AAInB,4BAAe"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"GroupList.d.ts","sourceRoot":"","sources":["../../../../src/components/admin/GroupList/GroupList.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAC,EAAE,EAAyB,MAAM,OAAO,CAAC;AACjD,OAAsB,EAAC,kBAAkB,EAAC,MAAM,iBAAiB,CAAC;AAKlE,MAAM,MAAM,cAAc,GAAG,IAAI,CAC/B,kBAAkB,EAClB,OAAO,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,GAAG,cAAc,GAAG,cAAc,CAC9E,CAAC;AAEF;;;;;;;GAOG;AACH,QAAA,MAAM,SAAS,EAAE,EAAE,CAAC,cAAc,CAsBjC,CAAC;AAEF,eAAe,SAAS,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"GroupList.js","names":["GroupList: FC<GroupListProps>","useTranslation","endpoint: ManagementEndpoint","useManagementEndpoint","useResourceQuery","BaseGroupList"],"sources":["../../../../src/components/admin/GroupList/GroupList.tsx"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {GroupListResponse, GroupQueryKeys, getGroups, toManagementErrorMessage} from '@thunderid/browser';\nimport {FC, ReactElement, useState} from 'react';\nimport BaseGroupList, {BaseGroupListProps} from './BaseGroupList';\nimport useManagementEndpoint, {ManagementEndpoint} from '../../../hooks/management/useManagementEndpoint';\nimport useResourceQuery, {ResourceQueryResult} from '../../../hooks/management/useResourceQuery';\nimport useTranslation from '../../../hooks/useTranslation';\n\nexport type GroupListProps = Omit<\n BaseGroupListProps,\n 'error' | 'groups' | 'isLoading' | 'offset' | 'onPageChange' | 'totalResults'\n>;\n\n/**\n * Lists the groups the signed-in user is allowed to see, a page at a time.\n *\n * @example\n * ```tsx\n * <GroupList onSelect={(group) => setSelectedGroupId(group.id)} />\n * ```\n */\nconst GroupList: FC<GroupListProps> = ({limit = 20, preferences, ...rest}: GroupListProps): ReactElement => {\n const {t} = useTranslation(preferences?.i18n);\n const [offset, setOffset] = useState<number>(0);\n const endpoint: ManagementEndpoint = useManagementEndpoint('groups');\n const {data, error, isLoading}: ResourceQueryResult<GroupListResponse> = useResourceQuery(\n [GroupQueryKeys.GROUPS, {limit, offset}],\n (fetcher) => getGroups({...endpoint, fetcher, limit, offset}),\n );\n\n return (\n <BaseGroupList\n groups={data?.groups ?? []}\n totalResults={data?.totalResults}\n isLoading={isLoading}\n error={toManagementErrorMessage(t, error, 'admin.groups.list.error')}\n limit={limit}\n offset={offset}\n onPageChange={setOffset}\n preferences={preferences}\n {...rest}\n />\n );\n};\n\nexport default GroupList;\n"],"mappings":";;;;;;;;;;;;;;;;;AAuBA,MAAMA,aAAiC,EAAC,QAAQ,IAAI,YAAa,GAAG,WAAwC;CAC1G,MAAM,EAAC,MAAKC,uBAAe,aAAa,KAAK;CAC7C,MAAM,CAAC,QAAQ,aAAa,SAAiB,EAAE;CAC/C,MAAMC,WAA+BC,8BAAsB,SAAS;CACpE,MAAM,EAAC,MAAM,OAAO,cAAqDC,yBACvE,CAAC,eAAe,QAAQ;EAAC;EAAO;EAAO,CAAC,GACvC,YAAY,UAAU;EAAC,GAAG;EAAU;EAAS;EAAO;EAAO,CAAC,CAC9D;AAED,QACE,oBAACC;EACC,QAAQ,MAAM,UAAU,EAAE;EAC1B,cAAc,MAAM;EACT;EACX,OAAO,yBAAyB,GAAG,OAAO,0BAA0B;EAC7D;EACC;EACR,cAAc;EACD;EACb,GAAI;GACJ;;AAIN,wBAAe"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"BaseGroupMembers.d.ts","sourceRoot":"","sources":["../../../../src/components/admin/GroupMembers/BaseGroupMembers.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAC,WAAW,EAAE,eAAe,EAAE,WAAW,EAAC,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAC,EAAE,EAAgB,SAAS,EAAC,MAAM,OAAO,CAAC;AAGlD,OAAkB,EAAC,eAAe,EAAC,MAAM,sCAAsC,CAAC;AAEhF,OAAuB,EAAC,iBAAiB,EAAC,MAAM,0BAA0B,CAAC;AAE3E;;;GAGG;AACH,MAAM,WAAW,2BAA2B;IAC1C;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC;IACnE;;OAEG;IACH,OAAO,EAAE,eAAe,CAAC,WAAW,CAAC,EAAE,CAAC;IACxC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB;;OAEG;IACH,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,MAAM,CAAC,KAAK,IAAI,CAAC;IAC3D;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;CAC1C;AAED,MAAM,WAAW,qBAAqB;IACpC;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,iBAAiB,EAAE,CAAC,CAAC,CAAC;IACnE;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,2BAA2B,KAAK,SAAS,CAAC;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,GAAG,MAAM,CAAC,KAAK,IAAI,CAAC;IAC3D;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;IACzC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,QAAA,MAAM,gBAAgB,EAAE,EAAE,CAAC,qBAAqB,CAiG/C,CAAC;AAEF,eAAe,gBAAgB,CAAC"}