@orthacms/users-admin 0.0.0-reserve.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/LICENSE +21 -0
- package/README.md +7 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/lib/api/useAddWorkspaceMember/index.d.ts +16 -0
- package/dist/lib/api/useAddWorkspaceMember/index.d.ts.map +1 -0
- package/dist/lib/api/useInviteMember/index.d.ts +17 -0
- package/dist/lib/api/useInviteMember/index.d.ts.map +1 -0
- package/dist/lib/api/useMembers/index.d.ts +15 -0
- package/dist/lib/api/useMembers/index.d.ts.map +1 -0
- package/dist/lib/api/useMembersMutation/index.d.ts +13 -0
- package/dist/lib/api/useMembersMutation/index.d.ts.map +1 -0
- package/dist/lib/api/useRemoveWorkspaceMember/index.d.ts +15 -0
- package/dist/lib/api/useRemoveWorkspaceMember/index.d.ts.map +1 -0
- package/dist/lib/api/useResendInvite/index.d.ts +8 -0
- package/dist/lib/api/useResendInvite/index.d.ts.map +1 -0
- package/dist/lib/api/useRevokeInvite/index.d.ts +7 -0
- package/dist/lib/api/useRevokeInvite/index.d.ts.map +1 -0
- package/dist/lib/api/useRevokeSession/index.d.ts +15 -0
- package/dist/lib/api/useRevokeSession/index.d.ts.map +1 -0
- package/dist/lib/api/useSetMemberStatus/index.d.ts +15 -0
- package/dist/lib/api/useSetMemberStatus/index.d.ts.map +1 -0
- package/dist/lib/api/useUpdateMember/index.d.ts +15 -0
- package/dist/lib/api/useUpdateMember/index.d.ts.map +1 -0
- package/dist/lib/api/useUserDetail/index.d.ts +9 -0
- package/dist/lib/api/useUserDetail/index.d.ts.map +1 -0
- package/dist/lib/api/useUserSessions/index.d.ts +25 -0
- package/dist/lib/api/useUserSessions/index.d.ts.map +1 -0
- package/dist/lib/api/useWorkspaceOptions/index.d.ts +18 -0
- package/dist/lib/api/useWorkspaceOptions/index.d.ts.map +1 -0
- package/dist/lib/application/useAddWorkspaceMember/index.d.ts +11 -0
- package/dist/lib/application/useAddWorkspaceMember/index.d.ts.map +1 -0
- package/dist/lib/application/useAddWorkspaceMember/index.js +21 -0
- package/dist/lib/application/useInviteMember/index.d.ts +12 -0
- package/dist/lib/application/useInviteMember/index.d.ts.map +1 -0
- package/dist/lib/application/useInviteMember/index.js +12 -0
- package/dist/lib/application/useInviteMemberFlow/index.d.ts +59 -0
- package/dist/lib/application/useInviteMemberFlow/index.d.ts.map +1 -0
- package/dist/lib/application/useInviteMemberFlow/index.js +47 -0
- package/dist/lib/application/useIssuePasswordReset/index.d.ts +12 -0
- package/dist/lib/application/useIssuePasswordReset/index.d.ts.map +1 -0
- package/dist/lib/application/useIssuePasswordReset/index.js +14 -0
- package/dist/lib/application/useMembers/index.d.ts +15 -0
- package/dist/lib/application/useMembers/index.d.ts.map +1 -0
- package/dist/lib/application/useMembers/index.js +23 -0
- package/dist/lib/application/useMembersMutation/index.d.ts +14 -0
- package/dist/lib/application/useMembersMutation/index.d.ts.map +1 -0
- package/dist/lib/application/useMembersMutation/index.js +25 -0
- package/dist/lib/application/usePreferences/index.d.ts +15 -0
- package/dist/lib/application/usePreferences/index.d.ts.map +1 -0
- package/dist/lib/application/usePreferences/index.js +28 -0
- package/dist/lib/application/useRemoveWorkspaceMember/index.d.ts +10 -0
- package/dist/lib/application/useRemoveWorkspaceMember/index.d.ts.map +1 -0
- package/dist/lib/application/useRemoveWorkspaceMember/index.js +20 -0
- package/dist/lib/application/useResendInvite/index.d.ts +10 -0
- package/dist/lib/application/useResendInvite/index.d.ts.map +1 -0
- package/dist/lib/application/useResendInvite/index.js +12 -0
- package/dist/lib/application/useRevokeInvite/index.d.ts +7 -0
- package/dist/lib/application/useRevokeInvite/index.d.ts.map +1 -0
- package/dist/lib/application/useRevokeInvite/index.js +10 -0
- package/dist/lib/application/useRevokeSession/index.d.ts +10 -0
- package/dist/lib/application/useRevokeSession/index.d.ts.map +1 -0
- package/dist/lib/application/useRevokeSession/index.js +19 -0
- package/dist/lib/application/useSetMemberStatus/index.d.ts +11 -0
- package/dist/lib/application/useSetMemberStatus/index.d.ts.map +1 -0
- package/dist/lib/application/useSetMemberStatus/index.js +11 -0
- package/dist/lib/application/useUpdateMember/index.d.ts +11 -0
- package/dist/lib/application/useUpdateMember/index.d.ts.map +1 -0
- package/dist/lib/application/useUpdateMember/index.js +11 -0
- package/dist/lib/application/useUpdateTheme/index.d.ts +14 -0
- package/dist/lib/application/useUpdateTheme/index.d.ts.map +1 -0
- package/dist/lib/application/useUpdateTheme/index.js +25 -0
- package/dist/lib/application/useUserDetail/index.d.ts +9 -0
- package/dist/lib/application/useUserDetail/index.d.ts.map +1 -0
- package/dist/lib/application/useUserDetail/index.js +17 -0
- package/dist/lib/application/useUserSessions/index.d.ts +9 -0
- package/dist/lib/application/useUserSessions/index.d.ts.map +1 -0
- package/dist/lib/application/useUserSessions/index.js +17 -0
- package/dist/lib/application/useWorkspaceOptions/index.d.ts +10 -0
- package/dist/lib/application/useWorkspaceOptions/index.d.ts.map +1 -0
- package/dist/lib/application/useWorkspaceOptions/index.js +17 -0
- package/dist/lib/components/AccountMenu/index.d.ts +9 -0
- package/dist/lib/components/AccountMenu/index.d.ts.map +1 -0
- package/dist/lib/components/AddToWorkspacesDialog/index.d.ts +19 -0
- package/dist/lib/components/AddToWorkspacesDialog/index.d.ts.map +1 -0
- package/dist/lib/components/BackLink/index.d.ts +14 -0
- package/dist/lib/components/BackLink/index.d.ts.map +1 -0
- package/dist/lib/components/ConfirmDialog/index.d.ts +30 -0
- package/dist/lib/components/ConfirmDialog/index.d.ts.map +1 -0
- package/dist/lib/components/EditMemberDialog/index.d.ts +21 -0
- package/dist/lib/components/EditMemberDialog/index.d.ts.map +1 -0
- package/dist/lib/components/MemberAvatar/index.d.ts +24 -0
- package/dist/lib/components/MemberAvatar/index.d.ts.map +1 -0
- package/dist/lib/components/MembersEmpty/index.d.ts +16 -0
- package/dist/lib/components/MembersEmpty/index.d.ts.map +1 -0
- package/dist/lib/components/MembersNoAccess/index.d.ts +7 -0
- package/dist/lib/components/MembersNoAccess/index.d.ts.map +1 -0
- package/dist/lib/components/MembersPagination/index.d.ts +17 -0
- package/dist/lib/components/MembersPagination/index.d.ts.map +1 -0
- package/dist/lib/components/MembersSkeleton/index.d.ts +32 -0
- package/dist/lib/components/MembersSkeleton/index.d.ts.map +1 -0
- package/dist/lib/components/MembersTable/MemberRoleChip/index.d.ts +10 -0
- package/dist/lib/components/MembersTable/MemberRoleChip/index.d.ts.map +1 -0
- package/dist/lib/components/MembersTable/MemberRowActions/index.d.ts +16 -0
- package/dist/lib/components/MembersTable/MemberRowActions/index.d.ts.map +1 -0
- package/dist/lib/components/MembersTable/MemberStatusBadge/index.d.ts +10 -0
- package/dist/lib/components/MembersTable/MemberStatusBadge/index.d.ts.map +1 -0
- package/dist/lib/components/MembersTable/MemberWorkspaces/index.d.ts +10 -0
- package/dist/lib/components/MembersTable/MemberWorkspaces/index.d.ts.map +1 -0
- package/dist/lib/components/MembersTable/index.d.ts +12 -0
- package/dist/lib/components/MembersTable/index.d.ts.map +1 -0
- package/dist/lib/components/MembersToolbar/index.d.ts +13 -0
- package/dist/lib/components/MembersToolbar/index.d.ts.map +1 -0
- package/dist/lib/components/RolePicker/index.d.ts +18 -0
- package/dist/lib/components/RolePicker/index.d.ts.map +1 -0
- package/dist/lib/components/SessionCard/index.d.ts +15 -0
- package/dist/lib/components/SessionCard/index.d.ts.map +1 -0
- package/dist/lib/components/UserDetailLayout/UserDetailTabs/index.d.ts +13 -0
- package/dist/lib/components/UserDetailLayout/UserDetailTabs/index.d.ts.map +1 -0
- package/dist/lib/components/UserDetailLayout/UserHero/index.d.ts +10 -0
- package/dist/lib/components/UserDetailLayout/UserHero/index.d.ts.map +1 -0
- package/dist/lib/components/UserDetailLayout/UserSideRail/index.d.ts +12 -0
- package/dist/lib/components/UserDetailLayout/UserSideRail/index.d.ts.map +1 -0
- package/dist/lib/components/UserDetailLayout/UserStatsStrip/index.d.ts +10 -0
- package/dist/lib/components/UserDetailLayout/UserStatsStrip/index.d.ts.map +1 -0
- package/dist/lib/components/UserDetailLayout/index.d.ts +13 -0
- package/dist/lib/components/UserDetailLayout/index.d.ts.map +1 -0
- package/dist/lib/components/UserDetailRouter/index.d.ts +13 -0
- package/dist/lib/components/UserDetailRouter/index.d.ts.map +1 -0
- package/dist/lib/components/WorkspaceMembershipCard/index.d.ts +15 -0
- package/dist/lib/components/WorkspaceMembershipCard/index.d.ts.map +1 -0
- package/dist/lib/domain/member/index.d.ts +61 -0
- package/dist/lib/domain/member/index.d.ts.map +1 -0
- package/dist/lib/domain/member/index.js +61 -0
- package/dist/lib/domain/types/member/index.d.ts +90 -0
- package/dist/lib/domain/types/member/index.d.ts.map +1 -0
- package/dist/lib/domain/types/member/index.js +1 -0
- package/dist/lib/domain/types/session/index.d.ts +18 -0
- package/dist/lib/domain/types/session/index.d.ts.map +1 -0
- package/dist/lib/domain/types/session/index.js +1 -0
- package/dist/lib/domain/types/workspaceOption/index.d.ts +15 -0
- package/dist/lib/domain/types/workspaceOption/index.d.ts.map +1 -0
- package/dist/lib/domain/types/workspaceOption/index.js +1 -0
- package/dist/lib/domain/value-objects/email/index.d.ts +24 -0
- package/dist/lib/domain/value-objects/email/index.d.ts.map +1 -0
- package/dist/lib/domain/value-objects/email/index.js +45 -0
- package/dist/lib/infrastructure/httpMemberGateway/index.d.ts +12 -0
- package/dist/lib/infrastructure/httpMemberGateway/index.d.ts.map +1 -0
- package/dist/lib/infrastructure/httpMemberGateway/index.js +158 -0
- package/dist/lib/infrastructure/inviteLink/index.d.ts +13 -0
- package/dist/lib/infrastructure/inviteLink/index.d.ts.map +1 -0
- package/dist/lib/infrastructure/inviteLink/index.js +23 -0
- package/dist/lib/infrastructure/memberGateway/index.d.ts +103 -0
- package/dist/lib/infrastructure/memberGateway/index.d.ts.map +1 -0
- package/dist/lib/infrastructure/memberGateway/index.js +1 -0
- package/dist/lib/infrastructure/memberMapper/index.d.ts +59 -0
- package/dist/lib/infrastructure/memberMapper/index.d.ts.map +1 -0
- package/dist/lib/infrastructure/memberMapper/index.js +52 -0
- package/dist/lib/infrastructure/membersKeys/index.d.ts +37 -0
- package/dist/lib/infrastructure/membersKeys/index.d.ts.map +1 -0
- package/dist/lib/infrastructure/membersKeys/index.js +25 -0
- package/dist/lib/infrastructure/passwordResetLink/index.d.ts +13 -0
- package/dist/lib/infrastructure/passwordResetLink/index.d.ts.map +1 -0
- package/dist/lib/infrastructure/passwordResetLink/index.js +24 -0
- package/dist/lib/infrastructure/preferencesGateway/index.d.ts +37 -0
- package/dist/lib/infrastructure/preferencesGateway/index.d.ts.map +1 -0
- package/dist/lib/infrastructure/preferencesGateway/index.js +43 -0
- package/dist/lib/pages/InviteMemberPage/index.d.ts +7 -0
- package/dist/lib/pages/InviteMemberPage/index.d.ts.map +1 -0
- package/dist/lib/pages/MembersPage/index.d.ts +13 -0
- package/dist/lib/pages/MembersPage/index.d.ts.map +1 -0
- package/dist/lib/pages/UserAccessPage/index.d.ts +9 -0
- package/dist/lib/pages/UserAccessPage/index.d.ts.map +1 -0
- package/dist/lib/pages/UserActivityPage/index.d.ts +8 -0
- package/dist/lib/pages/UserActivityPage/index.d.ts.map +1 -0
- package/dist/lib/pages/UserGeneralPage/index.d.ts +7 -0
- package/dist/lib/pages/UserGeneralPage/index.d.ts.map +1 -0
- package/dist/lib/pages/UserRolesPage/index.d.ts +8 -0
- package/dist/lib/pages/UserRolesPage/index.d.ts.map +1 -0
- package/dist/lib/pages/UserSessionsPage/index.d.ts +7 -0
- package/dist/lib/pages/UserSessionsPage/index.d.ts.map +1 -0
- package/dist/lib/pages/UserWorkspacesPage/index.d.ts +8 -0
- package/dist/lib/pages/UserWorkspacesPage/index.d.ts.map +1 -0
- package/dist/lib/presentation/components/AccountMenu/index.d.ts +9 -0
- package/dist/lib/presentation/components/AccountMenu/index.d.ts.map +1 -0
- package/dist/lib/presentation/components/AccountMenu/index.js +42 -0
- package/dist/lib/presentation/components/AddToWorkspacesDialog/index.d.ts +19 -0
- package/dist/lib/presentation/components/AddToWorkspacesDialog/index.d.ts.map +1 -0
- package/dist/lib/presentation/components/AddToWorkspacesDialog/index.js +89 -0
- package/dist/lib/presentation/components/BackLink/index.d.ts +14 -0
- package/dist/lib/presentation/components/BackLink/index.d.ts.map +1 -0
- package/dist/lib/presentation/components/BackLink/index.js +12 -0
- package/dist/lib/presentation/components/InviteLinkDialog/index.d.ts +25 -0
- package/dist/lib/presentation/components/InviteLinkDialog/index.d.ts.map +1 -0
- package/dist/lib/presentation/components/InviteLinkDialog/index.js +77 -0
- package/dist/lib/presentation/components/InviteLinkPanel/index.d.ts +26 -0
- package/dist/lib/presentation/components/InviteLinkPanel/index.d.ts.map +1 -0
- package/dist/lib/presentation/components/InviteLinkPanel/index.js +59 -0
- package/dist/lib/presentation/components/InviteSent/index.d.ts +20 -0
- package/dist/lib/presentation/components/InviteSent/index.d.ts.map +1 -0
- package/dist/lib/presentation/components/InviteSent/index.js +60 -0
- package/dist/lib/presentation/components/MemberAvatar/index.d.ts +24 -0
- package/dist/lib/presentation/components/MemberAvatar/index.d.ts.map +1 -0
- package/dist/lib/presentation/components/MemberAvatar/index.js +14 -0
- package/dist/lib/presentation/components/MembersEmpty/index.d.ts +16 -0
- package/dist/lib/presentation/components/MembersEmpty/index.d.ts.map +1 -0
- package/dist/lib/presentation/components/MembersEmpty/index.js +42 -0
- package/dist/lib/presentation/components/MembersNoAccess/index.d.ts +7 -0
- package/dist/lib/presentation/components/MembersNoAccess/index.d.ts.map +1 -0
- package/dist/lib/presentation/components/MembersNoAccess/index.js +24 -0
- package/dist/lib/presentation/components/MembersPagination/index.d.ts +17 -0
- package/dist/lib/presentation/components/MembersPagination/index.d.ts.map +1 -0
- package/dist/lib/presentation/components/MembersPagination/index.js +45 -0
- package/dist/lib/presentation/components/MembersSkeleton/index.d.ts +32 -0
- package/dist/lib/presentation/components/MembersSkeleton/index.d.ts.map +1 -0
- package/dist/lib/presentation/components/MembersSkeleton/index.js +61 -0
- package/dist/lib/presentation/components/MembersTable/MemberRoleChip/index.d.ts +17 -0
- package/dist/lib/presentation/components/MembersTable/MemberRoleChip/index.d.ts.map +1 -0
- package/dist/lib/presentation/components/MembersTable/MemberRoleChip/index.js +36 -0
- package/dist/lib/presentation/components/MembersTable/MemberRowActions/index.d.ts +16 -0
- package/dist/lib/presentation/components/MembersTable/MemberRowActions/index.d.ts.map +1 -0
- package/dist/lib/presentation/components/MembersTable/MemberRowActions/index.js +284 -0
- package/dist/lib/presentation/components/MembersTable/MemberStatusBadge/index.d.ts +10 -0
- package/dist/lib/presentation/components/MembersTable/MemberStatusBadge/index.d.ts.map +1 -0
- package/dist/lib/presentation/components/MembersTable/MemberStatusBadge/index.js +49 -0
- package/dist/lib/presentation/components/MembersTable/MemberWorkspaces/index.d.ts +10 -0
- package/dist/lib/presentation/components/MembersTable/MemberWorkspaces/index.d.ts.map +1 -0
- package/dist/lib/presentation/components/MembersTable/MemberWorkspaces/index.js +37 -0
- package/dist/lib/presentation/components/MembersTable/index.d.ts +12 -0
- package/dist/lib/presentation/components/MembersTable/index.d.ts.map +1 -0
- package/dist/lib/presentation/components/MembersTable/index.js +54 -0
- package/dist/lib/presentation/components/MembersTable/membersTableAnchor/index.d.ts +14 -0
- package/dist/lib/presentation/components/MembersTable/membersTableAnchor/index.d.ts.map +1 -0
- package/dist/lib/presentation/components/MembersToolbar/index.d.ts +15 -0
- package/dist/lib/presentation/components/MembersToolbar/index.d.ts.map +1 -0
- package/dist/lib/presentation/components/MembersToolbar/index.js +23 -0
- package/dist/lib/presentation/components/PasswordResetCard/index.d.ts +19 -0
- package/dist/lib/presentation/components/PasswordResetCard/index.d.ts.map +1 -0
- package/dist/lib/presentation/components/PasswordResetCard/index.js +109 -0
- package/dist/lib/presentation/components/PasswordResetLinkDialog/index.d.ts +27 -0
- package/dist/lib/presentation/components/PasswordResetLinkDialog/index.d.ts.map +1 -0
- package/dist/lib/presentation/components/PasswordResetLinkDialog/index.js +79 -0
- package/dist/lib/presentation/components/PasswordResetLinkPanel/index.d.ts +31 -0
- package/dist/lib/presentation/components/PasswordResetLinkPanel/index.d.ts.map +1 -0
- package/dist/lib/presentation/components/PasswordResetLinkPanel/index.js +64 -0
- package/dist/lib/presentation/components/RolePicker/index.d.ts +21 -0
- package/dist/lib/presentation/components/RolePicker/index.d.ts.map +1 -0
- package/dist/lib/presentation/components/RolePicker/index.js +51 -0
- package/dist/lib/presentation/components/SessionCard/index.d.ts +15 -0
- package/dist/lib/presentation/components/SessionCard/index.d.ts.map +1 -0
- package/dist/lib/presentation/components/SessionCard/index.js +43 -0
- package/dist/lib/presentation/components/ThemeSync/index.d.ts +21 -0
- package/dist/lib/presentation/components/ThemeSync/index.d.ts.map +1 -0
- package/dist/lib/presentation/components/ThemeSync/index.js +32 -0
- package/dist/lib/presentation/components/UserDetailLayout/UserDetailTabs/index.d.ts +15 -0
- package/dist/lib/presentation/components/UserDetailLayout/UserDetailTabs/index.d.ts.map +1 -0
- package/dist/lib/presentation/components/UserDetailLayout/UserDetailTabs/index.js +52 -0
- package/dist/lib/presentation/components/UserDetailLayout/UserHero/index.d.ts +10 -0
- package/dist/lib/presentation/components/UserDetailLayout/UserHero/index.d.ts.map +1 -0
- package/dist/lib/presentation/components/UserDetailLayout/UserHero/index.js +26 -0
- package/dist/lib/presentation/components/UserDetailLayout/UserStatsStrip/index.d.ts +10 -0
- package/dist/lib/presentation/components/UserDetailLayout/UserStatsStrip/index.d.ts.map +1 -0
- package/dist/lib/presentation/components/UserDetailLayout/UserStatsStrip/index.js +39 -0
- package/dist/lib/presentation/components/UserDetailLayout/index.d.ts +13 -0
- package/dist/lib/presentation/components/UserDetailLayout/index.d.ts.map +1 -0
- package/dist/lib/presentation/components/UserDetailLayout/index.js +101 -0
- package/dist/lib/presentation/components/UserDetailRouter/index.d.ts +16 -0
- package/dist/lib/presentation/components/UserDetailRouter/index.d.ts.map +1 -0
- package/dist/lib/presentation/components/UserDetailRouter/index.js +33 -0
- package/dist/lib/presentation/components/WorkspaceMembershipCard/index.d.ts +15 -0
- package/dist/lib/presentation/components/WorkspaceMembershipCard/index.d.ts.map +1 -0
- package/dist/lib/presentation/components/WorkspaceMembershipCard/index.js +27 -0
- package/dist/lib/presentation/membersFilterFields/index.d.ts +10 -0
- package/dist/lib/presentation/membersFilterFields/index.d.ts.map +1 -0
- package/dist/lib/presentation/membersFilterFields/index.js +67 -0
- package/dist/lib/presentation/membersResultsAnchor/index.d.ts +17 -0
- package/dist/lib/presentation/membersResultsAnchor/index.d.ts.map +1 -0
- package/dist/lib/presentation/membersResultsAnchor/index.js +16 -0
- package/dist/lib/presentation/pages/InviteMemberPage/index.d.ts +7 -0
- package/dist/lib/presentation/pages/InviteMemberPage/index.d.ts.map +1 -0
- package/dist/lib/presentation/pages/InviteMemberPage/index.js +346 -0
- package/dist/lib/presentation/pages/MembersPage/index.d.ts +13 -0
- package/dist/lib/presentation/pages/MembersPage/index.d.ts.map +1 -0
- package/dist/lib/presentation/pages/MembersPage/index.js +140 -0
- package/dist/lib/presentation/pages/UserAccessPage/index.d.ts +18 -0
- package/dist/lib/presentation/pages/UserAccessPage/index.d.ts.map +1 -0
- package/dist/lib/presentation/pages/UserAccessPage/index.js +153 -0
- package/dist/lib/presentation/pages/UserActivityPage/index.d.ts +8 -0
- package/dist/lib/presentation/pages/UserActivityPage/index.d.ts.map +1 -0
- package/dist/lib/presentation/pages/UserActivityPage/index.js +228 -0
- package/dist/lib/presentation/pages/UserGeneralPage/index.d.ts +7 -0
- package/dist/lib/presentation/pages/UserGeneralPage/index.d.ts.map +1 -0
- package/dist/lib/presentation/pages/UserGeneralPage/index.js +72 -0
- package/dist/lib/presentation/pages/UserPreferencesPage/ThemePreview.d.ts +11 -0
- package/dist/lib/presentation/pages/UserPreferencesPage/ThemePreview.d.ts.map +1 -0
- package/dist/lib/presentation/pages/UserPreferencesPage/ThemePreview.js +24 -0
- package/dist/lib/presentation/pages/UserPreferencesPage/index.d.ts +10 -0
- package/dist/lib/presentation/pages/UserPreferencesPage/index.d.ts.map +1 -0
- package/dist/lib/presentation/pages/UserPreferencesPage/index.js +148 -0
- package/dist/lib/presentation/pages/UserRolesPage/index.d.ts +8 -0
- package/dist/lib/presentation/pages/UserRolesPage/index.d.ts.map +1 -0
- package/dist/lib/presentation/pages/UserRolesPage/index.js +110 -0
- package/dist/lib/presentation/pages/UserSessionsPage/index.d.ts +7 -0
- package/dist/lib/presentation/pages/UserSessionsPage/index.d.ts.map +1 -0
- package/dist/lib/presentation/pages/UserSessionsPage/index.js +121 -0
- package/dist/lib/presentation/pages/UserWorkspacesPage/index.d.ts +8 -0
- package/dist/lib/presentation/pages/UserWorkspacesPage/index.d.ts.map +1 -0
- package/dist/lib/presentation/pages/UserWorkspacesPage/index.js +111 -0
- package/dist/lib/presentation/userDetailContext/index.d.ts +13 -0
- package/dist/lib/presentation/userDetailContext/index.d.ts.map +1 -0
- package/dist/lib/presentation/userDetailContext/index.js +5 -0
- package/dist/lib/presentation/usersPlugin/index.d.ts +27 -0
- package/dist/lib/presentation/usersPlugin/index.d.ts.map +1 -0
- package/dist/lib/presentation/usersPlugin/index.js +109 -0
- package/dist/lib/types/member/index.d.ts +63 -0
- package/dist/lib/types/member/index.d.ts.map +1 -0
- package/dist/lib/utils/membersFilterFields/index.d.ts +10 -0
- package/dist/lib/utils/membersFilterFields/index.d.ts.map +1 -0
- package/dist/lib/utils/membersKeys/index.d.ts +27 -0
- package/dist/lib/utils/membersKeys/index.d.ts.map +1 -0
- package/dist/lib/utils/toMember/index.d.ts +33 -0
- package/dist/lib/utils/toMember/index.d.ts.map +1 -0
- package/dist/lib/utils/userDetailContext/index.d.ts +13 -0
- package/dist/lib/utils/userDetailContext/index.d.ts.map +1 -0
- package/dist/lib/utils/usersPlugin/index.d.ts +27 -0
- package/dist/lib/utils/usersPlugin/index.d.ts.map +1 -0
- package/package.json +50 -0
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { apiClient, toApiError } from '@orthacms/utils-admin';
|
|
2
|
+
/**
|
|
3
|
+
* React Query keys for a user's own preferences. Distinct from `membersKeys` —
|
|
4
|
+
* these are the caller's *own* app preferences, not a member record, so they
|
|
5
|
+
* never invalidate alongside the members list.
|
|
6
|
+
*
|
|
7
|
+
* The key is scoped **by user id**, not a flat `'me'`. Sign-out only invalidates
|
|
8
|
+
* the current-user query; every other cache entry survives it. With a shared
|
|
9
|
+
* `'me'` key, signing in as someone else on the same machine would read the
|
|
10
|
+
* previous user's cached theme (and, because this query never goes stale, never
|
|
11
|
+
* refetch to correct it). Scoping by id makes that structurally impossible.
|
|
12
|
+
*/
|
|
13
|
+
export const preferencesKeys = {
|
|
14
|
+
/** One user's preferences. */
|
|
15
|
+
forUser: (userId) => ['preferences', userId]
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* The one place `/api/preferences` is spoken to. Keeps `apiClient` out of the
|
|
19
|
+
* application hooks (per this plugin's layering) and normalizes transport
|
|
20
|
+
* errors to `ApiError` so callers branch on status, not axios internals.
|
|
21
|
+
*/
|
|
22
|
+
export const httpPreferencesGateway = {
|
|
23
|
+
/** Reads the signed-in user's preferences (defaults if never saved). */
|
|
24
|
+
async get() {
|
|
25
|
+
try {
|
|
26
|
+
const response = await apiClient.get('/preferences');
|
|
27
|
+
return response.data;
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
throw toApiError(error);
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
/** Persists the signed-in user's theme choice, returning the stored row. */
|
|
34
|
+
async updateTheme(theme) {
|
|
35
|
+
try {
|
|
36
|
+
const response = await apiClient.put('/preferences', { theme });
|
|
37
|
+
return response.data;
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
throw toApiError(error);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Full-page, three-step invite wizard (Details → Role → Workspaces) at
|
|
3
|
+
* `/users/invite`, on the design-system wizard chrome. Gated on `users:create`
|
|
4
|
+
* — the server enforces the same — so a user without it is redirected.
|
|
5
|
+
*/
|
|
6
|
+
export declare function InviteMemberPage(): import("react").JSX.Element;
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/pages/InviteMemberPage/index.tsx"],"names":[],"mappings":"AA+PA;;;;GAIG;AACH,wBAAgB,gBAAgB,gCAuiB/B"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Members management page: a searchable, filterable, paginated, and
|
|
3
|
+
* deep-linkable table of everyone who can sign in, with invite / edit / role /
|
|
4
|
+
* status controls gated on the signed-in user's `users:*` permissions. The URL
|
|
5
|
+
* query string is the single source of truth for search, the query-builder
|
|
6
|
+
* filter, and the page (via `useTableUrlState`), so a filtered view can be
|
|
7
|
+
* shared or bookmarked. Rendered at `/users` inside the authenticated shell.
|
|
8
|
+
*
|
|
9
|
+
* Gated on `users:read`: without it the page shows a no-access state and
|
|
10
|
+
* fetches nothing (the server would refuse the request anyway).
|
|
11
|
+
*/
|
|
12
|
+
export declare function MembersPage(): import("react").JSX.Element;
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/pages/MembersPage/index.tsx"],"names":[],"mappings":"AAiEA;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,gCA0M1B"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Access tab: suspend or reactivate a member's sign-in. Mirrors the
|
|
3
|
+
* server's lifecycle — only `active` can be suspended, only `disabled`
|
|
4
|
+
* reactivated, and `pending` (un-accepted invite) is read-only. The last
|
|
5
|
+
* active admin and your own account can't be suspended; the button explains
|
|
6
|
+
* why instead of failing on submit.
|
|
7
|
+
*/
|
|
8
|
+
export declare function UserAccessPage(): import("react").JSX.Element;
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/pages/UserAccessPage/index.tsx"],"names":[],"mappings":"AA8FA;;;;;;GAMG;AACH,wBAAgB,cAAc,gCAsG7B"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Activity tab: a timeline of audit events whose subject is this member,
|
|
3
|
+
* reusing the activity plugin's `useActivityLog` with a pinned `subjectId`
|
|
4
|
+
* filter. Gated on `activity:read` (the rail hides it otherwise). Paginated
|
|
5
|
+
* with the shared members pagination control.
|
|
6
|
+
*/
|
|
7
|
+
export declare function UserActivityPage(): import("react").JSX.Element;
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/pages/UserActivityPage/index.tsx"],"names":[],"mappings":"AAoNA;;;;;GAKG;AACH,wBAAgB,gBAAgB,gCA6F/B"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The General tab: edit the member's display name; the email is read-only. The
|
|
3
|
+
* Save/Discard pair only enables on a real change. Edit controls require
|
|
4
|
+
* `users:update`; without it the fields render disabled.
|
|
5
|
+
*/
|
|
6
|
+
export declare function UserGeneralPage(): import("react").JSX.Element;
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/pages/UserGeneralPage/index.tsx"],"names":[],"mappings":"AAkDA;;;;GAIG;AACH,wBAAgB,eAAe,gCAkF9B"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Role tab: pick the member's single global role and apply it behind a
|
|
3
|
+
* confirm step (with an extra warning when escalating to Admin). The last
|
|
4
|
+
* active admin can't be re-roled; the picker locks with the reason shown.
|
|
5
|
+
* Requires `users:update`.
|
|
6
|
+
*/
|
|
7
|
+
export declare function UserRolesPage(): import("react").JSX.Element;
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/pages/UserRolesPage/index.tsx"],"names":[],"mappings":"AAqEA;;;;;GAKG;AACH,wBAAgB,aAAa,gCA+F5B"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Sessions tab: a member's live sessions with a per-device Revoke. Gated on
|
|
3
|
+
* `users:update` (the rail hides it otherwise); revoking is confirmed and drops
|
|
4
|
+
* the row on success. The viewer's own session can't be revoked from here.
|
|
5
|
+
*/
|
|
6
|
+
export declare function UserSessionsPage(): import("react").JSX.Element;
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/pages/UserSessionsPage/index.tsx"],"names":[],"mappings":"AA4DA;;;;GAIG;AACH,wBAAgB,gBAAgB,gCA6F/B"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Workspaces tab: the member's workspace memberships, with add (a
|
|
3
|
+
* multi-select dialog) and per-card remove (confirmed). Memberships come from
|
|
4
|
+
* the shared detail record; mutations invalidate it so the list refreshes.
|
|
5
|
+
* Editing requires `users:update`.
|
|
6
|
+
*/
|
|
7
|
+
export declare function UserWorkspacesPage(): import("react").JSX.Element;
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/pages/UserWorkspacesPage/index.tsx"],"names":[],"mappings":"AAiEA;;;;;GAKG;AACH,wBAAgB,kBAAkB,gCAyHjC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The account widget pinned to the sidebar footer: a full-width row showing the
|
|
3
|
+
* signed-in user's avatar, name, and email that opens a menu with a link to
|
|
4
|
+
* their own profile (the user detail page) and a Logout action. Contributed to
|
|
5
|
+
* the shell's `SIDEBAR_FOOTER_SLOT`. Renders nothing until a user is resolved,
|
|
6
|
+
* so it never flashes an empty row during the auth probe.
|
|
7
|
+
*/
|
|
8
|
+
export declare function AccountMenu(): import("react").JSX.Element | null;
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/lib/presentation/components/AccountMenu/index.tsx"],"names":[],"mappings":"AAqCA;;;;;;GAMG;AACH,wBAAgB,WAAW,uCA8D1B"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useNavigate } from 'react-router-dom';
|
|
3
|
+
import { defineMessages, useIntl } from 'react-intl';
|
|
4
|
+
import { ChevronsUpDown, LogOut, UserRound } from 'lucide-react';
|
|
5
|
+
import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, SidebarMenu, SidebarMenuButton, SidebarMenuItem } from '@orthacms/design-system';
|
|
6
|
+
import { avatarColorForId, initialsOf } from '@orthacms/utils-admin';
|
|
7
|
+
import { AuthStatus, useAuth, useLogoutMutation } from '@orthacms/identity-admin';
|
|
8
|
+
import { MemberAvatar } from '../MemberAvatar';
|
|
9
|
+
/** Intl descriptors for {@link AccountMenu}, co-located with the component. */
|
|
10
|
+
const messages = defineMessages({
|
|
11
|
+
open: {
|
|
12
|
+
id: 'users.account.open',
|
|
13
|
+
defaultMessage: 'Account menu'
|
|
14
|
+
},
|
|
15
|
+
myProfile: {
|
|
16
|
+
id: 'users.account.myProfile',
|
|
17
|
+
defaultMessage: 'My profile'
|
|
18
|
+
},
|
|
19
|
+
logout: {
|
|
20
|
+
id: 'users.account.logout',
|
|
21
|
+
defaultMessage: 'Logout'
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
/**
|
|
25
|
+
* The account widget pinned to the sidebar footer: a full-width row showing the
|
|
26
|
+
* signed-in user's avatar, name, and email that opens a menu with a link to
|
|
27
|
+
* their own profile (the user detail page) and a Logout action. Contributed to
|
|
28
|
+
* the shell's `SIDEBAR_FOOTER_SLOT`. Renders nothing until a user is resolved,
|
|
29
|
+
* so it never flashes an empty row during the auth probe.
|
|
30
|
+
*/
|
|
31
|
+
export function AccountMenu() {
|
|
32
|
+
const intl = useIntl();
|
|
33
|
+
const navigate = useNavigate();
|
|
34
|
+
const auth = useAuth();
|
|
35
|
+
const logout = useLogoutMutation();
|
|
36
|
+
if (auth.status !== AuthStatus.Authenticated) {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
const { id, email, name } = auth.user;
|
|
40
|
+
const displayName = name ?? email;
|
|
41
|
+
return (_jsx(SidebarMenu, { children: _jsx(SidebarMenuItem, { children: _jsxs(DropdownMenu, { children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsxs(SidebarMenuButton, { size: "lg", "aria-label": intl.formatMessage(messages.open), children: [_jsx(MemberAvatar, { initials: initialsOf(displayName), color: avatarColorForId(id), className: "size-8 text-xs" }), _jsxs("span", { className: "flex min-w-0 flex-1 flex-col text-left", children: [_jsx("span", { className: "truncate text-sm font-medium", children: displayName }), _jsx("span", { className: "truncate text-xs text-sidebar-foreground/70", children: email })] }), _jsx(ChevronsUpDown, { className: "ml-auto", "aria-hidden": true })] }) }), _jsxs(DropdownMenuContent, { side: "top", align: "start", className: "w-56", children: [_jsxs(DropdownMenuItem, { onSelect: () => navigate(`/users/${id}`), children: [_jsx(UserRound, { "aria-hidden": true }), intl.formatMessage(messages.myProfile)] }), _jsx(DropdownMenuSeparator, {}), _jsxs(DropdownMenuItem, { disabled: logout.isPending, onSelect: () => logout.mutate(), children: [_jsx(LogOut, { "aria-hidden": true }), intl.formatMessage(messages.logout)] })] })] }) }) }));
|
|
42
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A modal to add the member to one or more workspaces. Lists every workspace
|
|
3
|
+
* they're not already in (via the shared `GET /api/workspaces`), with a search
|
|
4
|
+
* filter and multi-select. The parent runs the actual additions and owns
|
|
5
|
+
* `busy`; the dialog stays open and non-dismissable until they settle.
|
|
6
|
+
*/
|
|
7
|
+
export declare function AddToWorkspacesDialog({ open, onOpenChange, existingIds, busy, onAdd }: {
|
|
8
|
+
/** Whether the dialog is shown. */
|
|
9
|
+
open: boolean;
|
|
10
|
+
/** Open/close handler; ignored while busy. */
|
|
11
|
+
onOpenChange: (open: boolean) => void;
|
|
12
|
+
/** Workspace ids the member already belongs to (excluded from the list). */
|
|
13
|
+
existingIds: ReadonlyArray<string>;
|
|
14
|
+
/** Whether additions are in flight. */
|
|
15
|
+
busy?: boolean;
|
|
16
|
+
/** Called with the chosen workspace ids. */
|
|
17
|
+
onAdd: (workspaceIds: string[]) => void;
|
|
18
|
+
}): import("react").JSX.Element;
|
|
19
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/lib/presentation/components/AddToWorkspacesDialog/index.tsx"],"names":[],"mappings":"AAoDA;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,EAClC,IAAI,EACJ,YAAY,EACZ,WAAW,EACX,IAAY,EACZ,KAAK,EACR,EAAE;IACC,mCAAmC;IACnC,IAAI,EAAE,OAAO,CAAC;IACd,8CAA8C;IAC9C,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,4EAA4E;IAC5E,WAAW,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACnC,uCAAuC;IACvC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,4CAA4C;IAC5C,KAAK,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;CAC3C,+BAyJA"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useMemo, useState } from 'react';
|
|
3
|
+
import { defineMessages, useIntl } from 'react-intl';
|
|
4
|
+
import { Button, Checkbox, Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, Input, Label, Spinner, cn } from '@orthacms/design-system';
|
|
5
|
+
import { useWorkspaceOptions } from '../../../application/useWorkspaceOptions';
|
|
6
|
+
import { MemberAvatar } from '../MemberAvatar';
|
|
7
|
+
/** Intl descriptors for {@link AddToWorkspacesDialog}. */
|
|
8
|
+
const messages = defineMessages({
|
|
9
|
+
title: {
|
|
10
|
+
id: 'users.addWorkspaces.title',
|
|
11
|
+
defaultMessage: 'Add to workspaces'
|
|
12
|
+
},
|
|
13
|
+
description: {
|
|
14
|
+
id: 'users.addWorkspaces.description',
|
|
15
|
+
defaultMessage: 'Pick the workspaces this member should join.'
|
|
16
|
+
},
|
|
17
|
+
search: {
|
|
18
|
+
id: 'users.addWorkspaces.search',
|
|
19
|
+
defaultMessage: 'Search workspaces'
|
|
20
|
+
},
|
|
21
|
+
none: {
|
|
22
|
+
id: 'users.addWorkspaces.none',
|
|
23
|
+
defaultMessage: 'This member already belongs to every workspace.'
|
|
24
|
+
},
|
|
25
|
+
noMatch: {
|
|
26
|
+
id: 'users.addWorkspaces.noMatch',
|
|
27
|
+
defaultMessage: 'No workspaces match your search.'
|
|
28
|
+
},
|
|
29
|
+
error: {
|
|
30
|
+
id: 'users.addWorkspaces.error',
|
|
31
|
+
defaultMessage: 'Couldn’t load workspaces. Please try again.'
|
|
32
|
+
},
|
|
33
|
+
cancel: { id: 'users.addWorkspaces.cancel', defaultMessage: 'Cancel' },
|
|
34
|
+
add: {
|
|
35
|
+
id: 'users.addWorkspaces.add',
|
|
36
|
+
defaultMessage: 'Add{count, plural, =0 {} other { (#)}}'
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
/**
|
|
40
|
+
* A modal to add the member to one or more workspaces. Lists every workspace
|
|
41
|
+
* they're not already in (via the shared `GET /api/workspaces`), with a search
|
|
42
|
+
* filter and multi-select. The parent runs the actual additions and owns
|
|
43
|
+
* `busy`; the dialog stays open and non-dismissable until they settle.
|
|
44
|
+
*/
|
|
45
|
+
export function AddToWorkspacesDialog({ open, onOpenChange, existingIds, busy = false, onAdd }) {
|
|
46
|
+
const intl = useIntl();
|
|
47
|
+
const { data, isPending, isError } = useWorkspaceOptions(open);
|
|
48
|
+
const [query, setQuery] = useState('');
|
|
49
|
+
const [selected, setSelected] = useState(new Set());
|
|
50
|
+
const existing = useMemo(() => new Set(existingIds), [existingIds]);
|
|
51
|
+
const available = useMemo(() => (data ?? []).filter((workspace) => !existing.has(workspace.id)), [data, existing]);
|
|
52
|
+
const filtered = useMemo(() => {
|
|
53
|
+
const needle = query.trim().toLowerCase();
|
|
54
|
+
if (!needle) {
|
|
55
|
+
return available;
|
|
56
|
+
}
|
|
57
|
+
return available.filter((workspace) => workspace.name.toLowerCase().includes(needle));
|
|
58
|
+
}, [available, query]);
|
|
59
|
+
const toggle = (id) => {
|
|
60
|
+
setSelected((prev) => {
|
|
61
|
+
const next = new Set(prev);
|
|
62
|
+
if (next.has(id)) {
|
|
63
|
+
next.delete(id);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
next.add(id);
|
|
67
|
+
}
|
|
68
|
+
return next;
|
|
69
|
+
});
|
|
70
|
+
};
|
|
71
|
+
const close = (next) => {
|
|
72
|
+
if (busy) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
if (!next) {
|
|
76
|
+
setQuery('');
|
|
77
|
+
setSelected(new Set());
|
|
78
|
+
}
|
|
79
|
+
onOpenChange(next);
|
|
80
|
+
};
|
|
81
|
+
return (_jsx(Dialog, { open: open, onOpenChange: close, children: _jsxs(DialogContent, { children: [_jsxs(DialogHeader, { children: [_jsx(DialogTitle, { children: intl.formatMessage(messages.title) }), _jsx(DialogDescription, { children: intl.formatMessage(messages.description) })] }), isPending ? (_jsx("div", { className: "flex justify-center py-8", children: _jsx(Spinner, {}) })) : isError ? (_jsx("p", { className: "py-6 text-center text-sm text-muted-foreground", children: intl.formatMessage(messages.error) })) : available.length === 0 ? (_jsx("p", { className: "py-6 text-center text-sm text-muted-foreground", children: intl.formatMessage(messages.none) })) : (_jsxs("div", { className: "space-y-3", children: [_jsx(Input, { value: query, onChange: (event) => setQuery(event.target.value), placeholder: intl.formatMessage(messages.search), "aria-label": intl.formatMessage(messages.search), disabled: busy }), filtered.length === 0 ? (_jsx("p", { className: "py-6 text-center text-sm text-muted-foreground", children: intl.formatMessage(messages.noMatch) })) : (_jsx("ul", { className: "max-h-64 space-y-1 overflow-y-auto", children: filtered.map((workspace) => {
|
|
82
|
+
const id = `add-workspace-${workspace.id}`;
|
|
83
|
+
const checked = selected.has(workspace.id);
|
|
84
|
+
return (_jsx("li", { children: _jsxs(Label, { htmlFor: id, className: cn('flex cursor-pointer items-center gap-3 rounded-lg p-2 transition-colors hover:bg-muted/50', busy &&
|
|
85
|
+
'cursor-not-allowed opacity-70'), children: [_jsx(Checkbox, { id: id, checked: checked, disabled: busy, onCheckedChange: () => toggle(workspace.id) }), _jsx(MemberAvatar, { initials: workspace.initials, color: workspace.color, className: "size-9 shrink-0 text-xs" }), _jsxs("span", { className: "min-w-0 flex-1", children: [_jsx("span", { className: "block truncate text-sm", children: workspace.name }), workspace.description ? (_jsx("span", { className: "line-clamp-3 text-xs text-muted-foreground", children: workspace.description })) : null] })] }) }, workspace.id));
|
|
86
|
+
}) }))] })), _jsxs(DialogFooter, { children: [_jsx(Button, { variant: "outline", onClick: () => close(false), disabled: busy, children: intl.formatMessage(messages.cancel) }), _jsxs(Button, { onClick: () => onAdd([...selected]), disabled: busy || selected.size === 0, children: [busy ? _jsx(Spinner, {}) : null, intl.formatMessage(messages.add, {
|
|
87
|
+
count: selected.size
|
|
88
|
+
})] })] })] }) }));
|
|
89
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A muted "back" link with a leading arrow — the detail page's return path to
|
|
3
|
+
* the members roster. The arrow is decorative; the text label carries the
|
|
4
|
+
* destination for assistive tech.
|
|
5
|
+
*/
|
|
6
|
+
export declare function BackLink({ to, label, className }: {
|
|
7
|
+
/** Destination path. */
|
|
8
|
+
to: string;
|
|
9
|
+
/** Visible, accessible label (e.g. "Back to members"). */
|
|
10
|
+
label: string;
|
|
11
|
+
/** Extra classes. */
|
|
12
|
+
className?: string;
|
|
13
|
+
}): import("react").JSX.Element;
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/lib/presentation/components/BackLink/index.tsx"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,EACrB,EAAE,EACF,KAAK,EACL,SAAS,EACZ,EAAE;IACC,wBAAwB;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,0DAA0D;IAC1D,KAAK,EAAE,MAAM,CAAC;IACd,qBAAqB;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB,+BAaA"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Link } from 'react-router-dom';
|
|
3
|
+
import { ArrowLeft } from 'lucide-react';
|
|
4
|
+
import { cn } from '@orthacms/design-system';
|
|
5
|
+
/**
|
|
6
|
+
* A muted "back" link with a leading arrow — the detail page's return path to
|
|
7
|
+
* the members roster. The arrow is decorative; the text label carries the
|
|
8
|
+
* destination for assistive tech.
|
|
9
|
+
*/
|
|
10
|
+
export function BackLink({ to, label, className }) {
|
|
11
|
+
return (_jsxs(Link, { to: to, className: cn('inline-flex items-center gap-1.5 text-sm text-muted-foreground transition-colors hover:text-foreground', className), children: [_jsx(ArrowLeft, { "aria-hidden": true, className: "size-4" }), label] }));
|
|
12
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/** Props for {@link InviteLinkDialog}. */
|
|
2
|
+
type InviteLinkDialogProps = {
|
|
3
|
+
/** The freshly rotated invite link, or `null` when there is none to show. */
|
|
4
|
+
link: string | null;
|
|
5
|
+
/** Who the link is for. */
|
|
6
|
+
email: string;
|
|
7
|
+
/** Whether the dialog is open. */
|
|
8
|
+
open: boolean;
|
|
9
|
+
/** Called when the dialog opens or closes. */
|
|
10
|
+
onOpenChange: (open: boolean) => void;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Shows the invite link produced by a **resend**. Resending rotates the token,
|
|
14
|
+
* which kills the link the invitee may already be holding — so handing the new
|
|
15
|
+
* one over is not a nicety, it is the rest of the operation.
|
|
16
|
+
*
|
|
17
|
+
* Because of that, dismissing before copying is guarded. Esc, an overlay click
|
|
18
|
+
* and the close button all reach `onOpenChange(false)` by reflex, and the link
|
|
19
|
+
* is not re-fetchable: losing it leaves the invitee with a dead link and the
|
|
20
|
+
* admin with no live one, recoverable only by resending — which rotates again.
|
|
21
|
+
* So the first dismissal without a copy asks; once copied, it closes freely.
|
|
22
|
+
*/
|
|
23
|
+
export declare function InviteLinkDialog({ link, email, open, onOpenChange }: InviteLinkDialogProps): import("react").JSX.Element;
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/lib/presentation/components/InviteLinkDialog/index.tsx"],"names":[],"mappings":"AA8CA,0CAA0C;AAC1C,KAAK,qBAAqB,GAAG;IACzB,6EAA6E;IAC7E,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,kCAAkC;IAClC,IAAI,EAAE,OAAO,CAAC;IACd,8CAA8C;IAC9C,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CACzC,CAAC;AAEF;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,EAC7B,IAAI,EACJ,KAAK,EACL,IAAI,EACJ,YAAY,EACf,EAAE,qBAAqB,+BAyFvB"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect, useState } from 'react';
|
|
3
|
+
import { defineMessages, useIntl } from 'react-intl';
|
|
4
|
+
import { Alert, AlertDescription, Button, Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from '@orthacms/design-system';
|
|
5
|
+
import { TriangleAlert } from 'lucide-react';
|
|
6
|
+
import { InviteLinkPanel } from '../InviteLinkPanel';
|
|
7
|
+
/** Intl descriptors for {@link InviteLinkDialog}, co-located with the component. */
|
|
8
|
+
const messages = defineMessages({
|
|
9
|
+
title: {
|
|
10
|
+
id: 'users.inviteLinkDialog.title',
|
|
11
|
+
defaultMessage: 'Send this link to {email}'
|
|
12
|
+
},
|
|
13
|
+
description: {
|
|
14
|
+
id: 'users.inviteLinkDialog.description',
|
|
15
|
+
defaultMessage: 'The previous invite link stopped working the moment this one was created, so this is the link they need. It’s shown once — copy it before you close this.'
|
|
16
|
+
},
|
|
17
|
+
done: {
|
|
18
|
+
id: 'users.inviteLinkDialog.done',
|
|
19
|
+
defaultMessage: 'Done'
|
|
20
|
+
},
|
|
21
|
+
uncopied: {
|
|
22
|
+
id: 'users.inviteLinkDialog.uncopied',
|
|
23
|
+
defaultMessage: 'You haven’t copied the link yet, and it can’t be shown again. Closing now leaves {email} with no working invite until you resend.'
|
|
24
|
+
},
|
|
25
|
+
closeAnyway: {
|
|
26
|
+
id: 'users.inviteLinkDialog.closeAnyway',
|
|
27
|
+
defaultMessage: 'Close without copying'
|
|
28
|
+
},
|
|
29
|
+
keepOpen: {
|
|
30
|
+
id: 'users.inviteLinkDialog.keepOpen',
|
|
31
|
+
defaultMessage: 'Keep it open'
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
/**
|
|
35
|
+
* Shows the invite link produced by a **resend**. Resending rotates the token,
|
|
36
|
+
* which kills the link the invitee may already be holding — so handing the new
|
|
37
|
+
* one over is not a nicety, it is the rest of the operation.
|
|
38
|
+
*
|
|
39
|
+
* Because of that, dismissing before copying is guarded. Esc, an overlay click
|
|
40
|
+
* and the close button all reach `onOpenChange(false)` by reflex, and the link
|
|
41
|
+
* is not re-fetchable: losing it leaves the invitee with a dead link and the
|
|
42
|
+
* admin with no live one, recoverable only by resending — which rotates again.
|
|
43
|
+
* So the first dismissal without a copy asks; once copied, it closes freely.
|
|
44
|
+
*/
|
|
45
|
+
export function InviteLinkDialog({ link, email, open, onOpenChange }) {
|
|
46
|
+
const intl = useIntl();
|
|
47
|
+
const [copied, setCopied] = useState(false);
|
|
48
|
+
const [confirmingClose, setConfirmingClose] = useState(false);
|
|
49
|
+
// A new link is a new chance to lose it — reset the guard whenever one
|
|
50
|
+
// arrives, so a second resend doesn't inherit the first one's "copied".
|
|
51
|
+
useEffect(() => {
|
|
52
|
+
if (link !== null) {
|
|
53
|
+
setCopied(false);
|
|
54
|
+
setConfirmingClose(false);
|
|
55
|
+
}
|
|
56
|
+
}, [link]);
|
|
57
|
+
/** Close for real, clearing the guard. */
|
|
58
|
+
const close = () => {
|
|
59
|
+
setConfirmingClose(false);
|
|
60
|
+
onOpenChange(false);
|
|
61
|
+
};
|
|
62
|
+
/** Every dismissal path funnels through here so none of them can slip past. */
|
|
63
|
+
const requestClose = () => {
|
|
64
|
+
if (copied) {
|
|
65
|
+
close();
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
setConfirmingClose(true);
|
|
69
|
+
};
|
|
70
|
+
return (_jsx(Dialog, { open: open, onOpenChange: (next) => {
|
|
71
|
+
if (next) {
|
|
72
|
+
onOpenChange(true);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
requestClose();
|
|
76
|
+
}, children: _jsxs(DialogContent, { children: [_jsxs(DialogHeader, { children: [_jsx(DialogTitle, { children: intl.formatMessage(messages.title, { email }) }), _jsx(DialogDescription, { children: intl.formatMessage(messages.description) })] }), link && (_jsx(InviteLinkPanel, { link: link, email: email, onCopied: () => setCopied(true) })), confirmingClose ? (_jsxs(Alert, { variant: "destructive", role: "alert", children: [_jsx(TriangleAlert, { "aria-hidden": true }), _jsx(AlertDescription, { children: intl.formatMessage(messages.uncopied, { email }) })] })) : null, _jsx(DialogFooter, { children: confirmingClose ? (_jsxs(_Fragment, { children: [_jsx(Button, { variant: "outline", onClick: () => setConfirmingClose(false), children: intl.formatMessage(messages.keepOpen) }), _jsx(Button, { variant: "destructive", onClick: close, children: intl.formatMessage(messages.closeAnyway) })] })) : (_jsx(Button, { onClick: requestClose, children: intl.formatMessage(messages.done) })) })] }) }));
|
|
77
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/** Props for {@link InviteLinkPanel}. */
|
|
2
|
+
type InviteLinkPanelProps = {
|
|
3
|
+
/** The full invite URL to hand over. */
|
|
4
|
+
link: string;
|
|
5
|
+
/** Who the link is for — named in the warning so the risk is concrete. */
|
|
6
|
+
email: string;
|
|
7
|
+
/**
|
|
8
|
+
* Called once the link has actually reached the clipboard. Lets a container
|
|
9
|
+
* tell "captured" from "about to be lost" — the resend dialog guards its
|
|
10
|
+
* dismissal on it.
|
|
11
|
+
*/
|
|
12
|
+
onCopied?: () => void;
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* The reveal-once invite link, with a copy button and a plain warning about
|
|
16
|
+
* what the link is. Mirrors the API-token reveal dialog: the secret exists only
|
|
17
|
+
* in the caller's state, is never re-fetchable, and this is the single chance to
|
|
18
|
+
* capture it.
|
|
19
|
+
*
|
|
20
|
+
* It exists because nothing emails invites yet — the admin is the delivery
|
|
21
|
+
* channel. When a mailer lands (identity epic #11) this becomes a fallback for
|
|
22
|
+
* deployments with no SMTP rather than the only path.
|
|
23
|
+
*/
|
|
24
|
+
export declare function InviteLinkPanel({ link, email, onCopied }: InviteLinkPanelProps): import("react").JSX.Element;
|
|
25
|
+
export {};
|
|
26
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/lib/presentation/components/InviteLinkPanel/index.tsx"],"names":[],"mappings":"AAoCA,yCAAyC;AACzC,KAAK,oBAAoB,GAAG;IACxB,wCAAwC;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,0EAA0E;IAC1E,KAAK,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,EAC5B,IAAI,EACJ,KAAK,EACL,QAAQ,EACX,EAAE,oBAAoB,+BAoDtB"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import { defineMessages, useIntl } from 'react-intl';
|
|
4
|
+
import { Check, Copy, TriangleAlert } from 'lucide-react';
|
|
5
|
+
import { Alert, AlertDescription, Button, toast } from '@orthacms/design-system';
|
|
6
|
+
/** Intl descriptors for {@link InviteLinkPanel}, co-located with the component. */
|
|
7
|
+
const messages = defineMessages({
|
|
8
|
+
copy: {
|
|
9
|
+
id: 'users.inviteLink.copy',
|
|
10
|
+
defaultMessage: 'Copy link'
|
|
11
|
+
},
|
|
12
|
+
copied: {
|
|
13
|
+
id: 'users.inviteLink.copied',
|
|
14
|
+
defaultMessage: 'Invite link copied to clipboard'
|
|
15
|
+
},
|
|
16
|
+
copyFailed: {
|
|
17
|
+
id: 'users.inviteLink.copyFailed',
|
|
18
|
+
defaultMessage: 'Couldn’t reach the clipboard. Select the link and copy it manually.'
|
|
19
|
+
},
|
|
20
|
+
warning: {
|
|
21
|
+
id: 'users.inviteLink.warning',
|
|
22
|
+
defaultMessage: 'This link is shown once and works once. Anyone who opens it becomes {email} — send it the way you’d send a password, not in a public channel.'
|
|
23
|
+
},
|
|
24
|
+
linkLabel: {
|
|
25
|
+
id: 'users.inviteLink.linkLabel',
|
|
26
|
+
defaultMessage: 'Invite link for {email}'
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
/**
|
|
30
|
+
* The reveal-once invite link, with a copy button and a plain warning about
|
|
31
|
+
* what the link is. Mirrors the API-token reveal dialog: the secret exists only
|
|
32
|
+
* in the caller's state, is never re-fetchable, and this is the single chance to
|
|
33
|
+
* capture it.
|
|
34
|
+
*
|
|
35
|
+
* It exists because nothing emails invites yet — the admin is the delivery
|
|
36
|
+
* channel. When a mailer lands (identity epic #11) this becomes a fallback for
|
|
37
|
+
* deployments with no SMTP rather than the only path.
|
|
38
|
+
*/
|
|
39
|
+
export function InviteLinkPanel({ link, email, onCopied }) {
|
|
40
|
+
const intl = useIntl();
|
|
41
|
+
const [copied, setCopied] = useState(false);
|
|
42
|
+
const copy = async () => {
|
|
43
|
+
try {
|
|
44
|
+
await navigator.clipboard.writeText(link);
|
|
45
|
+
setCopied(true);
|
|
46
|
+
onCopied?.();
|
|
47
|
+
toast.success(intl.formatMessage(messages.copied));
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
// Clipboard access can be denied (insecure origin, permissions).
|
|
51
|
+
// The link is selectable in the field, so say so rather than
|
|
52
|
+
// failing silently.
|
|
53
|
+
toast.error(intl.formatMessage(messages.copyFailed));
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
return (_jsxs("div", { className: "flex flex-col gap-4", children: [_jsxs("div", { className: "flex min-w-0 items-center gap-2", children: [_jsx("input", { readOnly: true, value: link, "aria-label": intl.formatMessage(messages.linkLabel, {
|
|
57
|
+
email
|
|
58
|
+
}), onFocus: (e) => e.currentTarget.select(), className: "min-w-0 flex-1 truncate rounded-md bg-muted px-3 py-2 font-mono text-sm" }), _jsxs(Button, { type: "button", variant: "outline", className: "shrink-0", onClick: copy, children: [copied ? _jsx(Check, { "aria-hidden": true }) : _jsx(Copy, { "aria-hidden": true }), intl.formatMessage(messages.copy)] })] }), _jsxs(Alert, { children: [_jsx(TriangleAlert, { "aria-hidden": true }), _jsx(AlertDescription, { children: intl.formatMessage(messages.warning, { email }) })] })] }));
|
|
59
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/** Props for {@link InviteSent}. */
|
|
2
|
+
type InviteSentProps = {
|
|
3
|
+
/** The invitee's email. */
|
|
4
|
+
email: string;
|
|
5
|
+
/** The invite link to hand over. */
|
|
6
|
+
link: string;
|
|
7
|
+
/** Human-readable label of the role granted on acceptance. */
|
|
8
|
+
roleLabel: string;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* The invite wizard's final step: the invite exists, and here is the link.
|
|
12
|
+
*
|
|
13
|
+
* It is a step rather than a toast-then-redirect because the link is shown
|
|
14
|
+
* **once** — the server keeps only its hash, so navigating away before copying
|
|
15
|
+
* it means resending the invite. The copy spells out what the invitee will see,
|
|
16
|
+
* since the admin can't preview the page they're sending someone to.
|
|
17
|
+
*/
|
|
18
|
+
export declare function InviteSent({ email, link, roleLabel }: InviteSentProps): import("react").JSX.Element;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/lib/presentation/components/InviteSent/index.tsx"],"names":[],"mappings":"AAmDA,oCAAoC;AACpC,KAAK,eAAe,GAAG;IACnB,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,8DAA8D;IAC9D,SAAS,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,eAAe,+BA4DrE"}
|