@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.
- package/dist/cjs/components/account/UserProfile/BaseUserProfile.cjs +1 -1
- package/dist/cjs/components/admin/AgentCreate/AgentCreate.cjs +15 -4
- package/dist/cjs/components/admin/AgentCreate/AgentCreate.cjs.map +1 -1
- package/dist/cjs/components/admin/AgentDetails/AgentDetails.cjs +49 -10
- package/dist/cjs/components/admin/AgentDetails/AgentDetails.cjs.map +1 -1
- package/dist/cjs/components/admin/AgentDetails/BaseAgentDetails.cjs +25 -7
- package/dist/cjs/components/admin/AgentDetails/BaseAgentDetails.cjs.map +1 -1
- package/dist/cjs/components/admin/AgentList/AgentList.cjs +13 -4
- package/dist/cjs/components/admin/AgentList/AgentList.cjs.map +1 -1
- package/dist/cjs/components/admin/ApplicationCreate/ApplicationCreate.cjs +70 -0
- package/dist/cjs/components/admin/ApplicationCreate/ApplicationCreate.cjs.map +1 -0
- package/dist/cjs/components/admin/ApplicationCreate/BaseApplicationCreate.cjs +135 -0
- package/dist/cjs/components/admin/ApplicationCreate/BaseApplicationCreate.cjs.map +1 -0
- package/dist/cjs/components/admin/ApplicationDetails/ApplicationDetails.cjs +95 -0
- package/dist/cjs/components/admin/ApplicationDetails/ApplicationDetails.cjs.map +1 -0
- package/dist/cjs/components/admin/ApplicationDetails/BaseApplicationDetails.cjs +255 -0
- package/dist/cjs/components/admin/ApplicationDetails/BaseApplicationDetails.cjs.map +1 -0
- package/dist/cjs/components/admin/ApplicationList/ApplicationList.cjs +55 -0
- package/dist/cjs/components/admin/ApplicationList/ApplicationList.cjs.map +1 -0
- package/dist/cjs/components/admin/ApplicationList/BaseApplicationList.cjs +95 -0
- package/dist/cjs/components/admin/ApplicationList/BaseApplicationList.cjs.map +1 -0
- package/dist/cjs/components/admin/GroupCreate/GroupCreate.cjs +8 -2
- package/dist/cjs/components/admin/GroupCreate/GroupCreate.cjs.map +1 -1
- package/dist/cjs/components/admin/GroupList/GroupList.cjs +10 -3
- package/dist/cjs/components/admin/GroupList/GroupList.cjs.map +1 -1
- package/dist/cjs/components/admin/GroupMembers/GroupMembers.cjs +49 -11
- package/dist/cjs/components/admin/GroupMembers/GroupMembers.cjs.map +1 -1
- package/dist/cjs/components/admin/RoleAssignments/RoleAssignments.cjs +50 -15
- package/dist/cjs/components/admin/RoleAssignments/RoleAssignments.cjs.map +1 -1
- package/dist/cjs/components/admin/RoleCreate/RoleCreate.cjs +8 -2
- package/dist/cjs/components/admin/RoleCreate/RoleCreate.cjs.map +1 -1
- package/dist/cjs/components/admin/RoleList/RoleList.cjs +10 -3
- package/dist/cjs/components/admin/RoleList/RoleList.cjs.map +1 -1
- package/dist/cjs/components/admin/RolePermissions/RolePermissions.cjs +8 -2
- package/dist/cjs/components/admin/RolePermissions/RolePermissions.cjs.map +1 -1
- package/dist/cjs/components/admin/UserCreate/UserCreate.cjs +15 -4
- package/dist/cjs/components/admin/UserCreate/UserCreate.cjs.map +1 -1
- package/dist/cjs/components/admin/UserDetails/BaseUserDetails.cjs +32 -14
- package/dist/cjs/components/admin/UserDetails/BaseUserDetails.cjs.map +1 -1
- package/dist/cjs/components/admin/UserDetails/UserDetails.cjs +45 -10
- package/dist/cjs/components/admin/UserDetails/UserDetails.cjs.map +1 -1
- package/dist/cjs/components/admin/UserList/UserList.cjs +13 -4
- package/dist/cjs/components/admin/UserList/UserList.cjs.map +1 -1
- package/dist/cjs/components/admin/shared/AccountLifecycleParts.cjs +105 -0
- package/dist/cjs/components/admin/shared/AccountLifecycleParts.cjs.map +1 -0
- package/dist/cjs/components/admin/shared/ApplicationFormFields.cjs +62 -0
- package/dist/cjs/components/admin/shared/ApplicationFormFields.cjs.map +1 -0
- package/dist/cjs/components/admin/shared/ClientSecretNotice.cjs +49 -0
- package/dist/cjs/components/admin/shared/ClientSecretNotice.cjs.map +1 -0
- package/dist/cjs/components/auth/AcceptInvite/BaseAcceptInvite.cjs +4 -5
- package/dist/cjs/components/auth/AcceptInvite/BaseAcceptInvite.cjs.map +1 -1
- package/dist/cjs/components/auth/InviteUser/InviteUser.cjs +1 -1
- package/dist/cjs/components/auth/SignIn/SignIn.cjs +5 -5
- package/dist/cjs/components/auth/SignIn/SignIn.cjs.map +1 -1
- package/dist/cjs/components/auth/flow/AuthOptionFactory.cjs +4 -5
- package/dist/cjs/components/auth/flow/AuthOptionFactory.cjs.map +1 -1
- package/dist/cjs/components/auth/flow/Consent.cjs +53 -28
- package/dist/cjs/components/auth/flow/Consent.cjs.map +1 -1
- package/dist/cjs/components/auth/flow/ConsentAuthorizationDetail.cjs +104 -0
- package/dist/cjs/components/auth/flow/ConsentAuthorizationDetail.cjs.map +1 -0
- package/dist/cjs/components/auth/flow/ConsentAuthorizationDetail.styles.cjs +59 -0
- package/dist/cjs/components/auth/flow/ConsentAuthorizationDetail.styles.cjs.map +1 -0
- package/dist/cjs/components/auth/flow/ConsentDetailField.cjs +171 -0
- package/dist/cjs/components/auth/flow/ConsentDetailField.cjs.map +1 -0
- package/dist/cjs/components/auth/flow/ConsentDetailField.styles.cjs +85 -0
- package/dist/cjs/components/auth/flow/ConsentDetailField.styles.cjs.map +1 -0
- package/dist/cjs/components/auth/flow/ConsentDetailText.cjs +63 -0
- package/dist/cjs/components/auth/flow/ConsentDetailText.cjs.map +1 -0
- package/dist/cjs/components/auth/flow/ConsentDetailText.styles.cjs +83 -0
- package/dist/cjs/components/auth/flow/ConsentDetailText.styles.cjs.map +1 -0
- package/dist/cjs/components/auth/flow/FieldFactory.cjs +1 -1
- package/dist/cjs/components/auth/flow/resolveConsentText.cjs +25 -0
- package/dist/cjs/components/auth/flow/resolveConsentText.cjs.map +1 -0
- package/dist/cjs/components/primitives/KeyValueInput/KeyValueInput.cjs +1 -1
- package/dist/cjs/components/primitives/MultiInput/MultiInput.cjs +1 -1
- package/dist/cjs/components/primitives/PasswordField/PasswordField.cjs +1 -1
- package/dist/cjs/hooks/auth/useConsentDetailField.cjs +357 -0
- package/dist/cjs/hooks/auth/useConsentDetailField.cjs.map +1 -0
- package/dist/cjs/hooks/management/useAccountLifecycle.cjs +59 -0
- package/dist/cjs/hooks/management/useAccountLifecycle.cjs.map +1 -0
- package/dist/cjs/hooks/management/useManagementEndpoint.cjs.map +1 -1
- package/dist/cjs/hooks/management/useManagementRequestConfig.cjs +41 -0
- package/dist/cjs/hooks/management/useManagementRequestConfig.cjs.map +1 -0
- package/dist/cjs/index.cjs +1130 -187
- package/dist/cjs/utils/formatConsentDetailValue.cjs +26 -0
- package/dist/cjs/utils/formatConsentDetailValue.cjs.map +1 -0
- package/dist/cjs/utils/getConsentDetailLayout.cjs +44 -0
- package/dist/cjs/utils/getConsentDetailLayout.cjs.map +1 -0
- package/dist/cjs/utils/getConsentDetailListDisplay.cjs +30 -0
- package/dist/cjs/utils/getConsentDetailListDisplay.cjs.map +1 -0
- package/dist/cjs/utils/isConsentApprovalBlocked.cjs +41 -0
- package/dist/cjs/utils/isConsentApprovalBlocked.cjs.map +1 -0
- package/dist/cjs/utils/isConsentDetailPlainList.cjs +24 -0
- package/dist/cjs/utils/isConsentDetailPlainList.cjs.map +1 -0
- package/dist/cjs/utils/isConsentDetailStructured.cjs +15 -0
- package/dist/cjs/utils/isConsentDetailStructured.cjs.map +1 -0
- package/dist/cjs/utils/isConsentDetailTextClamped.cjs +25 -0
- package/dist/cjs/utils/isConsentDetailTextClamped.cjs.map +1 -0
- package/dist/components/account/UserProfile/BaseUserProfile.js +1 -1
- package/dist/components/admin/AgentCreate/AgentCreate.d.ts.map +1 -1
- package/dist/components/admin/AgentCreate/AgentCreate.js +16 -5
- package/dist/components/admin/AgentCreate/AgentCreate.js.map +1 -1
- package/dist/components/admin/AgentDetails/AgentDetails.d.ts +8 -1
- package/dist/components/admin/AgentDetails/AgentDetails.d.ts.map +1 -1
- package/dist/components/admin/AgentDetails/AgentDetails.js +50 -11
- package/dist/components/admin/AgentDetails/AgentDetails.js.map +1 -1
- package/dist/components/admin/AgentDetails/BaseAgentDetails.d.ts +21 -1
- package/dist/components/admin/AgentDetails/BaseAgentDetails.d.ts.map +1 -1
- package/dist/components/admin/AgentDetails/BaseAgentDetails.js +25 -7
- package/dist/components/admin/AgentDetails/BaseAgentDetails.js.map +1 -1
- package/dist/components/admin/AgentList/AgentList.d.ts.map +1 -1
- package/dist/components/admin/AgentList/AgentList.js +14 -5
- package/dist/components/admin/AgentList/AgentList.js.map +1 -1
- package/dist/components/admin/ApplicationCreate/ApplicationCreate.d.ts +30 -0
- package/dist/components/admin/ApplicationCreate/ApplicationCreate.d.ts.map +1 -0
- package/dist/components/admin/ApplicationCreate/ApplicationCreate.js +66 -0
- package/dist/components/admin/ApplicationCreate/ApplicationCreate.js.map +1 -0
- package/dist/components/admin/ApplicationCreate/BaseApplicationCreate.d.ts +80 -0
- package/dist/components/admin/ApplicationCreate/BaseApplicationCreate.d.ts.map +1 -0
- package/dist/components/admin/ApplicationCreate/BaseApplicationCreate.js +131 -0
- package/dist/components/admin/ApplicationCreate/BaseApplicationCreate.js.map +1 -0
- package/dist/components/admin/ApplicationDetails/ApplicationDetails.d.ts +64 -0
- package/dist/components/admin/ApplicationDetails/ApplicationDetails.d.ts.map +1 -0
- package/dist/components/admin/ApplicationDetails/ApplicationDetails.js +92 -0
- package/dist/components/admin/ApplicationDetails/ApplicationDetails.js.map +1 -0
- package/dist/components/admin/ApplicationDetails/BaseApplicationDetails.d.ts +111 -0
- package/dist/components/admin/ApplicationDetails/BaseApplicationDetails.d.ts.map +1 -0
- package/dist/components/admin/ApplicationDetails/BaseApplicationDetails.js +251 -0
- package/dist/components/admin/ApplicationDetails/BaseApplicationDetails.js.map +1 -0
- package/dist/components/admin/ApplicationList/ApplicationList.d.ts +18 -0
- package/dist/components/admin/ApplicationList/ApplicationList.d.ts.map +1 -0
- package/dist/components/admin/ApplicationList/ApplicationList.js +51 -0
- package/dist/components/admin/ApplicationList/ApplicationList.js.map +1 -0
- package/dist/components/admin/ApplicationList/BaseApplicationList.d.ts +55 -0
- package/dist/components/admin/ApplicationList/BaseApplicationList.d.ts.map +1 -0
- package/dist/components/admin/ApplicationList/BaseApplicationList.js +93 -0
- package/dist/components/admin/ApplicationList/BaseApplicationList.js.map +1 -0
- package/dist/components/admin/GroupCreate/GroupCreate.d.ts.map +1 -1
- package/dist/components/admin/GroupCreate/GroupCreate.js +9 -3
- package/dist/components/admin/GroupCreate/GroupCreate.js.map +1 -1
- package/dist/components/admin/GroupList/GroupList.d.ts.map +1 -1
- package/dist/components/admin/GroupList/GroupList.js +11 -4
- package/dist/components/admin/GroupList/GroupList.js.map +1 -1
- package/dist/components/admin/GroupMembers/GroupMembers.d.ts +7 -0
- package/dist/components/admin/GroupMembers/GroupMembers.d.ts.map +1 -1
- package/dist/components/admin/GroupMembers/GroupMembers.js +50 -12
- package/dist/components/admin/GroupMembers/GroupMembers.js.map +1 -1
- package/dist/components/admin/RoleAssignments/RoleAssignments.d.ts +7 -0
- package/dist/components/admin/RoleAssignments/RoleAssignments.d.ts.map +1 -1
- package/dist/components/admin/RoleAssignments/RoleAssignments.js +51 -16
- package/dist/components/admin/RoleAssignments/RoleAssignments.js.map +1 -1
- package/dist/components/admin/RoleCreate/RoleCreate.d.ts.map +1 -1
- package/dist/components/admin/RoleCreate/RoleCreate.js +9 -3
- package/dist/components/admin/RoleCreate/RoleCreate.js.map +1 -1
- package/dist/components/admin/RoleList/RoleList.d.ts.map +1 -1
- package/dist/components/admin/RoleList/RoleList.js +11 -4
- package/dist/components/admin/RoleList/RoleList.js.map +1 -1
- package/dist/components/admin/RolePermissions/RolePermissions.d.ts.map +1 -1
- package/dist/components/admin/RolePermissions/RolePermissions.js +9 -3
- package/dist/components/admin/RolePermissions/RolePermissions.js.map +1 -1
- package/dist/components/admin/UserCreate/UserCreate.d.ts.map +1 -1
- package/dist/components/admin/UserCreate/UserCreate.js +16 -5
- package/dist/components/admin/UserCreate/UserCreate.js.map +1 -1
- package/dist/components/admin/UserDetails/BaseUserDetails.d.ts +22 -1
- package/dist/components/admin/UserDetails/BaseUserDetails.d.ts.map +1 -1
- package/dist/components/admin/UserDetails/BaseUserDetails.js +32 -14
- package/dist/components/admin/UserDetails/BaseUserDetails.js.map +1 -1
- package/dist/components/admin/UserDetails/UserDetails.d.ts +15 -1
- package/dist/components/admin/UserDetails/UserDetails.d.ts.map +1 -1
- package/dist/components/admin/UserDetails/UserDetails.js +46 -11
- package/dist/components/admin/UserDetails/UserDetails.js.map +1 -1
- package/dist/components/admin/UserList/UserList.d.ts.map +1 -1
- package/dist/components/admin/UserList/UserList.js +14 -5
- package/dist/components/admin/UserList/UserList.js.map +1 -1
- package/dist/components/admin/shared/AccountLifecycleParts.d.ts +32 -0
- package/dist/components/admin/shared/AccountLifecycleParts.d.ts.map +1 -0
- package/dist/components/admin/shared/AccountLifecycleParts.js +101 -0
- package/dist/components/admin/shared/AccountLifecycleParts.js.map +1 -0
- package/dist/components/admin/shared/ApplicationFormFields.d.ts +35 -0
- package/dist/components/admin/shared/ApplicationFormFields.d.ts.map +1 -0
- package/dist/components/admin/shared/ApplicationFormFields.js +59 -0
- package/dist/components/admin/shared/ApplicationFormFields.js.map +1 -0
- package/dist/components/admin/shared/ClientSecretNotice.d.ts +16 -0
- package/dist/components/admin/shared/ClientSecretNotice.d.ts.map +1 -0
- package/dist/components/admin/shared/ClientSecretNotice.js +47 -0
- package/dist/components/admin/shared/ClientSecretNotice.js.map +1 -0
- package/dist/components/auth/AcceptInvite/BaseAcceptInvite.d.ts.map +1 -1
- package/dist/components/auth/AcceptInvite/BaseAcceptInvite.js +5 -6
- package/dist/components/auth/AcceptInvite/BaseAcceptInvite.js.map +1 -1
- package/dist/components/auth/InviteUser/InviteUser.js +1 -1
- package/dist/components/auth/SignIn/SignIn.d.ts.map +1 -1
- package/dist/components/auth/SignIn/SignIn.js +6 -6
- package/dist/components/auth/SignIn/SignIn.js.map +1 -1
- package/dist/components/auth/flow/AuthOptionFactory.d.ts.map +1 -1
- package/dist/components/auth/flow/AuthOptionFactory.js +5 -6
- package/dist/components/auth/flow/AuthOptionFactory.js.map +1 -1
- package/dist/components/auth/flow/Consent.d.ts +6 -0
- package/dist/components/auth/flow/Consent.d.ts.map +1 -1
- package/dist/components/auth/flow/Consent.js +54 -29
- package/dist/components/auth/flow/Consent.js.map +1 -1
- package/dist/components/auth/flow/ConsentAuthorizationDetail.d.ts +68 -0
- package/dist/components/auth/flow/ConsentAuthorizationDetail.d.ts.map +1 -0
- package/dist/components/auth/flow/ConsentAuthorizationDetail.js +100 -0
- package/dist/components/auth/flow/ConsentAuthorizationDetail.js.map +1 -0
- package/dist/components/auth/flow/ConsentAuthorizationDetail.styles.d.ts +10 -0
- package/dist/components/auth/flow/ConsentAuthorizationDetail.styles.d.ts.map +1 -0
- package/dist/components/auth/flow/ConsentAuthorizationDetail.styles.js +57 -0
- package/dist/components/auth/flow/ConsentAuthorizationDetail.styles.js.map +1 -0
- package/dist/components/auth/flow/ConsentDetailField.d.ts +39 -0
- package/dist/components/auth/flow/ConsentDetailField.d.ts.map +1 -0
- package/dist/components/auth/flow/ConsentDetailField.js +168 -0
- package/dist/components/auth/flow/ConsentDetailField.js.map +1 -0
- package/dist/components/auth/flow/ConsentDetailField.styles.d.ts +11 -0
- package/dist/components/auth/flow/ConsentDetailField.styles.d.ts.map +1 -0
- package/dist/components/auth/flow/ConsentDetailField.styles.js +83 -0
- package/dist/components/auth/flow/ConsentDetailField.styles.js.map +1 -0
- package/dist/components/auth/flow/ConsentDetailText.d.ts +53 -0
- package/dist/components/auth/flow/ConsentDetailText.d.ts.map +1 -0
- package/dist/components/auth/flow/ConsentDetailText.js +58 -0
- package/dist/components/auth/flow/ConsentDetailText.js.map +1 -0
- package/dist/components/auth/flow/ConsentDetailText.styles.d.ts +20 -0
- package/dist/components/auth/flow/ConsentDetailText.styles.d.ts.map +1 -0
- package/dist/components/auth/flow/ConsentDetailText.styles.js +80 -0
- package/dist/components/auth/flow/ConsentDetailText.styles.js.map +1 -0
- package/dist/components/auth/flow/FieldFactory.js +1 -1
- package/dist/components/auth/flow/resolveConsentText.d.ts +13 -0
- package/dist/components/auth/flow/resolveConsentText.d.ts.map +1 -0
- package/dist/components/auth/flow/resolveConsentText.js +23 -0
- package/dist/components/auth/flow/resolveConsentText.js.map +1 -0
- package/dist/components/primitives/KeyValueInput/KeyValueInput.js +1 -1
- package/dist/components/primitives/MultiInput/MultiInput.js +1 -1
- package/dist/components/primitives/PasswordField/PasswordField.js +1 -1
- package/dist/hooks/auth/useConsentDetailField.d.ts +130 -0
- package/dist/hooks/auth/useConsentDetailField.d.ts.map +1 -0
- package/dist/hooks/auth/useConsentDetailField.js +354 -0
- package/dist/hooks/auth/useConsentDetailField.js.map +1 -0
- package/dist/hooks/management/useAccountLifecycle.d.ts +49 -0
- package/dist/hooks/management/useAccountLifecycle.d.ts.map +1 -0
- package/dist/hooks/management/useAccountLifecycle.js +56 -0
- package/dist/hooks/management/useAccountLifecycle.js.map +1 -0
- package/dist/hooks/management/useManagementEndpoint.d.ts +5 -1
- package/dist/hooks/management/useManagementEndpoint.d.ts.map +1 -1
- package/dist/hooks/management/useManagementEndpoint.js.map +1 -1
- package/dist/hooks/management/useManagementRequestConfig.d.ts +22 -0
- package/dist/hooks/management/useManagementRequestConfig.d.ts.map +1 -0
- package/dist/hooks/management/useManagementRequestConfig.js +39 -0
- package/dist/hooks/management/useManagementRequestConfig.js.map +1 -0
- package/dist/index.d.ts +35 -56
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -42
- package/dist/models/config.d.ts +3 -4
- package/dist/models/config.d.ts.map +1 -1
- package/dist/utils/formatConsentDetailValue.d.ts +16 -0
- package/dist/utils/formatConsentDetailValue.d.ts.map +1 -0
- package/dist/utils/formatConsentDetailValue.js +25 -0
- package/dist/utils/formatConsentDetailValue.js.map +1 -0
- package/dist/utils/getConsentDetailLayout.d.ts +32 -0
- package/dist/utils/getConsentDetailLayout.d.ts.map +1 -0
- package/dist/utils/getConsentDetailLayout.js +43 -0
- package/dist/utils/getConsentDetailLayout.js.map +1 -0
- package/dist/utils/getConsentDetailListDisplay.d.ts +30 -0
- package/dist/utils/getConsentDetailListDisplay.d.ts.map +1 -0
- package/dist/utils/getConsentDetailListDisplay.js +30 -0
- package/dist/utils/getConsentDetailListDisplay.js.map +1 -0
- package/dist/utils/isConsentApprovalBlocked.d.ts +17 -0
- package/dist/utils/isConsentApprovalBlocked.d.ts.map +1 -0
- package/dist/utils/isConsentApprovalBlocked.js +39 -0
- package/dist/utils/isConsentApprovalBlocked.js.map +1 -0
- package/dist/utils/isConsentDetailPlainList.d.ts +15 -0
- package/dist/utils/isConsentDetailPlainList.d.ts.map +1 -0
- package/dist/utils/isConsentDetailPlainList.js +23 -0
- package/dist/utils/isConsentDetailPlainList.js.map +1 -0
- package/dist/utils/isConsentDetailStructured.d.ts +10 -0
- package/dist/utils/isConsentDetailStructured.d.ts.map +1 -0
- package/dist/utils/isConsentDetailStructured.js +14 -0
- package/dist/utils/isConsentDetailStructured.js.map +1 -0
- package/dist/utils/isConsentDetailTextClamped.d.ts +20 -0
- package/dist/utils/isConsentDetailTextClamped.d.ts.map +1 -0
- package/dist/utils/isConsentDetailTextClamped.js +24 -0
- package/dist/utils/isConsentDetailTextClamped.js.map +1 -0
- package/package.json +2 -2
- package/dist/cjs/hooks/management/agents/useCreateAgent.cjs +0 -26
- package/dist/cjs/hooks/management/agents/useCreateAgent.cjs.map +0 -1
- package/dist/cjs/hooks/management/agents/useDeleteAgent.cjs +0 -26
- package/dist/cjs/hooks/management/agents/useDeleteAgent.cjs.map +0 -1
- package/dist/cjs/hooks/management/agents/useGetAgent.cjs +0 -30
- package/dist/cjs/hooks/management/agents/useGetAgent.cjs.map +0 -1
- package/dist/cjs/hooks/management/agents/useGetAgentGroups.cjs +0 -41
- package/dist/cjs/hooks/management/agents/useGetAgentGroups.cjs.map +0 -1
- package/dist/cjs/hooks/management/agents/useGetAgentRoles.cjs +0 -42
- package/dist/cjs/hooks/management/agents/useGetAgentRoles.cjs.map +0 -1
- package/dist/cjs/hooks/management/agents/useGetAgentTypes.cjs +0 -31
- package/dist/cjs/hooks/management/agents/useGetAgentTypes.cjs.map +0 -1
- package/dist/cjs/hooks/management/agents/useGetAgents.cjs +0 -33
- package/dist/cjs/hooks/management/agents/useGetAgents.cjs.map +0 -1
- package/dist/cjs/hooks/management/agents/useUpdateAgent.cjs +0 -27
- package/dist/cjs/hooks/management/agents/useUpdateAgent.cjs.map +0 -1
- package/dist/cjs/hooks/management/applications/useCreateApplication.cjs +0 -31
- package/dist/cjs/hooks/management/applications/useCreateApplication.cjs.map +0 -1
- package/dist/cjs/hooks/management/applications/useDeleteApplication.cjs +0 -26
- package/dist/cjs/hooks/management/applications/useDeleteApplication.cjs.map +0 -1
- package/dist/cjs/hooks/management/applications/useGetApplication.cjs +0 -35
- package/dist/cjs/hooks/management/applications/useGetApplication.cjs.map +0 -1
- package/dist/cjs/hooks/management/applications/useGetApplications.cjs +0 -36
- package/dist/cjs/hooks/management/applications/useGetApplications.cjs.map +0 -1
- package/dist/cjs/hooks/management/applications/useUpdateApplication.cjs +0 -27
- package/dist/cjs/hooks/management/applications/useUpdateApplication.cjs.map +0 -1
- package/dist/cjs/hooks/management/groups/useAddGroupMembers.cjs +0 -32
- package/dist/cjs/hooks/management/groups/useAddGroupMembers.cjs.map +0 -1
- package/dist/cjs/hooks/management/groups/useCreateGroup.cjs +0 -26
- package/dist/cjs/hooks/management/groups/useCreateGroup.cjs.map +0 -1
- package/dist/cjs/hooks/management/groups/useDeleteGroup.cjs +0 -30
- package/dist/cjs/hooks/management/groups/useDeleteGroup.cjs.map +0 -1
- package/dist/cjs/hooks/management/groups/useGetGroup.cjs +0 -30
- package/dist/cjs/hooks/management/groups/useGetGroup.cjs.map +0 -1
- package/dist/cjs/hooks/management/groups/useGetGroupMembers.cjs +0 -40
- package/dist/cjs/hooks/management/groups/useGetGroupMembers.cjs.map +0 -1
- package/dist/cjs/hooks/management/groups/useGetGroups.cjs +0 -31
- package/dist/cjs/hooks/management/groups/useGetGroups.cjs.map +0 -1
- package/dist/cjs/hooks/management/groups/useRemoveGroupMembers.cjs +0 -32
- package/dist/cjs/hooks/management/groups/useRemoveGroupMembers.cjs.map +0 -1
- package/dist/cjs/hooks/management/groups/useUpdateGroup.cjs +0 -31
- package/dist/cjs/hooks/management/groups/useUpdateGroup.cjs.map +0 -1
- package/dist/cjs/hooks/management/roles/useAddRoleAssignments.cjs +0 -27
- package/dist/cjs/hooks/management/roles/useAddRoleAssignments.cjs.map +0 -1
- package/dist/cjs/hooks/management/roles/useCreateRole.cjs +0 -26
- package/dist/cjs/hooks/management/roles/useCreateRole.cjs.map +0 -1
- package/dist/cjs/hooks/management/roles/useDeleteRole.cjs +0 -26
- package/dist/cjs/hooks/management/roles/useDeleteRole.cjs.map +0 -1
- package/dist/cjs/hooks/management/roles/useGetRole.cjs +0 -30
- package/dist/cjs/hooks/management/roles/useGetRole.cjs.map +0 -1
- package/dist/cjs/hooks/management/roles/useGetRoleAssignments.cjs +0 -42
- package/dist/cjs/hooks/management/roles/useGetRoleAssignments.cjs.map +0 -1
- package/dist/cjs/hooks/management/roles/useGetRoles.cjs +0 -31
- package/dist/cjs/hooks/management/roles/useGetRoles.cjs.map +0 -1
- package/dist/cjs/hooks/management/roles/useRemoveRoleAssignments.cjs +0 -27
- package/dist/cjs/hooks/management/roles/useRemoveRoleAssignments.cjs.map +0 -1
- package/dist/cjs/hooks/management/roles/useUpdateRole.cjs +0 -27
- package/dist/cjs/hooks/management/roles/useUpdateRole.cjs.map +0 -1
- package/dist/cjs/hooks/management/users/useCreateUser.cjs +0 -26
- package/dist/cjs/hooks/management/users/useCreateUser.cjs.map +0 -1
- package/dist/cjs/hooks/management/users/useDeleteUser.cjs +0 -26
- package/dist/cjs/hooks/management/users/useDeleteUser.cjs.map +0 -1
- package/dist/cjs/hooks/management/users/useGetUser.cjs +0 -30
- package/dist/cjs/hooks/management/users/useGetUser.cjs.map +0 -1
- package/dist/cjs/hooks/management/users/useGetUserGroups.cjs +0 -41
- package/dist/cjs/hooks/management/users/useGetUserGroups.cjs.map +0 -1
- package/dist/cjs/hooks/management/users/useGetUserTypes.cjs +0 -31
- package/dist/cjs/hooks/management/users/useGetUserTypes.cjs.map +0 -1
- package/dist/cjs/hooks/management/users/useGetUsers.cjs +0 -38
- package/dist/cjs/hooks/management/users/useGetUsers.cjs.map +0 -1
- package/dist/cjs/hooks/management/users/useUpdateUser.cjs +0 -27
- package/dist/cjs/hooks/management/users/useUpdateUser.cjs.map +0 -1
- package/dist/hooks/management/agents/useCreateAgent.d.ts +0 -11
- package/dist/hooks/management/agents/useCreateAgent.d.ts.map +0 -1
- package/dist/hooks/management/agents/useCreateAgent.js +0 -24
- package/dist/hooks/management/agents/useCreateAgent.js.map +0 -1
- package/dist/hooks/management/agents/useDeleteAgent.d.ts +0 -10
- package/dist/hooks/management/agents/useDeleteAgent.d.ts.map +0 -1
- package/dist/hooks/management/agents/useDeleteAgent.js +0 -24
- package/dist/hooks/management/agents/useDeleteAgent.js.map +0 -1
- package/dist/hooks/management/agents/useGetAgent.d.ts +0 -12
- package/dist/hooks/management/agents/useGetAgent.d.ts.map +0 -1
- package/dist/hooks/management/agents/useGetAgent.js +0 -28
- package/dist/hooks/management/agents/useGetAgent.js.map +0 -1
- package/dist/hooks/management/agents/useGetAgentGroups.d.ts +0 -16
- package/dist/hooks/management/agents/useGetAgentGroups.d.ts.map +0 -1
- package/dist/hooks/management/agents/useGetAgentGroups.js +0 -39
- package/dist/hooks/management/agents/useGetAgentGroups.js.map +0 -1
- package/dist/hooks/management/agents/useGetAgentRoles.d.ts +0 -17
- package/dist/hooks/management/agents/useGetAgentRoles.d.ts.map +0 -1
- package/dist/hooks/management/agents/useGetAgentRoles.js +0 -40
- package/dist/hooks/management/agents/useGetAgentRoles.js.map +0 -1
- package/dist/hooks/management/agents/useGetAgentTypes.d.ts +0 -15
- package/dist/hooks/management/agents/useGetAgentTypes.d.ts.map +0 -1
- package/dist/hooks/management/agents/useGetAgentTypes.js +0 -29
- package/dist/hooks/management/agents/useGetAgentTypes.js.map +0 -1
- package/dist/hooks/management/agents/useGetAgents.d.ts +0 -23
- package/dist/hooks/management/agents/useGetAgents.d.ts.map +0 -1
- package/dist/hooks/management/agents/useGetAgents.js +0 -31
- package/dist/hooks/management/agents/useGetAgents.js.map +0 -1
- package/dist/hooks/management/agents/useUpdateAgent.d.ts +0 -18
- package/dist/hooks/management/agents/useUpdateAgent.d.ts.map +0 -1
- package/dist/hooks/management/agents/useUpdateAgent.js +0 -25
- package/dist/hooks/management/agents/useUpdateAgent.js.map +0 -1
- package/dist/hooks/management/applications/useCreateApplication.d.ts +0 -16
- package/dist/hooks/management/applications/useCreateApplication.d.ts.map +0 -1
- package/dist/hooks/management/applications/useCreateApplication.js +0 -29
- package/dist/hooks/management/applications/useCreateApplication.js.map +0 -1
- package/dist/hooks/management/applications/useDeleteApplication.d.ts +0 -10
- package/dist/hooks/management/applications/useDeleteApplication.d.ts.map +0 -1
- package/dist/hooks/management/applications/useDeleteApplication.js +0 -24
- package/dist/hooks/management/applications/useDeleteApplication.js.map +0 -1
- package/dist/hooks/management/applications/useGetApplication.d.ts +0 -17
- package/dist/hooks/management/applications/useGetApplication.d.ts.map +0 -1
- package/dist/hooks/management/applications/useGetApplication.js +0 -33
- package/dist/hooks/management/applications/useGetApplication.js.map +0 -1
- package/dist/hooks/management/applications/useGetApplications.d.ts +0 -24
- package/dist/hooks/management/applications/useGetApplications.d.ts.map +0 -1
- package/dist/hooks/management/applications/useGetApplications.js +0 -34
- package/dist/hooks/management/applications/useGetApplications.js.map +0 -1
- package/dist/hooks/management/applications/useUpdateApplication.d.ts +0 -18
- package/dist/hooks/management/applications/useUpdateApplication.d.ts.map +0 -1
- package/dist/hooks/management/applications/useUpdateApplication.js +0 -25
- package/dist/hooks/management/applications/useUpdateApplication.js.map +0 -1
- package/dist/hooks/management/groups/useAddGroupMembers.d.ts +0 -24
- package/dist/hooks/management/groups/useAddGroupMembers.d.ts.map +0 -1
- package/dist/hooks/management/groups/useAddGroupMembers.js +0 -30
- package/dist/hooks/management/groups/useAddGroupMembers.js.map +0 -1
- package/dist/hooks/management/groups/useCreateGroup.d.ts +0 -11
- package/dist/hooks/management/groups/useCreateGroup.d.ts.map +0 -1
- package/dist/hooks/management/groups/useCreateGroup.js +0 -24
- package/dist/hooks/management/groups/useCreateGroup.js.map +0 -1
- package/dist/hooks/management/groups/useDeleteGroup.d.ts +0 -10
- package/dist/hooks/management/groups/useDeleteGroup.d.ts.map +0 -1
- package/dist/hooks/management/groups/useDeleteGroup.js +0 -28
- package/dist/hooks/management/groups/useDeleteGroup.js.map +0 -1
- package/dist/hooks/management/groups/useGetGroup.d.ts +0 -12
- package/dist/hooks/management/groups/useGetGroup.d.ts.map +0 -1
- package/dist/hooks/management/groups/useGetGroup.js +0 -28
- package/dist/hooks/management/groups/useGetGroup.js.map +0 -1
- package/dist/hooks/management/groups/useGetGroupMembers.d.ts +0 -20
- package/dist/hooks/management/groups/useGetGroupMembers.d.ts.map +0 -1
- package/dist/hooks/management/groups/useGetGroupMembers.js +0 -38
- package/dist/hooks/management/groups/useGetGroupMembers.js.map +0 -1
- package/dist/hooks/management/groups/useGetGroups.d.ts +0 -19
- package/dist/hooks/management/groups/useGetGroups.d.ts.map +0 -1
- package/dist/hooks/management/groups/useGetGroups.js +0 -29
- package/dist/hooks/management/groups/useGetGroups.js.map +0 -1
- package/dist/hooks/management/groups/useRemoveGroupMembers.d.ts +0 -12
- package/dist/hooks/management/groups/useRemoveGroupMembers.d.ts.map +0 -1
- package/dist/hooks/management/groups/useRemoveGroupMembers.js +0 -30
- package/dist/hooks/management/groups/useRemoveGroupMembers.js.map +0 -1
- package/dist/hooks/management/groups/useUpdateGroup.d.ts +0 -24
- package/dist/hooks/management/groups/useUpdateGroup.d.ts.map +0 -1
- package/dist/hooks/management/groups/useUpdateGroup.js +0 -29
- package/dist/hooks/management/groups/useUpdateGroup.js.map +0 -1
- package/dist/hooks/management/roles/useAddRoleAssignments.d.ts +0 -24
- package/dist/hooks/management/roles/useAddRoleAssignments.d.ts.map +0 -1
- package/dist/hooks/management/roles/useAddRoleAssignments.js +0 -25
- package/dist/hooks/management/roles/useAddRoleAssignments.js.map +0 -1
- package/dist/hooks/management/roles/useCreateRole.d.ts +0 -11
- package/dist/hooks/management/roles/useCreateRole.d.ts.map +0 -1
- package/dist/hooks/management/roles/useCreateRole.js +0 -24
- package/dist/hooks/management/roles/useCreateRole.js.map +0 -1
- package/dist/hooks/management/roles/useDeleteRole.d.ts +0 -10
- package/dist/hooks/management/roles/useDeleteRole.d.ts.map +0 -1
- package/dist/hooks/management/roles/useDeleteRole.js +0 -24
- package/dist/hooks/management/roles/useDeleteRole.js.map +0 -1
- package/dist/hooks/management/roles/useGetRole.d.ts +0 -12
- package/dist/hooks/management/roles/useGetRole.d.ts.map +0 -1
- package/dist/hooks/management/roles/useGetRole.js +0 -28
- package/dist/hooks/management/roles/useGetRole.js.map +0 -1
- package/dist/hooks/management/roles/useGetRoleAssignments.d.ts +0 -24
- package/dist/hooks/management/roles/useGetRoleAssignments.d.ts.map +0 -1
- package/dist/hooks/management/roles/useGetRoleAssignments.js +0 -40
- package/dist/hooks/management/roles/useGetRoleAssignments.js.map +0 -1
- package/dist/hooks/management/roles/useGetRoles.d.ts +0 -19
- package/dist/hooks/management/roles/useGetRoles.d.ts.map +0 -1
- package/dist/hooks/management/roles/useGetRoles.js +0 -29
- package/dist/hooks/management/roles/useGetRoles.js.map +0 -1
- package/dist/hooks/management/roles/useRemoveRoleAssignments.d.ts +0 -11
- package/dist/hooks/management/roles/useRemoveRoleAssignments.d.ts.map +0 -1
- package/dist/hooks/management/roles/useRemoveRoleAssignments.js +0 -25
- package/dist/hooks/management/roles/useRemoveRoleAssignments.js.map +0 -1
- package/dist/hooks/management/roles/useUpdateRole.d.ts +0 -24
- package/dist/hooks/management/roles/useUpdateRole.d.ts.map +0 -1
- package/dist/hooks/management/roles/useUpdateRole.js +0 -25
- package/dist/hooks/management/roles/useUpdateRole.js.map +0 -1
- package/dist/hooks/management/users/useCreateUser.d.ts +0 -11
- package/dist/hooks/management/users/useCreateUser.d.ts.map +0 -1
- package/dist/hooks/management/users/useCreateUser.js +0 -24
- package/dist/hooks/management/users/useCreateUser.js.map +0 -1
- package/dist/hooks/management/users/useDeleteUser.d.ts +0 -10
- package/dist/hooks/management/users/useDeleteUser.d.ts.map +0 -1
- package/dist/hooks/management/users/useDeleteUser.js +0 -24
- package/dist/hooks/management/users/useDeleteUser.js.map +0 -1
- package/dist/hooks/management/users/useGetUser.d.ts +0 -12
- package/dist/hooks/management/users/useGetUser.d.ts.map +0 -1
- package/dist/hooks/management/users/useGetUser.js +0 -28
- package/dist/hooks/management/users/useGetUser.js.map +0 -1
- package/dist/hooks/management/users/useGetUserGroups.d.ts +0 -16
- package/dist/hooks/management/users/useGetUserGroups.d.ts.map +0 -1
- package/dist/hooks/management/users/useGetUserGroups.js +0 -39
- package/dist/hooks/management/users/useGetUserGroups.js.map +0 -1
- package/dist/hooks/management/users/useGetUserTypes.d.ts +0 -15
- package/dist/hooks/management/users/useGetUserTypes.d.ts.map +0 -1
- package/dist/hooks/management/users/useGetUserTypes.js +0 -29
- package/dist/hooks/management/users/useGetUserTypes.js.map +0 -1
- package/dist/hooks/management/users/useGetUsers.d.ts +0 -17
- package/dist/hooks/management/users/useGetUsers.d.ts.map +0 -1
- package/dist/hooks/management/users/useGetUsers.js +0 -36
- package/dist/hooks/management/users/useGetUsers.js.map +0 -1
- package/dist/hooks/management/users/useUpdateUser.d.ts +0 -18
- package/dist/hooks/management/users/useUpdateUser.d.ts.map +0 -1
- package/dist/hooks/management/users/useUpdateUser.js +0 -25
- package/dist/hooks/management/users/useUpdateUser.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseUserDetails.cjs","names":["BaseUserDetails: FC<BaseUserDetailsProps>","useTranslation","styles: Record<string, string>","useAdminPartStyles","isWritable: boolean","AdminSection","Spinner","Alert","displayName: string","attributes: [string, unknown][]","editableAttributes: [string, string][]","ConfirmButton","Avatar","Panel","Button","TextField","DetailList","ChipList"],"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":";;;;;;;;;;;;;;;;;;AAgFA,MAAM,aAAa,UAA2B;AAC5C,KAAI,UAAU,QAAQ,UAAU,OAC9B,QAAO;AAGT,QAAO,OAAO,UAAU,WAAW,KAAK,UAAU,MAAM,GAAG,OAAO,MAAmC;;;;;;AAOvG,MAAMA,mBAA6C,EACjD,SACA,UACA,WACA,QAAQ,MACR,SAAS,EAAE,EACX,mBAAmB,CAAC,WAAW,EAC/B,aAAa,OACb,YAAY,OACZ,aAAa,OACb,UACA,UACA,aACA,WACwC;CACxC,MAAM,EAAC,MAAKC,+BAAe,aAAa,KAAK;CAC7C,MAAMC,SAAiCC,oCAAoB;CAC3D,MAAM,CAAC,OAAO,gCAAoD,KAAK;AAEvE,KAAI,UAAU;EACZ,MAAMC,aAAsB,QAAQ,KAAK,IAAI,CAAC,MAAM;AAEpD,SACE,2CAAC;GAAe;aACb,SAAS;IACR,YAAY,OAAO,YACjB,OAAO,QAAQ,MAAM,cAAc,EAAE,CAAC,CAAC,QACpC,CAAC,UAA6B,CAAC,iBAAiB,SAAS,KAAK,CAChE,CACF;IACD,aAAa,2DAAkC,KAAK,GAAG;IACvD;IACA;IACA;IACA;IACA;IACA,UAAU,aAAa,WAAW;IAClC,UAAU,aAAa,WAAW;IAClC;IACD,CAAC;IACE;;AAIV,KAAI,aAAa,CAAC,KAChB,QACE,2CAACC;EAAa,OAAM;EAA0B;EAAwB;YACpE,4CAAC;GAAK,WAAW,OAAO;GAAU,MAAK;;IACrC,2CAACC,2BAAQ,MAAK,UAAU;;IAAE,EAAE,uBAAuB;;IAC9C;GACM;AAInB,KAAI,CAAC,KACH,QACE,2CAACD;EAAa,OAAM;EAA0B;EAAwB;YACpE,2CAACE;GAAM,SAAQ;GAAQ,MAAK;aACzB,SAAS,EAAE,gCAAgC;IACtC;GACK;CAInB,MAAMC,kEAAiD,KAAK;CAC5D,MAAMC,aAAkC,OAAO,QAAQ,KAAK,cAAc,EAAE,CAAC,CAAC,QAC3E,CAAC,UAA6B,CAAC,iBAAiB,SAAS,KAAK,CAChE;CACD,MAAMC,qBAAyC,WAAW,QACvD,UAAwD,OAAO,MAAM,OAAO,SAC9E;AAED,QACE,4CAACL;EACC,OAAM;EACK;EACX,OAAO;EACP,aAAa,EAAE,gCAAgC,EAAC,MAAM,KAAK,MAAK,CAAC;EACpD;EACb,SACE,qFACG,SACA,YAAY,CAAC,KAAK,cACjB,2CAACM;GACC,aAAa,EAAE,sCAAsC,EAAC,MAAM,aAAY,CAAC;GACzE,WAAW;GACX,WAAW;aAEV,EAAE,oCAAoC;IACzB,IAEjB;;GAGJ,SACC,2CAACJ;IAAM,SAAQ;IAAQ,MAAK;cACzB;KACK;GAEV,4CAAC;IAAI,WAAW,OAAO;eACrB,2CAACK;KAAO,MAAM;KAAa,MAAM;MAAM,EACvC,2CAAC;KAAK,WAAW,OAAO;eAAW,KAAK,YAAY,KAAK;MAAY;KACjE;GACN,2CAACC;IACC,OAAO,EAAE,iCAAiC;IAC1C,SACE,YAAY,CAAC,KAAK,cAAc,CAAC,SAAS,mBAAmB,SAAS,IACpE,2CAACC;KACC,SAAQ;KACR,MAAK;KACL,eAAqB,SAAS,OAAO,YAAY,mBAAmB,CAAC;eAEpE,EAAE,kCAAkC;MAC9B,GACP;cAGL,QACC,4CAAC;KACC,WAAW,OAAO;KAClB,OAAO;MAAC,YAAY;MAAW,eAAe;MAAS;KACvD,WAAW,UAAgB;AACzB,YAAM,gBAAgB;AACtB,iBAAW;OAAC,GAAI,KAAK,cAAc,EAAE;OAAG,GAAG;OAAM,CAAC;AAClD,eAAS,KAAK;;gBAGf,OAAO,KAAK,MAAM,CAAC,KAAK,SACvB,2CAACC;MAEO;MACN,OAAO;MACP,cAAY;MACZ,OAAO,MAAM;MACb,WAAW,UACT,UAAU,cAA6C;OAAC,GAAG;QAAW,OAAO,MAAM,OAAO;OAAM,EAAE;QAN/F,KAQL,CACF,EACF,4CAAC;MAAI,WAAW,OAAO;MAAQ,OAAO,EAAC,gBAAgB,YAAW;iBAChE,2CAACD;OAAO,MAAK;OAAS,SAAQ;OAAO,UAAU;OAAY,eAAqB,SAAS,KAAK;iBAC3F,EAAE,8BAA8B;QAC1B,EACT,2CAACA;OAAO,MAAK;OAAS,SAAS;OAAY,UAAU;iBAClD,EAAE,gCAAgC;QAC5B;OACL;MACD,GACL,WAAW,SAAS,IACtB,2CAACE,iCACC,OAAO,WAAW,KAAK,CAAC,MAAM,YAA+B;KAAC,OAAO;KAAM,OAAO,UAAU,MAAM;KAAC,EAAE,GACrG,GAEF,2CAAC;KAAK,WAAW,OAAO;eAAW,EAAE,oCAAoC;MAAQ;KAE7E;GACR,2CAACH;IAAM,OAAO,EAAE,6BAA6B;cAC3C,2CAACI;KACC,OAAO,EAAE,6BAA6B;KACtC,WAAW,EAAE,gCAAgC;KAC7C,OAAO,OAAO,KAAK,WAA4B;MAAC,IAAI,MAAM;MAAI,OAAO,MAAM;MAAK,EAAE;MAClF;KACI;;GACK;;AAInB,8BAAe"}
|
|
1
|
+
{"version":3,"file":"BaseUserDetails.cjs","names":["BaseUserDetails: FC<BaseUserDetailsProps>","useTranslation","styles: Record<string, string>","useAdminPartStyles","isWritable: boolean","AdminSection","Spinner","Alert","displayName: string","attributes: [string, unknown][]","editableAttributes: [string, string][]","AccountLifecycleButtons","ConfirmButton","Avatar","AccessStatusBadge","Panel","Button","TextField","DetailList","ChipList"],"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":";;;;;;;;;;;;;;;;;;;AA4GA,MAAM,aAAa,UAA2B;AAC5C,KAAI,UAAU,QAAQ,UAAU,OAC9B,QAAO;AAGT,QAAO,OAAO,UAAU,WAAW,KAAK,UAAU,MAAM,GAAG,OAAO,MAAmC;;;;;;AAOvG,MAAMA,mBAA6C,EACjD,SACA,UACA,WACA,QAAQ,MACR,SAAS,EAAE,EACX,mBAAmB,CAAC,WAAW,EAC/B,aAAa,OACb,YAAY,OACZ,2BAA2B,OAC3B,aAAa,OACb,mBAAmB,EAAE,EACrB,UACA,mBACA,UACA,aACA,WACwC;CACxC,MAAM,EAAC,MAAKC,+BAAe,aAAa,KAAK;CAC7C,MAAMC,SAAiCC,oCAAoB;CAC3D,MAAM,CAAC,OAAO,gCAAoD,KAAK;AAEvE,KAAI,UAAU;EACZ,MAAMC,aAAsB,QAAQ,KAAK,IAAI,CAAC,MAAM;AAEpD,SACE,2CAAC;GAAe;aACb,SAAS;IACR,YAAY,OAAO,YACjB,OAAO,QAAQ,MAAM,cAAc,EAAE,CAAC,CAAC,QACpC,CAAC,UAA6B,CAAC,iBAAiB,SAAS,KAAK,CAChE,CACF;IACD,aAAa,2DAAkC,KAAK,GAAG;IACvD;IACA;IACA;IACA;IACA;IACA;IACA,kBAAkB,qBAAqB,OAAO,mBAAmB,EAAE;IACnE,UAAU,aAAa,WAAW;IAClC,mBAAmB,OAAO,oBAAoB;IAC9C,UAAU,aAAa,WAAW;IAClC;IACD,CAAC;IACE;;AAIV,KAAI,aAAa,CAAC,KAChB,QACE,2CAACC;EAAa,OAAM;EAA0B;EAAwB;YACpE,4CAAC;GAAK,WAAW,OAAO;GAAU,MAAK;;IACrC,2CAACC,2BAAQ,MAAK,UAAU;;IAAE,EAAE,uBAAuB;;IAC9C;GACM;AAInB,KAAI,CAAC,KACH,QACE,2CAACD;EAAa,OAAM;EAA0B;EAAwB;YACpE,2CAACE;GAAM,SAAQ;GAAQ,MAAK;aACzB,SAAS,EAAE,gCAAgC;IACtC;GACK;CAInB,MAAMC,kEAAiD,KAAK;CAC5D,MAAMC,aAAkC,OAAO,QAAQ,KAAK,cAAc,EAAE,CAAC,CAAC,QAC3E,CAAC,UAA6B,CAAC,iBAAiB,SAAS,KAAK,CAChE;CACD,MAAMC,qBAAyC,WAAW,QACvD,UAAwD,OAAO,MAAM,OAAO,SAC9E;AAED,QACE,4CAACL;EACC,OAAM;EACK;EACX,OAAO;EACP,aAAa,EAAE,gCAAgC,EAAC,MAAM,KAAK,MAAK,CAAC;EACpD;EACb,SACE;GACG;GACA,qBACC,2CAACM;IACC,SAAS;IACT;IACA,WAAW;IACX,MAAM;IACN,UAAU;KACV;GAEH,YAAY,CAAC,KAAK,cACjB,2CAACC;IACC,aAAa,EAAE,sCAAsC,EAAC,MAAM,aAAY,CAAC;IACzE,WAAW;IACX,WAAW;cAEV,EAAE,oCAAoC;KACzB;MAEjB;;GAGJ,SACC,2CAACL;IAAM,SAAQ;IAAQ,MAAK;cACzB;KACK;GAEV,4CAAC;IAAI,WAAW,OAAO;;KACrB,2CAACM;MAAO,MAAM;MAAa,MAAM;OAAM;KACvC,2CAAC;MAAK,WAAW,OAAO;gBAAW,KAAK,YAAY,KAAK;OAAY;KACrE,2CAACC,mDAAkB,QAAQ,KAAK,QAAQ,QAAS;;KAC7C;GACN,2CAACC;IACC,OAAO,EAAE,iCAAiC;IAC1C,SACE,YAAY,CAAC,KAAK,cAAc,CAAC,SAAS,mBAAmB,SAAS,IACpE,2CAACC;KACC,SAAQ;KACR,MAAK;KACL,eAAqB,SAAS,OAAO,YAAY,mBAAmB,CAAC;eAEpE,EAAE,kCAAkC;MAC9B,GACP;cAGL,QACC,4CAAC;KACC,WAAW,OAAO;KAClB,OAAO;MAAC,YAAY;MAAW,eAAe;MAAS;KACvD,WAAW,UAAgB;AACzB,YAAM,gBAAgB;AACtB,iBAAW;OAAC,GAAI,KAAK,cAAc,EAAE;OAAG,GAAG;OAAM,CAAC;AAClD,eAAS,KAAK;;gBAGf,OAAO,KAAK,MAAM,CAAC,KAAK,SACvB,2CAACC;MAEO;MACN,OAAO;MACP,cAAY;MACZ,OAAO,MAAM;MACb,WAAW,UACT,UAAU,cAA6C;OAAC,GAAG;QAAW,OAAO,MAAM,OAAO;OAAM,EAAE;QAN/F,KAQL,CACF,EACF,4CAAC;MAAI,WAAW,OAAO;MAAQ,OAAO,EAAC,gBAAgB,YAAW;iBAChE,2CAACD;OAAO,MAAK;OAAS,SAAQ;OAAO,UAAU;OAAY,eAAqB,SAAS,KAAK;iBAC3F,EAAE,8BAA8B;QAC1B,EACT,2CAACA;OAAO,MAAK;OAAS,SAAS;OAAY,UAAU;iBAClD,EAAE,gCAAgC;QAC5B;OACL;MACD,GACL,WAAW,SAAS,IACtB,2CAACE,iCACC,OAAO,WAAW,KAAK,CAAC,MAAM,YAA+B;KAAC,OAAO;KAAM,OAAO,UAAU,MAAM;KAAC,EAAE,GACrG,GAEF,2CAAC;KAAK,WAAW,OAAO;eAAW,EAAE,oCAAoC;MAAQ;KAE7E;GACR,2CAACH;IAAM,OAAO,EAAE,6BAA6B;cAC3C,2CAACI;KACC,OAAO,EAAE,6BAA6B;KACtC,WAAW,EAAE,gCAAgC;KAC7C,OAAO,OAAO,KAAK,WAA4B;MAAC,IAAI,MAAM;MAAI,OAAO,MAAM;MAAK,EAAE;MAClF;KACI;;GACK;;AAInB,8BAAe"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
const require_rolldown_runtime = require('../../../_virtual/rolldown_runtime.cjs');
|
|
2
2
|
const require_useTranslation = require('../../../hooks/useTranslation.cjs');
|
|
3
|
-
const
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
const require_useGetUserGroups = require('../../../hooks/management/users/useGetUserGroups.cjs');
|
|
3
|
+
const require_useManagementEndpoint = require('../../../hooks/management/useManagementEndpoint.cjs');
|
|
4
|
+
const require_useResourceQuery = require('../../../hooks/management/useResourceQuery.cjs');
|
|
5
|
+
const require_useResourceMutation = require('../../../hooks/management/useResourceMutation.cjs');
|
|
7
6
|
const require_BaseUserDetails = require('./BaseUserDetails.cjs');
|
|
7
|
+
const require_useAccountLifecycle = require('../../../hooks/management/useAccountLifecycle.cjs');
|
|
8
8
|
let __thunderid_browser = require("@thunderid/browser");
|
|
9
9
|
__thunderid_browser = require_rolldown_runtime.__toESM(__thunderid_browser);
|
|
10
10
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
@@ -19,19 +19,54 @@ react_jsx_runtime = require_rolldown_runtime.__toESM(react_jsx_runtime);
|
|
|
19
19
|
* <UserDetails userId={userId} deletable onDeleted={() => navigate('/users')} />
|
|
20
20
|
* ```
|
|
21
21
|
*/
|
|
22
|
-
const UserDetails = ({ deletable = false, editable = false, onDeleted, preferences, userId,...rest }) => {
|
|
22
|
+
const UserDetails = ({ administrationMode, deletable = false, editable = false, lifecycleActions = false, onDeleted, preferences, userId,...rest }) => {
|
|
23
23
|
const { t } = require_useTranslation.default(preferences?.i18n);
|
|
24
|
-
const
|
|
25
|
-
const
|
|
26
|
-
|
|
27
|
-
|
|
24
|
+
const endpoint = require_useManagementEndpoint.default("users");
|
|
25
|
+
const user = require_useResourceQuery.default([__thunderid_browser.UserQueryKeys.USER, userId], (fetcher) => (0, __thunderid_browser.getUser)({
|
|
26
|
+
...endpoint,
|
|
27
|
+
fetcher,
|
|
28
|
+
userId
|
|
29
|
+
}), { enabled: Boolean(userId) });
|
|
30
|
+
const groups = require_useResourceQuery.default([
|
|
31
|
+
__thunderid_browser.GroupQueryKeys.MEMBERSHIPS,
|
|
32
|
+
"user",
|
|
33
|
+
userId,
|
|
34
|
+
{ limit: 100 }
|
|
35
|
+
], (fetcher) => (0, __thunderid_browser.getUserGroups)({
|
|
36
|
+
...endpoint,
|
|
37
|
+
fetcher,
|
|
38
|
+
limit: 100,
|
|
39
|
+
userId
|
|
40
|
+
}), { enabled: Boolean(userId) });
|
|
41
|
+
const deletion = require_useResourceMutation.default((id, fetcher) => (0, __thunderid_browser.deleteUser)({
|
|
42
|
+
...endpoint,
|
|
43
|
+
administrationMode,
|
|
44
|
+
fetcher,
|
|
45
|
+
userId: id
|
|
46
|
+
}), () => [[__thunderid_browser.UserQueryKeys.USERS]], { onSuccess: onDeleted });
|
|
47
|
+
const update = require_useResourceMutation.default(({ data, userId: id }, fetcher) => (0, __thunderid_browser.updateUser)({
|
|
48
|
+
...endpoint,
|
|
49
|
+
fetcher,
|
|
50
|
+
payload: data,
|
|
51
|
+
userId: id
|
|
52
|
+
}), ({ userId: id }) => [[__thunderid_browser.UserQueryKeys.USER, id], [__thunderid_browser.UserQueryKeys.USERS]]);
|
|
53
|
+
const lifecycle = require_useAccountLifecycle.default({
|
|
54
|
+
enabled: lifecycleActions,
|
|
55
|
+
invalidatedKeys: [[__thunderid_browser.UserQueryKeys.USER, userId], [__thunderid_browser.UserQueryKeys.USERS]],
|
|
56
|
+
kind: "user",
|
|
57
|
+
status: user.data?.status?.value,
|
|
58
|
+
subject: userId
|
|
59
|
+
});
|
|
28
60
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_BaseUserDetails.default, {
|
|
29
61
|
user: user.data,
|
|
30
62
|
groups: groups.data?.groups,
|
|
31
63
|
isLoading: user.isLoading,
|
|
32
|
-
error: (0, __thunderid_browser.toManagementErrorMessage)(t, user.error, "admin.users.details.error") ?? (0, __thunderid_browser.toManagementErrorMessage)(t, deletion.error, "admin.users.details.delete.error") ?? (0, __thunderid_browser.toManagementErrorMessage)(t, update.error, "admin.users.details.edit.error"),
|
|
64
|
+
error: (0, __thunderid_browser.toManagementErrorMessage)(t, user.error, "admin.users.details.error") ?? (0, __thunderid_browser.toManagementErrorMessage)(t, deletion.error, "admin.users.details.delete.error") ?? (0, __thunderid_browser.toManagementErrorMessage)(t, update.error, "admin.users.details.edit.error") ?? (0, __thunderid_browser.toManagementErrorMessage)(t, lifecycle.error, "admin.common.lifecycle.error") ?? (0, __thunderid_browser.toManagementErrorMessage)(t, lifecycle.loadError, "admin.common.lifecycle.load_error"),
|
|
33
65
|
isDeleting: deletion.isLoading,
|
|
34
66
|
onDelete: deletable ? () => void deletion.mutate(userId) : void 0,
|
|
67
|
+
lifecycleActions: lifecycle.actions,
|
|
68
|
+
isRunningLifecycleAction: lifecycle.isRunning,
|
|
69
|
+
onLifecycleAction: lifecycleActions ? lifecycle.run : void 0,
|
|
35
70
|
isUpdating: update.isLoading,
|
|
36
71
|
onUpdate: editable && user.data ? (attributes) => void update.mutate({
|
|
37
72
|
data: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UserDetails.cjs","names":["UserDetails: FC<UserDetailsProps>","useTranslation","
|
|
1
|
+
{"version":3,"file":"UserDetails.cjs","names":["UserDetails: FC<UserDetailsProps>","useTranslation","endpoint: ManagementEndpoint","useManagementEndpoint","user: ResourceQueryResult<ManagedUser>","useResourceQuery","UserQueryKeys","groups: ResourceQueryResult<MembershipGroupListResponse>","GroupQueryKeys","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,+BAAe,aAAa,KAAK;CAC7C,MAAMC,WAA+BC,sCAAsB,QAAQ;CACnE,MAAMC,OAAyCC,iCAC7C,CAACC,kCAAc,MAAM,OAAO,GAC3B,6CAAoB;EAAC,GAAG;EAAU;EAAS;EAAO,CAAC,EACpD,EAAC,SAAS,QAAQ,OAAO,EAAC,CAC3B;CACD,MAAMC,SAA2DF,iCAC/D;EAACG,mCAAe;EAAa;EAAQ;EAAQ,EAAC,OAAO,KAAI;EAAC,GACzD,mDAA0B;EAAC,GAAG;EAAU;EAAS,OAAO;EAAK;EAAO,CAAC,EACtE,EAAC,SAAS,QAAQ,OAAO,EAAC,CAC3B;CACD,MAAMC,WAAiDC,qCACpD,IAAY,gDAAuB;EAAC,GAAG;EAAU;EAAoB;EAAS,QAAQ;EAAG,CAAC,QACrF,CAAC,CAACJ,kCAAc,MAAM,CAAC,EAC7B,EAAC,WAAW,WAAU,CACvB;CACD,MAAMK,SAAmED,qCACtE,EAAC,MAAM,QAAQ,MAA0B,gDAAuB;EAAC,GAAG;EAAU;EAAS,SAAS;EAAM,QAAQ;EAAG,CAAC,GAClH,EAAC,QAAQ,SAA6B,CAAC,CAACJ,kCAAc,MAAM,GAAG,EAAE,CAACA,kCAAc,MAAM,CAAC,CACzF;CAED,MAAMM,YAAmCC,oCAAoB;EAC3D,SAAS;EACT,iBAAiB,CAAC,CAACP,kCAAc,MAAM,OAAO,EAAE,CAACA,kCAAc,MAAM,CAAC;EACtE,MAAM;EACN,QAAQ,KAAK,MAAM,QAAQ;EAC3B,SAAS;EACV,CAAC;AAEF,QACE,2CAACQ;EACC,MAAM,KAAK;EACX,QAAQ,OAAO,MAAM;EACrB,WAAW,KAAK;EAChB,yDAC2B,GAAG,KAAK,OAAO,4BAA4B,sDAC3C,GAAG,SAAS,OAAO,mCAAmC,sDACtD,GAAG,OAAO,OAAO,iCAAiC,sDAClD,GAAG,UAAU,OAAO,+BAA+B,sDACnD,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,6 +1,7 @@
|
|
|
1
1
|
const require_rolldown_runtime = require('../../../_virtual/rolldown_runtime.cjs');
|
|
2
2
|
const require_useTranslation = require('../../../hooks/useTranslation.cjs');
|
|
3
|
-
const
|
|
3
|
+
const require_useManagementEndpoint = require('../../../hooks/management/useManagementEndpoint.cjs');
|
|
4
|
+
const require_useResourceQuery = require('../../../hooks/management/useResourceQuery.cjs');
|
|
4
5
|
const require_BaseUserList = require('./BaseUserList.cjs');
|
|
5
6
|
let __thunderid_browser = require("@thunderid/browser");
|
|
6
7
|
__thunderid_browser = require_rolldown_runtime.__toESM(__thunderid_browser);
|
|
@@ -29,11 +30,19 @@ const UserList = ({ filter, limit = 20, preferences, searchable = true, searchAt
|
|
|
29
30
|
label: t("admin.users.list.search.email"),
|
|
30
31
|
value: "email"
|
|
31
32
|
}];
|
|
32
|
-
const
|
|
33
|
-
|
|
33
|
+
const endpoint = require_useManagementEndpoint.default("users");
|
|
34
|
+
const queryFilter = filter ?? (search ? (0, __thunderid_browser.toEqualityFilter)(search.attribute, search.value) : void 0);
|
|
35
|
+
const { data, error, isLoading } = require_useResourceQuery.default([__thunderid_browser.UserQueryKeys.USERS, {
|
|
36
|
+
filter: queryFilter,
|
|
34
37
|
limit,
|
|
35
38
|
offset
|
|
36
|
-
})
|
|
39
|
+
}], (fetcher) => (0, __thunderid_browser.getUsers)({
|
|
40
|
+
...endpoint,
|
|
41
|
+
fetcher,
|
|
42
|
+
filter: queryFilter,
|
|
43
|
+
limit,
|
|
44
|
+
offset
|
|
45
|
+
}));
|
|
37
46
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_BaseUserList.default, {
|
|
38
47
|
users: data?.users ?? [],
|
|
39
48
|
totalResults: data?.totalResults,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UserList.cjs","names":["UserList: FC<UserListProps>","useTranslation","attributes: SelectOption[]","
|
|
1
|
+
{"version":3,"file":"UserList.cjs","names":["UserList: FC<UserListProps>","useTranslation","attributes: SelectOption[]","endpoint: ManagementEndpoint","useManagementEndpoint","queryFilter: string | undefined","useResourceQuery","UserQueryKeys","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,+BAAe,aAAa,KAAK;CAC7C,MAAM,CAAC,QAAQ,iCAA8B,EAAE;CAC/C,MAAM,CAAC,QAAQ,iCAA+C,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,sCAAsB,QAAQ;CACnE,MAAMC,cACJ,WAAW,mDAA0B,OAAO,WAAW,OAAO,MAAM,GAAG;CACzE,MAAM,EAAC,MAAM,OAAO,cAA2DC,iCAC7E,CAACC,kCAAc,OAAO;EAAC,QAAQ;EAAa;EAAO;EAAO,CAAC,GAC1D,8CAAqB;EAAC,GAAG;EAAU;EAAS,QAAQ;EAAa;EAAO;EAAO,CAAC,CAClF;AAED,QACE,2CAACC;EACC,OAAO,MAAM,SAAS,EAAE;EACxB,cAAc,MAAM;EACT;EACX,yDAAgC,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,105 @@
|
|
|
1
|
+
const require_rolldown_runtime = require('../../../_virtual/rolldown_runtime.cjs');
|
|
2
|
+
const require_useTranslation = require('../../../hooks/useTranslation.cjs');
|
|
3
|
+
const require_Button = require('../../primitives/Button/Button.cjs');
|
|
4
|
+
const require_TextField = require('../../primitives/TextField/TextField.cjs');
|
|
5
|
+
const require_useAdminPartStyles = require('./useAdminPartStyles.cjs');
|
|
6
|
+
let react = require("react");
|
|
7
|
+
react = require_rolldown_runtime.__toESM(react);
|
|
8
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
9
|
+
react_jsx_runtime = require_rolldown_runtime.__toESM(react_jsx_runtime);
|
|
10
|
+
|
|
11
|
+
//#region src/components/admin/shared/AccountLifecycleParts.tsx
|
|
12
|
+
/**
|
|
13
|
+
* Matches the server's limit on an operator note.
|
|
14
|
+
*/
|
|
15
|
+
const OPERATOR_NOTE_MAX_LENGTH = 100;
|
|
16
|
+
/**
|
|
17
|
+
* The translated access status of an identity, or its raw value when the status is one this SDK does
|
|
18
|
+
* not know. Renders nothing when the server reports no status.
|
|
19
|
+
*/
|
|
20
|
+
const AccessStatusBadge = ({ status }) => {
|
|
21
|
+
const styles = require_useAdminPartStyles.default();
|
|
22
|
+
const { t } = require_useTranslation.default();
|
|
23
|
+
if (!status) return null;
|
|
24
|
+
const labels = {
|
|
25
|
+
ACTIVE: t("admin.common.status.active"),
|
|
26
|
+
LOCKED: t("admin.common.status.locked"),
|
|
27
|
+
SUSPENDED: t("admin.common.status.suspended")
|
|
28
|
+
};
|
|
29
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
30
|
+
className: styles["chip"],
|
|
31
|
+
children: labels[status] ?? status
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* One button per account lifecycle action. Suspending and unsuspending ask for confirmation inline;
|
|
36
|
+
* unlocking is remedial and runs straight away.
|
|
37
|
+
*/
|
|
38
|
+
const AccountLifecycleButtons = ({ actions, collectsOperatorNote = false, isRunning = false, name, onAction }) => {
|
|
39
|
+
const styles = require_useAdminPartStyles.default();
|
|
40
|
+
const { t } = require_useTranslation.default();
|
|
41
|
+
const [confirming, setConfirming] = (0, react.useState)(null);
|
|
42
|
+
const [operatorNote, setOperatorNote] = (0, react.useState)("");
|
|
43
|
+
if (actions.length === 0) return null;
|
|
44
|
+
const labels = {
|
|
45
|
+
suspend: t("admin.common.lifecycle.suspend"),
|
|
46
|
+
unlock: t("admin.common.lifecycle.unlock"),
|
|
47
|
+
unsuspend: t("admin.common.lifecycle.unsuspend")
|
|
48
|
+
};
|
|
49
|
+
if (confirming && actions.includes(confirming)) {
|
|
50
|
+
const question = confirming === "suspend" ? t("admin.common.lifecycle.suspend_confirm", { name }) : t("admin.common.lifecycle.unsuspend_confirm", { name });
|
|
51
|
+
const withNote = collectsOperatorNote && confirming === "suspend";
|
|
52
|
+
const close = () => {
|
|
53
|
+
setConfirming(null);
|
|
54
|
+
setOperatorNote("");
|
|
55
|
+
};
|
|
56
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
57
|
+
className: styles["confirm"],
|
|
58
|
+
role: "group",
|
|
59
|
+
"aria-label": question,
|
|
60
|
+
children: [
|
|
61
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: question }),
|
|
62
|
+
withNote && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_TextField.default, {
|
|
63
|
+
name: "operatorNote",
|
|
64
|
+
label: t("admin.common.lifecycle.operator_note"),
|
|
65
|
+
"aria-label": t("admin.common.lifecycle.operator_note"),
|
|
66
|
+
value: operatorNote,
|
|
67
|
+
maxLength: OPERATOR_NOTE_MAX_LENGTH,
|
|
68
|
+
disabled: isRunning,
|
|
69
|
+
onChange: (event) => setOperatorNote(event.target.value)
|
|
70
|
+
}),
|
|
71
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Button.default, {
|
|
72
|
+
variant: "text",
|
|
73
|
+
size: "small",
|
|
74
|
+
disabled: isRunning,
|
|
75
|
+
onClick: close,
|
|
76
|
+
children: t("admin.common.actions.cancel")
|
|
77
|
+
}),
|
|
78
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Button.default, {
|
|
79
|
+
color: confirming === "suspend" ? "error" : "primary",
|
|
80
|
+
size: "small",
|
|
81
|
+
loading: isRunning,
|
|
82
|
+
disabled: isRunning,
|
|
83
|
+
onClick: () => {
|
|
84
|
+
onAction(confirming, withNote ? operatorNote.trim() || void 0 : void 0);
|
|
85
|
+
close();
|
|
86
|
+
},
|
|
87
|
+
children: labels[confirming]
|
|
88
|
+
})
|
|
89
|
+
]
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(react_jsx_runtime.Fragment, { children: actions.map((action) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Button.default, {
|
|
93
|
+
variant: "outline",
|
|
94
|
+
color: action === "suspend" ? "error" : "primary",
|
|
95
|
+
disabled: isRunning,
|
|
96
|
+
loading: isRunning && action === "unlock",
|
|
97
|
+
onClick: () => action === "unlock" ? onAction(action) : setConfirming(action),
|
|
98
|
+
children: labels[action]
|
|
99
|
+
}, action)) });
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
//#endregion
|
|
103
|
+
exports.AccessStatusBadge = AccessStatusBadge;
|
|
104
|
+
exports.AccountLifecycleButtons = AccountLifecycleButtons;
|
|
105
|
+
//# sourceMappingURL=AccountLifecycleParts.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AccountLifecycleParts.cjs","names":["AccessStatusBadge: FC<AccessStatusBadgeProps>","styles: Record<string, string>","useAdminPartStyles","useTranslation","labels: Record<AccessStatusValue, string>","AccountLifecycleButtons: FC<AccountLifecycleButtonsProps>","labels: Record<AccountLifecycleAction, string>","question: string","withNote: boolean","TextField","Button"],"sources":["../../../../../src/components/admin/shared/AccountLifecycleParts.tsx"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {AccessStatusValue, AccountLifecycleAction} from '@thunderid/browser';\nimport {ChangeEvent, FC, ReactElement, useState} from 'react';\nimport useAdminPartStyles from './useAdminPartStyles';\nimport useTranslation from '../../../hooks/useTranslation';\nimport Button from '../../primitives/Button/Button';\nimport TextField from '../../primitives/TextField/TextField';\n\n/**\n * Matches the server's limit on an operator note.\n */\nconst OPERATOR_NOTE_MAX_LENGTH = 100;\n\nexport interface AccessStatusBadgeProps {\n status?: AccessStatusValue;\n}\n\n/**\n * The translated access status of an identity, or its raw value when the status is one this SDK does\n * not know. Renders nothing when the server reports no status.\n */\nexport const AccessStatusBadge: FC<AccessStatusBadgeProps> = ({\n status,\n}: AccessStatusBadgeProps): ReactElement | null => {\n const styles: Record<string, string> = useAdminPartStyles();\n const {t} = useTranslation();\n\n if (!status) {\n return null;\n }\n\n const labels: Record<AccessStatusValue, string> = {\n ACTIVE: t('admin.common.status.active'),\n LOCKED: t('admin.common.status.locked'),\n SUSPENDED: t('admin.common.status.suspended'),\n };\n\n return <span className={styles['chip']}>{labels[status] ?? status}</span>;\n};\n\nexport interface AccountLifecycleButtonsProps {\n /**\n * The actions to offer, most expected first.\n */\n actions: AccountLifecycleAction[];\n /**\n * Whether a suspension asks for an optional operator note. The note is recorded by the flow.\n */\n collectsOperatorNote?: boolean;\n isRunning?: boolean;\n /**\n * Name of the identity, already resolved, used in the confirmation question.\n */\n name: string;\n onAction: (action: AccountLifecycleAction, operatorNote?: string) => void;\n}\n\n/**\n * One button per account lifecycle action. Suspending and unsuspending ask for confirmation inline;\n * unlocking is remedial and runs straight away.\n */\nexport const AccountLifecycleButtons: FC<AccountLifecycleButtonsProps> = ({\n actions,\n collectsOperatorNote = false,\n isRunning = false,\n name,\n onAction,\n}: AccountLifecycleButtonsProps): ReactElement | null => {\n const styles: Record<string, string> = useAdminPartStyles();\n const {t} = useTranslation();\n const [confirming, setConfirming] = useState<AccountLifecycleAction | null>(null);\n const [operatorNote, setOperatorNote] = useState<string>('');\n\n if (actions.length === 0) {\n return null;\n }\n\n const labels: Record<AccountLifecycleAction, string> = {\n suspend: t('admin.common.lifecycle.suspend'),\n unlock: t('admin.common.lifecycle.unlock'),\n unsuspend: t('admin.common.lifecycle.unsuspend'),\n };\n\n if (confirming && actions.includes(confirming)) {\n const question: string =\n confirming === 'suspend'\n ? t('admin.common.lifecycle.suspend_confirm', {name})\n : t('admin.common.lifecycle.unsuspend_confirm', {name});\n const withNote: boolean = collectsOperatorNote && confirming === 'suspend';\n const close = (): void => {\n setConfirming(null);\n setOperatorNote('');\n };\n\n return (\n <span className={styles['confirm']} role=\"group\" aria-label={question}>\n <span>{question}</span>\n {withNote && (\n <TextField\n name=\"operatorNote\"\n label={t('admin.common.lifecycle.operator_note')}\n aria-label={t('admin.common.lifecycle.operator_note')}\n value={operatorNote}\n maxLength={OPERATOR_NOTE_MAX_LENGTH}\n disabled={isRunning}\n onChange={(event: ChangeEvent<HTMLInputElement>): void => setOperatorNote(event.target.value)}\n />\n )}\n <Button variant=\"text\" size=\"small\" disabled={isRunning} onClick={close}>\n {t('admin.common.actions.cancel')}\n </Button>\n <Button\n color={confirming === 'suspend' ? 'error' : 'primary'}\n size=\"small\"\n loading={isRunning}\n disabled={isRunning}\n onClick={(): void => {\n onAction(confirming, withNote ? operatorNote.trim() || undefined : undefined);\n close();\n }}\n >\n {labels[confirming]}\n </Button>\n </span>\n );\n }\n\n return (\n <>\n {actions.map((action: AccountLifecycleAction) => (\n <Button\n key={action}\n variant=\"outline\"\n color={action === 'suspend' ? 'error' : 'primary'}\n disabled={isRunning}\n loading={isRunning && action === 'unlock'}\n onClick={(): void => (action === 'unlock' ? onAction(action) : setConfirming(action))}\n >\n {labels[action]}\n </Button>\n ))}\n </>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;AAaA,MAAM,2BAA2B;;;;;AAUjC,MAAaA,qBAAiD,EAC5D,aACiD;CACjD,MAAMC,SAAiCC,oCAAoB;CAC3D,MAAM,EAAC,MAAKC,gCAAgB;AAE5B,KAAI,CAAC,OACH,QAAO;CAGT,MAAMC,SAA4C;EAChD,QAAQ,EAAE,6BAA6B;EACvC,QAAQ,EAAE,6BAA6B;EACvC,WAAW,EAAE,gCAAgC;EAC9C;AAED,QAAO,2CAAC;EAAK,WAAW,OAAO;YAAU,OAAO,WAAW;GAAc;;;;;;AAwB3E,MAAaC,2BAA6D,EACxE,SACA,uBAAuB,OACvB,YAAY,OACZ,MACA,eACuD;CACvD,MAAMJ,SAAiCC,oCAAoB;CAC3D,MAAM,EAAC,MAAKC,gCAAgB;CAC5B,MAAM,CAAC,YAAY,qCAAyD,KAAK;CACjF,MAAM,CAAC,cAAc,uCAAoC,GAAG;AAE5D,KAAI,QAAQ,WAAW,EACrB,QAAO;CAGT,MAAMG,SAAiD;EACrD,SAAS,EAAE,iCAAiC;EAC5C,QAAQ,EAAE,gCAAgC;EAC1C,WAAW,EAAE,mCAAmC;EACjD;AAED,KAAI,cAAc,QAAQ,SAAS,WAAW,EAAE;EAC9C,MAAMC,WACJ,eAAe,YACX,EAAE,0CAA0C,EAAC,MAAK,CAAC,GACnD,EAAE,4CAA4C,EAAC,MAAK,CAAC;EAC3D,MAAMC,WAAoB,wBAAwB,eAAe;EACjE,MAAM,cAAoB;AACxB,iBAAc,KAAK;AACnB,mBAAgB,GAAG;;AAGrB,SACE,4CAAC;GAAK,WAAW,OAAO;GAAY,MAAK;GAAQ,cAAY;;IAC3D,2CAAC,oBAAM,WAAgB;IACtB,YACC,2CAACC;KACC,MAAK;KACL,OAAO,EAAE,uCAAuC;KAChD,cAAY,EAAE,uCAAuC;KACrD,OAAO;KACP,WAAW;KACX,UAAU;KACV,WAAW,UAA+C,gBAAgB,MAAM,OAAO,MAAM;MAC7F;IAEJ,2CAACC;KAAO,SAAQ;KAAO,MAAK;KAAQ,UAAU;KAAW,SAAS;eAC/D,EAAE,8BAA8B;MAC1B;IACT,2CAACA;KACC,OAAO,eAAe,YAAY,UAAU;KAC5C,MAAK;KACL,SAAS;KACT,UAAU;KACV,eAAqB;AACnB,eAAS,YAAY,WAAW,aAAa,MAAM,IAAI,SAAY,OAAU;AAC7E,aAAO;;eAGR,OAAO;MACD;;IACJ;;AAIX,QACE,mFACG,QAAQ,KAAK,WACZ,2CAACA;EAEC,SAAQ;EACR,OAAO,WAAW,YAAY,UAAU;EACxC,UAAU;EACV,SAAS,aAAa,WAAW;EACjC,eAAsB,WAAW,WAAW,SAAS,OAAO,GAAG,cAAc,OAAO;YAEnF,OAAO;IAPH,OAQE,CACT,GACD"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
const require_rolldown_runtime = require('../../../_virtual/rolldown_runtime.cjs');
|
|
2
|
+
const require_useTranslation = require('../../../hooks/useTranslation.cjs');
|
|
3
|
+
const require_TextField = require('../../primitives/TextField/TextField.cjs');
|
|
4
|
+
const require_Checkbox = require('../../primitives/Checkbox/Checkbox.cjs');
|
|
5
|
+
const require_useAdminPartStyles = require('./useAdminPartStyles.cjs');
|
|
6
|
+
let __thunderid_browser = require("@thunderid/browser");
|
|
7
|
+
__thunderid_browser = require_rolldown_runtime.__toESM(__thunderid_browser);
|
|
8
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
9
|
+
react_jsx_runtime = require_rolldown_runtime.__toESM(react_jsx_runtime);
|
|
10
|
+
|
|
11
|
+
//#region src/components/admin/shared/ApplicationFormFields.tsx
|
|
12
|
+
/**
|
|
13
|
+
* The general fields and OAuth basics of an application, shared by the create form and the edit form.
|
|
14
|
+
*/
|
|
15
|
+
const ApplicationFormFields = ({ onGrantTypesChange, onInputChange, onPublicClientChange, preferences, values }) => {
|
|
16
|
+
const styles = require_useAdminPartStyles.default();
|
|
17
|
+
const { t } = require_useTranslation.default(preferences?.i18n);
|
|
18
|
+
const text = (field, label, extra = {}) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_TextField.default, {
|
|
19
|
+
name: field,
|
|
20
|
+
label,
|
|
21
|
+
value: values[field],
|
|
22
|
+
autoComplete: "off",
|
|
23
|
+
onChange: (event) => onInputChange(field, event.target.value),
|
|
24
|
+
...extra
|
|
25
|
+
});
|
|
26
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
|
|
27
|
+
text("name", t("admin.applications.fields.name"), { required: true }),
|
|
28
|
+
text("description", t("admin.applications.fields.description")),
|
|
29
|
+
text("url", t("admin.applications.fields.url")),
|
|
30
|
+
text("logoUrl", t("admin.applications.fields.logo_url")),
|
|
31
|
+
text("redirectUris", t("admin.applications.fields.redirect_uris"), { helperText: t("admin.applications.fields.redirect_uris_hint") }),
|
|
32
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("fieldset", {
|
|
33
|
+
className: styles["row"],
|
|
34
|
+
style: {
|
|
35
|
+
border: 0,
|
|
36
|
+
flexWrap: "wrap",
|
|
37
|
+
margin: 0,
|
|
38
|
+
padding: 0
|
|
39
|
+
},
|
|
40
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("legend", {
|
|
41
|
+
className: styles["muted"],
|
|
42
|
+
children: t("admin.applications.fields.grant_types")
|
|
43
|
+
}), __thunderid_browser.APPLICATION_GRANT_TYPES.map((grantType) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Checkbox.default, {
|
|
44
|
+
name: `grantType-${grantType}`,
|
|
45
|
+
label: t(`admin.applications.grant_types.${grantType}`),
|
|
46
|
+
checked: values.grantTypes.includes(grantType),
|
|
47
|
+
onChange: (event) => onGrantTypesChange(event.target.checked ? [...values.grantTypes, grantType] : values.grantTypes.filter((value) => value !== grantType))
|
|
48
|
+
}, grantType))]
|
|
49
|
+
}),
|
|
50
|
+
onPublicClientChange && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Checkbox.default, {
|
|
51
|
+
name: "publicClient",
|
|
52
|
+
label: t("admin.applications.fields.public_client"),
|
|
53
|
+
checked: values.publicClient,
|
|
54
|
+
onChange: (event) => onPublicClientChange(event.target.checked)
|
|
55
|
+
})
|
|
56
|
+
] });
|
|
57
|
+
};
|
|
58
|
+
var ApplicationFormFields_default = ApplicationFormFields;
|
|
59
|
+
|
|
60
|
+
//#endregion
|
|
61
|
+
exports.default = ApplicationFormFields_default;
|
|
62
|
+
//# sourceMappingURL=ApplicationFormFields.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApplicationFormFields.cjs","names":["ApplicationFormFields: FC<ApplicationFormFieldsProps>","styles: Record<string, string>","useAdminPartStyles","useTranslation","TextField","APPLICATION_GRANT_TYPES","Checkbox"],"sources":["../../../../../src/components/admin/shared/ApplicationFormFields.tsx"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {APPLICATION_GRANT_TYPES, Preferences} from '@thunderid/browser';\nimport {ChangeEvent, FC, ReactElement} from 'react';\nimport useAdminPartStyles from './useAdminPartStyles';\nimport useTranslation from '../../../hooks/useTranslation';\nimport Checkbox from '../../primitives/Checkbox/Checkbox';\nimport TextField from '../../primitives/TextField/TextField';\n\n/**\n * The text fields of the application forms.\n */\nexport type ApplicationTextField = 'description' | 'logoUrl' | 'name' | 'redirectUris' | 'url';\n\n/**\n * The values of the application forms. `redirectUris` is the text of the field, URIs separated by\n * commas.\n */\nexport interface ApplicationFormValues {\n description: string;\n grantTypes: string[];\n logoUrl: string;\n name: string;\n publicClient: boolean;\n redirectUris: string;\n url: string;\n}\n\nexport interface ApplicationFormFieldsProps {\n onGrantTypesChange: (grantTypes: string[]) => void;\n onInputChange: (field: ApplicationTextField, value: string) => void;\n /**\n * Shows the public client choice. Omit it where the client type cannot change.\n */\n onPublicClientChange?: (publicClient: boolean) => void;\n preferences?: Preferences;\n values: ApplicationFormValues;\n}\n\n/**\n * The general fields and OAuth basics of an application, shared by the create form and the edit form.\n */\nconst ApplicationFormFields: FC<ApplicationFormFieldsProps> = ({\n onGrantTypesChange,\n onInputChange,\n onPublicClientChange,\n preferences,\n values,\n}: ApplicationFormFieldsProps): ReactElement => {\n const styles: Record<string, string> = useAdminPartStyles();\n const {t} = useTranslation(preferences?.i18n);\n\n const text = (field: ApplicationTextField, label: string, extra: {helperText?: string; required?: boolean} = {}) => (\n <TextField\n name={field}\n label={label}\n value={values[field]}\n autoComplete=\"off\"\n onChange={(event: ChangeEvent<HTMLInputElement>): void => onInputChange(field, event.target.value)}\n {...extra}\n />\n );\n\n return (\n <>\n {text('name', t('admin.applications.fields.name'), {required: true})}\n {text('description', t('admin.applications.fields.description'))}\n {text('url', t('admin.applications.fields.url'))}\n {text('logoUrl', t('admin.applications.fields.logo_url'))}\n {text('redirectUris', t('admin.applications.fields.redirect_uris'), {\n helperText: t('admin.applications.fields.redirect_uris_hint'),\n })}\n <fieldset className={styles['row']} style={{border: 0, flexWrap: 'wrap', margin: 0, padding: 0}}>\n <legend className={styles['muted']}>{t('admin.applications.fields.grant_types')}</legend>\n {APPLICATION_GRANT_TYPES.map((grantType: string) => (\n <Checkbox\n key={grantType}\n name={`grantType-${grantType}`}\n label={t(`admin.applications.grant_types.${grantType}`)}\n checked={values.grantTypes.includes(grantType)}\n onChange={(event: ChangeEvent<HTMLInputElement>): void =>\n onGrantTypesChange(\n event.target.checked\n ? [...values.grantTypes, grantType]\n : values.grantTypes.filter((value: string) => value !== grantType),\n )\n }\n />\n ))}\n </fieldset>\n {onPublicClientChange && (\n <Checkbox\n name=\"publicClient\"\n label={t('admin.applications.fields.public_client')}\n checked={values.publicClient}\n onChange={(event: ChangeEvent<HTMLInputElement>): void => onPublicClientChange(event.target.checked)}\n />\n )}\n </>\n );\n};\n\nexport default ApplicationFormFields;\n"],"mappings":";;;;;;;;;;;;;;AA2CA,MAAMA,yBAAyD,EAC7D,oBACA,eACA,sBACA,aACA,aAC8C;CAC9C,MAAMC,SAAiCC,oCAAoB;CAC3D,MAAM,EAAC,MAAKC,+BAAe,aAAa,KAAK;CAE7C,MAAM,QAAQ,OAA6B,OAAe,QAAmD,EAAE,KAC7G,2CAACC;EACC,MAAM;EACC;EACP,OAAO,OAAO;EACd,cAAa;EACb,WAAW,UAA+C,cAAc,OAAO,MAAM,OAAO,MAAM;EAClG,GAAI;GACJ;AAGJ,QACE;EACG,KAAK,QAAQ,EAAE,iCAAiC,EAAE,EAAC,UAAU,MAAK,CAAC;EACnE,KAAK,eAAe,EAAE,wCAAwC,CAAC;EAC/D,KAAK,OAAO,EAAE,gCAAgC,CAAC;EAC/C,KAAK,WAAW,EAAE,qCAAqC,CAAC;EACxD,KAAK,gBAAgB,EAAE,0CAA0C,EAAE,EAClE,YAAY,EAAE,+CAA+C,EAC9D,CAAC;EACF,4CAAC;GAAS,WAAW,OAAO;GAAQ,OAAO;IAAC,QAAQ;IAAG,UAAU;IAAQ,QAAQ;IAAG,SAAS;IAAE;cAC7F,2CAAC;IAAO,WAAW,OAAO;cAAW,EAAE,wCAAwC;KAAU,EACxFC,4CAAwB,KAAK,cAC5B,2CAACC;IAEC,MAAM,aAAa;IACnB,OAAO,EAAE,kCAAkC,YAAY;IACvD,SAAS,OAAO,WAAW,SAAS,UAAU;IAC9C,WAAW,UACT,mBACE,MAAM,OAAO,UACT,CAAC,GAAG,OAAO,YAAY,UAAU,GACjC,OAAO,WAAW,QAAQ,UAAkB,UAAU,UAAU,CACrE;MATE,UAWL,CACF;IACO;EACV,wBACC,2CAACA;GACC,MAAK;GACL,OAAO,EAAE,0CAA0C;GACnD,SAAS,OAAO;GAChB,WAAW,UAA+C,qBAAqB,MAAM,OAAO,QAAQ;IACpG;KAEH;;AAIP,oCAAe"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
const require_rolldown_runtime = require('../../../_virtual/rolldown_runtime.cjs');
|
|
2
|
+
const require_useTranslation = require('../../../hooks/useTranslation.cjs');
|
|
3
|
+
const require_Button = require('../../primitives/Button/Button.cjs');
|
|
4
|
+
const require_Alert = require('../../primitives/Alert/Alert.cjs');
|
|
5
|
+
const require_CopyableText = require('../../primitives/CopyableText/CopyableText.cjs');
|
|
6
|
+
const require_useAdminPartStyles = require('./useAdminPartStyles.cjs');
|
|
7
|
+
let react_jsx_runtime = require("react/jsx-runtime");
|
|
8
|
+
react_jsx_runtime = require_rolldown_runtime.__toESM(react_jsx_runtime);
|
|
9
|
+
|
|
10
|
+
//#region src/components/admin/shared/ClientSecretNotice.tsx
|
|
11
|
+
/**
|
|
12
|
+
* Shows a client secret the one time it can be read, masked until revealed, with a copy button.
|
|
13
|
+
*/
|
|
14
|
+
const ClientSecretNotice = ({ onDismiss, preferences, secret }) => {
|
|
15
|
+
const styles = require_useAdminPartStyles.default();
|
|
16
|
+
const { t } = require_useTranslation.default(preferences?.i18n);
|
|
17
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
18
|
+
className: styles["row"],
|
|
19
|
+
style: {
|
|
20
|
+
alignItems: "stretch",
|
|
21
|
+
flexDirection: "column"
|
|
22
|
+
},
|
|
23
|
+
children: [
|
|
24
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Alert.default, {
|
|
25
|
+
variant: "warning",
|
|
26
|
+
role: "status",
|
|
27
|
+
children: t("admin.applications.secret.notice")
|
|
28
|
+
}),
|
|
29
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_CopyableText.default, {
|
|
30
|
+
label: t("admin.applications.secret.title"),
|
|
31
|
+
value: secret,
|
|
32
|
+
masked: true
|
|
33
|
+
}),
|
|
34
|
+
onDismiss && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
35
|
+
className: styles["row"],
|
|
36
|
+
style: { justifyContent: "flex-end" },
|
|
37
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Button.default, {
|
|
38
|
+
onClick: onDismiss,
|
|
39
|
+
children: t("admin.applications.secret.done")
|
|
40
|
+
})
|
|
41
|
+
})
|
|
42
|
+
]
|
|
43
|
+
});
|
|
44
|
+
};
|
|
45
|
+
var ClientSecretNotice_default = ClientSecretNotice;
|
|
46
|
+
|
|
47
|
+
//#endregion
|
|
48
|
+
exports.default = ClientSecretNotice_default;
|
|
49
|
+
//# sourceMappingURL=ClientSecretNotice.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClientSecretNotice.cjs","names":["ClientSecretNotice: FC<ClientSecretNoticeProps>","styles: Record<string, string>","useAdminPartStyles","useTranslation","Alert","CopyableText","Button"],"sources":["../../../../../src/components/admin/shared/ClientSecretNotice.tsx"],"sourcesContent":["// Copyright 2026 The ThunderID Authors\n// SPDX-License-Identifier: Apache-2.0\n\nimport {Preferences} from '@thunderid/browser';\nimport {FC, ReactElement} from 'react';\nimport useAdminPartStyles from './useAdminPartStyles';\nimport useTranslation from '../../../hooks/useTranslation';\nimport Alert from '../../primitives/Alert/Alert';\nimport Button from '../../primitives/Button/Button';\nimport CopyableText from '../../primitives/CopyableText/CopyableText';\n\nexport interface ClientSecretNoticeProps {\n /**\n * Called once the secret has been copied, after which it cannot be read again.\n */\n onDismiss?: () => void;\n preferences?: Preferences;\n secret: string;\n}\n\n/**\n * Shows a client secret the one time it can be read, masked until revealed, with a copy button.\n */\nconst ClientSecretNotice: FC<ClientSecretNoticeProps> = ({\n onDismiss,\n preferences,\n secret,\n}: ClientSecretNoticeProps): ReactElement => {\n const styles: Record<string, string> = useAdminPartStyles();\n const {t} = useTranslation(preferences?.i18n);\n\n return (\n <div className={styles['row']} style={{alignItems: 'stretch', flexDirection: 'column'}}>\n <Alert variant=\"warning\" role=\"status\">\n {t('admin.applications.secret.notice')}\n </Alert>\n <CopyableText label={t('admin.applications.secret.title')} value={secret} masked />\n {onDismiss && (\n <div className={styles['row']} style={{justifyContent: 'flex-end'}}>\n <Button onClick={onDismiss}>{t('admin.applications.secret.done')}</Button>\n </div>\n )}\n </div>\n );\n};\n\nexport default ClientSecretNotice;\n"],"mappings":";;;;;;;;;;;;;AAuBA,MAAMA,sBAAmD,EACvD,WACA,aACA,aAC2C;CAC3C,MAAMC,SAAiCC,oCAAoB;CAC3D,MAAM,EAAC,MAAKC,+BAAe,aAAa,KAAK;AAE7C,QACE,4CAAC;EAAI,WAAW,OAAO;EAAQ,OAAO;GAAC,YAAY;GAAW,eAAe;GAAS;;GACpF,2CAACC;IAAM,SAAQ;IAAU,MAAK;cAC3B,EAAE,mCAAmC;KAChC;GACR,2CAACC;IAAa,OAAO,EAAE,kCAAkC;IAAE,OAAO;IAAQ;KAAS;GAClF,aACC,2CAAC;IAAI,WAAW,OAAO;IAAQ,OAAO,EAAC,gBAAgB,YAAW;cAChE,2CAACC;KAAO,SAAS;eAAY,EAAE,iCAAiC;MAAU;KACtE;;GAEJ;;AAIV,iCAAe"}
|
|
@@ -10,6 +10,7 @@ const require_Button = require('../../primitives/Button/Button.cjs');
|
|
|
10
10
|
const require_Typography = require('../../primitives/Typography/Typography.cjs');
|
|
11
11
|
const require_Alert = require('../../primitives/Alert/Alert.cjs');
|
|
12
12
|
const require_Card = require('../../primitives/Card/Card.cjs');
|
|
13
|
+
const require_isConsentApprovalBlocked = require('../../../utils/isConsentApprovalBlocked.cjs');
|
|
13
14
|
const require_AuthOptionFactory = require('../flow/AuthOptionFactory.cjs');
|
|
14
15
|
const require_useOAuthCallback = require('../../../hooks/auth/useOAuthCallback.cjs');
|
|
15
16
|
const require_oauth = require('../../../utils/oauth.cjs');
|
|
@@ -253,6 +254,7 @@ const BaseAcceptInvite = ({ executionId, inviteToken, onSubmit, onComplete, onEr
|
|
|
253
254
|
const raw = currentAdditionalData["consentPrompt"];
|
|
254
255
|
const purposes = typeof raw === "string" ? JSON.parse(raw) : raw.purposes || raw;
|
|
255
256
|
const isDeny = component?.variant?.toLowerCase() !== "primary";
|
|
257
|
+
if (!isDeny && require_isConsentApprovalBlocked.default(purposes, inputs)) return;
|
|
256
258
|
const decisions = {
|
|
257
259
|
approved: !isDeny,
|
|
258
260
|
...isDeny ? { reason: __thunderid_browser.ConsentConstants.REASON_USER_DENIED } : {},
|
|
@@ -264,16 +266,13 @@ const BaseAcceptInvite = ({ executionId, inviteToken, onSubmit, onComplete, onEr
|
|
|
264
266
|
name: e.name
|
|
265
267
|
})), ...(p.optional || []).map((e) => {
|
|
266
268
|
const key = `__consent_opt__${p.purposeId}__${e.name}`;
|
|
267
|
-
return
|
|
268
|
-
approved: !isDeny && inputs[key] === "true",
|
|
269
|
-
name: e.name
|
|
270
|
-
};
|
|
269
|
+
return (0, __thunderid_browser.getConsentElementDecision)(p.purposeId, e, !isDeny && inputs[key] === "true", inputs);
|
|
271
270
|
})]
|
|
272
271
|
}))
|
|
273
272
|
};
|
|
274
273
|
inputs.consent_decisions = JSON.stringify(decisions);
|
|
275
274
|
Object.keys(inputs).forEach((k) => {
|
|
276
|
-
if (k.startsWith("__consent_opt__")) delete inputs[k];
|
|
275
|
+
if (k.startsWith("__consent_opt__") || k.startsWith(__thunderid_browser.CONSENT_MODIFIED_KEY_PREFIX) || k.startsWith(__thunderid_browser.CONSENT_INVALID_KEY_PREFIX)) delete inputs[k];
|
|
277
276
|
});
|
|
278
277
|
} catch {}
|
|
279
278
|
const payload = {
|