@mesob/auth-react 0.5.0 → 0.5.3

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 (214) hide show
  1. package/dist/{chunk-DG6GRTPG.js → chunk-4LHFPVAY.js} +2 -2
  2. package/dist/{chunk-H5PUZDNU.js → chunk-57L345IN.js} +4 -4
  3. package/dist/{chunk-CP4TTRV4.js → chunk-5B6GREDA.js} +2 -2
  4. package/dist/{chunk-TEHMLZFI.js → chunk-5XCUGCW7.js} +4 -4
  5. package/dist/{chunk-5AEV7RAN.js → chunk-6AV6I5B4.js} +3 -3
  6. package/dist/{chunk-SGDXNT7M.js → chunk-7VWWIN6Q.js} +3 -3
  7. package/dist/{chunk-AWSAC7RT.js → chunk-A5ON3RKH.js} +6 -3
  8. package/dist/chunk-A5ON3RKH.js.map +1 -0
  9. package/dist/{chunk-V6ZHX4LT.js → chunk-BM3YKYGC.js} +2 -2
  10. package/dist/{chunk-TLQMK2QF.js → chunk-BX75EFF3.js} +4 -4
  11. package/dist/{chunk-OXUOGOG3.js → chunk-DCWKYK3D.js} +88 -21
  12. package/dist/chunk-DCWKYK3D.js.map +1 -0
  13. package/dist/{chunk-W3D4HG5W.js → chunk-DRM44QBR.js} +3 -3
  14. package/dist/{chunk-Z34NJZRL.js → chunk-EIJFTUTM.js} +3 -3
  15. package/dist/{chunk-5E3XN6SW.js → chunk-FCPN2FD7.js} +5 -5
  16. package/dist/{chunk-VVKXFEAN.js → chunk-FLGP4ROM.js} +5 -5
  17. package/dist/{chunk-5SDS2E3F.js → chunk-FU4K62DS.js} +2 -2
  18. package/dist/chunk-G2XRGSQE.js +22 -0
  19. package/dist/chunk-G2XRGSQE.js.map +1 -0
  20. package/dist/{chunk-X2BHF4KC.js → chunk-G4VPR4UC.js} +2 -2
  21. package/dist/{chunk-MQI6Q2S4.js → chunk-GGBS64Z5.js} +147 -4
  22. package/dist/chunk-GGBS64Z5.js.map +1 -0
  23. package/dist/{chunk-2PV7RYNK.js → chunk-GQFTH5DQ.js} +95 -20
  24. package/dist/chunk-GQFTH5DQ.js.map +1 -0
  25. package/dist/{chunk-UY55LEIG.js → chunk-H2W42KYL.js} +2 -2
  26. package/dist/{chunk-EPEXIGKB.js → chunk-HBQK5PAH.js} +2 -2
  27. package/dist/{chunk-4ABXALRN.js → chunk-IBRB7ABJ.js} +2 -2
  28. package/dist/{chunk-RMJNENJB.js → chunk-IFFWIROT.js} +2 -2
  29. package/dist/{chunk-WY2JJNZW.js → chunk-IK7V3PT3.js} +2 -2
  30. package/dist/{chunk-N4JFMKGK.js → chunk-JKUKCVY7.js} +5 -5
  31. package/dist/{chunk-MWMSZVH3.js → chunk-K6ACPILA.js} +4 -4
  32. package/dist/{chunk-5BFG47VF.js → chunk-PUOQX6DR.js} +4 -4
  33. package/dist/{chunk-EQWOGD4F.js → chunk-SA6HTWCL.js} +2 -2
  34. package/dist/{chunk-73ZNGEWU.js → chunk-SX6WAVQS.js} +5 -5
  35. package/dist/{chunk-5HAABEAS.js → chunk-TAJQ7O3U.js} +2 -2
  36. package/dist/{chunk-MVVAPYUD.js → chunk-TPG4RW7H.js} +2 -2
  37. package/dist/{chunk-ECF6S2Y2.js → chunk-USVJBAWJ.js} +2 -2
  38. package/dist/{chunk-T34HJRUW.js → chunk-VMAGFUOK.js} +3 -3
  39. package/dist/{chunk-ZZ6D4KE4.js → chunk-VS5FEGMX.js} +2 -2
  40. package/dist/{chunk-IQNQGPIT.js → chunk-VWYJI2FU.js} +4 -4
  41. package/dist/{chunk-H7JRQFFI.js → chunk-W2HMARW4.js} +4 -4
  42. package/dist/{chunk-RRLFPSSM.js → chunk-W7UHDTBI.js} +33 -2
  43. package/dist/chunk-W7UHDTBI.js.map +1 -0
  44. package/dist/{chunk-4X3CJHKR.js → chunk-XLPPZKU2.js} +4 -4
  45. package/dist/{chunk-YFQNNSSC.js → chunk-XO5LLEGV.js} +2 -2
  46. package/dist/{chunk-4NUO6F3J.js → chunk-XZAYLXLS.js} +2 -2
  47. package/dist/{chunk-7CLKBH5Z.js → chunk-YCVDEX5U.js} +3 -3
  48. package/dist/{chunk-6THPM5LB.js → chunk-YQU3KG74.js} +4 -4
  49. package/dist/{chunk-GVEBIL3O.js → chunk-YVHMCTLM.js} +2 -2
  50. package/dist/{chunk-6IEX2RLA.js → chunk-Z4FXOZEJ.js} +3 -3
  51. package/dist/{chunk-UGQP733V.js → chunk-ZOKBN5H4.js} +2 -2
  52. package/dist/components/auth/countdown.js +3 -3
  53. package/dist/components/auth/forgot-password.js +4 -4
  54. package/dist/components/auth/reset-password-form.js +4 -4
  55. package/dist/components/auth/set-password.js +4 -4
  56. package/dist/components/auth/sign-in.js +4 -4
  57. package/dist/components/auth/sign-up.js +4 -4
  58. package/dist/components/auth/verification-form.js +4 -4
  59. package/dist/components/auth/verify-email.js +6 -6
  60. package/dist/components/auth/verify-phone.js +6 -6
  61. package/dist/components/authorization/deny.js +2 -2
  62. package/dist/components/authorization/grant.js +2 -2
  63. package/dist/components/error-boundary.d.ts +1 -1
  64. package/dist/components/iam/domains-page.js +6 -6
  65. package/dist/components/iam/iam-guard.js +3 -3
  66. package/dist/components/iam/permission-selector.js +2 -2
  67. package/dist/components/iam/permissions-page.js +4 -4
  68. package/dist/components/iam/permissions.js +2 -2
  69. package/dist/components/iam/role-detail-layout.js +2 -2
  70. package/dist/components/iam/role-detail-page.js +4 -4
  71. package/dist/components/iam/role-permissions-page.js +5 -5
  72. package/dist/components/iam/roles-page.js +6 -7
  73. package/dist/components/iam/roles.js +2 -2
  74. package/dist/components/iam/sessions-page.js +6 -6
  75. package/dist/components/iam/sessions.js +2 -2
  76. package/dist/components/iam/tenants-page.js +6 -6
  77. package/dist/components/iam/tenants.js +2 -2
  78. package/dist/components/iam/users-page.js +7 -7
  79. package/dist/components/iam/users.js +2 -2
  80. package/dist/components/profile/account.js +2 -2
  81. package/dist/components/profile/change-email-form.js +8 -8
  82. package/dist/components/profile/change-password-form.js +2 -2
  83. package/dist/components/profile/change-phone-form.js +8 -8
  84. package/dist/components/profile/otp-verification-modal.js +5 -5
  85. package/dist/components/profile/profile-layout.js +3 -3
  86. package/dist/components/profile/request-change-email-form.js +2 -2
  87. package/dist/components/profile/request-change-phone-form.js +2 -2
  88. package/dist/components/profile/security.js +13 -13
  89. package/dist/components/profile/verify-change-email-form.js +6 -6
  90. package/dist/components/profile/verify-change-phone-form.js +6 -6
  91. package/dist/index.d.ts +1 -0
  92. package/dist/index.js +976 -64
  93. package/dist/index.js.map +1 -1
  94. package/dist/pages/__import_guard_probe.d.ts +4 -0
  95. package/dist/pages/auth/forgot-password.js +1 -8
  96. package/dist/pages/auth/forgot-password.js.map +1 -1
  97. package/dist/pages/auth/layout.js +6 -4
  98. package/dist/pages/auth/layout.js.map +1 -1
  99. package/dist/pages/auth/reset-password.js +1 -8
  100. package/dist/pages/auth/reset-password.js.map +1 -1
  101. package/dist/pages/auth/set-password.js +1 -9
  102. package/dist/pages/auth/set-password.js.map +1 -1
  103. package/dist/pages/auth/sign-in.js +1 -9
  104. package/dist/pages/auth/sign-in.js.map +1 -1
  105. package/dist/pages/auth/sign-up.js +1 -8
  106. package/dist/pages/auth/sign-up.js.map +1 -1
  107. package/dist/pages/auth/verify-email.js +1 -10
  108. package/dist/pages/auth/verify-email.js.map +1 -1
  109. package/dist/pages/auth/verify-phone.js +1 -10
  110. package/dist/pages/auth/verify-phone.js.map +1 -1
  111. package/dist/pages/iam/domains.d.ts +1 -1
  112. package/dist/pages/iam/permissions.d.ts +1 -1
  113. package/dist/pages/iam/permissions.js +3 -7
  114. package/dist/pages/iam/permissions.js.map +1 -1
  115. package/dist/pages/iam/role-detail-layout.js +1 -5
  116. package/dist/pages/iam/role-detail-layout.js.map +1 -1
  117. package/dist/pages/iam/role-detail.js +1 -7
  118. package/dist/pages/iam/role-detail.js.map +1 -1
  119. package/dist/pages/iam/role-permissions.js +1 -8
  120. package/dist/pages/iam/role-permissions.js.map +1 -1
  121. package/dist/pages/iam/role-users.js +1 -13
  122. package/dist/pages/iam/role-users.js.map +1 -1
  123. package/dist/pages/iam/roles.d.ts +1 -1
  124. package/dist/pages/iam/roles.js +3 -11
  125. package/dist/pages/iam/roles.js.map +1 -1
  126. package/dist/pages/iam/sessions.d.ts +1 -1
  127. package/dist/pages/iam/sessions.js +3 -9
  128. package/dist/pages/iam/sessions.js.map +1 -1
  129. package/dist/pages/iam/tenant-detail.js +1 -8
  130. package/dist/pages/iam/tenant-detail.js.map +1 -1
  131. package/dist/pages/iam/tenants/tenant-selector.js +3 -3
  132. package/dist/pages/iam/tenants.d.ts +1 -1
  133. package/dist/pages/iam/tenants.js +3 -10
  134. package/dist/pages/iam/tenants.js.map +1 -1
  135. package/dist/pages/iam/user-activity.js +1 -12
  136. package/dist/pages/iam/user-activity.js.map +1 -1
  137. package/dist/pages/iam/user-detail-layout.js +1 -7
  138. package/dist/pages/iam/user-detail-layout.js.map +1 -1
  139. package/dist/pages/iam/user-detail.js +1 -7
  140. package/dist/pages/iam/user-detail.js.map +1 -1
  141. package/dist/pages/iam/users/user-selector.js +149 -7
  142. package/dist/pages/iam/users/user-selector.js.map +1 -1
  143. package/dist/pages/iam/users.d.ts +1 -1
  144. package/dist/pages/iam/users.js +3 -11
  145. package/dist/pages/iam/users.js.map +1 -1
  146. package/dist/pages/profile/account.js +2 -5
  147. package/dist/pages/profile/account.js.map +1 -1
  148. package/dist/pages/profile/layout.d.ts +1 -1
  149. package/dist/pages/profile/layout.js +3 -5
  150. package/dist/pages/profile/layout.js.map +1 -1
  151. package/dist/pages/profile/security.js +2 -16
  152. package/dist/pages/profile/security.js.map +1 -1
  153. package/dist/types.d.ts +11 -2
  154. package/dist/utils/handle-error.d.ts +3 -1
  155. package/dist/utils/safe-redirect.d.ts +2 -0
  156. package/package.json +3 -3
  157. package/dist/chunk-2PV7RYNK.js.map +0 -1
  158. package/dist/chunk-AWSAC7RT.js.map +0 -1
  159. package/dist/chunk-GBDNBY6K.js +0 -153
  160. package/dist/chunk-GBDNBY6K.js.map +0 -1
  161. package/dist/chunk-MQI6Q2S4.js.map +0 -1
  162. package/dist/chunk-NFGFJPCX.js +0 -313
  163. package/dist/chunk-NFGFJPCX.js.map +0 -1
  164. package/dist/chunk-NJMNRSJH.js +0 -83
  165. package/dist/chunk-NJMNRSJH.js.map +0 -1
  166. package/dist/chunk-OXUOGOG3.js.map +0 -1
  167. package/dist/chunk-QPEUVMSP.js +0 -149
  168. package/dist/chunk-QPEUVMSP.js.map +0 -1
  169. package/dist/chunk-RCQTWNAG.js +0 -150
  170. package/dist/chunk-RCQTWNAG.js.map +0 -1
  171. package/dist/chunk-RRLFPSSM.js.map +0 -1
  172. package/dist/chunk-SGUROG23.js +0 -356
  173. package/dist/chunk-SGUROG23.js.map +0 -1
  174. package/dist/chunk-X6EUQZSZ.js +0 -81
  175. package/dist/chunk-X6EUQZSZ.js.map +0 -1
  176. /package/dist/{chunk-DG6GRTPG.js.map → chunk-4LHFPVAY.js.map} +0 -0
  177. /package/dist/{chunk-H5PUZDNU.js.map → chunk-57L345IN.js.map} +0 -0
  178. /package/dist/{chunk-CP4TTRV4.js.map → chunk-5B6GREDA.js.map} +0 -0
  179. /package/dist/{chunk-TEHMLZFI.js.map → chunk-5XCUGCW7.js.map} +0 -0
  180. /package/dist/{chunk-5AEV7RAN.js.map → chunk-6AV6I5B4.js.map} +0 -0
  181. /package/dist/{chunk-SGDXNT7M.js.map → chunk-7VWWIN6Q.js.map} +0 -0
  182. /package/dist/{chunk-V6ZHX4LT.js.map → chunk-BM3YKYGC.js.map} +0 -0
  183. /package/dist/{chunk-TLQMK2QF.js.map → chunk-BX75EFF3.js.map} +0 -0
  184. /package/dist/{chunk-W3D4HG5W.js.map → chunk-DRM44QBR.js.map} +0 -0
  185. /package/dist/{chunk-Z34NJZRL.js.map → chunk-EIJFTUTM.js.map} +0 -0
  186. /package/dist/{chunk-5E3XN6SW.js.map → chunk-FCPN2FD7.js.map} +0 -0
  187. /package/dist/{chunk-VVKXFEAN.js.map → chunk-FLGP4ROM.js.map} +0 -0
  188. /package/dist/{chunk-5SDS2E3F.js.map → chunk-FU4K62DS.js.map} +0 -0
  189. /package/dist/{chunk-X2BHF4KC.js.map → chunk-G4VPR4UC.js.map} +0 -0
  190. /package/dist/{chunk-UY55LEIG.js.map → chunk-H2W42KYL.js.map} +0 -0
  191. /package/dist/{chunk-EPEXIGKB.js.map → chunk-HBQK5PAH.js.map} +0 -0
  192. /package/dist/{chunk-4ABXALRN.js.map → chunk-IBRB7ABJ.js.map} +0 -0
  193. /package/dist/{chunk-RMJNENJB.js.map → chunk-IFFWIROT.js.map} +0 -0
  194. /package/dist/{chunk-WY2JJNZW.js.map → chunk-IK7V3PT3.js.map} +0 -0
  195. /package/dist/{chunk-N4JFMKGK.js.map → chunk-JKUKCVY7.js.map} +0 -0
  196. /package/dist/{chunk-MWMSZVH3.js.map → chunk-K6ACPILA.js.map} +0 -0
  197. /package/dist/{chunk-5BFG47VF.js.map → chunk-PUOQX6DR.js.map} +0 -0
  198. /package/dist/{chunk-EQWOGD4F.js.map → chunk-SA6HTWCL.js.map} +0 -0
  199. /package/dist/{chunk-73ZNGEWU.js.map → chunk-SX6WAVQS.js.map} +0 -0
  200. /package/dist/{chunk-5HAABEAS.js.map → chunk-TAJQ7O3U.js.map} +0 -0
  201. /package/dist/{chunk-MVVAPYUD.js.map → chunk-TPG4RW7H.js.map} +0 -0
  202. /package/dist/{chunk-ECF6S2Y2.js.map → chunk-USVJBAWJ.js.map} +0 -0
  203. /package/dist/{chunk-T34HJRUW.js.map → chunk-VMAGFUOK.js.map} +0 -0
  204. /package/dist/{chunk-ZZ6D4KE4.js.map → chunk-VS5FEGMX.js.map} +0 -0
  205. /package/dist/{chunk-IQNQGPIT.js.map → chunk-VWYJI2FU.js.map} +0 -0
  206. /package/dist/{chunk-H7JRQFFI.js.map → chunk-W2HMARW4.js.map} +0 -0
  207. /package/dist/{chunk-4X3CJHKR.js.map → chunk-XLPPZKU2.js.map} +0 -0
  208. /package/dist/{chunk-YFQNNSSC.js.map → chunk-XO5LLEGV.js.map} +0 -0
  209. /package/dist/{chunk-4NUO6F3J.js.map → chunk-XZAYLXLS.js.map} +0 -0
  210. /package/dist/{chunk-7CLKBH5Z.js.map → chunk-YCVDEX5U.js.map} +0 -0
  211. /package/dist/{chunk-6THPM5LB.js.map → chunk-YQU3KG74.js.map} +0 -0
  212. /package/dist/{chunk-GVEBIL3O.js.map → chunk-YVHMCTLM.js.map} +0 -0
  213. /package/dist/{chunk-6IEX2RLA.js.map → chunk-Z4FXOZEJ.js.map} +0 -0
  214. /package/dist/{chunk-UGQP733V.js.map → chunk-ZOKBN5H4.js.map} +0 -0
@@ -1,153 +0,0 @@
1
- import {
2
- UserCard
3
- } from "./chunk-ECF6S2Y2.js";
4
- import {
5
- authApi$
6
- } from "./chunk-W3D4HG5W.js";
7
- import {
8
- defaultEntityQueryOptions
9
- } from "./chunk-NPW7D2HZ.js";
10
-
11
- // src/pages/iam/users/_components/user-selector.tsx
12
- import {
13
- EntitySelector,
14
- Tooltip,
15
- TooltipContent,
16
- TooltipTrigger,
17
- useEntitySectionState
18
- } from "@mesob/ui/components";
19
- import { cn } from "@mesob/ui/lib/utils";
20
- import { IconCalendar, IconCircleCheck, IconUsers } from "@tabler/icons-react";
21
- import { jsx, jsxs } from "react/jsx-runtime";
22
- function SelectableUserCard({
23
- user,
24
- selected,
25
- onToggle
26
- }) {
27
- return (
28
- // biome-ignore lint/a11y/useSemanticElements: div needed to avoid nested buttons from UserCard
29
- /* @__PURE__ */ jsx(
30
- "div",
31
- {
32
- role: "button",
33
- tabIndex: 0,
34
- onClick: onToggle,
35
- onKeyDown: (e) => {
36
- if (e.key === "Enter") {
37
- onToggle();
38
- }
39
- },
40
- className: cn(
41
- "cursor-pointer rounded-lg transition-shadow focus:outline-none focus-visible:ring-2 focus-visible:ring-ring",
42
- selected && "ring-primary ring-2"
43
- ),
44
- children: /* @__PURE__ */ jsx(UserCard, { user })
45
- }
46
- )
47
- );
48
- }
49
- var userColumns = [
50
- {
51
- key: "name",
52
- header: "Name",
53
- cell: (user) => /* @__PURE__ */ jsx("p", { className: "font-medium", children: user.fullName })
54
- },
55
- {
56
- key: "contact",
57
- header: "Contact",
58
- cell: (user) => /* @__PURE__ */ jsxs("div", { className: "space-y-1", children: [
59
- user.email && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
60
- /* @__PURE__ */ jsx("span", { className: "text-sm", children: user.email }),
61
- user.emailVerified && /* @__PURE__ */ jsxs(Tooltip, { children: [
62
- /* @__PURE__ */ jsx(TooltipTrigger, { children: /* @__PURE__ */ jsx(IconCircleCheck, { className: "size-4 text-muted-foreground" }) }),
63
- /* @__PURE__ */ jsx(TooltipContent, { children: "Email verified" })
64
- ] })
65
- ] }),
66
- user.phone && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
67
- /* @__PURE__ */ jsx("span", { className: "text-sm", children: user.phone }),
68
- user.phoneVerified && /* @__PURE__ */ jsxs(Tooltip, { children: [
69
- /* @__PURE__ */ jsx(TooltipTrigger, { children: /* @__PURE__ */ jsx(IconCircleCheck, { className: "size-4 text-muted-foreground" }) }),
70
- /* @__PURE__ */ jsx(TooltipContent, { children: "Phone verified" })
71
- ] })
72
- ] }),
73
- !(user.email || user.phone) && /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "\u2014" })
74
- ] })
75
- },
76
- {
77
- key: "lastSignIn",
78
- header: "Last sign in",
79
- cell: (user) => /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1 text-muted-foreground", children: [
80
- /* @__PURE__ */ jsx(IconCalendar, { className: "h-4 w-4" }),
81
- user.lastSignInAt ? new Date(user.lastSignInAt).toLocaleDateString() : "Never"
82
- ] })
83
- }
84
- ];
85
- var EMPTY_EXCLUDE_IDS = [];
86
- function UserSelector({
87
- trigger,
88
- multiple = false,
89
- onSelect,
90
- excludeIds = EMPTY_EXCLUDE_IDS,
91
- modalSize = "xl",
92
- contentClassName
93
- }) {
94
- const state = useEntitySectionState({
95
- defaultSort: "createdAt",
96
- defaultOrder: "desc",
97
- defaultPageSize: 10,
98
- searchParamName: "handle"
99
- });
100
- const usersQuery = state.queryConfig;
101
- const { data, isPending, isFetching } = authApi$.useQuery(
102
- "get",
103
- "/users",
104
- usersQuery,
105
- defaultEntityQueryOptions
106
- );
107
- const users = (data?.users ?? []).filter((user) => {
108
- return !excludeIds.includes(user.id);
109
- });
110
- const config = {
111
- title: "Select user(s)",
112
- modalSize,
113
- contentClassName,
114
- multiple,
115
- entityName: "user",
116
- entityIcon: IconUsers,
117
- columns: userColumns,
118
- columnCount: 4,
119
- getItemLabel: (user) => user.fullName,
120
- searchPlaceholder: "Search users...",
121
- filterOptions: [
122
- { label: "All", value: "" },
123
- { label: "Email Verified", value: "emailVerified" },
124
- { label: "Phone Verified", value: "phoneVerified" },
125
- { label: "Not Verified", value: "notVerified" }
126
- ],
127
- sortOptions: [
128
- { label: "Created", value: "createdAt" },
129
- { label: "Updated", value: "updatedAt" },
130
- { label: "Name", value: "fullName" },
131
- { label: "Last Sign In", value: "lastSignInAt" }
132
- ],
133
- showViewToggle: false,
134
- renderCard: (user, selected, onToggle) => /* @__PURE__ */ jsx(SelectableUserCard, { user, selected, onToggle })
135
- };
136
- return /* @__PURE__ */ jsx(
137
- EntitySelector,
138
- {
139
- trigger,
140
- config,
141
- onSelect,
142
- items: users,
143
- total: data?.total,
144
- isLoading: isPending || isFetching,
145
- state
146
- }
147
- );
148
- }
149
-
150
- export {
151
- UserSelector
152
- };
153
- //# sourceMappingURL=chunk-GBDNBY6K.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/pages/iam/users/_components/user-selector.tsx"],"sourcesContent":["'use client';\n\nimport {\n EntitySelector,\n type EntitySelectorColumn,\n type EntitySelectorConfig,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n useEntitySectionState,\n} from '@mesob/ui/components';\nimport { cn } from '@mesob/ui/lib/utils';\nimport { IconCalendar, IconCircleCheck, IconUsers } from '@tabler/icons-react';\nimport type { ReactNode } from 'react';\nimport type { paths } from '../../../../data/openapi';\nimport { authApi$, defaultEntityQueryOptions } from '../../shared/page-helpers';\nimport { UserCard } from './user-card';\nimport type { User } from './users-data';\n\nfunction SelectableUserCard({\n user,\n selected,\n onToggle,\n}: {\n user: User;\n selected: boolean;\n onToggle: () => void;\n}) {\n return (\n // biome-ignore lint/a11y/useSemanticElements: div needed to avoid nested buttons from UserCard\n <div\n role=\"button\"\n tabIndex={0}\n onClick={onToggle}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n onToggle();\n }\n }}\n className={cn(\n 'cursor-pointer rounded-lg transition-shadow focus:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n selected && 'ring-primary ring-2',\n )}\n >\n <UserCard user={user} />\n </div>\n );\n}\n\nconst userColumns: EntitySelectorColumn<User>[] = [\n {\n key: 'name',\n header: 'Name',\n cell: (user: User) => <p className=\"font-medium\">{user.fullName}</p>,\n },\n {\n key: 'contact',\n header: 'Contact',\n cell: (user: User) => (\n <div className=\"space-y-1\">\n {user.email && (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm\">{user.email}</span>\n {user.emailVerified && (\n <Tooltip>\n <TooltipTrigger>\n <IconCircleCheck className=\"size-4 text-muted-foreground\" />\n </TooltipTrigger>\n <TooltipContent>Email verified</TooltipContent>\n </Tooltip>\n )}\n </div>\n )}\n {user.phone && (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm\">{user.phone}</span>\n {user.phoneVerified && (\n <Tooltip>\n <TooltipTrigger>\n <IconCircleCheck className=\"size-4 text-muted-foreground\" />\n </TooltipTrigger>\n <TooltipContent>Phone verified</TooltipContent>\n </Tooltip>\n )}\n </div>\n )}\n {!(user.email || user.phone) && (\n <span className=\"text-muted-foreground\">—</span>\n )}\n </div>\n ),\n },\n {\n key: 'lastSignIn',\n header: 'Last sign in',\n cell: (user: User) => (\n <div className=\"flex items-center gap-1 text-muted-foreground\">\n <IconCalendar className=\"h-4 w-4\" />\n {user.lastSignInAt\n ? new Date(user.lastSignInAt).toLocaleDateString()\n : 'Never'}\n </div>\n ),\n },\n];\n\nconst EMPTY_EXCLUDE_IDS: string[] = [];\n\ntype UserSelectorProps = {\n trigger: ReactNode;\n multiple?: boolean;\n onSelect: (users: User[]) => void;\n excludeIds?: string[];\n modalSize?: 'sm' | 'md' | 'lg' | 'xl' | 'full';\n contentClassName?: string;\n};\n\nexport function UserSelector({\n trigger,\n multiple = false,\n onSelect,\n excludeIds = EMPTY_EXCLUDE_IDS,\n modalSize = 'xl',\n contentClassName,\n}: UserSelectorProps) {\n const state = useEntitySectionState({\n defaultSort: 'createdAt',\n defaultOrder: 'desc',\n defaultPageSize: 10,\n searchParamName: 'handle',\n });\n const usersQuery = state.queryConfig as {\n params: {\n query: NonNullable<paths['/users']['get']['parameters']['query']>;\n };\n };\n\n const { data, isPending, isFetching } = authApi$.useQuery(\n 'get',\n '/users',\n usersQuery,\n defaultEntityQueryOptions,\n );\n\n const users = (data?.users ?? []).filter((user: User) => {\n return !excludeIds.includes(user.id);\n });\n\n const config: EntitySelectorConfig<User> = {\n title: 'Select user(s)',\n modalSize,\n contentClassName,\n multiple,\n entityName: 'user',\n entityIcon: IconUsers,\n columns: userColumns,\n columnCount: 4,\n getItemLabel: (user: User) => user.fullName,\n searchPlaceholder: 'Search users...',\n filterOptions: [\n { label: 'All', value: '' },\n { label: 'Email Verified', value: 'emailVerified' },\n { label: 'Phone Verified', value: 'phoneVerified' },\n { label: 'Not Verified', value: 'notVerified' },\n ],\n sortOptions: [\n { label: 'Created', value: 'createdAt' },\n { label: 'Updated', value: 'updatedAt' },\n { label: 'Name', value: 'fullName' },\n { label: 'Last Sign In', value: 'lastSignInAt' },\n ],\n showViewToggle: false,\n renderCard: (user: User, selected: boolean, onToggle: () => void) => (\n <SelectableUserCard user={user} selected={selected} onToggle={onToggle} />\n ),\n };\n\n return (\n <EntitySelector<User>\n trigger={trigger}\n config={config}\n onSelect={onSelect}\n items={users}\n total={data?.total}\n isLoading={isPending || isFetching}\n state={state}\n />\n );\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/pages/iam/roles/_components/role-form.tsx","../src/pages/iam/roles/_components/roles-list.tsx","../src/pages/iam/roles/_components/role-card.tsx"],"sourcesContent":["'use client';\n\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport {\n EntityDrawer,\n EntityFormActions,\n Form,\n FormControl,\n FormField,\n FormItem,\n FormLabel,\n FormMessage,\n Input,\n LocaleInputText,\n LocaleInputTextarea,\n Skeleton,\n} from '@mesob/ui/components';\nimport { useLocaleConfig, useLocaleSchemas } from '@mesob/ui/providers';\nimport { useQueryClient } from '@tanstack/react-query';\nimport { useEffect, useMemo } from 'react';\nimport type { Resolver } from 'react-hook-form';\nimport { useForm, useWatch } from 'react-hook-form';\nimport { z } from 'zod';\nimport { authApi$ } from '../../shared/page-helpers';\n\ntype RoleFormData = {\n name: Record<string, string>;\n code: string;\n description: Record<string, string>;\n permissionIds: string[];\n};\n\ntype RoleFormProps = {\n mode: 'new' | 'edit';\n roleId?: string;\n open: boolean;\n onClose: () => void;\n onSuccess?: () => void;\n};\n\nexport function RoleForm({\n mode,\n roleId,\n open,\n onClose,\n onSuccess,\n}: RoleFormProps) {\n const qc = useQueryClient();\n const { localeInputDefault, requiredSchema, optionalSchema } =\n useLocaleSchemas();\n const { defaultLanguage } = useLocaleConfig();\n const schema = useMemo(\n () =>\n z.object({\n name: requiredSchema,\n code: z.string().min(1, 'Code is required'),\n description: optionalSchema,\n permissionIds: z.array(z.string()),\n }),\n [requiredSchema, optionalSchema],\n );\n const defaults: RoleFormData = useMemo(\n () => ({\n name: { ...localeInputDefault },\n code: '',\n description: { ...localeInputDefault },\n permissionIds: [],\n }),\n [localeInputDefault],\n );\n\n const { data, isLoading } = authApi$.useQuery(\n 'get',\n '/roles/{id}',\n { params: { path: { id: roleId ?? '' } } },\n { enabled: mode === 'edit' && !!roleId },\n );\n const create = authApi$.useMutation('post', '/roles', {\n onSuccess: () => qc.invalidateQueries({ queryKey: ['get', '/roles'] }),\n });\n const update = authApi$.useMutation('put', '/roles/{id}', {\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: ['get', '/roles'] });\n if (roleId) {\n qc.invalidateQueries({ queryKey: ['get', '/roles/{id}'] });\n }\n },\n });\n const del = authApi$.useMutation('delete', '/roles/{id}', {\n onSuccess: () => qc.invalidateQueries({ queryKey: ['get', '/roles'] }),\n });\n\n const form = useForm<RoleFormData>({\n resolver: zodResolver(schema) as Resolver<RoleFormData>,\n defaultValues: defaults,\n });\n\n const { reset, formState, control, register, setValue } = form;\n const nameVal = useWatch({ control, name: 'name' });\n const codeVal = useWatch({ control, name: 'code' });\n\n useEffect(() => {\n const nameDefault =\n typeof nameVal === 'object' &&\n nameVal !== null &&\n defaultLanguage in nameVal\n ? ((nameVal as Record<string, string>)[defaultLanguage] ?? '')\n : '';\n if (\n mode === 'new' &&\n typeof nameDefault === 'string' &&\n nameDefault.trim().length > 0 &&\n !codeVal\n ) {\n const code = nameDefault\n .toLowerCase()\n .replace(/\\s+/g, '-')\n .replace(/[^a-z0-9-]/g, '');\n if (code) {\n setValue('code', code);\n }\n }\n }, [mode, nameVal, setValue, codeVal, defaultLanguage]);\n\n useEffect(() => {\n if (!open) {\n return;\n }\n if (mode === 'edit' && data?.role && !isLoading) {\n const r = data.role;\n reset({\n name: (r.name ?? {}) as RoleFormData['name'],\n code: r.code,\n description: (r.description ?? {}) as RoleFormData['description'],\n permissionIds: r.permissionIds ?? [],\n });\n } else {\n reset({ ...defaults, permissionIds: [] });\n }\n }, [mode, data, open, isLoading, reset, defaults]);\n\n const onSubmit = form.handleSubmit(async (d) => {\n const body = {\n name: d.name,\n code: d.code,\n description: d.description ?? undefined,\n permissionIds: d.permissionIds,\n };\n if (mode === 'new') {\n await create.mutateAsync({ body });\n } else if (roleId) {\n await update.mutateAsync({\n params: { path: { id: roleId } },\n body,\n });\n }\n onSuccess?.();\n onClose();\n });\n\n const onDelete = async () => {\n if (!roleId) {\n return;\n }\n await del.mutateAsync({ params: { path: { id: roleId } } });\n onSuccess?.();\n onClose();\n };\n\n const editable = mode === 'new' || data?.role?.isEditable !== false;\n\n return (\n <EntityDrawer\n title={mode === 'new' ? 'New role' : 'Edit role'}\n open={open}\n onClose={onClose}\n isDirty={formState.isDirty}\n size=\"md\"\n form={\n isLoading ? (\n <FormSkeleton />\n ) : (\n <Form {...form}>\n <form onSubmit={onSubmit} className=\"space-y-4\">\n <LocaleInputText\n label=\"Name\"\n field=\"name\"\n required\n register={register}\n errors={formState.errors}\n placeholder=\"e.g. Administrator\"\n disabled={!editable}\n />\n <FormField\n control={control}\n name=\"code\"\n render={({ field }) => (\n <FormItem>\n <FormLabel>\n Code <span className=\"text-destructive\">*</span>\n </FormLabel>\n <FormControl>\n <Input\n placeholder=\"e.g. admin\"\n disabled={!editable}\n {...field}\n />\n </FormControl>\n <FormMessage />\n </FormItem>\n )}\n />\n <LocaleInputTextarea\n label=\"Description\"\n field=\"description\"\n register={register}\n errors={formState.errors}\n placeholder=\"Description\"\n rows={3}\n disabled={!editable}\n />\n </form>\n </Form>\n )\n }\n actions={\n <EntityFormActions\n mode={mode}\n onSubmit={onSubmit}\n onReset={mode === 'new' ? () => reset(defaults) : undefined}\n onDelete={mode === 'edit' ? onDelete : undefined}\n isSubmitting={create.isPending || update.isPending}\n isDeleting={del.isPending}\n disabled={isLoading || !editable}\n itemName=\"role\"\n />\n }\n />\n );\n}\n\nfunction FormSkeleton() {\n return (\n <div className=\"space-y-4\">\n <div className=\"space-y-2\">\n <Skeleton className=\"h-4 w-16\" />\n <Skeleton className=\"h-10 w-full\" />\n </div>\n <div className=\"space-y-2\">\n <Skeleton className=\"h-4 w-14\" />\n <Skeleton className=\"h-10 w-full\" />\n </div>\n <div className=\"space-y-2\">\n <Skeleton className=\"h-4 w-24\" />\n <Skeleton className=\"h-20 w-full\" />\n </div>\n </div>\n );\n}\n","'use client';\n\nimport {\n Badge,\n DataTableAction,\n DataTablePagination,\n DisplayTable,\n EntityEmptyState,\n EntityLoadingState,\n Tbody,\n Td,\n Th,\n Thead,\n Tr,\n} from '@mesob/ui/components';\nimport { IconCalendar, IconShield } from '@tabler/icons-react';\nimport { useState } from 'react';\nimport { Link } from '../../shared/page-helpers';\nimport { RoleCard } from './role-card';\nimport { RoleForm } from './role-form';\nimport type { Role } from './roles-data';\nimport { str } from './roles-data';\n\nconst TABLE_COLUMN_COUNT = 5;\n\ntype RolesListProps = {\n data: Role[];\n isLoading?: boolean;\n view: 'table' | 'card';\n pageIndex: number;\n pageSize: number;\n pageCount: number;\n totalRows: number;\n onPageChange: (page: number) => void;\n onPageSizeChange: (size: number) => void;\n onCreateNew?: () => void;\n};\n\nexport function RolesList({\n data,\n isLoading,\n view,\n pageIndex,\n pageSize,\n pageCount,\n totalRows,\n onPageChange,\n onPageSizeChange,\n onCreateNew,\n}: RolesListProps) {\n const [drawerRole, setDrawerRole] = useState<Role | null>(null);\n\n if (isLoading) {\n return (\n <EntityLoadingState\n view={view}\n rowCount={pageSize}\n columnCount={TABLE_COLUMN_COUNT}\n cardCount={pageSize}\n />\n );\n }\n if (totalRows === 0) {\n return (\n <EntityEmptyState\n icon={IconShield}\n entityName=\"role\"\n title=\"No roles yet\"\n description=\"Create your first role to get started.\"\n onAction={onCreateNew}\n />\n );\n }\n if (view === 'table') {\n return (\n <div className=\"space-y-4\">\n {drawerRole ? (\n <RoleForm\n mode=\"edit\"\n roleId={drawerRole.id}\n open\n onClose={() => setDrawerRole(null)}\n onSuccess={() => setDrawerRole(null)}\n />\n ) : null}\n <DisplayTable withTableBorder>\n <Thead>\n <Tr>\n <Th>Role</Th>\n <Th>Description</Th>\n <Th>Access</Th>\n <Th>Created</Th>\n <Th className=\"w-[50px]\" />\n </Tr>\n </Thead>\n <Tbody>\n {data.map((role) => (\n <Tr key={role.id} className=\"group\">\n <Td>\n <Link\n href={`/iam/roles/${role.id}`}\n className=\"block text-left font-medium hover:text-primary hover:underline cursor-pointer\"\n >\n <p>{str(role.name) || role.code}</p>\n </Link>\n </Td>\n <Td>\n <span className=\"text-muted-foreground line-clamp-1 max-w-[200px]\">\n {str(role.description) || '—'}\n </span>\n </Td>\n <Td>\n <div className=\"flex flex-wrap gap-2\">\n {role.isSystem ? <Badge>System</Badge> : null}\n <Badge variant=\"secondary\">\n {role.permissionCount ?? role.permissionIds?.length ?? 0}{' '}\n permissions\n </Badge>\n </div>\n </Td>\n <Td>\n <div className=\"flex items-center gap-1 text-muted-foreground\">\n <IconCalendar className=\"h-4 w-4\" />\n {new Date(role.createdAt).toLocaleDateString()}\n </div>\n </Td>\n <Td>\n <DataTableAction onClick={() => setDrawerRole(role)} />\n </Td>\n </Tr>\n ))}\n </Tbody>\n </DisplayTable>\n <DataTablePagination\n pageIndex={pageIndex}\n pageSize={pageSize}\n pageCount={pageCount}\n totalRows={totalRows}\n onPageChange={onPageChange}\n onPageSizeChange={onPageSizeChange}\n />\n </div>\n );\n }\n return (\n <div className=\"space-y-4\">\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4\">\n {data.map((r) => (\n <RoleCard key={r.id} role={r} />\n ))}\n </div>\n <DataTablePagination\n pageIndex={pageIndex}\n pageSize={pageSize}\n pageCount={pageCount}\n totalRows={totalRows}\n onPageChange={onPageChange}\n onPageSizeChange={onPageSizeChange}\n />\n </div>\n );\n}\n","'use client';\n\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardHeader,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuPortal,\n DropdownMenuTrigger,\n} from '@mesob/ui/components';\nimport { IconDots, IconExternalLink } from '@tabler/icons-react';\nimport { useRouter } from '../../shared/page-helpers';\nimport type { Role } from './roles-data';\nimport { str } from './roles-data';\n\ntype RoleCardProps = {\n role: Role;\n mode?: 'navigate' | 'static';\n};\n\nexport function RoleCard({ role, mode = 'navigate' }: RoleCardProps) {\n const router = useRouter();\n const canNavigate = mode === 'navigate';\n\n return (\n <Card className=\"group transition-shadow hover:shadow-md\">\n <CardHeader className=\"pb-2\">\n <div className=\"flex items-start justify-between\">\n <button\n type=\"button\"\n onClick={() => {\n if (canNavigate) {\n router.push(`/iam/roles/${role.id}`);\n }\n }}\n className=\"text-left font-semibold hover:text-primary hover:underline\"\n >\n {str(role.name) || role.code}\n </button>\n {canNavigate ? (\n <DropdownMenu>\n <DropdownMenuTrigger\n render={\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 opacity-0 transition-opacity group-hover:opacity-100\"\n />\n }\n >\n <IconDots className=\"h-4 w-4\" />\n </DropdownMenuTrigger>\n <DropdownMenuPortal>\n <DropdownMenuContent>\n <DropdownMenuItem\n onClick={() => router.push(`/iam/roles/${role.id}`)}\n >\n <IconExternalLink className=\"mr-2 h-4 w-4\" />\n Open\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenuPortal>\n </DropdownMenu>\n ) : null}\n </div>\n <Badge variant=\"outline\" className=\"text-xs\">\n {role.code}\n </Badge>\n </CardHeader>\n <CardContent>\n <div className=\"mb-3 flex flex-wrap gap-2\">\n {role.isSystem ? <Badge>System</Badge> : null}\n <Badge variant=\"secondary\">\n {role.permissionCount ?? role.permissionIds?.length ?? 0}{' '}\n permissions\n </Badge>\n <Badge variant=\"outline\">{role.userCount ?? 0} users</Badge>\n </div>\n {str(role.description) && (\n <p className=\"line-clamp-2 text-sm text-muted-foreground\">\n {str(role.description)}\n </p>\n )}\n <p className=\"mt-2 text-xs text-muted-foreground\">\n Created {new Date(role.createdAt).toLocaleDateString()}\n </p>\n </CardContent>\n </Card>\n );\n}\n"],"mappings":";;;;;;;;;;AAEA,SAAS,mBAAmB;AAC5B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,iBAAiB,wBAAwB;AAClD,SAAS,sBAAsB;AAC/B,SAAS,WAAW,eAAe;AAEnC,SAAS,SAAS,gBAAgB;AAClC,SAAS,SAAS;AA8JR,cAkBU,YAlBV;AA5IH,SAAS,SAAS;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAkB;AAChB,QAAM,KAAK,eAAe;AAC1B,QAAM,EAAE,oBAAoB,gBAAgB,eAAe,IACzD,iBAAiB;AACnB,QAAM,EAAE,gBAAgB,IAAI,gBAAgB;AAC5C,QAAM,SAAS;AAAA,IACb,MACE,EAAE,OAAO;AAAA,MACP,MAAM;AAAA,MACN,MAAM,EAAE,OAAO,EAAE,IAAI,GAAG,kBAAkB;AAAA,MAC1C,aAAa;AAAA,MACb,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA,IACnC,CAAC;AAAA,IACH,CAAC,gBAAgB,cAAc;AAAA,EACjC;AACA,QAAM,WAAyB;AAAA,IAC7B,OAAO;AAAA,MACL,MAAM,EAAE,GAAG,mBAAmB;AAAA,MAC9B,MAAM;AAAA,MACN,aAAa,EAAE,GAAG,mBAAmB;AAAA,MACrC,eAAe,CAAC;AAAA,IAClB;AAAA,IACA,CAAC,kBAAkB;AAAA,EACrB;AAEA,QAAM,EAAE,MAAM,UAAU,IAAI,SAAS;AAAA,IACnC;AAAA,IACA;AAAA,IACA,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,UAAU,GAAG,EAAE,EAAE;AAAA,IACzC,EAAE,SAAS,SAAS,UAAU,CAAC,CAAC,OAAO;AAAA,EACzC;AACA,QAAM,SAAS,SAAS,YAAY,QAAQ,UAAU;AAAA,IACpD,WAAW,MAAM,GAAG,kBAAkB,EAAE,UAAU,CAAC,OAAO,QAAQ,EAAE,CAAC;AAAA,EACvE,CAAC;AACD,QAAM,SAAS,SAAS,YAAY,OAAO,eAAe;AAAA,IACxD,WAAW,MAAM;AACf,SAAG,kBAAkB,EAAE,UAAU,CAAC,OAAO,QAAQ,EAAE,CAAC;AACpD,UAAI,QAAQ;AACV,WAAG,kBAAkB,EAAE,UAAU,CAAC,OAAO,aAAa,EAAE,CAAC;AAAA,MAC3D;AAAA,IACF;AAAA,EACF,CAAC;AACD,QAAM,MAAM,SAAS,YAAY,UAAU,eAAe;AAAA,IACxD,WAAW,MAAM,GAAG,kBAAkB,EAAE,UAAU,CAAC,OAAO,QAAQ,EAAE,CAAC;AAAA,EACvE,CAAC;AAED,QAAM,OAAO,QAAsB;AAAA,IACjC,UAAU,YAAY,MAAM;AAAA,IAC5B,eAAe;AAAA,EACjB,CAAC;AAED,QAAM,EAAE,OAAO,WAAW,SAAS,UAAU,SAAS,IAAI;AAC1D,QAAM,UAAU,SAAS,EAAE,SAAS,MAAM,OAAO,CAAC;AAClD,QAAM,UAAU,SAAS,EAAE,SAAS,MAAM,OAAO,CAAC;AAElD,YAAU,MAAM;AACd,UAAM,cACJ,OAAO,YAAY,YACnB,YAAY,QACZ,mBAAmB,UACb,QAAmC,eAAe,KAAK,KACzD;AACN,QACE,SAAS,SACT,OAAO,gBAAgB,YACvB,YAAY,KAAK,EAAE,SAAS,KAC5B,CAAC,SACD;AACA,YAAM,OAAO,YACV,YAAY,EACZ,QAAQ,QAAQ,GAAG,EACnB,QAAQ,eAAe,EAAE;AAC5B,UAAI,MAAM;AACR,iBAAS,QAAQ,IAAI;AAAA,MACvB;AAAA,IACF;AAAA,EACF,GAAG,CAAC,MAAM,SAAS,UAAU,SAAS,eAAe,CAAC;AAEtD,YAAU,MAAM;AACd,QAAI,CAAC,MAAM;AACT;AAAA,IACF;AACA,QAAI,SAAS,UAAU,MAAM,QAAQ,CAAC,WAAW;AAC/C,YAAM,IAAI,KAAK;AACf,YAAM;AAAA,QACJ,MAAO,EAAE,QAAQ,CAAC;AAAA,QAClB,MAAM,EAAE;AAAA,QACR,aAAc,EAAE,eAAe,CAAC;AAAA,QAChC,eAAe,EAAE,iBAAiB,CAAC;AAAA,MACrC,CAAC;AAAA,IACH,OAAO;AACL,YAAM,EAAE,GAAG,UAAU,eAAe,CAAC,EAAE,CAAC;AAAA,IAC1C;AAAA,EACF,GAAG,CAAC,MAAM,MAAM,MAAM,WAAW,OAAO,QAAQ,CAAC;AAEjD,QAAM,WAAW,KAAK,aAAa,OAAO,MAAM;AAC9C,UAAM,OAAO;AAAA,MACX,MAAM,EAAE;AAAA,MACR,MAAM,EAAE;AAAA,MACR,aAAa,EAAE,eAAe;AAAA,MAC9B,eAAe,EAAE;AAAA,IACnB;AACA,QAAI,SAAS,OAAO;AAClB,YAAM,OAAO,YAAY,EAAE,KAAK,CAAC;AAAA,IACnC,WAAW,QAAQ;AACjB,YAAM,OAAO,YAAY;AAAA,QACvB,QAAQ,EAAE,MAAM,EAAE,IAAI,OAAO,EAAE;AAAA,QAC/B;AAAA,MACF,CAAC;AAAA,IACH;AACA,gBAAY;AACZ,YAAQ;AAAA,EACV,CAAC;AAED,QAAM,WAAW,YAAY;AAC3B,QAAI,CAAC,QAAQ;AACX;AAAA,IACF;AACA,UAAM,IAAI,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,OAAO,EAAE,EAAE,CAAC;AAC1D,gBAAY;AACZ,YAAQ;AAAA,EACV;AAEA,QAAM,WAAW,SAAS,SAAS,MAAM,MAAM,eAAe;AAE9D,SACE;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,SAAS,QAAQ,aAAa;AAAA,MACrC;AAAA,MACA;AAAA,MACA,SAAS,UAAU;AAAA,MACnB,MAAK;AAAA,MACL,MACE,YACE,oBAAC,gBAAa,IAEd,oBAAC,QAAM,GAAG,MACR,+BAAC,UAAK,UAAoB,WAAU,aAClC;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,OAAM;AAAA,YACN,UAAQ;AAAA,YACR;AAAA,YACA,QAAQ,UAAU;AAAA,YAClB,aAAY;AAAA,YACZ,UAAU,CAAC;AAAA;AAAA,QACb;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA,MAAK;AAAA,YACL,QAAQ,CAAC,EAAE,MAAM,MACf,qBAAC,YACC;AAAA,mCAAC,aAAU;AAAA;AAAA,gBACJ,oBAAC,UAAK,WAAU,oBAAmB,eAAC;AAAA,iBAC3C;AAAA,cACA,oBAAC,eACC;AAAA,gBAAC;AAAA;AAAA,kBACC,aAAY;AAAA,kBACZ,UAAU,CAAC;AAAA,kBACV,GAAG;AAAA;AAAA,cACN,GACF;AAAA,cACA,oBAAC,eAAY;AAAA,eACf;AAAA;AAAA,QAEJ;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,OAAM;AAAA,YACN;AAAA,YACA,QAAQ,UAAU;AAAA,YAClB,aAAY;AAAA,YACZ,MAAM;AAAA,YACN,UAAU,CAAC;AAAA;AAAA,QACb;AAAA,SACF,GACF;AAAA,MAGJ,SACE;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA,SAAS,SAAS,QAAQ,MAAM,MAAM,QAAQ,IAAI;AAAA,UAClD,UAAU,SAAS,SAAS,WAAW;AAAA,UACvC,cAAc,OAAO,aAAa,OAAO;AAAA,UACzC,YAAY,IAAI;AAAA,UAChB,UAAU,aAAa,CAAC;AAAA,UACxB,UAAS;AAAA;AAAA,MACX;AAAA;AAAA,EAEJ;AAEJ;AAEA,SAAS,eAAe;AACtB,SACE,qBAAC,SAAI,WAAU,aACb;AAAA,yBAAC,SAAI,WAAU,aACb;AAAA,0BAAC,YAAS,WAAU,YAAW;AAAA,MAC/B,oBAAC,YAAS,WAAU,eAAc;AAAA,OACpC;AAAA,IACA,qBAAC,SAAI,WAAU,aACb;AAAA,0BAAC,YAAS,WAAU,YAAW;AAAA,MAC/B,oBAAC,YAAS,WAAU,eAAc;AAAA,OACpC;AAAA,IACA,qBAAC,SAAI,WAAU,aACb;AAAA,0BAAC,YAAS,WAAU,YAAW;AAAA,MAC/B,oBAAC,YAAS,WAAU,eAAc;AAAA,OACpC;AAAA,KACF;AAEJ;;;AChQA;AAAA,EACE,SAAAA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,cAAc,kBAAkB;AACzC,SAAS,gBAAgB;;;ACdzB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,UAAU,wBAAwB;AAkBjC,gBAAAC,MA0BQ,QAAAC,aA1BR;AARH,SAAS,SAAS,EAAE,MAAM,OAAO,WAAW,GAAkB;AACnE,QAAM,SAAS,UAAU;AACzB,QAAM,cAAc,SAAS;AAE7B,SACE,gBAAAA,MAAC,QAAK,WAAU,2CACd;AAAA,oBAAAA,MAAC,cAAW,WAAU,QACpB;AAAA,sBAAAA,MAAC,SAAI,WAAU,oCACb;AAAA,wBAAAD;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS,MAAM;AACb,kBAAI,aAAa;AACf,uBAAO,KAAK,cAAc,KAAK,EAAE,EAAE;AAAA,cACrC;AAAA,YACF;AAAA,YACA,WAAU;AAAA,YAET,cAAI,KAAK,IAAI,KAAK,KAAK;AAAA;AAAA,QAC1B;AAAA,QACC,cACC,gBAAAC,MAAC,gBACC;AAAA,0BAAAD;AAAA,YAAC;AAAA;AAAA,cACC,QACE,gBAAAA;AAAA,gBAAC;AAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,WAAU;AAAA;AAAA,cACZ;AAAA,cAGF,0BAAAA,KAAC,YAAS,WAAU,WAAU;AAAA;AAAA,UAChC;AAAA,UACA,gBAAAA,KAAC,sBACC,0BAAAA,KAAC,uBACC,0BAAAC;AAAA,YAAC;AAAA;AAAA,cACC,SAAS,MAAM,OAAO,KAAK,cAAc,KAAK,EAAE,EAAE;AAAA,cAElD;AAAA,gCAAAD,KAAC,oBAAiB,WAAU,gBAAe;AAAA,gBAAE;AAAA;AAAA;AAAA,UAE/C,GACF,GACF;AAAA,WACF,IACE;AAAA,SACN;AAAA,MACA,gBAAAA,KAAC,SAAM,SAAQ,WAAU,WAAU,WAChC,eAAK,MACR;AAAA,OACF;AAAA,IACA,gBAAAC,MAAC,eACC;AAAA,sBAAAA,MAAC,SAAI,WAAU,6BACZ;AAAA,aAAK,WAAW,gBAAAD,KAAC,SAAM,oBAAM,IAAW;AAAA,QACzC,gBAAAC,MAAC,SAAM,SAAQ,aACZ;AAAA,eAAK,mBAAmB,KAAK,eAAe,UAAU;AAAA,UAAG;AAAA,UAAI;AAAA,WAEhE;AAAA,QACA,gBAAAA,MAAC,SAAM,SAAQ,WAAW;AAAA,eAAK,aAAa;AAAA,UAAE;AAAA,WAAM;AAAA,SACtD;AAAA,MACC,IAAI,KAAK,WAAW,KACnB,gBAAAD,KAAC,OAAE,WAAU,8CACV,cAAI,KAAK,WAAW,GACvB;AAAA,MAEF,gBAAAC,MAAC,OAAE,WAAU,sCAAqC;AAAA;AAAA,QACvC,IAAI,KAAK,KAAK,SAAS,EAAE,mBAAmB;AAAA,SACvD;AAAA,OACF;AAAA,KACF;AAEJ;;;ADvCM,gBAAAC,MAiCM,QAAAC,aAjCN;AA/BN,IAAM,qBAAqB;AAepB,SAAS,UAAU;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAmB;AACjB,QAAM,CAAC,YAAY,aAAa,IAAI,SAAsB,IAAI;AAE9D,MAAI,WAAW;AACb,WACE,gBAAAD;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,UAAU;AAAA,QACV,aAAa;AAAA,QACb,WAAW;AAAA;AAAA,IACb;AAAA,EAEJ;AACA,MAAI,cAAc,GAAG;AACnB,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAM;AAAA,QACN,YAAW;AAAA,QACX,OAAM;AAAA,QACN,aAAY;AAAA,QACZ,UAAU;AAAA;AAAA,IACZ;AAAA,EAEJ;AACA,MAAI,SAAS,SAAS;AACpB,WACE,gBAAAC,MAAC,SAAI,WAAU,aACZ;AAAA,mBACC,gBAAAD;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,QAAQ,WAAW;AAAA,UACnB,MAAI;AAAA,UACJ,SAAS,MAAM,cAAc,IAAI;AAAA,UACjC,WAAW,MAAM,cAAc,IAAI;AAAA;AAAA,MACrC,IACE;AAAA,MACJ,gBAAAC,MAAC,gBAAa,iBAAe,MAC3B;AAAA,wBAAAD,KAAC,SACC,0BAAAC,MAAC,MACC;AAAA,0BAAAD,KAAC,MAAG,kBAAI;AAAA,UACR,gBAAAA,KAAC,MAAG,yBAAW;AAAA,UACf,gBAAAA,KAAC,MAAG,oBAAM;AAAA,UACV,gBAAAA,KAAC,MAAG,qBAAO;AAAA,UACX,gBAAAA,KAAC,MAAG,WAAU,YAAW;AAAA,WAC3B,GACF;AAAA,QACA,gBAAAA,KAAC,SACE,eAAK,IAAI,CAAC,SACT,gBAAAC,MAAC,MAAiB,WAAU,SAC1B;AAAA,0BAAAD,KAAC,MACC,0BAAAA;AAAA,YAAC;AAAA;AAAA,cACC,MAAM,cAAc,KAAK,EAAE;AAAA,cAC3B,WAAU;AAAA,cAEV,0BAAAA,KAAC,OAAG,cAAI,KAAK,IAAI,KAAK,KAAK,MAAK;AAAA;AAAA,UAClC,GACF;AAAA,UACA,gBAAAA,KAAC,MACC,0BAAAA,KAAC,UAAK,WAAU,oDACb,cAAI,KAAK,WAAW,KAAK,UAC5B,GACF;AAAA,UACA,gBAAAA,KAAC,MACC,0BAAAC,MAAC,SAAI,WAAU,wBACZ;AAAA,iBAAK,WAAW,gBAAAD,KAACE,QAAA,EAAM,oBAAM,IAAW;AAAA,YACzC,gBAAAD,MAACC,QAAA,EAAM,SAAQ,aACZ;AAAA,mBAAK,mBAAmB,KAAK,eAAe,UAAU;AAAA,cAAG;AAAA,cAAI;AAAA,eAEhE;AAAA,aACF,GACF;AAAA,UACA,gBAAAF,KAAC,MACC,0BAAAC,MAAC,SAAI,WAAU,iDACb;AAAA,4BAAAD,KAAC,gBAAa,WAAU,WAAU;AAAA,YACjC,IAAI,KAAK,KAAK,SAAS,EAAE,mBAAmB;AAAA,aAC/C,GACF;AAAA,UACA,gBAAAA,KAAC,MACC,0BAAAA,KAAC,mBAAgB,SAAS,MAAM,cAAc,IAAI,GAAG,GACvD;AAAA,aA/BO,KAAK,EAgCd,CACD,GACH;AAAA,SACF;AAAA,MACA,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA;AAAA,MACF;AAAA,OACF;AAAA,EAEJ;AACA,SACE,gBAAAC,MAAC,SAAI,WAAU,aACb;AAAA,oBAAAD,KAAC,SAAI,WAAU,uEACZ,eAAK,IAAI,CAAC,MACT,gBAAAA,KAAC,YAAoB,MAAM,KAAZ,EAAE,EAAa,CAC/B,GACH;AAAA,IACA,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;","names":["Badge","jsx","jsxs","jsx","jsxs","Badge"]}
@@ -1,313 +0,0 @@
1
- import {
2
- RoleCard,
3
- RolesList
4
- } from "./chunk-MQI6Q2S4.js";
5
- import {
6
- str
7
- } from "./chunk-OW75JENQ.js";
8
- import {
9
- authApi$
10
- } from "./chunk-W3D4HG5W.js";
11
- import {
12
- defaultEntityQueryOptions
13
- } from "./chunk-NPW7D2HZ.js";
14
- import {
15
- IAMGuard
16
- } from "./chunk-V6ZHX4LT.js";
17
-
18
- // src/pages/iam/users/activity/user-activity-page-content.tsx
19
- import {
20
- Card,
21
- CardContent,
22
- CardHeader,
23
- CardTitle,
24
- Section
25
- } from "@mesob/ui/components";
26
- import { IconCalendar as IconCalendar2 } from "@tabler/icons-react";
27
-
28
- // src/pages/iam/users/activity/_components/role-section.tsx
29
- import {
30
- Button,
31
- EntityEmptyState,
32
- EntityLoadingState,
33
- EntitySection,
34
- useEntitySectionState as useEntitySectionState2
35
- } from "@mesob/ui/components";
36
- import { IconPlus, IconShield as IconShield2 } from "@tabler/icons-react";
37
- import { useMemo, useState } from "react";
38
-
39
- // src/pages/iam/roles/_components/role-selector.tsx
40
- import {
41
- EntitySelector,
42
- useEntitySectionState
43
- } from "@mesob/ui/components";
44
- import { cn } from "@mesob/ui/lib/utils";
45
- import { IconCalendar, IconShield } from "@tabler/icons-react";
46
- import { Fragment, jsx, jsxs } from "react/jsx-runtime";
47
- function SelectableRoleCard({
48
- role,
49
- selected,
50
- onToggle
51
- }) {
52
- return (
53
- // biome-ignore lint/a11y/useSemanticElements: div to avoid nested buttons from RoleCard
54
- /* @__PURE__ */ jsx(
55
- "div",
56
- {
57
- role: "button",
58
- tabIndex: 0,
59
- onClick: onToggle,
60
- onKeyDown: (e) => {
61
- if (e.key === "Enter") {
62
- onToggle();
63
- }
64
- },
65
- className: cn(
66
- "cursor-pointer rounded-lg transition-shadow focus:outline-none focus-visible:ring-2 focus-visible:ring-ring",
67
- selected && "ring-primary ring-2"
68
- ),
69
- children: /* @__PURE__ */ jsx(RoleCard, { role, mode: "static" })
70
- }
71
- )
72
- );
73
- }
74
- var roleColumns = [
75
- {
76
- key: "role",
77
- header: "Role",
78
- cell: (role) => /* @__PURE__ */ jsxs(Fragment, { children: [
79
- /* @__PURE__ */ jsx("p", { className: "font-medium", children: str(role.name) || role.code }),
80
- /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: role.code })
81
- ] })
82
- },
83
- {
84
- key: "description",
85
- header: "Description",
86
- cell: (role) => /* @__PURE__ */ jsx("span", { className: "text-muted-foreground line-clamp-1 max-w-[200px]", children: str(role.description) || "\u2014" })
87
- },
88
- {
89
- key: "created",
90
- header: "Created",
91
- cell: (role) => /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1 text-muted-foreground", children: [
92
- /* @__PURE__ */ jsx(IconCalendar, { className: "h-4 w-4" }),
93
- new Date(role.createdAt).toLocaleDateString()
94
- ] })
95
- }
96
- ];
97
- function RoleSelector({
98
- trigger,
99
- multiple = true,
100
- onSelect,
101
- modalSize = "xl",
102
- contentClassName
103
- }) {
104
- const state = useEntitySectionState({
105
- defaultSort: "createdAt",
106
- defaultOrder: "desc",
107
- defaultPageSize: 10,
108
- searchParamName: "search"
109
- });
110
- const rolesQuery = state.queryConfig;
111
- const { data, isPending, isFetching } = authApi$.useQuery(
112
- "get",
113
- "/roles",
114
- rolesQuery,
115
- defaultEntityQueryOptions
116
- );
117
- const roles = data?.roles ?? [];
118
- const config = {
119
- title: "Select role(s)",
120
- modalSize,
121
- contentClassName,
122
- multiple,
123
- entityName: "role",
124
- entityIcon: IconShield,
125
- columns: roleColumns,
126
- columnCount: 3,
127
- getItemLabel: (role) => str(role.name) || role.code,
128
- searchPlaceholder: "Search roles...",
129
- wrapHeaderInCard: false,
130
- filterOptions: [
131
- { label: "All", value: "" },
132
- { label: "By Code", value: "code" }
133
- ],
134
- sortOptions: [
135
- { label: "Created", value: "createdAt" },
136
- { label: "Updated", value: "updatedAt" },
137
- { label: "Code", value: "code" }
138
- ],
139
- showViewToggle: false,
140
- renderCard: (role, selected, onToggle) => /* @__PURE__ */ jsx(SelectableRoleCard, { role, selected, onToggle })
141
- };
142
- return /* @__PURE__ */ jsx(
143
- EntitySelector,
144
- {
145
- trigger,
146
- config,
147
- onSelect,
148
- items: roles,
149
- total: data?.total,
150
- isLoading: isPending || isFetching,
151
- state
152
- }
153
- );
154
- }
155
-
156
- // src/pages/iam/users/activity/_components/role-section.tsx
157
- import { Fragment as Fragment2, jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
158
- var LIMIT = 100;
159
- var TABLE_COLUMN_COUNT = 4;
160
- function filterAndSort(roles, search, sort, order) {
161
- let out = roles;
162
- if (search.trim()) {
163
- const q = search.trim().toLowerCase();
164
- out = out.filter(
165
- (r) => str(r.name).toLowerCase().includes(q) || r.code.toLowerCase().includes(q)
166
- );
167
- }
168
- const mult = order === "asc" ? 1 : -1;
169
- const by = sort === "code" ? "code" : "createdAt";
170
- out = [...out].sort(
171
- (a, b) => by === "code" ? mult * a.code.localeCompare(b.code) : mult * (new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime())
172
- );
173
- return out;
174
- }
175
- function RoleSection({ userId }) {
176
- const [open, setOpen] = useState(false);
177
- const sectionState = useEntitySectionState2({
178
- defaultSort: "createdAt",
179
- defaultOrder: "desc",
180
- defaultPageSize: 10,
181
- filterOptions: [
182
- { label: "All", value: "" },
183
- { label: "By Code", value: "code" }
184
- ],
185
- sortOptions: [
186
- { label: "Created", value: "createdAt" },
187
- { label: "Updated", value: "updatedAt" },
188
- { label: "Code", value: "code" }
189
- ],
190
- views: ["table", "card"]
191
- });
192
- const { data, isPending, isFetching } = authApi$.useQuery(
193
- "get",
194
- "/roles",
195
- { params: { query: { limit: LIMIT } } },
196
- { ...defaultEntityQueryOptions, enabled: open }
197
- );
198
- const isLoading = isPending || isFetching;
199
- const roles = data?.roles ?? [];
200
- const filtered = useMemo(
201
- () => filterAndSort(
202
- roles,
203
- sectionState.search,
204
- sectionState.sort,
205
- sectionState.order
206
- ),
207
- [roles, sectionState.search, sectionState.sort, sectionState.order]
208
- );
209
- const pageCount = Math.ceil(filtered.length / sectionState.pageSize) || 1;
210
- const pageIndex = Math.min(sectionState.page - 1, Math.max(0, pageCount - 1));
211
- const paginated = useMemo(
212
- () => filtered.slice(
213
- pageIndex * sectionState.pageSize,
214
- pageIndex * sectionState.pageSize + sectionState.pageSize
215
- ),
216
- [filtered, pageIndex, sectionState.pageSize]
217
- );
218
- return /* @__PURE__ */ jsx2(
219
- EntitySection,
220
- {
221
- title: "Role",
222
- state: sectionState,
223
- onOpenChange: setOpen,
224
- actions: /* @__PURE__ */ jsx2(
225
- RoleSelector,
226
- {
227
- trigger: /* @__PURE__ */ jsxs2(Button, { variant: "outline", size: "sm", children: [
228
- /* @__PURE__ */ jsx2(IconPlus, { className: "h-4 w-4" }),
229
- "Add role"
230
- ] }),
231
- multiple: true,
232
- onSelect: (roles2) => {
233
- console.log("Selected roles:", userId, roles2);
234
- }
235
- }
236
- ),
237
- config: {
238
- searchPlaceholder: "Search roles...",
239
- filterOptions: sectionState.filterOptions,
240
- sortOptions: sectionState.sortOptions,
241
- views: sectionState.views
242
- },
243
- children: (state) => /* @__PURE__ */ jsxs2(Fragment2, { children: [
244
- isLoading && /* @__PURE__ */ jsx2(
245
- EntityLoadingState,
246
- {
247
- view: state.view,
248
- rowCount: state.pageSize,
249
- columnCount: TABLE_COLUMN_COUNT,
250
- cardCount: state.pageSize
251
- }
252
- ),
253
- !isLoading && filtered.length === 0 && /* @__PURE__ */ jsx2(
254
- EntityEmptyState,
255
- {
256
- icon: IconShield2,
257
- entityName: "role",
258
- title: "No roles",
259
- description: roles.length === 0 ? "No roles in tenant." : "No matches."
260
- }
261
- ),
262
- !isLoading && filtered.length > 0 && /* @__PURE__ */ jsx2(
263
- RolesList,
264
- {
265
- data: paginated,
266
- view: state.view,
267
- pageIndex,
268
- pageSize: state.pageSize,
269
- pageCount,
270
- totalRows: filtered.length,
271
- onPageChange: (p) => state.setPage(p + 1),
272
- onPageSizeChange: (size) => {
273
- state.setPageSize(size);
274
- state.setPage(1);
275
- }
276
- }
277
- )
278
- ] })
279
- }
280
- );
281
- }
282
-
283
- // src/pages/iam/users/activity/user-activity-page-content.tsx
284
- import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
285
- function UserActivityPageContent({
286
- userId
287
- }) {
288
- return /* @__PURE__ */ jsx3(IAMGuard, { children: /* @__PURE__ */ jsx3(UserActivityPageContentInner, { userId }) });
289
- }
290
- function UserActivityPageContentInner({
291
- userId
292
- }) {
293
- if (!userId) {
294
- return null;
295
- }
296
- return /* @__PURE__ */ jsxs3("div", { className: "space-y-4", children: [
297
- /* @__PURE__ */ jsxs3(Card, { children: [
298
- /* @__PURE__ */ jsx3(CardHeader, { children: /* @__PURE__ */ jsx3(CardTitle, { children: "Activity" }) }),
299
- /* @__PURE__ */ jsxs3(CardContent, { className: "flex items-center gap-2 text-muted-foreground text-sm", children: [
300
- /* @__PURE__ */ jsx3(IconCalendar2, { className: "h-4 w-4" }),
301
- "Activity (placeholder)"
302
- ] })
303
- ] }),
304
- /* @__PURE__ */ jsx3(RoleSection, { userId }),
305
- /* @__PURE__ */ jsx3(Section, { title: "Permissions", children: "test" }),
306
- /* @__PURE__ */ jsx3(Section, { title: "Groups", children: "test" })
307
- ] });
308
- }
309
-
310
- export {
311
- UserActivityPageContent
312
- };
313
- //# sourceMappingURL=chunk-NFGFJPCX.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/pages/iam/users/activity/user-activity-page-content.tsx","../src/pages/iam/users/activity/_components/role-section.tsx","../src/pages/iam/roles/_components/role-selector.tsx"],"sourcesContent":["'use client';\n\nimport {\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Section,\n} from '@mesob/ui/components';\nimport { IconCalendar } from '@tabler/icons-react';\nimport { IAMGuard } from '../../../../components/iam/iam-guard';\nimport { RoleSection } from './_components/role-section';\n\ntype UserActivityPageContentProps = {\n userId: string;\n};\n\nexport function UserActivityPageContent({\n userId,\n}: UserActivityPageContentProps) {\n return (\n <IAMGuard>\n <UserActivityPageContentInner userId={userId} />\n </IAMGuard>\n );\n}\n\nfunction UserActivityPageContentInner({\n userId,\n}: UserActivityPageContentProps) {\n if (!userId) {\n return null;\n }\n\n return (\n <div className=\"space-y-4\">\n <Card>\n <CardHeader>\n <CardTitle>Activity</CardTitle>\n </CardHeader>\n <CardContent className=\"flex items-center gap-2 text-muted-foreground text-sm\">\n <IconCalendar className=\"h-4 w-4\" />\n Activity (placeholder)\n </CardContent>\n </Card>\n <RoleSection userId={userId} />\n <Section title=\"Permissions\">test</Section>\n <Section title=\"Groups\">test</Section>\n </div>\n );\n}\n","'use client';\n\nimport {\n Button,\n EntityEmptyState,\n EntityLoadingState,\n EntitySection,\n useEntitySectionState,\n} from '@mesob/ui/components';\nimport { IconPlus, IconShield } from '@tabler/icons-react';\nimport { useMemo, useState } from 'react';\nimport { RoleSelector } from '../../../roles/_components/role-selector';\nimport type { Role } from '../../../roles/_components/roles-data';\nimport { str } from '../../../roles/_components/roles-data';\nimport { RolesList } from '../../../roles/_components/roles-list';\nimport {\n authApi$,\n defaultEntityQueryOptions,\n} from '../../../shared/page-helpers';\n\nconst LIMIT = 100;\nconst TABLE_COLUMN_COUNT = 4;\n\nfunction filterAndSort(\n roles: Role[],\n search: string,\n sort: string,\n order: 'asc' | 'desc',\n) {\n let out = roles;\n if (search.trim()) {\n const q = search.trim().toLowerCase();\n out = out.filter(\n (r) =>\n str(r.name).toLowerCase().includes(q) ||\n r.code.toLowerCase().includes(q),\n );\n }\n const mult = order === 'asc' ? 1 : -1;\n const by = sort === 'code' ? 'code' : 'createdAt';\n out = [...out].sort((a, b) =>\n by === 'code'\n ? mult * a.code.localeCompare(b.code)\n : mult *\n (new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime()),\n );\n return out;\n}\n\nexport function RoleSection({ userId }: { userId: string }) {\n const [open, setOpen] = useState(false);\n const sectionState = useEntitySectionState({\n defaultSort: 'createdAt',\n defaultOrder: 'desc',\n defaultPageSize: 10,\n filterOptions: [\n { label: 'All', value: '' },\n { label: 'By Code', value: 'code' },\n ],\n sortOptions: [\n { label: 'Created', value: 'createdAt' },\n { label: 'Updated', value: 'updatedAt' },\n { label: 'Code', value: 'code' },\n ],\n views: ['table', 'card'],\n });\n\n const { data, isPending, isFetching } = authApi$.useQuery(\n 'get',\n '/roles',\n { params: { query: { limit: LIMIT } } },\n { ...defaultEntityQueryOptions, enabled: open },\n );\n const isLoading = isPending || isFetching;\n const roles = data?.roles ?? [];\n\n const filtered = useMemo(\n () =>\n filterAndSort(\n roles,\n sectionState.search,\n sectionState.sort,\n sectionState.order,\n ),\n [roles, sectionState.search, sectionState.sort, sectionState.order],\n );\n const pageCount = Math.ceil(filtered.length / sectionState.pageSize) || 1;\n const pageIndex = Math.min(sectionState.page - 1, Math.max(0, pageCount - 1));\n const paginated = useMemo(\n () =>\n filtered.slice(\n pageIndex * sectionState.pageSize,\n pageIndex * sectionState.pageSize + sectionState.pageSize,\n ),\n [filtered, pageIndex, sectionState.pageSize],\n );\n\n return (\n <EntitySection\n title=\"Role\"\n state={sectionState}\n onOpenChange={setOpen}\n actions={\n <RoleSelector\n trigger={\n <Button variant=\"outline\" size=\"sm\">\n <IconPlus className=\"h-4 w-4\" />\n Add role\n </Button>\n }\n multiple\n onSelect={(roles) => {\n // TODO: assign roles to user; logging for now\n // biome-ignore lint/suspicious/noConsole: intentional for now\n console.log('Selected roles:', userId, roles);\n }}\n />\n }\n config={{\n searchPlaceholder: 'Search roles...',\n filterOptions: sectionState.filterOptions,\n sortOptions: sectionState.sortOptions,\n views: sectionState.views,\n }}\n >\n {(state) => (\n <>\n {isLoading && (\n <EntityLoadingState\n view={state.view as 'table' | 'card'}\n rowCount={state.pageSize}\n columnCount={TABLE_COLUMN_COUNT}\n cardCount={state.pageSize}\n />\n )}\n {!isLoading && filtered.length === 0 && (\n <EntityEmptyState\n icon={IconShield}\n entityName=\"role\"\n title=\"No roles\"\n description={\n roles.length === 0 ? 'No roles in tenant.' : 'No matches.'\n }\n />\n )}\n {!isLoading && filtered.length > 0 && (\n <RolesList\n data={paginated}\n view={state.view as 'table' | 'card'}\n pageIndex={pageIndex}\n pageSize={state.pageSize}\n pageCount={pageCount}\n totalRows={filtered.length}\n onPageChange={(p) => state.setPage(p + 1)}\n onPageSizeChange={(size) => {\n state.setPageSize(size);\n state.setPage(1);\n }}\n />\n )}\n </>\n )}\n </EntitySection>\n );\n}\n","'use client';\n\nimport {\n EntitySelector,\n type EntitySelectorColumn,\n type EntitySelectorConfig,\n useEntitySectionState,\n} from '@mesob/ui/components';\nimport { cn } from '@mesob/ui/lib/utils';\nimport { IconCalendar, IconShield } from '@tabler/icons-react';\nimport type { ReactNode } from 'react';\nimport type { paths } from '../../../../data/openapi';\nimport { authApi$, defaultEntityQueryOptions } from '../../shared/page-helpers';\nimport { RoleCard } from './role-card';\nimport type { Role } from './roles-data';\nimport { str } from './roles-data';\n\nfunction SelectableRoleCard({\n role,\n selected,\n onToggle,\n}: {\n role: Role;\n selected: boolean;\n onToggle: () => void;\n}) {\n return (\n // biome-ignore lint/a11y/useSemanticElements: div to avoid nested buttons from RoleCard\n <div\n role=\"button\"\n tabIndex={0}\n onClick={onToggle}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n onToggle();\n }\n }}\n className={cn(\n 'cursor-pointer rounded-lg transition-shadow focus:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n selected && 'ring-primary ring-2',\n )}\n >\n <RoleCard role={role} mode=\"static\" />\n </div>\n );\n}\n\nconst roleColumns: EntitySelectorColumn<Role>[] = [\n {\n key: 'role',\n header: 'Role',\n cell: (role) => (\n <>\n <p className=\"font-medium\">{str(role.name) || role.code}</p>\n <p className=\"text-sm text-muted-foreground\">{role.code}</p>\n </>\n ),\n },\n {\n key: 'description',\n header: 'Description',\n cell: (role) => (\n <span className=\"text-muted-foreground line-clamp-1 max-w-[200px]\">\n {str(role.description) || '—'}\n </span>\n ),\n },\n {\n key: 'created',\n header: 'Created',\n cell: (role) => (\n <div className=\"flex items-center gap-1 text-muted-foreground\">\n <IconCalendar className=\"h-4 w-4\" />\n {new Date(role.createdAt).toLocaleDateString()}\n </div>\n ),\n },\n];\n\ntype RoleSelectorProps = {\n trigger: ReactNode;\n multiple?: boolean;\n onSelect: (roles: Role[]) => void;\n modalSize?: 'sm' | 'md' | 'lg' | 'xl' | 'full';\n contentClassName?: string;\n};\n\nexport function RoleSelector({\n trigger,\n multiple = true,\n onSelect,\n modalSize = 'xl',\n contentClassName,\n}: RoleSelectorProps) {\n const state = useEntitySectionState({\n defaultSort: 'createdAt',\n defaultOrder: 'desc',\n defaultPageSize: 10,\n searchParamName: 'search',\n });\n const rolesQuery = state.queryConfig as {\n params: {\n query: NonNullable<paths['/roles']['get']['parameters']['query']>;\n };\n };\n\n const { data, isPending, isFetching } = authApi$.useQuery(\n 'get',\n '/roles',\n rolesQuery,\n defaultEntityQueryOptions,\n );\n\n const roles = data?.roles ?? [];\n\n const config: EntitySelectorConfig<Role> = {\n title: 'Select role(s)',\n modalSize,\n contentClassName,\n multiple,\n entityName: 'role',\n entityIcon: IconShield,\n columns: roleColumns,\n columnCount: 3,\n getItemLabel: (role) => str(role.name) || role.code,\n searchPlaceholder: 'Search roles...',\n wrapHeaderInCard: false,\n filterOptions: [\n { label: 'All', value: '' },\n { label: 'By Code', value: 'code' },\n ],\n sortOptions: [\n { label: 'Created', value: 'createdAt' },\n { label: 'Updated', value: 'updatedAt' },\n { label: 'Code', value: 'code' },\n ],\n showViewToggle: false,\n renderCard: (role, selected, onToggle) => (\n <SelectableRoleCard role={role} selected={selected} onToggle={onToggle} />\n ),\n };\n\n return (\n <EntitySelector<Role>\n trigger={trigger}\n config={config}\n onSelect={onSelect}\n items={roles}\n total={data?.total}\n isLoading={isPending || isFetching}\n state={state}\n />\n );\n}\n"],"mappings":"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","names":["IconCalendar","useEntitySectionState","IconShield","Fragment","jsx","jsxs","useEntitySectionState","roles","IconShield","jsx","jsxs","IconCalendar"]}