@burdenoff/microfe-auth 2026.624.2 → 2026.625.1
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/auth/hooks/index.js +1 -0
- package/dist/auth/hooks/useActiveContextBootstrapMirror.js +27 -0
- package/dist/auth/hooks/useActiveContextBootstrapMirror.js.map +1 -0
- package/dist/auth/index.js +1 -0
- package/dist/auth/pages/AuditLogPage.js +73 -72
- package/dist/auth/pages/AuditLogPage.js.map +1 -1
- package/dist/auth/pages/EmailVerifyPage.js +58 -53
- package/dist/auth/pages/EmailVerifyPage.js.map +1 -1
- package/dist/auth/pages/LoginPage.js +222 -214
- package/dist/auth/pages/LoginPage.js.map +1 -1
- package/dist/auth/pages/MagicLinkPage.js +75 -68
- package/dist/auth/pages/MagicLinkPage.js.map +1 -1
- package/dist/auth/pages/MfaSetupPage.js +176 -138
- package/dist/auth/pages/MfaSetupPage.js.map +1 -1
- package/dist/auth/pages/MfaVerifyPage.js +60 -52
- package/dist/auth/pages/MfaVerifyPage.js.map +1 -1
- package/dist/auth/pages/PasswordResetPage.js +277 -262
- package/dist/auth/pages/PasswordResetPage.js.map +1 -1
- package/dist/auth/pages/ReactivatePage.js +54 -46
- package/dist/auth/pages/ReactivatePage.js.map +1 -1
- package/dist/auth/pages/RegisterPage.js +223 -213
- package/dist/auth/pages/RegisterPage.js.map +1 -1
- package/dist/auth/pages/SecurityPage.js +298 -267
- package/dist/auth/pages/SecurityPage.js.map +1 -1
- package/dist/auth/pages/SessionsPage.js +169 -160
- package/dist/auth/pages/SessionsPage.js.map +1 -1
- package/dist/auth/pages/SsoCallbackPage.js +53 -50
- package/dist/auth/pages/SsoCallbackPage.js.map +1 -1
- package/dist/auth/pages/SsoConfigPage.js +466 -444
- package/dist/auth/pages/SsoConfigPage.js.map +1 -1
- package/dist/auth/pages/SsoLoginPage.js +67 -59
- package/dist/auth/pages/SsoLoginPage.js.map +1 -1
- package/dist/auth/pages/UserDetailsPage.js +154 -144
- package/dist/auth/pages/UserDetailsPage.js.map +1 -1
- package/dist/auth/pages/UserProfilePage.js +211 -170
- package/dist/auth/pages/UserProfilePage.js.map +1 -1
- package/dist/auth/pages/UsersPage.js +572 -576
- package/dist/auth/pages/UsersPage.js.map +1 -1
- package/dist/index.js +7 -6
- package/dist/microfe-auth.css +1 -1
- package/package.json +2 -2
|
@@ -8,8 +8,9 @@ import { useEffect as s, useState as c } from "react";
|
|
|
8
8
|
import { useNavigate as l, useParams as u } from "react-router-dom";
|
|
9
9
|
import { useI18n as d } from "@burdenoff/fe-libs/shared/providers/shell";
|
|
10
10
|
import { Fragment as f, jsx as p, jsxs as m } from "react/jsx-runtime";
|
|
11
|
+
import { EmphasisPanel as h, IllustratedEmptyState as g, NextSteps as _, PagePurpose as v } from "@burdenoff/fe-libs/ui";
|
|
11
12
|
//#region src/auth/pages/UserDetailsPage.tsx
|
|
12
|
-
var
|
|
13
|
+
var y = (e) => {
|
|
13
14
|
switch (e) {
|
|
14
15
|
case "SUPER_ADMIN": return "bg-accent-purple-subtle text-accent-purple";
|
|
15
16
|
case "TENANT_ADMIN": return "bg-status-info-bg-subtle text-status-info-text";
|
|
@@ -19,7 +20,7 @@ var h = (e) => {
|
|
|
19
20
|
case "GUEST": return "bg-bg-sunken text-text-primary";
|
|
20
21
|
default: return "bg-bg-sunken text-text-primary";
|
|
21
22
|
}
|
|
22
|
-
},
|
|
23
|
+
}, b = (e) => {
|
|
23
24
|
switch (e) {
|
|
24
25
|
case "ACTIVE": return "bg-status-success-bg-subtle text-status-success-text";
|
|
25
26
|
case "INACTIVE": return "bg-status-warning-bg-subtle text-status-warning-text";
|
|
@@ -28,59 +29,59 @@ var h = (e) => {
|
|
|
28
29
|
default: return "bg-bg-sunken text-text-primary";
|
|
29
30
|
}
|
|
30
31
|
};
|
|
31
|
-
function
|
|
32
|
-
let { id:
|
|
33
|
-
let n =
|
|
32
|
+
function x() {
|
|
33
|
+
let { id: x } = u(), S = l(), { t: C } = d(), w = (e, t) => {
|
|
34
|
+
let n = C(e);
|
|
34
35
|
return n === e ? t : n;
|
|
35
|
-
},
|
|
36
|
+
}, T = e((e) => e.isAuthenticated), E = e((e) => e.user), { canViewUsers: D, canDeleteUsers: O, isLoading: k } = i(), { getUser: A, deleteUser: j, hardDeleteUser: M } = r(), [N, P] = c(null), [F, I] = c(!0), [L, R] = c(null), [z, B] = c(null), [V, H] = c(null), [U, { loading: W }] = a(), [G, K] = c(null);
|
|
36
37
|
s(() => {
|
|
37
38
|
let e = !1;
|
|
38
|
-
if (!
|
|
39
|
-
|
|
39
|
+
if (!x) {
|
|
40
|
+
R("Missing user id"), I(!1);
|
|
40
41
|
return;
|
|
41
42
|
}
|
|
42
|
-
if (!
|
|
43
|
-
|
|
43
|
+
if (!T) {
|
|
44
|
+
I(!1);
|
|
44
45
|
return;
|
|
45
46
|
}
|
|
46
|
-
return
|
|
47
|
-
e || (t ?
|
|
47
|
+
return I(!0), R(null), A(x).then((t) => {
|
|
48
|
+
e || (t ? P(t) : R(w("auth.userDetails.userNotFound", "User not found")));
|
|
48
49
|
}).catch((t) => {
|
|
49
|
-
e ||
|
|
50
|
+
e || R(t instanceof Error ? t.message : "Failed to fetch user details");
|
|
50
51
|
}).finally(() => {
|
|
51
|
-
e ||
|
|
52
|
+
e || I(!1);
|
|
52
53
|
}), () => {
|
|
53
54
|
e = !0;
|
|
54
55
|
};
|
|
55
56
|
}, [
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
57
|
+
x,
|
|
58
|
+
A,
|
|
59
|
+
T
|
|
59
60
|
]);
|
|
60
|
-
let
|
|
61
|
-
if (
|
|
62
|
-
let e = await
|
|
61
|
+
let q = async () => {
|
|
62
|
+
if (N) try {
|
|
63
|
+
let e = await j(N.id);
|
|
63
64
|
if (e.success) {
|
|
64
|
-
|
|
65
|
-
let e = await
|
|
66
|
-
e &&
|
|
67
|
-
} else
|
|
65
|
+
B(w("auth.userDetails.userDeactivated", "User \"{email}\" has been deactivated.").replace("{email}", N.email)), H(null);
|
|
66
|
+
let e = await A(N.id);
|
|
67
|
+
e && P(e);
|
|
68
|
+
} else R(e.message);
|
|
68
69
|
} catch (e) {
|
|
69
|
-
|
|
70
|
+
R(e instanceof Error ? e.message : "Failed to delete user");
|
|
70
71
|
}
|
|
71
|
-
},
|
|
72
|
-
if (
|
|
73
|
-
let e = await
|
|
74
|
-
e.success ? (
|
|
72
|
+
}, J = async () => {
|
|
73
|
+
if (N) try {
|
|
74
|
+
let e = await M(N.id);
|
|
75
|
+
e.success ? (H(null), S("/auth/users")) : R(e.message);
|
|
75
76
|
} catch (e) {
|
|
76
|
-
|
|
77
|
+
R(e instanceof Error ? e.message : "Failed to hard delete user");
|
|
77
78
|
}
|
|
78
|
-
},
|
|
79
|
-
if (
|
|
80
|
-
|
|
79
|
+
}, Y = async () => {
|
|
80
|
+
if (N) {
|
|
81
|
+
K(null);
|
|
81
82
|
try {
|
|
82
|
-
await
|
|
83
|
-
name: `User Data Export - ${
|
|
83
|
+
await U({ variables: { input: {
|
|
84
|
+
name: `User Data Export - ${N.email}`,
|
|
84
85
|
entityTypes: [
|
|
85
86
|
"user_profile",
|
|
86
87
|
"user_sessions",
|
|
@@ -91,11 +92,11 @@ function _() {
|
|
|
91
92
|
includeMetadata: !0
|
|
92
93
|
} } });
|
|
93
94
|
} catch (e) {
|
|
94
|
-
|
|
95
|
+
K(e instanceof Error ? e.message : "Failed to start export");
|
|
95
96
|
}
|
|
96
97
|
}
|
|
97
98
|
};
|
|
98
|
-
return
|
|
99
|
+
return T ? k || F ? /* @__PURE__ */ p("div", {
|
|
99
100
|
className: "max-w-4xl mx-auto p-6",
|
|
100
101
|
children: /* @__PURE__ */ m("div", {
|
|
101
102
|
className: "text-center py-16",
|
|
@@ -106,14 +107,14 @@ function _() {
|
|
|
106
107
|
"aria-hidden": "true"
|
|
107
108
|
}), /* @__PURE__ */ p("p", {
|
|
108
109
|
className: "mt-4 text-text-secondary",
|
|
109
|
-
children:
|
|
110
|
+
children: w("auth.userDetails.loading", "Loading user...")
|
|
110
111
|
})]
|
|
111
112
|
})
|
|
112
|
-
}) :
|
|
113
|
+
}) : D ? L || !N ? /* @__PURE__ */ m("div", {
|
|
113
114
|
className: "max-w-4xl mx-auto p-6",
|
|
114
115
|
children: [/* @__PURE__ */ m("button", {
|
|
115
116
|
type: "button",
|
|
116
|
-
onClick: () =>
|
|
117
|
+
onClick: () => S("/auth/users"),
|
|
117
118
|
className: "mb-6 flex items-center gap-2 text-text-link hover:underline font-medium",
|
|
118
119
|
children: [/* @__PURE__ */ p("svg", {
|
|
119
120
|
className: "size-4",
|
|
@@ -127,39 +128,36 @@ function _() {
|
|
|
127
128
|
strokeWidth: 2,
|
|
128
129
|
d: "M10 19l-7-7m0 0l7-7m-7 7h18"
|
|
129
130
|
})
|
|
130
|
-
}),
|
|
131
|
-
}), /* @__PURE__ */
|
|
131
|
+
}), w("auth.userDetails.backToUsers", "Back to Users")]
|
|
132
|
+
}), /* @__PURE__ */ p("div", {
|
|
132
133
|
role: "alert",
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
"
|
|
137
|
-
})
|
|
138
|
-
className: "text-sm text-status-error-text",
|
|
139
|
-
children: N ?? b("auth.userDetails.userNotFound", "User not found")
|
|
140
|
-
})]
|
|
134
|
+
children: /* @__PURE__ */ p(g, {
|
|
135
|
+
illustration: "empty-search",
|
|
136
|
+
title: w("auth.userDetails.userNotFound", "User not found"),
|
|
137
|
+
description: L ?? w("auth.userDetails.userNotFoundDesc", "We couldn't find this user. They may have been removed, or the link is out of date.")
|
|
138
|
+
})
|
|
141
139
|
})]
|
|
142
140
|
}) : /* @__PURE__ */ m("div", {
|
|
143
141
|
className: "max-w-4xl mx-auto p-6",
|
|
144
142
|
children: [
|
|
145
143
|
/* @__PURE__ */ p(o, {
|
|
146
|
-
open:
|
|
144
|
+
open: V !== null,
|
|
147
145
|
onOpenChange: (e) => {
|
|
148
|
-
e ||
|
|
146
|
+
e || H(null);
|
|
149
147
|
},
|
|
150
|
-
title:
|
|
151
|
-
description:
|
|
152
|
-
confirmText:
|
|
153
|
-
variant:
|
|
148
|
+
title: V === "hard-delete" ? w("auth.userDetails.hardDeleteTitle", "Permanently delete user?") : w("auth.userDetails.deactivateTitle", "Deactivate user?"),
|
|
149
|
+
description: V === "hard-delete" ? w("auth.userDetails.hardDeleteDesc", "This permanently deletes \"{email}\" and cannot be undone.").replace("{email}", N.email) : w("auth.userDetails.deactivateDesc", "\"{email}\" will be prevented from signing in until reactivated.").replace("{email}", N.email),
|
|
150
|
+
confirmText: V === "hard-delete" ? w("auth.userDetails.hardDeleteConfirm", "Delete permanently") : w("auth.userDetails.deactivateConfirm", "Deactivate user"),
|
|
151
|
+
variant: V === "hard-delete" ? "danger" : "warning",
|
|
154
152
|
onConfirm: async () => {
|
|
155
|
-
|
|
153
|
+
V === "hard-delete" ? await J() : V === "deactivate" && await q();
|
|
156
154
|
}
|
|
157
155
|
}),
|
|
158
156
|
/* @__PURE__ */ m("div", {
|
|
159
157
|
className: "flex items-center justify-between mb-6",
|
|
160
158
|
children: [/* @__PURE__ */ m("button", {
|
|
161
159
|
type: "button",
|
|
162
|
-
onClick: () =>
|
|
160
|
+
onClick: () => S("/auth/users"),
|
|
163
161
|
className: "flex items-center gap-2 text-text-link hover:underline font-medium",
|
|
164
162
|
children: [/* @__PURE__ */ p("svg", {
|
|
165
163
|
className: "size-4",
|
|
@@ -173,17 +171,17 @@ function _() {
|
|
|
173
171
|
strokeWidth: 2,
|
|
174
172
|
d: "M10 19l-7-7m0 0l7-7m-7 7h18"
|
|
175
173
|
})
|
|
176
|
-
}),
|
|
174
|
+
}), w("auth.userDetails.backToUsers", "Back to Users")]
|
|
177
175
|
}), /* @__PURE__ */ p("button", {
|
|
178
176
|
type: "button",
|
|
179
|
-
onClick: () => void
|
|
180
|
-
disabled:
|
|
181
|
-
"aria-label":
|
|
177
|
+
onClick: () => void Y(),
|
|
178
|
+
disabled: W,
|
|
179
|
+
"aria-label": w("auth.userDetails.exportAriaLabel", "Export user data"),
|
|
182
180
|
className: "flex items-center gap-2 px-4 py-2.5 rounded-xl border border-border-default text-text-primary bg-bg-surface hover:bg-bg-sunken disabled:opacity-50 disabled:cursor-not-allowed transition-colors font-medium",
|
|
183
|
-
children:
|
|
181
|
+
children: W ? /* @__PURE__ */ m(f, { children: [/* @__PURE__ */ p(n, {
|
|
184
182
|
className: "size-4 animate-spin",
|
|
185
183
|
"aria-hidden": "true"
|
|
186
|
-
}),
|
|
184
|
+
}), w("auth.userDetails.exporting", "Exporting...")] }) : /* @__PURE__ */ m(f, { children: [/* @__PURE__ */ p("svg", {
|
|
187
185
|
className: "size-4",
|
|
188
186
|
fill: "none",
|
|
189
187
|
viewBox: "0 0 24 24",
|
|
@@ -195,10 +193,14 @@ function _() {
|
|
|
195
193
|
strokeWidth: 2,
|
|
196
194
|
d: "M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4"
|
|
197
195
|
})
|
|
198
|
-
}),
|
|
196
|
+
}), w("auth.userDetails.exportButton", "Export User Data")] })
|
|
199
197
|
})]
|
|
200
198
|
}),
|
|
201
|
-
|
|
199
|
+
/* @__PURE__ */ p(v, {
|
|
200
|
+
className: "mb-6",
|
|
201
|
+
children: w("auth.userDetails.purpose", "The full record for this person — their role, status, verification, and activity. From here you can export their data, deactivate them, or (for super admins) permanently delete a removed account.")
|
|
202
|
+
}),
|
|
203
|
+
G && /* @__PURE__ */ m("div", {
|
|
202
204
|
role: "alert",
|
|
203
205
|
className: "mb-6 flex items-start gap-3 p-4 rounded-xl bg-status-error-bg-subtle border border-status-error-border",
|
|
204
206
|
children: [/* @__PURE__ */ p(t, {
|
|
@@ -206,51 +208,54 @@ function _() {
|
|
|
206
208
|
"aria-hidden": "true"
|
|
207
209
|
}), /* @__PURE__ */ p("p", {
|
|
208
210
|
className: "text-sm text-status-error-text",
|
|
209
|
-
children:
|
|
211
|
+
children: G
|
|
210
212
|
})]
|
|
211
213
|
}),
|
|
212
|
-
|
|
214
|
+
z && /* @__PURE__ */ m("div", {
|
|
213
215
|
className: "mb-6 p-4 rounded-xl bg-status-success-bg-subtle border border-status-success-border",
|
|
214
216
|
children: [/* @__PURE__ */ p("p", {
|
|
215
217
|
className: "text-status-success-text",
|
|
216
|
-
children:
|
|
218
|
+
children: z
|
|
217
219
|
}), /* @__PURE__ */ p("button", {
|
|
218
220
|
type: "button",
|
|
219
|
-
onClick: () =>
|
|
221
|
+
onClick: () => B(null),
|
|
220
222
|
className: "mt-2 text-sm text-status-success-text hover:underline",
|
|
221
|
-
children:
|
|
223
|
+
children: w("auth.userDetails.dismiss", "Dismiss")
|
|
222
224
|
})]
|
|
223
225
|
}),
|
|
224
226
|
/* @__PURE__ */ m("div", {
|
|
225
227
|
className: "p-6 rounded-xl border border-border-subtle bg-bg-surface shadow-sm",
|
|
226
228
|
children: [
|
|
227
|
-
/* @__PURE__ */
|
|
228
|
-
className: "
|
|
229
|
-
children:
|
|
230
|
-
className: "
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
className:
|
|
247
|
-
children:
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
229
|
+
/* @__PURE__ */ p(h, {
|
|
230
|
+
className: "mb-8",
|
|
231
|
+
children: /* @__PURE__ */ m("div", {
|
|
232
|
+
className: "flex items-center gap-4",
|
|
233
|
+
children: [/* @__PURE__ */ p("div", {
|
|
234
|
+
className: "auth-brand-badge flex size-20 items-center justify-center rounded-full text-3xl font-semibold",
|
|
235
|
+
"aria-hidden": "true",
|
|
236
|
+
children: (N.name || N.username || N.email).charAt(0).toUpperCase()
|
|
237
|
+
}), /* @__PURE__ */ m("div", { children: [
|
|
238
|
+
/* @__PURE__ */ p("h1", {
|
|
239
|
+
className: "text-2xl font-semibold text-text-primary",
|
|
240
|
+
children: N.name || N.username
|
|
241
|
+
}),
|
|
242
|
+
/* @__PURE__ */ p("p", {
|
|
243
|
+
className: "text-text-secondary",
|
|
244
|
+
"data-testid": "user-email",
|
|
245
|
+
children: N.email
|
|
246
|
+
}),
|
|
247
|
+
/* @__PURE__ */ m("div", {
|
|
248
|
+
className: "flex items-center gap-2 mt-2",
|
|
249
|
+
children: [/* @__PURE__ */ p("span", {
|
|
250
|
+
className: `px-2.5 py-1 rounded-full text-xs font-medium ${y(N.role)}`,
|
|
251
|
+
children: N.role.replace("_", " ")
|
|
252
|
+
}), /* @__PURE__ */ p("span", {
|
|
253
|
+
className: `px-2.5 py-1 rounded-full text-xs font-medium ${b(N.status)}`,
|
|
254
|
+
children: N.status
|
|
255
|
+
})]
|
|
256
|
+
})
|
|
257
|
+
] })]
|
|
258
|
+
})
|
|
254
259
|
}),
|
|
255
260
|
/* @__PURE__ */ m("dl", {
|
|
256
261
|
className: "grid grid-cols-2 gap-6",
|
|
@@ -259,35 +264,35 @@ function _() {
|
|
|
259
264
|
className: "p-4 rounded-lg bg-bg-canvas/50",
|
|
260
265
|
children: [/* @__PURE__ */ p("dt", {
|
|
261
266
|
className: "text-sm font-medium text-text-secondary mb-1",
|
|
262
|
-
children:
|
|
267
|
+
children: w("auth.userDetails.username", "Username")
|
|
263
268
|
}), /* @__PURE__ */ p("dd", {
|
|
264
269
|
className: "text-text-primary font-medium",
|
|
265
|
-
children:
|
|
270
|
+
children: N.username
|
|
266
271
|
})]
|
|
267
272
|
}),
|
|
268
273
|
/* @__PURE__ */ m("div", {
|
|
269
274
|
className: "p-4 rounded-lg bg-bg-canvas/50",
|
|
270
275
|
children: [/* @__PURE__ */ p("dt", {
|
|
271
276
|
className: "text-sm font-medium text-text-secondary mb-1",
|
|
272
|
-
children:
|
|
277
|
+
children: w("auth.userDetails.email", "Email")
|
|
273
278
|
}), /* @__PURE__ */ p("dd", {
|
|
274
279
|
className: "text-text-primary font-medium",
|
|
275
|
-
children:
|
|
280
|
+
children: N.email
|
|
276
281
|
})]
|
|
277
282
|
}),
|
|
278
283
|
/* @__PURE__ */ m("div", {
|
|
279
284
|
className: "p-4 rounded-lg bg-bg-canvas/50",
|
|
280
285
|
children: [/* @__PURE__ */ p("dt", {
|
|
281
286
|
className: "text-sm font-medium text-text-secondary mb-1",
|
|
282
|
-
children:
|
|
287
|
+
children: w("auth.userDetails.emailVerified", "Email Verified")
|
|
283
288
|
}), /* @__PURE__ */ p("dd", {
|
|
284
289
|
className: "text-text-primary font-medium",
|
|
285
|
-
children:
|
|
290
|
+
children: N.emailVerified ? /* @__PURE__ */ p("span", {
|
|
286
291
|
className: "text-status-success-text",
|
|
287
|
-
children:
|
|
292
|
+
children: w("auth.userDetails.yes", "Yes")
|
|
288
293
|
}) : /* @__PURE__ */ p("span", {
|
|
289
294
|
className: "text-status-warning-text",
|
|
290
|
-
children:
|
|
295
|
+
children: w("auth.userDetails.no", "No")
|
|
291
296
|
})
|
|
292
297
|
})]
|
|
293
298
|
}),
|
|
@@ -295,104 +300,109 @@ function _() {
|
|
|
295
300
|
className: "p-4 rounded-lg bg-bg-canvas/50",
|
|
296
301
|
children: [/* @__PURE__ */ p("dt", {
|
|
297
302
|
className: "text-sm font-medium text-text-secondary mb-1",
|
|
298
|
-
children:
|
|
303
|
+
children: w("auth.userDetails.mfaEnabled", "MFA Enabled")
|
|
299
304
|
}), /* @__PURE__ */ p("dd", {
|
|
300
305
|
className: "text-text-primary font-medium",
|
|
301
|
-
children:
|
|
306
|
+
children: N.mfaEnabled ? /* @__PURE__ */ p("span", {
|
|
302
307
|
className: "text-status-success-text",
|
|
303
|
-
children:
|
|
308
|
+
children: w("auth.userDetails.yes", "Yes")
|
|
304
309
|
}) : /* @__PURE__ */ p("span", {
|
|
305
310
|
className: "text-text-secondary",
|
|
306
|
-
children:
|
|
311
|
+
children: w("auth.userDetails.no", "No")
|
|
307
312
|
})
|
|
308
313
|
})]
|
|
309
314
|
}),
|
|
310
|
-
|
|
315
|
+
N.phoneNumber && /* @__PURE__ */ m("div", {
|
|
311
316
|
className: "p-4 rounded-lg bg-bg-canvas/50",
|
|
312
317
|
children: [/* @__PURE__ */ p("dt", {
|
|
313
318
|
className: "text-sm font-medium text-text-secondary mb-1",
|
|
314
|
-
children:
|
|
319
|
+
children: w("auth.userDetails.phoneNumber", "Phone Number")
|
|
315
320
|
}), /* @__PURE__ */ p("dd", {
|
|
316
321
|
className: "text-text-primary font-medium",
|
|
317
|
-
children:
|
|
322
|
+
children: N.phoneNumber
|
|
318
323
|
})]
|
|
319
324
|
}),
|
|
320
325
|
/* @__PURE__ */ m("div", {
|
|
321
326
|
className: "p-4 rounded-lg bg-bg-canvas/50",
|
|
322
327
|
children: [/* @__PURE__ */ p("dt", {
|
|
323
328
|
className: "text-sm font-medium text-text-secondary mb-1",
|
|
324
|
-
children:
|
|
329
|
+
children: w("auth.userDetails.lastLogin", "Last Login")
|
|
325
330
|
}), /* @__PURE__ */ p("dd", {
|
|
326
331
|
className: "text-text-primary font-medium",
|
|
327
|
-
children:
|
|
332
|
+
children: N.lastLoginAt ? new Date(N.lastLoginAt).toLocaleString() : w("auth.userDetails.never", "Never")
|
|
328
333
|
})]
|
|
329
334
|
}),
|
|
330
335
|
/* @__PURE__ */ m("div", {
|
|
331
336
|
className: "p-4 rounded-lg bg-bg-canvas/50",
|
|
332
337
|
children: [/* @__PURE__ */ p("dt", {
|
|
333
338
|
className: "text-sm font-medium text-text-secondary mb-1",
|
|
334
|
-
children:
|
|
339
|
+
children: w("auth.userDetails.created", "Created")
|
|
335
340
|
}), /* @__PURE__ */ p("dd", {
|
|
336
341
|
className: "text-text-primary font-medium",
|
|
337
|
-
children: new Date(
|
|
342
|
+
children: new Date(N.createdAt).toLocaleString()
|
|
338
343
|
})]
|
|
339
344
|
}),
|
|
340
345
|
/* @__PURE__ */ m("div", {
|
|
341
346
|
className: "p-4 rounded-lg bg-bg-canvas/50",
|
|
342
347
|
children: [/* @__PURE__ */ p("dt", {
|
|
343
348
|
className: "text-sm font-medium text-text-secondary mb-1",
|
|
344
|
-
children:
|
|
349
|
+
children: w("auth.userDetails.lastUpdated", "Last Updated")
|
|
345
350
|
}), /* @__PURE__ */ p("dd", {
|
|
346
351
|
className: "text-text-primary font-medium",
|
|
347
|
-
children: new Date(
|
|
352
|
+
children: new Date(N.updatedAt).toLocaleString()
|
|
348
353
|
})]
|
|
349
354
|
})
|
|
350
355
|
]
|
|
351
356
|
}),
|
|
352
357
|
/* @__PURE__ */ m("div", {
|
|
353
358
|
className: "mt-8 pt-6 border-t border-border-subtle flex gap-3",
|
|
354
|
-
children: [
|
|
359
|
+
children: [N.status !== "DELETED" && O && /* @__PURE__ */ p("button", {
|
|
355
360
|
type: "button",
|
|
356
|
-
onClick: () =>
|
|
361
|
+
onClick: () => H("deactivate"),
|
|
357
362
|
className: "px-4 py-2.5 rounded-xl border border-status-error-border text-status-error-text font-medium hover:bg-status-error-bg-subtle transition-colors",
|
|
358
|
-
children:
|
|
359
|
-
}),
|
|
363
|
+
children: w("auth.userDetails.deactivateUser", "Deactivate User")
|
|
364
|
+
}), O && N.status === "DELETED" && E?.role === "SUPER_ADMIN" && /* @__PURE__ */ p("button", {
|
|
360
365
|
type: "button",
|
|
361
|
-
onClick: () =>
|
|
366
|
+
onClick: () => H("hard-delete"),
|
|
362
367
|
className: "px-4 py-2.5 rounded-xl bg-status-error-bg text-white font-medium hover:bg-status-error-bg-hover transition-colors",
|
|
363
|
-
children:
|
|
368
|
+
children: w("auth.userDetails.permanentlyDelete", "Permanently Delete")
|
|
364
369
|
})]
|
|
370
|
+
}),
|
|
371
|
+
/* @__PURE__ */ p(_, {
|
|
372
|
+
className: "mt-8",
|
|
373
|
+
storageKey: "auth-user-details",
|
|
374
|
+
steps: [{
|
|
375
|
+
id: "back-to-users",
|
|
376
|
+
label: w("auth.userDetails.nextBack", "Return to the user list"),
|
|
377
|
+
description: w("auth.userDetails.nextBackDesc", "Browse or search everyone in your organization."),
|
|
378
|
+
onClick: () => S("/auth/users")
|
|
379
|
+
}, {
|
|
380
|
+
id: "export-user",
|
|
381
|
+
label: w("auth.userDetails.nextExport", "Export this user's data"),
|
|
382
|
+
description: w("auth.userDetails.nextExportDesc", "Download their profile, sessions, and audit history as CSV."),
|
|
383
|
+
onClick: () => void Y()
|
|
384
|
+
}]
|
|
365
385
|
})
|
|
366
386
|
]
|
|
367
387
|
})
|
|
368
388
|
]
|
|
369
389
|
}) : /* @__PURE__ */ p("div", {
|
|
370
390
|
className: "max-w-4xl mx-auto p-6",
|
|
371
|
-
children: /* @__PURE__ */
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
children: b("auth.userDetails.adminRequired", "Admin Access Required")
|
|
376
|
-
}), /* @__PURE__ */ p("p", {
|
|
377
|
-
className: "text-text-secondary",
|
|
378
|
-
children: b("auth.userDetails.adminRequiredDesc", "You need administrator privileges to view user details.")
|
|
379
|
-
})]
|
|
391
|
+
children: /* @__PURE__ */ p(g, {
|
|
392
|
+
illustration: "empty-generic",
|
|
393
|
+
title: w("auth.userDetails.adminRequired", "Admin Access Required"),
|
|
394
|
+
description: w("auth.userDetails.adminRequiredDesc", "You need administrator privileges to view user details.")
|
|
380
395
|
})
|
|
381
396
|
}) : /* @__PURE__ */ p("div", {
|
|
382
397
|
className: "max-w-4xl mx-auto p-6",
|
|
383
|
-
children: /* @__PURE__ */
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
children: b("auth.userDetails.authRequired", "Authentication Required")
|
|
388
|
-
}), /* @__PURE__ */ p("p", {
|
|
389
|
-
className: "text-text-secondary",
|
|
390
|
-
children: b("auth.userDetails.signInToView", "Please sign in to view user details")
|
|
391
|
-
})]
|
|
398
|
+
children: /* @__PURE__ */ p(g, {
|
|
399
|
+
illustration: "empty-generic",
|
|
400
|
+
title: w("auth.userDetails.authRequired", "Authentication Required"),
|
|
401
|
+
description: w("auth.userDetails.signInToView", "Please sign in to view user details")
|
|
392
402
|
})
|
|
393
403
|
});
|
|
394
404
|
}
|
|
395
405
|
//#endregion
|
|
396
|
-
export {
|
|
406
|
+
export { x as UserDetailsPage };
|
|
397
407
|
|
|
398
408
|
//# sourceMappingURL=UserDetailsPage.js.map
|