@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,153 @@
|
|
|
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 { Ban, MailCheck, ShieldCheck } from 'lucide-react';
|
|
5
|
+
import { Alert, AlertDescription, Button, Card, CardContent, CardDescription, CardHeader, CardTitle, toast } from '@orthacms/design-system';
|
|
6
|
+
import { useAuth } from '@orthacms/identity-admin';
|
|
7
|
+
import { useSetMemberStatus } from '../../../application/useSetMemberStatus';
|
|
8
|
+
import { useUserDetailContext } from '../../userDetailContext';
|
|
9
|
+
import { MemberEntity } from '../../../domain/member';
|
|
10
|
+
import { ConfirmDialog } from '@orthacms/design-system';
|
|
11
|
+
import { PasswordResetCard } from '../../components/PasswordResetCard';
|
|
12
|
+
/** Intl descriptors for {@link UserAccessPage}, co-located with the component. */
|
|
13
|
+
const messages = defineMessages({
|
|
14
|
+
title: { id: 'users.access.title', defaultMessage: 'Sign-in access' },
|
|
15
|
+
activeTitle: {
|
|
16
|
+
id: 'users.access.activeTitle',
|
|
17
|
+
defaultMessage: 'This member can sign in'
|
|
18
|
+
},
|
|
19
|
+
activeBody: {
|
|
20
|
+
id: 'users.access.activeBody',
|
|
21
|
+
defaultMessage: 'Suspending blocks sign-in and revokes active sessions. Their workspace memberships and authored content are kept, so reactivating restores access immediately.'
|
|
22
|
+
},
|
|
23
|
+
disabledTitle: {
|
|
24
|
+
id: 'users.access.disabledTitle',
|
|
25
|
+
defaultMessage: 'This member is suspended'
|
|
26
|
+
},
|
|
27
|
+
disabledBody: {
|
|
28
|
+
id: 'users.access.disabledBody',
|
|
29
|
+
defaultMessage: 'They can’t sign in. Reactivate to restore access — memberships and content were preserved.'
|
|
30
|
+
},
|
|
31
|
+
pendingTitle: {
|
|
32
|
+
id: 'users.access.pendingTitle',
|
|
33
|
+
defaultMessage: 'Invite not accepted yet'
|
|
34
|
+
},
|
|
35
|
+
pendingBody: {
|
|
36
|
+
id: 'users.access.pendingBody',
|
|
37
|
+
defaultMessage: 'This member hasn’t accepted their invite, so there’s no sign-in access to suspend yet.'
|
|
38
|
+
},
|
|
39
|
+
suspend: { id: 'users.access.suspend', defaultMessage: 'Suspend member' },
|
|
40
|
+
reactivate: {
|
|
41
|
+
id: 'users.access.reactivate',
|
|
42
|
+
defaultMessage: 'Reactivate member'
|
|
43
|
+
},
|
|
44
|
+
confirmSuspendTitle: {
|
|
45
|
+
id: 'users.access.confirmSuspendTitle',
|
|
46
|
+
defaultMessage: 'Suspend {name}?'
|
|
47
|
+
},
|
|
48
|
+
confirmSuspendBody: {
|
|
49
|
+
id: 'users.access.confirmSuspendBody',
|
|
50
|
+
defaultMessage: 'They’ll be signed out everywhere and blocked from signing in until reactivated.'
|
|
51
|
+
},
|
|
52
|
+
confirmReactivateTitle: {
|
|
53
|
+
id: 'users.access.confirmReactivateTitle',
|
|
54
|
+
defaultMessage: 'Reactivate {name}?'
|
|
55
|
+
},
|
|
56
|
+
confirmReactivateBody: {
|
|
57
|
+
id: 'users.access.confirmReactivateBody',
|
|
58
|
+
defaultMessage: 'They’ll be able to sign in again right away.'
|
|
59
|
+
},
|
|
60
|
+
lastAdmin: {
|
|
61
|
+
id: 'users.access.lastAdmin',
|
|
62
|
+
defaultMessage: 'This member is the last remaining admin and can’t be suspended. Promote another member to admin first.'
|
|
63
|
+
},
|
|
64
|
+
self: {
|
|
65
|
+
id: 'users.access.self',
|
|
66
|
+
defaultMessage: 'You can’t suspend your own account.'
|
|
67
|
+
},
|
|
68
|
+
suspended: {
|
|
69
|
+
id: 'users.access.suspended',
|
|
70
|
+
defaultMessage: 'Suspended {name}.'
|
|
71
|
+
},
|
|
72
|
+
reactivated: {
|
|
73
|
+
id: 'users.access.reactivated',
|
|
74
|
+
defaultMessage: 'Reactivated {name}.'
|
|
75
|
+
},
|
|
76
|
+
failed: {
|
|
77
|
+
id: 'users.access.failed',
|
|
78
|
+
defaultMessage: 'Couldn’t update sign-in access. Please try again.'
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
/**
|
|
82
|
+
* The Access tab: everything that governs whether — and how — this member gets
|
|
83
|
+
* into the product. Two cards:
|
|
84
|
+
*
|
|
85
|
+
* - **sign-in access** — suspend or reactivate. Mirrors the server's lifecycle:
|
|
86
|
+
* only `active` can be suspended, only `disabled` reactivated, and `pending`
|
|
87
|
+
* (un-accepted invite) is read-only. The last active admin and your own
|
|
88
|
+
* account can't be suspended; the button explains why instead of failing on
|
|
89
|
+
* submit.
|
|
90
|
+
* - **password** — generate a single-use reset link for the member
|
|
91
|
+
* ({@link PasswordResetCard}).
|
|
92
|
+
*
|
|
93
|
+
* The two belong on one tab because they answer the same question from either
|
|
94
|
+
* side: this is where an admin goes when someone can't get in, whether the
|
|
95
|
+
* reason is that they were locked out or that they forgot their password.
|
|
96
|
+
*/
|
|
97
|
+
export function UserAccessPage() {
|
|
98
|
+
const intl = useIntl();
|
|
99
|
+
const { member } = useUserDetailContext();
|
|
100
|
+
const auth = useAuth();
|
|
101
|
+
const setStatus = useSetMemberStatus();
|
|
102
|
+
const [confirming, setConfirming] = useState(false);
|
|
103
|
+
const isDisabled = member.status === 'disabled';
|
|
104
|
+
const isPending = member.status === 'pending';
|
|
105
|
+
// Mirror the server's guardrails: you can't suspend yourself or the sole
|
|
106
|
+
// admin. `lastAdmin` only blocks the suspend direction — reactivating a
|
|
107
|
+
// disabled member is always allowed.
|
|
108
|
+
const removal = MemberEntity.of(member).canBeRemoved(auth.user?.id);
|
|
109
|
+
const blockedReason = !removal.ok && removal.reason === 'self'
|
|
110
|
+
? messages.self
|
|
111
|
+
: !removal.ok && removal.reason === 'lastAdmin' && !isDisabled
|
|
112
|
+
? messages.lastAdmin
|
|
113
|
+
: null;
|
|
114
|
+
const card = isPending
|
|
115
|
+
? {
|
|
116
|
+
icon: MailCheck,
|
|
117
|
+
title: messages.pendingTitle,
|
|
118
|
+
body: messages.pendingBody
|
|
119
|
+
}
|
|
120
|
+
: isDisabled
|
|
121
|
+
? {
|
|
122
|
+
icon: Ban,
|
|
123
|
+
title: messages.disabledTitle,
|
|
124
|
+
body: messages.disabledBody
|
|
125
|
+
}
|
|
126
|
+
: {
|
|
127
|
+
icon: ShieldCheck,
|
|
128
|
+
title: messages.activeTitle,
|
|
129
|
+
body: messages.activeBody
|
|
130
|
+
};
|
|
131
|
+
const Icon = card.icon;
|
|
132
|
+
const run = () => {
|
|
133
|
+
setStatus.mutate({ id: member.id, disabled: !isDisabled }, {
|
|
134
|
+
onSuccess: (updated) => {
|
|
135
|
+
setConfirming(false);
|
|
136
|
+
toast.success(intl.formatMessage(isDisabled
|
|
137
|
+
? messages.reactivated
|
|
138
|
+
: messages.suspended, { name: updated.name }));
|
|
139
|
+
},
|
|
140
|
+
onError: () => {
|
|
141
|
+
setConfirming(false);
|
|
142
|
+
toast.error(intl.formatMessage(messages.failed));
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
};
|
|
146
|
+
return (_jsxs("div", { className: "flex flex-col gap-6", children: [_jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsxs(CardTitle, { className: "flex items-center gap-2", children: [_jsx(Icon, { "aria-hidden": true, className: "size-5 text-muted-foreground" }), intl.formatMessage(card.title)] }), _jsx(CardDescription, { children: intl.formatMessage(card.body) })] }), !isPending ? (_jsxs(CardContent, { className: "space-y-3", children: [blockedReason ? (_jsx(Alert, { children: _jsx(AlertDescription, { children: intl.formatMessage(blockedReason) }) })) : null, _jsx(Button, { variant: isDisabled ? 'default' : 'outline', onClick: () => setConfirming(true), disabled: blockedReason !== null || setStatus.isPending, children: intl.formatMessage(isDisabled
|
|
147
|
+
? messages.reactivate
|
|
148
|
+
: messages.suspend) })] })) : null, _jsx(ConfirmDialog, { open: confirming, onOpenChange: setConfirming, busy: setStatus.isPending, title: intl.formatMessage(isDisabled
|
|
149
|
+
? messages.confirmReactivateTitle
|
|
150
|
+
: messages.confirmSuspendTitle, { name: member.name }), description: intl.formatMessage(isDisabled
|
|
151
|
+
? messages.confirmReactivateBody
|
|
152
|
+
: messages.confirmSuspendBody), confirmLabel: intl.formatMessage(isDisabled ? messages.reactivate : messages.suspend), confirmVariant: isDisabled ? 'default' : 'destructive', onConfirm: run })] }), _jsx(PasswordResetCard, { member: member })] }));
|
|
153
|
+
}
|
|
@@ -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/presentation/pages/UserActivityPage/index.tsx"],"names":[],"mappings":"AAgQA;;;;;GAKG;AACH,wBAAgB,gBAAgB,gCA6F/B"}
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useMemo, useState } from 'react';
|
|
3
|
+
import { defineMessages, useIntl } from 'react-intl';
|
|
4
|
+
import { Activity, Archive, ArchiveRestore, Ban, Building2, CircleCheck, FileText, FolderPlus, Image, KeyRound, LogIn, LogOut, MailX, Pencil, Send, ShieldCheck, Trash2, UserMinus, UserPlus } from 'lucide-react';
|
|
5
|
+
import { Alert, AlertDescription, Button, Card, CardContent, CardDescription, CardHeader, CardTitle, Skeleton, cn } from '@orthacms/design-system';
|
|
6
|
+
import { useHasPermission } from '@orthacms/identity-admin';
|
|
7
|
+
import { formatActivityAction, useActivityLog } from '@orthacms/activity-admin';
|
|
8
|
+
import { MembersPagination } from '../../components/MembersPagination';
|
|
9
|
+
import { useUserDetailContext } from '../../userDetailContext';
|
|
10
|
+
/** Default page size for the per-user activity timeline (a pagination option). */
|
|
11
|
+
const DEFAULT_PAGE_SIZE = 25;
|
|
12
|
+
/** Intl descriptors for {@link UserActivityPage}. */
|
|
13
|
+
const messages = defineMessages({
|
|
14
|
+
title: { id: 'users.activity.title', defaultMessage: 'Activity' },
|
|
15
|
+
description: {
|
|
16
|
+
id: 'users.activity.description',
|
|
17
|
+
defaultMessage: 'A timeline of changes to this member’s account.'
|
|
18
|
+
},
|
|
19
|
+
empty: {
|
|
20
|
+
id: 'users.activity.empty',
|
|
21
|
+
defaultMessage: 'No recorded activity yet.'
|
|
22
|
+
},
|
|
23
|
+
error: {
|
|
24
|
+
id: 'users.activity.error',
|
|
25
|
+
defaultMessage: 'Couldn’t load activity. Please try again.'
|
|
26
|
+
},
|
|
27
|
+
retry: { id: 'users.activity.retry', defaultMessage: 'Retry' },
|
|
28
|
+
system: { id: 'users.activity.system', defaultMessage: 'System' },
|
|
29
|
+
by: { id: 'users.activity.by', defaultMessage: 'by {actor}' }
|
|
30
|
+
});
|
|
31
|
+
/**
|
|
32
|
+
* Per-kind **presentation** — an icon and a tinted chip class, so an invite
|
|
33
|
+
* reads differently from a suspension at a glance. The *label* is not here on
|
|
34
|
+
* purpose: it comes from `activity-admin`'s `formatActivityAction`, the one
|
|
35
|
+
* kind→label catalogue in the admin.
|
|
36
|
+
*
|
|
37
|
+
* This map used to own labels too, and it knew twelve kinds. The tab's query is
|
|
38
|
+
* "everything about *or by* this member", so it surfaces every kind the actor
|
|
39
|
+
* touched — and each of the other nineteen rendered as a raw dotted wire token
|
|
40
|
+
* (`media.asset.uploaded`, `token.created`, `workspace.content_granted`) in a
|
|
41
|
+
* member's timeline. A second catalogue is a second thing to forget; a missing
|
|
42
|
+
* icon here only costs a neutral chip.
|
|
43
|
+
*/
|
|
44
|
+
const KIND_STYLE = {
|
|
45
|
+
'user.invited': {
|
|
46
|
+
icon: UserPlus,
|
|
47
|
+
className: 'bg-blue-500/10 text-blue-600'
|
|
48
|
+
},
|
|
49
|
+
'user.invite_resent': {
|
|
50
|
+
icon: Send,
|
|
51
|
+
className: 'bg-blue-500/10 text-blue-600'
|
|
52
|
+
},
|
|
53
|
+
'user.invite_revoked': {
|
|
54
|
+
icon: MailX,
|
|
55
|
+
className: 'bg-rose-500/10 text-rose-600'
|
|
56
|
+
},
|
|
57
|
+
'user.activated': {
|
|
58
|
+
icon: CircleCheck,
|
|
59
|
+
className: 'bg-emerald-500/10 text-emerald-600'
|
|
60
|
+
},
|
|
61
|
+
'user.profile_updated': {
|
|
62
|
+
icon: Pencil,
|
|
63
|
+
className: 'bg-indigo-500/10 text-indigo-600'
|
|
64
|
+
},
|
|
65
|
+
'user.role_changed': {
|
|
66
|
+
icon: ShieldCheck,
|
|
67
|
+
className: 'bg-violet-500/10 text-violet-600'
|
|
68
|
+
},
|
|
69
|
+
'user.suspended': {
|
|
70
|
+
icon: Ban,
|
|
71
|
+
className: 'bg-amber-500/10 text-amber-600'
|
|
72
|
+
},
|
|
73
|
+
'user.reactivated': {
|
|
74
|
+
icon: CircleCheck,
|
|
75
|
+
className: 'bg-emerald-500/10 text-emerald-600'
|
|
76
|
+
},
|
|
77
|
+
'user.password_changed': {
|
|
78
|
+
icon: KeyRound,
|
|
79
|
+
className: 'bg-violet-500/10 text-violet-600'
|
|
80
|
+
},
|
|
81
|
+
'user.password_reset_issued': {
|
|
82
|
+
icon: KeyRound,
|
|
83
|
+
className: 'bg-amber-500/10 text-amber-600'
|
|
84
|
+
},
|
|
85
|
+
'user.signed_in': {
|
|
86
|
+
icon: LogIn,
|
|
87
|
+
className: 'bg-slate-500/10 text-slate-600'
|
|
88
|
+
},
|
|
89
|
+
'user.signed_out': {
|
|
90
|
+
icon: LogOut,
|
|
91
|
+
className: 'bg-slate-500/10 text-slate-600'
|
|
92
|
+
},
|
|
93
|
+
'workspace.created': {
|
|
94
|
+
icon: Building2,
|
|
95
|
+
className: 'bg-teal-500/10 text-teal-600'
|
|
96
|
+
},
|
|
97
|
+
'workspace.updated': {
|
|
98
|
+
icon: Pencil,
|
|
99
|
+
className: 'bg-teal-500/10 text-teal-600'
|
|
100
|
+
},
|
|
101
|
+
'workspace.archived': {
|
|
102
|
+
icon: Archive,
|
|
103
|
+
className: 'bg-amber-500/10 text-amber-600'
|
|
104
|
+
},
|
|
105
|
+
'workspace.unarchived': {
|
|
106
|
+
icon: ArchiveRestore,
|
|
107
|
+
className: 'bg-emerald-500/10 text-emerald-600'
|
|
108
|
+
},
|
|
109
|
+
'workspace.deleted': {
|
|
110
|
+
icon: Trash2,
|
|
111
|
+
className: 'bg-rose-500/10 text-rose-600'
|
|
112
|
+
},
|
|
113
|
+
'workspace.member_added': {
|
|
114
|
+
icon: UserPlus,
|
|
115
|
+
className: 'bg-teal-500/10 text-teal-600'
|
|
116
|
+
},
|
|
117
|
+
'workspace.member_removed': {
|
|
118
|
+
icon: UserMinus,
|
|
119
|
+
className: 'bg-rose-500/10 text-rose-600'
|
|
120
|
+
},
|
|
121
|
+
'workspace.content_granted': {
|
|
122
|
+
icon: ShieldCheck,
|
|
123
|
+
className: 'bg-teal-500/10 text-teal-600'
|
|
124
|
+
},
|
|
125
|
+
'workspace.content_revoked': {
|
|
126
|
+
icon: ShieldCheck,
|
|
127
|
+
className: 'bg-rose-500/10 text-rose-600'
|
|
128
|
+
},
|
|
129
|
+
'entry.published': {
|
|
130
|
+
icon: FileText,
|
|
131
|
+
className: 'bg-emerald-500/10 text-emerald-600'
|
|
132
|
+
},
|
|
133
|
+
'entry.unpublished': {
|
|
134
|
+
icon: FileText,
|
|
135
|
+
className: 'bg-amber-500/10 text-amber-600'
|
|
136
|
+
},
|
|
137
|
+
'token.created': {
|
|
138
|
+
icon: KeyRound,
|
|
139
|
+
className: 'bg-violet-500/10 text-violet-600'
|
|
140
|
+
},
|
|
141
|
+
'token.revoked': {
|
|
142
|
+
icon: KeyRound,
|
|
143
|
+
className: 'bg-rose-500/10 text-rose-600'
|
|
144
|
+
},
|
|
145
|
+
'media.asset.uploaded': {
|
|
146
|
+
icon: Image,
|
|
147
|
+
className: 'bg-blue-500/10 text-blue-600'
|
|
148
|
+
},
|
|
149
|
+
'media.asset.updated': {
|
|
150
|
+
icon: Pencil,
|
|
151
|
+
className: 'bg-indigo-500/10 text-indigo-600'
|
|
152
|
+
},
|
|
153
|
+
'media.asset.moved': {
|
|
154
|
+
icon: FolderPlus,
|
|
155
|
+
className: 'bg-indigo-500/10 text-indigo-600'
|
|
156
|
+
},
|
|
157
|
+
'media.asset.deleted': {
|
|
158
|
+
icon: Trash2,
|
|
159
|
+
className: 'bg-rose-500/10 text-rose-600'
|
|
160
|
+
},
|
|
161
|
+
'media.folder.created': {
|
|
162
|
+
icon: FolderPlus,
|
|
163
|
+
className: 'bg-blue-500/10 text-blue-600'
|
|
164
|
+
},
|
|
165
|
+
'media.folder.renamed': {
|
|
166
|
+
icon: Pencil,
|
|
167
|
+
className: 'bg-indigo-500/10 text-indigo-600'
|
|
168
|
+
},
|
|
169
|
+
'media.folder.deleted': {
|
|
170
|
+
icon: Trash2,
|
|
171
|
+
className: 'bg-rose-500/10 text-rose-600'
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
const FALLBACK_STYLE = {
|
|
175
|
+
icon: Activity,
|
|
176
|
+
className: 'bg-muted text-muted-foreground'
|
|
177
|
+
};
|
|
178
|
+
/** One timeline entry. */
|
|
179
|
+
function ActivityRow({ event }) {
|
|
180
|
+
const intl = useIntl();
|
|
181
|
+
const style = KIND_STYLE[event.kind];
|
|
182
|
+
const title = formatActivityAction(intl, event.kind);
|
|
183
|
+
const Icon = style?.icon ?? FALLBACK_STYLE.icon;
|
|
184
|
+
const chipClassName = style?.className ?? FALLBACK_STYLE.className;
|
|
185
|
+
const actor = event.actor?.email ?? intl.formatMessage(messages.system);
|
|
186
|
+
return (_jsxs("li", { className: "flex items-center gap-3 border-b py-3 last:border-b-0", children: [_jsx("span", { "aria-hidden": true, className: cn('flex size-8 shrink-0 items-center justify-center rounded-full', chipClassName), children: _jsx(Icon, { "aria-hidden": true, className: "size-4" }) }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("p", { className: "text-sm font-medium", children: title }), _jsxs("p", { className: "text-xs text-muted-foreground", children: [intl.formatDate(event.at, {
|
|
187
|
+
dateStyle: 'medium',
|
|
188
|
+
timeStyle: 'short'
|
|
189
|
+
}), ' ', intl.formatMessage(messages.by, { actor })] })] })] }));
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* The Activity tab: a timeline of audit events whose subject is this member,
|
|
193
|
+
* reusing the activity plugin's `useActivityLog` with a pinned `subjectId`
|
|
194
|
+
* filter. Gated on `activity:read` (the rail hides it otherwise). Paginated
|
|
195
|
+
* with the shared members pagination control.
|
|
196
|
+
*/
|
|
197
|
+
export function UserActivityPage() {
|
|
198
|
+
const intl = useIntl();
|
|
199
|
+
const { member } = useUserDetailContext();
|
|
200
|
+
const canRead = useHasPermission('activity:read');
|
|
201
|
+
const [page, setPage] = useState(1);
|
|
202
|
+
const [pageSize, setPageSize] = useState(DEFAULT_PAGE_SIZE);
|
|
203
|
+
// The member's personal log: events *about* them (`subjectType=user` and
|
|
204
|
+
// `subjectId=:id` — e.g. they were added/removed from a workspace, their
|
|
205
|
+
// role changed) OR events they *performed* (`actorId=:id` — e.g. they
|
|
206
|
+
// created a workspace, signed in). Serialised to the wire filter grammar the
|
|
207
|
+
// activity endpoint already parses.
|
|
208
|
+
const filter = useMemo(() => JSON.stringify({
|
|
209
|
+
or: [
|
|
210
|
+
{
|
|
211
|
+
and: [
|
|
212
|
+
{ field: 'subjectType', op: 'eq', value: 'user' },
|
|
213
|
+
{ field: 'subjectId', op: 'eq', value: member.id }
|
|
214
|
+
]
|
|
215
|
+
},
|
|
216
|
+
{ field: 'actorId', op: 'eq', value: member.id }
|
|
217
|
+
]
|
|
218
|
+
}), [member.id]);
|
|
219
|
+
const { data, isPending, isError, refetch } = useActivityLog({ filter, page, pageSize }, canRead);
|
|
220
|
+
const total = data?.total ?? 0;
|
|
221
|
+
const effectivePageSize = data?.pageSize ?? pageSize;
|
|
222
|
+
const pageCount = Math.max(1, Math.ceil(total / effectivePageSize));
|
|
223
|
+
const events = data?.items ?? [];
|
|
224
|
+
return (_jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsx(CardTitle, { children: intl.formatMessage(messages.title) }), _jsx(CardDescription, { children: intl.formatMessage(messages.description) })] }), _jsx(CardContent, { className: "space-y-3", children: isPending ? (_jsxs(_Fragment, { children: [_jsx(Skeleton, { className: "h-12 w-full rounded-lg" }), _jsx(Skeleton, { className: "h-12 w-full rounded-lg" }), _jsx(Skeleton, { className: "h-12 w-full rounded-lg" })] })) : isError ? (_jsx(Alert, { variant: "destructive", role: "alert", children: _jsxs(AlertDescription, { className: "flex flex-wrap items-center justify-between gap-3", children: [_jsx("span", { children: intl.formatMessage(messages.error) }), _jsx(Button, { variant: "outline", size: "sm", onClick: () => refetch(), children: intl.formatMessage(messages.retry) })] }) })) : events.length === 0 ? (_jsx("p", { className: "py-6 text-center text-sm text-muted-foreground", children: intl.formatMessage(messages.empty) })) : (_jsxs(_Fragment, { children: [_jsx("ul", { children: events.map((event) => (_jsx(ActivityRow, { event: event }, event.id))) }), _jsx(MembersPagination, { page: page, pageCount: pageCount, pageSize: effectivePageSize, total: total, onPageChange: setPage, onPageSizeChange: (next) => {
|
|
225
|
+
setPageSize(next);
|
|
226
|
+
setPage(1);
|
|
227
|
+
} })] })) })] }));
|
|
228
|
+
}
|
|
@@ -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/presentation/pages/UserGeneralPage/index.tsx"],"names":[],"mappings":"AAmDA;;;;GAIG;AACH,wBAAgB,eAAe,gCAqF9B"}
|
|
@@ -0,0 +1,72 @@
|
|
|
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 { Button, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, InputField, Spinner, toast } from '@orthacms/design-system';
|
|
5
|
+
import { useHasPermission } from '@orthacms/identity-admin';
|
|
6
|
+
import { useUpdateMember } from '../../../application/useUpdateMember';
|
|
7
|
+
import { useUserDetailContext } from '../../userDetailContext';
|
|
8
|
+
/** Server-side cap on the display name (mirrors the users plugin). */
|
|
9
|
+
const NAME_MAX_LENGTH = 80;
|
|
10
|
+
/** Intl descriptors for {@link UserGeneralPage}, co-located with the component. */
|
|
11
|
+
const messages = defineMessages({
|
|
12
|
+
title: { id: 'users.general.title', defaultMessage: 'General' },
|
|
13
|
+
description: {
|
|
14
|
+
id: 'users.general.description',
|
|
15
|
+
defaultMessage: 'The member’s display name and contact email.'
|
|
16
|
+
},
|
|
17
|
+
nameLabel: { id: 'users.general.nameLabel', defaultMessage: 'Full name' },
|
|
18
|
+
nameTooLong: {
|
|
19
|
+
id: 'users.general.nameTooLong',
|
|
20
|
+
defaultMessage: 'Keep the name under {max} characters.'
|
|
21
|
+
},
|
|
22
|
+
emailLabel: { id: 'users.general.emailLabel', defaultMessage: 'Email' },
|
|
23
|
+
emailHint: {
|
|
24
|
+
id: 'users.general.emailHint',
|
|
25
|
+
defaultMessage: 'Email is the sign-in identifier and can’t be changed here.'
|
|
26
|
+
},
|
|
27
|
+
save: { id: 'users.general.save', defaultMessage: 'Save changes' },
|
|
28
|
+
discard: { id: 'users.general.discard', defaultMessage: 'Discard' },
|
|
29
|
+
saved: {
|
|
30
|
+
id: 'users.general.saved',
|
|
31
|
+
defaultMessage: 'Saved changes to {name}.'
|
|
32
|
+
},
|
|
33
|
+
failed: {
|
|
34
|
+
id: 'users.general.failed',
|
|
35
|
+
defaultMessage: 'Couldn’t save the changes. Please try again.'
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
/**
|
|
39
|
+
* The General tab: edit the member's display name; the email is read-only. The
|
|
40
|
+
* Save/Discard pair only enables on a real change. Edit controls require
|
|
41
|
+
* `users:update`; without it the fields render disabled.
|
|
42
|
+
*/
|
|
43
|
+
export function UserGeneralPage() {
|
|
44
|
+
const intl = useIntl();
|
|
45
|
+
const { member } = useUserDetailContext();
|
|
46
|
+
const canManage = useHasPermission('users:update');
|
|
47
|
+
const update = useUpdateMember();
|
|
48
|
+
const [name, setName] = useState(member.name);
|
|
49
|
+
const trimmed = name.trim();
|
|
50
|
+
const tooLong = trimmed.length > NAME_MAX_LENGTH;
|
|
51
|
+
const dirty = trimmed !== member.name.trim();
|
|
52
|
+
const canSave = canManage && dirty && trimmed.length > 0 && !tooLong;
|
|
53
|
+
const save = () => {
|
|
54
|
+
if (!canSave) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
update.mutate({ id: member.id, name: trimmed }, {
|
|
58
|
+
onSuccess: (saved) => {
|
|
59
|
+
setName(saved.name);
|
|
60
|
+
toast.success(intl.formatMessage(messages.saved, { name: saved.name }));
|
|
61
|
+
},
|
|
62
|
+
onError: () => {
|
|
63
|
+
toast.error(intl.formatMessage(messages.failed));
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
};
|
|
67
|
+
return (_jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsx(CardTitle, { children: intl.formatMessage(messages.title) }), _jsx(CardDescription, { children: intl.formatMessage(messages.description) })] }), _jsxs(CardContent, { className: "space-y-4", children: [_jsx(InputField, { id: "user-general-name", label: intl.formatMessage(messages.nameLabel), value: name, maxLength: NAME_MAX_LENGTH + 1, disabled: !canManage || update.isPending, onChange: (event) => setName(event.target.value), error: tooLong
|
|
68
|
+
? intl.formatMessage(messages.nameTooLong, {
|
|
69
|
+
max: NAME_MAX_LENGTH
|
|
70
|
+
})
|
|
71
|
+
: undefined }), _jsx(InputField, { id: "user-general-email", label: intl.formatMessage(messages.emailLabel), value: member.email, description: intl.formatMessage(messages.emailHint), readOnly: true, disabled: true })] }), canManage ? (_jsxs(CardFooter, { className: "justify-end gap-2", children: [_jsx(Button, { variant: "ghost", onClick: () => setName(member.name), disabled: !dirty || update.isPending, children: intl.formatMessage(messages.discard) }), _jsxs(Button, { onClick: save, disabled: !canSave || update.isPending, children: [update.isPending ? _jsx(Spinner, {}) : null, intl.formatMessage(messages.save)] })] })) : null] }));
|
|
72
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A tiny, non-interactive mock of the admin chrome — a dark sidebar rail beside
|
|
3
|
+
* a content canvas with a couple of placeholder rows — rendered in a **fixed**
|
|
4
|
+
* light or dark palette (never the app tokens), so each theme card previews the
|
|
5
|
+
* look it applies regardless of the theme currently in effect. `system` shows
|
|
6
|
+
* the two halves side by side.
|
|
7
|
+
*/
|
|
8
|
+
export declare function ThemePreview({ variant }: {
|
|
9
|
+
variant: 'light' | 'dark' | 'system';
|
|
10
|
+
}): import("react").JSX.Element;
|
|
11
|
+
//# sourceMappingURL=ThemePreview.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ThemePreview.d.ts","sourceRoot":"","sources":["../../../../../src/lib/presentation/pages/UserPreferencesPage/ThemePreview.tsx"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,EACzB,OAAO,EACV,EAAE;IACC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;CACxC,+BAkBA"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { cn } from '@orthacms/design-system';
|
|
3
|
+
/**
|
|
4
|
+
* A tiny, non-interactive mock of the admin chrome — a dark sidebar rail beside
|
|
5
|
+
* a content canvas with a couple of placeholder rows — rendered in a **fixed**
|
|
6
|
+
* light or dark palette (never the app tokens), so each theme card previews the
|
|
7
|
+
* look it applies regardless of the theme currently in effect. `system` shows
|
|
8
|
+
* the two halves side by side.
|
|
9
|
+
*/
|
|
10
|
+
export function ThemePreview({ variant }) {
|
|
11
|
+
if (variant === 'system') {
|
|
12
|
+
return (_jsxs("div", { className: "flex h-16 w-full overflow-hidden rounded-md border border-border", children: [_jsx("div", { className: "w-1/2 overflow-hidden border-r border-border", children: _jsx(Panel, { tone: "light", edge: false }) }), _jsx("div", { className: "w-1/2 overflow-hidden", children: _jsx(Panel, { tone: "dark", edge: false }) })] }));
|
|
13
|
+
}
|
|
14
|
+
return (_jsx("div", { className: "h-16 w-full overflow-hidden rounded-md border border-border", children: _jsx(Panel, { tone: variant, edge: true }) }));
|
|
15
|
+
}
|
|
16
|
+
/** One themed panel: a rail + canvas with placeholder bars, in a fixed tone. */
|
|
17
|
+
function Panel({ tone, edge }) {
|
|
18
|
+
const dark = tone === 'dark';
|
|
19
|
+
return (_jsxs("div", { className: cn('flex h-full w-full', edge && 'rounded-[3px]', dark ? 'bg-neutral-900' : 'bg-white'), children: [_jsxs("div", { className: "flex w-1/3 flex-col gap-1 bg-neutral-800 p-1.5", children: [_jsx("span", { className: "h-1 w-3/4 rounded-full bg-orange-400/90" }), _jsx("span", { className: "h-1 w-full rounded-full bg-white/25" }), _jsx("span", { className: "h-1 w-2/3 rounded-full bg-white/25" })] }), _jsxs("div", { className: "flex flex-1 flex-col gap-1.5 p-2", children: [_jsx("span", { className: cn('h-1.5 w-1/2 rounded-full', dark ? 'bg-neutral-500' : 'bg-neutral-300') }), _jsx("span", { className: cn('h-4 w-full rounded-sm border', dark
|
|
20
|
+
? 'border-neutral-700 bg-neutral-800'
|
|
21
|
+
: 'border-neutral-200 bg-neutral-50') }), _jsx("span", { className: cn('h-4 w-full rounded-sm border', dark
|
|
22
|
+
? 'border-neutral-700 bg-neutral-800'
|
|
23
|
+
: 'border-neutral-200 bg-neutral-50') })] })] }));
|
|
24
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The Preferences tab (shown only on your **own** profile): pick the colour
|
|
3
|
+
* theme (Light / Dark / System). Selection is optimistic — the app re-themes
|
|
4
|
+
* the instant you choose, via the shared {@link useAppearance} provider — then
|
|
5
|
+
* persisted to the server; a failed save rolls the choice back and surfaces a
|
|
6
|
+
* toast. The radio group is the accessible backbone; each option is a full card
|
|
7
|
+
* with a live preview.
|
|
8
|
+
*/
|
|
9
|
+
export declare function UserPreferencesPage(): import("react").JSX.Element;
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/lib/presentation/pages/UserPreferencesPage/index.tsx"],"names":[],"mappings":"AAiHA;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,gCAyIlC"}
|