@thunderid/react 1.7.0 → 1.9.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 (497) hide show
  1. package/dist/cjs/components/account/UserProfile/BaseUserProfile.cjs +1 -1
  2. package/dist/cjs/components/admin/AgentCreate/AgentCreate.cjs +15 -4
  3. package/dist/cjs/components/admin/AgentCreate/AgentCreate.cjs.map +1 -1
  4. package/dist/cjs/components/admin/AgentDetails/AgentDetails.cjs +49 -10
  5. package/dist/cjs/components/admin/AgentDetails/AgentDetails.cjs.map +1 -1
  6. package/dist/cjs/components/admin/AgentDetails/BaseAgentDetails.cjs +25 -7
  7. package/dist/cjs/components/admin/AgentDetails/BaseAgentDetails.cjs.map +1 -1
  8. package/dist/cjs/components/admin/AgentList/AgentList.cjs +13 -4
  9. package/dist/cjs/components/admin/AgentList/AgentList.cjs.map +1 -1
  10. package/dist/cjs/components/admin/ApplicationCreate/ApplicationCreate.cjs +70 -0
  11. package/dist/cjs/components/admin/ApplicationCreate/ApplicationCreate.cjs.map +1 -0
  12. package/dist/cjs/components/admin/ApplicationCreate/BaseApplicationCreate.cjs +135 -0
  13. package/dist/cjs/components/admin/ApplicationCreate/BaseApplicationCreate.cjs.map +1 -0
  14. package/dist/cjs/components/admin/ApplicationDetails/ApplicationDetails.cjs +95 -0
  15. package/dist/cjs/components/admin/ApplicationDetails/ApplicationDetails.cjs.map +1 -0
  16. package/dist/cjs/components/admin/ApplicationDetails/BaseApplicationDetails.cjs +255 -0
  17. package/dist/cjs/components/admin/ApplicationDetails/BaseApplicationDetails.cjs.map +1 -0
  18. package/dist/cjs/components/admin/ApplicationList/ApplicationList.cjs +55 -0
  19. package/dist/cjs/components/admin/ApplicationList/ApplicationList.cjs.map +1 -0
  20. package/dist/cjs/components/admin/ApplicationList/BaseApplicationList.cjs +95 -0
  21. package/dist/cjs/components/admin/ApplicationList/BaseApplicationList.cjs.map +1 -0
  22. package/dist/cjs/components/admin/GroupCreate/GroupCreate.cjs +8 -2
  23. package/dist/cjs/components/admin/GroupCreate/GroupCreate.cjs.map +1 -1
  24. package/dist/cjs/components/admin/GroupList/GroupList.cjs +10 -3
  25. package/dist/cjs/components/admin/GroupList/GroupList.cjs.map +1 -1
  26. package/dist/cjs/components/admin/GroupMembers/GroupMembers.cjs +49 -11
  27. package/dist/cjs/components/admin/GroupMembers/GroupMembers.cjs.map +1 -1
  28. package/dist/cjs/components/admin/RoleAssignments/RoleAssignments.cjs +50 -15
  29. package/dist/cjs/components/admin/RoleAssignments/RoleAssignments.cjs.map +1 -1
  30. package/dist/cjs/components/admin/RoleCreate/RoleCreate.cjs +8 -2
  31. package/dist/cjs/components/admin/RoleCreate/RoleCreate.cjs.map +1 -1
  32. package/dist/cjs/components/admin/RoleList/RoleList.cjs +10 -3
  33. package/dist/cjs/components/admin/RoleList/RoleList.cjs.map +1 -1
  34. package/dist/cjs/components/admin/RolePermissions/RolePermissions.cjs +8 -2
  35. package/dist/cjs/components/admin/RolePermissions/RolePermissions.cjs.map +1 -1
  36. package/dist/cjs/components/admin/UserCreate/UserCreate.cjs +15 -4
  37. package/dist/cjs/components/admin/UserCreate/UserCreate.cjs.map +1 -1
  38. package/dist/cjs/components/admin/UserDetails/BaseUserDetails.cjs +32 -14
  39. package/dist/cjs/components/admin/UserDetails/BaseUserDetails.cjs.map +1 -1
  40. package/dist/cjs/components/admin/UserDetails/UserDetails.cjs +45 -10
  41. package/dist/cjs/components/admin/UserDetails/UserDetails.cjs.map +1 -1
  42. package/dist/cjs/components/admin/UserList/UserList.cjs +13 -4
  43. package/dist/cjs/components/admin/UserList/UserList.cjs.map +1 -1
  44. package/dist/cjs/components/admin/shared/AccountLifecycleParts.cjs +105 -0
  45. package/dist/cjs/components/admin/shared/AccountLifecycleParts.cjs.map +1 -0
  46. package/dist/cjs/components/admin/shared/ApplicationFormFields.cjs +62 -0
  47. package/dist/cjs/components/admin/shared/ApplicationFormFields.cjs.map +1 -0
  48. package/dist/cjs/components/admin/shared/ClientSecretNotice.cjs +49 -0
  49. package/dist/cjs/components/admin/shared/ClientSecretNotice.cjs.map +1 -0
  50. package/dist/cjs/components/auth/AcceptInvite/BaseAcceptInvite.cjs +4 -5
  51. package/dist/cjs/components/auth/AcceptInvite/BaseAcceptInvite.cjs.map +1 -1
  52. package/dist/cjs/components/auth/InviteUser/InviteUser.cjs +1 -1
  53. package/dist/cjs/components/auth/SignIn/SignIn.cjs +5 -5
  54. package/dist/cjs/components/auth/SignIn/SignIn.cjs.map +1 -1
  55. package/dist/cjs/components/auth/flow/AuthOptionFactory.cjs +4 -5
  56. package/dist/cjs/components/auth/flow/AuthOptionFactory.cjs.map +1 -1
  57. package/dist/cjs/components/auth/flow/Consent.cjs +53 -28
  58. package/dist/cjs/components/auth/flow/Consent.cjs.map +1 -1
  59. package/dist/cjs/components/auth/flow/ConsentAuthorizationDetail.cjs +104 -0
  60. package/dist/cjs/components/auth/flow/ConsentAuthorizationDetail.cjs.map +1 -0
  61. package/dist/cjs/components/auth/flow/ConsentAuthorizationDetail.styles.cjs +59 -0
  62. package/dist/cjs/components/auth/flow/ConsentAuthorizationDetail.styles.cjs.map +1 -0
  63. package/dist/cjs/components/auth/flow/ConsentDetailField.cjs +171 -0
  64. package/dist/cjs/components/auth/flow/ConsentDetailField.cjs.map +1 -0
  65. package/dist/cjs/components/auth/flow/ConsentDetailField.styles.cjs +85 -0
  66. package/dist/cjs/components/auth/flow/ConsentDetailField.styles.cjs.map +1 -0
  67. package/dist/cjs/components/auth/flow/ConsentDetailText.cjs +63 -0
  68. package/dist/cjs/components/auth/flow/ConsentDetailText.cjs.map +1 -0
  69. package/dist/cjs/components/auth/flow/ConsentDetailText.styles.cjs +83 -0
  70. package/dist/cjs/components/auth/flow/ConsentDetailText.styles.cjs.map +1 -0
  71. package/dist/cjs/components/auth/flow/FieldFactory.cjs +1 -1
  72. package/dist/cjs/components/auth/flow/resolveConsentText.cjs +25 -0
  73. package/dist/cjs/components/auth/flow/resolveConsentText.cjs.map +1 -0
  74. package/dist/cjs/components/primitives/KeyValueInput/KeyValueInput.cjs +1 -1
  75. package/dist/cjs/components/primitives/MultiInput/MultiInput.cjs +1 -1
  76. package/dist/cjs/components/primitives/PasswordField/PasswordField.cjs +1 -1
  77. package/dist/cjs/hooks/auth/useConsentDetailField.cjs +357 -0
  78. package/dist/cjs/hooks/auth/useConsentDetailField.cjs.map +1 -0
  79. package/dist/cjs/hooks/management/useAccountLifecycle.cjs +59 -0
  80. package/dist/cjs/hooks/management/useAccountLifecycle.cjs.map +1 -0
  81. package/dist/cjs/hooks/management/useManagementEndpoint.cjs.map +1 -1
  82. package/dist/cjs/hooks/management/useManagementRequestConfig.cjs +41 -0
  83. package/dist/cjs/hooks/management/useManagementRequestConfig.cjs.map +1 -0
  84. package/dist/cjs/index.cjs +1130 -187
  85. package/dist/cjs/utils/formatConsentDetailValue.cjs +26 -0
  86. package/dist/cjs/utils/formatConsentDetailValue.cjs.map +1 -0
  87. package/dist/cjs/utils/getConsentDetailLayout.cjs +44 -0
  88. package/dist/cjs/utils/getConsentDetailLayout.cjs.map +1 -0
  89. package/dist/cjs/utils/getConsentDetailListDisplay.cjs +30 -0
  90. package/dist/cjs/utils/getConsentDetailListDisplay.cjs.map +1 -0
  91. package/dist/cjs/utils/isConsentApprovalBlocked.cjs +41 -0
  92. package/dist/cjs/utils/isConsentApprovalBlocked.cjs.map +1 -0
  93. package/dist/cjs/utils/isConsentDetailPlainList.cjs +24 -0
  94. package/dist/cjs/utils/isConsentDetailPlainList.cjs.map +1 -0
  95. package/dist/cjs/utils/isConsentDetailStructured.cjs +15 -0
  96. package/dist/cjs/utils/isConsentDetailStructured.cjs.map +1 -0
  97. package/dist/cjs/utils/isConsentDetailTextClamped.cjs +25 -0
  98. package/dist/cjs/utils/isConsentDetailTextClamped.cjs.map +1 -0
  99. package/dist/components/account/UserProfile/BaseUserProfile.js +1 -1
  100. package/dist/components/admin/AgentCreate/AgentCreate.d.ts.map +1 -1
  101. package/dist/components/admin/AgentCreate/AgentCreate.js +16 -5
  102. package/dist/components/admin/AgentCreate/AgentCreate.js.map +1 -1
  103. package/dist/components/admin/AgentDetails/AgentDetails.d.ts +8 -1
  104. package/dist/components/admin/AgentDetails/AgentDetails.d.ts.map +1 -1
  105. package/dist/components/admin/AgentDetails/AgentDetails.js +50 -11
  106. package/dist/components/admin/AgentDetails/AgentDetails.js.map +1 -1
  107. package/dist/components/admin/AgentDetails/BaseAgentDetails.d.ts +21 -1
  108. package/dist/components/admin/AgentDetails/BaseAgentDetails.d.ts.map +1 -1
  109. package/dist/components/admin/AgentDetails/BaseAgentDetails.js +25 -7
  110. package/dist/components/admin/AgentDetails/BaseAgentDetails.js.map +1 -1
  111. package/dist/components/admin/AgentList/AgentList.d.ts.map +1 -1
  112. package/dist/components/admin/AgentList/AgentList.js +14 -5
  113. package/dist/components/admin/AgentList/AgentList.js.map +1 -1
  114. package/dist/components/admin/ApplicationCreate/ApplicationCreate.d.ts +30 -0
  115. package/dist/components/admin/ApplicationCreate/ApplicationCreate.d.ts.map +1 -0
  116. package/dist/components/admin/ApplicationCreate/ApplicationCreate.js +66 -0
  117. package/dist/components/admin/ApplicationCreate/ApplicationCreate.js.map +1 -0
  118. package/dist/components/admin/ApplicationCreate/BaseApplicationCreate.d.ts +80 -0
  119. package/dist/components/admin/ApplicationCreate/BaseApplicationCreate.d.ts.map +1 -0
  120. package/dist/components/admin/ApplicationCreate/BaseApplicationCreate.js +131 -0
  121. package/dist/components/admin/ApplicationCreate/BaseApplicationCreate.js.map +1 -0
  122. package/dist/components/admin/ApplicationDetails/ApplicationDetails.d.ts +64 -0
  123. package/dist/components/admin/ApplicationDetails/ApplicationDetails.d.ts.map +1 -0
  124. package/dist/components/admin/ApplicationDetails/ApplicationDetails.js +92 -0
  125. package/dist/components/admin/ApplicationDetails/ApplicationDetails.js.map +1 -0
  126. package/dist/components/admin/ApplicationDetails/BaseApplicationDetails.d.ts +111 -0
  127. package/dist/components/admin/ApplicationDetails/BaseApplicationDetails.d.ts.map +1 -0
  128. package/dist/components/admin/ApplicationDetails/BaseApplicationDetails.js +251 -0
  129. package/dist/components/admin/ApplicationDetails/BaseApplicationDetails.js.map +1 -0
  130. package/dist/components/admin/ApplicationList/ApplicationList.d.ts +18 -0
  131. package/dist/components/admin/ApplicationList/ApplicationList.d.ts.map +1 -0
  132. package/dist/components/admin/ApplicationList/ApplicationList.js +51 -0
  133. package/dist/components/admin/ApplicationList/ApplicationList.js.map +1 -0
  134. package/dist/components/admin/ApplicationList/BaseApplicationList.d.ts +55 -0
  135. package/dist/components/admin/ApplicationList/BaseApplicationList.d.ts.map +1 -0
  136. package/dist/components/admin/ApplicationList/BaseApplicationList.js +93 -0
  137. package/dist/components/admin/ApplicationList/BaseApplicationList.js.map +1 -0
  138. package/dist/components/admin/GroupCreate/GroupCreate.d.ts.map +1 -1
  139. package/dist/components/admin/GroupCreate/GroupCreate.js +9 -3
  140. package/dist/components/admin/GroupCreate/GroupCreate.js.map +1 -1
  141. package/dist/components/admin/GroupList/GroupList.d.ts.map +1 -1
  142. package/dist/components/admin/GroupList/GroupList.js +11 -4
  143. package/dist/components/admin/GroupList/GroupList.js.map +1 -1
  144. package/dist/components/admin/GroupMembers/GroupMembers.d.ts +7 -0
  145. package/dist/components/admin/GroupMembers/GroupMembers.d.ts.map +1 -1
  146. package/dist/components/admin/GroupMembers/GroupMembers.js +50 -12
  147. package/dist/components/admin/GroupMembers/GroupMembers.js.map +1 -1
  148. package/dist/components/admin/RoleAssignments/RoleAssignments.d.ts +7 -0
  149. package/dist/components/admin/RoleAssignments/RoleAssignments.d.ts.map +1 -1
  150. package/dist/components/admin/RoleAssignments/RoleAssignments.js +51 -16
  151. package/dist/components/admin/RoleAssignments/RoleAssignments.js.map +1 -1
  152. package/dist/components/admin/RoleCreate/RoleCreate.d.ts.map +1 -1
  153. package/dist/components/admin/RoleCreate/RoleCreate.js +9 -3
  154. package/dist/components/admin/RoleCreate/RoleCreate.js.map +1 -1
  155. package/dist/components/admin/RoleList/RoleList.d.ts.map +1 -1
  156. package/dist/components/admin/RoleList/RoleList.js +11 -4
  157. package/dist/components/admin/RoleList/RoleList.js.map +1 -1
  158. package/dist/components/admin/RolePermissions/RolePermissions.d.ts.map +1 -1
  159. package/dist/components/admin/RolePermissions/RolePermissions.js +9 -3
  160. package/dist/components/admin/RolePermissions/RolePermissions.js.map +1 -1
  161. package/dist/components/admin/UserCreate/UserCreate.d.ts.map +1 -1
  162. package/dist/components/admin/UserCreate/UserCreate.js +16 -5
  163. package/dist/components/admin/UserCreate/UserCreate.js.map +1 -1
  164. package/dist/components/admin/UserDetails/BaseUserDetails.d.ts +22 -1
  165. package/dist/components/admin/UserDetails/BaseUserDetails.d.ts.map +1 -1
  166. package/dist/components/admin/UserDetails/BaseUserDetails.js +32 -14
  167. package/dist/components/admin/UserDetails/BaseUserDetails.js.map +1 -1
  168. package/dist/components/admin/UserDetails/UserDetails.d.ts +15 -1
  169. package/dist/components/admin/UserDetails/UserDetails.d.ts.map +1 -1
  170. package/dist/components/admin/UserDetails/UserDetails.js +46 -11
  171. package/dist/components/admin/UserDetails/UserDetails.js.map +1 -1
  172. package/dist/components/admin/UserList/UserList.d.ts.map +1 -1
  173. package/dist/components/admin/UserList/UserList.js +14 -5
  174. package/dist/components/admin/UserList/UserList.js.map +1 -1
  175. package/dist/components/admin/shared/AccountLifecycleParts.d.ts +32 -0
  176. package/dist/components/admin/shared/AccountLifecycleParts.d.ts.map +1 -0
  177. package/dist/components/admin/shared/AccountLifecycleParts.js +101 -0
  178. package/dist/components/admin/shared/AccountLifecycleParts.js.map +1 -0
  179. package/dist/components/admin/shared/ApplicationFormFields.d.ts +35 -0
  180. package/dist/components/admin/shared/ApplicationFormFields.d.ts.map +1 -0
  181. package/dist/components/admin/shared/ApplicationFormFields.js +59 -0
  182. package/dist/components/admin/shared/ApplicationFormFields.js.map +1 -0
  183. package/dist/components/admin/shared/ClientSecretNotice.d.ts +16 -0
  184. package/dist/components/admin/shared/ClientSecretNotice.d.ts.map +1 -0
  185. package/dist/components/admin/shared/ClientSecretNotice.js +47 -0
  186. package/dist/components/admin/shared/ClientSecretNotice.js.map +1 -0
  187. package/dist/components/auth/AcceptInvite/BaseAcceptInvite.d.ts.map +1 -1
  188. package/dist/components/auth/AcceptInvite/BaseAcceptInvite.js +5 -6
  189. package/dist/components/auth/AcceptInvite/BaseAcceptInvite.js.map +1 -1
  190. package/dist/components/auth/InviteUser/InviteUser.js +1 -1
  191. package/dist/components/auth/SignIn/SignIn.d.ts.map +1 -1
  192. package/dist/components/auth/SignIn/SignIn.js +6 -6
  193. package/dist/components/auth/SignIn/SignIn.js.map +1 -1
  194. package/dist/components/auth/flow/AuthOptionFactory.d.ts.map +1 -1
  195. package/dist/components/auth/flow/AuthOptionFactory.js +5 -6
  196. package/dist/components/auth/flow/AuthOptionFactory.js.map +1 -1
  197. package/dist/components/auth/flow/Consent.d.ts +6 -0
  198. package/dist/components/auth/flow/Consent.d.ts.map +1 -1
  199. package/dist/components/auth/flow/Consent.js +54 -29
  200. package/dist/components/auth/flow/Consent.js.map +1 -1
  201. package/dist/components/auth/flow/ConsentAuthorizationDetail.d.ts +68 -0
  202. package/dist/components/auth/flow/ConsentAuthorizationDetail.d.ts.map +1 -0
  203. package/dist/components/auth/flow/ConsentAuthorizationDetail.js +100 -0
  204. package/dist/components/auth/flow/ConsentAuthorizationDetail.js.map +1 -0
  205. package/dist/components/auth/flow/ConsentAuthorizationDetail.styles.d.ts +10 -0
  206. package/dist/components/auth/flow/ConsentAuthorizationDetail.styles.d.ts.map +1 -0
  207. package/dist/components/auth/flow/ConsentAuthorizationDetail.styles.js +57 -0
  208. package/dist/components/auth/flow/ConsentAuthorizationDetail.styles.js.map +1 -0
  209. package/dist/components/auth/flow/ConsentDetailField.d.ts +39 -0
  210. package/dist/components/auth/flow/ConsentDetailField.d.ts.map +1 -0
  211. package/dist/components/auth/flow/ConsentDetailField.js +168 -0
  212. package/dist/components/auth/flow/ConsentDetailField.js.map +1 -0
  213. package/dist/components/auth/flow/ConsentDetailField.styles.d.ts +11 -0
  214. package/dist/components/auth/flow/ConsentDetailField.styles.d.ts.map +1 -0
  215. package/dist/components/auth/flow/ConsentDetailField.styles.js +83 -0
  216. package/dist/components/auth/flow/ConsentDetailField.styles.js.map +1 -0
  217. package/dist/components/auth/flow/ConsentDetailText.d.ts +53 -0
  218. package/dist/components/auth/flow/ConsentDetailText.d.ts.map +1 -0
  219. package/dist/components/auth/flow/ConsentDetailText.js +58 -0
  220. package/dist/components/auth/flow/ConsentDetailText.js.map +1 -0
  221. package/dist/components/auth/flow/ConsentDetailText.styles.d.ts +20 -0
  222. package/dist/components/auth/flow/ConsentDetailText.styles.d.ts.map +1 -0
  223. package/dist/components/auth/flow/ConsentDetailText.styles.js +80 -0
  224. package/dist/components/auth/flow/ConsentDetailText.styles.js.map +1 -0
  225. package/dist/components/auth/flow/FieldFactory.js +1 -1
  226. package/dist/components/auth/flow/resolveConsentText.d.ts +13 -0
  227. package/dist/components/auth/flow/resolveConsentText.d.ts.map +1 -0
  228. package/dist/components/auth/flow/resolveConsentText.js +23 -0
  229. package/dist/components/auth/flow/resolveConsentText.js.map +1 -0
  230. package/dist/components/primitives/KeyValueInput/KeyValueInput.js +1 -1
  231. package/dist/components/primitives/MultiInput/MultiInput.js +1 -1
  232. package/dist/components/primitives/PasswordField/PasswordField.js +1 -1
  233. package/dist/hooks/auth/useConsentDetailField.d.ts +130 -0
  234. package/dist/hooks/auth/useConsentDetailField.d.ts.map +1 -0
  235. package/dist/hooks/auth/useConsentDetailField.js +354 -0
  236. package/dist/hooks/auth/useConsentDetailField.js.map +1 -0
  237. package/dist/hooks/management/useAccountLifecycle.d.ts +49 -0
  238. package/dist/hooks/management/useAccountLifecycle.d.ts.map +1 -0
  239. package/dist/hooks/management/useAccountLifecycle.js +56 -0
  240. package/dist/hooks/management/useAccountLifecycle.js.map +1 -0
  241. package/dist/hooks/management/useManagementEndpoint.d.ts +5 -1
  242. package/dist/hooks/management/useManagementEndpoint.d.ts.map +1 -1
  243. package/dist/hooks/management/useManagementEndpoint.js.map +1 -1
  244. package/dist/hooks/management/useManagementRequestConfig.d.ts +22 -0
  245. package/dist/hooks/management/useManagementRequestConfig.d.ts.map +1 -0
  246. package/dist/hooks/management/useManagementRequestConfig.js +39 -0
  247. package/dist/hooks/management/useManagementRequestConfig.js.map +1 -0
  248. package/dist/index.d.ts +35 -56
  249. package/dist/index.d.ts.map +1 -1
  250. package/dist/index.js +21 -42
  251. package/dist/models/config.d.ts +3 -4
  252. package/dist/models/config.d.ts.map +1 -1
  253. package/dist/utils/formatConsentDetailValue.d.ts +16 -0
  254. package/dist/utils/formatConsentDetailValue.d.ts.map +1 -0
  255. package/dist/utils/formatConsentDetailValue.js +25 -0
  256. package/dist/utils/formatConsentDetailValue.js.map +1 -0
  257. package/dist/utils/getConsentDetailLayout.d.ts +32 -0
  258. package/dist/utils/getConsentDetailLayout.d.ts.map +1 -0
  259. package/dist/utils/getConsentDetailLayout.js +43 -0
  260. package/dist/utils/getConsentDetailLayout.js.map +1 -0
  261. package/dist/utils/getConsentDetailListDisplay.d.ts +30 -0
  262. package/dist/utils/getConsentDetailListDisplay.d.ts.map +1 -0
  263. package/dist/utils/getConsentDetailListDisplay.js +30 -0
  264. package/dist/utils/getConsentDetailListDisplay.js.map +1 -0
  265. package/dist/utils/isConsentApprovalBlocked.d.ts +17 -0
  266. package/dist/utils/isConsentApprovalBlocked.d.ts.map +1 -0
  267. package/dist/utils/isConsentApprovalBlocked.js +39 -0
  268. package/dist/utils/isConsentApprovalBlocked.js.map +1 -0
  269. package/dist/utils/isConsentDetailPlainList.d.ts +15 -0
  270. package/dist/utils/isConsentDetailPlainList.d.ts.map +1 -0
  271. package/dist/utils/isConsentDetailPlainList.js +23 -0
  272. package/dist/utils/isConsentDetailPlainList.js.map +1 -0
  273. package/dist/utils/isConsentDetailStructured.d.ts +10 -0
  274. package/dist/utils/isConsentDetailStructured.d.ts.map +1 -0
  275. package/dist/utils/isConsentDetailStructured.js +14 -0
  276. package/dist/utils/isConsentDetailStructured.js.map +1 -0
  277. package/dist/utils/isConsentDetailTextClamped.d.ts +20 -0
  278. package/dist/utils/isConsentDetailTextClamped.d.ts.map +1 -0
  279. package/dist/utils/isConsentDetailTextClamped.js +24 -0
  280. package/dist/utils/isConsentDetailTextClamped.js.map +1 -0
  281. package/package.json +2 -2
  282. package/dist/cjs/hooks/management/agents/useCreateAgent.cjs +0 -26
  283. package/dist/cjs/hooks/management/agents/useCreateAgent.cjs.map +0 -1
  284. package/dist/cjs/hooks/management/agents/useDeleteAgent.cjs +0 -26
  285. package/dist/cjs/hooks/management/agents/useDeleteAgent.cjs.map +0 -1
  286. package/dist/cjs/hooks/management/agents/useGetAgent.cjs +0 -30
  287. package/dist/cjs/hooks/management/agents/useGetAgent.cjs.map +0 -1
  288. package/dist/cjs/hooks/management/agents/useGetAgentGroups.cjs +0 -41
  289. package/dist/cjs/hooks/management/agents/useGetAgentGroups.cjs.map +0 -1
  290. package/dist/cjs/hooks/management/agents/useGetAgentRoles.cjs +0 -42
  291. package/dist/cjs/hooks/management/agents/useGetAgentRoles.cjs.map +0 -1
  292. package/dist/cjs/hooks/management/agents/useGetAgentTypes.cjs +0 -31
  293. package/dist/cjs/hooks/management/agents/useGetAgentTypes.cjs.map +0 -1
  294. package/dist/cjs/hooks/management/agents/useGetAgents.cjs +0 -33
  295. package/dist/cjs/hooks/management/agents/useGetAgents.cjs.map +0 -1
  296. package/dist/cjs/hooks/management/agents/useUpdateAgent.cjs +0 -27
  297. package/dist/cjs/hooks/management/agents/useUpdateAgent.cjs.map +0 -1
  298. package/dist/cjs/hooks/management/applications/useCreateApplication.cjs +0 -31
  299. package/dist/cjs/hooks/management/applications/useCreateApplication.cjs.map +0 -1
  300. package/dist/cjs/hooks/management/applications/useDeleteApplication.cjs +0 -26
  301. package/dist/cjs/hooks/management/applications/useDeleteApplication.cjs.map +0 -1
  302. package/dist/cjs/hooks/management/applications/useGetApplication.cjs +0 -35
  303. package/dist/cjs/hooks/management/applications/useGetApplication.cjs.map +0 -1
  304. package/dist/cjs/hooks/management/applications/useGetApplications.cjs +0 -36
  305. package/dist/cjs/hooks/management/applications/useGetApplications.cjs.map +0 -1
  306. package/dist/cjs/hooks/management/applications/useUpdateApplication.cjs +0 -27
  307. package/dist/cjs/hooks/management/applications/useUpdateApplication.cjs.map +0 -1
  308. package/dist/cjs/hooks/management/groups/useAddGroupMembers.cjs +0 -32
  309. package/dist/cjs/hooks/management/groups/useAddGroupMembers.cjs.map +0 -1
  310. package/dist/cjs/hooks/management/groups/useCreateGroup.cjs +0 -26
  311. package/dist/cjs/hooks/management/groups/useCreateGroup.cjs.map +0 -1
  312. package/dist/cjs/hooks/management/groups/useDeleteGroup.cjs +0 -30
  313. package/dist/cjs/hooks/management/groups/useDeleteGroup.cjs.map +0 -1
  314. package/dist/cjs/hooks/management/groups/useGetGroup.cjs +0 -30
  315. package/dist/cjs/hooks/management/groups/useGetGroup.cjs.map +0 -1
  316. package/dist/cjs/hooks/management/groups/useGetGroupMembers.cjs +0 -40
  317. package/dist/cjs/hooks/management/groups/useGetGroupMembers.cjs.map +0 -1
  318. package/dist/cjs/hooks/management/groups/useGetGroups.cjs +0 -31
  319. package/dist/cjs/hooks/management/groups/useGetGroups.cjs.map +0 -1
  320. package/dist/cjs/hooks/management/groups/useRemoveGroupMembers.cjs +0 -32
  321. package/dist/cjs/hooks/management/groups/useRemoveGroupMembers.cjs.map +0 -1
  322. package/dist/cjs/hooks/management/groups/useUpdateGroup.cjs +0 -31
  323. package/dist/cjs/hooks/management/groups/useUpdateGroup.cjs.map +0 -1
  324. package/dist/cjs/hooks/management/roles/useAddRoleAssignments.cjs +0 -27
  325. package/dist/cjs/hooks/management/roles/useAddRoleAssignments.cjs.map +0 -1
  326. package/dist/cjs/hooks/management/roles/useCreateRole.cjs +0 -26
  327. package/dist/cjs/hooks/management/roles/useCreateRole.cjs.map +0 -1
  328. package/dist/cjs/hooks/management/roles/useDeleteRole.cjs +0 -26
  329. package/dist/cjs/hooks/management/roles/useDeleteRole.cjs.map +0 -1
  330. package/dist/cjs/hooks/management/roles/useGetRole.cjs +0 -30
  331. package/dist/cjs/hooks/management/roles/useGetRole.cjs.map +0 -1
  332. package/dist/cjs/hooks/management/roles/useGetRoleAssignments.cjs +0 -42
  333. package/dist/cjs/hooks/management/roles/useGetRoleAssignments.cjs.map +0 -1
  334. package/dist/cjs/hooks/management/roles/useGetRoles.cjs +0 -31
  335. package/dist/cjs/hooks/management/roles/useGetRoles.cjs.map +0 -1
  336. package/dist/cjs/hooks/management/roles/useRemoveRoleAssignments.cjs +0 -27
  337. package/dist/cjs/hooks/management/roles/useRemoveRoleAssignments.cjs.map +0 -1
  338. package/dist/cjs/hooks/management/roles/useUpdateRole.cjs +0 -27
  339. package/dist/cjs/hooks/management/roles/useUpdateRole.cjs.map +0 -1
  340. package/dist/cjs/hooks/management/users/useCreateUser.cjs +0 -26
  341. package/dist/cjs/hooks/management/users/useCreateUser.cjs.map +0 -1
  342. package/dist/cjs/hooks/management/users/useDeleteUser.cjs +0 -26
  343. package/dist/cjs/hooks/management/users/useDeleteUser.cjs.map +0 -1
  344. package/dist/cjs/hooks/management/users/useGetUser.cjs +0 -30
  345. package/dist/cjs/hooks/management/users/useGetUser.cjs.map +0 -1
  346. package/dist/cjs/hooks/management/users/useGetUserGroups.cjs +0 -41
  347. package/dist/cjs/hooks/management/users/useGetUserGroups.cjs.map +0 -1
  348. package/dist/cjs/hooks/management/users/useGetUserTypes.cjs +0 -31
  349. package/dist/cjs/hooks/management/users/useGetUserTypes.cjs.map +0 -1
  350. package/dist/cjs/hooks/management/users/useGetUsers.cjs +0 -38
  351. package/dist/cjs/hooks/management/users/useGetUsers.cjs.map +0 -1
  352. package/dist/cjs/hooks/management/users/useUpdateUser.cjs +0 -27
  353. package/dist/cjs/hooks/management/users/useUpdateUser.cjs.map +0 -1
  354. package/dist/hooks/management/agents/useCreateAgent.d.ts +0 -11
  355. package/dist/hooks/management/agents/useCreateAgent.d.ts.map +0 -1
  356. package/dist/hooks/management/agents/useCreateAgent.js +0 -24
  357. package/dist/hooks/management/agents/useCreateAgent.js.map +0 -1
  358. package/dist/hooks/management/agents/useDeleteAgent.d.ts +0 -10
  359. package/dist/hooks/management/agents/useDeleteAgent.d.ts.map +0 -1
  360. package/dist/hooks/management/agents/useDeleteAgent.js +0 -24
  361. package/dist/hooks/management/agents/useDeleteAgent.js.map +0 -1
  362. package/dist/hooks/management/agents/useGetAgent.d.ts +0 -12
  363. package/dist/hooks/management/agents/useGetAgent.d.ts.map +0 -1
  364. package/dist/hooks/management/agents/useGetAgent.js +0 -28
  365. package/dist/hooks/management/agents/useGetAgent.js.map +0 -1
  366. package/dist/hooks/management/agents/useGetAgentGroups.d.ts +0 -16
  367. package/dist/hooks/management/agents/useGetAgentGroups.d.ts.map +0 -1
  368. package/dist/hooks/management/agents/useGetAgentGroups.js +0 -39
  369. package/dist/hooks/management/agents/useGetAgentGroups.js.map +0 -1
  370. package/dist/hooks/management/agents/useGetAgentRoles.d.ts +0 -17
  371. package/dist/hooks/management/agents/useGetAgentRoles.d.ts.map +0 -1
  372. package/dist/hooks/management/agents/useGetAgentRoles.js +0 -40
  373. package/dist/hooks/management/agents/useGetAgentRoles.js.map +0 -1
  374. package/dist/hooks/management/agents/useGetAgentTypes.d.ts +0 -15
  375. package/dist/hooks/management/agents/useGetAgentTypes.d.ts.map +0 -1
  376. package/dist/hooks/management/agents/useGetAgentTypes.js +0 -29
  377. package/dist/hooks/management/agents/useGetAgentTypes.js.map +0 -1
  378. package/dist/hooks/management/agents/useGetAgents.d.ts +0 -23
  379. package/dist/hooks/management/agents/useGetAgents.d.ts.map +0 -1
  380. package/dist/hooks/management/agents/useGetAgents.js +0 -31
  381. package/dist/hooks/management/agents/useGetAgents.js.map +0 -1
  382. package/dist/hooks/management/agents/useUpdateAgent.d.ts +0 -18
  383. package/dist/hooks/management/agents/useUpdateAgent.d.ts.map +0 -1
  384. package/dist/hooks/management/agents/useUpdateAgent.js +0 -25
  385. package/dist/hooks/management/agents/useUpdateAgent.js.map +0 -1
  386. package/dist/hooks/management/applications/useCreateApplication.d.ts +0 -16
  387. package/dist/hooks/management/applications/useCreateApplication.d.ts.map +0 -1
  388. package/dist/hooks/management/applications/useCreateApplication.js +0 -29
  389. package/dist/hooks/management/applications/useCreateApplication.js.map +0 -1
  390. package/dist/hooks/management/applications/useDeleteApplication.d.ts +0 -10
  391. package/dist/hooks/management/applications/useDeleteApplication.d.ts.map +0 -1
  392. package/dist/hooks/management/applications/useDeleteApplication.js +0 -24
  393. package/dist/hooks/management/applications/useDeleteApplication.js.map +0 -1
  394. package/dist/hooks/management/applications/useGetApplication.d.ts +0 -17
  395. package/dist/hooks/management/applications/useGetApplication.d.ts.map +0 -1
  396. package/dist/hooks/management/applications/useGetApplication.js +0 -33
  397. package/dist/hooks/management/applications/useGetApplication.js.map +0 -1
  398. package/dist/hooks/management/applications/useGetApplications.d.ts +0 -24
  399. package/dist/hooks/management/applications/useGetApplications.d.ts.map +0 -1
  400. package/dist/hooks/management/applications/useGetApplications.js +0 -34
  401. package/dist/hooks/management/applications/useGetApplications.js.map +0 -1
  402. package/dist/hooks/management/applications/useUpdateApplication.d.ts +0 -18
  403. package/dist/hooks/management/applications/useUpdateApplication.d.ts.map +0 -1
  404. package/dist/hooks/management/applications/useUpdateApplication.js +0 -25
  405. package/dist/hooks/management/applications/useUpdateApplication.js.map +0 -1
  406. package/dist/hooks/management/groups/useAddGroupMembers.d.ts +0 -24
  407. package/dist/hooks/management/groups/useAddGroupMembers.d.ts.map +0 -1
  408. package/dist/hooks/management/groups/useAddGroupMembers.js +0 -30
  409. package/dist/hooks/management/groups/useAddGroupMembers.js.map +0 -1
  410. package/dist/hooks/management/groups/useCreateGroup.d.ts +0 -11
  411. package/dist/hooks/management/groups/useCreateGroup.d.ts.map +0 -1
  412. package/dist/hooks/management/groups/useCreateGroup.js +0 -24
  413. package/dist/hooks/management/groups/useCreateGroup.js.map +0 -1
  414. package/dist/hooks/management/groups/useDeleteGroup.d.ts +0 -10
  415. package/dist/hooks/management/groups/useDeleteGroup.d.ts.map +0 -1
  416. package/dist/hooks/management/groups/useDeleteGroup.js +0 -28
  417. package/dist/hooks/management/groups/useDeleteGroup.js.map +0 -1
  418. package/dist/hooks/management/groups/useGetGroup.d.ts +0 -12
  419. package/dist/hooks/management/groups/useGetGroup.d.ts.map +0 -1
  420. package/dist/hooks/management/groups/useGetGroup.js +0 -28
  421. package/dist/hooks/management/groups/useGetGroup.js.map +0 -1
  422. package/dist/hooks/management/groups/useGetGroupMembers.d.ts +0 -20
  423. package/dist/hooks/management/groups/useGetGroupMembers.d.ts.map +0 -1
  424. package/dist/hooks/management/groups/useGetGroupMembers.js +0 -38
  425. package/dist/hooks/management/groups/useGetGroupMembers.js.map +0 -1
  426. package/dist/hooks/management/groups/useGetGroups.d.ts +0 -19
  427. package/dist/hooks/management/groups/useGetGroups.d.ts.map +0 -1
  428. package/dist/hooks/management/groups/useGetGroups.js +0 -29
  429. package/dist/hooks/management/groups/useGetGroups.js.map +0 -1
  430. package/dist/hooks/management/groups/useRemoveGroupMembers.d.ts +0 -12
  431. package/dist/hooks/management/groups/useRemoveGroupMembers.d.ts.map +0 -1
  432. package/dist/hooks/management/groups/useRemoveGroupMembers.js +0 -30
  433. package/dist/hooks/management/groups/useRemoveGroupMembers.js.map +0 -1
  434. package/dist/hooks/management/groups/useUpdateGroup.d.ts +0 -24
  435. package/dist/hooks/management/groups/useUpdateGroup.d.ts.map +0 -1
  436. package/dist/hooks/management/groups/useUpdateGroup.js +0 -29
  437. package/dist/hooks/management/groups/useUpdateGroup.js.map +0 -1
  438. package/dist/hooks/management/roles/useAddRoleAssignments.d.ts +0 -24
  439. package/dist/hooks/management/roles/useAddRoleAssignments.d.ts.map +0 -1
  440. package/dist/hooks/management/roles/useAddRoleAssignments.js +0 -25
  441. package/dist/hooks/management/roles/useAddRoleAssignments.js.map +0 -1
  442. package/dist/hooks/management/roles/useCreateRole.d.ts +0 -11
  443. package/dist/hooks/management/roles/useCreateRole.d.ts.map +0 -1
  444. package/dist/hooks/management/roles/useCreateRole.js +0 -24
  445. package/dist/hooks/management/roles/useCreateRole.js.map +0 -1
  446. package/dist/hooks/management/roles/useDeleteRole.d.ts +0 -10
  447. package/dist/hooks/management/roles/useDeleteRole.d.ts.map +0 -1
  448. package/dist/hooks/management/roles/useDeleteRole.js +0 -24
  449. package/dist/hooks/management/roles/useDeleteRole.js.map +0 -1
  450. package/dist/hooks/management/roles/useGetRole.d.ts +0 -12
  451. package/dist/hooks/management/roles/useGetRole.d.ts.map +0 -1
  452. package/dist/hooks/management/roles/useGetRole.js +0 -28
  453. package/dist/hooks/management/roles/useGetRole.js.map +0 -1
  454. package/dist/hooks/management/roles/useGetRoleAssignments.d.ts +0 -24
  455. package/dist/hooks/management/roles/useGetRoleAssignments.d.ts.map +0 -1
  456. package/dist/hooks/management/roles/useGetRoleAssignments.js +0 -40
  457. package/dist/hooks/management/roles/useGetRoleAssignments.js.map +0 -1
  458. package/dist/hooks/management/roles/useGetRoles.d.ts +0 -19
  459. package/dist/hooks/management/roles/useGetRoles.d.ts.map +0 -1
  460. package/dist/hooks/management/roles/useGetRoles.js +0 -29
  461. package/dist/hooks/management/roles/useGetRoles.js.map +0 -1
  462. package/dist/hooks/management/roles/useRemoveRoleAssignments.d.ts +0 -11
  463. package/dist/hooks/management/roles/useRemoveRoleAssignments.d.ts.map +0 -1
  464. package/dist/hooks/management/roles/useRemoveRoleAssignments.js +0 -25
  465. package/dist/hooks/management/roles/useRemoveRoleAssignments.js.map +0 -1
  466. package/dist/hooks/management/roles/useUpdateRole.d.ts +0 -24
  467. package/dist/hooks/management/roles/useUpdateRole.d.ts.map +0 -1
  468. package/dist/hooks/management/roles/useUpdateRole.js +0 -25
  469. package/dist/hooks/management/roles/useUpdateRole.js.map +0 -1
  470. package/dist/hooks/management/users/useCreateUser.d.ts +0 -11
  471. package/dist/hooks/management/users/useCreateUser.d.ts.map +0 -1
  472. package/dist/hooks/management/users/useCreateUser.js +0 -24
  473. package/dist/hooks/management/users/useCreateUser.js.map +0 -1
  474. package/dist/hooks/management/users/useDeleteUser.d.ts +0 -10
  475. package/dist/hooks/management/users/useDeleteUser.d.ts.map +0 -1
  476. package/dist/hooks/management/users/useDeleteUser.js +0 -24
  477. package/dist/hooks/management/users/useDeleteUser.js.map +0 -1
  478. package/dist/hooks/management/users/useGetUser.d.ts +0 -12
  479. package/dist/hooks/management/users/useGetUser.d.ts.map +0 -1
  480. package/dist/hooks/management/users/useGetUser.js +0 -28
  481. package/dist/hooks/management/users/useGetUser.js.map +0 -1
  482. package/dist/hooks/management/users/useGetUserGroups.d.ts +0 -16
  483. package/dist/hooks/management/users/useGetUserGroups.d.ts.map +0 -1
  484. package/dist/hooks/management/users/useGetUserGroups.js +0 -39
  485. package/dist/hooks/management/users/useGetUserGroups.js.map +0 -1
  486. package/dist/hooks/management/users/useGetUserTypes.d.ts +0 -15
  487. package/dist/hooks/management/users/useGetUserTypes.d.ts.map +0 -1
  488. package/dist/hooks/management/users/useGetUserTypes.js +0 -29
  489. package/dist/hooks/management/users/useGetUserTypes.js.map +0 -1
  490. package/dist/hooks/management/users/useGetUsers.d.ts +0 -17
  491. package/dist/hooks/management/users/useGetUsers.d.ts.map +0 -1
  492. package/dist/hooks/management/users/useGetUsers.js +0 -36
  493. package/dist/hooks/management/users/useGetUsers.js.map +0 -1
  494. package/dist/hooks/management/users/useUpdateUser.d.ts +0 -18
  495. package/dist/hooks/management/users/useUpdateUser.d.ts.map +0 -1
  496. package/dist/hooks/management/users/useUpdateUser.js +0 -25
  497. package/dist/hooks/management/users/useUpdateUser.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"RolePermissions.d.ts","sourceRoot":"","sources":["../../../../src/components/admin/RolePermissions/RolePermissions.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAC,EAAE,EAAe,MAAM,OAAO,CAAC;AACvC,OAA4B,EAAC,wBAAwB,EAAC,MAAM,uBAAuB,CAAC;AAIpF,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC,wBAAwB,EAAE,OAAO,GAAG,WAAW,GAAG,aAAa,CAAC,GAAG;IACzG,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;;;;;GAOG;AACH,QAAA,MAAM,eAAe,EAAE,EAAE,CAAC,oBAAoB,CAiB7C,CAAC;AAEF,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"RolePermissions.d.ts","sourceRoot":"","sources":["../../../../src/components/admin/RolePermissions/RolePermissions.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAC,EAAE,EAAe,MAAM,OAAO,CAAC;AACvC,OAA4B,EAAC,wBAAwB,EAAC,MAAM,uBAAuB,CAAC;AAKpF,MAAM,MAAM,oBAAoB,GAAG,IAAI,CAAC,wBAAwB,EAAE,OAAO,GAAG,WAAW,GAAG,aAAa,CAAC,GAAG;IACzG,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;;;;;GAOG;AACH,QAAA,MAAM,eAAe,EAAE,EAAE,CAAC,oBAAoB,CAsB7C,CAAC;AAEF,eAAe,eAAe,CAAC"}
@@ -1,7 +1,8 @@
1
1
  import useTranslation_default from "../../../hooks/useTranslation.js";
2
- import useGetRole_default from "../../../hooks/management/roles/useGetRole.js";
2
+ import useManagementEndpoint_default from "../../../hooks/management/useManagementEndpoint.js";
3
+ import useResourceQuery_default from "../../../hooks/management/useResourceQuery.js";
3
4
  import BaseRolePermissions_default from "./BaseRolePermissions.js";
4
- import { toManagementErrorMessage } from "@thunderid/browser";
5
+ import { RoleQueryKeys, getRole, toManagementErrorMessage } from "@thunderid/browser";
5
6
  import { jsx } from "react/jsx-runtime";
6
7
 
7
8
  //#region src/components/admin/RolePermissions/RolePermissions.tsx
@@ -15,7 +16,12 @@ import { jsx } from "react/jsx-runtime";
15
16
  */
16
17
  const RolePermissions = ({ preferences, roleId,...rest }) => {
17
18
  const { t } = useTranslation_default(preferences?.i18n);
18
- const role = useGetRole_default(roleId);
19
+ const endpoint = useManagementEndpoint_default("roles");
20
+ const role = useResourceQuery_default([RoleQueryKeys.ROLE, roleId], (fetcher) => getRole({
21
+ ...endpoint,
22
+ fetcher,
23
+ roleId
24
+ }), { enabled: Boolean(roleId) });
19
25
  return /* @__PURE__ */ jsx(BaseRolePermissions_default, {
20
26
  permissions: role.data?.permissions ?? [],
21
27
  isLoading: role.isLoading,
@@ -1 +1 @@
1
- {"version":3,"file":"RolePermissions.js","names":["RolePermissions: FC<RolePermissionsProps>","useTranslation","useGetRole","BaseRolePermissions"],"sources":["../../../../src/components/admin/RolePermissions/RolePermissions.tsx"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {toManagementErrorMessage} from '@thunderid/browser';\nimport {FC, ReactElement} from 'react';\nimport BaseRolePermissions, {BaseRolePermissionsProps} from './BaseRolePermissions';\nimport useGetRole from '../../../hooks/management/roles/useGetRole';\nimport useTranslation from '../../../hooks/useTranslation';\n\nexport type RolePermissionsProps = Omit<BaseRolePermissionsProps, 'error' | 'isLoading' | 'permissions'> & {\n roleId: string;\n};\n\n/**\n * Shows the permissions a role grants.\n *\n * @example\n * ```tsx\n * <RolePermissions roleId={roleId} />\n * ```\n */\nconst RolePermissions: FC<RolePermissionsProps> = ({\n preferences,\n roleId,\n ...rest\n}: RolePermissionsProps): ReactElement => {\n const {t} = useTranslation(preferences?.i18n);\n const role = useGetRole(roleId);\n\n return (\n <BaseRolePermissions\n permissions={role.data?.permissions ?? []}\n isLoading={role.isLoading}\n error={toManagementErrorMessage(t, role.error, 'admin.roles.permissions.error')}\n preferences={preferences}\n {...rest}\n />\n );\n};\n\nexport default RolePermissions;\n"],"mappings":";;;;;;;;;;;;;;;AAqBA,MAAMA,mBAA6C,EACjD,aACA,OACA,GAAG,WACqC;CACxC,MAAM,EAAC,MAAKC,uBAAe,aAAa,KAAK;CAC7C,MAAM,OAAOC,mBAAW,OAAO;AAE/B,QACE,oBAACC;EACC,aAAa,KAAK,MAAM,eAAe,EAAE;EACzC,WAAW,KAAK;EAChB,OAAO,yBAAyB,GAAG,KAAK,OAAO,gCAAgC;EAClE;EACb,GAAI;GACJ;;AAIN,8BAAe"}
1
+ {"version":3,"file":"RolePermissions.js","names":["RolePermissions: FC<RolePermissionsProps>","useTranslation","endpoint: ManagementEndpoint","useManagementEndpoint","role: ResourceQueryResult<Role>","useResourceQuery","BaseRolePermissions"],"sources":["../../../../src/components/admin/RolePermissions/RolePermissions.tsx"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {Role, RoleQueryKeys, getRole, toManagementErrorMessage} from '@thunderid/browser';\nimport {FC, ReactElement} from 'react';\nimport BaseRolePermissions, {BaseRolePermissionsProps} from './BaseRolePermissions';\nimport useManagementEndpoint, {ManagementEndpoint} from '../../../hooks/management/useManagementEndpoint';\nimport useResourceQuery, {ResourceQueryResult} from '../../../hooks/management/useResourceQuery';\nimport useTranslation from '../../../hooks/useTranslation';\n\nexport type RolePermissionsProps = Omit<BaseRolePermissionsProps, 'error' | 'isLoading' | 'permissions'> & {\n roleId: string;\n};\n\n/**\n * Shows the permissions a role grants.\n *\n * @example\n * ```tsx\n * <RolePermissions roleId={roleId} />\n * ```\n */\nconst RolePermissions: FC<RolePermissionsProps> = ({\n preferences,\n roleId,\n ...rest\n}: RolePermissionsProps): ReactElement => {\n const {t} = useTranslation(preferences?.i18n);\n const endpoint: ManagementEndpoint = useManagementEndpoint('roles');\n const role: ResourceQueryResult<Role> = useResourceQuery(\n [RoleQueryKeys.ROLE, roleId],\n (fetcher) => getRole({...endpoint, fetcher, roleId}),\n {enabled: Boolean(roleId)},\n );\n\n return (\n <BaseRolePermissions\n permissions={role.data?.permissions ?? []}\n isLoading={role.isLoading}\n error={toManagementErrorMessage(t, role.error, 'admin.roles.permissions.error')}\n preferences={preferences}\n {...rest}\n />\n );\n};\n\nexport default RolePermissions;\n"],"mappings":";;;;;;;;;;;;;;;;AAsBA,MAAMA,mBAA6C,EACjD,aACA,OACA,GAAG,WACqC;CACxC,MAAM,EAAC,MAAKC,uBAAe,aAAa,KAAK;CAC7C,MAAMC,WAA+BC,8BAAsB,QAAQ;CACnE,MAAMC,OAAkCC,yBACtC,CAAC,cAAc,MAAM,OAAO,GAC3B,YAAY,QAAQ;EAAC,GAAG;EAAU;EAAS;EAAO,CAAC,EACpD,EAAC,SAAS,QAAQ,OAAO,EAAC,CAC3B;AAED,QACE,oBAACC;EACC,aAAa,KAAK,MAAM,eAAe,EAAE;EACzC,WAAW,KAAK;EAChB,OAAO,yBAAyB,GAAG,KAAK,OAAO,gCAAgC;EAClE;EACb,GAAI;GACJ;;AAIN,8BAAe"}
@@ -1 +1 @@
1
- {"version":3,"file":"UserCreate.d.ts","sourceRoot":"","sources":["../../../../src/components/admin/UserCreate/UserCreate.tsx"],"names":[],"mappings":"AAGA,OAAO,EAA2B,WAAW,EAAgC,MAAM,oBAAoB,CAAC;AACxG,OAAO,EAAC,EAAE,EAAwB,MAAM,OAAO,CAAC;AAChD,OAAuB,EAAC,mBAAmB,EAAuB,MAAM,kBAAkB,CAAC;AAI3F,OAAmB,EAAC,eAAe,EAAC,MAAM,kCAAkC,CAAC;AAG7E,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,mBAAmB,EAAE,OAAO,GAAG,cAAc,GAAG,UAAU,GAAG,WAAW,CAAC,GAAG;IAC7G;;OAEG;IACH,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IACxB;;;OAGG;IACH,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAC;IACxC;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF;;;;;;;;;GASG;AACH,QAAA,MAAM,UAAU,EAAE,EAAE,CAAC,eAAe,CA8CnC,CAAC;AAEF,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"UserCreate.d.ts","sourceRoot":"","sources":["../../../../src/components/admin/UserCreate/UserCreate.tsx"],"names":[],"mappings":"AAGA,OAAO,EAEL,WAAW,EAQZ,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAC,EAAE,EAAwB,MAAM,OAAO,CAAC;AAChD,OAAuB,EAAC,mBAAmB,EAAuB,MAAM,kBAAkB,CAAC;AAK3F,OAAmB,EAAC,eAAe,EAAC,MAAM,kCAAkC,CAAC;AAG7E,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,mBAAmB,EAAE,OAAO,GAAG,cAAc,GAAG,UAAU,GAAG,WAAW,CAAC,GAAG;IAC7G;;OAEG;IACH,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B;;;;;;OAMG;IACH,IAAI,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC;IACxB;;;OAGG;IACH,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,CAAC;IACxC;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF;;;;;;;;;GASG;AACH,QAAA,MAAM,UAAU,EAAE,EAAE,CAAC,eAAe,CAwDnC,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -1,10 +1,11 @@
1
1
  import useTranslation_default from "../../../hooks/useTranslation.js";
2
- import useCreateUser_default from "../../../hooks/management/users/useCreateUser.js";
3
- import useGetUserTypes_default from "../../../hooks/management/users/useGetUserTypes.js";
2
+ import useManagementEndpoint_default from "../../../hooks/management/useManagementEndpoint.js";
3
+ import useResourceQuery_default from "../../../hooks/management/useResourceQuery.js";
4
4
  import InviteUser_default from "../../auth/InviteUser/InviteUser.js";
5
5
  import BaseUserCreate_default from "./BaseUserCreate.js";
6
+ import useResourceMutation_default from "../../../hooks/management/useResourceMutation.js";
6
7
  import useDefaultOuId_default from "../shared/useDefaultOuId.js";
7
- import { toManagementErrorMessage } from "@thunderid/browser";
8
+ import { UserQueryKeys, createUser, getUserTypes, toManagementErrorMessage } from "@thunderid/browser";
8
9
  import { useMemo } from "react";
9
10
  import { jsx } from "react/jsx-runtime";
10
11
 
@@ -22,8 +23,18 @@ import { jsx } from "react/jsx-runtime";
22
23
  const UserCreate = ({ inviteProps, mode = "api", onCreated, ouId, preferences,...rest }) => {
23
24
  const { t } = useTranslation_default(preferences?.i18n);
24
25
  const resolvedOuId = useDefaultOuId_default(ouId);
25
- const { data: userTypes } = useGetUserTypes_default({ limit: 100 }, { enabled: mode === "api" });
26
- const { error, isLoading, mutate } = useCreateUser_default({ onSuccess: onCreated });
26
+ const usersEndpoint = useManagementEndpoint_default("users");
27
+ const userTypesEndpoint = useManagementEndpoint_default("userTypes");
28
+ const { data: userTypes } = useResourceQuery_default([UserQueryKeys.USER_TYPES, { limit: 100 }], (fetcher) => getUserTypes({
29
+ ...userTypesEndpoint,
30
+ fetcher,
31
+ limit: 100
32
+ }), { enabled: mode === "api" });
33
+ const { error, isLoading, mutate } = useResourceMutation_default((payload, fetcher) => createUser({
34
+ ...usersEndpoint,
35
+ fetcher,
36
+ payload
37
+ }), () => [[UserQueryKeys.USERS]], { onSuccess: onCreated });
27
38
  const options = useMemo(() => (userTypes?.types ?? []).map((userType) => ({
28
39
  label: userType.displayName ?? userType.handle,
29
40
  value: userType.handle
@@ -1 +1 @@
1
- {"version":3,"file":"UserCreate.js","names":["UserCreate: FC<UserCreateProps>","useTranslation","resolvedOuId: string | undefined","useDefaultOuId","useGetUserTypes","useCreateUser","options: SelectOption[]","InviteUser","BaseUserCreate"],"sources":["../../../../src/components/admin/UserCreate/UserCreate.tsx"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {toManagementErrorMessage, ManagedUser, ManagedUserType, SelectOption} from '@thunderid/browser';\nimport {FC, ReactElement, useMemo} from 'react';\nimport BaseUserCreate, {BaseUserCreateProps, UserCreateSubmission} from './BaseUserCreate';\nimport useCreateUser from '../../../hooks/management/users/useCreateUser';\nimport useGetUserTypes from '../../../hooks/management/users/useGetUserTypes';\nimport useTranslation from '../../../hooks/useTranslation';\nimport InviteUser, {InviteUserProps} from '../../auth/InviteUser/InviteUser';\nimport useDefaultOuId from '../shared/useDefaultOuId';\n\nexport type UserCreateProps = Omit<BaseUserCreateProps, 'error' | 'isSubmitting' | 'onSubmit' | 'userTypes'> & {\n /**\n * Props passed to `InviteUser` when `mode` is `invite`.\n */\n inviteProps?: InviteUserProps;\n /**\n * How the user is added.\n * - `api` creates the user directly through the management API.\n * - `invite` runs the invite user flow, which asks the person to finish setting up their account.\n * Only available where flows run.\n * @default 'api'\n */\n mode?: 'api' | 'invite';\n /**\n * Called with the created user. Not called in `invite` mode, where the flow reports progress\n * through `inviteProps.onFlowChange`.\n */\n onCreated?: (user: ManagedUser) => void;\n /**\n * Organization unit the user is created in. Defaults to the signed-in user's organization unit.\n */\n ouId?: string;\n};\n\n/**\n * Adds a user, either directly through the management API or by inviting them through the invite\n * user flow.\n *\n * @example\n * ```tsx\n * <UserCreate onCreated={(user) => navigate(`/users/${user.id}`)} />\n * <UserCreate mode=\"invite\" />\n * ```\n */\nconst UserCreate: FC<UserCreateProps> = ({\n inviteProps,\n mode = 'api',\n onCreated,\n ouId,\n preferences,\n ...rest\n}: UserCreateProps): ReactElement => {\n const {t} = useTranslation(preferences?.i18n);\n const resolvedOuId: string | undefined = useDefaultOuId(ouId);\n const {data: userTypes} = useGetUserTypes({limit: 100}, {enabled: mode === 'api'});\n const {error, isLoading, mutate} = useCreateUser({onSuccess: onCreated});\n\n const options: SelectOption[] = useMemo(\n () =>\n (userTypes?.types ?? []).map((userType: ManagedUserType) => ({\n label: userType.displayName ?? userType.handle,\n value: userType.handle,\n })),\n [userTypes],\n );\n\n if (mode === 'invite') {\n return <InviteUser {...inviteProps} />;\n }\n\n const handleSubmit = ({attributes, type}: UserCreateSubmission): void => {\n if (!resolvedOuId) {\n return;\n }\n\n void mutate({attributes, ouId: resolvedOuId, type});\n };\n\n return (\n <BaseUserCreate\n userTypes={options}\n onSubmit={handleSubmit}\n isSubmitting={isLoading}\n error={\n resolvedOuId ? toManagementErrorMessage(t, error, 'admin.users.create.error') : t('admin.common.errors.no_ou')\n }\n preferences={preferences}\n {...rest}\n />\n );\n};\n\nexport default UserCreate;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AA8CA,MAAMA,cAAmC,EACvC,aACA,OAAO,OACP,WACA,MACA,YACA,GAAG,WACgC;CACnC,MAAM,EAAC,MAAKC,uBAAe,aAAa,KAAK;CAC7C,MAAMC,eAAmCC,uBAAe,KAAK;CAC7D,MAAM,EAAC,MAAM,cAAaC,wBAAgB,EAAC,OAAO,KAAI,EAAE,EAAC,SAAS,SAAS,OAAM,CAAC;CAClF,MAAM,EAAC,OAAO,WAAW,WAAUC,sBAAc,EAAC,WAAW,WAAU,CAAC;CAExE,MAAMC,UAA0B,eAE3B,WAAW,SAAS,EAAE,EAAE,KAAK,cAA+B;EAC3D,OAAO,SAAS,eAAe,SAAS;EACxC,OAAO,SAAS;EACjB,EAAE,EACL,CAAC,UAAU,CACZ;AAED,KAAI,SAAS,SACX,QAAO,oBAACC,sBAAW,GAAI,cAAe;CAGxC,MAAM,gBAAgB,EAAC,YAAY,WAAsC;AACvE,MAAI,CAAC,aACH;AAGF,EAAK,OAAO;GAAC;GAAY,MAAM;GAAc;GAAK,CAAC;;AAGrD,QACE,oBAACC;EACC,WAAW;EACX,UAAU;EACV,cAAc;EACd,OACE,eAAe,yBAAyB,GAAG,OAAO,2BAA2B,GAAG,EAAE,4BAA4B;EAEnG;EACb,GAAI;GACJ;;AAIN,yBAAe"}
1
+ {"version":3,"file":"UserCreate.js","names":["UserCreate: FC<UserCreateProps>","useTranslation","resolvedOuId: string | undefined","useDefaultOuId","usersEndpoint: ManagementEndpoint","useManagementEndpoint","userTypesEndpoint: ManagementEndpoint","useResourceQuery","useResourceMutation","options: SelectOption[]","InviteUser","BaseUserCreate"],"sources":["../../../../src/components/admin/UserCreate/UserCreate.tsx"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n CreateManagedUserRequest,\n ManagedUser,\n ManagedUserType,\n ManagedUserTypeListResponse,\n SelectOption,\n UserQueryKeys,\n createUser,\n getUserTypes,\n toManagementErrorMessage,\n} from '@thunderid/browser';\nimport {FC, ReactElement, useMemo} from 'react';\nimport BaseUserCreate, {BaseUserCreateProps, UserCreateSubmission} from './BaseUserCreate';\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 InviteUser, {InviteUserProps} from '../../auth/InviteUser/InviteUser';\nimport useDefaultOuId from '../shared/useDefaultOuId';\n\nexport type UserCreateProps = Omit<BaseUserCreateProps, 'error' | 'isSubmitting' | 'onSubmit' | 'userTypes'> & {\n /**\n * Props passed to `InviteUser` when `mode` is `invite`.\n */\n inviteProps?: InviteUserProps;\n /**\n * How the user is added.\n * - `api` creates the user directly through the management API.\n * - `invite` runs the invite user flow, which asks the person to finish setting up their account.\n * Only available where flows run.\n * @default 'api'\n */\n mode?: 'api' | 'invite';\n /**\n * Called with the created user. Not called in `invite` mode, where the flow reports progress\n * through `inviteProps.onFlowChange`.\n */\n onCreated?: (user: ManagedUser) => void;\n /**\n * Organization unit the user is created in. Defaults to the signed-in user's organization unit.\n */\n ouId?: string;\n};\n\n/**\n * Adds a user, either directly through the management API or by inviting them through the invite\n * user flow.\n *\n * @example\n * ```tsx\n * <UserCreate onCreated={(user) => navigate(`/users/${user.id}`)} />\n * <UserCreate mode=\"invite\" />\n * ```\n */\nconst UserCreate: FC<UserCreateProps> = ({\n inviteProps,\n mode = 'api',\n onCreated,\n ouId,\n preferences,\n ...rest\n}: UserCreateProps): ReactElement => {\n const {t} = useTranslation(preferences?.i18n);\n const resolvedOuId: string | undefined = useDefaultOuId(ouId);\n const usersEndpoint: ManagementEndpoint = useManagementEndpoint('users');\n const userTypesEndpoint: ManagementEndpoint = useManagementEndpoint('userTypes');\n const {data: userTypes}: ResourceQueryResult<ManagedUserTypeListResponse> = useResourceQuery(\n [UserQueryKeys.USER_TYPES, {limit: 100}],\n (fetcher) => getUserTypes({...userTypesEndpoint, fetcher, limit: 100}),\n {enabled: mode === 'api'},\n );\n const {error, isLoading, mutate}: ResourceMutationResult<ManagedUser, CreateManagedUserRequest> = useResourceMutation(\n (payload: CreateManagedUserRequest, fetcher) => createUser({...usersEndpoint, fetcher, payload}),\n () => [[UserQueryKeys.USERS]],\n {onSuccess: onCreated},\n );\n\n const options: SelectOption[] = useMemo(\n () =>\n (userTypes?.types ?? []).map((userType: ManagedUserType) => ({\n label: userType.displayName ?? userType.handle,\n value: userType.handle,\n })),\n [userTypes],\n );\n\n if (mode === 'invite') {\n return <InviteUser {...inviteProps} />;\n }\n\n const handleSubmit = ({attributes, type}: UserCreateSubmission): void => {\n if (!resolvedOuId) {\n return;\n }\n\n void mutate({attributes, ouId: resolvedOuId, type});\n };\n\n return (\n <BaseUserCreate\n userTypes={options}\n onSubmit={handleSubmit}\n isSubmitting={isLoading}\n error={\n resolvedOuId ? toManagementErrorMessage(t, error, 'admin.users.create.error') : t('admin.common.errors.no_ou')\n }\n preferences={preferences}\n {...rest}\n />\n );\n};\n\nexport default UserCreate;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAyDA,MAAMA,cAAmC,EACvC,aACA,OAAO,OACP,WACA,MACA,YACA,GAAG,WACgC;CACnC,MAAM,EAAC,MAAKC,uBAAe,aAAa,KAAK;CAC7C,MAAMC,eAAmCC,uBAAe,KAAK;CAC7D,MAAMC,gBAAoCC,8BAAsB,QAAQ;CACxE,MAAMC,oBAAwCD,8BAAsB,YAAY;CAChF,MAAM,EAAC,MAAM,cAA+DE,yBAC1E,CAAC,cAAc,YAAY,EAAC,OAAO,KAAI,CAAC,GACvC,YAAY,aAAa;EAAC,GAAG;EAAmB;EAAS,OAAO;EAAI,CAAC,EACtE,EAAC,SAAS,SAAS,OAAM,CAC1B;CACD,MAAM,EAAC,OAAO,WAAW,WAAyEC,6BAC/F,SAAmC,YAAY,WAAW;EAAC,GAAG;EAAe;EAAS;EAAQ,CAAC,QAC1F,CAAC,CAAC,cAAc,MAAM,CAAC,EAC7B,EAAC,WAAW,WAAU,CACvB;CAED,MAAMC,UAA0B,eAE3B,WAAW,SAAS,EAAE,EAAE,KAAK,cAA+B;EAC3D,OAAO,SAAS,eAAe,SAAS;EACxC,OAAO,SAAS;EACjB,EAAE,EACL,CAAC,UAAU,CACZ;AAED,KAAI,SAAS,SACX,QAAO,oBAACC,sBAAW,GAAI,cAAe;CAGxC,MAAM,gBAAgB,EAAC,YAAY,WAAsC;AACvE,MAAI,CAAC,aACH;AAGF,EAAK,OAAO;GAAC;GAAY,MAAM;GAAc;GAAK,CAAC;;AAGrD,QACE,oBAACC;EACC,WAAW;EACX,UAAU;EACV,cAAc;EACd,OACE,eAAe,yBAAyB,GAAG,OAAO,2BAA2B,GAAG,EAAE,4BAA4B;EAEnG;EACb,GAAI;GACJ;;AAIN,yBAAe"}
@@ -1,4 +1,4 @@
1
- import { ManagedUser, MembershipGroup, Preferences } from '@thunderid/browser';
1
+ import { AccountLifecycleAction, ManagedUser, MembershipGroup, Preferences } from '@thunderid/browser';
2
2
  import { FC, ReactNode } from 'react';
3
3
  /**
4
4
  * What {@link BaseUserDetails} hands its `children` render function, so the user can be shown with any UI.
@@ -16,11 +16,21 @@ export interface BaseUserDetailsRenderProps {
16
16
  groups: MembershipGroup[];
17
17
  isDeleting: boolean;
18
18
  isLoading: boolean;
19
+ isRunningLifecycleAction: boolean;
19
20
  isUpdating: boolean;
21
+ /**
22
+ * The account lifecycle actions offered for the user. Empty when none is allowed.
23
+ */
24
+ lifecycleActions: AccountLifecycleAction[];
20
25
  /**
21
26
  * Deletes the user. Undefined when deletion is not allowed, including for read-only users.
22
27
  */
23
28
  onDelete?: () => void;
29
+ /**
30
+ * Runs an account lifecycle action, with the operator's note on a suspension. Undefined when none is
31
+ * allowed.
32
+ */
33
+ onLifecycleAction?: (action: AccountLifecycleAction, operatorNote?: string) => void;
24
34
  /**
25
35
  * Saves the given attributes. Undefined when editing is not allowed, including for read-only users.
26
36
  */
@@ -50,11 +60,22 @@ export interface BaseUserDetailsProps {
50
60
  hiddenAttributes?: string[];
51
61
  isDeleting?: boolean;
52
62
  isLoading?: boolean;
63
+ isRunningLifecycleAction?: boolean;
53
64
  isUpdating?: boolean;
65
+ /**
66
+ * The account lifecycle actions to offer (suspend, unsuspend, unlock), shown only with
67
+ * `onLifecycleAction`. They change only runtime state, so they apply to read-only users too.
68
+ */
69
+ lifecycleActions?: AccountLifecycleAction[];
54
70
  /**
55
71
  * Deletes the user. The delete action is hidden when omitted.
56
72
  */
57
73
  onDelete?: () => void;
74
+ /**
75
+ * Runs an account lifecycle action. Suspending and unsuspending ask for confirmation first, and a
76
+ * suspension takes an optional operator note.
77
+ */
78
+ onLifecycleAction?: (action: AccountLifecycleAction, operatorNote?: string) => void;
58
79
  /**
59
80
  * Saves edited attributes. Text attributes become editable only when set. Receives every
60
81
  * attribute, edited or not.
@@ -1 +1 @@
1
- {"version":3,"file":"BaseUserDetails.d.ts","sourceRoot":"","sources":["../../../../src/components/admin/UserDetails/BaseUserDetails.tsx"],"names":[],"mappings":"AAGA,OAAO,EAA6B,WAAW,EAAE,eAAe,EAAE,WAAW,EAAC,MAAM,oBAAoB,CAAC;AACzG,OAAO,EAAc,EAAE,EAAgB,SAAS,EAAW,MAAM,OAAO,CAAC;AAWzE;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IACzD,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,0BAA0B,KAAK,SAAS,CAAC;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB;;OAEG;IACH,MAAM,CAAC,EAAE,eAAe,EAAE,CAAC;IAC3B;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IACzD,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB;AAUD;;;GAGG;AACH,QAAA,MAAM,eAAe,EAAE,EAAE,CAAC,oBAAoB,CAqK7C,CAAC;AAEF,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"BaseUserDetails.d.ts","sourceRoot":"","sources":["../../../../src/components/admin/UserDetails/BaseUserDetails.tsx"],"names":[],"mappings":"AAGA,OAAO,EACL,sBAAsB,EAEtB,WAAW,EACX,eAAe,EACf,WAAW,EACZ,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAc,EAAE,EAAgB,SAAS,EAAW,MAAM,OAAO,CAAC;AAYzE;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC;;OAEG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,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,UAAU,EAAE,OAAO,CAAC;IACpB;;OAEG;IACH,gBAAgB,EAAE,sBAAsB,EAAE,CAAC;IAC3C;;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;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IACzD,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,0BAA0B,KAAK,SAAS,CAAC;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB;;OAEG;IACH,MAAM,CAAC,EAAE,eAAe,EAAE,CAAC;IAC3B;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,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;;;OAGG;IACH,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,sBAAsB,EAAE,YAAY,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACpF;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IACzD,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB;AAUD;;;GAGG;AACH,QAAA,MAAM,eAAe,EAAE,EAAE,CAAC,oBAAoB,CAqL7C,CAAC;AAEF,eAAe,eAAe,CAAC"}
@@ -6,6 +6,7 @@ import TextField_default from "../../primitives/TextField/TextField.js";
6
6
  import { Avatar } from "../../primitives/Avatar/Avatar.js";
7
7
  import useAdminPartStyles_default from "../shared/useAdminPartStyles.js";
8
8
  import AdminSection_default from "../shared/AdminSection.js";
9
+ import { AccessStatusBadge, AccountLifecycleButtons } from "../shared/AccountLifecycleParts.js";
9
10
  import { ChipList, ConfirmButton, DetailList, Panel } from "../shared/AdminParts.js";
10
11
  import { resolveManagedIdentityName } from "@thunderid/browser";
11
12
  import { useState } from "react";
@@ -20,7 +21,7 @@ const stringify = (value) => {
20
21
  * Shows a user's attributes, type, organization unit and groups. Holds no data of its own: pass the
21
22
  * user and handle deletion.
22
23
  */
23
- const BaseUserDetails = ({ actions, children, className, error = null, groups = [], hiddenAttributes = ["password"], isDeleting = false, isLoading = false, isUpdating = false, onDelete, onUpdate, preferences, user }) => {
24
+ const BaseUserDetails = ({ actions, children, className, error = null, groups = [], hiddenAttributes = ["password"], isDeleting = false, isLoading = false, isRunningLifecycleAction = false, isUpdating = false, lifecycleActions = [], onDelete, onLifecycleAction, onUpdate, preferences, user }) => {
24
25
  const { t } = useTranslation_default(preferences?.i18n);
25
26
  const styles = useAdminPartStyles_default();
26
27
  const [draft, setDraft] = useState(null);
@@ -35,8 +36,11 @@ const BaseUserDetails = ({ actions, children, className, error = null, groups =
35
36
  groups,
36
37
  isDeleting,
37
38
  isLoading,
39
+ isRunningLifecycleAction,
38
40
  isUpdating,
41
+ lifecycleActions: onLifecycleAction && user ? lifecycleActions : [],
39
42
  onDelete: isWritable ? onDelete : void 0,
43
+ onLifecycleAction: user ? onLifecycleAction : void 0,
40
44
  onUpdate: isWritable ? onUpdate : void 0,
41
45
  user
42
46
  })
@@ -75,12 +79,22 @@ const BaseUserDetails = ({ actions, children, className, error = null, groups =
75
79
  title: displayName,
76
80
  description: t("admin.users.details.subtitle", { type: user.type }),
77
81
  preferences,
78
- actions: /* @__PURE__ */ jsxs(Fragment$1, { children: [actions, onDelete && !user.isReadOnly && /* @__PURE__ */ jsx(ConfirmButton, {
79
- confirmText: t("admin.users.details.delete.confirm", { name: displayName }),
80
- isLoading: isDeleting,
81
- onConfirm: onDelete,
82
- children: t("admin.users.details.delete.action")
83
- })] }),
82
+ actions: /* @__PURE__ */ jsxs(Fragment$1, { children: [
83
+ actions,
84
+ onLifecycleAction && /* @__PURE__ */ jsx(AccountLifecycleButtons, {
85
+ actions: lifecycleActions,
86
+ collectsOperatorNote: true,
87
+ isRunning: isRunningLifecycleAction,
88
+ name: displayName,
89
+ onAction: onLifecycleAction
90
+ }),
91
+ onDelete && !user.isReadOnly && /* @__PURE__ */ jsx(ConfirmButton, {
92
+ confirmText: t("admin.users.details.delete.confirm", { name: displayName }),
93
+ isLoading: isDeleting,
94
+ onConfirm: onDelete,
95
+ children: t("admin.users.details.delete.action")
96
+ })
97
+ ] }),
84
98
  children: [
85
99
  error && /* @__PURE__ */ jsx(Alert_default, {
86
100
  variant: "error",
@@ -89,13 +103,17 @@ const BaseUserDetails = ({ actions, children, className, error = null, groups =
89
103
  }),
90
104
  /* @__PURE__ */ jsxs("div", {
91
105
  className: styles["row"],
92
- children: [/* @__PURE__ */ jsx(Avatar, {
93
- name: displayName,
94
- size: 48
95
- }), /* @__PURE__ */ jsx("span", {
96
- className: styles["muted"],
97
- children: user.ouHandle ?? user.ouId
98
- })]
106
+ children: [
107
+ /* @__PURE__ */ jsx(Avatar, {
108
+ name: displayName,
109
+ size: 48
110
+ }),
111
+ /* @__PURE__ */ jsx("span", {
112
+ className: styles["muted"],
113
+ children: user.ouHandle ?? user.ouId
114
+ }),
115
+ /* @__PURE__ */ jsx(AccessStatusBadge, { status: user.status?.value })
116
+ ]
99
117
  }),
100
118
  /* @__PURE__ */ jsx(Panel, {
101
119
  title: t("admin.users.details.attributes"),
@@ -1 +1 @@
1
- {"version":3,"file":"BaseUserDetails.js","names":["BaseUserDetails: FC<BaseUserDetailsProps>","useTranslation","styles: Record<string, string>","useAdminPartStyles","isWritable: boolean","AdminSection","Spinner","Alert","displayName: string","attributes: [string, unknown][]","editableAttributes: [string, string][]","Button","TextField"],"sources":["../../../../src/components/admin/UserDetails/BaseUserDetails.tsx"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {resolveManagedIdentityName, ManagedUser, MembershipGroup, Preferences} from '@thunderid/browser';\nimport {ChangeEvent, FC, ReactElement, ReactNode, useState} from 'react';\nimport useTranslation from '../../../hooks/useTranslation';\nimport Alert from '../../primitives/Alert/Alert';\nimport {Avatar} from '../../primitives/Avatar/Avatar';\nimport Button from '../../primitives/Button/Button';\nimport Spinner from '../../primitives/Spinner/Spinner';\nimport TextField from '../../primitives/TextField/TextField';\nimport {ChipList, ConfirmButton, DetailList, Panel} from '../shared/AdminParts';\nimport AdminSection from '../shared/AdminSection';\nimport useAdminPartStyles from '../shared/useAdminPartStyles';\n\n/**\n * What {@link BaseUserDetails} hands its `children` render function, so the user can be shown with any UI.\n */\nexport interface BaseUserDetailsRenderProps {\n /**\n * The user's attributes, without the hidden ones.\n */\n attributes: Record<string, unknown>;\n /**\n * The user's display name, or an empty string while there is no user.\n */\n displayName: string;\n error: string | null;\n groups: MembershipGroup[];\n isDeleting: boolean;\n isLoading: boolean;\n isUpdating: boolean;\n /**\n * Deletes the user. Undefined when deletion is not allowed, including for read-only users.\n */\n onDelete?: () => void;\n /**\n * Saves the given attributes. Undefined when editing is not allowed, including for read-only users.\n */\n onUpdate?: (attributes: Record<string, unknown>) => void;\n user?: ManagedUser;\n}\n\nexport interface BaseUserDetailsProps {\n /**\n * Controls rendered next to the user's name.\n */\n actions?: ReactNode;\n /**\n * Renders custom UI in place of the default view. Receives the user, their visible attributes and\n * groups, the loading and error state, and the delete and update handlers.\n */\n children?: (props: BaseUserDetailsRenderProps) => ReactNode;\n className?: string;\n error?: string | null;\n /**\n * The groups the user belongs to.\n */\n groups?: MembershipGroup[];\n /**\n * Attribute names that are never shown, such as credentials.\n * @default ['password']\n */\n hiddenAttributes?: string[];\n isDeleting?: boolean;\n isLoading?: boolean;\n isUpdating?: boolean;\n /**\n * Deletes the user. The delete action is hidden when omitted.\n */\n onDelete?: () => void;\n /**\n * Saves edited attributes. Text attributes become editable only when set. Receives every\n * attribute, edited or not.\n */\n onUpdate?: (attributes: Record<string, unknown>) => void;\n preferences?: Preferences;\n user?: ManagedUser;\n}\n\nconst stringify = (value: unknown): string => {\n if (value === null || value === undefined) {\n return '';\n }\n\n return typeof value === 'object' ? JSON.stringify(value) : String(value as string | number | boolean);\n};\n\n/**\n * Shows a user's attributes, type, organization unit and groups. Holds no data of its own: pass the\n * user and handle deletion.\n */\nconst BaseUserDetails: FC<BaseUserDetailsProps> = ({\n actions,\n children,\n className,\n error = null,\n groups = [],\n hiddenAttributes = ['password'],\n isDeleting = false,\n isLoading = false,\n isUpdating = false,\n onDelete,\n onUpdate,\n preferences,\n user,\n}: BaseUserDetailsProps): ReactElement => {\n const {t} = useTranslation(preferences?.i18n);\n const styles: Record<string, string> = useAdminPartStyles();\n const [draft, setDraft] = useState<Record<string, string> | null>(null);\n\n if (children) {\n const isWritable: boolean = Boolean(user) && !user?.isReadOnly;\n\n return (\n <div className={className}>\n {children({\n attributes: Object.fromEntries(\n Object.entries(user?.attributes ?? {}).filter(\n ([name]: [string, unknown]) => !hiddenAttributes.includes(name),\n ),\n ),\n displayName: user ? resolveManagedIdentityName(user) : '',\n error,\n groups,\n isDeleting,\n isLoading,\n isUpdating,\n onDelete: isWritable ? onDelete : undefined,\n onUpdate: isWritable ? onUpdate : undefined,\n user,\n })}\n </div>\n );\n }\n\n if (isLoading && !user) {\n return (\n <AdminSection block=\"user-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 (!user) {\n return (\n <AdminSection block=\"user-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 displayName: string = resolveManagedIdentityName(user);\n const attributes: [string, unknown][] = Object.entries(user.attributes ?? {}).filter(\n ([name]: [string, unknown]) => !hiddenAttributes.includes(name),\n );\n const editableAttributes: [string, string][] = attributes.filter(\n (entry: [string, unknown]): entry is [string, string] => typeof entry[1] === 'string',\n );\n\n return (\n <AdminSection\n block=\"user-details\"\n className={className}\n title={displayName}\n description={t('admin.users.details.subtitle', {type: user.type})}\n preferences={preferences}\n actions={\n <>\n {actions}\n {onDelete && !user.isReadOnly && (\n <ConfirmButton\n confirmText={t('admin.users.details.delete.confirm', {name: displayName})}\n isLoading={isDeleting}\n onConfirm={onDelete}\n >\n {t('admin.users.details.delete.action')}\n </ConfirmButton>\n )}\n </>\n }\n >\n {error && (\n <Alert variant=\"error\" role=\"alert\">\n {error}\n </Alert>\n )}\n <div className={styles['row']}>\n <Avatar name={displayName} size={48} />\n <span className={styles['muted']}>{user.ouHandle ?? user.ouId}</span>\n </div>\n <Panel\n title={t('admin.users.details.attributes')}\n actions={\n onUpdate && !user.isReadOnly && !draft && editableAttributes.length > 0 ? (\n <Button\n variant=\"outline\"\n size=\"small\"\n onClick={(): void => setDraft(Object.fromEntries(editableAttributes))}\n >\n {t('admin.users.details.edit.action')}\n </Button>\n ) : undefined\n }\n >\n {draft ? (\n <form\n className={styles['row']}\n style={{alignItems: 'stretch', flexDirection: 'column'}}\n onSubmit={(event): void => {\n event.preventDefault();\n onUpdate?.({...(user.attributes ?? {}), ...draft});\n setDraft(null);\n }}\n >\n {Object.keys(draft).map((name: string) => (\n <TextField\n key={name}\n name={name}\n label={name}\n aria-label={name}\n value={draft[name]}\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n setDraft((previous: Record<string, string> | null) => ({...previous, [name]: event.target.value}))\n }\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 type=\"submit\" loading={isUpdating} disabled={isUpdating}>\n {t('admin.users.details.edit.save')}\n </Button>\n </div>\n </form>\n ) : attributes.length > 0 ? (\n <DetailList\n items={attributes.map(([name, value]: [string, unknown]) => ({label: name, value: stringify(value)}))}\n />\n ) : (\n <span className={styles['muted']}>{t('admin.users.details.no_attributes')}</span>\n )}\n </Panel>\n <Panel title={t('admin.users.details.groups')}>\n <ChipList\n label={t('admin.users.details.groups')}\n emptyText={t('admin.users.details.no_groups')}\n items={groups.map((group: MembershipGroup) => ({id: group.id, label: group.name}))}\n />\n </Panel>\n </AdminSection>\n );\n};\n\nexport default BaseUserDetails;\n"],"mappings":"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"}
1
+ {"version":3,"file":"BaseUserDetails.js","names":["BaseUserDetails: FC<BaseUserDetailsProps>","useTranslation","styles: Record<string, string>","useAdminPartStyles","isWritable: boolean","AdminSection","Spinner","Alert","displayName: string","attributes: [string, unknown][]","editableAttributes: [string, string][]","Button","TextField"],"sources":["../../../../src/components/admin/UserDetails/BaseUserDetails.tsx"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n AccountLifecycleAction,\n resolveManagedIdentityName,\n ManagedUser,\n MembershipGroup,\n Preferences,\n} from '@thunderid/browser';\nimport {ChangeEvent, FC, ReactElement, ReactNode, useState} from 'react';\nimport useTranslation from '../../../hooks/useTranslation';\nimport Alert from '../../primitives/Alert/Alert';\nimport {Avatar} from '../../primitives/Avatar/Avatar';\nimport Button from '../../primitives/Button/Button';\nimport Spinner from '../../primitives/Spinner/Spinner';\nimport TextField from '../../primitives/TextField/TextField';\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 BaseUserDetails} hands its `children` render function, so the user can be shown with any UI.\n */\nexport interface BaseUserDetailsRenderProps {\n /**\n * The user's attributes, without the hidden ones.\n */\n attributes: Record<string, unknown>;\n /**\n * The user's display name, or an empty string while there is no user.\n */\n displayName: string;\n error: string | null;\n groups: MembershipGroup[];\n isDeleting: boolean;\n isLoading: boolean;\n isRunningLifecycleAction: boolean;\n isUpdating: boolean;\n /**\n * The account lifecycle actions offered for the user. Empty when none is allowed.\n */\n lifecycleActions: AccountLifecycleAction[];\n /**\n * Deletes the user. Undefined when deletion is not allowed, including for read-only users.\n */\n onDelete?: () => void;\n /**\n * Runs an account lifecycle action, with the operator's note on a suspension. Undefined when none is\n * allowed.\n */\n onLifecycleAction?: (action: AccountLifecycleAction, operatorNote?: string) => void;\n /**\n * Saves the given attributes. Undefined when editing is not allowed, including for read-only users.\n */\n onUpdate?: (attributes: Record<string, unknown>) => void;\n user?: ManagedUser;\n}\n\nexport interface BaseUserDetailsProps {\n /**\n * Controls rendered next to the user's name.\n */\n actions?: ReactNode;\n /**\n * Renders custom UI in place of the default view. Receives the user, their visible attributes and\n * groups, the loading and error state, and the delete and update handlers.\n */\n children?: (props: BaseUserDetailsRenderProps) => ReactNode;\n className?: string;\n error?: string | null;\n /**\n * The groups the user belongs to.\n */\n groups?: MembershipGroup[];\n /**\n * Attribute names that are never shown, such as credentials.\n * @default ['password']\n */\n hiddenAttributes?: string[];\n isDeleting?: boolean;\n isLoading?: boolean;\n isRunningLifecycleAction?: boolean;\n isUpdating?: boolean;\n /**\n * The account lifecycle actions to offer (suspend, unsuspend, unlock), shown only with\n * `onLifecycleAction`. They change only runtime state, so they apply to read-only users too.\n */\n lifecycleActions?: AccountLifecycleAction[];\n /**\n * Deletes the user. 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 /**\n * Saves edited attributes. Text attributes become editable only when set. Receives every\n * attribute, edited or not.\n */\n onUpdate?: (attributes: Record<string, unknown>) => void;\n preferences?: Preferences;\n user?: ManagedUser;\n}\n\nconst stringify = (value: unknown): string => {\n if (value === null || value === undefined) {\n return '';\n }\n\n return typeof value === 'object' ? JSON.stringify(value) : String(value as string | number | boolean);\n};\n\n/**\n * Shows a user's attributes, type, organization unit and groups. Holds no data of its own: pass the\n * user and handle deletion.\n */\nconst BaseUserDetails: FC<BaseUserDetailsProps> = ({\n actions,\n children,\n className,\n error = null,\n groups = [],\n hiddenAttributes = ['password'],\n isDeleting = false,\n isLoading = false,\n isRunningLifecycleAction = false,\n isUpdating = false,\n lifecycleActions = [],\n onDelete,\n onLifecycleAction,\n onUpdate,\n preferences,\n user,\n}: BaseUserDetailsProps): ReactElement => {\n const {t} = useTranslation(preferences?.i18n);\n const styles: Record<string, string> = useAdminPartStyles();\n const [draft, setDraft] = useState<Record<string, string> | null>(null);\n\n if (children) {\n const isWritable: boolean = Boolean(user) && !user?.isReadOnly;\n\n return (\n <div className={className}>\n {children({\n attributes: Object.fromEntries(\n Object.entries(user?.attributes ?? {}).filter(\n ([name]: [string, unknown]) => !hiddenAttributes.includes(name),\n ),\n ),\n displayName: user ? resolveManagedIdentityName(user) : '',\n error,\n groups,\n isDeleting,\n isLoading,\n isRunningLifecycleAction,\n isUpdating,\n lifecycleActions: onLifecycleAction && user ? lifecycleActions : [],\n onDelete: isWritable ? onDelete : undefined,\n onLifecycleAction: user ? onLifecycleAction : undefined,\n onUpdate: isWritable ? onUpdate : undefined,\n user,\n })}\n </div>\n );\n }\n\n if (isLoading && !user) {\n return (\n <AdminSection block=\"user-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 (!user) {\n return (\n <AdminSection block=\"user-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 displayName: string = resolveManagedIdentityName(user);\n const attributes: [string, unknown][] = Object.entries(user.attributes ?? {}).filter(\n ([name]: [string, unknown]) => !hiddenAttributes.includes(name),\n );\n const editableAttributes: [string, string][] = attributes.filter(\n (entry: [string, unknown]): entry is [string, string] => typeof entry[1] === 'string',\n );\n\n return (\n <AdminSection\n block=\"user-details\"\n className={className}\n title={displayName}\n description={t('admin.users.details.subtitle', {type: user.type})}\n preferences={preferences}\n actions={\n <>\n {actions}\n {onLifecycleAction && (\n <AccountLifecycleButtons\n actions={lifecycleActions}\n collectsOperatorNote\n isRunning={isRunningLifecycleAction}\n name={displayName}\n onAction={onLifecycleAction}\n />\n )}\n {onDelete && !user.isReadOnly && (\n <ConfirmButton\n confirmText={t('admin.users.details.delete.confirm', {name: displayName})}\n isLoading={isDeleting}\n onConfirm={onDelete}\n >\n {t('admin.users.details.delete.action')}\n </ConfirmButton>\n )}\n </>\n }\n >\n {error && (\n <Alert variant=\"error\" role=\"alert\">\n {error}\n </Alert>\n )}\n <div className={styles['row']}>\n <Avatar name={displayName} size={48} />\n <span className={styles['muted']}>{user.ouHandle ?? user.ouId}</span>\n <AccessStatusBadge status={user.status?.value} />\n </div>\n <Panel\n title={t('admin.users.details.attributes')}\n actions={\n onUpdate && !user.isReadOnly && !draft && editableAttributes.length > 0 ? (\n <Button\n variant=\"outline\"\n size=\"small\"\n onClick={(): void => setDraft(Object.fromEntries(editableAttributes))}\n >\n {t('admin.users.details.edit.action')}\n </Button>\n ) : undefined\n }\n >\n {draft ? (\n <form\n className={styles['row']}\n style={{alignItems: 'stretch', flexDirection: 'column'}}\n onSubmit={(event): void => {\n event.preventDefault();\n onUpdate?.({...(user.attributes ?? {}), ...draft});\n setDraft(null);\n }}\n >\n {Object.keys(draft).map((name: string) => (\n <TextField\n key={name}\n name={name}\n label={name}\n aria-label={name}\n value={draft[name]}\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n setDraft((previous: Record<string, string> | null) => ({...previous, [name]: event.target.value}))\n }\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 type=\"submit\" loading={isUpdating} disabled={isUpdating}>\n {t('admin.users.details.edit.save')}\n </Button>\n </div>\n </form>\n ) : attributes.length > 0 ? (\n <DetailList\n items={attributes.map(([name, value]: [string, unknown]) => ({label: name, value: stringify(value)}))}\n />\n ) : (\n <span className={styles['muted']}>{t('admin.users.details.no_attributes')}</span>\n )}\n </Panel>\n <Panel title={t('admin.users.details.groups')}>\n <ChipList\n label={t('admin.users.details.groups')}\n emptyText={t('admin.users.details.no_groups')}\n items={groups.map((group: MembershipGroup) => ({id: group.id, label: group.name}))}\n />\n </Panel>\n </AdminSection>\n );\n};\n\nexport default BaseUserDetails;\n"],"mappings":"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"}
@@ -1,6 +1,13 @@
1
+ import { AdministrationMode } from '@thunderid/browser';
1
2
  import { FC } from 'react';
2
3
  import { BaseUserDetailsProps } from './BaseUserDetails';
3
- export type UserDetailsProps = Omit<BaseUserDetailsProps, 'error' | 'groups' | 'isDeleting' | 'isLoading' | 'isUpdating' | 'onDelete' | 'onUpdate' | 'user'> & {
4
+ export type UserDetailsProps = Omit<BaseUserDetailsProps, 'error' | 'groups' | 'isDeleting' | 'isLoading' | 'isRunningLifecycleAction' | 'isUpdating' | 'lifecycleActions' | 'onDelete' | 'onLifecycleAction' | 'onUpdate' | 'user'> & {
5
+ /**
6
+ * How the delete runs. `flow` runs the user deletion flow the server configures, which revokes the
7
+ * user's grants and ends their sessions before the record goes. It needs `baseUrl`.
8
+ * @default 'native'
9
+ */
10
+ administrationMode?: AdministrationMode;
4
11
  /**
5
12
  * Whether the user can be deleted from this view.
6
13
  * @default false
@@ -11,6 +18,13 @@ export type UserDetailsProps = Omit<BaseUserDetailsProps, 'error' | 'groups' | '
11
18
  * @default false
12
19
  */
13
20
  editable?: boolean;
21
+ /**
22
+ * Whether the user can be suspended, unsuspended and unlocked from this view. Each action runs
23
+ * through its administration flow and is offered only when the server configures that flow. Reading
24
+ * the configured flows needs a token that may read the server configuration.
25
+ * @default false
26
+ */
27
+ lifecycleActions?: boolean;
14
28
  /**
15
29
  * Called after the user has been deleted.
16
30
  */
@@ -1 +1 @@
1
- {"version":3,"file":"UserDetails.d.ts","sourceRoot":"","sources":["../../../../src/components/admin/UserDetails/UserDetails.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAC,EAAE,EAAe,MAAM,OAAO,CAAC;AACvC,OAAwB,EAAC,oBAAoB,EAAC,MAAM,mBAAmB,CAAC;AAOxE,MAAM,MAAM,gBAAgB,GAAG,IAAI,CACjC,oBAAoB,EACpB,OAAO,GAAG,QAAQ,GAAG,YAAY,GAAG,WAAW,GAAG,YAAY,GAAG,UAAU,GAAG,UAAU,GAAG,MAAM,CAClG,GAAG;IACF;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;OAGG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;;;;;GAOG;AACH,QAAA,MAAM,WAAW,EAAE,EAAE,CAAC,gBAAgB,CAqCrC,CAAC;AAEF,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"UserDetails.d.ts","sourceRoot":"","sources":["../../../../src/components/admin/UserDetails/UserDetails.tsx"],"names":[],"mappings":"AAGA,OAAO,EACL,kBAAkB,EAWnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAC,EAAE,EAAe,MAAM,OAAO,CAAC;AACvC,OAAwB,EAAC,oBAAoB,EAAC,MAAM,mBAAmB,CAAC;AAYxE,MAAM,MAAM,gBAAgB,GAAG,IAAI,CACjC,oBAAoB,EAClB,OAAO,GACP,QAAQ,GACR,YAAY,GACZ,WAAW,GACX,0BAA0B,GAC1B,YAAY,GACZ,kBAAkB,GAClB,UAAU,GACV,mBAAmB,GACnB,UAAU,GACV,MAAM,CACT,GAAG;IACF;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC;;;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,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;;;;;GAOG;AACH,QAAA,MAAM,WAAW,EAAE,EAAE,CAAC,gBAAgB,CAoErC,CAAC;AAEF,eAAe,WAAW,CAAC"}
@@ -1,10 +1,10 @@
1
1
  import useTranslation_default from "../../../hooks/useTranslation.js";
2
- import useGetUser_default from "../../../hooks/management/users/useGetUser.js";
3
- import useUpdateUser_default from "../../../hooks/management/users/useUpdateUser.js";
4
- import useDeleteUser_default from "../../../hooks/management/users/useDeleteUser.js";
5
- import useGetUserGroups_default from "../../../hooks/management/users/useGetUserGroups.js";
2
+ import useManagementEndpoint_default from "../../../hooks/management/useManagementEndpoint.js";
3
+ import useResourceQuery_default from "../../../hooks/management/useResourceQuery.js";
4
+ import useResourceMutation_default from "../../../hooks/management/useResourceMutation.js";
6
5
  import BaseUserDetails_default from "./BaseUserDetails.js";
7
- import { toManagementErrorMessage } from "@thunderid/browser";
6
+ import useAccountLifecycle_default from "../../../hooks/management/useAccountLifecycle.js";
7
+ import { GroupQueryKeys, UserQueryKeys, deleteUser, getUser, getUserGroups, toManagementErrorMessage, updateUser } from "@thunderid/browser";
8
8
  import { jsx } from "react/jsx-runtime";
9
9
 
10
10
  //#region src/components/admin/UserDetails/UserDetails.tsx
@@ -16,19 +16,54 @@ import { jsx } from "react/jsx-runtime";
16
16
  * <UserDetails userId={userId} deletable onDeleted={() => navigate('/users')} />
17
17
  * ```
18
18
  */
19
- const UserDetails = ({ deletable = false, editable = false, onDeleted, preferences, userId,...rest }) => {
19
+ const UserDetails = ({ administrationMode, deletable = false, editable = false, lifecycleActions = false, onDeleted, preferences, userId,...rest }) => {
20
20
  const { t } = useTranslation_default(preferences?.i18n);
21
- const user = useGetUser_default(userId);
22
- const groups = useGetUserGroups_default(userId, { limit: 100 });
23
- const deletion = useDeleteUser_default({ onSuccess: onDeleted });
24
- const update = useUpdateUser_default();
21
+ const endpoint = useManagementEndpoint_default("users");
22
+ const user = useResourceQuery_default([UserQueryKeys.USER, userId], (fetcher) => getUser({
23
+ ...endpoint,
24
+ fetcher,
25
+ userId
26
+ }), { enabled: Boolean(userId) });
27
+ const groups = useResourceQuery_default([
28
+ GroupQueryKeys.MEMBERSHIPS,
29
+ "user",
30
+ userId,
31
+ { limit: 100 }
32
+ ], (fetcher) => getUserGroups({
33
+ ...endpoint,
34
+ fetcher,
35
+ limit: 100,
36
+ userId
37
+ }), { enabled: Boolean(userId) });
38
+ const deletion = useResourceMutation_default((id, fetcher) => deleteUser({
39
+ ...endpoint,
40
+ administrationMode,
41
+ fetcher,
42
+ userId: id
43
+ }), () => [[UserQueryKeys.USERS]], { onSuccess: onDeleted });
44
+ const update = useResourceMutation_default(({ data, userId: id }, fetcher) => updateUser({
45
+ ...endpoint,
46
+ fetcher,
47
+ payload: data,
48
+ userId: id
49
+ }), ({ userId: id }) => [[UserQueryKeys.USER, id], [UserQueryKeys.USERS]]);
50
+ const lifecycle = useAccountLifecycle_default({
51
+ enabled: lifecycleActions,
52
+ invalidatedKeys: [[UserQueryKeys.USER, userId], [UserQueryKeys.USERS]],
53
+ kind: "user",
54
+ status: user.data?.status?.value,
55
+ subject: userId
56
+ });
25
57
  return /* @__PURE__ */ jsx(BaseUserDetails_default, {
26
58
  user: user.data,
27
59
  groups: groups.data?.groups,
28
60
  isLoading: user.isLoading,
29
- error: toManagementErrorMessage(t, user.error, "admin.users.details.error") ?? toManagementErrorMessage(t, deletion.error, "admin.users.details.delete.error") ?? toManagementErrorMessage(t, update.error, "admin.users.details.edit.error"),
61
+ error: toManagementErrorMessage(t, user.error, "admin.users.details.error") ?? toManagementErrorMessage(t, deletion.error, "admin.users.details.delete.error") ?? toManagementErrorMessage(t, update.error, "admin.users.details.edit.error") ?? toManagementErrorMessage(t, lifecycle.error, "admin.common.lifecycle.error") ?? toManagementErrorMessage(t, lifecycle.loadError, "admin.common.lifecycle.load_error"),
30
62
  isDeleting: deletion.isLoading,
31
63
  onDelete: deletable ? () => void deletion.mutate(userId) : void 0,
64
+ lifecycleActions: lifecycle.actions,
65
+ isRunningLifecycleAction: lifecycle.isRunning,
66
+ onLifecycleAction: lifecycleActions ? lifecycle.run : void 0,
32
67
  isUpdating: update.isLoading,
33
68
  onUpdate: editable && user.data ? (attributes) => void update.mutate({
34
69
  data: {
@@ -1 +1 @@
1
- {"version":3,"file":"UserDetails.js","names":["UserDetails: FC<UserDetailsProps>","useTranslation","useGetUser","useGetUserGroups","useDeleteUser","useUpdateUser","BaseUserDetails"],"sources":["../../../../src/components/admin/UserDetails/UserDetails.tsx"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {toManagementErrorMessage} from '@thunderid/browser';\nimport {FC, ReactElement} from 'react';\nimport BaseUserDetails, {BaseUserDetailsProps} from './BaseUserDetails';\nimport useDeleteUser from '../../../hooks/management/users/useDeleteUser';\nimport useGetUser from '../../../hooks/management/users/useGetUser';\nimport useGetUserGroups from '../../../hooks/management/users/useGetUserGroups';\nimport useUpdateUser from '../../../hooks/management/users/useUpdateUser';\nimport useTranslation from '../../../hooks/useTranslation';\n\nexport type UserDetailsProps = Omit<\n BaseUserDetailsProps,\n 'error' | 'groups' | 'isDeleting' | 'isLoading' | 'isUpdating' | 'onDelete' | 'onUpdate' | 'user'\n> & {\n /**\n * Whether the user can be deleted from this view.\n * @default false\n */\n deletable?: boolean;\n /**\n * Whether the user's text attributes can be edited from this view.\n * @default false\n */\n editable?: boolean;\n /**\n * Called after the user has been deleted.\n */\n onDeleted?: () => void;\n userId: string;\n};\n\n/**\n * Shows a user and the groups they belong to, and optionally lets the signed-in user delete them.\n *\n * @example\n * ```tsx\n * <UserDetails userId={userId} deletable onDeleted={() => navigate('/users')} />\n * ```\n */\nconst UserDetails: FC<UserDetailsProps> = ({\n deletable = false,\n editable = false,\n onDeleted,\n preferences,\n userId,\n ...rest\n}: UserDetailsProps): ReactElement => {\n const {t} = useTranslation(preferences?.i18n);\n const user = useGetUser(userId);\n const groups = useGetUserGroups(userId, {limit: 100});\n const deletion = useDeleteUser({onSuccess: onDeleted});\n const update = useUpdateUser();\n\n return (\n <BaseUserDetails\n user={user.data}\n groups={groups.data?.groups}\n isLoading={user.isLoading}\n error={\n toManagementErrorMessage(t, user.error, 'admin.users.details.error') ??\n toManagementErrorMessage(t, deletion.error, 'admin.users.details.delete.error') ??\n toManagementErrorMessage(t, update.error, 'admin.users.details.edit.error')\n }\n isDeleting={deletion.isLoading}\n onDelete={deletable ? (): void => void deletion.mutate(userId) : undefined}\n isUpdating={update.isLoading}\n onUpdate={\n editable && user.data\n ? (attributes: Record<string, unknown>): void =>\n void update.mutate({data: {attributes, ouId: user.data!.ouId, type: user.data!.type}, userId})\n : undefined\n }\n preferences={preferences}\n {...rest}\n />\n );\n};\n\nexport default UserDetails;\n"],"mappings":";;;;;;;;;;;;;;;;;;AAyCA,MAAMA,eAAqC,EACzC,YAAY,OACZ,WAAW,OACX,WACA,aACA,OACA,GAAG,WACiC;CACpC,MAAM,EAAC,MAAKC,uBAAe,aAAa,KAAK;CAC7C,MAAM,OAAOC,mBAAW,OAAO;CAC/B,MAAM,SAASC,yBAAiB,QAAQ,EAAC,OAAO,KAAI,CAAC;CACrD,MAAM,WAAWC,sBAAc,EAAC,WAAW,WAAU,CAAC;CACtD,MAAM,SAASC,uBAAe;AAE9B,QACE,oBAACC;EACC,MAAM,KAAK;EACX,QAAQ,OAAO,MAAM;EACrB,WAAW,KAAK;EAChB,OACE,yBAAyB,GAAG,KAAK,OAAO,4BAA4B,IACpE,yBAAyB,GAAG,SAAS,OAAO,mCAAmC,IAC/E,yBAAyB,GAAG,OAAO,OAAO,iCAAiC;EAE7E,YAAY,SAAS;EACrB,UAAU,kBAAwB,KAAK,SAAS,OAAO,OAAO,GAAG;EACjE,YAAY,OAAO;EACnB,UACE,YAAY,KAAK,QACZ,eACC,KAAK,OAAO,OAAO;GAAC,MAAM;IAAC;IAAY,MAAM,KAAK,KAAM;IAAM,MAAM,KAAK,KAAM;IAAK;GAAE;GAAO,CAAC,GAChG;EAEO;EACb,GAAI;GACJ;;AAIN,0BAAe"}
1
+ {"version":3,"file":"UserDetails.js","names":["UserDetails: FC<UserDetailsProps>","useTranslation","endpoint: ManagementEndpoint","useManagementEndpoint","user: ResourceQueryResult<ManagedUser>","useResourceQuery","groups: ResourceQueryResult<MembershipGroupListResponse>","deletion: ResourceMutationResult<void, string>","useResourceMutation","update: ResourceMutationResult<ManagedUser, UpdateUserVariables>","lifecycle: AccountLifecycleState","useAccountLifecycle","BaseUserDetails"],"sources":["../../../../src/components/admin/UserDetails/UserDetails.tsx"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n AdministrationMode,\n GroupQueryKeys,\n ManagedUser,\n MembershipGroupListResponse,\n UpdateManagedUserRequest,\n UserQueryKeys,\n deleteUser,\n getUser,\n getUserGroups,\n toManagementErrorMessage,\n updateUser,\n} from '@thunderid/browser';\nimport {FC, ReactElement} from 'react';\nimport BaseUserDetails, {BaseUserDetailsProps} from './BaseUserDetails';\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 UpdateUserVariables {\n data: UpdateManagedUserRequest;\n userId: string;\n}\n\nexport type UserDetailsProps = Omit<\n BaseUserDetailsProps,\n | 'error'\n | 'groups'\n | 'isDeleting'\n | 'isLoading'\n | 'isRunningLifecycleAction'\n | 'isUpdating'\n | 'lifecycleActions'\n | 'onDelete'\n | 'onLifecycleAction'\n | 'onUpdate'\n | 'user'\n> & {\n /**\n * How the delete runs. `flow` runs the user deletion flow the server configures, which revokes the\n * user's grants and ends their sessions before the record goes. It needs `baseUrl`.\n * @default 'native'\n */\n administrationMode?: AdministrationMode;\n /**\n * Whether the user can be deleted from this view.\n * @default false\n */\n deletable?: boolean;\n /**\n * Whether the user's text attributes can be edited from this view.\n * @default false\n */\n editable?: boolean;\n /**\n * Whether the user can be suspended, unsuspended and unlocked from this view. Each action runs\n * through its administration flow and is offered only when the server configures that flow. Reading\n * the configured flows needs a token that may read the server configuration.\n * @default false\n */\n lifecycleActions?: boolean;\n /**\n * Called after the user has been deleted.\n */\n onDeleted?: () => void;\n userId: string;\n};\n\n/**\n * Shows a user and the groups they belong to, and optionally lets the signed-in user delete them.\n *\n * @example\n * ```tsx\n * <UserDetails userId={userId} deletable onDeleted={() => navigate('/users')} />\n * ```\n */\nconst UserDetails: FC<UserDetailsProps> = ({\n administrationMode,\n deletable = false,\n editable = false,\n lifecycleActions = false,\n onDeleted,\n preferences,\n userId,\n ...rest\n}: UserDetailsProps): ReactElement => {\n const {t} = useTranslation(preferences?.i18n);\n const endpoint: ManagementEndpoint = useManagementEndpoint('users');\n const user: ResourceQueryResult<ManagedUser> = useResourceQuery(\n [UserQueryKeys.USER, userId],\n (fetcher) => getUser({...endpoint, fetcher, userId}),\n {enabled: Boolean(userId)},\n );\n const groups: ResourceQueryResult<MembershipGroupListResponse> = useResourceQuery(\n [GroupQueryKeys.MEMBERSHIPS, 'user', userId, {limit: 100}],\n (fetcher) => getUserGroups({...endpoint, fetcher, limit: 100, userId}),\n {enabled: Boolean(userId)},\n );\n const deletion: ResourceMutationResult<void, string> = useResourceMutation(\n (id: string, fetcher) => deleteUser({...endpoint, administrationMode, fetcher, userId: id}),\n () => [[UserQueryKeys.USERS]],\n {onSuccess: onDeleted},\n );\n const update: ResourceMutationResult<ManagedUser, UpdateUserVariables> = useResourceMutation(\n ({data, userId: id}: UpdateUserVariables, fetcher) => updateUser({...endpoint, fetcher, payload: data, userId: id}),\n ({userId: id}: UpdateUserVariables) => [[UserQueryKeys.USER, id], [UserQueryKeys.USERS]],\n );\n\n const lifecycle: AccountLifecycleState = useAccountLifecycle({\n enabled: lifecycleActions,\n invalidatedKeys: [[UserQueryKeys.USER, userId], [UserQueryKeys.USERS]],\n kind: 'user',\n status: user.data?.status?.value,\n subject: userId,\n });\n\n return (\n <BaseUserDetails\n user={user.data}\n groups={groups.data?.groups}\n isLoading={user.isLoading}\n error={\n toManagementErrorMessage(t, user.error, 'admin.users.details.error') ??\n toManagementErrorMessage(t, deletion.error, 'admin.users.details.delete.error') ??\n toManagementErrorMessage(t, update.error, 'admin.users.details.edit.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(userId) : undefined}\n lifecycleActions={lifecycle.actions}\n isRunningLifecycleAction={lifecycle.isRunning}\n onLifecycleAction={lifecycleActions ? lifecycle.run : undefined}\n isUpdating={update.isLoading}\n onUpdate={\n editable && user.data\n ? (attributes: Record<string, unknown>): void =>\n void update.mutate({data: {attributes, ouId: user.data!.ouId, type: user.data!.type}, userId})\n : undefined\n }\n preferences={preferences}\n {...rest}\n />\n );\n};\n\nexport default UserDetails;\n"],"mappings":";;;;;;;;;;;;;;;;;;AAiFA,MAAMA,eAAqC,EACzC,oBACA,YAAY,OACZ,WAAW,OACX,mBAAmB,OACnB,WACA,aACA,OACA,GAAG,WACiC;CACpC,MAAM,EAAC,MAAKC,uBAAe,aAAa,KAAK;CAC7C,MAAMC,WAA+BC,8BAAsB,QAAQ;CACnE,MAAMC,OAAyCC,yBAC7C,CAAC,cAAc,MAAM,OAAO,GAC3B,YAAY,QAAQ;EAAC,GAAG;EAAU;EAAS;EAAO,CAAC,EACpD,EAAC,SAAS,QAAQ,OAAO,EAAC,CAC3B;CACD,MAAMC,SAA2DD,yBAC/D;EAAC,eAAe;EAAa;EAAQ;EAAQ,EAAC,OAAO,KAAI;EAAC,GACzD,YAAY,cAAc;EAAC,GAAG;EAAU;EAAS,OAAO;EAAK;EAAO,CAAC,EACtE,EAAC,SAAS,QAAQ,OAAO,EAAC,CAC3B;CACD,MAAME,WAAiDC,6BACpD,IAAY,YAAY,WAAW;EAAC,GAAG;EAAU;EAAoB;EAAS,QAAQ;EAAG,CAAC,QACrF,CAAC,CAAC,cAAc,MAAM,CAAC,EAC7B,EAAC,WAAW,WAAU,CACvB;CACD,MAAMC,SAAmED,6BACtE,EAAC,MAAM,QAAQ,MAA0B,YAAY,WAAW;EAAC,GAAG;EAAU;EAAS,SAAS;EAAM,QAAQ;EAAG,CAAC,GAClH,EAAC,QAAQ,SAA6B,CAAC,CAAC,cAAc,MAAM,GAAG,EAAE,CAAC,cAAc,MAAM,CAAC,CACzF;CAED,MAAME,YAAmCC,4BAAoB;EAC3D,SAAS;EACT,iBAAiB,CAAC,CAAC,cAAc,MAAM,OAAO,EAAE,CAAC,cAAc,MAAM,CAAC;EACtE,MAAM;EACN,QAAQ,KAAK,MAAM,QAAQ;EAC3B,SAAS;EACV,CAAC;AAEF,QACE,oBAACC;EACC,MAAM,KAAK;EACX,QAAQ,OAAO,MAAM;EACrB,WAAW,KAAK;EAChB,OACE,yBAAyB,GAAG,KAAK,OAAO,4BAA4B,IACpE,yBAAyB,GAAG,SAAS,OAAO,mCAAmC,IAC/E,yBAAyB,GAAG,OAAO,OAAO,iCAAiC,IAC3E,yBAAyB,GAAG,UAAU,OAAO,+BAA+B,IAC5E,yBAAyB,GAAG,UAAU,WAAW,oCAAoC;EAEvF,YAAY,SAAS;EACrB,UAAU,kBAAwB,KAAK,SAAS,OAAO,OAAO,GAAG;EACjE,kBAAkB,UAAU;EAC5B,0BAA0B,UAAU;EACpC,mBAAmB,mBAAmB,UAAU,MAAM;EACtD,YAAY,OAAO;EACnB,UACE,YAAY,KAAK,QACZ,eACC,KAAK,OAAO,OAAO;GAAC,MAAM;IAAC;IAAY,MAAM,KAAK,KAAM;IAAM,MAAM,KAAK,KAAM;IAAK;GAAE;GAAO,CAAC,GAChG;EAEO;EACb,GAAI;GACJ;;AAIN,0BAAe"}
@@ -1 +1 @@
1
- {"version":3,"file":"UserList.d.ts","sourceRoot":"","sources":["../../../../src/components/admin/UserList/UserList.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAC,EAAE,EAAyB,MAAM,OAAO,CAAC;AACjD,OAAqB,EAAC,iBAAiB,EAAC,MAAM,gBAAgB,CAAC;AAK/D,MAAM,MAAM,aAAa,GAAG,IAAI,CAC9B,iBAAiB,EACjB,OAAO,GAAG,WAAW,GAAG,QAAQ,GAAG,cAAc,GAAG,UAAU,GAAG,QAAQ,GAAG,cAAc,GAAG,OAAO,CACrG,GAAG;IACF;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF;;;;;;;GAOG;AACH,QAAA,MAAM,QAAQ,EAAE,EAAE,CAAC,aAAa,CA4C/B,CAAC;AAEF,eAAe,QAAQ,CAAC"}
1
+ {"version":3,"file":"UserList.d.ts","sourceRoot":"","sources":["../../../../src/components/admin/UserList/UserList.tsx"],"names":[],"mappings":"AAWA,OAAO,EAAC,EAAE,EAAyB,MAAM,OAAO,CAAC;AACjD,OAAqB,EAAC,iBAAiB,EAAC,MAAM,gBAAgB,CAAC;AAM/D,MAAM,MAAM,aAAa,GAAG,IAAI,CAC9B,iBAAiB,EACjB,OAAO,GAAG,WAAW,GAAG,QAAQ,GAAG,cAAc,GAAG,UAAU,GAAG,QAAQ,GAAG,cAAc,GAAG,OAAO,CACrG,GAAG;IACF;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF;;;;;;;GAOG;AACH,QAAA,MAAM,QAAQ,EAAE,EAAE,CAAC,aAAa,CA8C/B,CAAC;AAEF,eAAe,QAAQ,CAAC"}
@@ -1,7 +1,8 @@
1
1
  import useTranslation_default from "../../../hooks/useTranslation.js";
2
- import useGetUsers_default from "../../../hooks/management/users/useGetUsers.js";
2
+ import useManagementEndpoint_default from "../../../hooks/management/useManagementEndpoint.js";
3
+ import useResourceQuery_default from "../../../hooks/management/useResourceQuery.js";
3
4
  import BaseUserList_default from "./BaseUserList.js";
4
- import { toEqualityFilter, toManagementErrorMessage } from "@thunderid/browser";
5
+ import { UserQueryKeys, getUsers, toEqualityFilter, toManagementErrorMessage } from "@thunderid/browser";
5
6
  import { useState } from "react";
6
7
  import { jsx } from "react/jsx-runtime";
7
8
 
@@ -25,11 +26,19 @@ const UserList = ({ filter, limit = 20, preferences, searchable = true, searchAt
25
26
  label: t("admin.users.list.search.email"),
26
27
  value: "email"
27
28
  }];
28
- const { data, error, isLoading } = useGetUsers_default({
29
- filter: filter ?? (search ? toEqualityFilter(search.attribute, search.value) : void 0),
29
+ const endpoint = useManagementEndpoint_default("users");
30
+ const queryFilter = filter ?? (search ? toEqualityFilter(search.attribute, search.value) : void 0);
31
+ const { data, error, isLoading } = useResourceQuery_default([UserQueryKeys.USERS, {
32
+ filter: queryFilter,
30
33
  limit,
31
34
  offset
32
- });
35
+ }], (fetcher) => getUsers({
36
+ ...endpoint,
37
+ fetcher,
38
+ filter: queryFilter,
39
+ limit,
40
+ offset
41
+ }));
33
42
  return /* @__PURE__ */ jsx(BaseUserList_default, {
34
43
  users: data?.users ?? [],
35
44
  totalResults: data?.totalResults,
@@ -1 +1 @@
1
- {"version":3,"file":"UserList.js","names":["UserList: FC<UserListProps>","useTranslation","attributes: SelectOption[]","useGetUsers","BaseUserList"],"sources":["../../../../src/components/admin/UserList/UserList.tsx"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {toEqualityFilter, toManagementErrorMessage, SelectOption} from '@thunderid/browser';\nimport {FC, ReactElement, useState} from 'react';\nimport BaseUserList, {BaseUserListProps} from './BaseUserList';\nimport {AdminSearchValue} from '../shared/AdminSearch';\nimport useGetUsers from '../../../hooks/management/users/useGetUsers';\nimport useTranslation from '../../../hooks/useTranslation';\n\nexport type UserListProps = Omit<\n BaseUserListProps,\n 'error' | 'isLoading' | 'offset' | 'onPageChange' | 'onSearch' | 'search' | 'totalResults' | 'users'\n> & {\n /**\n * Server-side filter expression, for example `username eq \"ada\"`. Hides the search form, since the\n * server takes one expression.\n */\n filter?: string;\n /**\n * Whether to show the search form. The server matches the whole value of the chosen attribute.\n * @default true\n */\n searchable?: boolean;\n};\n\n/**\n * Lists the users the signed-in user is allowed to see, a page at a time.\n *\n * @example\n * ```tsx\n * <UserList onSelect={(user) => setSelectedUserId(user.id)} />\n * ```\n */\nconst UserList: FC<UserListProps> = ({\n filter,\n limit = 20,\n preferences,\n searchable = true,\n searchAttributes,\n ...rest\n}: UserListProps): 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 ?? [\n {label: t('admin.users.list.search.username'), value: 'username'},\n {label: t('admin.users.list.search.email'), value: 'email'},\n ];\n const {data, error, isLoading} = useGetUsers({\n filter: filter ?? (search ? toEqualityFilter(search.attribute, search.value) : undefined),\n limit,\n offset,\n });\n\n return (\n <BaseUserList\n users={data?.users ?? []}\n totalResults={data?.totalResults}\n isLoading={isLoading}\n error={toManagementErrorMessage(t, error, 'admin.users.list.error')}\n limit={limit}\n offset={offset}\n onPageChange={setOffset}\n search={search}\n searchAttributes={attributes}\n onSearch={\n searchable && !filter\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 UserList;\n"],"mappings":";;;;;;;;;;;;;;;;AAkCA,MAAMA,YAA+B,EACnC,QACA,QAAQ,IACR,aACA,aAAa,MACb,iBACA,GAAG,WAC8B;CACjC,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,CACrD;EAAC,OAAO,EAAE,mCAAmC;EAAE,OAAO;EAAW,EACjE;EAAC,OAAO,EAAE,gCAAgC;EAAE,OAAO;EAAQ,CAC5D;CACD,MAAM,EAAC,MAAM,OAAO,cAAaC,oBAAY;EAC3C,QAAQ,WAAW,SAAS,iBAAiB,OAAO,WAAW,OAAO,MAAM,GAAG;EAC/E;EACA;EACD,CAAC;AAEF,QACE,oBAACC;EACC,OAAO,MAAM,SAAS,EAAE;EACxB,cAAc,MAAM;EACT;EACX,OAAO,yBAAyB,GAAG,OAAO,yBAAyB;EAC5D;EACC;EACR,cAAc;EACN;EACR,kBAAkB;EAClB,UACE,cAAc,CAAC,UACV,SAAwC;AACvC,aAAU,KAAK;AACf,aAAU,EAAE;MAEd;EAEO;EACb,GAAI;GACJ;;AAIN,uBAAe"}
1
+ {"version":3,"file":"UserList.js","names":["UserList: FC<UserListProps>","useTranslation","attributes: SelectOption[]","endpoint: ManagementEndpoint","useManagementEndpoint","queryFilter: string | undefined","useResourceQuery","BaseUserList"],"sources":["../../../../src/components/admin/UserList/UserList.tsx"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n ManagedUserListResponse,\n SelectOption,\n UserQueryKeys,\n getUsers,\n toEqualityFilter,\n toManagementErrorMessage,\n} from '@thunderid/browser';\nimport {FC, ReactElement, useState} from 'react';\nimport BaseUserList, {BaseUserListProps} from './BaseUserList';\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 UserListProps = Omit<\n BaseUserListProps,\n 'error' | 'isLoading' | 'offset' | 'onPageChange' | 'onSearch' | 'search' | 'totalResults' | 'users'\n> & {\n /**\n * Server-side filter expression, for example `username eq \"ada\"`. Hides the search form, since the\n * server takes one expression.\n */\n filter?: string;\n /**\n * Whether to show the search form. The server matches the whole value of the chosen attribute.\n * @default true\n */\n searchable?: boolean;\n};\n\n/**\n * Lists the users the signed-in user is allowed to see, a page at a time.\n *\n * @example\n * ```tsx\n * <UserList onSelect={(user) => setSelectedUserId(user.id)} />\n * ```\n */\nconst UserList: FC<UserListProps> = ({\n filter,\n limit = 20,\n preferences,\n searchable = true,\n searchAttributes,\n ...rest\n}: UserListProps): 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 ?? [\n {label: t('admin.users.list.search.username'), value: 'username'},\n {label: t('admin.users.list.search.email'), value: 'email'},\n ];\n const endpoint: ManagementEndpoint = useManagementEndpoint('users');\n const queryFilter: string | undefined =\n filter ?? (search ? toEqualityFilter(search.attribute, search.value) : undefined);\n const {data, error, isLoading}: ResourceQueryResult<ManagedUserListResponse> = useResourceQuery(\n [UserQueryKeys.USERS, {filter: queryFilter, limit, offset}],\n (fetcher) => getUsers({...endpoint, fetcher, filter: queryFilter, limit, offset}),\n );\n\n return (\n <BaseUserList\n users={data?.users ?? []}\n totalResults={data?.totalResults}\n isLoading={isLoading}\n error={toManagementErrorMessage(t, error, 'admin.users.list.error')}\n limit={limit}\n offset={offset}\n onPageChange={setOffset}\n search={search}\n searchAttributes={attributes}\n onSearch={\n searchable && !filter\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 UserList;\n"],"mappings":";;;;;;;;;;;;;;;;;AA0CA,MAAMA,YAA+B,EACnC,QACA,QAAQ,IACR,aACA,aAAa,MACb,iBACA,GAAG,WAC8B;CACjC,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,CACrD;EAAC,OAAO,EAAE,mCAAmC;EAAE,OAAO;EAAW,EACjE;EAAC,OAAO,EAAE,gCAAgC;EAAE,OAAO;EAAQ,CAC5D;CACD,MAAMC,WAA+BC,8BAAsB,QAAQ;CACnE,MAAMC,cACJ,WAAW,SAAS,iBAAiB,OAAO,WAAW,OAAO,MAAM,GAAG;CACzE,MAAM,EAAC,MAAM,OAAO,cAA2DC,yBAC7E,CAAC,cAAc,OAAO;EAAC,QAAQ;EAAa;EAAO;EAAO,CAAC,GAC1D,YAAY,SAAS;EAAC,GAAG;EAAU;EAAS,QAAQ;EAAa;EAAO;EAAO,CAAC,CAClF;AAED,QACE,oBAACC;EACC,OAAO,MAAM,SAAS,EAAE;EACxB,cAAc,MAAM;EACT;EACX,OAAO,yBAAyB,GAAG,OAAO,yBAAyB;EAC5D;EACC;EACR,cAAc;EACN;EACR,kBAAkB;EAClB,UACE,cAAc,CAAC,UACV,SAAwC;AACvC,aAAU,KAAK;AACf,aAAU,EAAE;MAEd;EAEO;EACb,GAAI;GACJ;;AAIN,uBAAe"}
@@ -0,0 +1,32 @@
1
+ import { AccessStatusValue, AccountLifecycleAction } from '@thunderid/browser';
2
+ import { FC } from 'react';
3
+ export interface AccessStatusBadgeProps {
4
+ status?: AccessStatusValue;
5
+ }
6
+ /**
7
+ * The translated access status of an identity, or its raw value when the status is one this SDK does
8
+ * not know. Renders nothing when the server reports no status.
9
+ */
10
+ export declare const AccessStatusBadge: FC<AccessStatusBadgeProps>;
11
+ export interface AccountLifecycleButtonsProps {
12
+ /**
13
+ * The actions to offer, most expected first.
14
+ */
15
+ actions: AccountLifecycleAction[];
16
+ /**
17
+ * Whether a suspension asks for an optional operator note. The note is recorded by the flow.
18
+ */
19
+ collectsOperatorNote?: boolean;
20
+ isRunning?: boolean;
21
+ /**
22
+ * Name of the identity, already resolved, used in the confirmation question.
23
+ */
24
+ name: string;
25
+ onAction: (action: AccountLifecycleAction, operatorNote?: string) => void;
26
+ }
27
+ /**
28
+ * One button per account lifecycle action. Suspending and unsuspending ask for confirmation inline;
29
+ * unlocking is remedial and runs straight away.
30
+ */
31
+ export declare const AccountLifecycleButtons: FC<AccountLifecycleButtonsProps>;
32
+ //# sourceMappingURL=AccountLifecycleParts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AccountLifecycleParts.d.ts","sourceRoot":"","sources":["../../../../src/components/admin/shared/AccountLifecycleParts.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAC,iBAAiB,EAAE,sBAAsB,EAAC,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAc,EAAE,EAAyB,MAAM,OAAO,CAAC;AAW9D,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,EAAE,iBAAiB,CAAC;CAC5B;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,EAAE,CAAC,sBAAsB,CAiBxD,CAAC;AAEF,MAAM,WAAW,4BAA4B;IAC3C;;OAEG;IACH,OAAO,EAAE,sBAAsB,EAAE,CAAC;IAClC;;OAEG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,CAAC,MAAM,EAAE,sBAAsB,EAAE,YAAY,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CAC3E;AAED;;;GAGG;AACH,eAAO,MAAM,uBAAuB,EAAE,EAAE,CAAC,4BAA4B,CAkFpE,CAAC"}