@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.
- package/dist/{chunk-DG6GRTPG.js → chunk-4LHFPVAY.js} +2 -2
- package/dist/{chunk-H5PUZDNU.js → chunk-57L345IN.js} +4 -4
- package/dist/{chunk-CP4TTRV4.js → chunk-5B6GREDA.js} +2 -2
- package/dist/{chunk-TEHMLZFI.js → chunk-5XCUGCW7.js} +4 -4
- package/dist/{chunk-5AEV7RAN.js → chunk-6AV6I5B4.js} +3 -3
- package/dist/{chunk-SGDXNT7M.js → chunk-7VWWIN6Q.js} +3 -3
- package/dist/{chunk-AWSAC7RT.js → chunk-A5ON3RKH.js} +6 -3
- package/dist/chunk-A5ON3RKH.js.map +1 -0
- package/dist/{chunk-V6ZHX4LT.js → chunk-BM3YKYGC.js} +2 -2
- package/dist/{chunk-TLQMK2QF.js → chunk-BX75EFF3.js} +4 -4
- package/dist/{chunk-OXUOGOG3.js → chunk-DCWKYK3D.js} +88 -21
- package/dist/chunk-DCWKYK3D.js.map +1 -0
- package/dist/{chunk-W3D4HG5W.js → chunk-DRM44QBR.js} +3 -3
- package/dist/{chunk-Z34NJZRL.js → chunk-EIJFTUTM.js} +3 -3
- package/dist/{chunk-5E3XN6SW.js → chunk-FCPN2FD7.js} +5 -5
- package/dist/{chunk-VVKXFEAN.js → chunk-FLGP4ROM.js} +5 -5
- package/dist/{chunk-5SDS2E3F.js → chunk-FU4K62DS.js} +2 -2
- package/dist/chunk-G2XRGSQE.js +22 -0
- package/dist/chunk-G2XRGSQE.js.map +1 -0
- package/dist/{chunk-X2BHF4KC.js → chunk-G4VPR4UC.js} +2 -2
- package/dist/{chunk-MQI6Q2S4.js → chunk-GGBS64Z5.js} +147 -4
- package/dist/chunk-GGBS64Z5.js.map +1 -0
- package/dist/{chunk-2PV7RYNK.js → chunk-GQFTH5DQ.js} +95 -20
- package/dist/chunk-GQFTH5DQ.js.map +1 -0
- package/dist/{chunk-UY55LEIG.js → chunk-H2W42KYL.js} +2 -2
- package/dist/{chunk-EPEXIGKB.js → chunk-HBQK5PAH.js} +2 -2
- package/dist/{chunk-4ABXALRN.js → chunk-IBRB7ABJ.js} +2 -2
- package/dist/{chunk-RMJNENJB.js → chunk-IFFWIROT.js} +2 -2
- package/dist/{chunk-WY2JJNZW.js → chunk-IK7V3PT3.js} +2 -2
- package/dist/{chunk-N4JFMKGK.js → chunk-JKUKCVY7.js} +5 -5
- package/dist/{chunk-MWMSZVH3.js → chunk-K6ACPILA.js} +4 -4
- package/dist/{chunk-5BFG47VF.js → chunk-PUOQX6DR.js} +4 -4
- package/dist/{chunk-EQWOGD4F.js → chunk-SA6HTWCL.js} +2 -2
- package/dist/{chunk-73ZNGEWU.js → chunk-SX6WAVQS.js} +5 -5
- package/dist/{chunk-5HAABEAS.js → chunk-TAJQ7O3U.js} +2 -2
- package/dist/{chunk-MVVAPYUD.js → chunk-TPG4RW7H.js} +2 -2
- package/dist/{chunk-ECF6S2Y2.js → chunk-USVJBAWJ.js} +2 -2
- package/dist/{chunk-T34HJRUW.js → chunk-VMAGFUOK.js} +3 -3
- package/dist/{chunk-ZZ6D4KE4.js → chunk-VS5FEGMX.js} +2 -2
- package/dist/{chunk-IQNQGPIT.js → chunk-VWYJI2FU.js} +4 -4
- package/dist/{chunk-H7JRQFFI.js → chunk-W2HMARW4.js} +4 -4
- package/dist/{chunk-RRLFPSSM.js → chunk-W7UHDTBI.js} +33 -2
- package/dist/chunk-W7UHDTBI.js.map +1 -0
- package/dist/{chunk-4X3CJHKR.js → chunk-XLPPZKU2.js} +4 -4
- package/dist/{chunk-YFQNNSSC.js → chunk-XO5LLEGV.js} +2 -2
- package/dist/{chunk-4NUO6F3J.js → chunk-XZAYLXLS.js} +2 -2
- package/dist/{chunk-7CLKBH5Z.js → chunk-YCVDEX5U.js} +3 -3
- package/dist/{chunk-6THPM5LB.js → chunk-YQU3KG74.js} +4 -4
- package/dist/{chunk-GVEBIL3O.js → chunk-YVHMCTLM.js} +2 -2
- package/dist/{chunk-6IEX2RLA.js → chunk-Z4FXOZEJ.js} +3 -3
- package/dist/{chunk-UGQP733V.js → chunk-ZOKBN5H4.js} +2 -2
- package/dist/components/auth/countdown.js +3 -3
- package/dist/components/auth/forgot-password.js +4 -4
- package/dist/components/auth/reset-password-form.js +4 -4
- package/dist/components/auth/set-password.js +4 -4
- package/dist/components/auth/sign-in.js +4 -4
- package/dist/components/auth/sign-up.js +4 -4
- package/dist/components/auth/verification-form.js +4 -4
- package/dist/components/auth/verify-email.js +6 -6
- package/dist/components/auth/verify-phone.js +6 -6
- package/dist/components/authorization/deny.js +2 -2
- package/dist/components/authorization/grant.js +2 -2
- package/dist/components/error-boundary.d.ts +1 -1
- package/dist/components/iam/domains-page.js +6 -6
- package/dist/components/iam/iam-guard.js +3 -3
- package/dist/components/iam/permission-selector.js +2 -2
- package/dist/components/iam/permissions-page.js +4 -4
- package/dist/components/iam/permissions.js +2 -2
- package/dist/components/iam/role-detail-layout.js +2 -2
- package/dist/components/iam/role-detail-page.js +4 -4
- package/dist/components/iam/role-permissions-page.js +5 -5
- package/dist/components/iam/roles-page.js +6 -7
- package/dist/components/iam/roles.js +2 -2
- package/dist/components/iam/sessions-page.js +6 -6
- package/dist/components/iam/sessions.js +2 -2
- package/dist/components/iam/tenants-page.js +6 -6
- package/dist/components/iam/tenants.js +2 -2
- package/dist/components/iam/users-page.js +7 -7
- package/dist/components/iam/users.js +2 -2
- package/dist/components/profile/account.js +2 -2
- package/dist/components/profile/change-email-form.js +8 -8
- package/dist/components/profile/change-password-form.js +2 -2
- package/dist/components/profile/change-phone-form.js +8 -8
- package/dist/components/profile/otp-verification-modal.js +5 -5
- package/dist/components/profile/profile-layout.js +3 -3
- package/dist/components/profile/request-change-email-form.js +2 -2
- package/dist/components/profile/request-change-phone-form.js +2 -2
- package/dist/components/profile/security.js +13 -13
- package/dist/components/profile/verify-change-email-form.js +6 -6
- package/dist/components/profile/verify-change-phone-form.js +6 -6
- package/dist/index.d.ts +1 -0
- package/dist/index.js +976 -64
- package/dist/index.js.map +1 -1
- package/dist/pages/__import_guard_probe.d.ts +4 -0
- package/dist/pages/auth/forgot-password.js +1 -8
- package/dist/pages/auth/forgot-password.js.map +1 -1
- package/dist/pages/auth/layout.js +6 -4
- package/dist/pages/auth/layout.js.map +1 -1
- package/dist/pages/auth/reset-password.js +1 -8
- package/dist/pages/auth/reset-password.js.map +1 -1
- package/dist/pages/auth/set-password.js +1 -9
- package/dist/pages/auth/set-password.js.map +1 -1
- package/dist/pages/auth/sign-in.js +1 -9
- package/dist/pages/auth/sign-in.js.map +1 -1
- package/dist/pages/auth/sign-up.js +1 -8
- package/dist/pages/auth/sign-up.js.map +1 -1
- package/dist/pages/auth/verify-email.js +1 -10
- package/dist/pages/auth/verify-email.js.map +1 -1
- package/dist/pages/auth/verify-phone.js +1 -10
- package/dist/pages/auth/verify-phone.js.map +1 -1
- package/dist/pages/iam/domains.d.ts +1 -1
- package/dist/pages/iam/permissions.d.ts +1 -1
- package/dist/pages/iam/permissions.js +3 -7
- package/dist/pages/iam/permissions.js.map +1 -1
- package/dist/pages/iam/role-detail-layout.js +1 -5
- package/dist/pages/iam/role-detail-layout.js.map +1 -1
- package/dist/pages/iam/role-detail.js +1 -7
- package/dist/pages/iam/role-detail.js.map +1 -1
- package/dist/pages/iam/role-permissions.js +1 -8
- package/dist/pages/iam/role-permissions.js.map +1 -1
- package/dist/pages/iam/role-users.js +1 -13
- package/dist/pages/iam/role-users.js.map +1 -1
- package/dist/pages/iam/roles.d.ts +1 -1
- package/dist/pages/iam/roles.js +3 -11
- package/dist/pages/iam/roles.js.map +1 -1
- package/dist/pages/iam/sessions.d.ts +1 -1
- package/dist/pages/iam/sessions.js +3 -9
- package/dist/pages/iam/sessions.js.map +1 -1
- package/dist/pages/iam/tenant-detail.js +1 -8
- package/dist/pages/iam/tenant-detail.js.map +1 -1
- package/dist/pages/iam/tenants/tenant-selector.js +3 -3
- package/dist/pages/iam/tenants.d.ts +1 -1
- package/dist/pages/iam/tenants.js +3 -10
- package/dist/pages/iam/tenants.js.map +1 -1
- package/dist/pages/iam/user-activity.js +1 -12
- package/dist/pages/iam/user-activity.js.map +1 -1
- package/dist/pages/iam/user-detail-layout.js +1 -7
- package/dist/pages/iam/user-detail-layout.js.map +1 -1
- package/dist/pages/iam/user-detail.js +1 -7
- package/dist/pages/iam/user-detail.js.map +1 -1
- package/dist/pages/iam/users/user-selector.js +149 -7
- package/dist/pages/iam/users/user-selector.js.map +1 -1
- package/dist/pages/iam/users.d.ts +1 -1
- package/dist/pages/iam/users.js +3 -11
- package/dist/pages/iam/users.js.map +1 -1
- package/dist/pages/profile/account.js +2 -5
- package/dist/pages/profile/account.js.map +1 -1
- package/dist/pages/profile/layout.d.ts +1 -1
- package/dist/pages/profile/layout.js +3 -5
- package/dist/pages/profile/layout.js.map +1 -1
- package/dist/pages/profile/security.js +2 -16
- package/dist/pages/profile/security.js.map +1 -1
- package/dist/types.d.ts +11 -2
- package/dist/utils/handle-error.d.ts +3 -1
- package/dist/utils/safe-redirect.d.ts +2 -0
- package/package.json +3 -3
- package/dist/chunk-2PV7RYNK.js.map +0 -1
- package/dist/chunk-AWSAC7RT.js.map +0 -1
- package/dist/chunk-GBDNBY6K.js +0 -153
- package/dist/chunk-GBDNBY6K.js.map +0 -1
- package/dist/chunk-MQI6Q2S4.js.map +0 -1
- package/dist/chunk-NFGFJPCX.js +0 -313
- package/dist/chunk-NFGFJPCX.js.map +0 -1
- package/dist/chunk-NJMNRSJH.js +0 -83
- package/dist/chunk-NJMNRSJH.js.map +0 -1
- package/dist/chunk-OXUOGOG3.js.map +0 -1
- package/dist/chunk-QPEUVMSP.js +0 -149
- package/dist/chunk-QPEUVMSP.js.map +0 -1
- package/dist/chunk-RCQTWNAG.js +0 -150
- package/dist/chunk-RCQTWNAG.js.map +0 -1
- package/dist/chunk-RRLFPSSM.js.map +0 -1
- package/dist/chunk-SGUROG23.js +0 -356
- package/dist/chunk-SGUROG23.js.map +0 -1
- package/dist/chunk-X6EUQZSZ.js +0 -81
- package/dist/chunk-X6EUQZSZ.js.map +0 -1
- /package/dist/{chunk-DG6GRTPG.js.map → chunk-4LHFPVAY.js.map} +0 -0
- /package/dist/{chunk-H5PUZDNU.js.map → chunk-57L345IN.js.map} +0 -0
- /package/dist/{chunk-CP4TTRV4.js.map → chunk-5B6GREDA.js.map} +0 -0
- /package/dist/{chunk-TEHMLZFI.js.map → chunk-5XCUGCW7.js.map} +0 -0
- /package/dist/{chunk-5AEV7RAN.js.map → chunk-6AV6I5B4.js.map} +0 -0
- /package/dist/{chunk-SGDXNT7M.js.map → chunk-7VWWIN6Q.js.map} +0 -0
- /package/dist/{chunk-V6ZHX4LT.js.map → chunk-BM3YKYGC.js.map} +0 -0
- /package/dist/{chunk-TLQMK2QF.js.map → chunk-BX75EFF3.js.map} +0 -0
- /package/dist/{chunk-W3D4HG5W.js.map → chunk-DRM44QBR.js.map} +0 -0
- /package/dist/{chunk-Z34NJZRL.js.map → chunk-EIJFTUTM.js.map} +0 -0
- /package/dist/{chunk-5E3XN6SW.js.map → chunk-FCPN2FD7.js.map} +0 -0
- /package/dist/{chunk-VVKXFEAN.js.map → chunk-FLGP4ROM.js.map} +0 -0
- /package/dist/{chunk-5SDS2E3F.js.map → chunk-FU4K62DS.js.map} +0 -0
- /package/dist/{chunk-X2BHF4KC.js.map → chunk-G4VPR4UC.js.map} +0 -0
- /package/dist/{chunk-UY55LEIG.js.map → chunk-H2W42KYL.js.map} +0 -0
- /package/dist/{chunk-EPEXIGKB.js.map → chunk-HBQK5PAH.js.map} +0 -0
- /package/dist/{chunk-4ABXALRN.js.map → chunk-IBRB7ABJ.js.map} +0 -0
- /package/dist/{chunk-RMJNENJB.js.map → chunk-IFFWIROT.js.map} +0 -0
- /package/dist/{chunk-WY2JJNZW.js.map → chunk-IK7V3PT3.js.map} +0 -0
- /package/dist/{chunk-N4JFMKGK.js.map → chunk-JKUKCVY7.js.map} +0 -0
- /package/dist/{chunk-MWMSZVH3.js.map → chunk-K6ACPILA.js.map} +0 -0
- /package/dist/{chunk-5BFG47VF.js.map → chunk-PUOQX6DR.js.map} +0 -0
- /package/dist/{chunk-EQWOGD4F.js.map → chunk-SA6HTWCL.js.map} +0 -0
- /package/dist/{chunk-73ZNGEWU.js.map → chunk-SX6WAVQS.js.map} +0 -0
- /package/dist/{chunk-5HAABEAS.js.map → chunk-TAJQ7O3U.js.map} +0 -0
- /package/dist/{chunk-MVVAPYUD.js.map → chunk-TPG4RW7H.js.map} +0 -0
- /package/dist/{chunk-ECF6S2Y2.js.map → chunk-USVJBAWJ.js.map} +0 -0
- /package/dist/{chunk-T34HJRUW.js.map → chunk-VMAGFUOK.js.map} +0 -0
- /package/dist/{chunk-ZZ6D4KE4.js.map → chunk-VS5FEGMX.js.map} +0 -0
- /package/dist/{chunk-IQNQGPIT.js.map → chunk-VWYJI2FU.js.map} +0 -0
- /package/dist/{chunk-H7JRQFFI.js.map → chunk-W2HMARW4.js.map} +0 -0
- /package/dist/{chunk-4X3CJHKR.js.map → chunk-XLPPZKU2.js.map} +0 -0
- /package/dist/{chunk-YFQNNSSC.js.map → chunk-XO5LLEGV.js.map} +0 -0
- /package/dist/{chunk-4NUO6F3J.js.map → chunk-XZAYLXLS.js.map} +0 -0
- /package/dist/{chunk-7CLKBH5Z.js.map → chunk-YCVDEX5U.js.map} +0 -0
- /package/dist/{chunk-6THPM5LB.js.map → chunk-YQU3KG74.js.map} +0 -0
- /package/dist/{chunk-GVEBIL3O.js.map → chunk-YVHMCTLM.js.map} +0 -0
- /package/dist/{chunk-6IEX2RLA.js.map → chunk-Z4FXOZEJ.js.map} +0 -0
- /package/dist/{chunk-UGQP733V.js.map → chunk-ZOKBN5H4.js.map} +0 -0
package/dist/chunk-SGUROG23.js
DELETED
|
@@ -1,356 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
UserSelector
|
|
3
|
-
} from "./chunk-GBDNBY6K.js";
|
|
4
|
-
import {
|
|
5
|
-
authApi$
|
|
6
|
-
} from "./chunk-W3D4HG5W.js";
|
|
7
|
-
import {
|
|
8
|
-
IAMGuard
|
|
9
|
-
} from "./chunk-V6ZHX4LT.js";
|
|
10
|
-
|
|
11
|
-
// src/pages/iam/roles/users/_components/role-users-page.tsx
|
|
12
|
-
import {
|
|
13
|
-
Avatar,
|
|
14
|
-
AvatarFallback,
|
|
15
|
-
AvatarImage,
|
|
16
|
-
Badge,
|
|
17
|
-
Button,
|
|
18
|
-
DataTablePagination,
|
|
19
|
-
DeleteConfirmButton,
|
|
20
|
-
DisplayTable,
|
|
21
|
-
EntityEmptyState,
|
|
22
|
-
EntityFilter,
|
|
23
|
-
EntityHeader,
|
|
24
|
-
EntityLoadingState,
|
|
25
|
-
EntitySearch,
|
|
26
|
-
EntitySort,
|
|
27
|
-
EntityViewToggle,
|
|
28
|
-
PageBody,
|
|
29
|
-
Tbody,
|
|
30
|
-
Td,
|
|
31
|
-
Th,
|
|
32
|
-
Thead,
|
|
33
|
-
Tr,
|
|
34
|
-
useEntityPagination,
|
|
35
|
-
useEntityParams
|
|
36
|
-
} from "@mesob/ui/components";
|
|
37
|
-
import { IconPlus, IconUser, IconUsers } from "@tabler/icons-react";
|
|
38
|
-
import { useQueryClient } from "@tanstack/react-query";
|
|
39
|
-
import { useMemo } from "react";
|
|
40
|
-
import { toast } from "sonner";
|
|
41
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
42
|
-
var TABLE_COLUMN_COUNT = 4;
|
|
43
|
-
function initials(user) {
|
|
44
|
-
return user.fullName.split(" ").filter(Boolean).slice(0, 2).map((part) => part[0]?.toUpperCase() ?? "").join("");
|
|
45
|
-
}
|
|
46
|
-
function UserIdentity({ user }) {
|
|
47
|
-
return /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
|
|
48
|
-
/* @__PURE__ */ jsxs(Avatar, { className: "h-9 w-9", children: [
|
|
49
|
-
/* @__PURE__ */ jsx(AvatarImage, { src: user.image ?? void 0 }),
|
|
50
|
-
/* @__PURE__ */ jsx(AvatarFallback, { children: initials(user) })
|
|
51
|
-
] }),
|
|
52
|
-
/* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx("p", { className: "font-medium", children: user.fullName }) })
|
|
53
|
-
] });
|
|
54
|
-
}
|
|
55
|
-
function UserContact({ user }) {
|
|
56
|
-
return /* @__PURE__ */ jsxs("div", { className: "space-y-1", children: [
|
|
57
|
-
user.email ? /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
58
|
-
/* @__PURE__ */ jsx("span", { children: user.email }),
|
|
59
|
-
user.emailVerified ? /* @__PURE__ */ jsx(Badge, { variant: "outline", children: "Verified" }) : null
|
|
60
|
-
] }) : null,
|
|
61
|
-
user.phone ? /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
|
|
62
|
-
/* @__PURE__ */ jsx("span", { children: user.phone }),
|
|
63
|
-
user.phoneVerified ? /* @__PURE__ */ jsx(Badge, { variant: "outline", children: "Verified" }) : null
|
|
64
|
-
] }) : null,
|
|
65
|
-
user.email || user.phone ? null : /* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "\u2014" })
|
|
66
|
-
] });
|
|
67
|
-
}
|
|
68
|
-
function UserRemoveButton({
|
|
69
|
-
roleId,
|
|
70
|
-
userId,
|
|
71
|
-
onRemove
|
|
72
|
-
}) {
|
|
73
|
-
return /* @__PURE__ */ jsx(
|
|
74
|
-
DeleteConfirmButton,
|
|
75
|
-
{
|
|
76
|
-
entityName: "user",
|
|
77
|
-
onConfirm: () => onRemove(roleId, userId),
|
|
78
|
-
triggerClassName: "size-8 text-destructive hover:text-destructive"
|
|
79
|
-
}
|
|
80
|
-
);
|
|
81
|
-
}
|
|
82
|
-
function RoleUsersTable({
|
|
83
|
-
roleId,
|
|
84
|
-
users,
|
|
85
|
-
onRemove
|
|
86
|
-
}) {
|
|
87
|
-
return /* @__PURE__ */ jsxs(DisplayTable, { withTableBorder: true, children: [
|
|
88
|
-
/* @__PURE__ */ jsx(Thead, { children: /* @__PURE__ */ jsxs(Tr, { children: [
|
|
89
|
-
/* @__PURE__ */ jsx(Th, { children: "User" }),
|
|
90
|
-
/* @__PURE__ */ jsx(Th, { children: "Contact" }),
|
|
91
|
-
/* @__PURE__ */ jsx(Th, { children: "Last sign in" }),
|
|
92
|
-
/* @__PURE__ */ jsx(Th, { className: "w-[60px]" })
|
|
93
|
-
] }) }),
|
|
94
|
-
/* @__PURE__ */ jsx(Tbody, { children: users.map((user) => /* @__PURE__ */ jsxs(Tr, { children: [
|
|
95
|
-
/* @__PURE__ */ jsx(Td, { children: /* @__PURE__ */ jsx(UserIdentity, { user }) }),
|
|
96
|
-
/* @__PURE__ */ jsx(Td, { children: /* @__PURE__ */ jsx(UserContact, { user }) }),
|
|
97
|
-
/* @__PURE__ */ jsx(Td, { children: user.lastSignInAt ? new Date(user.lastSignInAt).toLocaleDateString() : "Never" }),
|
|
98
|
-
/* @__PURE__ */ jsx(Td, { children: /* @__PURE__ */ jsx(
|
|
99
|
-
UserRemoveButton,
|
|
100
|
-
{
|
|
101
|
-
roleId,
|
|
102
|
-
userId: user.id,
|
|
103
|
-
onRemove
|
|
104
|
-
}
|
|
105
|
-
) })
|
|
106
|
-
] }, user.id)) })
|
|
107
|
-
] });
|
|
108
|
-
}
|
|
109
|
-
function RoleUsersCards({
|
|
110
|
-
roleId,
|
|
111
|
-
users,
|
|
112
|
-
onRemove
|
|
113
|
-
}) {
|
|
114
|
-
return /* @__PURE__ */ jsx("div", { className: "grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3", children: users.map((user) => /* @__PURE__ */ jsx(
|
|
115
|
-
"div",
|
|
116
|
-
{
|
|
117
|
-
className: "rounded-xl border border-border/60 bg-card p-4 shadow-sm",
|
|
118
|
-
children: /* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between gap-3", children: [
|
|
119
|
-
/* @__PURE__ */ jsxs("div", { className: "space-y-3", children: [
|
|
120
|
-
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
|
|
121
|
-
/* @__PURE__ */ jsxs(Avatar, { className: "h-10 w-10", children: [
|
|
122
|
-
/* @__PURE__ */ jsx(AvatarImage, { src: user.image ?? void 0 }),
|
|
123
|
-
/* @__PURE__ */ jsx(AvatarFallback, { children: initials(user) })
|
|
124
|
-
] }),
|
|
125
|
-
/* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx("p", { className: "font-semibold", children: user.fullName }) })
|
|
126
|
-
] }),
|
|
127
|
-
/* @__PURE__ */ jsxs("div", { className: "space-y-1 text-sm text-muted-foreground", children: [
|
|
128
|
-
/* @__PURE__ */ jsx("p", { children: user.email ?? user.phone ?? "No contact info" }),
|
|
129
|
-
/* @__PURE__ */ jsxs("p", { children: [
|
|
130
|
-
"Last sign in",
|
|
131
|
-
" ",
|
|
132
|
-
user.lastSignInAt ? new Date(user.lastSignInAt).toLocaleDateString() : "never"
|
|
133
|
-
] })
|
|
134
|
-
] })
|
|
135
|
-
] }),
|
|
136
|
-
/* @__PURE__ */ jsx(
|
|
137
|
-
UserRemoveButton,
|
|
138
|
-
{
|
|
139
|
-
roleId,
|
|
140
|
-
userId: user.id,
|
|
141
|
-
onRemove
|
|
142
|
-
}
|
|
143
|
-
)
|
|
144
|
-
] })
|
|
145
|
-
},
|
|
146
|
-
user.id
|
|
147
|
-
)) });
|
|
148
|
-
}
|
|
149
|
-
function RoleUsersPage({ roleId }) {
|
|
150
|
-
return /* @__PURE__ */ jsx(IAMGuard, { children: /* @__PURE__ */ jsx(RoleUsersPageContent, { roleId }) });
|
|
151
|
-
}
|
|
152
|
-
function RoleUsersPageContent({ roleId }) {
|
|
153
|
-
const qc = useQueryClient();
|
|
154
|
-
const { queryConfig, params, setParams } = useEntityParams({
|
|
155
|
-
searchKey: "search",
|
|
156
|
-
defaultSort: "fullName",
|
|
157
|
-
defaultOrder: "asc"
|
|
158
|
-
});
|
|
159
|
-
const usersQuery = useMemo(
|
|
160
|
-
() => ({
|
|
161
|
-
params: {
|
|
162
|
-
path: { id: roleId },
|
|
163
|
-
query: queryConfig.params.query
|
|
164
|
-
}
|
|
165
|
-
}),
|
|
166
|
-
[queryConfig, roleId]
|
|
167
|
-
);
|
|
168
|
-
const { data, isPending, isFetching } = authApi$.useQuery(
|
|
169
|
-
"get",
|
|
170
|
-
"/roles/{id}/users",
|
|
171
|
-
usersQuery,
|
|
172
|
-
{ enabled: !!roleId }
|
|
173
|
-
);
|
|
174
|
-
const assignUsers = authApi$.useMutation("post", "/roles/{id}/users", {
|
|
175
|
-
onSuccess: (result) => {
|
|
176
|
-
qc.invalidateQueries({ queryKey: ["get", "/roles"] });
|
|
177
|
-
qc.invalidateQueries({ queryKey: ["get", "/roles/{id}"] });
|
|
178
|
-
qc.invalidateQueries({ queryKey: ["get", "/roles/{id}/users"] });
|
|
179
|
-
toast.success(
|
|
180
|
-
result?.created ? `${result.created} user(s) added` : "No changes"
|
|
181
|
-
);
|
|
182
|
-
},
|
|
183
|
-
onError: () => {
|
|
184
|
-
toast.error("Failed to assign users");
|
|
185
|
-
}
|
|
186
|
-
});
|
|
187
|
-
const revokeUser = authApi$.useMutation(
|
|
188
|
-
"delete",
|
|
189
|
-
"/roles/{id}/users/{userId}",
|
|
190
|
-
{
|
|
191
|
-
onSuccess: () => {
|
|
192
|
-
qc.invalidateQueries({ queryKey: ["get", "/roles"] });
|
|
193
|
-
qc.invalidateQueries({ queryKey: ["get", "/roles/{id}"] });
|
|
194
|
-
qc.invalidateQueries({ queryKey: ["get", "/roles/{id}/users"] });
|
|
195
|
-
toast.success("User removed");
|
|
196
|
-
},
|
|
197
|
-
onError: () => {
|
|
198
|
-
toast.error("Failed to remove user");
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
);
|
|
202
|
-
const users = data?.users ?? [];
|
|
203
|
-
const { total, pageCount } = useEntityPagination({
|
|
204
|
-
items: users,
|
|
205
|
-
total: data?.total,
|
|
206
|
-
pageSize: params.pageSize
|
|
207
|
-
});
|
|
208
|
-
const isLoading = isPending || isFetching;
|
|
209
|
-
const currentView = params.view || "table";
|
|
210
|
-
const handleRemoveUser = (targetRoleId, userId) => {
|
|
211
|
-
revokeUser.mutate({
|
|
212
|
-
params: {
|
|
213
|
-
path: { id: targetRoleId, userId }
|
|
214
|
-
}
|
|
215
|
-
});
|
|
216
|
-
};
|
|
217
|
-
if (!roleId) {
|
|
218
|
-
return null;
|
|
219
|
-
}
|
|
220
|
-
let content;
|
|
221
|
-
if (isLoading) {
|
|
222
|
-
content = /* @__PURE__ */ jsx(
|
|
223
|
-
EntityLoadingState,
|
|
224
|
-
{
|
|
225
|
-
view: currentView,
|
|
226
|
-
rowCount: params.pageSize,
|
|
227
|
-
columnCount: TABLE_COLUMN_COUNT,
|
|
228
|
-
cardCount: params.pageSize
|
|
229
|
-
}
|
|
230
|
-
);
|
|
231
|
-
} else if (total === 0) {
|
|
232
|
-
content = /* @__PURE__ */ jsx(
|
|
233
|
-
EntityEmptyState,
|
|
234
|
-
{
|
|
235
|
-
icon: IconUsers,
|
|
236
|
-
entityName: "user",
|
|
237
|
-
title: "No users assigned",
|
|
238
|
-
description: "Assign users from the selector to add them to this role."
|
|
239
|
-
}
|
|
240
|
-
);
|
|
241
|
-
} else if (currentView === "table") {
|
|
242
|
-
content = /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
243
|
-
/* @__PURE__ */ jsx(
|
|
244
|
-
RoleUsersTable,
|
|
245
|
-
{
|
|
246
|
-
roleId,
|
|
247
|
-
users,
|
|
248
|
-
onRemove: handleRemoveUser
|
|
249
|
-
}
|
|
250
|
-
),
|
|
251
|
-
/* @__PURE__ */ jsx(
|
|
252
|
-
DataTablePagination,
|
|
253
|
-
{
|
|
254
|
-
pageIndex: params.page - 1,
|
|
255
|
-
pageSize: params.pageSize,
|
|
256
|
-
pageCount,
|
|
257
|
-
totalRows: total,
|
|
258
|
-
onPageChange: (page) => setParams({ page: page + 1 }),
|
|
259
|
-
onPageSizeChange: (pageSize) => setParams({ pageSize, page: 1 })
|
|
260
|
-
}
|
|
261
|
-
)
|
|
262
|
-
] });
|
|
263
|
-
} else {
|
|
264
|
-
content = /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
265
|
-
/* @__PURE__ */ jsx(
|
|
266
|
-
RoleUsersCards,
|
|
267
|
-
{
|
|
268
|
-
roleId,
|
|
269
|
-
users,
|
|
270
|
-
onRemove: handleRemoveUser
|
|
271
|
-
}
|
|
272
|
-
),
|
|
273
|
-
/* @__PURE__ */ jsx(
|
|
274
|
-
DataTablePagination,
|
|
275
|
-
{
|
|
276
|
-
pageIndex: params.page - 1,
|
|
277
|
-
pageSize: params.pageSize,
|
|
278
|
-
pageCount,
|
|
279
|
-
totalRows: total,
|
|
280
|
-
onPageChange: (page) => setParams({ page: page + 1 }),
|
|
281
|
-
onPageSizeChange: (pageSize) => setParams({ pageSize, page: 1 })
|
|
282
|
-
}
|
|
283
|
-
)
|
|
284
|
-
] });
|
|
285
|
-
}
|
|
286
|
-
return /* @__PURE__ */ jsxs(PageBody, { className: "px-0 pb-6", children: [
|
|
287
|
-
/* @__PURE__ */ jsx(
|
|
288
|
-
EntityHeader,
|
|
289
|
-
{
|
|
290
|
-
icon: /* @__PURE__ */ jsx(IconUser, { className: "h-5 w-5" }),
|
|
291
|
-
title: "Role users",
|
|
292
|
-
actions: /* @__PURE__ */ jsx(
|
|
293
|
-
UserSelector,
|
|
294
|
-
{
|
|
295
|
-
trigger: /* @__PURE__ */ jsxs(Button, { size: "sm", loading: assignUsers.isPending, children: [
|
|
296
|
-
/* @__PURE__ */ jsx(IconPlus, { className: "h-4 w-4" }),
|
|
297
|
-
"Add users"
|
|
298
|
-
] }),
|
|
299
|
-
multiple: true,
|
|
300
|
-
excludeIds: users.map((user) => user.id),
|
|
301
|
-
onSelect: (selectedUsers) => {
|
|
302
|
-
if (!selectedUsers.length) {
|
|
303
|
-
return;
|
|
304
|
-
}
|
|
305
|
-
assignUsers.mutate({
|
|
306
|
-
params: { path: { id: roleId } },
|
|
307
|
-
body: {
|
|
308
|
-
userIds: selectedUsers.map((user) => user.id)
|
|
309
|
-
}
|
|
310
|
-
});
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
),
|
|
314
|
-
search: /* @__PURE__ */ jsx(
|
|
315
|
-
EntitySearch,
|
|
316
|
-
{
|
|
317
|
-
paramKey: "search",
|
|
318
|
-
placeholder: "Search assigned users..."
|
|
319
|
-
}
|
|
320
|
-
),
|
|
321
|
-
filter: /* @__PURE__ */ jsx(
|
|
322
|
-
EntityFilter,
|
|
323
|
-
{
|
|
324
|
-
options: [
|
|
325
|
-
{ label: "All", value: "" },
|
|
326
|
-
{ label: "Name", value: "fullName" },
|
|
327
|
-
{ label: "Email", value: "email" },
|
|
328
|
-
{ label: "Phone", value: "phone" }
|
|
329
|
-
],
|
|
330
|
-
placeholder: "Search field"
|
|
331
|
-
}
|
|
332
|
-
),
|
|
333
|
-
sort: /* @__PURE__ */ jsx(
|
|
334
|
-
EntitySort,
|
|
335
|
-
{
|
|
336
|
-
defaultSort: "fullName",
|
|
337
|
-
defaultOrder: "asc",
|
|
338
|
-
options: [
|
|
339
|
-
{ label: "Created", value: "createdAt" },
|
|
340
|
-
{ label: "Updated", value: "updatedAt" },
|
|
341
|
-
{ label: "Name", value: "fullName" },
|
|
342
|
-
{ label: "Last Sign In", value: "lastSignInAt" }
|
|
343
|
-
]
|
|
344
|
-
}
|
|
345
|
-
),
|
|
346
|
-
view: /* @__PURE__ */ jsx(EntityViewToggle, { views: ["table", "card"] })
|
|
347
|
-
}
|
|
348
|
-
),
|
|
349
|
-
content
|
|
350
|
-
] });
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
export {
|
|
354
|
-
RoleUsersPage
|
|
355
|
-
};
|
|
356
|
-
//# sourceMappingURL=chunk-SGUROG23.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/pages/iam/roles/users/_components/role-users-page.tsx"],"sourcesContent":["'use client';\n\nimport {\n Avatar,\n AvatarFallback,\n AvatarImage,\n Badge,\n Button,\n DataTablePagination,\n DeleteConfirmButton,\n DisplayTable,\n EntityEmptyState,\n EntityFilter,\n EntityHeader,\n EntityLoadingState,\n EntitySearch,\n EntitySort,\n EntityViewToggle,\n PageBody,\n Tbody,\n Td,\n Th,\n Thead,\n Tr,\n useEntityPagination,\n useEntityParams,\n} from '@mesob/ui/components';\nimport { IconPlus, IconUser, IconUsers } from '@tabler/icons-react';\nimport { useQueryClient } from '@tanstack/react-query';\nimport type { ReactNode } from 'react';\nimport { useMemo } from 'react';\nimport { toast } from 'sonner';\nimport { IAMGuard } from '../../../../../components/iam/iam-guard';\nimport type { paths } from '../../../../../data/openapi';\nimport { authApi$ } from '../../../shared/page-helpers';\nimport { UserSelector } from '../../../users/_components/user-selector';\nimport type { User } from '../../../users/_components/users-data';\n\ntype RoleUsersPageProps = {\n roleId: string;\n};\n\nconst TABLE_COLUMN_COUNT = 4;\n\nfunction initials(user: User) {\n return user.fullName\n .split(' ')\n .filter(Boolean)\n .slice(0, 2)\n .map((part: string) => part[0]?.toUpperCase() ?? '')\n .join('');\n}\n\nfunction UserIdentity({ user }: { user: User }) {\n return (\n <div className=\"flex items-center gap-3\">\n <Avatar className=\"h-9 w-9\">\n <AvatarImage src={user.image ?? undefined} />\n <AvatarFallback>{initials(user)}</AvatarFallback>\n </Avatar>\n <div>\n <p className=\"font-medium\">{user.fullName}</p>\n </div>\n </div>\n );\n}\n\nfunction UserContact({ user }: { user: User }) {\n return (\n <div className=\"space-y-1\">\n {user.email ? (\n <div className=\"flex items-center gap-2\">\n <span>{user.email}</span>\n {user.emailVerified ? (\n <Badge variant=\"outline\">Verified</Badge>\n ) : null}\n </div>\n ) : null}\n {user.phone ? (\n <div className=\"flex items-center gap-2\">\n <span>{user.phone}</span>\n {user.phoneVerified ? (\n <Badge variant=\"outline\">Verified</Badge>\n ) : null}\n </div>\n ) : null}\n {user.email || user.phone ? null : (\n <span className=\"text-muted-foreground\">—</span>\n )}\n </div>\n );\n}\n\nfunction UserRemoveButton({\n roleId,\n userId,\n onRemove,\n}: {\n roleId: string;\n userId: string;\n onRemove: (roleId: string, userId: string) => void;\n}) {\n return (\n <DeleteConfirmButton\n entityName=\"user\"\n onConfirm={() => onRemove(roleId, userId)}\n triggerClassName=\"size-8 text-destructive hover:text-destructive\"\n />\n );\n}\n\nfunction RoleUsersTable({\n roleId,\n users,\n onRemove,\n}: {\n roleId: string;\n users: User[];\n onRemove: (roleId: string, userId: string) => void;\n}) {\n return (\n <DisplayTable withTableBorder>\n <Thead>\n <Tr>\n <Th>User</Th>\n <Th>Contact</Th>\n <Th>Last sign in</Th>\n <Th className=\"w-[60px]\" />\n </Tr>\n </Thead>\n <Tbody>\n {users.map((user) => (\n <Tr key={user.id}>\n <Td>\n <UserIdentity user={user} />\n </Td>\n <Td>\n <UserContact user={user} />\n </Td>\n <Td>\n {user.lastSignInAt\n ? new Date(user.lastSignInAt).toLocaleDateString()\n : 'Never'}\n </Td>\n <Td>\n <UserRemoveButton\n roleId={roleId}\n userId={user.id}\n onRemove={onRemove}\n />\n </Td>\n </Tr>\n ))}\n </Tbody>\n </DisplayTable>\n );\n}\n\nfunction RoleUsersCards({\n roleId,\n users,\n onRemove,\n}: {\n roleId: string;\n users: User[];\n onRemove: (roleId: string, userId: string) => void;\n}) {\n return (\n <div className=\"grid grid-cols-1 gap-4 md:grid-cols-2 xl:grid-cols-3\">\n {users.map((user) => (\n <div\n key={user.id}\n className=\"rounded-xl border border-border/60 bg-card p-4 shadow-sm\"\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"space-y-3\">\n <div className=\"flex items-center gap-3\">\n <Avatar className=\"h-10 w-10\">\n <AvatarImage src={user.image ?? undefined} />\n <AvatarFallback>{initials(user)}</AvatarFallback>\n </Avatar>\n <div>\n <p className=\"font-semibold\">{user.fullName}</p>\n </div>\n </div>\n <div className=\"space-y-1 text-sm text-muted-foreground\">\n <p>{user.email ?? user.phone ?? 'No contact info'}</p>\n <p>\n Last sign in{' '}\n {user.lastSignInAt\n ? new Date(user.lastSignInAt).toLocaleDateString()\n : 'never'}\n </p>\n </div>\n </div>\n <UserRemoveButton\n roleId={roleId}\n userId={user.id}\n onRemove={onRemove}\n />\n </div>\n </div>\n ))}\n </div>\n );\n}\n\nexport function RoleUsersPage({ roleId }: RoleUsersPageProps) {\n return (\n <IAMGuard>\n <RoleUsersPageContent roleId={roleId} />\n </IAMGuard>\n );\n}\n\nfunction RoleUsersPageContent({ roleId }: RoleUsersPageProps) {\n const qc = useQueryClient();\n const { queryConfig, params, setParams } = useEntityParams({\n searchKey: 'search',\n defaultSort: 'fullName',\n defaultOrder: 'asc',\n });\n const usersQuery = useMemo(\n () =>\n ({\n params: {\n path: { id: roleId },\n query: queryConfig.params.query,\n },\n }) as {\n params: {\n path: { id: string };\n query: NonNullable<\n paths['/roles/{id}/users']['get']['parameters']['query']\n >;\n };\n },\n [queryConfig, roleId],\n );\n\n const { data, isPending, isFetching } = authApi$.useQuery(\n 'get',\n '/roles/{id}/users',\n usersQuery,\n { enabled: !!roleId },\n );\n const assignUsers = authApi$.useMutation('post', '/roles/{id}/users', {\n onSuccess: (result: { created?: number } | undefined) => {\n qc.invalidateQueries({ queryKey: ['get', '/roles'] });\n qc.invalidateQueries({ queryKey: ['get', '/roles/{id}'] });\n qc.invalidateQueries({ queryKey: ['get', '/roles/{id}/users'] });\n toast.success(\n result?.created ? `${result.created} user(s) added` : 'No changes',\n );\n },\n onError: () => {\n toast.error('Failed to assign users');\n },\n });\n const revokeUser = authApi$.useMutation(\n 'delete',\n '/roles/{id}/users/{userId}',\n {\n onSuccess: () => {\n qc.invalidateQueries({ queryKey: ['get', '/roles'] });\n qc.invalidateQueries({ queryKey: ['get', '/roles/{id}'] });\n qc.invalidateQueries({ queryKey: ['get', '/roles/{id}/users'] });\n toast.success('User removed');\n },\n onError: () => {\n toast.error('Failed to remove user');\n },\n },\n );\n\n const users = (data?.users ?? []) as User[];\n const { total, pageCount } = useEntityPagination({\n items: users,\n total: data?.total,\n pageSize: params.pageSize,\n });\n const isLoading = isPending || isFetching;\n const currentView = (params.view || 'table') as 'table' | 'card';\n const handleRemoveUser = (targetRoleId: string, userId: string) => {\n revokeUser.mutate({\n params: {\n path: { id: targetRoleId, userId },\n },\n });\n };\n\n if (!roleId) {\n return null;\n }\n\n let content: ReactNode;\n if (isLoading) {\n content = (\n <EntityLoadingState\n view={currentView}\n rowCount={params.pageSize}\n columnCount={TABLE_COLUMN_COUNT}\n cardCount={params.pageSize}\n />\n );\n } else if (total === 0) {\n content = (\n <EntityEmptyState\n icon={IconUsers}\n entityName=\"user\"\n title=\"No users assigned\"\n description=\"Assign users from the selector to add them to this role.\"\n />\n );\n } else if (currentView === 'table') {\n content = (\n <div className=\"space-y-4\">\n <RoleUsersTable\n roleId={roleId}\n users={users}\n onRemove={handleRemoveUser}\n />\n <DataTablePagination\n pageIndex={params.page - 1}\n pageSize={params.pageSize}\n pageCount={pageCount}\n totalRows={total}\n onPageChange={(page) => setParams({ page: page + 1 })}\n onPageSizeChange={(pageSize) => setParams({ pageSize, page: 1 })}\n />\n </div>\n );\n } else {\n content = (\n <div className=\"space-y-4\">\n <RoleUsersCards\n roleId={roleId}\n users={users}\n onRemove={handleRemoveUser}\n />\n <DataTablePagination\n pageIndex={params.page - 1}\n pageSize={params.pageSize}\n pageCount={pageCount}\n totalRows={total}\n onPageChange={(page) => setParams({ page: page + 1 })}\n onPageSizeChange={(pageSize) => setParams({ pageSize, page: 1 })}\n />\n </div>\n );\n }\n\n return (\n <PageBody className=\"px-0 pb-6\">\n <EntityHeader\n icon={<IconUser className=\"h-5 w-5\" />}\n title=\"Role users\"\n actions={\n <UserSelector\n trigger={\n <Button size=\"sm\" loading={assignUsers.isPending}>\n <IconPlus className=\"h-4 w-4\" />\n Add users\n </Button>\n }\n multiple\n excludeIds={users.map((user) => user.id)}\n onSelect={(selectedUsers: User[]) => {\n if (!selectedUsers.length) {\n return;\n }\n\n assignUsers.mutate({\n params: { path: { id: roleId } },\n body: {\n userIds: selectedUsers.map((user: User) => user.id),\n },\n });\n }}\n />\n }\n search={\n <EntitySearch\n paramKey=\"search\"\n placeholder=\"Search assigned users...\"\n />\n }\n filter={\n <EntityFilter\n options={[\n { label: 'All', value: '' },\n { label: 'Name', value: 'fullName' },\n { label: 'Email', value: 'email' },\n { label: 'Phone', value: 'phone' },\n ]}\n placeholder=\"Search field\"\n />\n }\n sort={\n <EntitySort\n defaultSort=\"fullName\"\n defaultOrder=\"asc\"\n options={[\n { label: 'Created', value: 'createdAt' },\n { label: 'Updated', value: 'updatedAt' },\n { label: 'Name', value: 'fullName' },\n { label: 'Last Sign In', value: 'lastSignInAt' },\n ]}\n />\n }\n view={<EntityViewToggle views={['table', 'card']} />}\n />\n {content}\n </PageBody>\n );\n}\n"],"mappings":"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","names":[]}
|
package/dist/chunk-X6EUQZSZ.js
DELETED
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
IAMGuard
|
|
3
|
-
} from "./chunk-V6ZHX4LT.js";
|
|
4
|
-
import {
|
|
5
|
-
useApi,
|
|
6
|
-
useConfig
|
|
7
|
-
} from "./chunk-AWSAC7RT.js";
|
|
8
|
-
|
|
9
|
-
// src/pages/iam/users/_components/user-detail-layout-content.tsx
|
|
10
|
-
import { toTitleCase } from "@mesob/common";
|
|
11
|
-
import {
|
|
12
|
-
Button,
|
|
13
|
-
EntityDetailHeader,
|
|
14
|
-
PageContainer,
|
|
15
|
-
useBreadcrumbs
|
|
16
|
-
} from "@mesob/ui/components";
|
|
17
|
-
import { IconUser } from "@tabler/icons-react";
|
|
18
|
-
import { useMemo } from "react";
|
|
19
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
20
|
-
function UserDetailLayoutContent({
|
|
21
|
-
userId,
|
|
22
|
-
children
|
|
23
|
-
}) {
|
|
24
|
-
return /* @__PURE__ */ jsx(IAMGuard, { children: /* @__PURE__ */ jsx(UserDetailLayoutContentInner, { userId, children }) });
|
|
25
|
-
}
|
|
26
|
-
function UserDetailLayoutContentInner({
|
|
27
|
-
userId,
|
|
28
|
-
children
|
|
29
|
-
}) {
|
|
30
|
-
const { hooks } = useApi();
|
|
31
|
-
const { config } = useConfig();
|
|
32
|
-
const homeHref = config.navigation?.defaultRedirectUrl || "/";
|
|
33
|
-
const { data, isLoading } = hooks.useQuery(
|
|
34
|
-
"get",
|
|
35
|
-
"/users/{id}",
|
|
36
|
-
{ params: { path: { id: userId } } },
|
|
37
|
-
{ enabled: !!userId }
|
|
38
|
-
);
|
|
39
|
-
const user = data?.user;
|
|
40
|
-
const title = toTitleCase(user?.fullName || userId || "User");
|
|
41
|
-
useBreadcrumbs({
|
|
42
|
-
items: [
|
|
43
|
-
{ label: "Home", href: homeHref },
|
|
44
|
-
{ label: "IAM", href: "/iam" },
|
|
45
|
-
{ label: "Users", href: "/iam/users" },
|
|
46
|
-
{ label: title }
|
|
47
|
-
]
|
|
48
|
-
});
|
|
49
|
-
const tabs = useMemo(
|
|
50
|
-
() => [
|
|
51
|
-
{ value: "detail", name: "Detail", href: `/iam/users/${userId}` },
|
|
52
|
-
{
|
|
53
|
-
value: "activity",
|
|
54
|
-
name: "Activity",
|
|
55
|
-
href: `/iam/users/${userId}/activity`
|
|
56
|
-
}
|
|
57
|
-
],
|
|
58
|
-
[userId]
|
|
59
|
-
);
|
|
60
|
-
if (!userId) {
|
|
61
|
-
return null;
|
|
62
|
-
}
|
|
63
|
-
return /* @__PURE__ */ jsxs(PageContainer, { children: [
|
|
64
|
-
/* @__PURE__ */ jsx(
|
|
65
|
-
EntityDetailHeader,
|
|
66
|
-
{
|
|
67
|
-
title,
|
|
68
|
-
icon: /* @__PURE__ */ jsx(IconUser, {}),
|
|
69
|
-
tabs,
|
|
70
|
-
loading: isLoading,
|
|
71
|
-
actions: /* @__PURE__ */ jsx(Button, { children: "Test Button" })
|
|
72
|
-
}
|
|
73
|
-
),
|
|
74
|
-
children
|
|
75
|
-
] });
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
export {
|
|
79
|
-
UserDetailLayoutContent
|
|
80
|
-
};
|
|
81
|
-
//# sourceMappingURL=chunk-X6EUQZSZ.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/pages/iam/users/_components/user-detail-layout-content.tsx"],"sourcesContent":["'use client';\n\nimport { toTitleCase } from '@mesob/common';\nimport {\n Button,\n EntityDetailHeader,\n PageContainer,\n type TabItem,\n useBreadcrumbs,\n} from '@mesob/ui/components';\nimport { IconUser } from '@tabler/icons-react';\nimport { useMemo } from 'react';\nimport { IAMGuard } from '../../../../components/iam/iam-guard';\nimport { useApi, useConfig } from '../../../../provider';\n\ntype UserDetailLayoutContentProps = {\n userId: string;\n children: React.ReactNode;\n};\n\nexport function UserDetailLayoutContent({\n userId,\n children,\n}: UserDetailLayoutContentProps) {\n return (\n <IAMGuard>\n <UserDetailLayoutContentInner userId={userId}>\n {children}\n </UserDetailLayoutContentInner>\n </IAMGuard>\n );\n}\n\nfunction UserDetailLayoutContentInner({\n userId,\n children,\n}: UserDetailLayoutContentProps) {\n const { hooks } = useApi();\n const { config } = useConfig();\n const homeHref = config.navigation?.defaultRedirectUrl || '/';\n const { data, isLoading } = hooks.useQuery(\n 'get',\n '/users/{id}',\n { params: { path: { id: userId } } },\n { enabled: !!userId },\n );\n const user = data?.user;\n\n const title = toTitleCase(user?.fullName || userId || 'User');\n\n useBreadcrumbs({\n items: [\n { label: 'Home', href: homeHref },\n { label: 'IAM', href: '/iam' },\n { label: 'Users', href: '/iam/users' },\n { label: title },\n ],\n });\n\n const tabs: TabItem[] = useMemo(\n () => [\n { value: 'detail', name: 'Detail', href: `/iam/users/${userId}` },\n {\n value: 'activity',\n name: 'Activity',\n href: `/iam/users/${userId}/activity`,\n },\n ],\n [userId],\n );\n\n if (!userId) {\n return null;\n }\n\n return (\n <PageContainer>\n <EntityDetailHeader\n title={title}\n icon={<IconUser />}\n tabs={tabs}\n loading={isLoading}\n actions={<Button>Test Button</Button>}\n />\n {children}\n </PageContainer>\n );\n}\n"],"mappings":";;;;;;;;;AAEA,SAAS,mBAAmB;AAC5B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,OACK;AACP,SAAS,gBAAgB;AACzB,SAAS,eAAe;AAelB,cAkDF,YAlDE;AANC,SAAS,wBAAwB;AAAA,EACtC;AAAA,EACA;AACF,GAAiC;AAC/B,SACE,oBAAC,YACC,8BAAC,gCAA6B,QAC3B,UACH,GACF;AAEJ;AAEA,SAAS,6BAA6B;AAAA,EACpC;AAAA,EACA;AACF,GAAiC;AAC/B,QAAM,EAAE,MAAM,IAAI,OAAO;AACzB,QAAM,EAAE,OAAO,IAAI,UAAU;AAC7B,QAAM,WAAW,OAAO,YAAY,sBAAsB;AAC1D,QAAM,EAAE,MAAM,UAAU,IAAI,MAAM;AAAA,IAChC;AAAA,IACA;AAAA,IACA,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,OAAO,EAAE,EAAE;AAAA,IACnC,EAAE,SAAS,CAAC,CAAC,OAAO;AAAA,EACtB;AACA,QAAM,OAAO,MAAM;AAEnB,QAAM,QAAQ,YAAY,MAAM,YAAY,UAAU,MAAM;AAE5D,iBAAe;AAAA,IACb,OAAO;AAAA,MACL,EAAE,OAAO,QAAQ,MAAM,SAAS;AAAA,MAChC,EAAE,OAAO,OAAO,MAAM,OAAO;AAAA,MAC7B,EAAE,OAAO,SAAS,MAAM,aAAa;AAAA,MACrC,EAAE,OAAO,MAAM;AAAA,IACjB;AAAA,EACF,CAAC;AAED,QAAM,OAAkB;AAAA,IACtB,MAAM;AAAA,MACJ,EAAE,OAAO,UAAU,MAAM,UAAU,MAAM,cAAc,MAAM,GAAG;AAAA,MAChE;AAAA,QACE,OAAO;AAAA,QACP,MAAM;AAAA,QACN,MAAM,cAAc,MAAM;AAAA,MAC5B;AAAA,IACF;AAAA,IACA,CAAC,MAAM;AAAA,EACT;AAEA,MAAI,CAAC,QAAQ;AACX,WAAO;AAAA,EACT;AAEA,SACE,qBAAC,iBACC;AAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,MAAM,oBAAC,YAAS;AAAA,QAChB;AAAA,QACA,SAAS;AAAA,QACT,SAAS,oBAAC,UAAO,yBAAW;AAAA;AAAA,IAC9B;AAAA,IACC;AAAA,KACH;AAEJ;","names":[]}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|