@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,109 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { defineMessages, useIntl } from 'react-intl';
4
+ import { KeyRound } from 'lucide-react';
5
+ import { Alert, AlertDescription, Button, Card, CardContent, CardDescription, CardHeader, CardTitle, Spinner, toast } from '@orthacms/design-system';
6
+ import { useHasPermission } from '@orthacms/identity-admin';
7
+ import { HTTP_STATUS } from '@orthacms/utils-admin';
8
+ import { useIssuePasswordReset } from '../../../application/useIssuePasswordReset';
9
+ import { passwordResetLinkFor } from '../../../infrastructure/passwordResetLink';
10
+ import { PasswordResetLinkDialog } from '../PasswordResetLinkDialog';
11
+ /** Intl descriptors for {@link PasswordResetCard}, co-located with the component. */
12
+ const messages = defineMessages({
13
+ title: { id: 'users.passwordReset.title', defaultMessage: 'Password' },
14
+ body: {
15
+ id: 'users.passwordReset.body',
16
+ defaultMessage: 'Generate a single-use link this member can open to set a new password. Nothing changes until they use it; when they do, every device signed in to their account is signed out.'
17
+ },
18
+ deliveryNote: {
19
+ id: 'users.passwordReset.deliveryNote',
20
+ defaultMessage: 'Nothing is emailed yet — you copy the link and send it yourself. Generating a new link stops any earlier one from working.'
21
+ },
22
+ generate: {
23
+ id: 'users.passwordReset.generate',
24
+ defaultMessage: 'Generate reset link'
25
+ },
26
+ generating: {
27
+ id: 'users.passwordReset.generating',
28
+ defaultMessage: 'Generating reset link…'
29
+ },
30
+ pending: {
31
+ id: 'users.passwordReset.pending',
32
+ defaultMessage: 'This member hasn’t accepted their invite, so there’s no password to reset. Resend their invite instead.'
33
+ },
34
+ disabled: {
35
+ id: 'users.passwordReset.disabled',
36
+ defaultMessage: 'This member is suspended and can’t sign in, so a reset link would do nothing. Reactivate them first.'
37
+ },
38
+ noPermission: {
39
+ id: 'users.passwordReset.noPermission',
40
+ defaultMessage: 'You don’t have permission to reset another member’s password.'
41
+ },
42
+ recentlyIssued: {
43
+ id: 'users.passwordReset.recentlyIssued',
44
+ defaultMessage: 'A reset link was just generated for this member. Wait {seconds, plural, one {a second} other {# seconds}} — generating another now would kill the one you already have.'
45
+ },
46
+ conflict: {
47
+ id: 'users.passwordReset.conflict',
48
+ defaultMessage: 'This member’s account changed while you were looking at it. Reload the page and try again.'
49
+ },
50
+ failed: {
51
+ id: 'users.passwordReset.failed',
52
+ defaultMessage: 'Couldn’t generate a reset link. Please try again.'
53
+ }
54
+ });
55
+ /**
56
+ * The Access tab's password card: an admin generates a single-use reset link
57
+ * for an active member and hands it over.
58
+ *
59
+ * This is the whole "forgot my password" story today. There is no self-service
60
+ * flow, because there is no mailer to send a link to (identity epic #11) — so
61
+ * the recovery path runs through someone who can already be asked to vouch for
62
+ * the person, which is a reasonable place for it to sit in the meantime.
63
+ *
64
+ * Only an `active` member qualifies: a `pending` one has no password yet (they
65
+ * finish through the invite link) and a `disabled` one cannot sign in at all,
66
+ * so a link for either is a link to nowhere. The server enforces both; the card
67
+ * says so up front instead of letting the button fail.
68
+ */
69
+ export function PasswordResetCard({ member }) {
70
+ const intl = useIntl();
71
+ const canUpdate = useHasPermission('users:update');
72
+ const issueReset = useIssuePasswordReset();
73
+ // The minted link, held only until the dialog is dismissed. It is never
74
+ // re-fetchable — the server keeps only its hash — so this state is the one
75
+ // copy that exists.
76
+ const [link, setLink] = useState(null);
77
+ const blockedReason = member.status === 'pending'
78
+ ? messages.pending
79
+ : member.status === 'disabled'
80
+ ? messages.disabled
81
+ : !canUpdate
82
+ ? messages.noPermission
83
+ : null;
84
+ const generate = () => {
85
+ issueReset.mutate(member.id, {
86
+ onSuccess: (issued) => setLink(passwordResetLinkFor(issued.resetToken)),
87
+ onError: (error) => {
88
+ // A 409 is actionable and the body says how: the cooldown
89
+ // carries the wait, so the admin is told to hold rather than
90
+ // told "something conflicted" and left to guess.
91
+ if (error.status === HTTP_STATUS.CONFLICT) {
92
+ const body = error.details;
93
+ toast.error(body?.code === 'PASSWORD_RESET_RECENTLY_SENT'
94
+ ? intl.formatMessage(messages.recentlyIssued, {
95
+ seconds: body.retryAfterSeconds ?? 60
96
+ })
97
+ : intl.formatMessage(messages.conflict));
98
+ return;
99
+ }
100
+ toast.error(intl.formatMessage(messages.failed));
101
+ }
102
+ });
103
+ };
104
+ return (_jsxs(Card, { children: [_jsxs(CardHeader, { children: [_jsxs(CardTitle, { className: "flex items-center gap-2", children: [_jsx(KeyRound, { "aria-hidden": true, className: "size-5 text-muted-foreground" }), intl.formatMessage(messages.title)] }), _jsx(CardDescription, { children: intl.formatMessage(messages.body) })] }), _jsxs(CardContent, { className: "space-y-3", children: [blockedReason ? (_jsx(Alert, { children: _jsx(AlertDescription, { children: intl.formatMessage(blockedReason) }) })) : (_jsx("p", { className: "text-sm text-muted-foreground", children: intl.formatMessage(messages.deliveryNote) })), _jsx(Button, { variant: "outline", onClick: generate, disabled: blockedReason !== null || issueReset.isPending, children: issueReset.isPending ? (_jsxs(_Fragment, { children: [_jsx(Spinner, { "aria-hidden": "true" }), _jsx("span", { className: "sr-only", children: intl.formatMessage(messages.generating) })] })) : (intl.formatMessage(messages.generate)) })] }), _jsx(PasswordResetLinkDialog, { link: link, email: member.email, open: link !== null, onOpenChange: (open) => {
105
+ if (!open) {
106
+ setLink(null);
107
+ }
108
+ } })] }));
109
+ }
@@ -0,0 +1,27 @@
1
+ /** Props for {@link PasswordResetLinkDialog}. */
2
+ type PasswordResetLinkDialogProps = {
3
+ /** The freshly minted reset link, or `null` when there is none to show. */
4
+ link: string | null;
5
+ /** Whose account the link resets. */
6
+ email: string;
7
+ /** Whether the dialog is open. */
8
+ open: boolean;
9
+ /** Called when the dialog opens or closes. */
10
+ onOpenChange: (open: boolean) => void;
11
+ };
12
+ /**
13
+ * Shows the password-reset link an admin just generated. Generating rotates the
14
+ * token, which kills any link already outstanding — so handing the new one over
15
+ * is not a nicety, it is the rest of the operation.
16
+ *
17
+ * Because of that, dismissing before copying is guarded. Esc, an overlay click
18
+ * and the close button all reach `onOpenChange(false)` by reflex, and the link
19
+ * is not re-fetchable: losing it leaves the member with no way to reset and the
20
+ * admin with no live link, recoverable only by generating another — which the
21
+ * server refuses for the first minute, so the mistake is not even immediately
22
+ * fixable. So the first dismissal without a copy asks; once copied, it closes
23
+ * freely.
24
+ */
25
+ export declare function PasswordResetLinkDialog({ link, email, open, onOpenChange }: PasswordResetLinkDialogProps): import("react").JSX.Element;
26
+ export {};
27
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/lib/presentation/components/PasswordResetLinkDialog/index.tsx"],"names":[],"mappings":"AA8CA,iDAAiD;AACjD,KAAK,4BAA4B,GAAG;IAChC,2EAA2E;IAC3E,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,qCAAqC;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,kCAAkC;IAClC,IAAI,EAAE,OAAO,CAAC;IACd,8CAA8C;IAC9C,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CACzC,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CAAC,EACpC,IAAI,EACJ,KAAK,EACL,IAAI,EACJ,YAAY,EACf,EAAE,4BAA4B,+BAyF9B"}
@@ -0,0 +1,79 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useEffect, useState } from 'react';
3
+ import { defineMessages, useIntl } from 'react-intl';
4
+ import { Alert, AlertDescription, Button, Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from '@orthacms/design-system';
5
+ import { TriangleAlert } from 'lucide-react';
6
+ import { PasswordResetLinkPanel } from '../PasswordResetLinkPanel';
7
+ /** Intl descriptors for {@link PasswordResetLinkDialog}, co-located with the component. */
8
+ const messages = defineMessages({
9
+ title: {
10
+ id: 'users.passwordResetLinkDialog.title',
11
+ defaultMessage: 'Send this link to {email}'
12
+ },
13
+ description: {
14
+ id: 'users.passwordResetLinkDialog.description',
15
+ defaultMessage: 'Any earlier reset link stopped working the moment this one was created, so this is the link they need. It’s shown once — copy it before you close this.'
16
+ },
17
+ done: {
18
+ id: 'users.passwordResetLinkDialog.done',
19
+ defaultMessage: 'Done'
20
+ },
21
+ uncopied: {
22
+ id: 'users.passwordResetLinkDialog.uncopied',
23
+ defaultMessage: 'You haven’t copied the link yet, and it can’t be shown again. Closing now leaves {email} with no way to reset until you generate another one.'
24
+ },
25
+ closeAnyway: {
26
+ id: 'users.passwordResetLinkDialog.closeAnyway',
27
+ defaultMessage: 'Close without copying'
28
+ },
29
+ keepOpen: {
30
+ id: 'users.passwordResetLinkDialog.keepOpen',
31
+ defaultMessage: 'Keep it open'
32
+ }
33
+ });
34
+ /**
35
+ * Shows the password-reset link an admin just generated. Generating rotates the
36
+ * token, which kills any link already outstanding — so handing the new one over
37
+ * is not a nicety, it is the rest of the operation.
38
+ *
39
+ * Because of that, dismissing before copying is guarded. Esc, an overlay click
40
+ * and the close button all reach `onOpenChange(false)` by reflex, and the link
41
+ * is not re-fetchable: losing it leaves the member with no way to reset and the
42
+ * admin with no live link, recoverable only by generating another — which the
43
+ * server refuses for the first minute, so the mistake is not even immediately
44
+ * fixable. So the first dismissal without a copy asks; once copied, it closes
45
+ * freely.
46
+ */
47
+ export function PasswordResetLinkDialog({ link, email, open, onOpenChange }) {
48
+ const intl = useIntl();
49
+ const [copied, setCopied] = useState(false);
50
+ const [confirmingClose, setConfirmingClose] = useState(false);
51
+ // A new link is a new chance to lose it — reset the guard whenever one
52
+ // arrives, so a second generate doesn't inherit the first one's "copied".
53
+ useEffect(() => {
54
+ if (link !== null) {
55
+ setCopied(false);
56
+ setConfirmingClose(false);
57
+ }
58
+ }, [link]);
59
+ /** Close for real, clearing the guard. */
60
+ const close = () => {
61
+ setConfirmingClose(false);
62
+ onOpenChange(false);
63
+ };
64
+ /** Every dismissal path funnels through here so none of them can slip past. */
65
+ const requestClose = () => {
66
+ if (copied) {
67
+ close();
68
+ return;
69
+ }
70
+ setConfirmingClose(true);
71
+ };
72
+ return (_jsx(Dialog, { open: open, onOpenChange: (next) => {
73
+ if (next) {
74
+ onOpenChange(true);
75
+ return;
76
+ }
77
+ requestClose();
78
+ }, children: _jsxs(DialogContent, { children: [_jsxs(DialogHeader, { children: [_jsx(DialogTitle, { children: intl.formatMessage(messages.title, { email }) }), _jsx(DialogDescription, { children: intl.formatMessage(messages.description) })] }), link && (_jsx(PasswordResetLinkPanel, { link: link, email: email, onCopied: () => setCopied(true) })), confirmingClose ? (_jsxs(Alert, { variant: "destructive", role: "alert", children: [_jsx(TriangleAlert, { "aria-hidden": true }), _jsx(AlertDescription, { children: intl.formatMessage(messages.uncopied, { email }) })] })) : null, _jsx(DialogFooter, { children: confirmingClose ? (_jsxs(_Fragment, { children: [_jsx(Button, { variant: "outline", onClick: () => setConfirmingClose(false), children: intl.formatMessage(messages.keepOpen) }), _jsx(Button, { variant: "destructive", onClick: close, children: intl.formatMessage(messages.closeAnyway) })] })) : (_jsx(Button, { onClick: requestClose, children: intl.formatMessage(messages.done) })) })] }) }));
79
+ }
@@ -0,0 +1,31 @@
1
+ /** Props for {@link PasswordResetLinkPanel}. */
2
+ type PasswordResetLinkPanelProps = {
3
+ /** The full reset URL to hand over. */
4
+ link: string;
5
+ /** Whose account the link resets — named in the warning so the risk is concrete. */
6
+ email: string;
7
+ /**
8
+ * Called once the link has actually reached the clipboard. Lets a container
9
+ * tell "captured" from "about to be lost" — the dialog guards its dismissal
10
+ * on it.
11
+ */
12
+ onCopied?: () => void;
13
+ };
14
+ /**
15
+ * The reveal-once password-reset link, with a copy button and a plain warning
16
+ * about what the link is. Mirrors the invite-link panel and the API-token reveal
17
+ * dialog: the secret exists only in the caller's state, is never re-fetchable,
18
+ * and this is the single chance to capture it.
19
+ *
20
+ * The warning is blunter than the invite one on purpose. An invite link creates
21
+ * an account nobody holds yet; this one overwrites the credential of an account
22
+ * that already exists, so whoever opens it is *taking over* something rather
23
+ * than claiming something unclaimed.
24
+ *
25
+ * It exists because nothing emails resets yet — the admin is the delivery
26
+ * channel. When a mailer lands (identity epic #11) this becomes a fallback for
27
+ * deployments with no SMTP rather than the only path.
28
+ */
29
+ export declare function PasswordResetLinkPanel({ link, email, onCopied }: PasswordResetLinkPanelProps): import("react").JSX.Element;
30
+ export {};
31
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/lib/presentation/components/PasswordResetLinkPanel/index.tsx"],"names":[],"mappings":"AAoCA,gDAAgD;AAChD,KAAK,2BAA2B,GAAG;IAC/B,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,oFAAoF;IACpF,KAAK,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACzB,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,sBAAsB,CAAC,EACnC,IAAI,EACJ,KAAK,EACL,QAAQ,EACX,EAAE,2BAA2B,+BAoD7B"}
@@ -0,0 +1,64 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { defineMessages, useIntl } from 'react-intl';
4
+ import { Check, Copy, TriangleAlert } from 'lucide-react';
5
+ import { Alert, AlertDescription, Button, toast } from '@orthacms/design-system';
6
+ /** Intl descriptors for {@link PasswordResetLinkPanel}, co-located with the component. */
7
+ const messages = defineMessages({
8
+ copy: {
9
+ id: 'users.passwordResetLink.copy',
10
+ defaultMessage: 'Copy link'
11
+ },
12
+ copied: {
13
+ id: 'users.passwordResetLink.copied',
14
+ defaultMessage: 'Password reset link copied to clipboard'
15
+ },
16
+ copyFailed: {
17
+ id: 'users.passwordResetLink.copyFailed',
18
+ defaultMessage: 'Couldn’t reach the clipboard. Select the link and copy it manually.'
19
+ },
20
+ warning: {
21
+ id: 'users.passwordResetLink.warning',
22
+ defaultMessage: 'This link is shown once and works once. Anyone who opens it can set the password for {email} and take over that account — send it the way you’d send a password, not in a public channel.'
23
+ },
24
+ linkLabel: {
25
+ id: 'users.passwordResetLink.linkLabel',
26
+ defaultMessage: 'Password reset link for {email}'
27
+ }
28
+ });
29
+ /**
30
+ * The reveal-once password-reset link, with a copy button and a plain warning
31
+ * about what the link is. Mirrors the invite-link panel and the API-token reveal
32
+ * dialog: the secret exists only in the caller's state, is never re-fetchable,
33
+ * and this is the single chance to capture it.
34
+ *
35
+ * The warning is blunter than the invite one on purpose. An invite link creates
36
+ * an account nobody holds yet; this one overwrites the credential of an account
37
+ * that already exists, so whoever opens it is *taking over* something rather
38
+ * than claiming something unclaimed.
39
+ *
40
+ * It exists because nothing emails resets yet — the admin is the delivery
41
+ * channel. When a mailer lands (identity epic #11) this becomes a fallback for
42
+ * deployments with no SMTP rather than the only path.
43
+ */
44
+ export function PasswordResetLinkPanel({ link, email, onCopied }) {
45
+ const intl = useIntl();
46
+ const [copied, setCopied] = useState(false);
47
+ const copy = async () => {
48
+ try {
49
+ await navigator.clipboard.writeText(link);
50
+ setCopied(true);
51
+ onCopied?.();
52
+ toast.success(intl.formatMessage(messages.copied));
53
+ }
54
+ catch {
55
+ // Clipboard access can be denied (insecure origin, permissions).
56
+ // The link is selectable in the field, so say so rather than
57
+ // failing silently.
58
+ toast.error(intl.formatMessage(messages.copyFailed));
59
+ }
60
+ };
61
+ return (_jsxs("div", { className: "flex flex-col gap-4", children: [_jsxs("div", { className: "flex min-w-0 items-center gap-2", children: [_jsx("input", { readOnly: true, value: link, "aria-label": intl.formatMessage(messages.linkLabel, {
62
+ email
63
+ }), onFocus: (e) => e.currentTarget.select(), className: "min-w-0 flex-1 truncate rounded-md bg-muted px-3 py-2 font-mono text-sm" }), _jsxs(Button, { type: "button", variant: "outline", className: "shrink-0", onClick: copy, children: [copied ? _jsx(Check, { "aria-hidden": true }) : _jsx(Copy, { "aria-hidden": true }), intl.formatMessage(messages.copy)] })] }), _jsxs(Alert, { children: [_jsx(TriangleAlert, { "aria-hidden": true }), _jsx(AlertDescription, { children: intl.formatMessage(messages.warning, { email }) })] })] }));
64
+ }
@@ -0,0 +1,21 @@
1
+ import type { MemberRole } from '../../../domain/types/member';
2
+ /**
3
+ * A radio-card selector over the three assignable system roles, with each
4
+ * role's description and a "Current" badge on the saved one. Controlled: the
5
+ * parent owns `value` and decides what "apply" does. Used by the detail page's
6
+ * Role tab (and available to the invite flow).
7
+ */
8
+ export declare function RolePicker({ value, current, disabled, onChange }: {
9
+ /**
10
+ * The selected role, or `null` for a member holding a custom role — no card
11
+ * is then marked selected, rather than one being picked on their behalf.
12
+ */
13
+ value: MemberRole | null;
14
+ /** The member's currently-saved role, badged as "Current". */
15
+ current?: MemberRole | null;
16
+ /** Disables selection (read-only / in-flight). */
17
+ disabled?: boolean;
18
+ /** Called with the newly-picked role. */
19
+ onChange: (role: MemberRole) => void;
20
+ }): import("react").JSX.Element;
21
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/lib/presentation/components/RolePicker/index.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAyC/D;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,EACvB,KAAK,EACL,OAAO,EACP,QAAgB,EAChB,QAAQ,EACX,EAAE;IACC;;;OAGG;IACH,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;IACzB,8DAA8D;IAC9D,OAAO,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IAC5B,kDAAkD;IAClD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,yCAAyC;IACzC,QAAQ,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;CACxC,+BAsDA"}
@@ -0,0 +1,51 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { defineMessages, useIntl } from 'react-intl';
3
+ import { Badge, Label, RadioGroup, RadioGroupItem, cn } from '@orthacms/design-system';
4
+ /** Intl descriptors for {@link RolePicker}, co-located with the component. */
5
+ const messages = defineMessages({
6
+ adminName: { id: 'users.rolePicker.adminName', defaultMessage: 'Admin' },
7
+ adminDesc: {
8
+ id: 'users.rolePicker.adminDesc',
9
+ defaultMessage: 'Full access: manage members, roles, workspaces, and content.'
10
+ },
11
+ contributorName: {
12
+ id: 'users.rolePicker.contributorName',
13
+ defaultMessage: 'Contributor'
14
+ },
15
+ contributorDesc: {
16
+ id: 'users.rolePicker.contributorDesc',
17
+ defaultMessage: 'Can read members and work within their workspaces.'
18
+ },
19
+ viewerName: { id: 'users.rolePicker.viewerName', defaultMessage: 'Viewer' },
20
+ viewerDesc: {
21
+ id: 'users.rolePicker.viewerDesc',
22
+ defaultMessage: 'Read-only access to members and workspaces.'
23
+ },
24
+ current: { id: 'users.rolePicker.current', defaultMessage: 'Current' },
25
+ group: { id: 'users.rolePicker.group', defaultMessage: 'Global role' }
26
+ });
27
+ const ROLES = [
28
+ { key: 'admin', name: messages.adminName, desc: messages.adminDesc },
29
+ {
30
+ key: 'contributor',
31
+ name: messages.contributorName,
32
+ desc: messages.contributorDesc
33
+ },
34
+ { key: 'viewer', name: messages.viewerName, desc: messages.viewerDesc }
35
+ ];
36
+ /**
37
+ * A radio-card selector over the three assignable system roles, with each
38
+ * role's description and a "Current" badge on the saved one. Controlled: the
39
+ * parent owns `value` and decides what "apply" does. Used by the detail page's
40
+ * Role tab (and available to the invite flow).
41
+ */
42
+ export function RolePicker({ value, current, disabled = false, onChange }) {
43
+ const intl = useIntl();
44
+ return (_jsx(RadioGroup, { value: value ?? undefined, onValueChange: (next) => onChange(next), disabled: disabled, "aria-label": intl.formatMessage(messages.group), className: "gap-3", children: ROLES.map((role) => {
45
+ const id = `role-${role.key}`;
46
+ const selected = value === role.key;
47
+ return (_jsxs(Label, { htmlFor: id, className: cn('flex cursor-pointer items-start gap-3 rounded-lg border p-4 transition-colors', selected
48
+ ? 'border-primary bg-primary/5'
49
+ : 'hover:bg-muted/50', disabled && 'cursor-not-allowed opacity-70'), children: [_jsx(RadioGroupItem, { id: id, value: role.key, className: "mt-0.5" }), _jsxs("div", { className: "space-y-1", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "text-sm font-medium", children: intl.formatMessage(role.name) }), current === role.key ? (_jsx(Badge, { variant: "secondary", className: "rounded-xl border-border", children: intl.formatMessage(messages.current) })) : null] }), _jsx("p", { className: "text-xs text-muted-foreground", children: intl.formatMessage(role.desc) })] })] }, role.key));
50
+ }) }));
51
+ }
@@ -0,0 +1,15 @@
1
+ import type { UserSession } from '../../../application/useUserSessions';
2
+ /**
3
+ * One of a member's live sessions: device/user-agent, originating IP, when it
4
+ * was last seen, and a Revoke action. The caller's own session is badged and
5
+ * its Revoke button disabled, so an admin can't sign themselves out from here.
6
+ */
7
+ export declare function SessionCard({ session, busy, onRevoke }: {
8
+ /** The session to render. */
9
+ session: UserSession;
10
+ /** Whether a revoke for this session is in flight. */
11
+ busy?: boolean;
12
+ /** Revoke handler. */
13
+ onRevoke: (session: UserSession) => void;
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/SessionCard/index.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAuBxE;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,EACxB,OAAO,EACP,IAAY,EACZ,QAAQ,EACX,EAAE;IACC,6BAA6B;IAC7B,OAAO,EAAE,WAAW,CAAC;IACrB,sDAAsD;IACtD,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,sBAAsB;IACtB,QAAQ,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,CAAC;CAC5C,+BAyDA"}
@@ -0,0 +1,43 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { defineMessages, useIntl } from 'react-intl';
3
+ import { MonitorSmartphone } from 'lucide-react';
4
+ import { Badge, Button, Card, CardContent, Spinner } from '@orthacms/design-system';
5
+ /** Intl descriptors for {@link SessionCard}. */
6
+ const messages = defineMessages({
7
+ unknownDevice: {
8
+ id: 'users.sessions.unknownDevice',
9
+ defaultMessage: 'Unknown device'
10
+ },
11
+ current: {
12
+ id: 'users.sessions.current',
13
+ defaultMessage: 'This session'
14
+ },
15
+ lastSeen: {
16
+ id: 'users.sessions.lastSeen',
17
+ defaultMessage: 'Last seen {when}'
18
+ },
19
+ revoke: { id: 'users.sessions.revoke', defaultMessage: 'Revoke' },
20
+ revokeLabel: {
21
+ id: 'users.sessions.revokeLabel',
22
+ defaultMessage: 'Revoke the session on {device}, last seen {when}'
23
+ }
24
+ });
25
+ /**
26
+ * One of a member's live sessions: device/user-agent, originating IP, when it
27
+ * was last seen, and a Revoke action. The caller's own session is badged and
28
+ * its Revoke button disabled, so an admin can't sign themselves out from here.
29
+ */
30
+ export function SessionCard({ session, busy = false, onRevoke }) {
31
+ const intl = useIntl();
32
+ const device = session.userAgent?.trim() || intl.formatMessage(messages.unknownDevice);
33
+ const lastSeen = intl.formatDate(session.lastSeenAt, {
34
+ dateStyle: 'medium',
35
+ timeStyle: 'short'
36
+ });
37
+ return (_jsx(Card, { children: _jsxs(CardContent, { className: "flex items-center gap-3 pt-6", children: [_jsx("span", { className: "flex size-9 shrink-0 items-center justify-center rounded-lg bg-muted text-muted-foreground", children: _jsx(MonitorSmartphone, { "aria-hidden": true, className: "size-4" }) }), _jsxs("div", { className: "min-w-0 flex-1 space-y-0.5", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("p", { className: "min-w-0 truncate text-sm font-medium", children: device }), session.current ? (_jsx(Badge, { variant: "secondary", className: "shrink-0 whitespace-nowrap rounded-xl border-border", children: intl.formatMessage(messages.current) })) : null] }), _jsxs("p", { className: "truncate text-xs text-muted-foreground", children: [session.ipAddress ? `${session.ipAddress} · ` : '', intl.formatMessage(messages.lastSeen, {
38
+ when: lastSeen
39
+ })] })] }), _jsxs(Button, { variant: "ghost", size: "sm", className: "text-muted-foreground", disabled: busy || session.current, "aria-label": intl.formatMessage(messages.revokeLabel, {
40
+ device,
41
+ when: lastSeen
42
+ }), onClick: () => onRevoke(session), children: [busy ? _jsx(Spinner, {}) : null, intl.formatMessage(messages.revoke)] })] }) }));
43
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Invisible bridge that pulls the signed-in user's stored theme from the server
3
+ * into the app-wide {@link useAppearance} provider once, on load. It renders
4
+ * nothing — it exists only for the effect — and is contributed into the shell's
5
+ * **sidebar footer**, the one region the shell keeps mounted in both the global
6
+ * and per-workspace sidebar contexts, so it stays mounted across every
7
+ * authenticated route (a member never has to open their Preferences tab, or
8
+ * even leave a workspace, for their saved theme to take effect).
9
+ *
10
+ * `localStorage` gives the instant, pre-paint theme (see the AppearanceProvider
11
+ * + the index.html bootstrap); this reconciles that guess with the durable,
12
+ * cross-device value the server holds, so signing in on a new device still
13
+ * lands on the user's chosen theme. Setting the same value is a no-op in the
14
+ * provider, so this never fights a change the user just made on the tab.
15
+ *
16
+ * A failed read is deliberately silent *here* — a background hydrate is not
17
+ * worth a toast on every route — but it is not silent overall: the Preferences
18
+ * tab reads the same query and surfaces the error where the user can act on it.
19
+ */
20
+ export declare function ThemeSync(): null;
21
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/lib/presentation/components/ThemeSync/index.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,SAAS,SAWxB"}
@@ -0,0 +1,32 @@
1
+ import { useEffect } from 'react';
2
+ import { useAppearance } from '@orthacms/design-system';
3
+ import { usePreferences } from '../../../application/usePreferences';
4
+ /**
5
+ * Invisible bridge that pulls the signed-in user's stored theme from the server
6
+ * into the app-wide {@link useAppearance} provider once, on load. It renders
7
+ * nothing — it exists only for the effect — and is contributed into the shell's
8
+ * **sidebar footer**, the one region the shell keeps mounted in both the global
9
+ * and per-workspace sidebar contexts, so it stays mounted across every
10
+ * authenticated route (a member never has to open their Preferences tab, or
11
+ * even leave a workspace, for their saved theme to take effect).
12
+ *
13
+ * `localStorage` gives the instant, pre-paint theme (see the AppearanceProvider
14
+ * + the index.html bootstrap); this reconciles that guess with the durable,
15
+ * cross-device value the server holds, so signing in on a new device still
16
+ * lands on the user's chosen theme. Setting the same value is a no-op in the
17
+ * provider, so this never fights a change the user just made on the tab.
18
+ *
19
+ * A failed read is deliberately silent *here* — a background hydrate is not
20
+ * worth a toast on every route — but it is not silent overall: the Preferences
21
+ * tab reads the same query and surfaces the error where the user can act on it.
22
+ */
23
+ export function ThemeSync() {
24
+ const { setTheme } = useAppearance();
25
+ const { data } = usePreferences();
26
+ useEffect(() => {
27
+ if (data) {
28
+ setTheme(data.theme);
29
+ }
30
+ }, [data, setTheme]);
31
+ return null;
32
+ }
@@ -0,0 +1,15 @@
1
+ import type { Member } from '../../../../domain/types/member';
2
+ /**
3
+ * The detail page's horizontal tab navigation — underline tabs between the
4
+ * hero and the active section. The account tabs (General, Role, Workspaces)
5
+ * are always shown; Sessions/Activity and Sign-in access are gated — without
6
+ * the permission the tab is hidden and its route redirects away, so a
7
+ * read-only admin never sees a dead link. Preferences is **self-only** — it
8
+ * carries the current user's own app settings (theme), so it shows only on
9
+ * their own profile. Links are absolute (`/users/:id/…`) so active state is
10
+ * unambiguous regardless of the matched tab.
11
+ */
12
+ export declare function UserDetailTabs({ member }: {
13
+ member: Member;
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/UserDetailLayout/UserDetailTabs/index.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iCAAiC,CAAC;AAmD9D;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,+BA6D5D"}
@@ -0,0 +1,52 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { NavLink } from 'react-router-dom';
3
+ import { defineMessages, useIntl } from 'react-intl';
4
+ import { Activity, Ban, Building2, MonitorSmartphone, ShieldCheck, SlidersHorizontal, UserRound } from 'lucide-react';
5
+ import { Badge, TabNav, TabNavLink } from '@orthacms/design-system';
6
+ import { AuthStatus, useAuth, useHasPermission } from '@orthacms/identity-admin';
7
+ /** Intl descriptors for {@link UserDetailTabs}, co-located with the component. */
8
+ const messages = defineMessages({
9
+ general: { id: 'users.detail.rail.general', defaultMessage: 'General' },
10
+ role: { id: 'users.detail.rail.role', defaultMessage: 'Role' },
11
+ workspaces: {
12
+ id: 'users.detail.rail.workspaces',
13
+ defaultMessage: 'Workspaces'
14
+ },
15
+ sessions: { id: 'users.detail.rail.sessions', defaultMessage: 'Sessions' },
16
+ activity: { id: 'users.detail.rail.activity', defaultMessage: 'Activity' },
17
+ signInAccess: {
18
+ id: 'users.detail.rail.signInAccess',
19
+ defaultMessage: 'Sign-in access'
20
+ },
21
+ preferences: {
22
+ id: 'users.detail.rail.preferences',
23
+ defaultMessage: 'Preferences'
24
+ },
25
+ disabled: { id: 'users.detail.rail.disabled', defaultMessage: 'Disabled' },
26
+ nav: { id: 'users.detail.rail.nav', defaultMessage: 'User detail sections' }
27
+ });
28
+ /** One tab: an absolute-path `NavLink` whose active state underlines it. */
29
+ function UserDetailTab({ to, icon: Icon, label, trailing }) {
30
+ return (_jsx(TabNavLink, { asChild: true, children: _jsxs(NavLink, { to: to, children: [_jsx(Icon, { "aria-hidden": true, className: "size-4 shrink-0" }), label, trailing ? (_jsx(Badge, { variant: "destructive-soft", children: trailing })) : null] }) }));
31
+ }
32
+ /**
33
+ * The detail page's horizontal tab navigation — underline tabs between the
34
+ * hero and the active section. The account tabs (General, Role, Workspaces)
35
+ * are always shown; Sessions/Activity and Sign-in access are gated — without
36
+ * the permission the tab is hidden and its route redirects away, so a
37
+ * read-only admin never sees a dead link. Preferences is **self-only** — it
38
+ * carries the current user's own app settings (theme), so it shows only on
39
+ * their own profile. Links are absolute (`/users/:id/…`) so active state is
40
+ * unambiguous regardless of the matched tab.
41
+ */
42
+ export function UserDetailTabs({ member }) {
43
+ const intl = useIntl();
44
+ const canManage = useHasPermission('users:update');
45
+ const canReadActivity = useHasPermission('activity:read');
46
+ const auth = useAuth();
47
+ const isSelf = auth.status === AuthStatus.Authenticated && auth.user.id === member.id;
48
+ const base = `/users/${member.id}`;
49
+ return (_jsxs(TabNav, { "aria-label": intl.formatMessage(messages.nav), children: [_jsx(UserDetailTab, { to: `${base}/general`, icon: UserRound, label: intl.formatMessage(messages.general) }), _jsx(UserDetailTab, { to: `${base}/roles`, icon: ShieldCheck, label: intl.formatMessage(messages.role) }), _jsx(UserDetailTab, { to: `${base}/workspaces`, icon: Building2, label: intl.formatMessage(messages.workspaces) }), canManage ? (_jsx(UserDetailTab, { to: `${base}/sessions`, icon: MonitorSmartphone, label: intl.formatMessage(messages.sessions) })) : null, canReadActivity ? (_jsx(UserDetailTab, { to: `${base}/activity`, icon: Activity, label: intl.formatMessage(messages.activity) })) : null, canManage ? (_jsx(UserDetailTab, { to: `${base}/access`, icon: Ban, label: intl.formatMessage(messages.signInAccess), trailing: member.status === 'disabled'
50
+ ? intl.formatMessage(messages.disabled)
51
+ : undefined })) : null, isSelf ? (_jsx(UserDetailTab, { to: `${base}/preferences`, icon: SlidersHorizontal, label: intl.formatMessage(messages.preferences) })) : null] }));
52
+ }
@@ -0,0 +1,10 @@
1
+ import type { Member } from '../../../../domain/types/member';
2
+ /**
3
+ * The detail page's identity card: a large initials avatar, the member's name
4
+ * and email, their status and role badges, and the join date. Read-only — every
5
+ * edit lives in a tab below.
6
+ */
7
+ export declare function UserHero({ member }: {
8
+ member: Member;
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/UserDetailLayout/UserHero/index.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iCAAiC,CAAC;AAU9D;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,+BAoCtD"}