@stytch/react 20.0.0-next.0 → 20.0.0-next.1
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/CHANGELOG.md +6 -0
- package/dist/cjs/{StytchSSRProxy-CUOvjF03.js → StytchSSRProxy-Bz6LNYdq.js} +186 -1
- package/dist/cjs/StytchSSRProxy-Bz6LNYdq.js.map +1 -0
- package/dist/cjs/adminPortal/index.cjs +102 -26
- package/dist/cjs/adminPortal/index.cjs.map +1 -1
- package/dist/cjs/b2b/index.cjs +176 -138
- package/dist/cjs/b2b/index.cjs.map +1 -1
- package/dist/cjs/b2b/index.headless.cjs +24 -24
- package/dist/cjs/b2b/index.headless.cjs.map +1 -1
- package/dist/cjs/{idpHelpers-eUP8j58U.js → idpHelpers-Bj_7pbfW.js} +7 -191
- package/dist/cjs/idpHelpers-Bj_7pbfW.js.map +1 -0
- package/dist/cjs/{index-DfiRrtK8.js → index-Ni_dyEsz.js} +3 -3
- package/dist/cjs/{index-DfiRrtK8.js.map → index-Ni_dyEsz.js.map} +1 -1
- package/dist/cjs/index.cjs +207 -196
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.headless.cjs +32 -32
- package/dist/cjs/index.headless.cjs.map +1 -1
- package/dist/cjs/{passwordManagerDisableAutofillProps-C0akDAKd.js → passwordManagerDisableAutofillProps-DV31RTL_.js} +2 -2
- package/dist/cjs/{passwordManagerDisableAutofillProps-C0akDAKd.js.map → passwordManagerDisableAutofillProps-DV31RTL_.js.map} +1 -1
- package/dist/cjs/{shadcn-Bbv2Hk3P.js → shadcn-B8TEzQMT.js} +99 -81
- package/dist/cjs/shadcn-B8TEzQMT.js.map +1 -0
- package/dist/cjs-dev/{StytchSSRProxy-D0B5PuT0.js → StytchSSRProxy-CxXsyme4.js} +186 -1
- package/dist/cjs-dev/StytchSSRProxy-CxXsyme4.js.map +1 -0
- package/dist/cjs-dev/adminPortal/index.cjs +102 -26
- package/dist/cjs-dev/adminPortal/index.cjs.map +1 -1
- package/dist/cjs-dev/b2b/index.cjs +176 -138
- package/dist/cjs-dev/b2b/index.cjs.map +1 -1
- package/dist/cjs-dev/b2b/index.headless.cjs +24 -24
- package/dist/cjs-dev/b2b/index.headless.cjs.map +1 -1
- package/dist/cjs-dev/{idpHelpers-DOOVv6dT.js → idpHelpers-Cf8Qq1B4.js} +7 -191
- package/dist/cjs-dev/idpHelpers-Cf8Qq1B4.js.map +1 -0
- package/dist/cjs-dev/{index-paeFcHjf.js → index-DdK3Jt4u.js} +3 -3
- package/dist/cjs-dev/{index-paeFcHjf.js.map → index-DdK3Jt4u.js.map} +1 -1
- package/dist/cjs-dev/index.cjs +207 -196
- package/dist/cjs-dev/index.cjs.map +1 -1
- package/dist/cjs-dev/index.headless.cjs +32 -32
- package/dist/cjs-dev/index.headless.cjs.map +1 -1
- package/dist/cjs-dev/{passwordManagerDisableAutofillProps-CnLBAXyr.js → passwordManagerDisableAutofillProps-D70WyvIu.js} +2 -2
- package/dist/cjs-dev/{passwordManagerDisableAutofillProps-CnLBAXyr.js.map → passwordManagerDisableAutofillProps-D70WyvIu.js.map} +1 -1
- package/dist/cjs-dev/{shadcn-CdbmlhdF.js → shadcn-C4w3DtKK.js} +99 -81
- package/dist/cjs-dev/shadcn-C4w3DtKK.js.map +1 -0
- package/dist/esm/_virtual/index.mjs +4 -4
- package/dist/esm/_virtual/index3.mjs +3 -5
- package/dist/esm/_virtual/index3.mjs.map +1 -1
- package/dist/esm/_virtual/index4.mjs +5 -3
- package/dist/esm/_virtual/index4.mjs.map +1 -1
- package/dist/esm/_virtual/index6.mjs +2 -2
- package/dist/esm/_virtual/index7.mjs +2 -2
- package/dist/esm/adminPortal/index.mjs +4 -1
- package/dist/esm/adminPortal/index.mjs.map +1 -1
- package/dist/esm/b2b/index.mjs.map +1 -1
- package/dist/esm/node_modules/lodash.merge/index.mjs +1 -1
- package/dist/esm/node_modules/use-sync-external-store/shim/index.mjs +1 -1
- package/dist/esm/packages/core/src/rpc/FrameClient.mjs +1 -0
- package/dist/esm/packages/core/src/rpc/FrameClient.mjs.map +1 -1
- package/dist/esm/packages/web/messages/b2b/en.json.mjs +10 -3
- package/dist/esm/packages/web/messages/b2b/en.json.mjs.map +1 -1
- package/dist/esm/packages/web/messages/en.json.mjs +10 -3
- package/dist/esm/packages/web/messages/en.json.mjs.map +1 -1
- package/dist/esm/packages/web/src/adminPortal/memberManagement/AccessSection.mjs +6 -3
- package/dist/esm/packages/web/src/adminPortal/memberManagement/AccessSection.mjs.map +1 -1
- package/dist/esm/packages/web/src/adminPortal/memberManagement/InviteModal.mjs +4 -1
- package/dist/esm/packages/web/src/adminPortal/memberManagement/InviteModal.mjs.map +1 -1
- package/dist/esm/packages/web/src/adminPortal/memberManagement/MemberListScreen.mjs +3 -1
- package/dist/esm/packages/web/src/adminPortal/memberManagement/MemberListScreen.mjs.map +1 -1
- package/dist/esm/packages/web/src/adminPortal/scim/SCIMConnectionRoleAssignmentsSection.mjs +6 -2
- package/dist/esm/packages/web/src/adminPortal/scim/SCIMConnectionRoleAssignmentsSection.mjs.map +1 -1
- package/dist/esm/packages/web/src/adminPortal/settings/OrgSettingsRoleAssignmentsSection.mjs +7 -3
- package/dist/esm/packages/web/src/adminPortal/settings/OrgSettingsRoleAssignmentsSection.mjs.map +1 -1
- package/dist/esm/packages/web/src/adminPortal/sso/RoleAssignmentsSection.mjs +5 -1
- package/dist/esm/packages/web/src/adminPortal/sso/RoleAssignmentsSection.mjs.map +1 -1
- package/dist/esm/packages/web/src/adminPortal/utils/theme.mjs +1 -1
- package/dist/esm/packages/web/src/adminPortal/utils/useRbac.mjs.map +1 -1
- package/dist/esm/packages/web/src/adminPortal/utils/useRoleAutocomplete.mjs +3 -3
- package/dist/esm/packages/web/src/adminPortal/utils/useRoleAutocomplete.mjs.map +1 -1
- package/dist/esm/packages/web/src/adminPortal/utils/useRoleDisplayInfo.mjs +2 -2
- package/dist/esm/packages/web/src/adminPortal/utils/useRoleDisplayInfo.mjs.map +1 -1
- package/dist/esm/packages/web/src/adminPortal/utils/useRoles.mjs +7 -2
- package/dist/esm/packages/web/src/adminPortal/utils/useRoles.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/b2b/components/OrganizationRow.mjs +1 -1
- package/dist/esm/packages/web/src/ui/b2b/screens/EmailConfirmation.mjs +27 -3
- package/dist/esm/packages/web/src/ui/b2b/screens/EmailConfirmation.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/b2b/screens/RecoveryCodeEntryScreen.mjs +2 -0
- package/dist/esm/packages/web/src/ui/b2b/screens/RecoveryCodeEntryScreen.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/b2b/screens/SMSOTPEntryScreen.mjs +2 -0
- package/dist/esm/packages/web/src/ui/b2b/screens/SMSOTPEntryScreen.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/b2b/utils.mjs +8 -1
- package/dist/esm/packages/web/src/ui/b2b/utils.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/b2c/components/GoogleOneTap.mjs +1 -1
- package/dist/esm/packages/web/src/ui/b2c/screens/Main/LoginForm/index.mjs +1 -1
- package/dist/esm/packages/web/src/ui/b2c/screens/Passkey/EditableRow.mjs +1 -1
- package/dist/esm/packages/web/src/ui/b2c/screens/Secondary/EmailConfirmation.mjs +10 -4
- package/dist/esm/packages/web/src/ui/b2c/screens/Secondary/EmailConfirmation.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/b2c/screens/Secondary/PasswordCreateAuthenticate.mjs +2 -1
- package/dist/esm/packages/web/src/ui/b2c/screens/Secondary/PasswordCreateAuthenticate.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/b2c/screens/Secondary/PasswordlessAuthenticate.mjs +5 -68
- package/dist/esm/packages/web/src/ui/b2c/screens/Secondary/PasswordlessAuthenticate.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/b2c/screens/Secondary/usePasswordlessAuthenticate.mjs +71 -0
- package/dist/esm/packages/web/src/ui/b2c/screens/Secondary/usePasswordlessAuthenticate.mjs.map +1 -0
- package/dist/esm/packages/web/src/ui/components/atoms/AnimatedContainer.mjs +1 -1
- package/dist/esm/packages/web/src/ui/components/atoms/Button.mjs +1 -1
- package/dist/esm/packages/web/src/ui/components/atoms/CircularProgress.mjs +4 -5
- package/dist/esm/packages/web/src/ui/components/atoms/CircularProgress.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/components/atoms/CodeContainer.mjs +1 -1
- package/dist/esm/packages/web/src/ui/components/atoms/Column.mjs +1 -1
- package/dist/esm/packages/web/src/ui/components/atoms/Typography.mjs +1 -1
- package/dist/esm/packages/web/src/ui/components/atoms/VerticalTransition.mjs +1 -1
- package/dist/esm/packages/web/src/ui/components/atoms/VisuallyHidden.mjs +1 -1
- package/dist/esm/packages/web/src/ui/components/atoms/Watermark.mjs +14 -23
- package/dist/esm/packages/web/src/ui/components/atoms/Watermark.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/components/atoms/Watermark.module.css.mjs +2 -2
- package/dist/esm/packages/web/src/ui/components/molecules/Badge.mjs +1 -1
- package/dist/esm/packages/web/src/ui/components/molecules/EmailInput.mjs +1 -1
- package/dist/esm/packages/web/src/ui/components/molecules/EmailInput.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/components/molecules/ErrorText.mjs +12 -4
- package/dist/esm/packages/web/src/ui/components/molecules/ErrorText.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/components/molecules/Input.mjs +3 -2
- package/dist/esm/packages/web/src/ui/components/molecules/Input.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/components/molecules/MainContainer.mjs +6 -6
- package/dist/esm/packages/web/src/ui/components/molecules/MainContainer.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/components/molecules/MainContainer.module.css.mjs +2 -2
- package/dist/esm/packages/web/src/ui/components/molecules/OtpInput.mjs +1 -1
- package/dist/esm/packages/web/src/ui/components/molecules/PasswordStrengthCheck.mjs +1 -1
- package/dist/esm/packages/web/src/ui/components/molecules/PhoneInput.mjs +3 -4
- package/dist/esm/packages/web/src/ui/components/molecules/PhoneInput.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/components/organisms/EmailConfirmationView.mjs +26 -3
- package/dist/esm/packages/web/src/ui/components/organisms/EmailConfirmationView.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/components/organisms/IDPConsentManifest.mjs +1 -1
- package/dist/esm/packages/web/src/ui/components/organisms/OneTapError.mjs +1 -1
- package/dist/esm/packages/web/src/ui/components/organisms/ResendOTPButton.mjs +2 -2
- package/dist/esm/packages/web/src/ui/components/organisms/ResendOTPButton.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/react/adminPortal/AdminPortalMemberManagement.mjs +0 -42
- package/dist/esm/packages/web/src/ui/react/adminPortal/AdminPortalMemberManagement.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/react/adminPortal/AdminPortalOrgSettings.mjs +0 -40
- package/dist/esm/packages/web/src/ui/react/adminPortal/AdminPortalOrgSettings.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/react/adminPortal/AdminPortalSCIM.mjs +0 -43
- package/dist/esm/packages/web/src/ui/react/adminPortal/AdminPortalSCIM.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/react/adminPortal/AdminPortalSSO.mjs +0 -36
- package/dist/esm/packages/web/src/ui/react/adminPortal/AdminPortalSSO.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/react/b2b/Stytch.mjs.map +1 -1
- package/dist/esm/packages/web/src/ui/react/bindings/createB2BComponent.mjs.map +1 -1
- package/dist/esm/packages/web/src/utils/crypto.mjs +1 -1
- package/dist/esm-dev/_virtual/index.mjs +4 -4
- package/dist/esm-dev/_virtual/index3.mjs +3 -5
- package/dist/esm-dev/_virtual/index3.mjs.map +1 -1
- package/dist/esm-dev/_virtual/index4.mjs +5 -3
- package/dist/esm-dev/_virtual/index4.mjs.map +1 -1
- package/dist/esm-dev/_virtual/index6.mjs +2 -2
- package/dist/esm-dev/_virtual/index7.mjs +2 -2
- package/dist/esm-dev/adminPortal/index.mjs +4 -1
- package/dist/esm-dev/adminPortal/index.mjs.map +1 -1
- package/dist/esm-dev/b2b/index.mjs.map +1 -1
- package/dist/esm-dev/node_modules/lodash.merge/index.mjs +1 -1
- package/dist/esm-dev/node_modules/use-sync-external-store/shim/index.mjs +1 -1
- package/dist/esm-dev/packages/core/src/rpc/FrameClient.mjs +1 -0
- package/dist/esm-dev/packages/core/src/rpc/FrameClient.mjs.map +1 -1
- package/dist/esm-dev/packages/web/messages/b2b/en.json.mjs +10 -3
- package/dist/esm-dev/packages/web/messages/b2b/en.json.mjs.map +1 -1
- package/dist/esm-dev/packages/web/messages/en.json.mjs +10 -3
- package/dist/esm-dev/packages/web/messages/en.json.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/adminPortal/memberManagement/AccessSection.mjs +6 -3
- package/dist/esm-dev/packages/web/src/adminPortal/memberManagement/AccessSection.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/adminPortal/memberManagement/InviteModal.mjs +4 -1
- package/dist/esm-dev/packages/web/src/adminPortal/memberManagement/InviteModal.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/adminPortal/memberManagement/MemberListScreen.mjs +3 -1
- package/dist/esm-dev/packages/web/src/adminPortal/memberManagement/MemberListScreen.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/adminPortal/scim/SCIMConnectionRoleAssignmentsSection.mjs +6 -2
- package/dist/esm-dev/packages/web/src/adminPortal/scim/SCIMConnectionRoleAssignmentsSection.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/adminPortal/settings/OrgSettingsRoleAssignmentsSection.mjs +7 -3
- package/dist/esm-dev/packages/web/src/adminPortal/settings/OrgSettingsRoleAssignmentsSection.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/adminPortal/sso/RoleAssignmentsSection.mjs +5 -1
- package/dist/esm-dev/packages/web/src/adminPortal/sso/RoleAssignmentsSection.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/adminPortal/utils/theme.mjs +1 -1
- package/dist/esm-dev/packages/web/src/adminPortal/utils/useRbac.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/adminPortal/utils/useRoleAutocomplete.mjs +3 -3
- package/dist/esm-dev/packages/web/src/adminPortal/utils/useRoleAutocomplete.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/adminPortal/utils/useRoleDisplayInfo.mjs +2 -2
- package/dist/esm-dev/packages/web/src/adminPortal/utils/useRoleDisplayInfo.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/adminPortal/utils/useRoles.mjs +7 -2
- package/dist/esm-dev/packages/web/src/adminPortal/utils/useRoles.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2b/components/OrganizationRow.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2b/screens/EmailConfirmation.mjs +27 -3
- package/dist/esm-dev/packages/web/src/ui/b2b/screens/EmailConfirmation.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2b/screens/RecoveryCodeEntryScreen.mjs +2 -0
- package/dist/esm-dev/packages/web/src/ui/b2b/screens/RecoveryCodeEntryScreen.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2b/screens/SMSOTPEntryScreen.mjs +2 -0
- package/dist/esm-dev/packages/web/src/ui/b2b/screens/SMSOTPEntryScreen.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2b/utils.mjs +8 -1
- package/dist/esm-dev/packages/web/src/ui/b2b/utils.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2c/components/GoogleOneTap.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2c/screens/Main/LoginForm/index.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2c/screens/Passkey/EditableRow.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2c/screens/Secondary/EmailConfirmation.mjs +10 -4
- package/dist/esm-dev/packages/web/src/ui/b2c/screens/Secondary/EmailConfirmation.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2c/screens/Secondary/PasswordCreateAuthenticate.mjs +2 -1
- package/dist/esm-dev/packages/web/src/ui/b2c/screens/Secondary/PasswordCreateAuthenticate.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2c/screens/Secondary/PasswordlessAuthenticate.mjs +5 -68
- package/dist/esm-dev/packages/web/src/ui/b2c/screens/Secondary/PasswordlessAuthenticate.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/b2c/screens/Secondary/usePasswordlessAuthenticate.mjs +71 -0
- package/dist/esm-dev/packages/web/src/ui/b2c/screens/Secondary/usePasswordlessAuthenticate.mjs.map +1 -0
- package/dist/esm-dev/packages/web/src/ui/components/atoms/AnimatedContainer.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/atoms/Button.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/atoms/CircularProgress.mjs +4 -5
- package/dist/esm-dev/packages/web/src/ui/components/atoms/CircularProgress.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/atoms/CodeContainer.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/atoms/Column.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/atoms/Typography.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/atoms/VerticalTransition.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/atoms/VisuallyHidden.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/atoms/Watermark.mjs +14 -23
- package/dist/esm-dev/packages/web/src/ui/components/atoms/Watermark.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/atoms/Watermark.module.css.mjs +2 -2
- package/dist/esm-dev/packages/web/src/ui/components/molecules/Badge.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/molecules/EmailInput.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/molecules/EmailInput.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/molecules/ErrorText.mjs +12 -4
- package/dist/esm-dev/packages/web/src/ui/components/molecules/ErrorText.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/molecules/Input.mjs +3 -2
- package/dist/esm-dev/packages/web/src/ui/components/molecules/Input.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/molecules/MainContainer.mjs +6 -6
- package/dist/esm-dev/packages/web/src/ui/components/molecules/MainContainer.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/molecules/MainContainer.module.css.mjs +2 -2
- package/dist/esm-dev/packages/web/src/ui/components/molecules/OtpInput.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/molecules/PasswordStrengthCheck.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/molecules/PhoneInput.mjs +3 -4
- package/dist/esm-dev/packages/web/src/ui/components/molecules/PhoneInput.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/organisms/EmailConfirmationView.mjs +26 -3
- package/dist/esm-dev/packages/web/src/ui/components/organisms/EmailConfirmationView.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/organisms/IDPConsentManifest.mjs +1 -1
- package/dist/esm-dev/packages/web/src/ui/components/organisms/ResendOTPButton.mjs +2 -2
- package/dist/esm-dev/packages/web/src/ui/components/organisms/ResendOTPButton.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/react/adminPortal/AdminPortalMemberManagement.mjs +0 -42
- package/dist/esm-dev/packages/web/src/ui/react/adminPortal/AdminPortalMemberManagement.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/react/adminPortal/AdminPortalOrgSettings.mjs +0 -40
- package/dist/esm-dev/packages/web/src/ui/react/adminPortal/AdminPortalOrgSettings.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/react/adminPortal/AdminPortalSCIM.mjs +0 -43
- package/dist/esm-dev/packages/web/src/ui/react/adminPortal/AdminPortalSCIM.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/react/adminPortal/AdminPortalSSO.mjs +0 -36
- package/dist/esm-dev/packages/web/src/ui/react/adminPortal/AdminPortalSSO.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/react/b2b/Stytch.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/ui/react/bindings/createB2BComponent.mjs.map +1 -1
- package/dist/esm-dev/packages/web/src/utils/crypto.mjs +1 -1
- package/dist/types/{StytchB2BClient-Dq-ITB7Q.d.ts → StytchB2BClient-C_7NUKZh.d.ts} +1 -1
- package/dist/types/{StytchClient-BV0sT3Ox.d.ts → StytchClient-Ccvk8Nj1.d.ts} +1 -2
- package/dist/types/adminPortal/index.d.ts +5 -4
- package/dist/types/b2b/index.d.ts +11 -11
- package/dist/types/b2b/index.headless.d.ts +4 -4
- package/dist/types/{createAuthUrlHandler-Ck5TyB9J.d.ts → createAuthUrlHandler-BJRA2PHG.d.ts} +939 -39
- package/dist/types/idpHelpers-aCVwNrDk.d.ts +36 -0
- package/dist/types/index.d.ts +8 -8
- package/dist/types/index.headless.d.ts +4 -4
- package/dist/types/{shadcn-CFz8Asq0.d.ts → shadcn-0e4fkV5Z.d.ts} +6 -6
- package/messages/b2b/en.po +6 -3
- package/messages/en.po +6 -3
- package/package.json +1 -1
- package/dist/cjs/StytchSSRProxy-CUOvjF03.js.map +0 -1
- package/dist/cjs/idpHelpers-eUP8j58U.js.map +0 -1
- package/dist/cjs/shadcn-Bbv2Hk3P.js.map +0 -1
- package/dist/cjs-dev/StytchSSRProxy-D0B5PuT0.js.map +0 -1
- package/dist/cjs-dev/idpHelpers-DOOVv6dT.js.map +0 -1
- package/dist/cjs-dev/shadcn-CdbmlhdF.js.map +0 -1
- package/dist/esm/packages/web/src/adminPortal/MuiClassNameSetup.mjs +0 -5
- package/dist/esm/packages/web/src/adminPortal/MuiClassNameSetup.mjs.map +0 -1
- package/dist/esm/packages/web/src/adminPortal/classNameSeed.mjs +0 -5
- package/dist/esm/packages/web/src/adminPortal/classNameSeed.mjs.map +0 -1
- package/dist/esm-dev/packages/web/src/adminPortal/MuiClassNameSetup.mjs +0 -5
- package/dist/esm-dev/packages/web/src/adminPortal/MuiClassNameSetup.mjs.map +0 -1
- package/dist/esm-dev/packages/web/src/adminPortal/classNameSeed.mjs +0 -5
- package/dist/esm-dev/packages/web/src/adminPortal/classNameSeed.mjs.map +0 -1
- package/dist/types/idpHelpers-hBhPCtAC.d.ts +0 -936
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MemberListScreen.mjs","sources":["../../../../../../../../web/src/adminPortal/memberManagement/MemberListScreen.tsx"],"sourcesContent":["import Add from '@mui/icons-material/Add';\nimport CheckCircle from '@mui/icons-material/CheckCircle';\nimport DeleteOutlined from '@mui/icons-material/DeleteOutlined';\nimport EditOutlined from '@mui/icons-material/EditOutlined';\nimport VisibilityOutlined from '@mui/icons-material/VisibilityOutlined';\nimport EmailOutlined from '@mui/icons-material/EmailOutlined';\nimport { B2BOrganizationsMembersSearchResponse, Member } from '@stytch/core/public';\nimport React, { useCallback, useMemo, useState } from 'react';\nimport useSWRInfinite from 'swr/infinite';\nimport { extractErrorMessage } from '../../utils/extractErrorMessage';\nimport { Action, useActionMenu } from '../components/ActionMenu';\nimport { Alert } from '../components/Alert';\nimport { Button } from '../components/Button';\nimport { FilterMenu, FilterMenuProps } from '../components/FilterMenu';\nimport { FlexBox } from '../components/FlexBox';\nimport { PaginatedTable, PaginatedTableProps } from '../components/PaginatedTable';\nimport { RolesList } from '../components/RolesList';\nimport { SearchBar } from '../components/SearchBar';\nimport { Typography } from '../components/Typography';\nimport { TableItemRenderer } from '../shared/components/types';\nimport { decorateCurrentMemberName } from '../utils/decorateCurrentMemberName';\nimport { fetchMembers } from '../utils/fetchMembers';\nimport { useDebouncedState } from '../utils/useDebouncedState';\nimport { itemsPerPageOptions, useItemsPerPage } from '../utils/useItemsPerPage';\nimport { useOrgInfo } from '../utils/useOrgInfo';\nimport { usePagination } from '../utils/usePagination';\nimport { usePersistentFilter } from '../utils/usePersistentFilter';\nimport { useRbac } from '../utils/useRbac';\nimport { useRoleAutocomplete } from '../utils/useRoleAutocomplete';\nimport { useSelf } from '../utils/useSelf';\nimport { useStytchClient } from '../utils/useStytchClient';\nimport { InviteModal, useInviteModal } from './InviteModal';\nimport { useMemberManagementRouterController } from './MemberManagementRouter';\nimport { KnownMemberStatus, allMemberStatuses, allMemberStatusesSet } from './MemberStatus';\nimport { getMemberStatusDisplayName } from './getMemberStatusDisplayName';\nimport { useMemberActivation } from './useMemberActivation';\nimport { useSendInviteEmail } from './useSendInviteEmail';\nimport { useToast } from '../shared/components/Toast';\n\nconst MIN_EMAIL_FUZZY_SEARCH_LENGTH = 3;\n\nconst MEMBER_LIST_TABLE_VIEW_ID = 'adminPortalMemberList';\n\nconst DEFAULT_STATUSES_FILTER: ReadonlySet<KnownMemberStatus> = new Set(['active', 'invited', 'pending']);\n\nconst REINVITE_MEMBER_STATUS: ReadonlySet<string> = new Set<KnownMemberStatus>(['invited', 'pending']);\n\nconst allStatusesFilterItems = allMemberStatuses.map((status) => ({\n label: getMemberStatusDisplayName(status),\n value: status,\n}));\n\nexport const useMembers = ({\n limit,\n email: emailRaw,\n roles,\n statuses,\n}: {\n limit: number;\n email: string | undefined;\n roles: string[] | undefined;\n statuses: KnownMemberStatus[] | undefined;\n}) => {\n const client = useStytchClient();\n const orgInfo = useOrgInfo();\n\n const email = emailRaw && emailRaw.length >= MIN_EMAIL_FUZZY_SEARCH_LENGTH ? emailRaw : undefined;\n\n return useSWRInfinite(\n (index, prevData: B2BOrganizationsMembersSearchResponse | null) => {\n if (prevData && !prevData.results_metadata.next_cursor) {\n return null;\n }\n\n return {\n orgId: orgInfo.data?.organization_id,\n method: 'members.search',\n limit,\n email,\n // Stabilize the query key by sorting roles and statuses deterministically\n roles: roles?.slice().sort(),\n statuses: statuses?.slice().sort(),\n cursor: prevData?.results_metadata.next_cursor,\n };\n },\n fetchMembers(client),\n { revalidateFirstPage: false },\n );\n};\n\ninterface Column<T> extends TableItemRenderer<T> {\n id: string;\n}\n\nconst getMemberId = (item: Member) => item.member_id;\n\ninterface ColumnTitleWithFilterProps<T> extends Pick<FilterMenuProps<T>, 'items' | 'value' | 'onChange'> {\n title: string;\n}\n\nconst ColumnTitleWithFilter = <T extends string>({ items, onChange, value, title }: ColumnTitleWithFilterProps<T>) => {\n const [container, setContainer] = useState<HTMLElement | null>(null);\n\n return (\n <div ref={setContainer}>\n <FlexBox gap={1} alignItems=\"center\">\n {title}\n <FilterMenu anchorEl={container ?? undefined} items={items} value={value} onChange={onChange} />\n </FlexBox>\n </div>\n );\n};\n\nconst emptySet: ReadonlySet<string> = new Set();\n\nexport const MemberListScreen = () => {\n const { navigate } = useMemberManagementRouterController();\n\n const { data: canCreateMemberPerm } = useRbac('stytch.member', 'create');\n const { data: canUpdateMemberIsBreakglassPerm } = useRbac('stytch.member', 'update.settings.is-breakglass');\n const { data: canUpdateMemberRolesPerm } = useRbac('stytch.member', 'update.settings.roles');\n\n const { data: canUpdateMemberNamePerm } = useRbac('stytch.member', 'update.info.name');\n const { data: canUpdateMemberUntrustedMetadataPerm } = useRbac('stytch.member', 'update.info.untrusted-metadata');\n const { data: canUpdateMemberMfaPhonePerm } = useRbac('stytch.member', 'update.info.mfa-phone');\n const { data: canDeleteMemberMfaPhonePerm } = useRbac('stytch.member', 'update.info.delete.mfa-phone');\n const { data: canDeleteMemberMfaTotpPerm } = useRbac('stytch.member', 'update.info.delete.mfa-totp');\n const { data: canDeleteMemberPasswordPerm } = useRbac('stytch.member', 'update.info.delete.password');\n const { data: canUpdateMemberMfaEnrolledPerm } = useRbac('stytch.member', 'update.settings.mfa-enrolled');\n const { data: canUpdateMemberDefaultMfaMethodPerm } = useRbac('stytch.member', 'update.settings.default-mfa-method');\n const { data: canDeleteMemberPerm } = useRbac('stytch.member', 'delete');\n const { data: canRevokeMemberSessionsPerm } = useRbac('stytch.member', 'revoke-sessions');\n\n const { data: canUpdateSelfNamePerm } = useRbac('stytch.self', 'update.info.name');\n const { data: canUpdateSelfUntrustedMetadataPerm } = useRbac('stytch.self', 'update.info.untrusted-metadata');\n const { data: canUpdateSelfMfaPhonePerm } = useRbac('stytch.self', 'update.info.mfa-phone');\n const { data: canDeleteSelfMfaPhonePerm } = useRbac('stytch.self', 'update.info.delete.mfa-phone');\n const { data: canDeleteSelfMfaTotpPerm } = useRbac('stytch.self', 'update.info.delete.mfa-totp');\n const { data: canDeleteSelfPasswordPerm } = useRbac('stytch.self', 'update.info.delete.password');\n const { data: canUpdateSelfMfaEnrolledPerm } = useRbac('stytch.self', 'update.settings.mfa-enrolled');\n const { data: canUpdateSelfDefaultMfaMethodPerm } = useRbac('stytch.self', 'update.settings.default-mfa-method');\n const { data: canDeleteSelfPerm } = useRbac('stytch.self', 'delete');\n const { data: canRevokeSelfSessionsPerm } = useRbac('stytch.self', 'revoke-sessions');\n\n const canUpdateMember =\n canDeleteMemberMfaPhonePerm ||\n canDeleteMemberMfaTotpPerm ||\n canDeleteMemberPasswordPerm ||\n canUpdateMemberMfaPhonePerm ||\n canUpdateMemberNamePerm ||\n canUpdateMemberUntrustedMetadataPerm ||\n canUpdateMemberIsBreakglassPerm ||\n canUpdateMemberMfaEnrolledPerm ||\n canUpdateMemberDefaultMfaMethodPerm ||\n canUpdateMemberRolesPerm ||\n canRevokeMemberSessionsPerm;\n\n const canUpdateSelf =\n canUpdateSelfNamePerm ||\n canUpdateSelfUntrustedMetadataPerm ||\n canUpdateSelfMfaPhonePerm ||\n canDeleteSelfMfaPhonePerm ||\n canDeleteSelfPasswordPerm ||\n canUpdateSelfMfaEnrolledPerm ||\n canUpdateSelfDefaultMfaMethodPerm ||\n canDeleteSelfPerm ||\n canDeleteSelfMfaTotpPerm ||\n canRevokeSelfSessionsPerm;\n\n const canActivateOrDeactivate = canCreateMemberPerm || canDeleteMemberPerm;\n\n const orgInfo = useOrgInfo();\n const orgAllowsEmailInvites = orgInfo.data && orgInfo.data.email_invites !== 'NOT_ALLOWED';\n\n const { self } = useSelf();\n const currentMemberId = self?.member_id;\n\n const canInviteMember = canCreateMemberPerm && orgAllowsEmailInvites;\n\n const roleAutocompleteProps = useRoleAutocomplete({ excludeStytchMember: true });\n const allRolesSet = useMemo(() => new Set(roleAutocompleteProps.selectItems), [roleAutocompleteProps.selectItems]);\n const allRolesFilterItems = useMemo(() => {\n return roleAutocompleteProps.selectItems.map((roleId) => ({\n label: roleAutocompleteProps.getOptionLabel(roleId),\n value: roleId,\n }));\n }, [roleAutocompleteProps]);\n\n const [filterRoles, setFilterRoles] = usePersistentFilter({\n viewId: MEMBER_LIST_TABLE_VIEW_ID,\n fieldId: 'role',\n defaultValue: emptySet,\n permittedValues: allRolesSet,\n });\n const [filterStatuses, setFilterStatuses] = usePersistentFilter({\n viewId: MEMBER_LIST_TABLE_VIEW_ID,\n fieldId: 'status',\n defaultValue: DEFAULT_STATUSES_FILTER,\n permittedValues: allMemberStatusesSet,\n });\n\n const itemRenderer: Column<Member>[] = useMemo(\n () => [\n {\n id: 'name',\n title: 'Name',\n getValue: ({ name, member_id }) => {\n return member_id === currentMemberId ? decorateCurrentMemberName(name) : name;\n },\n width: 200,\n },\n {\n id: 'email',\n title: 'Email',\n getValue: ({ email_address }) => {\n return email_address;\n },\n width: 200,\n },\n {\n id: 'role',\n title: 'Role',\n getValue: ({ roles }) => {\n return <RolesList hideStytchMemberWithOtherRoles roles={roles} />;\n },\n renderTitle: () => (\n <ColumnTitleWithFilter\n title=\"Role\"\n items={allRolesFilterItems}\n value={filterRoles}\n onChange={setFilterRoles}\n />\n ),\n },\n {\n id: 'status',\n title: 'Status',\n getValue: ({ status }) => {\n return getMemberStatusDisplayName(status);\n },\n renderTitle: () => (\n <ColumnTitleWithFilter\n title=\"Status\"\n items={allStatusesFilterItems}\n value={filterStatuses}\n onChange={setFilterStatuses}\n />\n ),\n width: 150,\n },\n ],\n [allRolesFilterItems, currentMemberId, filterRoles, filterStatuses, setFilterRoles, setFilterStatuses],\n );\n\n const [filterText, setFilterText, pendingFilterText] = useDebouncedState('');\n\n const [itemsPerPage, handleItemsPerPageChange] = useItemsPerPage({\n viewId: MEMBER_LIST_TABLE_VIEW_ID,\n });\n\n const { data, error, isLoading, setSize, size, mutate } = useMembers({\n limit: itemsPerPage,\n email: filterText || undefined,\n roles: filterRoles.size > 0 ? Array.from(filterRoles) : undefined,\n statuses: filterStatuses.size > 0 ? Array.from(filterStatuses) : undefined,\n });\n\n const resultsMetadata = data?.at(-1)?.results_metadata;\n\n // `size` is already effectively a page count, so we can act as if we only\n // have one item per page\n const { currentPage, setCurrentPage } = usePagination({\n itemsCount: size,\n itemsPerPage: 1,\n });\n\n const tableProps = {\n currentPage,\n setCurrentPage,\n onRowClick: (id) => navigate({ screen: 'memberDetails', params: { memberId: id } }),\n rowsPerPage: itemsPerPage,\n rowsPerPageOptions: itemsPerPageOptions,\n onRowsPerPageChange: handleItemsPerPageChange,\n items: useMemo(() => data?.flatMap((page) => page.members) ?? [], [data]),\n loadNext: useCallback(() => setSize((size) => size + 1), [setSize]),\n metadata: useMemo(\n () => ({\n cursor: resultsMetadata?.next_cursor ?? '__none',\n total: resultsMetadata?.total ?? 0,\n }),\n [resultsMetadata?.next_cursor, resultsMetadata?.total],\n ),\n } satisfies Partial<PaginatedTableProps<Member>>;\n\n const { openToast } = useToast();\n const sendInviteEmail = useSendInviteEmail({ onSuccess: mutate });\n const { handleInviteClick, inviteModalProps } = useInviteModal(sendInviteEmail);\n\n const handleEdit = useCallback(\n (member: Member) => {\n navigate({ screen: 'memberDetails', params: { memberId: member.member_id } });\n },\n [navigate],\n );\n\n const { openModal, modal } = useMemberActivation(mutate);\n\n const handleActivateDeactivateMember = useCallback(\n (member: Member) => {\n openModal(member);\n },\n [openModal],\n );\n\n const actions = useMemo(() => {\n const getDeleteAction = (member: Member) => {\n const isSelf = currentMemberId === member.member_id;\n switch (member.status) {\n case 'invited':\n if (canDeleteMemberPerm || (canDeleteSelfPerm && isSelf)) {\n return 'revoke-invite';\n }\n break;\n case 'active':\n if (canDeleteMemberPerm || (canDeleteSelfPerm && isSelf)) {\n return 'deactivate';\n }\n break;\n case 'deleted':\n if (canCreateMemberPerm && member.email_address_verified) {\n return 'reactivate';\n }\n break;\n }\n };\n\n const canEdit = (member: Member) => {\n return (currentMemberId === member.member_id ? canUpdateSelf : canUpdateMember) ?? false;\n };\n return [\n {\n key: 'view',\n label: 'View member',\n icon: <VisibilityOutlined />,\n onClick: handleEdit,\n isVisible: (member) => !canEdit(member),\n },\n {\n key: 'edit',\n label: 'Edit member',\n icon: <EditOutlined />,\n onClick: handleEdit,\n isVisible: (member) => canEdit(member),\n },\n {\n key: 'resend-invite-email',\n label: 'Resend invite email',\n icon: <EmailOutlined />,\n onClick: (member) =>\n sendInviteEmail(member.email_address).catch((error: unknown) => {\n const message = extractErrorMessage(error);\n if (message) {\n openToast({ text: message, type: 'error' });\n }\n }),\n isVisible: (member) => Boolean(canInviteMember) && REINVITE_MEMBER_STATUS.has(member.status),\n },\n {\n key: 'revoke-invite',\n label: 'Revoke invite',\n icon: <DeleteOutlined />,\n onClick: handleActivateDeactivateMember,\n isDangerous: true,\n isVisible: (member) => getDeleteAction(member) === 'revoke-invite',\n },\n {\n key: 'deactivate',\n label: 'Deactivate',\n icon: <DeleteOutlined />,\n onClick: handleActivateDeactivateMember,\n isDangerous: true,\n isVisible: (member) => getDeleteAction(member) === 'deactivate',\n },\n {\n key: 'reactivate',\n label: 'Reactivate',\n icon: <CheckCircle />,\n onClick: handleActivateDeactivateMember,\n isVisible: (member) => getDeleteAction(member) === 'reactivate',\n },\n ] satisfies Action<Member>[];\n }, [\n canCreateMemberPerm,\n canDeleteMemberPerm,\n canDeleteSelfPerm,\n canInviteMember,\n canUpdateMember,\n canUpdateSelf,\n currentMemberId,\n handleActivateDeactivateMember,\n handleEdit,\n openToast,\n sendInviteEmail,\n ]);\n\n const { getItemActionProps } = useActionMenu<Member>({\n actions,\n idPrefix: 'member',\n getId: getMemberId,\n });\n\n return (\n <FlexBox flexDirection=\"column\" gap={3}>\n {canActivateOrDeactivate && modal}\n <FlexBox alignItems=\"center\" justifyContent=\"space-between\">\n <Typography variant=\"h1\">Members</Typography>\n {canInviteMember && (\n <>\n <InviteModal {...inviteModalProps} />\n <Button compact variant=\"primary\" startIcon={<Add />} onClick={handleInviteClick}>\n Invite\n </Button>\n </>\n )}\n </FlexBox>\n <SearchBar placeholder=\"Search by email\" value={pendingFilterText} onChange={setFilterText} />\n {error ? (\n <Alert>{extractErrorMessage(error) ?? 'There was an error loading the Members list.'}</Alert>\n ) : (\n <PaginatedTable\n {...tableProps}\n itemRenderer={itemRenderer}\n isLoading={isLoading}\n getItemActionProps={getItemActionProps}\n rowKeyExtractor={getMemberId}\n titleVariant=\"h4\"\n />\n )}\n </FlexBox>\n );\n};\n"],"names":["MIN_EMAIL_FUZZY_SEARCH_LENGTH","MEMBER_LIST_TABLE_VIEW_ID","DEFAULT_STATUSES_FILTER","Set","REINVITE_MEMBER_STATUS","allStatusesFilterItems","allMemberStatuses","map","status","label","getMemberStatusDisplayName","value","useMembers","limit","email","emailRaw","roles","statuses","client","useStytchClient","orgInfo","useOrgInfo","length","undefined","useSWRInfinite","index","prevData","results_metadata","next_cursor","orgId","data","organization_id","method","slice","sort","cursor","fetchMembers","revalidateFirstPage","getMemberId","item","member_id","ColumnTitleWithFilter","items","onChange","title","container","setContainer","useState","React","div","ref","FlexBox","gap","alignItems","FilterMenu","anchorEl","emptySet","MemberListScreen","navigate","useMemberManagementRouterController","canCreateMemberPerm","useRbac","canUpdateMemberIsBreakglassPerm","canUpdateMemberRolesPerm","canUpdateMemberNamePerm","canUpdateMemberUntrustedMetadataPerm","canUpdateMemberMfaPhonePerm","canDeleteMemberMfaPhonePerm","canDeleteMemberMfaTotpPerm","canDeleteMemberPasswordPerm","canUpdateMemberMfaEnrolledPerm","canUpdateMemberDefaultMfaMethodPerm","canDeleteMemberPerm","canRevokeMemberSessionsPerm","canUpdateSelfNamePerm","canUpdateSelfUntrustedMetadataPerm","canUpdateSelfMfaPhonePerm","canDeleteSelfMfaPhonePerm","canDeleteSelfMfaTotpPerm","canDeleteSelfPasswordPerm","canUpdateSelfMfaEnrolledPerm","canUpdateSelfDefaultMfaMethodPerm","canDeleteSelfPerm","canRevokeSelfSessionsPerm","canUpdateMember","canUpdateSelf","canActivateOrDeactivate","orgAllowsEmailInvites","email_invites","self","useSelf","currentMemberId","canInviteMember","roleAutocompleteProps","useRoleAutocomplete","excludeStytchMember","allRolesSet","useMemo","selectItems","allRolesFilterItems","roleId","getOptionLabel","filterRoles","setFilterRoles","usePersistentFilter","viewId","fieldId","defaultValue","permittedValues","filterStatuses","setFilterStatuses","allMemberStatusesSet","itemRenderer","id","getValue","name","decorateCurrentMemberName","width","email_address","RolesList","hideStytchMemberWithOtherRoles","renderTitle","filterText","setFilterText","pendingFilterText","useDebouncedState","itemsPerPage","handleItemsPerPageChange","useItemsPerPage","error","isLoading","setSize","size","mutate","Array","from","resultsMetadata","at","currentPage","setCurrentPage","usePagination","itemsCount","tableProps","onRowClick","screen","params","memberId","rowsPerPage","rowsPerPageOptions","itemsPerPageOptions","onRowsPerPageChange","flatMap","page","members","loadNext","useCallback","metadata","total","openToast","useToast","sendInviteEmail","useSendInviteEmail","onSuccess","handleInviteClick","inviteModalProps","useInviteModal","handleEdit","member","openModal","modal","useMemberActivation","handleActivateDeactivateMember","actions","getDeleteAction","isSelf","email_address_verified","canEdit","key","icon","VisibilityOutlined","onClick","isVisible","EditOutlined","EmailOutlined","catch","message","extractErrorMessage","text","type","Boolean","has","DeleteOutlined","isDangerous","CheckCircle","getItemActionProps","useActionMenu","idPrefix","getId","flexDirection","justifyContent","Typography","variant","InviteModal","Button","compact","startIcon","Add","SearchBar","placeholder","Alert","PaginatedTable","rowKeyExtractor","titleVariant"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MemberListScreen.mjs","sources":["../../../../../../../../web/src/adminPortal/memberManagement/MemberListScreen.tsx"],"sourcesContent":["import Add from '@mui/icons-material/Add';\nimport CheckCircle from '@mui/icons-material/CheckCircle';\nimport DeleteOutlined from '@mui/icons-material/DeleteOutlined';\nimport EditOutlined from '@mui/icons-material/EditOutlined';\nimport VisibilityOutlined from '@mui/icons-material/VisibilityOutlined';\nimport EmailOutlined from '@mui/icons-material/EmailOutlined';\nimport { B2BOrganizationsMembersSearchResponse, Member } from '@stytch/core/public';\nimport React, { useCallback, useMemo, useState } from 'react';\nimport useSWRInfinite from 'swr/infinite';\nimport { extractErrorMessage } from '../../utils/extractErrorMessage';\nimport { Action, useActionMenu } from '../components/ActionMenu';\nimport { Alert } from '../components/Alert';\nimport { Button } from '../components/Button';\nimport { FilterMenu, FilterMenuProps } from '../components/FilterMenu';\nimport { FlexBox } from '../components/FlexBox';\nimport { PaginatedTable, PaginatedTableProps } from '../components/PaginatedTable';\nimport { RolesList } from '../components/RolesList';\nimport { SearchBar } from '../components/SearchBar';\nimport { Typography } from '../components/Typography';\nimport { TableItemRenderer } from '../shared/components/types';\nimport { decorateCurrentMemberName } from '../utils/decorateCurrentMemberName';\nimport { fetchMembers } from '../utils/fetchMembers';\nimport { useDebouncedState } from '../utils/useDebouncedState';\nimport { itemsPerPageOptions, useItemsPerPage } from '../utils/useItemsPerPage';\nimport { useOrgInfo } from '../utils/useOrgInfo';\nimport { usePagination } from '../utils/usePagination';\nimport { usePersistentFilter } from '../utils/usePersistentFilter';\nimport { useRbac } from '../utils/useRbac';\nimport { useRoleAutocomplete } from '../utils/useRoleAutocomplete';\nimport { useSelf } from '../utils/useSelf';\nimport { useStytchClient } from '../utils/useStytchClient';\nimport { InviteModal, useInviteModal } from './InviteModal';\nimport { useMemberManagementRouterController } from './MemberManagementRouter';\nimport { KnownMemberStatus, allMemberStatuses, allMemberStatusesSet } from './MemberStatus';\nimport { getMemberStatusDisplayName } from './getMemberStatusDisplayName';\nimport { useMemberActivation } from './useMemberActivation';\nimport { useSendInviteEmail } from './useSendInviteEmail';\nimport { useToast } from '../shared/components/Toast';\n\nconst MIN_EMAIL_FUZZY_SEARCH_LENGTH = 3;\n\nconst MEMBER_LIST_TABLE_VIEW_ID = 'adminPortalMemberList';\n\nconst DEFAULT_STATUSES_FILTER: ReadonlySet<KnownMemberStatus> = new Set(['active', 'invited', 'pending']);\n\nconst REINVITE_MEMBER_STATUS: ReadonlySet<string> = new Set<KnownMemberStatus>(['invited', 'pending']);\n\nconst allStatusesFilterItems = allMemberStatuses.map((status) => ({\n label: getMemberStatusDisplayName(status),\n value: status,\n}));\n\nexport const useMembers = ({\n limit,\n email: emailRaw,\n roles,\n statuses,\n}: {\n limit: number;\n email: string | undefined;\n roles: string[] | undefined;\n statuses: KnownMemberStatus[] | undefined;\n}) => {\n const client = useStytchClient();\n const orgInfo = useOrgInfo();\n\n const email = emailRaw && emailRaw.length >= MIN_EMAIL_FUZZY_SEARCH_LENGTH ? emailRaw : undefined;\n\n return useSWRInfinite(\n (index, prevData: B2BOrganizationsMembersSearchResponse | null) => {\n if (prevData && !prevData.results_metadata.next_cursor) {\n return null;\n }\n\n return {\n orgId: orgInfo.data?.organization_id,\n method: 'members.search',\n limit,\n email,\n // Stabilize the query key by sorting roles and statuses deterministically\n roles: roles?.slice().sort(),\n statuses: statuses?.slice().sort(),\n cursor: prevData?.results_metadata.next_cursor,\n };\n },\n fetchMembers(client),\n { revalidateFirstPage: false },\n );\n};\n\ninterface Column<T> extends TableItemRenderer<T> {\n id: string;\n}\n\nconst getMemberId = (item: Member) => item.member_id;\n\ninterface ColumnTitleWithFilterProps<T> extends Pick<FilterMenuProps<T>, 'items' | 'value' | 'onChange'> {\n title: string;\n}\n\nconst ColumnTitleWithFilter = <T extends string>({ items, onChange, value, title }: ColumnTitleWithFilterProps<T>) => {\n const [container, setContainer] = useState<HTMLElement | null>(null);\n\n return (\n <div ref={setContainer}>\n <FlexBox gap={1} alignItems=\"center\">\n {title}\n <FilterMenu anchorEl={container ?? undefined} items={items} value={value} onChange={onChange} />\n </FlexBox>\n </div>\n );\n};\n\nconst emptySet: ReadonlySet<string> = new Set();\n\nexport const MemberListScreen = () => {\n const { navigate } = useMemberManagementRouterController();\n\n const { data: canCreateMemberPerm } = useRbac('stytch.member', 'create');\n const { data: canUpdateMemberIsBreakglassPerm } = useRbac('stytch.member', 'update.settings.is-breakglass');\n const { data: canUpdateMemberRolesPerm } = useRbac('stytch.member', 'update.settings.roles');\n\n const { data: canUpdateMemberNamePerm } = useRbac('stytch.member', 'update.info.name');\n const { data: canUpdateMemberUntrustedMetadataPerm } = useRbac('stytch.member', 'update.info.untrusted-metadata');\n const { data: canUpdateMemberMfaPhonePerm } = useRbac('stytch.member', 'update.info.mfa-phone');\n const { data: canDeleteMemberMfaPhonePerm } = useRbac('stytch.member', 'update.info.delete.mfa-phone');\n const { data: canDeleteMemberMfaTotpPerm } = useRbac('stytch.member', 'update.info.delete.mfa-totp');\n const { data: canDeleteMemberPasswordPerm } = useRbac('stytch.member', 'update.info.delete.password');\n const { data: canUpdateMemberMfaEnrolledPerm } = useRbac('stytch.member', 'update.settings.mfa-enrolled');\n const { data: canUpdateMemberDefaultMfaMethodPerm } = useRbac('stytch.member', 'update.settings.default-mfa-method');\n const { data: canDeleteMemberPerm } = useRbac('stytch.member', 'delete');\n const { data: canRevokeMemberSessionsPerm } = useRbac('stytch.member', 'revoke-sessions');\n\n const { data: canUpdateSelfNamePerm } = useRbac('stytch.self', 'update.info.name');\n const { data: canUpdateSelfUntrustedMetadataPerm } = useRbac('stytch.self', 'update.info.untrusted-metadata');\n const { data: canUpdateSelfMfaPhonePerm } = useRbac('stytch.self', 'update.info.mfa-phone');\n const { data: canDeleteSelfMfaPhonePerm } = useRbac('stytch.self', 'update.info.delete.mfa-phone');\n const { data: canDeleteSelfMfaTotpPerm } = useRbac('stytch.self', 'update.info.delete.mfa-totp');\n const { data: canDeleteSelfPasswordPerm } = useRbac('stytch.self', 'update.info.delete.password');\n const { data: canUpdateSelfMfaEnrolledPerm } = useRbac('stytch.self', 'update.settings.mfa-enrolled');\n const { data: canUpdateSelfDefaultMfaMethodPerm } = useRbac('stytch.self', 'update.settings.default-mfa-method');\n const { data: canDeleteSelfPerm } = useRbac('stytch.self', 'delete');\n const { data: canRevokeSelfSessionsPerm } = useRbac('stytch.self', 'revoke-sessions');\n\n const { data: canGetOrgCustomRoles } = useRbac('stytch.custom-org-roles', 'get');\n\n const canUpdateMember =\n canDeleteMemberMfaPhonePerm ||\n canDeleteMemberMfaTotpPerm ||\n canDeleteMemberPasswordPerm ||\n canUpdateMemberMfaPhonePerm ||\n canUpdateMemberNamePerm ||\n canUpdateMemberUntrustedMetadataPerm ||\n canUpdateMemberIsBreakglassPerm ||\n canUpdateMemberMfaEnrolledPerm ||\n canUpdateMemberDefaultMfaMethodPerm ||\n canUpdateMemberRolesPerm ||\n canRevokeMemberSessionsPerm;\n\n const canUpdateSelf =\n canUpdateSelfNamePerm ||\n canUpdateSelfUntrustedMetadataPerm ||\n canUpdateSelfMfaPhonePerm ||\n canDeleteSelfMfaPhonePerm ||\n canDeleteSelfPasswordPerm ||\n canUpdateSelfMfaEnrolledPerm ||\n canUpdateSelfDefaultMfaMethodPerm ||\n canDeleteSelfPerm ||\n canDeleteSelfMfaTotpPerm ||\n canRevokeSelfSessionsPerm;\n\n const canActivateOrDeactivate = canCreateMemberPerm || canDeleteMemberPerm;\n\n const orgInfo = useOrgInfo();\n const orgAllowsEmailInvites = orgInfo.data && orgInfo.data.email_invites !== 'NOT_ALLOWED';\n\n const { self } = useSelf();\n const currentMemberId = self?.member_id;\n\n const canInviteMember = canCreateMemberPerm && orgAllowsEmailInvites;\n\n const roleAutocompleteProps = useRoleAutocomplete({\n excludeStytchMember: true,\n includeOrgRoles: canGetOrgCustomRoles,\n });\n const allRolesSet = useMemo(() => new Set(roleAutocompleteProps.selectItems), [roleAutocompleteProps.selectItems]);\n const allRolesFilterItems = useMemo(() => {\n return roleAutocompleteProps.selectItems.map((roleId) => ({\n label: roleAutocompleteProps.getOptionLabel(roleId),\n value: roleId,\n }));\n }, [roleAutocompleteProps]);\n\n const [filterRoles, setFilterRoles] = usePersistentFilter({\n viewId: MEMBER_LIST_TABLE_VIEW_ID,\n fieldId: 'role',\n defaultValue: emptySet,\n permittedValues: allRolesSet,\n });\n const [filterStatuses, setFilterStatuses] = usePersistentFilter({\n viewId: MEMBER_LIST_TABLE_VIEW_ID,\n fieldId: 'status',\n defaultValue: DEFAULT_STATUSES_FILTER,\n permittedValues: allMemberStatusesSet,\n });\n\n const itemRenderer: Column<Member>[] = useMemo(\n () => [\n {\n id: 'name',\n title: 'Name',\n getValue: ({ name, member_id }) => {\n return member_id === currentMemberId ? decorateCurrentMemberName(name) : name;\n },\n width: 200,\n },\n {\n id: 'email',\n title: 'Email',\n getValue: ({ email_address }) => {\n return email_address;\n },\n width: 200,\n },\n {\n id: 'role',\n title: 'Role',\n getValue: ({ roles }) => {\n return <RolesList hideStytchMemberWithOtherRoles roles={roles} />;\n },\n renderTitle: () => (\n <ColumnTitleWithFilter\n title=\"Role\"\n items={allRolesFilterItems}\n value={filterRoles}\n onChange={setFilterRoles}\n />\n ),\n },\n {\n id: 'status',\n title: 'Status',\n getValue: ({ status }) => {\n return getMemberStatusDisplayName(status);\n },\n renderTitle: () => (\n <ColumnTitleWithFilter\n title=\"Status\"\n items={allStatusesFilterItems}\n value={filterStatuses}\n onChange={setFilterStatuses}\n />\n ),\n width: 150,\n },\n ],\n [allRolesFilterItems, currentMemberId, filterRoles, filterStatuses, setFilterRoles, setFilterStatuses],\n );\n\n const [filterText, setFilterText, pendingFilterText] = useDebouncedState('');\n\n const [itemsPerPage, handleItemsPerPageChange] = useItemsPerPage({\n viewId: MEMBER_LIST_TABLE_VIEW_ID,\n });\n\n const { data, error, isLoading, setSize, size, mutate } = useMembers({\n limit: itemsPerPage,\n email: filterText || undefined,\n roles: filterRoles.size > 0 ? Array.from(filterRoles) : undefined,\n statuses: filterStatuses.size > 0 ? Array.from(filterStatuses) : undefined,\n });\n\n const resultsMetadata = data?.at(-1)?.results_metadata;\n\n // `size` is already effectively a page count, so we can act as if we only\n // have one item per page\n const { currentPage, setCurrentPage } = usePagination({\n itemsCount: size,\n itemsPerPage: 1,\n });\n\n const tableProps = {\n currentPage,\n setCurrentPage,\n onRowClick: (id) => navigate({ screen: 'memberDetails', params: { memberId: id } }),\n rowsPerPage: itemsPerPage,\n rowsPerPageOptions: itemsPerPageOptions,\n onRowsPerPageChange: handleItemsPerPageChange,\n items: useMemo(() => data?.flatMap((page) => page.members) ?? [], [data]),\n loadNext: useCallback(() => setSize((size) => size + 1), [setSize]),\n metadata: useMemo(\n () => ({\n cursor: resultsMetadata?.next_cursor ?? '__none',\n total: resultsMetadata?.total ?? 0,\n }),\n [resultsMetadata?.next_cursor, resultsMetadata?.total],\n ),\n } satisfies Partial<PaginatedTableProps<Member>>;\n\n const { openToast } = useToast();\n const sendInviteEmail = useSendInviteEmail({ onSuccess: mutate });\n const { handleInviteClick, inviteModalProps } = useInviteModal(sendInviteEmail);\n\n const handleEdit = useCallback(\n (member: Member) => {\n navigate({ screen: 'memberDetails', params: { memberId: member.member_id } });\n },\n [navigate],\n );\n\n const { openModal, modal } = useMemberActivation(mutate);\n\n const handleActivateDeactivateMember = useCallback(\n (member: Member) => {\n openModal(member);\n },\n [openModal],\n );\n\n const actions = useMemo(() => {\n const getDeleteAction = (member: Member) => {\n const isSelf = currentMemberId === member.member_id;\n switch (member.status) {\n case 'invited':\n if (canDeleteMemberPerm || (canDeleteSelfPerm && isSelf)) {\n return 'revoke-invite';\n }\n break;\n case 'active':\n if (canDeleteMemberPerm || (canDeleteSelfPerm && isSelf)) {\n return 'deactivate';\n }\n break;\n case 'deleted':\n if (canCreateMemberPerm && member.email_address_verified) {\n return 'reactivate';\n }\n break;\n }\n };\n\n const canEdit = (member: Member) => {\n return (currentMemberId === member.member_id ? canUpdateSelf : canUpdateMember) ?? false;\n };\n return [\n {\n key: 'view',\n label: 'View member',\n icon: <VisibilityOutlined />,\n onClick: handleEdit,\n isVisible: (member) => !canEdit(member),\n },\n {\n key: 'edit',\n label: 'Edit member',\n icon: <EditOutlined />,\n onClick: handleEdit,\n isVisible: (member) => canEdit(member),\n },\n {\n key: 'resend-invite-email',\n label: 'Resend invite email',\n icon: <EmailOutlined />,\n onClick: (member) =>\n sendInviteEmail(member.email_address).catch((error: unknown) => {\n const message = extractErrorMessage(error);\n if (message) {\n openToast({ text: message, type: 'error' });\n }\n }),\n isVisible: (member) => Boolean(canInviteMember) && REINVITE_MEMBER_STATUS.has(member.status),\n },\n {\n key: 'revoke-invite',\n label: 'Revoke invite',\n icon: <DeleteOutlined />,\n onClick: handleActivateDeactivateMember,\n isDangerous: true,\n isVisible: (member) => getDeleteAction(member) === 'revoke-invite',\n },\n {\n key: 'deactivate',\n label: 'Deactivate',\n icon: <DeleteOutlined />,\n onClick: handleActivateDeactivateMember,\n isDangerous: true,\n isVisible: (member) => getDeleteAction(member) === 'deactivate',\n },\n {\n key: 'reactivate',\n label: 'Reactivate',\n icon: <CheckCircle />,\n onClick: handleActivateDeactivateMember,\n isVisible: (member) => getDeleteAction(member) === 'reactivate',\n },\n ] satisfies Action<Member>[];\n }, [\n canCreateMemberPerm,\n canDeleteMemberPerm,\n canDeleteSelfPerm,\n canInviteMember,\n canUpdateMember,\n canUpdateSelf,\n currentMemberId,\n handleActivateDeactivateMember,\n handleEdit,\n openToast,\n sendInviteEmail,\n ]);\n\n const { getItemActionProps } = useActionMenu<Member>({\n actions,\n idPrefix: 'member',\n getId: getMemberId,\n });\n\n return (\n <FlexBox flexDirection=\"column\" gap={3}>\n {canActivateOrDeactivate && modal}\n <FlexBox alignItems=\"center\" justifyContent=\"space-between\">\n <Typography variant=\"h1\">Members</Typography>\n {canInviteMember && (\n <>\n <InviteModal {...inviteModalProps} />\n <Button compact variant=\"primary\" startIcon={<Add />} onClick={handleInviteClick}>\n Invite\n </Button>\n </>\n )}\n </FlexBox>\n <SearchBar placeholder=\"Search by email\" value={pendingFilterText} onChange={setFilterText} />\n {error ? (\n <Alert>{extractErrorMessage(error) ?? 'There was an error loading the Members list.'}</Alert>\n ) : (\n <PaginatedTable\n {...tableProps}\n itemRenderer={itemRenderer}\n isLoading={isLoading}\n getItemActionProps={getItemActionProps}\n rowKeyExtractor={getMemberId}\n titleVariant=\"h4\"\n />\n )}\n </FlexBox>\n );\n};\n"],"names":["MIN_EMAIL_FUZZY_SEARCH_LENGTH","MEMBER_LIST_TABLE_VIEW_ID","DEFAULT_STATUSES_FILTER","Set","REINVITE_MEMBER_STATUS","allStatusesFilterItems","allMemberStatuses","map","status","label","getMemberStatusDisplayName","value","useMembers","limit","email","emailRaw","roles","statuses","client","useStytchClient","orgInfo","useOrgInfo","length","undefined","useSWRInfinite","index","prevData","results_metadata","next_cursor","orgId","data","organization_id","method","slice","sort","cursor","fetchMembers","revalidateFirstPage","getMemberId","item","member_id","ColumnTitleWithFilter","items","onChange","title","container","setContainer","useState","React","div","ref","FlexBox","gap","alignItems","FilterMenu","anchorEl","emptySet","MemberListScreen","navigate","useMemberManagementRouterController","canCreateMemberPerm","useRbac","canUpdateMemberIsBreakglassPerm","canUpdateMemberRolesPerm","canUpdateMemberNamePerm","canUpdateMemberUntrustedMetadataPerm","canUpdateMemberMfaPhonePerm","canDeleteMemberMfaPhonePerm","canDeleteMemberMfaTotpPerm","canDeleteMemberPasswordPerm","canUpdateMemberMfaEnrolledPerm","canUpdateMemberDefaultMfaMethodPerm","canDeleteMemberPerm","canRevokeMemberSessionsPerm","canUpdateSelfNamePerm","canUpdateSelfUntrustedMetadataPerm","canUpdateSelfMfaPhonePerm","canDeleteSelfMfaPhonePerm","canDeleteSelfMfaTotpPerm","canDeleteSelfPasswordPerm","canUpdateSelfMfaEnrolledPerm","canUpdateSelfDefaultMfaMethodPerm","canDeleteSelfPerm","canRevokeSelfSessionsPerm","canGetOrgCustomRoles","canUpdateMember","canUpdateSelf","canActivateOrDeactivate","orgAllowsEmailInvites","email_invites","self","useSelf","currentMemberId","canInviteMember","roleAutocompleteProps","useRoleAutocomplete","excludeStytchMember","includeOrgRoles","allRolesSet","useMemo","selectItems","allRolesFilterItems","roleId","getOptionLabel","filterRoles","setFilterRoles","usePersistentFilter","viewId","fieldId","defaultValue","permittedValues","filterStatuses","setFilterStatuses","allMemberStatusesSet","itemRenderer","id","getValue","name","decorateCurrentMemberName","width","email_address","RolesList","hideStytchMemberWithOtherRoles","renderTitle","filterText","setFilterText","pendingFilterText","useDebouncedState","itemsPerPage","handleItemsPerPageChange","useItemsPerPage","error","isLoading","setSize","size","mutate","Array","from","resultsMetadata","at","currentPage","setCurrentPage","usePagination","itemsCount","tableProps","onRowClick","screen","params","memberId","rowsPerPage","rowsPerPageOptions","itemsPerPageOptions","onRowsPerPageChange","flatMap","page","members","loadNext","useCallback","metadata","total","openToast","useToast","sendInviteEmail","useSendInviteEmail","onSuccess","handleInviteClick","inviteModalProps","useInviteModal","handleEdit","member","openModal","modal","useMemberActivation","handleActivateDeactivateMember","actions","getDeleteAction","isSelf","email_address_verified","canEdit","key","icon","VisibilityOutlined","onClick","isVisible","EditOutlined","EmailOutlined","catch","message","extractErrorMessage","text","type","Boolean","has","DeleteOutlined","isDangerous","CheckCircle","getItemActionProps","useActionMenu","idPrefix","getId","flexDirection","justifyContent","Typography","variant","InviteModal","Button","compact","startIcon","Add","SearchBar","placeholder","Alert","PaginatedTable","rowKeyExtractor","titleVariant"],"mappings":"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"}
|
|
@@ -16,13 +16,15 @@ import { arraysHaveSameContents } from '../utils/arraysHaveSameContents.mjs';
|
|
|
16
16
|
import { useRoleAutocomplete } from '../utils/useRoleAutocomplete.mjs';
|
|
17
17
|
import { useRoleDisplayInfo } from '../utils/useRoleDisplayInfo.mjs';
|
|
18
18
|
import { isTruthy } from '../../utils/isTruthy.mjs';
|
|
19
|
+
import { useRbac } from '../utils/useRbac.mjs';
|
|
19
20
|
|
|
20
21
|
const RoleAssignmentsSection = ({ connection, useBlockNavigation })=>{
|
|
21
22
|
const { data: scimConnectionGroups, isLoading: isLoadingScimGroups } = useScimConnectionGroups({
|
|
22
23
|
shouldFetch: true
|
|
23
24
|
});
|
|
25
|
+
const { data: canGetOrgCustomRoles } = useRbac('stytch.custom-org-roles', 'get');
|
|
24
26
|
const { mutate: mutateScimConnection } = useMutateScimConnectionRoleAssignments();
|
|
25
|
-
const { getRoleIdDisplayName } = useRoleDisplayInfo();
|
|
27
|
+
const { getRoleIdDisplayName } = useRoleDisplayInfo(canGetOrgCustomRoles ?? false);
|
|
26
28
|
const scimGroups = useMemo(()=>scimConnectionGroups?.scim_groups ?? [], [
|
|
27
29
|
scimConnectionGroups
|
|
28
30
|
]);
|
|
@@ -82,7 +84,9 @@ const RoleAssignmentsSection = ({ connection, useBlockNavigation })=>{
|
|
|
82
84
|
}
|
|
83
85
|
}
|
|
84
86
|
];
|
|
85
|
-
const roleAutocompleteProps = useRoleAutocomplete(
|
|
87
|
+
const roleAutocompleteProps = useRoleAutocomplete({
|
|
88
|
+
includeOrgRoles: canGetOrgCustomRoles ?? false
|
|
89
|
+
});
|
|
86
90
|
const groupIdsWithRoleAssignments = new Set(groupRoles.map(({ groupId })=>groupId));
|
|
87
91
|
const findAvailableGroupIds = (currentId)=>Object.keys(groupIdToName).filter((groupId)=>!groupIdsWithRoleAssignments.has(groupId) || groupId === currentId);
|
|
88
92
|
// Find the groupIds that do not have any roles assigned to them.
|
package/dist/esm/packages/web/src/adminPortal/scim/SCIMConnectionRoleAssignmentsSection.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SCIMConnectionRoleAssignmentsSection.mjs","sources":["../../../../../../../../web/src/adminPortal/scim/SCIMConnectionRoleAssignmentsSection.tsx"],"sourcesContent":["import React, { useMemo } from 'react';\nimport { FlexBox } from '../components/FlexBox';\nimport { SettingsContainer } from '../components/SettingsContainer';\nimport { SCIMConnection } from '@stytch/core/public';\nimport { Typography } from '../components/Typography';\nimport { Button } from '../components/Button';\nimport Add from '@mui/icons-material/Add';\nimport { Table } from '../components/Table';\nimport { useScimConnectionGroups } from '../utils/useScimConnectionGroups';\nimport { TagList } from '../components/TagList';\nimport { useFormState } from '../utils/useFormState';\nimport { Autocomplete } from '../components/Autocomplete';\nimport { PageLoadingIndicator } from '../components/PageLoadingIndicator';\nimport { Select } from '../components/Select';\nimport { useMutateScimConnectionRoleAssignments } from '../utils/useMutateScimConnection';\nimport { arraysHaveSameContents } from '../utils/arraysHaveSameContents';\nimport { UseBlockNavigation } from '../Router';\nimport { useRoleAutocomplete } from '../utils/useRoleAutocomplete';\nimport { useRoleDisplayInfo } from '../utils/useRoleDisplayInfo';\nimport { isTruthy } from '../../utils/isTruthy';\n\ntype ScimGroupRoleAssignment = { groupId: string | undefined; roles: string[] };\n\nexport const RoleAssignmentsSection = ({\n connection,\n useBlockNavigation,\n}: {\n connection: SCIMConnection;\n useBlockNavigation: UseBlockNavigation;\n}) => {\n const { data: scimConnectionGroups, isLoading: isLoadingScimGroups } = useScimConnectionGroups({\n shouldFetch: true,\n });\n const { mutate: mutateScimConnection } = useMutateScimConnectionRoleAssignments();\n const { getRoleIdDisplayName } = useRoleDisplayInfo();\n\n const scimGroups = useMemo(() => scimConnectionGroups?.scim_groups ?? [], [scimConnectionGroups]);\n const scimRoleAssignments = connection?.scim_group_implicit_role_assignments;\n\n const { groupIdToName, filteredGroupIdToRoles } = useMemo(() => {\n const groupIdToNameMap = scimGroups.reduce(\n (acc, val) => {\n acc[val.group_id] = val.group_name;\n return acc;\n },\n {} as Record<string, string>,\n );\n\n const groupIdToRolesMap = Object.keys(groupIdToNameMap).reduce(\n (acc, groupId) => {\n const scimRoleAssignment = scimRoleAssignments.find((roleAssignment) => roleAssignment.group_id === groupId);\n if (!scimRoleAssignment) return acc;\n\n if (!acc[groupId]) {\n acc[groupId] = [];\n }\n acc[groupId].push(scimRoleAssignment.role_id);\n return acc;\n },\n {} as Record<string, string[]>,\n );\n\n return {\n groupIdToName: groupIdToNameMap,\n // Filter out groups with no roles assigned\n filteredGroupIdToRoles: Object.fromEntries(\n Object.entries(groupIdToRolesMap).filter(([, roles]) => roles.length > 0),\n ),\n };\n }, [scimGroups, scimRoleAssignments]);\n\n const remoteState: { groupRoles: ScimGroupRoleAssignment[] } = useMemo(\n () => ({\n groupRoles: Object.entries(filteredGroupIdToRoles).map(([groupId, roles]) => ({\n groupId,\n roles,\n })),\n }),\n [filteredGroupIdToRoles],\n );\n const { localState, setLocalState, editing, handleSetEditing } = useFormState({ remoteState });\n const { groupRoles } = editing ? localState : remoteState;\n\n const itemRenderer = [\n {\n title: 'Group',\n getValue: ({ groupId }: ScimGroupRoleAssignment) => {\n return (\n <Typography variant=\"body2\" color=\"secondary\">\n {groupId ? groupIdToName[groupId] : ''}\n </Typography>\n );\n },\n width: 300,\n },\n {\n title: 'Role',\n getValue: ({ roles }: ScimGroupRoleAssignment) => {\n return <TagList tags={roles.map((role) => getRoleIdDisplayName(role))} />;\n },\n },\n ];\n\n const roleAutocompleteProps = useRoleAutocomplete();\n\n const groupIdsWithRoleAssignments = new Set(groupRoles.map(({ groupId }) => groupId));\n const findAvailableGroupIds = (currentId: string | undefined) =>\n Object.keys(groupIdToName).filter((groupId) => !groupIdsWithRoleAssignments.has(groupId) || groupId === currentId);\n // Find the groupIds that do not have any roles assigned to them.\n const availableGroupIds = findAvailableGroupIds(undefined);\n\n const handleOnChange = ({\n groupId: currentGroupId,\n updatedGroupId,\n updatedRoles,\n }: {\n groupId: string | undefined;\n updatedGroupId: string | undefined;\n updatedRoles: string[] | undefined;\n }) => {\n setLocalState((prevState) => ({\n groupRoles: prevState.groupRoles.map((value) => {\n if (value.groupId !== currentGroupId) {\n return value;\n }\n return {\n groupId: updatedGroupId ?? value.groupId,\n roles: updatedRoles ?? value.roles,\n };\n }),\n }));\n };\n\n const disableSave = arraysHaveSameContents(localState.groupRoles, remoteState.groupRoles);\n const disableAdd =\n (localState.groupRoles.length > 0\n ? localState.groupRoles[localState.groupRoles.length - 1].groupId === undefined\n : false) || !availableGroupIds.length;\n\n const handleSave = async () => {\n await mutateScimConnection({\n connection_id: connection.connection_id,\n scim_group_implicit_role_assignments: localState.groupRoles.flatMap(({ groupId, roles }) => {\n return roles\n .map((role) => {\n if (groupId) {\n return {\n group_id: groupId,\n role_id: role,\n };\n }\n })\n .filter(isTruthy);\n }),\n });\n };\n\n if (isLoadingScimGroups) {\n return <PageLoadingIndicator />;\n }\n\n return (\n <SettingsContainer\n title=\"Role Assignments\"\n hasCTA={Object.keys(groupIdToName).length > 0}\n onSave={handleSave}\n useBlockNavigation={useBlockNavigation}\n editing={editing}\n disableSave={disableSave}\n setEditing={handleSetEditing}\n >\n <Typography variant=\"h4\">Group Roles</Typography>\n {editing ? (\n <FlexBox flexDirection=\"column\" gap={2}>\n {localState.groupRoles.length > 0 ? (\n <div>\n {groupRoles.map(({ groupId, roles }, index) => {\n const groupNameSelectItems = findAvailableGroupIds(groupId).map((groupId) => {\n return {\n value: groupId,\n label: groupIdToName[groupId],\n };\n });\n return (\n <FlexBox flexDirection=\"row\" gap={2} key={index} alignItems=\"center\">\n <Select\n labelColor=\"secondary\"\n width={300}\n label=\"Group name\"\n selectItems={groupNameSelectItems}\n placeholder=\"Select Group Name\"\n value={groupId}\n onChange={(value) => handleOnChange({ groupId, updatedGroupId: value, updatedRoles: undefined })}\n />\n <Autocomplete\n {...roleAutocompleteProps}\n label=\"Group Role\"\n fullWidth\n value={roles}\n onChange={(value) => handleOnChange({ groupId, updatedGroupId: undefined, updatedRoles: value })}\n />\n </FlexBox>\n );\n })}\n </div>\n ) : (\n <Typography variant=\"body2\">No roles assigned.</Typography>\n )}\n <Button\n disabled={disableAdd}\n startIcon={<Add />}\n variant=\"text\"\n onClick={() => {\n setLocalState(() => ({\n groupRoles: [...groupRoles, { groupId: undefined, roles: [] }],\n }));\n }}\n >\n Add group roles\n </Button>\n </FlexBox>\n ) : groupRoles.length > 0 ? (\n <Table\n titleVariant=\"caption\"\n itemRenderer={itemRenderer}\n items={groupRoles}\n rowKeyExtractor={({ groupId }) => groupId ?? ''}\n disableBottomBorder\n />\n ) : (\n <Typography variant=\"body2\">No roles assigned.</Typography>\n )}\n </SettingsContainer>\n );\n};\n"],"names":["RoleAssignmentsSection","connection","useBlockNavigation","data","scimConnectionGroups","isLoading","isLoadingScimGroups","useScimConnectionGroups","shouldFetch","mutate","mutateScimConnection","useMutateScimConnectionRoleAssignments","getRoleIdDisplayName","useRoleDisplayInfo","scimGroups","useMemo","scim_groups","scimRoleAssignments","scim_group_implicit_role_assignments","groupIdToName","filteredGroupIdToRoles","groupIdToNameMap","reduce","acc","val","group_id","group_name","groupIdToRolesMap","Object","keys","groupId","scimRoleAssignment","find","roleAssignment","push","role_id","fromEntries","entries","filter","roles","length","remoteState","groupRoles","map","localState","setLocalState","editing","handleSetEditing","useFormState","itemRenderer","title","getValue","React","Typography","variant","color","width","TagList","tags","role","roleAutocompleteProps","useRoleAutocomplete","groupIdsWithRoleAssignments","Set","findAvailableGroupIds","currentId","has","availableGroupIds","undefined","handleOnChange","currentGroupId","updatedGroupId","updatedRoles","prevState","value","disableSave","arraysHaveSameContents","disableAdd","handleSave","connection_id","flatMap","isTruthy","PageLoadingIndicator","SettingsContainer","hasCTA","onSave","setEditing","FlexBox","flexDirection","gap","div","index","groupNameSelectItems","label","key","alignItems","Select","labelColor","selectItems","placeholder","onChange","Autocomplete","fullWidth","Button","disabled","startIcon","Add","onClick","Table","titleVariant","items","rowKeyExtractor","disableBottomBorder"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SCIMConnectionRoleAssignmentsSection.mjs","sources":["../../../../../../../../web/src/adminPortal/scim/SCIMConnectionRoleAssignmentsSection.tsx"],"sourcesContent":["import React, { useMemo } from 'react';\nimport { FlexBox } from '../components/FlexBox';\nimport { SettingsContainer } from '../components/SettingsContainer';\nimport { SCIMConnection } from '@stytch/core/public';\nimport { Typography } from '../components/Typography';\nimport { Button } from '../components/Button';\nimport Add from '@mui/icons-material/Add';\nimport { Table } from '../components/Table';\nimport { useScimConnectionGroups } from '../utils/useScimConnectionGroups';\nimport { TagList } from '../components/TagList';\nimport { useFormState } from '../utils/useFormState';\nimport { Autocomplete } from '../components/Autocomplete';\nimport { PageLoadingIndicator } from '../components/PageLoadingIndicator';\nimport { Select } from '../components/Select';\nimport { useMutateScimConnectionRoleAssignments } from '../utils/useMutateScimConnection';\nimport { arraysHaveSameContents } from '../utils/arraysHaveSameContents';\nimport { UseBlockNavigation } from '../Router';\nimport { useRoleAutocomplete } from '../utils/useRoleAutocomplete';\nimport { useRoleDisplayInfo } from '../utils/useRoleDisplayInfo';\nimport { isTruthy } from '../../utils/isTruthy';\nimport { useRbac } from '../utils/useRbac';\n\ntype ScimGroupRoleAssignment = { groupId: string | undefined; roles: string[] };\n\nexport const RoleAssignmentsSection = ({\n connection,\n useBlockNavigation,\n}: {\n connection: SCIMConnection;\n useBlockNavigation: UseBlockNavigation;\n}) => {\n const { data: scimConnectionGroups, isLoading: isLoadingScimGroups } = useScimConnectionGroups({\n shouldFetch: true,\n });\n\n const { data: canGetOrgCustomRoles } = useRbac('stytch.custom-org-roles', 'get');\n\n const { mutate: mutateScimConnection } = useMutateScimConnectionRoleAssignments();\n const { getRoleIdDisplayName } = useRoleDisplayInfo(canGetOrgCustomRoles ?? false);\n\n const scimGroups = useMemo(() => scimConnectionGroups?.scim_groups ?? [], [scimConnectionGroups]);\n const scimRoleAssignments = connection?.scim_group_implicit_role_assignments;\n\n const { groupIdToName, filteredGroupIdToRoles } = useMemo(() => {\n const groupIdToNameMap = scimGroups.reduce(\n (acc, val) => {\n acc[val.group_id] = val.group_name;\n return acc;\n },\n {} as Record<string, string>,\n );\n\n const groupIdToRolesMap = Object.keys(groupIdToNameMap).reduce(\n (acc, groupId) => {\n const scimRoleAssignment = scimRoleAssignments.find((roleAssignment) => roleAssignment.group_id === groupId);\n if (!scimRoleAssignment) return acc;\n\n if (!acc[groupId]) {\n acc[groupId] = [];\n }\n acc[groupId].push(scimRoleAssignment.role_id);\n return acc;\n },\n {} as Record<string, string[]>,\n );\n\n return {\n groupIdToName: groupIdToNameMap,\n // Filter out groups with no roles assigned\n filteredGroupIdToRoles: Object.fromEntries(\n Object.entries(groupIdToRolesMap).filter(([, roles]) => roles.length > 0),\n ),\n };\n }, [scimGroups, scimRoleAssignments]);\n\n const remoteState: { groupRoles: ScimGroupRoleAssignment[] } = useMemo(\n () => ({\n groupRoles: Object.entries(filteredGroupIdToRoles).map(([groupId, roles]) => ({\n groupId,\n roles,\n })),\n }),\n [filteredGroupIdToRoles],\n );\n const { localState, setLocalState, editing, handleSetEditing } = useFormState({ remoteState });\n const { groupRoles } = editing ? localState : remoteState;\n\n const itemRenderer = [\n {\n title: 'Group',\n getValue: ({ groupId }: ScimGroupRoleAssignment) => {\n return (\n <Typography variant=\"body2\" color=\"secondary\">\n {groupId ? groupIdToName[groupId] : ''}\n </Typography>\n );\n },\n width: 300,\n },\n {\n title: 'Role',\n getValue: ({ roles }: ScimGroupRoleAssignment) => {\n return <TagList tags={roles.map((role) => getRoleIdDisplayName(role))} />;\n },\n },\n ];\n\n const roleAutocompleteProps = useRoleAutocomplete({ includeOrgRoles: canGetOrgCustomRoles ?? false });\n\n const groupIdsWithRoleAssignments = new Set(groupRoles.map(({ groupId }) => groupId));\n const findAvailableGroupIds = (currentId: string | undefined) =>\n Object.keys(groupIdToName).filter((groupId) => !groupIdsWithRoleAssignments.has(groupId) || groupId === currentId);\n // Find the groupIds that do not have any roles assigned to them.\n const availableGroupIds = findAvailableGroupIds(undefined);\n\n const handleOnChange = ({\n groupId: currentGroupId,\n updatedGroupId,\n updatedRoles,\n }: {\n groupId: string | undefined;\n updatedGroupId: string | undefined;\n updatedRoles: string[] | undefined;\n }) => {\n setLocalState((prevState) => ({\n groupRoles: prevState.groupRoles.map((value) => {\n if (value.groupId !== currentGroupId) {\n return value;\n }\n return {\n groupId: updatedGroupId ?? value.groupId,\n roles: updatedRoles ?? value.roles,\n };\n }),\n }));\n };\n\n const disableSave = arraysHaveSameContents(localState.groupRoles, remoteState.groupRoles);\n const disableAdd =\n (localState.groupRoles.length > 0\n ? localState.groupRoles[localState.groupRoles.length - 1].groupId === undefined\n : false) || !availableGroupIds.length;\n\n const handleSave = async () => {\n await mutateScimConnection({\n connection_id: connection.connection_id,\n scim_group_implicit_role_assignments: localState.groupRoles.flatMap(({ groupId, roles }) => {\n return roles\n .map((role) => {\n if (groupId) {\n return {\n group_id: groupId,\n role_id: role,\n };\n }\n })\n .filter(isTruthy);\n }),\n });\n };\n\n if (isLoadingScimGroups) {\n return <PageLoadingIndicator />;\n }\n\n return (\n <SettingsContainer\n title=\"Role Assignments\"\n hasCTA={Object.keys(groupIdToName).length > 0}\n onSave={handleSave}\n useBlockNavigation={useBlockNavigation}\n editing={editing}\n disableSave={disableSave}\n setEditing={handleSetEditing}\n >\n <Typography variant=\"h4\">Group Roles</Typography>\n {editing ? (\n <FlexBox flexDirection=\"column\" gap={2}>\n {localState.groupRoles.length > 0 ? (\n <div>\n {groupRoles.map(({ groupId, roles }, index) => {\n const groupNameSelectItems = findAvailableGroupIds(groupId).map((groupId) => {\n return {\n value: groupId,\n label: groupIdToName[groupId],\n };\n });\n return (\n <FlexBox flexDirection=\"row\" gap={2} key={index} alignItems=\"center\">\n <Select\n labelColor=\"secondary\"\n width={300}\n label=\"Group name\"\n selectItems={groupNameSelectItems}\n placeholder=\"Select Group Name\"\n value={groupId}\n onChange={(value) => handleOnChange({ groupId, updatedGroupId: value, updatedRoles: undefined })}\n />\n <Autocomplete\n {...roleAutocompleteProps}\n label=\"Group Role\"\n fullWidth\n value={roles}\n onChange={(value) => handleOnChange({ groupId, updatedGroupId: undefined, updatedRoles: value })}\n />\n </FlexBox>\n );\n })}\n </div>\n ) : (\n <Typography variant=\"body2\">No roles assigned.</Typography>\n )}\n <Button\n disabled={disableAdd}\n startIcon={<Add />}\n variant=\"text\"\n onClick={() => {\n setLocalState(() => ({\n groupRoles: [...groupRoles, { groupId: undefined, roles: [] }],\n }));\n }}\n >\n Add group roles\n </Button>\n </FlexBox>\n ) : groupRoles.length > 0 ? (\n <Table\n titleVariant=\"caption\"\n itemRenderer={itemRenderer}\n items={groupRoles}\n rowKeyExtractor={({ groupId }) => groupId ?? ''}\n disableBottomBorder\n />\n ) : (\n <Typography variant=\"body2\">No roles assigned.</Typography>\n )}\n </SettingsContainer>\n );\n};\n"],"names":["RoleAssignmentsSection","connection","useBlockNavigation","data","scimConnectionGroups","isLoading","isLoadingScimGroups","useScimConnectionGroups","shouldFetch","canGetOrgCustomRoles","useRbac","mutate","mutateScimConnection","useMutateScimConnectionRoleAssignments","getRoleIdDisplayName","useRoleDisplayInfo","scimGroups","useMemo","scim_groups","scimRoleAssignments","scim_group_implicit_role_assignments","groupIdToName","filteredGroupIdToRoles","groupIdToNameMap","reduce","acc","val","group_id","group_name","groupIdToRolesMap","Object","keys","groupId","scimRoleAssignment","find","roleAssignment","push","role_id","fromEntries","entries","filter","roles","length","remoteState","groupRoles","map","localState","setLocalState","editing","handleSetEditing","useFormState","itemRenderer","title","getValue","React","Typography","variant","color","width","TagList","tags","role","roleAutocompleteProps","useRoleAutocomplete","includeOrgRoles","groupIdsWithRoleAssignments","Set","findAvailableGroupIds","currentId","has","availableGroupIds","undefined","handleOnChange","currentGroupId","updatedGroupId","updatedRoles","prevState","value","disableSave","arraysHaveSameContents","disableAdd","handleSave","connection_id","flatMap","isTruthy","PageLoadingIndicator","SettingsContainer","hasCTA","onSave","setEditing","FlexBox","flexDirection","gap","div","index","groupNameSelectItems","label","key","alignItems","Select","labelColor","selectItems","placeholder","onChange","Autocomplete","fullWidth","Button","disabled","startIcon","Add","onClick","Table","titleVariant","items","rowKeyExtractor","disableBottomBorder"],"mappings":"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"}
|
package/dist/esm/packages/web/src/adminPortal/settings/OrgSettingsRoleAssignmentsSection.mjs
CHANGED
|
@@ -121,7 +121,7 @@ const RoleTable = ({ localState, remoteState, editing, setLocalState, role, isSs
|
|
|
121
121
|
const filterRoleAssignmentsBy = (arr, { source })=>{
|
|
122
122
|
return arr.slice().filter((val)=>val.source === source);
|
|
123
123
|
};
|
|
124
|
-
const OrgSettingsRoleAssignmentsBody = ({ editing, ssoConnections, roles, localState, remoteState, setLocalState, isSsoEnabled, isScimEnabled, allScimGroupIdToGroupName, scimConnection })=>{
|
|
124
|
+
const OrgSettingsRoleAssignmentsBody = ({ editing, ssoConnections, roles, localState, remoteState, setLocalState, isSsoEnabled, isScimEnabled, canViewCustomOrgRoles, allScimGroupIdToGroupName, scimConnection })=>{
|
|
125
125
|
const idMap = (editing ? localState : remoteState).idMap;
|
|
126
126
|
const rolesWithAssignments = roles.filter((role)=>idMap[role.role_id].length > 0);
|
|
127
127
|
const rolesById = useRolesById();
|
|
@@ -231,7 +231,9 @@ const OrgSettingsRoleAssignmentsBody = ({ editing, ssoConnections, roles, localS
|
|
|
231
231
|
});
|
|
232
232
|
const showInputContent = !!selectedRole && !!selectedSource;
|
|
233
233
|
const disableConfirm = !showInputContent || selectedSource === 'Email' && emailDomain.length === 0 || selectedSource === 'SSO' && ssoRoleAssignments.every((connection)=>!connection.id);
|
|
234
|
-
const roleAutocompleteProps = useRoleAutocomplete(
|
|
234
|
+
const roleAutocompleteProps = useRoleAutocomplete({
|
|
235
|
+
includeOrgRoles: canViewCustomOrgRoles
|
|
236
|
+
});
|
|
235
237
|
const roleSelectItems = roleAutocompleteProps.selectItems.map((roleId)=>({
|
|
236
238
|
label: roleAutocompleteProps.getOptionLabel(roleId),
|
|
237
239
|
value: roleId,
|
|
@@ -440,6 +442,7 @@ const OrgSettingsRoleAssignmentsSection = ({ orgInfo })=>{
|
|
|
440
442
|
const { data: canSetRoles } = useRbac('stytch.organization', 'update.settings.implicit-roles');
|
|
441
443
|
const { data: canGetSsoPerm } = useRbac('stytch.sso', 'get');
|
|
442
444
|
const { data: canGetScimPerm } = useRbac('stytch.scim', 'get');
|
|
445
|
+
const { data: canGetOrgCustomRoles } = useRbac('stytch.custom-org-roles', 'get');
|
|
443
446
|
const isSsoEnabled = adminPortalConfig?.sso_config.sso_enabled ?? false;
|
|
444
447
|
const isScimEnabled = adminPortalConfig?.scim_config.scim_enabled ?? false;
|
|
445
448
|
const canGetSso = (isSsoEnabled && canGetSsoPerm) ?? false;
|
|
@@ -453,7 +456,7 @@ const OrgSettingsRoleAssignmentsSection = ({ orgInfo })=>{
|
|
|
453
456
|
const { data: scimConnectionGroups, isLoading: isLoadingScimGroups } = useScimConnectionGroups({
|
|
454
457
|
shouldFetch: canGetScim && !!canSetRoles
|
|
455
458
|
});
|
|
456
|
-
const roles = useRoles();
|
|
459
|
+
const roles = useRoles(canGetOrgCustomRoles);
|
|
457
460
|
const sortRoles = useRoleSortFn();
|
|
458
461
|
const sortedRoles = useMemo(()=>sortRoles(roles ?? []), [
|
|
459
462
|
roles,
|
|
@@ -709,6 +712,7 @@ const OrgSettingsRoleAssignmentsSection = ({ orgInfo })=>{
|
|
|
709
712
|
roles: sortedRoles,
|
|
710
713
|
isSsoEnabled: isSsoEnabled,
|
|
711
714
|
isScimEnabled: isScimEnabled,
|
|
715
|
+
canViewCustomOrgRoles: canGetOrgCustomRoles ?? false,
|
|
712
716
|
allScimGroupIdToGroupName: allScimGroupIdToGroupName,
|
|
713
717
|
scimConnection: scimConnection
|
|
714
718
|
}));
|