@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.
Files changed (328) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +7 -0
  3. package/dist/index.d.ts +6 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +3 -0
  6. package/dist/lib/api/useAddWorkspaceMember/index.d.ts +16 -0
  7. package/dist/lib/api/useAddWorkspaceMember/index.d.ts.map +1 -0
  8. package/dist/lib/api/useInviteMember/index.d.ts +17 -0
  9. package/dist/lib/api/useInviteMember/index.d.ts.map +1 -0
  10. package/dist/lib/api/useMembers/index.d.ts +15 -0
  11. package/dist/lib/api/useMembers/index.d.ts.map +1 -0
  12. package/dist/lib/api/useMembersMutation/index.d.ts +13 -0
  13. package/dist/lib/api/useMembersMutation/index.d.ts.map +1 -0
  14. package/dist/lib/api/useRemoveWorkspaceMember/index.d.ts +15 -0
  15. package/dist/lib/api/useRemoveWorkspaceMember/index.d.ts.map +1 -0
  16. package/dist/lib/api/useResendInvite/index.d.ts +8 -0
  17. package/dist/lib/api/useResendInvite/index.d.ts.map +1 -0
  18. package/dist/lib/api/useRevokeInvite/index.d.ts +7 -0
  19. package/dist/lib/api/useRevokeInvite/index.d.ts.map +1 -0
  20. package/dist/lib/api/useRevokeSession/index.d.ts +15 -0
  21. package/dist/lib/api/useRevokeSession/index.d.ts.map +1 -0
  22. package/dist/lib/api/useSetMemberStatus/index.d.ts +15 -0
  23. package/dist/lib/api/useSetMemberStatus/index.d.ts.map +1 -0
  24. package/dist/lib/api/useUpdateMember/index.d.ts +15 -0
  25. package/dist/lib/api/useUpdateMember/index.d.ts.map +1 -0
  26. package/dist/lib/api/useUserDetail/index.d.ts +9 -0
  27. package/dist/lib/api/useUserDetail/index.d.ts.map +1 -0
  28. package/dist/lib/api/useUserSessions/index.d.ts +25 -0
  29. package/dist/lib/api/useUserSessions/index.d.ts.map +1 -0
  30. package/dist/lib/api/useWorkspaceOptions/index.d.ts +18 -0
  31. package/dist/lib/api/useWorkspaceOptions/index.d.ts.map +1 -0
  32. package/dist/lib/application/useAddWorkspaceMember/index.d.ts +11 -0
  33. package/dist/lib/application/useAddWorkspaceMember/index.d.ts.map +1 -0
  34. package/dist/lib/application/useAddWorkspaceMember/index.js +21 -0
  35. package/dist/lib/application/useInviteMember/index.d.ts +12 -0
  36. package/dist/lib/application/useInviteMember/index.d.ts.map +1 -0
  37. package/dist/lib/application/useInviteMember/index.js +12 -0
  38. package/dist/lib/application/useInviteMemberFlow/index.d.ts +59 -0
  39. package/dist/lib/application/useInviteMemberFlow/index.d.ts.map +1 -0
  40. package/dist/lib/application/useInviteMemberFlow/index.js +47 -0
  41. package/dist/lib/application/useIssuePasswordReset/index.d.ts +12 -0
  42. package/dist/lib/application/useIssuePasswordReset/index.d.ts.map +1 -0
  43. package/dist/lib/application/useIssuePasswordReset/index.js +14 -0
  44. package/dist/lib/application/useMembers/index.d.ts +15 -0
  45. package/dist/lib/application/useMembers/index.d.ts.map +1 -0
  46. package/dist/lib/application/useMembers/index.js +23 -0
  47. package/dist/lib/application/useMembersMutation/index.d.ts +14 -0
  48. package/dist/lib/application/useMembersMutation/index.d.ts.map +1 -0
  49. package/dist/lib/application/useMembersMutation/index.js +25 -0
  50. package/dist/lib/application/usePreferences/index.d.ts +15 -0
  51. package/dist/lib/application/usePreferences/index.d.ts.map +1 -0
  52. package/dist/lib/application/usePreferences/index.js +28 -0
  53. package/dist/lib/application/useRemoveWorkspaceMember/index.d.ts +10 -0
  54. package/dist/lib/application/useRemoveWorkspaceMember/index.d.ts.map +1 -0
  55. package/dist/lib/application/useRemoveWorkspaceMember/index.js +20 -0
  56. package/dist/lib/application/useResendInvite/index.d.ts +10 -0
  57. package/dist/lib/application/useResendInvite/index.d.ts.map +1 -0
  58. package/dist/lib/application/useResendInvite/index.js +12 -0
  59. package/dist/lib/application/useRevokeInvite/index.d.ts +7 -0
  60. package/dist/lib/application/useRevokeInvite/index.d.ts.map +1 -0
  61. package/dist/lib/application/useRevokeInvite/index.js +10 -0
  62. package/dist/lib/application/useRevokeSession/index.d.ts +10 -0
  63. package/dist/lib/application/useRevokeSession/index.d.ts.map +1 -0
  64. package/dist/lib/application/useRevokeSession/index.js +19 -0
  65. package/dist/lib/application/useSetMemberStatus/index.d.ts +11 -0
  66. package/dist/lib/application/useSetMemberStatus/index.d.ts.map +1 -0
  67. package/dist/lib/application/useSetMemberStatus/index.js +11 -0
  68. package/dist/lib/application/useUpdateMember/index.d.ts +11 -0
  69. package/dist/lib/application/useUpdateMember/index.d.ts.map +1 -0
  70. package/dist/lib/application/useUpdateMember/index.js +11 -0
  71. package/dist/lib/application/useUpdateTheme/index.d.ts +14 -0
  72. package/dist/lib/application/useUpdateTheme/index.d.ts.map +1 -0
  73. package/dist/lib/application/useUpdateTheme/index.js +25 -0
  74. package/dist/lib/application/useUserDetail/index.d.ts +9 -0
  75. package/dist/lib/application/useUserDetail/index.d.ts.map +1 -0
  76. package/dist/lib/application/useUserDetail/index.js +17 -0
  77. package/dist/lib/application/useUserSessions/index.d.ts +9 -0
  78. package/dist/lib/application/useUserSessions/index.d.ts.map +1 -0
  79. package/dist/lib/application/useUserSessions/index.js +17 -0
  80. package/dist/lib/application/useWorkspaceOptions/index.d.ts +10 -0
  81. package/dist/lib/application/useWorkspaceOptions/index.d.ts.map +1 -0
  82. package/dist/lib/application/useWorkspaceOptions/index.js +17 -0
  83. package/dist/lib/components/AccountMenu/index.d.ts +9 -0
  84. package/dist/lib/components/AccountMenu/index.d.ts.map +1 -0
  85. package/dist/lib/components/AddToWorkspacesDialog/index.d.ts +19 -0
  86. package/dist/lib/components/AddToWorkspacesDialog/index.d.ts.map +1 -0
  87. package/dist/lib/components/BackLink/index.d.ts +14 -0
  88. package/dist/lib/components/BackLink/index.d.ts.map +1 -0
  89. package/dist/lib/components/ConfirmDialog/index.d.ts +30 -0
  90. package/dist/lib/components/ConfirmDialog/index.d.ts.map +1 -0
  91. package/dist/lib/components/EditMemberDialog/index.d.ts +21 -0
  92. package/dist/lib/components/EditMemberDialog/index.d.ts.map +1 -0
  93. package/dist/lib/components/MemberAvatar/index.d.ts +24 -0
  94. package/dist/lib/components/MemberAvatar/index.d.ts.map +1 -0
  95. package/dist/lib/components/MembersEmpty/index.d.ts +16 -0
  96. package/dist/lib/components/MembersEmpty/index.d.ts.map +1 -0
  97. package/dist/lib/components/MembersNoAccess/index.d.ts +7 -0
  98. package/dist/lib/components/MembersNoAccess/index.d.ts.map +1 -0
  99. package/dist/lib/components/MembersPagination/index.d.ts +17 -0
  100. package/dist/lib/components/MembersPagination/index.d.ts.map +1 -0
  101. package/dist/lib/components/MembersSkeleton/index.d.ts +32 -0
  102. package/dist/lib/components/MembersSkeleton/index.d.ts.map +1 -0
  103. package/dist/lib/components/MembersTable/MemberRoleChip/index.d.ts +10 -0
  104. package/dist/lib/components/MembersTable/MemberRoleChip/index.d.ts.map +1 -0
  105. package/dist/lib/components/MembersTable/MemberRowActions/index.d.ts +16 -0
  106. package/dist/lib/components/MembersTable/MemberRowActions/index.d.ts.map +1 -0
  107. package/dist/lib/components/MembersTable/MemberStatusBadge/index.d.ts +10 -0
  108. package/dist/lib/components/MembersTable/MemberStatusBadge/index.d.ts.map +1 -0
  109. package/dist/lib/components/MembersTable/MemberWorkspaces/index.d.ts +10 -0
  110. package/dist/lib/components/MembersTable/MemberWorkspaces/index.d.ts.map +1 -0
  111. package/dist/lib/components/MembersTable/index.d.ts +12 -0
  112. package/dist/lib/components/MembersTable/index.d.ts.map +1 -0
  113. package/dist/lib/components/MembersToolbar/index.d.ts +13 -0
  114. package/dist/lib/components/MembersToolbar/index.d.ts.map +1 -0
  115. package/dist/lib/components/RolePicker/index.d.ts +18 -0
  116. package/dist/lib/components/RolePicker/index.d.ts.map +1 -0
  117. package/dist/lib/components/SessionCard/index.d.ts +15 -0
  118. package/dist/lib/components/SessionCard/index.d.ts.map +1 -0
  119. package/dist/lib/components/UserDetailLayout/UserDetailTabs/index.d.ts +13 -0
  120. package/dist/lib/components/UserDetailLayout/UserDetailTabs/index.d.ts.map +1 -0
  121. package/dist/lib/components/UserDetailLayout/UserHero/index.d.ts +10 -0
  122. package/dist/lib/components/UserDetailLayout/UserHero/index.d.ts.map +1 -0
  123. package/dist/lib/components/UserDetailLayout/UserSideRail/index.d.ts +12 -0
  124. package/dist/lib/components/UserDetailLayout/UserSideRail/index.d.ts.map +1 -0
  125. package/dist/lib/components/UserDetailLayout/UserStatsStrip/index.d.ts +10 -0
  126. package/dist/lib/components/UserDetailLayout/UserStatsStrip/index.d.ts.map +1 -0
  127. package/dist/lib/components/UserDetailLayout/index.d.ts +13 -0
  128. package/dist/lib/components/UserDetailLayout/index.d.ts.map +1 -0
  129. package/dist/lib/components/UserDetailRouter/index.d.ts +13 -0
  130. package/dist/lib/components/UserDetailRouter/index.d.ts.map +1 -0
  131. package/dist/lib/components/WorkspaceMembershipCard/index.d.ts +15 -0
  132. package/dist/lib/components/WorkspaceMembershipCard/index.d.ts.map +1 -0
  133. package/dist/lib/domain/member/index.d.ts +61 -0
  134. package/dist/lib/domain/member/index.d.ts.map +1 -0
  135. package/dist/lib/domain/member/index.js +61 -0
  136. package/dist/lib/domain/types/member/index.d.ts +90 -0
  137. package/dist/lib/domain/types/member/index.d.ts.map +1 -0
  138. package/dist/lib/domain/types/member/index.js +1 -0
  139. package/dist/lib/domain/types/session/index.d.ts +18 -0
  140. package/dist/lib/domain/types/session/index.d.ts.map +1 -0
  141. package/dist/lib/domain/types/session/index.js +1 -0
  142. package/dist/lib/domain/types/workspaceOption/index.d.ts +15 -0
  143. package/dist/lib/domain/types/workspaceOption/index.d.ts.map +1 -0
  144. package/dist/lib/domain/types/workspaceOption/index.js +1 -0
  145. package/dist/lib/domain/value-objects/email/index.d.ts +24 -0
  146. package/dist/lib/domain/value-objects/email/index.d.ts.map +1 -0
  147. package/dist/lib/domain/value-objects/email/index.js +45 -0
  148. package/dist/lib/infrastructure/httpMemberGateway/index.d.ts +12 -0
  149. package/dist/lib/infrastructure/httpMemberGateway/index.d.ts.map +1 -0
  150. package/dist/lib/infrastructure/httpMemberGateway/index.js +158 -0
  151. package/dist/lib/infrastructure/inviteLink/index.d.ts +13 -0
  152. package/dist/lib/infrastructure/inviteLink/index.d.ts.map +1 -0
  153. package/dist/lib/infrastructure/inviteLink/index.js +23 -0
  154. package/dist/lib/infrastructure/memberGateway/index.d.ts +103 -0
  155. package/dist/lib/infrastructure/memberGateway/index.d.ts.map +1 -0
  156. package/dist/lib/infrastructure/memberGateway/index.js +1 -0
  157. package/dist/lib/infrastructure/memberMapper/index.d.ts +59 -0
  158. package/dist/lib/infrastructure/memberMapper/index.d.ts.map +1 -0
  159. package/dist/lib/infrastructure/memberMapper/index.js +52 -0
  160. package/dist/lib/infrastructure/membersKeys/index.d.ts +37 -0
  161. package/dist/lib/infrastructure/membersKeys/index.d.ts.map +1 -0
  162. package/dist/lib/infrastructure/membersKeys/index.js +25 -0
  163. package/dist/lib/infrastructure/passwordResetLink/index.d.ts +13 -0
  164. package/dist/lib/infrastructure/passwordResetLink/index.d.ts.map +1 -0
  165. package/dist/lib/infrastructure/passwordResetLink/index.js +24 -0
  166. package/dist/lib/infrastructure/preferencesGateway/index.d.ts +37 -0
  167. package/dist/lib/infrastructure/preferencesGateway/index.d.ts.map +1 -0
  168. package/dist/lib/infrastructure/preferencesGateway/index.js +43 -0
  169. package/dist/lib/pages/InviteMemberPage/index.d.ts +7 -0
  170. package/dist/lib/pages/InviteMemberPage/index.d.ts.map +1 -0
  171. package/dist/lib/pages/MembersPage/index.d.ts +13 -0
  172. package/dist/lib/pages/MembersPage/index.d.ts.map +1 -0
  173. package/dist/lib/pages/UserAccessPage/index.d.ts +9 -0
  174. package/dist/lib/pages/UserAccessPage/index.d.ts.map +1 -0
  175. package/dist/lib/pages/UserActivityPage/index.d.ts +8 -0
  176. package/dist/lib/pages/UserActivityPage/index.d.ts.map +1 -0
  177. package/dist/lib/pages/UserGeneralPage/index.d.ts +7 -0
  178. package/dist/lib/pages/UserGeneralPage/index.d.ts.map +1 -0
  179. package/dist/lib/pages/UserRolesPage/index.d.ts +8 -0
  180. package/dist/lib/pages/UserRolesPage/index.d.ts.map +1 -0
  181. package/dist/lib/pages/UserSessionsPage/index.d.ts +7 -0
  182. package/dist/lib/pages/UserSessionsPage/index.d.ts.map +1 -0
  183. package/dist/lib/pages/UserWorkspacesPage/index.d.ts +8 -0
  184. package/dist/lib/pages/UserWorkspacesPage/index.d.ts.map +1 -0
  185. package/dist/lib/presentation/components/AccountMenu/index.d.ts +9 -0
  186. package/dist/lib/presentation/components/AccountMenu/index.d.ts.map +1 -0
  187. package/dist/lib/presentation/components/AccountMenu/index.js +42 -0
  188. package/dist/lib/presentation/components/AddToWorkspacesDialog/index.d.ts +19 -0
  189. package/dist/lib/presentation/components/AddToWorkspacesDialog/index.d.ts.map +1 -0
  190. package/dist/lib/presentation/components/AddToWorkspacesDialog/index.js +89 -0
  191. package/dist/lib/presentation/components/BackLink/index.d.ts +14 -0
  192. package/dist/lib/presentation/components/BackLink/index.d.ts.map +1 -0
  193. package/dist/lib/presentation/components/BackLink/index.js +12 -0
  194. package/dist/lib/presentation/components/InviteLinkDialog/index.d.ts +25 -0
  195. package/dist/lib/presentation/components/InviteLinkDialog/index.d.ts.map +1 -0
  196. package/dist/lib/presentation/components/InviteLinkDialog/index.js +77 -0
  197. package/dist/lib/presentation/components/InviteLinkPanel/index.d.ts +26 -0
  198. package/dist/lib/presentation/components/InviteLinkPanel/index.d.ts.map +1 -0
  199. package/dist/lib/presentation/components/InviteLinkPanel/index.js +59 -0
  200. package/dist/lib/presentation/components/InviteSent/index.d.ts +20 -0
  201. package/dist/lib/presentation/components/InviteSent/index.d.ts.map +1 -0
  202. package/dist/lib/presentation/components/InviteSent/index.js +60 -0
  203. package/dist/lib/presentation/components/MemberAvatar/index.d.ts +24 -0
  204. package/dist/lib/presentation/components/MemberAvatar/index.d.ts.map +1 -0
  205. package/dist/lib/presentation/components/MemberAvatar/index.js +14 -0
  206. package/dist/lib/presentation/components/MembersEmpty/index.d.ts +16 -0
  207. package/dist/lib/presentation/components/MembersEmpty/index.d.ts.map +1 -0
  208. package/dist/lib/presentation/components/MembersEmpty/index.js +42 -0
  209. package/dist/lib/presentation/components/MembersNoAccess/index.d.ts +7 -0
  210. package/dist/lib/presentation/components/MembersNoAccess/index.d.ts.map +1 -0
  211. package/dist/lib/presentation/components/MembersNoAccess/index.js +24 -0
  212. package/dist/lib/presentation/components/MembersPagination/index.d.ts +17 -0
  213. package/dist/lib/presentation/components/MembersPagination/index.d.ts.map +1 -0
  214. package/dist/lib/presentation/components/MembersPagination/index.js +45 -0
  215. package/dist/lib/presentation/components/MembersSkeleton/index.d.ts +32 -0
  216. package/dist/lib/presentation/components/MembersSkeleton/index.d.ts.map +1 -0
  217. package/dist/lib/presentation/components/MembersSkeleton/index.js +61 -0
  218. package/dist/lib/presentation/components/MembersTable/MemberRoleChip/index.d.ts +17 -0
  219. package/dist/lib/presentation/components/MembersTable/MemberRoleChip/index.d.ts.map +1 -0
  220. package/dist/lib/presentation/components/MembersTable/MemberRoleChip/index.js +36 -0
  221. package/dist/lib/presentation/components/MembersTable/MemberRowActions/index.d.ts +16 -0
  222. package/dist/lib/presentation/components/MembersTable/MemberRowActions/index.d.ts.map +1 -0
  223. package/dist/lib/presentation/components/MembersTable/MemberRowActions/index.js +284 -0
  224. package/dist/lib/presentation/components/MembersTable/MemberStatusBadge/index.d.ts +10 -0
  225. package/dist/lib/presentation/components/MembersTable/MemberStatusBadge/index.d.ts.map +1 -0
  226. package/dist/lib/presentation/components/MembersTable/MemberStatusBadge/index.js +49 -0
  227. package/dist/lib/presentation/components/MembersTable/MemberWorkspaces/index.d.ts +10 -0
  228. package/dist/lib/presentation/components/MembersTable/MemberWorkspaces/index.d.ts.map +1 -0
  229. package/dist/lib/presentation/components/MembersTable/MemberWorkspaces/index.js +37 -0
  230. package/dist/lib/presentation/components/MembersTable/index.d.ts +12 -0
  231. package/dist/lib/presentation/components/MembersTable/index.d.ts.map +1 -0
  232. package/dist/lib/presentation/components/MembersTable/index.js +54 -0
  233. package/dist/lib/presentation/components/MembersTable/membersTableAnchor/index.d.ts +14 -0
  234. package/dist/lib/presentation/components/MembersTable/membersTableAnchor/index.d.ts.map +1 -0
  235. package/dist/lib/presentation/components/MembersToolbar/index.d.ts +15 -0
  236. package/dist/lib/presentation/components/MembersToolbar/index.d.ts.map +1 -0
  237. package/dist/lib/presentation/components/MembersToolbar/index.js +23 -0
  238. package/dist/lib/presentation/components/PasswordResetCard/index.d.ts +19 -0
  239. package/dist/lib/presentation/components/PasswordResetCard/index.d.ts.map +1 -0
  240. package/dist/lib/presentation/components/PasswordResetCard/index.js +109 -0
  241. package/dist/lib/presentation/components/PasswordResetLinkDialog/index.d.ts +27 -0
  242. package/dist/lib/presentation/components/PasswordResetLinkDialog/index.d.ts.map +1 -0
  243. package/dist/lib/presentation/components/PasswordResetLinkDialog/index.js +79 -0
  244. package/dist/lib/presentation/components/PasswordResetLinkPanel/index.d.ts +31 -0
  245. package/dist/lib/presentation/components/PasswordResetLinkPanel/index.d.ts.map +1 -0
  246. package/dist/lib/presentation/components/PasswordResetLinkPanel/index.js +64 -0
  247. package/dist/lib/presentation/components/RolePicker/index.d.ts +21 -0
  248. package/dist/lib/presentation/components/RolePicker/index.d.ts.map +1 -0
  249. package/dist/lib/presentation/components/RolePicker/index.js +51 -0
  250. package/dist/lib/presentation/components/SessionCard/index.d.ts +15 -0
  251. package/dist/lib/presentation/components/SessionCard/index.d.ts.map +1 -0
  252. package/dist/lib/presentation/components/SessionCard/index.js +43 -0
  253. package/dist/lib/presentation/components/ThemeSync/index.d.ts +21 -0
  254. package/dist/lib/presentation/components/ThemeSync/index.d.ts.map +1 -0
  255. package/dist/lib/presentation/components/ThemeSync/index.js +32 -0
  256. package/dist/lib/presentation/components/UserDetailLayout/UserDetailTabs/index.d.ts +15 -0
  257. package/dist/lib/presentation/components/UserDetailLayout/UserDetailTabs/index.d.ts.map +1 -0
  258. package/dist/lib/presentation/components/UserDetailLayout/UserDetailTabs/index.js +52 -0
  259. package/dist/lib/presentation/components/UserDetailLayout/UserHero/index.d.ts +10 -0
  260. package/dist/lib/presentation/components/UserDetailLayout/UserHero/index.d.ts.map +1 -0
  261. package/dist/lib/presentation/components/UserDetailLayout/UserHero/index.js +26 -0
  262. package/dist/lib/presentation/components/UserDetailLayout/UserStatsStrip/index.d.ts +10 -0
  263. package/dist/lib/presentation/components/UserDetailLayout/UserStatsStrip/index.d.ts.map +1 -0
  264. package/dist/lib/presentation/components/UserDetailLayout/UserStatsStrip/index.js +39 -0
  265. package/dist/lib/presentation/components/UserDetailLayout/index.d.ts +13 -0
  266. package/dist/lib/presentation/components/UserDetailLayout/index.d.ts.map +1 -0
  267. package/dist/lib/presentation/components/UserDetailLayout/index.js +101 -0
  268. package/dist/lib/presentation/components/UserDetailRouter/index.d.ts +16 -0
  269. package/dist/lib/presentation/components/UserDetailRouter/index.d.ts.map +1 -0
  270. package/dist/lib/presentation/components/UserDetailRouter/index.js +33 -0
  271. package/dist/lib/presentation/components/WorkspaceMembershipCard/index.d.ts +15 -0
  272. package/dist/lib/presentation/components/WorkspaceMembershipCard/index.d.ts.map +1 -0
  273. package/dist/lib/presentation/components/WorkspaceMembershipCard/index.js +27 -0
  274. package/dist/lib/presentation/membersFilterFields/index.d.ts +10 -0
  275. package/dist/lib/presentation/membersFilterFields/index.d.ts.map +1 -0
  276. package/dist/lib/presentation/membersFilterFields/index.js +67 -0
  277. package/dist/lib/presentation/membersResultsAnchor/index.d.ts +17 -0
  278. package/dist/lib/presentation/membersResultsAnchor/index.d.ts.map +1 -0
  279. package/dist/lib/presentation/membersResultsAnchor/index.js +16 -0
  280. package/dist/lib/presentation/pages/InviteMemberPage/index.d.ts +7 -0
  281. package/dist/lib/presentation/pages/InviteMemberPage/index.d.ts.map +1 -0
  282. package/dist/lib/presentation/pages/InviteMemberPage/index.js +346 -0
  283. package/dist/lib/presentation/pages/MembersPage/index.d.ts +13 -0
  284. package/dist/lib/presentation/pages/MembersPage/index.d.ts.map +1 -0
  285. package/dist/lib/presentation/pages/MembersPage/index.js +140 -0
  286. package/dist/lib/presentation/pages/UserAccessPage/index.d.ts +18 -0
  287. package/dist/lib/presentation/pages/UserAccessPage/index.d.ts.map +1 -0
  288. package/dist/lib/presentation/pages/UserAccessPage/index.js +153 -0
  289. package/dist/lib/presentation/pages/UserActivityPage/index.d.ts +8 -0
  290. package/dist/lib/presentation/pages/UserActivityPage/index.d.ts.map +1 -0
  291. package/dist/lib/presentation/pages/UserActivityPage/index.js +228 -0
  292. package/dist/lib/presentation/pages/UserGeneralPage/index.d.ts +7 -0
  293. package/dist/lib/presentation/pages/UserGeneralPage/index.d.ts.map +1 -0
  294. package/dist/lib/presentation/pages/UserGeneralPage/index.js +72 -0
  295. package/dist/lib/presentation/pages/UserPreferencesPage/ThemePreview.d.ts +11 -0
  296. package/dist/lib/presentation/pages/UserPreferencesPage/ThemePreview.d.ts.map +1 -0
  297. package/dist/lib/presentation/pages/UserPreferencesPage/ThemePreview.js +24 -0
  298. package/dist/lib/presentation/pages/UserPreferencesPage/index.d.ts +10 -0
  299. package/dist/lib/presentation/pages/UserPreferencesPage/index.d.ts.map +1 -0
  300. package/dist/lib/presentation/pages/UserPreferencesPage/index.js +148 -0
  301. package/dist/lib/presentation/pages/UserRolesPage/index.d.ts +8 -0
  302. package/dist/lib/presentation/pages/UserRolesPage/index.d.ts.map +1 -0
  303. package/dist/lib/presentation/pages/UserRolesPage/index.js +110 -0
  304. package/dist/lib/presentation/pages/UserSessionsPage/index.d.ts +7 -0
  305. package/dist/lib/presentation/pages/UserSessionsPage/index.d.ts.map +1 -0
  306. package/dist/lib/presentation/pages/UserSessionsPage/index.js +121 -0
  307. package/dist/lib/presentation/pages/UserWorkspacesPage/index.d.ts +8 -0
  308. package/dist/lib/presentation/pages/UserWorkspacesPage/index.d.ts.map +1 -0
  309. package/dist/lib/presentation/pages/UserWorkspacesPage/index.js +111 -0
  310. package/dist/lib/presentation/userDetailContext/index.d.ts +13 -0
  311. package/dist/lib/presentation/userDetailContext/index.d.ts.map +1 -0
  312. package/dist/lib/presentation/userDetailContext/index.js +5 -0
  313. package/dist/lib/presentation/usersPlugin/index.d.ts +27 -0
  314. package/dist/lib/presentation/usersPlugin/index.d.ts.map +1 -0
  315. package/dist/lib/presentation/usersPlugin/index.js +109 -0
  316. package/dist/lib/types/member/index.d.ts +63 -0
  317. package/dist/lib/types/member/index.d.ts.map +1 -0
  318. package/dist/lib/utils/membersFilterFields/index.d.ts +10 -0
  319. package/dist/lib/utils/membersFilterFields/index.d.ts.map +1 -0
  320. package/dist/lib/utils/membersKeys/index.d.ts +27 -0
  321. package/dist/lib/utils/membersKeys/index.d.ts.map +1 -0
  322. package/dist/lib/utils/toMember/index.d.ts +33 -0
  323. package/dist/lib/utils/toMember/index.d.ts.map +1 -0
  324. package/dist/lib/utils/userDetailContext/index.d.ts +13 -0
  325. package/dist/lib/utils/userDetailContext/index.d.ts.map +1 -0
  326. package/dist/lib/utils/usersPlugin/index.d.ts +27 -0
  327. package/dist/lib/utils/usersPlugin/index.d.ts.map +1 -0
  328. package/package.json +50 -0
@@ -0,0 +1,284 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useId, useState } from 'react';
3
+ import { useNavigate } from 'react-router-dom';
4
+ import { defineMessages, useIntl } from 'react-intl';
5
+ import { Activity, Ban, Building2, CircleCheck, KeyRound, MonitorSmartphone, MoreHorizontal, Send, ShieldCheck, Trash2, UserRound } from 'lucide-react';
6
+ import { useAuth, useHasPermission } from '@orthacms/identity-admin';
7
+ import { Button, ConfirmDialog, DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger, Tooltip, TooltipContent, TooltipTrigger, cn, toast } from '@orthacms/design-system';
8
+ import { inviteLinkFor } from '../../../../infrastructure/inviteLink';
9
+ import { InviteLinkDialog } from '../../InviteLinkDialog';
10
+ import { MEMBERS_RESULTS_ANCHOR_ID } from '../../../membersResultsAnchor';
11
+ import { useResendInvite } from '../../../../application/useResendInvite';
12
+ import { useRevokeInvite } from '../../../../application/useRevokeInvite';
13
+ import { useSetMemberStatus } from '../../../../application/useSetMemberStatus';
14
+ import { MemberEntity } from '../../../../domain/member';
15
+ /** Intl descriptors for {@link MemberRowActions}, co-located with the component. */
16
+ const messages = defineMessages({
17
+ open: {
18
+ id: 'users.actions.open',
19
+ defaultMessage: 'Actions for {name}'
20
+ },
21
+ account: {
22
+ id: 'users.actions.account',
23
+ defaultMessage: 'Account'
24
+ },
25
+ audit: {
26
+ id: 'users.actions.audit',
27
+ defaultMessage: 'Audit'
28
+ },
29
+ access: {
30
+ id: 'users.actions.access',
31
+ defaultMessage: 'Access'
32
+ },
33
+ general: {
34
+ id: 'users.actions.general',
35
+ defaultMessage: 'General'
36
+ },
37
+ role: {
38
+ id: 'users.actions.role',
39
+ defaultMessage: 'Role'
40
+ },
41
+ workspaces: {
42
+ id: 'users.actions.workspaces',
43
+ defaultMessage: 'Workspaces'
44
+ },
45
+ sessions: {
46
+ id: 'users.actions.sessions',
47
+ defaultMessage: 'Sessions'
48
+ },
49
+ activity: {
50
+ id: 'users.actions.activity',
51
+ defaultMessage: 'Activity'
52
+ },
53
+ signInAccess: {
54
+ id: 'users.actions.signInAccess',
55
+ defaultMessage: 'Sign-in access'
56
+ },
57
+ disable: {
58
+ id: 'users.actions.disable',
59
+ defaultMessage: 'Disable'
60
+ },
61
+ enable: {
62
+ id: 'users.actions.enable',
63
+ defaultMessage: 'Enable'
64
+ },
65
+ resend: {
66
+ id: 'users.actions.resend',
67
+ defaultMessage: 'Resend invite'
68
+ },
69
+ revoke: {
70
+ id: 'users.actions.revoke',
71
+ defaultMessage: 'Revoke invite'
72
+ },
73
+ disableSelf: {
74
+ id: 'users.actions.disableSelf',
75
+ defaultMessage: 'You cannot disable your own account.'
76
+ },
77
+ disableLastAdmin: {
78
+ id: 'users.actions.disableLastAdmin',
79
+ defaultMessage: 'The last remaining admin cannot be disabled. Promote another member to admin first.'
80
+ },
81
+ disabled: {
82
+ id: 'users.actions.disabled.toast',
83
+ defaultMessage: 'Disabled {name}'
84
+ },
85
+ enabled: {
86
+ id: 'users.actions.enabled.toast',
87
+ defaultMessage: 'Enabled {name}'
88
+ },
89
+ revoked: {
90
+ id: 'users.actions.revoked.toast',
91
+ defaultMessage: 'Revoked the invite for {email}'
92
+ },
93
+ actionFailed: {
94
+ id: 'users.actions.failed.toast',
95
+ defaultMessage: 'Something went wrong. Please try again.'
96
+ },
97
+ confirmDisableTitle: {
98
+ id: 'users.actions.confirmDisable.title',
99
+ defaultMessage: 'Disable {name}?'
100
+ },
101
+ confirmDisableBody: {
102
+ id: 'users.actions.confirmDisable.body',
103
+ defaultMessage: '{email} will be signed out everywhere and blocked from signing in until you enable them again. Their workspace memberships and authored content are kept.'
104
+ },
105
+ confirmRevokeTitle: {
106
+ id: 'users.actions.confirmRevoke.title',
107
+ defaultMessage: 'Delete this invite permanently?'
108
+ },
109
+ confirmRevokeBody: {
110
+ id: 'users.actions.confirmRevoke.body',
111
+ defaultMessage: 'The pending account for {email} and its workspace assignments are deleted. This cannot be undone — you would have to invite them again and re-choose their workspaces.'
112
+ },
113
+ confirmRevokeAction: {
114
+ id: 'users.actions.confirmRevoke.action',
115
+ defaultMessage: 'Delete invite'
116
+ }
117
+ });
118
+ /**
119
+ * The row-end kebab menu. It mirrors the user detail page's side rail: an
120
+ * **Account** group (General / Role / Workspaces) that every reader sees, then
121
+ * permission-gated **Audit** (Sessions / Activity) and **Access** (Sign-in
122
+ * access) groups — each item navigates straight to that tab. Below a separator
123
+ * sit the status quick actions: a pending invite offers Resend / Revoke, an
124
+ * active member Disable, a disabled member Enable, each shown only with its
125
+ * `users:*` permission. The guardrailed Disable (yourself, the sole admin)
126
+ * stays visible but inert with a tooltip. (Clicking the row itself also opens
127
+ * the member — see {@link MembersTable}.)
128
+ */
129
+ export function MemberRowActions({ member }) {
130
+ const intl = useIntl();
131
+ const navigate = useNavigate();
132
+ const { user } = useAuth();
133
+ const canUpdate = useHasPermission('users:update');
134
+ const canInvite = useHasPermission('users:create');
135
+ const canRevoke = useHasPermission('users:delete');
136
+ const canReadActivity = useHasPermission('activity:read');
137
+ const setStatus = useSetMemberStatus();
138
+ const resendInvite = useResendInvite();
139
+ const revokeInvite = useRevokeInvite();
140
+ // The rotated link, held only until the dialog is dismissed. Resending
141
+ // invalidates whatever link the invitee already had, so the new one has to
142
+ // be handed over — until a mailer exists, by the admin (identity epic #11).
143
+ const [rotatedLink, setRotatedLink] = useState(null);
144
+ // Which destructive action is awaiting confirmation. Both of these are
145
+ // irreversible from the UI — revoking deletes the pending account outright —
146
+ // so neither fires straight off a menu selection (WCAG 3.3.4).
147
+ const [confirming, setConfirming] = useState(null);
148
+ const failed = () => toast.error(intl.formatMessage(messages.actionFailed));
149
+ const base = `/users/${member.id}`;
150
+ const kebabId = `member-actions-${member.id}`;
151
+ /**
152
+ * Put focus back on a stable anchor after an overlay closes. Radix restores
153
+ * focus to whatever opened it, but a row-removing mutation unmounts that
154
+ * trigger mid-flight and focus lands on `<body>` — restarting a keyboard
155
+ * user at the top of the document after every action (WCAG 2.4.3). Deferred
156
+ * a frame so this runs after Radix's own restoration rather than racing it.
157
+ */
158
+ const restoreFocusTo = (selector) => {
159
+ requestAnimationFrame(() => {
160
+ document.querySelector(selector)?.focus();
161
+ });
162
+ };
163
+ /** The row survives this action, so focus belongs back on its own kebab. */
164
+ const focusKebab = () => restoreFocusTo(`#${CSS.escape(kebabId)}`);
165
+ /**
166
+ * The row is gone; fall back to the roster's results region. It wraps every
167
+ * result state, so it is still mounted even when removing this row emptied
168
+ * the table and swapped it for the empty state.
169
+ */
170
+ const focusResults = () => restoreFocusTo(`#${MEMBERS_RESULTS_ANCHOR_ID}`);
171
+ /** A navigation item that routes to one of the member's detail tabs. */
172
+ const navItem = (key, icon, label, to) => {
173
+ const Icon = icon;
174
+ return (_jsxs(DropdownMenuItem, { onSelect: () => navigate(to), children: [_jsx(Icon, { "aria-hidden": true }), label] }, key));
175
+ };
176
+ // Quick status actions, mirroring the member's lifecycle.
177
+ let quickItems = [];
178
+ let destructiveItem = null;
179
+ if (member.status === 'pending') {
180
+ quickItems = [
181
+ canInvite ? (_jsxs(DropdownMenuItem, { onSelect: () => resendInvite.mutate(member.id, {
182
+ onSuccess: (invited) => setRotatedLink(inviteLinkFor(invited.inviteToken)),
183
+ onError: failed
184
+ }), children: [_jsx(Send, { "aria-hidden": true }), intl.formatMessage(messages.resend)] }, "resend")) : null
185
+ ];
186
+ destructiveItem = canRevoke ? (_jsxs(DropdownMenuItem, { className: "text-destructive focus:text-destructive", onSelect: () => setConfirming('revoke'), children: [_jsx(Trash2, { "aria-hidden": true }), intl.formatMessage(messages.revoke)] }, "revoke")) : null;
187
+ }
188
+ else if (member.status === 'active') {
189
+ // The Member entity mirrors the server's guardrails (self, sole admin)
190
+ // so the item can disable itself with a reason instead of failing.
191
+ const removal = MemberEntity.of(member).canBeRemoved(user?.id);
192
+ const disableBlockedReason = removal.ok
193
+ ? null
194
+ : intl.formatMessage(removal.reason === 'self'
195
+ ? messages.disableSelf
196
+ : messages.disableLastAdmin);
197
+ quickItems = [
198
+ canUpdate ? (_jsxs(GuardedMenuItem, { blockedReason: disableBlockedReason, onSelect: () => setConfirming('disable'), children: [_jsx(Ban, { "aria-hidden": true }), intl.formatMessage(messages.disable)] }, "disable")) : null
199
+ ];
200
+ }
201
+ else {
202
+ quickItems = [
203
+ canUpdate ? (_jsxs(DropdownMenuItem, { onSelect: () => setStatus.mutate({ id: member.id, disabled: false }, {
204
+ onSuccess: () => toast.success(intl.formatMessage(messages.enabled, {
205
+ name: member.name
206
+ })),
207
+ onError: failed
208
+ }), children: [_jsx(CircleCheck, { "aria-hidden": true }), intl.formatMessage(messages.enable)] }, "enable")) : null
209
+ ];
210
+ }
211
+ const visibleQuick = quickItems.filter(Boolean);
212
+ const hasQuick = visibleQuick.length > 0 || destructiveItem;
213
+ /** Delete the pending account. The row goes with it, so focus the table. */
214
+ const confirmRevoke = () => revokeInvite.mutate(member.id, {
215
+ onSuccess: () => {
216
+ setConfirming(null);
217
+ focusResults();
218
+ toast.success(intl.formatMessage(messages.revoked, {
219
+ email: member.email
220
+ }));
221
+ },
222
+ onError: () => {
223
+ setConfirming(null);
224
+ focusKebab();
225
+ failed();
226
+ }
227
+ });
228
+ /** Suspend sign-in. The row stays (its pill flips), so focus its kebab. */
229
+ const confirmDisable = () => setStatus.mutate({ id: member.id, disabled: true }, {
230
+ onSuccess: () => {
231
+ setConfirming(null);
232
+ focusKebab();
233
+ toast.success(intl.formatMessage(messages.disabled, {
234
+ name: member.name
235
+ }));
236
+ },
237
+ onError: () => {
238
+ setConfirming(null);
239
+ focusKebab();
240
+ failed();
241
+ }
242
+ });
243
+ const confirmBusy = revokeInvite.isPending || setStatus.isPending;
244
+ return (_jsxs(_Fragment, { children: [_jsxs(DropdownMenu, { modal: false, children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx(Button, { id: kebabId, variant: "ghost", size: "icon", className: "size-8", "aria-label": intl.formatMessage(messages.open, {
245
+ name: member.name
246
+ }), children: _jsx(MoreHorizontal, { "aria-hidden": true }) }) }), _jsxs(DropdownMenuContent, { align: "end", className: "w-48", children: [_jsxs(DropdownMenuGroup, { children: [_jsx(DropdownMenuLabel, { children: intl.formatMessage(messages.account) }), navItem('general', UserRound, intl.formatMessage(messages.general), `${base}/general`), navItem('role', ShieldCheck, intl.formatMessage(messages.role), `${base}/roles`), navItem('workspaces', Building2, intl.formatMessage(messages.workspaces), `${base}/workspaces`)] }), canUpdate || canReadActivity ? (_jsxs(_Fragment, { children: [_jsx(DropdownMenuSeparator, {}), _jsxs(DropdownMenuGroup, { children: [_jsx(DropdownMenuLabel, { children: intl.formatMessage(messages.audit) }), canUpdate
247
+ ? navItem('sessions', MonitorSmartphone, intl.formatMessage(messages.sessions), `${base}/sessions`)
248
+ : null, canReadActivity
249
+ ? navItem('activity', Activity, intl.formatMessage(messages.activity), `${base}/activity`)
250
+ : null] })] })) : null, canUpdate ? (_jsxs(_Fragment, { children: [_jsx(DropdownMenuSeparator, {}), _jsxs(DropdownMenuGroup, { children: [_jsx(DropdownMenuLabel, { children: intl.formatMessage(messages.access) }), navItem('access', KeyRound, intl.formatMessage(messages.signInAccess), `${base}/access`)] })] })) : null, hasQuick ? (_jsxs(_Fragment, { children: [_jsx(DropdownMenuSeparator, {}), visibleQuick.length > 0 ? (_jsx(DropdownMenuGroup, { children: visibleQuick })) : null, destructiveItem ? (_jsx(DropdownMenuGroup, { children: destructiveItem })) : null] })) : null] })] }), _jsx(InviteLinkDialog, { link: rotatedLink, email: member.email, open: rotatedLink !== null, onOpenChange: (open) => {
251
+ if (!open) {
252
+ setRotatedLink(null);
253
+ // The row is still here — Radix can't restore focus to
254
+ // the kebab because the menu that opened this dialog has
255
+ // already unmounted, so do it explicitly.
256
+ focusKebab();
257
+ }
258
+ } }), _jsx(ConfirmDialog, { open: confirming !== null, onOpenChange: (open) => {
259
+ if (!open) {
260
+ setConfirming(null);
261
+ focusKebab();
262
+ }
263
+ }, busy: confirmBusy, title: intl.formatMessage(confirming === 'revoke'
264
+ ? messages.confirmRevokeTitle
265
+ : messages.confirmDisableTitle, { name: member.name }), description: intl.formatMessage(confirming === 'revoke'
266
+ ? messages.confirmRevokeBody
267
+ : messages.confirmDisableBody, { email: member.email }), confirmLabel: intl.formatMessage(confirming === 'revoke'
268
+ ? messages.confirmRevokeAction
269
+ : messages.disable), confirmVariant: "destructive", onConfirm: confirming === 'revoke' ? confirmRevoke : confirmDisable })] }));
270
+ }
271
+ /**
272
+ * A menu item that a guardrail can veto. When `blockedReason` is set the item
273
+ * stays visible but inert — styled disabled, `aria-disabled`, selection
274
+ * suppressed — and a tooltip carries the reason. Radix's real `disabled`
275
+ * suppresses the pointer/focus events tooltips need, hence the manual
276
+ * treatment.
277
+ */
278
+ function GuardedMenuItem({ blockedReason, onSelect, children }) {
279
+ const reasonId = useId();
280
+ if (!blockedReason) {
281
+ return (_jsx(DropdownMenuItem, { onSelect: onSelect, children: children }));
282
+ }
283
+ return (_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs(DropdownMenuItem, { "aria-disabled": true, "aria-describedby": reasonId, className: cn('opacity-50 focus:bg-transparent'), onSelect: (event) => event.preventDefault(), children: [children, _jsx("span", { id: reasonId, className: "sr-only", children: blockedReason })] }) }), _jsx(TooltipContent, { className: "max-w-60", children: blockedReason })] }));
284
+ }
@@ -0,0 +1,10 @@
1
+ import type { MemberStatus } from '../../../../domain/types/member';
2
+ /**
3
+ * The Status column's pill: a leading colored dot plus the status label —
4
+ * green "Active", amber "Invited" (a sent, unaccepted invite), muted
5
+ * "Disabled".
6
+ */
7
+ export declare function MemberStatusBadge({ status }: {
8
+ status: MemberStatus;
9
+ }): 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/components/MembersTable/MemberStatusBadge/index.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAwCpE;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,YAAY,CAAA;CAAE,+BAuBrE"}
@@ -0,0 +1,49 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { defineMessages, useIntl } from 'react-intl';
3
+ import { Badge, cn } from '@orthacms/design-system';
4
+ /** Intl descriptors for {@link MemberStatusBadge}, co-located with the component. */
5
+ const messages = defineMessages({
6
+ active: {
7
+ id: 'users.status.active',
8
+ defaultMessage: 'Active'
9
+ },
10
+ invited: {
11
+ id: 'users.status.invited',
12
+ defaultMessage: 'Invited'
13
+ },
14
+ disabled: {
15
+ id: 'users.status.disabled',
16
+ defaultMessage: 'Disabled'
17
+ }
18
+ });
19
+ /**
20
+ * Dot color, pill variant, and label per status; the label keeps color from
21
+ * being the sole signal.
22
+ */
23
+ const APPEARANCE = {
24
+ active: {
25
+ dot: 'bg-status-active',
26
+ variant: 'success',
27
+ message: messages.active
28
+ },
29
+ pending: {
30
+ dot: 'bg-status-invited',
31
+ variant: 'warning',
32
+ message: messages.invited
33
+ },
34
+ disabled: {
35
+ dot: 'bg-muted-foreground',
36
+ variant: 'secondary',
37
+ message: messages.disabled
38
+ }
39
+ };
40
+ /**
41
+ * The Status column's pill: a leading colored dot plus the status label —
42
+ * green "Active", amber "Invited" (a sent, unaccepted invite), muted
43
+ * "Disabled".
44
+ */
45
+ export function MemberStatusBadge({ status }) {
46
+ const intl = useIntl();
47
+ const appearance = APPEARANCE[status];
48
+ return (_jsxs(Badge, { variant: appearance.variant, className: cn('gap-1.5 rounded-xl', status === 'disabled' && 'border-border'), children: [_jsx("span", { "aria-hidden": true, className: cn('size-1.5 rounded-full', appearance.dot) }), _jsx("span", { className: cn(status === 'disabled' && 'text-muted-foreground'), children: intl.formatMessage(appearance.message) })] }));
49
+ }
@@ -0,0 +1,10 @@
1
+ import type { MemberWorkspace } from '../../../../domain/types/member';
2
+ /**
3
+ * The Workspaces column: a row of overlapping workspace avatars plus a count,
4
+ * opening a popover that lists every workspace the member belongs to — the
5
+ * same stack-and-popover treatment as the workspace card's member roster.
6
+ */
7
+ export declare function MemberWorkspaces({ workspaces }: {
8
+ workspaces: MemberWorkspace[];
9
+ }): 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/components/MembersTable/MemberWorkspaces/index.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAsBvE;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,EAC7B,UAAU,EACb,EAAE;IACC,UAAU,EAAE,eAAe,EAAE,CAAC;CACjC,+BAsEA"}
@@ -0,0 +1,37 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { defineMessages, useIntl } from 'react-intl';
3
+ import { Popover, PopoverContent, PopoverTrigger } from '@orthacms/design-system';
4
+ import { MemberAvatar } from '../../MemberAvatar';
5
+ /** Intl descriptors for {@link MemberWorkspaces}, co-located with the component. */
6
+ const messages = defineMessages({
7
+ count: {
8
+ id: 'users.workspaces.count',
9
+ defaultMessage: '{count, plural, one {# workspace} other {# workspaces}}'
10
+ },
11
+ open: {
12
+ id: 'users.workspaces.open',
13
+ defaultMessage: 'View workspaces'
14
+ },
15
+ none: {
16
+ id: 'users.workspaces.none',
17
+ defaultMessage: 'No workspaces'
18
+ }
19
+ });
20
+ /** Up to this many workspace avatars show before collapsing into a "+N" pill. */
21
+ const MAX_AVATARS = 3;
22
+ /**
23
+ * The Workspaces column: a row of overlapping workspace avatars plus a count,
24
+ * opening a popover that lists every workspace the member belongs to — the
25
+ * same stack-and-popover treatment as the workspace card's member roster.
26
+ */
27
+ export function MemberWorkspaces({ workspaces }) {
28
+ const intl = useIntl();
29
+ if (workspaces.length === 0) {
30
+ return (_jsx("span", { className: "text-sm text-muted-foreground", children: intl.formatMessage(messages.none) }));
31
+ }
32
+ const shown = workspaces.slice(0, MAX_AVATARS);
33
+ const overflow = workspaces.length - shown.length;
34
+ return (_jsxs(Popover, { children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs("button", { type: "button", "aria-label": intl.formatMessage(messages.open), onClick: (event) => event.stopPropagation(), className: "-m-1 flex items-center gap-2 rounded-lg p-1 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring", children: [_jsxs("span", { className: "flex", children: [shown.map((workspace, index) => (_jsx(MemberAvatar, { initials: workspace.initials, color: workspace.color, className: "size-[26px] border-2 border-background text-[10px]", style: { marginLeft: index === 0 ? 0 : -8 } }, workspace.id))), overflow > 0 ? (_jsxs("span", { className: "flex size-[26px] items-center justify-center rounded-xl border-2 border-background bg-secondary text-[10px] font-semibold text-muted-foreground", style: { marginLeft: -8 }, children: ["+", overflow] })) : null] }), _jsx("span", { className: "text-xs text-muted-foreground", children: intl.formatMessage(messages.count, {
35
+ count: workspaces.length
36
+ }) })] }) }), _jsx(PopoverContent, { align: "start", className: "w-64 p-0", children: _jsx("ul", { className: "max-h-[15rem] overflow-y-auto py-1", children: workspaces.map((workspace) => (_jsxs("li", { className: "flex items-center gap-3 px-4 py-2", children: [_jsx(MemberAvatar, { initials: workspace.initials, color: workspace.color, className: "size-[26px] shrink-0 text-[10px]" }), _jsx("span", { className: "truncate text-sm", children: workspace.name })] }, workspace.id))) }) })] }));
37
+ }
@@ -0,0 +1,12 @@
1
+ import type { Member } from '../../../domain/types/member';
2
+ /**
3
+ * The members table: avatar + name + email, the role chip, the status pill, the
4
+ * workspace stack, the joined date (the invite date for Invited rows), and the
5
+ * per-row actions menu. The whole row is a shortcut to the member's detail page
6
+ * (the name is a real link for keyboard users); the actions cell stops the
7
+ * click from bubbling so opening the menu doesn't also navigate.
8
+ */
9
+ export declare function MembersTable({ members }: {
10
+ members: Member[];
11
+ }): import("react").JSX.Element;
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/lib/presentation/components/MembersTable/index.tsx"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AAkC3D;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,+BAiG9D"}
@@ -0,0 +1,54 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Link, useNavigate } from 'react-router-dom';
3
+ import { defineMessages, useIntl } from 'react-intl';
4
+ import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@orthacms/design-system';
5
+ import { MemberAvatar } from '../MemberAvatar';
6
+ import { MemberRoleChip } from './MemberRoleChip';
7
+ import { MemberRowActions } from './MemberRowActions';
8
+ import { MemberStatusBadge } from './MemberStatusBadge';
9
+ import { MemberWorkspaces } from './MemberWorkspaces';
10
+ /** Intl descriptors for {@link MembersTable}, co-located with the component. */
11
+ const messages = defineMessages({
12
+ member: {
13
+ id: 'users.table.member',
14
+ defaultMessage: 'Member'
15
+ },
16
+ role: {
17
+ id: 'users.table.role',
18
+ defaultMessage: 'Role'
19
+ },
20
+ status: {
21
+ id: 'users.table.status',
22
+ defaultMessage: 'Status'
23
+ },
24
+ workspaces: {
25
+ id: 'users.table.workspaces',
26
+ defaultMessage: 'Workspaces'
27
+ },
28
+ joined: {
29
+ id: 'users.table.joined',
30
+ defaultMessage: 'Joined'
31
+ },
32
+ actions: {
33
+ id: 'users.table.actions',
34
+ defaultMessage: 'Actions'
35
+ },
36
+ caption: {
37
+ id: 'users.table.caption',
38
+ defaultMessage: 'Members'
39
+ }
40
+ });
41
+ /**
42
+ * The members table: avatar + name + email, the role chip, the status pill, the
43
+ * workspace stack, the joined date (the invite date for Invited rows), and the
44
+ * per-row actions menu. The whole row is a shortcut to the member's detail page
45
+ * (the name is a real link for keyboard users); the actions cell stops the
46
+ * click from bubbling so opening the menu doesn't also navigate.
47
+ */
48
+ export function MembersTable({ members }) {
49
+ const intl = useIntl();
50
+ const navigate = useNavigate();
51
+ return (_jsx("div", { className: "overflow-hidden rounded-xl border bg-card shadow-xs", children: _jsxs(Table, { "aria-label": intl.formatMessage(messages.caption), children: [_jsx(TableHeader, { children: _jsxs(TableRow, { children: [_jsx(TableHead, { scope: "col", children: intl.formatMessage(messages.member) }), _jsx(TableHead, { scope: "col", children: intl.formatMessage(messages.role) }), _jsx(TableHead, { scope: "col", children: intl.formatMessage(messages.status) }), _jsx(TableHead, { scope: "col", children: intl.formatMessage(messages.workspaces) }), _jsx(TableHead, { scope: "col", children: intl.formatMessage(messages.joined) }), _jsx(TableHead, { scope: "col", className: "w-12", children: _jsx("span", { className: "sr-only", children: intl.formatMessage(messages.actions) }) })] }) }), _jsx(TableBody, { children: members.map((member) => (_jsxs(TableRow, { onClick: () => navigate(`/users/${member.id}`), className: "cursor-pointer", children: [_jsx(TableCell, { children: _jsxs("div", { className: "flex items-center gap-3", children: [_jsx(MemberAvatar, { initials: member.initials, color: member.color, className: "size-9 shrink-0 text-xs" }), _jsxs("div", { className: "min-w-0 max-w-[22rem]", children: [_jsx(Link, { to: `/users/${member.id}`, className: "block truncate text-sm font-medium hover:underline", onClick: (event) => event.stopPropagation(), children: member.name }), _jsx("p", { className: "truncate text-xs text-muted-foreground", children: member.email })] })] }) }), _jsx(TableCell, { children: _jsx(MemberRoleChip, { role: member.role, roleName: member.roleName }) }), _jsx(TableCell, { children: _jsx(MemberStatusBadge, { status: member.status }) }), _jsx(TableCell, { children: _jsx(MemberWorkspaces, { workspaces: member.workspaces }) }), _jsx(TableCell, { className: "text-sm text-muted-foreground", children: intl.formatDate(member.joinedAt, {
52
+ dateStyle: 'medium'
53
+ }) }), _jsx(TableCell, { className: "text-right", onClick: (event) => event.stopPropagation(), children: _jsx(MemberRowActions, { member: member }) })] }, member.id))) })] }) }));
54
+ }
@@ -0,0 +1,14 @@
1
+ /**
2
+ * The id of the roster's focus anchor — the table wrapper, which carries
3
+ * `tabIndex={-1}` so it can receive focus programmatically without becoming a
4
+ * tab stop.
5
+ *
6
+ * It exists because a row-removing mutation unmounts the control that opened
7
+ * the overlay (the row's kebab), so Radix's focus restoration has nowhere to
8
+ * return to and focus falls to `<body>` — which restarts a keyboard user at the
9
+ * top of the document after every action (WCAG 2.4.3 Focus Order). Shared as a
10
+ * constant rather than a hardcoded string in two files so the contract between
11
+ * {@link MembersTable} and its row menu is explicit.
12
+ */
13
+ export declare const MEMBERS_TABLE_ANCHOR_ID = "members-table";
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/lib/presentation/components/MembersTable/membersTableAnchor/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,uBAAuB,kBAAkB,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { ReactNode } from 'react';
2
+ /**
3
+ * The Members table toolbar: a name/email search box with the advanced-filter
4
+ * control pinned to the right. Layout lives in the shared `SearchToolbar`; this
5
+ * wrapper only supplies the localised strings and the page-owned filter control.
6
+ */
7
+ export declare function MembersToolbar({ search, onSearchChange, filterControl, busy }: {
8
+ search: string;
9
+ onSearchChange: (value: string) => void;
10
+ /** Whether a search/filter request driven from here is still settling. */
11
+ busy?: boolean;
12
+ /** Optional advanced-filter control rendered on the right. */
13
+ filterControl?: ReactNode;
14
+ }): import("react").JSX.Element;
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/lib/presentation/components/MembersToolbar/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAgBvC;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,EAC3B,MAAM,EACN,cAAc,EACd,aAAa,EACb,IAAY,EACf,EAAE;IACC,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,0EAA0E;IAC1E,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,8DAA8D;IAC9D,aAAa,CAAC,EAAE,SAAS,CAAC;CAC7B,+BAaA"}
@@ -0,0 +1,23 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { defineMessages, useIntl } from 'react-intl';
3
+ import { SearchToolbar } from '@orthacms/design-system';
4
+ /** Intl descriptors for {@link MembersToolbar}, co-located with the component. */
5
+ const messages = defineMessages({
6
+ searchLabel: {
7
+ id: 'users.toolbar.searchLabel',
8
+ defaultMessage: 'Search members by name or email'
9
+ },
10
+ searchPlaceholder: {
11
+ id: 'users.toolbar.searchPlaceholder',
12
+ defaultMessage: 'Search by name or email'
13
+ }
14
+ });
15
+ /**
16
+ * The Members table toolbar: a name/email search box with the advanced-filter
17
+ * control pinned to the right. Layout lives in the shared `SearchToolbar`; this
18
+ * wrapper only supplies the localised strings and the page-owned filter control.
19
+ */
20
+ export function MembersToolbar({ search, onSearchChange, filterControl, busy = false }) {
21
+ const intl = useIntl();
22
+ return (_jsx(SearchToolbar, { busy: busy, value: search, onValueChange: onSearchChange, searchLabel: intl.formatMessage(messages.searchLabel), searchPlaceholder: intl.formatMessage(messages.searchPlaceholder), actions: filterControl }));
23
+ }
@@ -0,0 +1,19 @@
1
+ import type { Member } from '../../../domain/types/member';
2
+ /**
3
+ * The Access tab's password card: an admin generates a single-use reset link
4
+ * for an active member and hands it over.
5
+ *
6
+ * This is the whole "forgot my password" story today. There is no self-service
7
+ * flow, because there is no mailer to send a link to (identity epic #11) — so
8
+ * the recovery path runs through someone who can already be asked to vouch for
9
+ * the person, which is a reasonable place for it to sit in the meantime.
10
+ *
11
+ * Only an `active` member qualifies: a `pending` one has no password yet (they
12
+ * finish through the invite link) and a `disabled` one cannot sign in at all,
13
+ * so a link for either is a link to nowhere. The server enforces both; the card
14
+ * says so up front instead of letting the button fail.
15
+ */
16
+ export declare function PasswordResetCard({ member }: {
17
+ member: Member;
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/PasswordResetCard/index.tsx"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AA6D3D;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,+BAqG/D"}