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