@better-forge/ui 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +13 -3
- package/dist/api/client.d.ts +42 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +130 -0
- package/dist/api/client.js.map +1 -0
- package/dist/components/ConfirmIdentityModal.d.ts +18 -0
- package/dist/components/ConfirmIdentityModal.d.ts.map +1 -0
- package/dist/components/ConfirmIdentityModal.js +30 -0
- package/dist/components/ConfirmIdentityModal.js.map +1 -0
- package/dist/components/ConfirmModal.d.ts +18 -0
- package/dist/components/ConfirmModal.d.ts.map +1 -0
- package/dist/components/ConfirmModal.js +11 -0
- package/dist/components/ConfirmModal.js.map +1 -0
- package/dist/components/CopyButton.d.ts +11 -0
- package/dist/components/CopyButton.d.ts.map +1 -0
- package/dist/components/CopyButton.js +44 -0
- package/dist/components/CopyButton.js.map +1 -0
- package/dist/components/CredentialSection.d.ts +38 -0
- package/dist/components/CredentialSection.d.ts.map +1 -0
- package/dist/components/CredentialSection.js +69 -0
- package/dist/components/CredentialSection.js.map +1 -0
- package/dist/components/ErrorBoundary.d.ts +18 -0
- package/dist/components/ErrorBoundary.d.ts.map +1 -0
- package/dist/components/ErrorBoundary.js +25 -0
- package/dist/components/ErrorBoundary.js.map +1 -0
- package/dist/components/ModalShell.d.ts +58 -0
- package/dist/components/ModalShell.d.ts.map +1 -0
- package/dist/components/ModalShell.js +92 -0
- package/dist/components/ModalShell.js.map +1 -0
- package/dist/components/ResetTwoFactorModal.d.ts +14 -0
- package/dist/components/ResetTwoFactorModal.d.ts.map +1 -0
- package/dist/components/ResetTwoFactorModal.js +16 -0
- package/dist/components/ResetTwoFactorModal.js.map +1 -0
- package/dist/components/SidePanel.d.ts +35 -0
- package/dist/components/SidePanel.d.ts.map +1 -0
- package/dist/components/SidePanel.js +19 -0
- package/dist/components/SidePanel.js.map +1 -0
- package/dist/components/SingleSignOnModal.d.ts +4 -0
- package/dist/components/SingleSignOnModal.d.ts.map +1 -0
- package/dist/components/SingleSignOnModal.js +64 -0
- package/dist/components/SingleSignOnModal.js.map +1 -0
- package/dist/components/SsoConfirmation.d.ts +22 -0
- package/dist/components/SsoConfirmation.d.ts.map +1 -0
- package/dist/components/SsoConfirmation.js +87 -0
- package/dist/components/SsoConfirmation.js.map +1 -0
- package/dist/components/VaultTypePicker.d.ts +13 -0
- package/dist/components/VaultTypePicker.d.ts.map +1 -0
- package/dist/components/VaultTypePicker.js +62 -0
- package/dist/components/VaultTypePicker.js.map +1 -0
- package/dist/components/WhatsNew.d.ts +18 -0
- package/dist/components/WhatsNew.d.ts.map +1 -0
- package/dist/components/WhatsNew.js +50 -0
- package/dist/components/WhatsNew.js.map +1 -0
- package/dist/components/formParts.d.ts +40 -0
- package/dist/components/formParts.d.ts.map +1 -0
- package/dist/components/formParts.js +31 -0
- package/dist/components/formParts.js.map +1 -0
- package/dist/components/ui/Alert.d.ts +15 -0
- package/dist/components/ui/Alert.d.ts.map +1 -0
- package/dist/components/ui/Alert.js +14 -0
- package/dist/components/ui/Alert.js.map +1 -0
- package/dist/components/ui/DataTable.d.ts +52 -0
- package/dist/components/ui/DataTable.d.ts.map +1 -0
- package/dist/components/ui/DataTable.js +112 -0
- package/dist/components/ui/DataTable.js.map +1 -0
- package/dist/components/ui/Field.d.ts +27 -0
- package/dist/components/ui/Field.d.ts.map +1 -0
- package/dist/components/ui/Field.js +25 -0
- package/dist/components/ui/Field.js.map +1 -0
- package/dist/components/ui/PageHeader.d.ts +18 -0
- package/dist/components/ui/PageHeader.d.ts.map +1 -0
- package/dist/components/ui/PageHeader.js +10 -0
- package/dist/components/ui/PageHeader.js.map +1 -0
- package/dist/components/ui/Pagination.d.ts +21 -0
- package/dist/components/ui/Pagination.d.ts.map +1 -0
- package/dist/components/ui/Pagination.js +10 -0
- package/dist/components/ui/Pagination.js.map +1 -0
- package/dist/components/ui/QuickStartPanel.d.ts +21 -0
- package/dist/components/ui/QuickStartPanel.d.ts.map +1 -0
- package/dist/components/ui/QuickStartPanel.js +11 -0
- package/dist/components/ui/QuickStartPanel.js.map +1 -0
- package/dist/components/ui/StateViews.d.ts +50 -0
- package/dist/components/ui/StateViews.d.ts.map +1 -0
- package/dist/components/ui/StateViews.js +33 -0
- package/dist/components/ui/StateViews.js.map +1 -0
- package/dist/components/ui/Switch.d.ts +16 -0
- package/dist/components/ui/Switch.d.ts.map +1 -0
- package/dist/components/ui/Switch.js +15 -0
- package/dist/components/ui/Switch.js.map +1 -0
- package/dist/components/ui/Toast.d.ts +20 -0
- package/dist/components/ui/Toast.d.ts.map +1 -0
- package/dist/components/ui/Toast.js +46 -0
- package/dist/components/ui/Toast.js.map +1 -0
- package/dist/components/ui/index.d.ts +10 -0
- package/dist/components/ui/index.d.ts.map +1 -0
- package/dist/components/ui/index.js +10 -0
- package/dist/components/ui/index.js.map +1 -0
- package/dist/config.d.ts +46 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +12 -0
- package/dist/config.js.map +1 -0
- package/dist/hooks/useDarkMode.d.ts +2 -0
- package/dist/hooks/useDarkMode.d.ts.map +1 -0
- package/dist/hooks/useDarkMode.js +37 -0
- package/dist/hooks/useDarkMode.js.map +1 -0
- package/dist/hooks/useDebouncedValue.d.ts +6 -0
- package/dist/hooks/useDebouncedValue.d.ts.map +1 -0
- package/dist/hooks/useDebouncedValue.js +19 -0
- package/dist/hooks/useDebouncedValue.js.map +1 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/changelog.d.ts +32 -0
- package/dist/lib/changelog.d.ts.map +1 -0
- package/dist/lib/changelog.js +71 -0
- package/dist/lib/changelog.js.map +1 -0
- package/dist/lib/dateFormat.d.ts +24 -0
- package/dist/lib/dateFormat.d.ts.map +1 -0
- package/dist/lib/dateFormat.js +67 -0
- package/dist/lib/dateFormat.js.map +1 -0
- package/dist/navigation.d.ts +5 -0
- package/dist/navigation.d.ts.map +1 -0
- package/dist/navigation.js +7 -0
- package/dist/navigation.js.map +1 -0
- package/dist/pages/ApiTokens.d.ts +9 -0
- package/dist/pages/ApiTokens.d.ts.map +1 -0
- package/dist/pages/ApiTokens.js +116 -0
- package/dist/pages/ApiTokens.js.map +1 -0
- package/dist/pages/AuditLog.d.ts +14 -0
- package/dist/pages/AuditLog.d.ts.map +1 -0
- package/dist/pages/AuditLog.js +104 -0
- package/dist/pages/AuditLog.js.map +1 -0
- package/dist/pages/Backups.d.ts +2 -0
- package/dist/pages/Backups.d.ts.map +1 -0
- package/dist/pages/Backups.js +118 -0
- package/dist/pages/Backups.js.map +1 -0
- package/dist/pages/ChangePassword.d.ts +2 -0
- package/dist/pages/ChangePassword.d.ts.map +1 -0
- package/dist/pages/ChangePassword.js +40 -0
- package/dist/pages/ChangePassword.js.map +1 -0
- package/dist/pages/Login.d.ts +12 -0
- package/dist/pages/Login.d.ts.map +1 -0
- package/dist/pages/Login.js +69 -0
- package/dist/pages/Login.js.map +1 -0
- package/dist/pages/Settings.d.ts +2 -0
- package/dist/pages/Settings.d.ts.map +1 -0
- package/dist/pages/Settings.js +149 -0
- package/dist/pages/Settings.js.map +1 -0
- package/dist/pages/Setup.d.ts +2 -0
- package/dist/pages/Setup.d.ts.map +1 -0
- package/dist/pages/Setup.js +113 -0
- package/dist/pages/Setup.js.map +1 -0
- package/dist/pages/SsoConfirm.d.ts +3 -0
- package/dist/pages/SsoConfirm.d.ts.map +1 -0
- package/dist/pages/SsoConfirm.js +20 -0
- package/dist/pages/SsoConfirm.js.map +1 -0
- package/dist/pages/SsoTestResult.d.ts +2 -0
- package/dist/pages/SsoTestResult.d.ts.map +1 -0
- package/dist/pages/SsoTestResult.js +49 -0
- package/dist/pages/SsoTestResult.js.map +1 -0
- package/dist/pages/Users.d.ts +22 -0
- package/dist/pages/Users.d.ts.map +1 -0
- package/dist/pages/Users.js +124 -0
- package/dist/pages/Users.js.map +1 -0
- package/dist/pages/Vault.d.ts +2 -0
- package/dist/pages/Vault.d.ts.map +1 -0
- package/dist/pages/Vault.js +372 -0
- package/dist/pages/Vault.js.map +1 -0
- package/dist/shell/AdminShell.d.ts +46 -0
- package/dist/shell/AdminShell.d.ts.map +1 -0
- package/dist/shell/AdminShell.js +76 -0
- package/dist/shell/AdminShell.js.map +1 -0
- package/dist/shell/guards.d.ts +28 -0
- package/dist/shell/guards.d.ts.map +1 -0
- package/dist/shell/guards.js +71 -0
- package/dist/shell/guards.js.map +1 -0
- package/icons.json +170 -0
- package/package.json +71 -6
- package/src/api/client.ts +139 -0
- package/src/components/ConfirmIdentityModal.tsx +82 -0
- package/src/components/ConfirmModal.tsx +83 -0
- package/src/components/CopyButton.tsx +71 -0
- package/src/components/CredentialSection.tsx +270 -0
- package/src/components/ErrorBoundary.tsx +47 -0
- package/src/components/ModalShell.tsx +160 -0
- package/src/components/ResetTwoFactorModal.tsx +74 -0
- package/src/components/SidePanel.tsx +96 -0
- package/src/components/SingleSignOnModal.tsx +161 -0
- package/src/components/SsoConfirmation.tsx +96 -0
- package/src/components/VaultTypePicker.tsx +131 -0
- package/src/components/WhatsNew.tsx +84 -0
- package/src/components/formParts.tsx +59 -0
- package/src/components/ui/Alert.tsx +45 -0
- package/src/components/ui/DataTable.tsx +225 -0
- package/src/components/ui/Field.tsx +63 -0
- package/src/components/ui/PageHeader.tsx +36 -0
- package/src/components/ui/Pagination.tsx +37 -0
- package/src/components/ui/QuickStartPanel.tsx +57 -0
- package/src/components/ui/StateViews.tsx +135 -0
- package/src/components/ui/Switch.tsx +65 -0
- package/src/components/ui/Toast.tsx +104 -0
- package/src/components/ui/index.ts +9 -0
- package/src/config.ts +46 -0
- package/src/hooks/useDarkMode.ts +38 -0
- package/src/hooks/useDebouncedValue.ts +22 -0
- package/src/index.ts +42 -0
- package/src/lib/changelog.ts +93 -0
- package/src/lib/dateFormat.ts +90 -0
- package/src/navigation.ts +6 -0
- package/src/pages/ApiTokens.tsx +361 -0
- package/src/pages/AuditLog.tsx +388 -0
- package/src/pages/Backups.tsx +170 -0
- package/src/pages/ChangePassword.tsx +84 -0
- package/src/pages/Login.tsx +275 -0
- package/src/pages/Settings.tsx +264 -0
- package/src/pages/Setup.tsx +438 -0
- package/src/pages/SsoConfirm.tsx +26 -0
- package/src/pages/SsoTestResult.tsx +104 -0
- package/src/pages/Users.tsx +426 -0
- package/src/pages/Vault.tsx +1036 -0
- package/src/shell/AdminShell.tsx +256 -0
- package/src/shell/guards.tsx +88 -0
- package/styles/base.css +521 -0
- package/styles/fonts/inter-latin-1.woff2 +0 -0
- package/styles/fonts/inter-latin-ext.woff2 +0 -0
- package/styles/fonts/jetbrains-mono-latin-3.woff2 +0 -0
- package/styles/fonts/jetbrains-mono-latin-ext-2.woff2 +0 -0
- package/styles/fonts/manrope-latin-5.woff2 +0 -0
- package/styles/fonts/manrope-latin-ext-4.woff2 +0 -0
- package/styles/fonts/material-symbols-outlined-fill.woff2 +0 -0
- package/styles/icons.css +4 -0
- package/tailwind-preset.js +79 -0
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useEffect } from 'react';
|
|
3
|
+
import { useNavigate } from 'react-router-dom';
|
|
4
|
+
import { api, isAuthenticated, setSession } from '../api/client';
|
|
5
|
+
import { uiConfig } from '../config';
|
|
6
|
+
import { useDarkMode } from '../hooks/useDarkMode';
|
|
7
|
+
import { Alert } from '../components/ui';
|
|
8
|
+
const STEPS = [
|
|
9
|
+
{ n: 1, label: 'Database' },
|
|
10
|
+
{ n: 2, label: 'Admin Account' },
|
|
11
|
+
{ n: 3, label: 'Done' },
|
|
12
|
+
];
|
|
13
|
+
const LABEL_CLASS = 'block text-xs font-sans font-semibold mb-1.5 uppercase tracking-wider';
|
|
14
|
+
export default function SetupPage() {
|
|
15
|
+
const navigate = useNavigate();
|
|
16
|
+
const [isDark, toggleDark] = useDarkMode();
|
|
17
|
+
const [step, setStep] = useState(1);
|
|
18
|
+
const [checking, setChecking] = useState(true);
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
fetch('/api/v1/setup/status')
|
|
21
|
+
.then((r) => r.json())
|
|
22
|
+
.then((data) => {
|
|
23
|
+
if (!data.needsSetup)
|
|
24
|
+
navigate(isAuthenticated() ? `${uiConfig().basePath}/` : `${uiConfig().basePath}/login`, { replace: true });
|
|
25
|
+
else
|
|
26
|
+
setChecking(false);
|
|
27
|
+
})
|
|
28
|
+
.catch(() => setChecking(false));
|
|
29
|
+
}, [navigate]);
|
|
30
|
+
// Step 2 fields
|
|
31
|
+
const [email, setEmail] = useState('');
|
|
32
|
+
const [password, setPassword] = useState('');
|
|
33
|
+
const [confirm, setConfirm] = useState('');
|
|
34
|
+
const [error, setError] = useState('');
|
|
35
|
+
const [loading, setLoading] = useState(false);
|
|
36
|
+
const [pgTooltip, setPgTooltip] = useState(false);
|
|
37
|
+
async function handleSubmit(e) {
|
|
38
|
+
e.preventDefault();
|
|
39
|
+
setError('');
|
|
40
|
+
if (password !== confirm) {
|
|
41
|
+
setError('Passwords do not match');
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
if (password.length < 8) {
|
|
45
|
+
setError('Password must be at least 8 characters');
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
setLoading(true);
|
|
49
|
+
try {
|
|
50
|
+
const res = await api.post('/setup/complete', { email, password });
|
|
51
|
+
setSession(res);
|
|
52
|
+
setStep(3);
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
setError(err instanceof Error ? err.message : 'Setup failed');
|
|
56
|
+
}
|
|
57
|
+
finally {
|
|
58
|
+
setLoading(false);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
if (checking)
|
|
62
|
+
return null;
|
|
63
|
+
return (_jsxs("div", { className: "min-h-screen flex", style: { background: 'var(--m3-surface)' }, children: [_jsxs("div", { className: "hidden lg:flex flex-col justify-between w-[400px] flex-shrink-0 p-12 relative overflow-hidden", style: {
|
|
64
|
+
background: 'var(--m3-surface-container-low)',
|
|
65
|
+
borderRight: '1px solid var(--m3-outline-variant)',
|
|
66
|
+
}, children: [_jsx("div", { className: "absolute -top-32 -left-32 w-80 h-80 rounded-full pointer-events-none", style: { background: 'radial-gradient(circle, color-mix(in srgb, var(--m3-primary) 12%, transparent) 0%, transparent 70%)' } }), _jsx("div", { className: "absolute bottom-0 right-0 w-96 h-96 rounded-full pointer-events-none", style: { background: 'radial-gradient(circle, color-mix(in srgb, var(--m3-primary) 6%, transparent) 0%, transparent 70%)' } }), _jsx("div", { className: "relative flex justify-center", children: _jsx("img", { src: isDark ? uiConfig().brand.logoDark : uiConfig().brand.logoLight, alt: uiConfig().brand.name, style: { height: '160px', objectFit: 'contain' } }) }), _jsxs("div", { className: "relative space-y-3", children: [_jsx("p", { className: "font-label text-xs uppercase tracking-widest", style: { color: 'var(--m3-secondary)' }, children: "First-time setup" }), _jsxs("h2", { className: "font-headline font-extrabold text-4xl leading-[1.1] tracking-tight", style: { color: 'var(--m3-on-surface)' }, children: ["Set up your", _jsx("br", {}), _jsx("span", { style: { color: 'var(--m3-primary)' }, children: "instance." })] }), _jsx("p", { className: "text-sm font-sans leading-relaxed", style: { color: 'var(--m3-secondary)' }, children: "Configure your database and create your administrator account to get started." })] }), _jsx("ol", { className: "relative flex flex-col gap-0", "aria-label": "Setup progress", children: STEPS.map((s, i) => {
|
|
67
|
+
const isDone = step > s.n;
|
|
68
|
+
const isActive = step === s.n;
|
|
69
|
+
const isPending = step < s.n;
|
|
70
|
+
return (_jsxs("li", { "aria-current": isActive ? 'step' : undefined, children: [_jsxs("div", { className: "flex items-center gap-4", children: [_jsx("div", { className: "w-8 h-8 rounded-full flex items-center justify-center flex-shrink-0 text-sm font-bold transition-all duration-300", style: {
|
|
71
|
+
background: isDone
|
|
72
|
+
? 'var(--m3-primary)'
|
|
73
|
+
: isActive
|
|
74
|
+
? 'var(--m3-primary)'
|
|
75
|
+
: 'transparent',
|
|
76
|
+
border: isPending
|
|
77
|
+
? '2px solid var(--m3-outline-variant)'
|
|
78
|
+
: '2px solid var(--m3-primary)',
|
|
79
|
+
color: isDone || isActive
|
|
80
|
+
? 'var(--m3-on-primary)'
|
|
81
|
+
: 'var(--m3-secondary)',
|
|
82
|
+
}, children: isDone ? (_jsx("svg", { width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", "aria-hidden": "true", children: _jsx("path", { d: "M2.5 7L5.5 10L11.5 4", stroke: "var(--m3-on-primary)", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }) })) : s.n }), _jsx("span", { className: "font-sans text-sm transition-all duration-300", style: {
|
|
83
|
+
fontWeight: isActive ? 700 : 400,
|
|
84
|
+
color: isActive
|
|
85
|
+
? 'var(--m3-on-surface)'
|
|
86
|
+
: isDone
|
|
87
|
+
? 'var(--m3-primary)'
|
|
88
|
+
: 'var(--m3-secondary)',
|
|
89
|
+
}, children: s.label })] }), i < STEPS.length - 1 && (_jsx("div", { className: "ml-4 w-px h-6 my-1", "aria-hidden": "true", style: { background: step > s.n ? 'var(--m3-primary)' : 'var(--m3-outline-variant)' } }))] }, s.n));
|
|
90
|
+
}) })] }), _jsxs("div", { className: "flex-1 relative flex items-center justify-center px-6 py-12", children: [_jsx("button", { type: "button", onClick: toggleDark, className: "btn-icon absolute top-5 right-5 w-9 h-9 rounded-full", "aria-label": "Toggle dark mode", children: _jsx("span", { className: "material-symbols-outlined", "aria-hidden": "true", children: isDark ? 'light_mode' : 'dark_mode' }) }), _jsxs("div", { className: "w-full max-w-md", children: [_jsx("div", { className: "flex items-center mb-10 lg:hidden", children: _jsx("img", { src: isDark ? uiConfig().brand.logoDark : uiConfig().brand.logoLight, alt: uiConfig().brand.name, style: { height: '32px', objectFit: 'contain' } }) }), step === 1 && (_jsxs("div", { children: [_jsxs("div", { className: "mb-8", children: [_jsx("p", { className: "font-label text-xs uppercase tracking-widest mb-1", style: { color: 'var(--m3-secondary)' }, children: "Step 1 of 3" }), _jsx("h1", { className: "font-headline font-bold text-2xl", style: { color: 'var(--m3-on-surface)' }, children: "Choose a database" }), _jsx("p", { className: "text-sm font-sans mt-1.5", style: { color: 'var(--m3-secondary)' }, children: "Select where your data will be stored." })] }), _jsxs("div", { className: "grid grid-cols-1 sm:grid-cols-2 gap-4 mb-8", children: [_jsxs("div", { className: "relative rounded-2xl p-5 cursor-pointer transition-all duration-200", style: {
|
|
91
|
+
background: 'var(--m3-surface-container-low)',
|
|
92
|
+
border: '2px solid var(--m3-primary)',
|
|
93
|
+
boxShadow: '0 0 0 4px color-mix(in srgb, var(--m3-primary) 12%, transparent)',
|
|
94
|
+
}, children: [_jsx("div", { className: "absolute top-3 right-3 w-5 h-5 rounded-full flex items-center justify-center", style: { background: 'var(--m3-primary)' }, children: _jsx("svg", { width: "11", height: "11", viewBox: "0 0 11 11", fill: "none", children: _jsx("path", { d: "M2 5.5L4.5 8L9 3", stroke: "var(--m3-on-primary)", strokeWidth: "1.8", strokeLinecap: "round", strokeLinejoin: "round" }) }) }), _jsx("div", { className: "mb-4", children: _jsxs("svg", { width: "36", height: "36", viewBox: "0 0 36 36", fill: "none", children: [_jsx("ellipse", { cx: "18", cy: "10", rx: "12", ry: "5", fill: "color-mix(in srgb, var(--m3-primary) 20%, transparent)", stroke: "var(--m3-primary)", strokeWidth: "1.5" }), _jsx("path", { d: "M6 10v8c0 2.76 5.37 5 12 5s12-2.24 12-5v-8", stroke: "var(--m3-primary)", strokeWidth: "1.5", fill: "none" }), _jsx("path", { d: "M6 18v8c0 2.76 5.37 5 12 5s12-2.24 12-5v-8", stroke: "var(--m3-primary)", strokeWidth: "1.5", fill: "none" }), _jsx("ellipse", { cx: "18", cy: "26", rx: "12", ry: "5", fill: "color-mix(in srgb, var(--m3-primary) 10%, transparent)" })] }) }), _jsx("h3", { className: "font-headline font-bold text-base mb-1", style: { color: 'var(--m3-on-surface)' }, children: "SQLite" }), _jsx("p", { className: "font-sans text-xs leading-relaxed", style: { color: 'var(--m3-secondary)' }, children: "Built-in \u00B7 No configuration needed" })] }), _jsxs("div", { className: "relative rounded-2xl p-5", style: {
|
|
95
|
+
background: 'var(--m3-surface-container-low)',
|
|
96
|
+
border: '2px solid var(--m3-outline-variant)',
|
|
97
|
+
opacity: 0.45,
|
|
98
|
+
cursor: 'not-allowed',
|
|
99
|
+
}, onMouseEnter: () => setPgTooltip(true), onMouseLeave: () => setPgTooltip(false), children: [_jsx("div", { className: "absolute top-3 right-3 px-2 py-0.5 rounded-full font-mono text-[10px] font-bold uppercase tracking-wider", style: { background: 'var(--m3-surface-container-highest)', color: 'var(--m3-secondary)' }, children: "Soon" }), _jsx("div", { className: "mb-4", children: _jsxs("svg", { width: "36", height: "36", viewBox: "0 0 36 36", fill: "none", children: [_jsx("ellipse", { cx: "18", cy: "10", rx: "12", ry: "5", fill: "color-mix(in srgb, var(--m3-secondary) 15%, transparent)", stroke: "var(--m3-secondary)", strokeWidth: "1.5" }), _jsx("path", { d: "M6 10v8c0 2.76 5.37 5 12 5s12-2.24 12-5v-8", stroke: "var(--m3-secondary)", strokeWidth: "1.5", fill: "none" }), _jsx("path", { d: "M6 18v8c0 2.76 5.37 5 12 5s12-2.24 12-5v-8", stroke: "var(--m3-secondary)", strokeWidth: "1.5", fill: "none" }), _jsx("ellipse", { cx: "18", cy: "26", rx: "12", ry: "5", fill: "color-mix(in srgb, var(--m3-secondary) 8%, transparent)" })] }) }), _jsx("h3", { className: "font-headline font-bold text-base mb-1", style: { color: 'var(--m3-on-surface)' }, children: "PostgreSQL" }), _jsx("p", { className: "font-sans text-xs leading-relaxed", style: { color: 'var(--m3-secondary)' }, children: "External database" }), pgTooltip && (_jsxs("div", { className: "absolute -top-9 left-1/2 -translate-x-1/2 px-3 py-1.5 rounded-lg text-xs font-sans font-medium whitespace-nowrap pointer-events-none z-10", style: {
|
|
100
|
+
background: 'var(--m3-on-surface)',
|
|
101
|
+
color: 'var(--m3-surface)',
|
|
102
|
+
opacity: 1,
|
|
103
|
+
boxShadow: '0 4px 12px rgba(0,0,0,0.15)',
|
|
104
|
+
}, children: ["Coming soon", _jsx("div", { className: "absolute top-full left-1/2 -translate-x-1/2 w-0 h-0", style: { borderLeft: '5px solid transparent', borderRight: '5px solid transparent', borderTop: '5px solid var(--m3-on-surface)' } })] }))] })] }), _jsx("button", { type: "button", onClick: () => setStep(2), className: "btn btn-primary w-full py-3", children: "Continue" })] })), step === 2 && (_jsxs("div", { children: [_jsxs("div", { className: "mb-8", children: [_jsxs("button", { type: "button", onClick: () => { setError(''); setStep(1); }, className: "btn btn-ghost btn-sm -ml-3 mb-4", children: [_jsx("svg", { width: "14", height: "14", viewBox: "0 0 14 14", fill: "none", "aria-hidden": "true", children: _jsx("path", { d: "M9 2L4 7l5 5", stroke: "currentColor", strokeWidth: "1.8", strokeLinecap: "round", strokeLinejoin: "round" }) }), "Back"] }), _jsx("p", { className: "font-label text-xs uppercase tracking-widest mb-1", style: { color: 'var(--m3-secondary)' }, children: "Step 2 of 3" }), _jsx("h1", { className: "font-headline font-bold text-2xl", style: { color: 'var(--m3-on-surface)' }, children: "Create admin account" }), _jsx("p", { className: "text-sm font-sans mt-1.5", style: { color: 'var(--m3-secondary)' }, children: "This will be the primary administrator of your instance." })] }), _jsxs("form", { onSubmit: handleSubmit, className: "space-y-4", children: [error && _jsx(Alert, { tone: "error", children: error }), _jsxs("div", { children: [_jsx("label", { htmlFor: "setup-email", className: LABEL_CLASS, style: { color: 'var(--m3-secondary)' }, children: "Email" }), _jsx("input", { id: "setup-email", type: "email", autoComplete: "username", value: email, onChange: (e) => setEmail(e.target.value), required: true, className: "input-m3", placeholder: "admin@example.com", autoFocus: true })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: "setup-password", className: LABEL_CLASS, style: { color: 'var(--m3-secondary)' }, children: "Password" }), _jsx("input", { id: "setup-password", type: "password", autoComplete: "new-password", value: password, onChange: (e) => setPassword(e.target.value), required: true, className: "input-m3", placeholder: "Min. 8 characters" })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: "setup-confirm-password", className: LABEL_CLASS, style: { color: 'var(--m3-secondary)' }, children: "Confirm Password" }), _jsx("input", { id: "setup-confirm-password", type: "password", autoComplete: "new-password", value: confirm, onChange: (e) => setConfirm(e.target.value), required: true, className: "input-m3", placeholder: "Repeat password" })] }), _jsx("button", { type: "submit", disabled: loading, className: "btn btn-primary w-full py-3 mt-2", children: loading ? 'Creating account…' : 'Create Account' })] })] })), step === 3 && (_jsxs("div", { className: "text-center", children: [_jsx("div", { className: "flex justify-center mb-8", children: _jsx("div", { className: "w-20 h-20 rounded-full flex items-center justify-center", style: {
|
|
105
|
+
background: 'color-mix(in srgb, var(--m3-primary) 12%, transparent)',
|
|
106
|
+
border: '2px solid color-mix(in srgb, var(--m3-primary) 40%, transparent)',
|
|
107
|
+
}, children: _jsx("svg", { width: "36", height: "36", viewBox: "0 0 36 36", fill: "none", "aria-hidden": "true", children: _jsx("path", { d: "M8 18L15 25L28 11", stroke: "var(--m3-primary)", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round" }) }) }) }), _jsx("p", { className: "font-label text-xs uppercase tracking-widest mb-1", style: { color: 'var(--m3-secondary)' }, children: "Step 3 of 3" }), _jsx("h1", { className: "font-headline font-bold text-2xl mb-3", style: { color: 'var(--m3-on-surface)' }, children: "You're all set." }), _jsxs("p", { className: "font-sans text-sm leading-relaxed mb-2", style: { color: 'var(--m3-secondary)' }, children: ["Your ", uiConfig().brand.name, " instance is ready."] }), _jsx("p", { className: "font-mono text-xs mb-10", style: { color: 'var(--m3-secondary)' }, children: email }), _jsx("div", { className: "rounded-2xl p-5 mb-8 text-left space-y-3", style: { background: 'var(--m3-surface-container-low)', border: '1px solid var(--m3-outline-variant)' }, children: [
|
|
108
|
+
{ icon: 'M6 10v8c0 2.76 5.37 5 12 5s12-2.24 12-5v-8', label: 'Database', value: 'SQLite' },
|
|
109
|
+
{ icon: 'M18 4a7 7 0 100 14A7 7 0 0018 4zm-2 18h4m-2-4v4', label: 'Admin account', value: email },
|
|
110
|
+
{ icon: 'M12 2L2 7l10 5 10-5-10-5zM2 17l10 5 10-5M2 12l10 5 10-5', label: 'Role', value: 'Administrator' },
|
|
111
|
+
].map((row) => (_jsxs("div", { className: "flex items-center justify-between gap-4", children: [_jsx("span", { className: "font-sans text-xs font-semibold uppercase tracking-wider", style: { color: 'var(--m3-secondary)' }, children: row.label }), _jsx("span", { className: "font-mono text-xs", style: { color: 'var(--m3-on-surface)' }, children: row.value })] }, row.label))) }), _jsx("button", { type: "button", onClick: () => navigate(`${uiConfig().basePath}/`), className: "btn btn-primary w-full py-3", children: "Go to Dashboard" })] }))] })] })] }));
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=Setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Setup.js","sourceRoot":"","sources":["../../src/pages/Setup.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,GAAG,EAAE,eAAe,EAAE,UAAU,EAAiB,MAAM,eAAe,CAAA;AAC/E,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAExC,MAAM,KAAK,GAAG;IACZ,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE;IAC3B,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE;IAChC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE;CACxB,CAAA;AAED,MAAM,WAAW,GAAG,uEAAuE,CAAA;AAE3F,MAAM,CAAC,OAAO,UAAU,SAAS;IAC/B,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAA;IAC9B,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,WAAW,EAAE,CAAA;IAC1C,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAY,CAAC,CAAC,CAAA;IAC9C,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;IAE9C,SAAS,CAAC,GAAG,EAAE;QACb,KAAK,CAAC,sBAAsB,CAAC;aAC1B,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACrB,IAAI,CAAC,CAAC,IAA6B,EAAE,EAAE;YACtC,IAAI,CAAC,IAAI,CAAC,UAAU;gBAAE,QAAQ,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,GAAG,QAAQ,EAAE,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,EAAE,CAAC,QAAQ,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;;gBAC5H,WAAW,CAAC,KAAK,CAAC,CAAA;QACzB,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAA;IACpC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAA;IAEd,gBAAgB;IAChB,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAW,QAAQ,CAAC,EAAE,CAAC,CAAA;IAC9C,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAO,QAAQ,CAAC,EAAE,CAAC,CAAA;IAChD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAS,QAAQ,CAAC,EAAE,CAAC,CAAA;IAChD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAa,QAAQ,CAAC,EAAE,CAAC,CAAA;IAChD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAS,QAAQ,CAAC,KAAK,CAAC,CAAA;IACnD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAEjD,KAAK,UAAU,YAAY,CAAC,CAAkB;QAC5C,CAAC,CAAC,cAAc,EAAE,CAAA;QAClB,QAAQ,CAAC,EAAE,CAAC,CAAA;QACZ,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YAAC,QAAQ,CAAC,wBAAwB,CAAC,CAAC;YAAC,OAAM;QAAC,CAAC;QACxE,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAG,CAAC;YAAC,QAAQ,CAAC,wCAAwC,CAAC,CAAC;YAAC,OAAM;QAAC,CAAC;QACxF,UAAU,CAAC,IAAI,CAAC,CAAA;QAChB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,CAAW,iBAAiB,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;YAC5E,UAAU,CAAC,GAAG,CAAC,CAAA;YACf,OAAO,CAAC,CAAC,CAAC,CAAA;QACZ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,CAAA;QAC/D,CAAC;gBAAS,CAAC;YACT,UAAU,CAAC,KAAK,CAAC,CAAA;QACnB,CAAC;IACH,CAAC;IAED,IAAI,QAAQ;QAAE,OAAO,IAAI,CAAA;IAEzB,OAAO,CACL,eAAK,SAAS,EAAC,mBAAmB,EAAC,KAAK,EAAE,EAAE,UAAU,EAAE,mBAAmB,EAAE,aAG3E,eACE,SAAS,EAAC,+FAA+F,EACzG,KAAK,EAAE;oBACL,UAAU,EAAE,iCAAiC;oBAC7C,WAAW,EAAE,qCAAqC;iBACnD,aAGD,cAAK,SAAS,EAAC,sEAAsE,EACnF,KAAK,EAAE,EAAE,UAAU,EAAE,qGAAqG,EAAE,GAAI,EAClI,cAAK,SAAS,EAAC,sEAAsE,EACnF,KAAK,EAAE,EAAE,UAAU,EAAE,oGAAoG,EAAE,GAAI,EAGjI,cAAK,SAAS,EAAC,8BAA8B,YAC3C,cACE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,SAAS,EACpE,GAAG,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,IAAI,EAC1B,KAAK,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,GAChD,GACE,EAGN,eAAK,SAAS,EAAC,oBAAoB,aACjC,YAAG,SAAS,EAAC,8CAA8C,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,iCAE/F,EACJ,cAAI,SAAS,EAAC,oEAAoE,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,sBAAsB,EAAE,4BAC9G,cAAM,EACjB,eAAM,KAAK,EAAE,EAAE,KAAK,EAAE,mBAAmB,EAAE,0BAAkB,IAC1D,EACL,YAAG,SAAS,EAAC,mCAAmC,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,8FAEpF,IACA,EAGN,aAAI,SAAS,EAAC,8BAA8B,gBAAY,gBAAgB,YACrE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;4BAClB,MAAM,MAAM,GAAK,IAAI,GAAG,CAAC,CAAC,CAAC,CAAA;4BAC3B,MAAM,QAAQ,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAA;4BAC7B,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAA;4BAE5B,OAAO,CACL,8BAA4B,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,aACvD,eAAK,SAAS,EAAC,yBAAyB,aAEtC,cACE,SAAS,EAAC,mHAAmH,EAC7H,KAAK,EAAE;oDACL,UAAU,EAAE,MAAM;wDAChB,CAAC,CAAC,mBAAmB;wDACrB,CAAC,CAAC,QAAQ;4DACV,CAAC,CAAC,mBAAmB;4DACrB,CAAC,CAAC,aAAa;oDACjB,MAAM,EAAE,SAAS;wDACf,CAAC,CAAC,qCAAqC;wDACvC,CAAC,CAAC,6BAA6B;oDACjC,KAAK,EAAE,MAAM,IAAI,QAAQ;wDACvB,CAAC,CAAC,sBAAsB;wDACxB,CAAC,CAAC,qBAAqB;iDAC1B,YAEA,MAAM,CAAC,CAAC,CAAC,CACR,cAAK,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,MAAM,iBAAa,MAAM,YAC5E,eAAM,CAAC,EAAC,sBAAsB,EAAC,MAAM,EAAC,sBAAsB,EAAC,WAAW,EAAC,GAAG,EAAC,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,GAAG,GACxH,CACP,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GACH,EAGN,eACE,SAAS,EAAC,+CAA+C,EACzD,KAAK,EAAE;oDACL,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;oDAChC,KAAK,EAAE,QAAQ;wDACb,CAAC,CAAC,sBAAsB;wDACxB,CAAC,CAAC,MAAM;4DACR,CAAC,CAAC,mBAAmB;4DACrB,CAAC,CAAC,qBAAqB;iDAC1B,YAEA,CAAC,CAAC,KAAK,GACH,IACH,EAGL,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CACvB,cAAK,SAAS,EAAC,oBAAoB,iBAAa,MAAM,EACpD,KAAK,EAAE,EAAE,UAAU,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,2BAA2B,EAAE,GAAI,CAC5F,KA9CM,CAAC,CAAC,CAAC,CA+CP,CACN,CAAA;wBACH,CAAC,CAAC,GACC,IACD,EAGN,eAAK,SAAS,EAAC,6DAA6D,aAE1E,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,UAAU,EACnB,SAAS,EAAC,sDAAsD,gBACrD,kBAAkB,YAE7B,eAAM,SAAS,EAAC,2BAA2B,iBAAa,MAAM,YAC3D,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,GAC/B,GACA,EAET,eAAK,SAAS,EAAC,iBAAiB,aAG9B,cAAK,SAAS,EAAC,mCAAmC,YAChD,cACE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,SAAS,EACpE,GAAG,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,IAAI,EAC1B,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAC/C,GACE,EAGL,IAAI,KAAK,CAAC,IAAI,CACb,0BACE,eAAK,SAAS,EAAC,MAAM,aACnB,YAAG,SAAS,EAAC,mDAAmD,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,4BAAiB,EACzH,aAAI,SAAS,EAAC,kCAAkC,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,sBAAsB,EAAE,kCAEpF,EACL,YAAG,SAAS,EAAC,0BAA0B,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,uDAE3E,IACA,EAEN,eAAK,SAAS,EAAC,4CAA4C,aAEzD,eACE,SAAS,EAAC,qEAAqE,EAC/E,KAAK,EAAE;oDACL,UAAU,EAAE,iCAAiC;oDAC7C,MAAM,EAAE,6BAA6B;oDACrC,SAAS,EAAE,kEAAkE;iDAC9E,aAGD,cACE,SAAS,EAAC,8EAA8E,EACxF,KAAK,EAAE,EAAE,UAAU,EAAE,mBAAmB,EAAE,YAE1C,cAAK,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,MAAM,YACzD,eAAM,CAAC,EAAC,kBAAkB,EAAC,MAAM,EAAC,sBAAsB,EAAC,WAAW,EAAC,KAAK,EAAC,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,GAAG,GACtH,GACF,EAGN,cAAK,SAAS,EAAC,MAAM,YACnB,eAAK,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,MAAM,aACzD,kBAAS,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,GAAG,EAAC,IAAI,EAAC,wDAAwD,EAAC,MAAM,EAAC,mBAAmB,EAAC,WAAW,EAAC,KAAK,GAAG,EACrJ,eAAM,CAAC,EAAC,4CAA4C,EAAC,MAAM,EAAC,mBAAmB,EAAC,WAAW,EAAC,KAAK,EAAC,IAAI,EAAC,MAAM,GAAG,EAChH,eAAM,CAAC,EAAC,4CAA4C,EAAC,MAAM,EAAC,mBAAmB,EAAC,WAAW,EAAC,KAAK,EAAC,IAAI,EAAC,MAAM,GAAG,EAChH,kBAAS,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,GAAG,EAAC,IAAI,EAAC,wDAAwD,GAAG,IACpG,GACF,EAEN,aAAI,SAAS,EAAC,wCAAwC,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,sBAAsB,EAAE,uBAAa,EAC5G,YAAG,SAAS,EAAC,mCAAmC,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,wDAEpF,IACA,EAGN,eACE,SAAS,EAAC,0BAA0B,EACpC,KAAK,EAAE;oDACL,UAAU,EAAE,iCAAiC;oDAC7C,MAAM,EAAE,qCAAqC;oDAC7C,OAAO,EAAE,IAAI;oDACb,MAAM,EAAE,aAAa;iDACtB,EACD,YAAY,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,EACtC,YAAY,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,aAGvC,cACE,SAAS,EAAC,0GAA0G,EACpH,KAAK,EAAE,EAAE,UAAU,EAAE,qCAAqC,EAAE,KAAK,EAAE,qBAAqB,EAAE,qBAGtF,EAGN,cAAK,SAAS,EAAC,MAAM,YACnB,eAAK,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,MAAM,aACzD,kBAAS,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,GAAG,EAAC,IAAI,EAAC,0DAA0D,EAAC,MAAM,EAAC,qBAAqB,EAAC,WAAW,EAAC,KAAK,GAAG,EACzJ,eAAM,CAAC,EAAC,4CAA4C,EAAC,MAAM,EAAC,qBAAqB,EAAC,WAAW,EAAC,KAAK,EAAC,IAAI,EAAC,MAAM,GAAG,EAClH,eAAM,CAAC,EAAC,4CAA4C,EAAC,MAAM,EAAC,qBAAqB,EAAC,WAAW,EAAC,KAAK,EAAC,IAAI,EAAC,MAAM,GAAG,EAClH,kBAAS,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,GAAG,EAAC,IAAI,EAAC,yDAAyD,GAAG,IACrG,GACF,EAEN,aAAI,SAAS,EAAC,wCAAwC,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,sBAAsB,EAAE,2BAAiB,EAChH,YAAG,SAAS,EAAC,mCAAmC,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,kCAEpF,EAGH,SAAS,IAAI,CACZ,eACE,SAAS,EAAC,2IAA2I,EACrJ,KAAK,EAAE;4DACL,UAAU,EAAE,sBAAsB;4DAClC,KAAK,EAAE,mBAAmB;4DAC1B,OAAO,EAAE,CAAC;4DACV,SAAS,EAAE,6BAA6B;yDACzC,4BAGD,cACE,SAAS,EAAC,qDAAqD,EAC/D,KAAK,EAAE,EAAE,UAAU,EAAE,uBAAuB,EAAE,WAAW,EAAE,uBAAuB,EAAE,SAAS,EAAE,gCAAgC,EAAE,GACjI,IACE,CACP,IACG,IACF,EAEN,iBAAQ,IAAI,EAAC,QAAQ,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,EAAC,6BAA6B,yBAE/E,IACL,CACP,EAGA,IAAI,KAAK,CAAC,IAAI,CACb,0BACE,eAAK,SAAS,EAAC,MAAM,aACnB,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA,CAAC,CAAC,EAC3C,SAAS,EAAC,iCAAiC,aAE3C,cAAK,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,MAAM,iBAAa,MAAM,YAC5E,eAAM,CAAC,EAAC,cAAc,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAC,KAAK,EAAC,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,GAAG,GAC1G,YAEC,EACT,YAAG,SAAS,EAAC,mDAAmD,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,4BAAiB,EACzH,aAAI,SAAS,EAAC,kCAAkC,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,sBAAsB,EAAE,qCAEpF,EACL,YAAG,SAAS,EAAC,0BAA0B,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,yEAE3E,IACA,EAEN,gBAAM,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAC,WAAW,aAChD,KAAK,IAAI,KAAC,KAAK,IAAC,IAAI,EAAC,OAAO,YAAE,KAAK,GAAS,EAE7C,0BACE,gBAAO,OAAO,EAAC,aAAa,EAAC,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,sBAEpF,EACR,gBACE,EAAE,EAAC,aAAa,EAChB,IAAI,EAAC,OAAO,EACZ,YAAY,EAAC,UAAU,EACvB,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACzC,QAAQ,QACR,SAAS,EAAC,UAAU,EACpB,WAAW,EAAC,mBAAmB,EAC/B,SAAS,SACT,IACE,EAEN,0BACE,gBAAO,OAAO,EAAC,gBAAgB,EAAC,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,yBAEvF,EACR,gBACE,EAAE,EAAC,gBAAgB,EACnB,IAAI,EAAC,UAAU,EACf,YAAY,EAAC,cAAc,EAC3B,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC5C,QAAQ,QACR,SAAS,EAAC,UAAU,EACpB,WAAW,EAAC,mBAAmB,GAC/B,IACE,EAEN,0BACE,gBAAO,OAAO,EAAC,wBAAwB,EAAC,SAAS,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,iCAE/F,EACR,gBACE,EAAE,EAAC,wBAAwB,EAC3B,IAAI,EAAC,UAAU,EACf,YAAY,EAAC,cAAc,EAC3B,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC3C,QAAQ,QACR,SAAS,EAAC,UAAU,EACpB,WAAW,EAAC,iBAAiB,GAC7B,IACE,EAEN,iBAAQ,IAAI,EAAC,QAAQ,EAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAC,kCAAkC,YAClF,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,gBAAgB,GAC1C,IACJ,IACH,CACP,EAGA,IAAI,KAAK,CAAC,IAAI,CACb,eAAK,SAAS,EAAC,aAAa,aAE1B,cAAK,SAAS,EAAC,0BAA0B,YACvC,cACE,SAAS,EAAC,yDAAyD,EACnE,KAAK,EAAE;gDACL,UAAU,EAAE,wDAAwD;gDACpE,MAAM,EAAE,kEAAkE;6CAC3E,YAED,cAAK,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,MAAM,iBAAa,MAAM,YAC5E,eAAM,CAAC,EAAC,mBAAmB,EAAC,MAAM,EAAC,mBAAmB,EAAC,WAAW,EAAC,KAAK,EAAC,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,GAAG,GACpH,GACF,GACF,EAEN,YAAG,SAAS,EAAC,mDAAmD,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,4BAAiB,EACzH,aAAI,SAAS,EAAC,uCAAuC,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,sBAAsB,EAAE,gCAEzF,EACL,aAAG,SAAS,EAAC,wCAAwC,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,sBACrF,QAAQ,EAAE,CAAC,KAAK,CAAC,IAAI,2BACzB,EACJ,YAAG,SAAS,EAAC,yBAAyB,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,YAC3E,KAAK,GACJ,EAGJ,cACE,SAAS,EAAC,0CAA0C,EACpD,KAAK,EAAE,EAAE,UAAU,EAAE,iCAAiC,EAAE,MAAM,EAAE,qCAAqC,EAAE,YAEtG;4CACC,EAAE,IAAI,EAAE,4CAA4C,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE;4CAC1F,EAAE,IAAI,EAAE,iDAAiD,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK,EAAE;4CACjG,EAAE,IAAI,EAAE,yDAAyD,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE;yCAC3G,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CACb,eAAqB,SAAS,EAAC,yCAAyC,aACtE,eAAM,SAAS,EAAC,0DAA0D,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,YAC/G,GAAG,CAAC,KAAK,GACL,EACP,eAAM,SAAS,EAAC,mBAAmB,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,sBAAsB,EAAE,YACzE,GAAG,CAAC,KAAK,GACL,KANC,GAAG,CAAC,KAAK,CAOb,CACP,CAAC,GACE,EAEN,iBAAQ,IAAI,EAAC,QAAQ,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,QAAQ,EAAE,CAAC,QAAQ,GAAG,CAAC,EAAE,SAAS,EAAC,6BAA6B,gCAExG,IACL,CACP,IAEG,IACF,IACF,CACP,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SsoConfirm.d.ts","sourceRoot":"","sources":["../../src/pages/SsoConfirm.tsx"],"names":[],"mappings":"AAIA,wGAAwG;AACxG,MAAM,CAAC,OAAO,UAAU,cAAc,gCAoBrC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect } from 'react';
|
|
3
|
+
import { useSearchParams } from 'react-router-dom';
|
|
4
|
+
import { ssoConfirmChannel } from '../components/SsoConfirmation';
|
|
5
|
+
/** Where the SSO confirmation popup lands: tells the window that opened it how it went, then closes. */
|
|
6
|
+
export default function SsoConfirmPage() {
|
|
7
|
+
const [params] = useSearchParams();
|
|
8
|
+
const ok = params.get('status') === 'ok';
|
|
9
|
+
useEffect(() => {
|
|
10
|
+
const channel = new BroadcastChannel(ssoConfirmChannel());
|
|
11
|
+
channel.postMessage({ ok });
|
|
12
|
+
channel.close();
|
|
13
|
+
if (ok)
|
|
14
|
+
window.close();
|
|
15
|
+
}, [ok]);
|
|
16
|
+
return (_jsx("div", { className: "min-h-screen flex items-center justify-center px-6", style: { background: 'var(--m3-surface)', color: 'var(--m3-on-surface)' }, children: _jsx("p", { className: "text-sm text-center max-w-sm", children: ok
|
|
17
|
+
? 'Confirmed. You can close this window.'
|
|
18
|
+
: 'The confirmation did not succeed. Close this window and try again.' }) }));
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=SsoConfirm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SsoConfirm.js","sourceRoot":"","sources":["../../src/pages/SsoConfirm.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAA;AAEjE,wGAAwG;AACxG,MAAM,CAAC,OAAO,UAAU,cAAc;IACpC,MAAM,CAAC,MAAM,CAAC,GAAG,eAAe,EAAE,CAAA;IAClC,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAA;IAExC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,OAAO,GAAG,IAAI,gBAAgB,CAAC,iBAAiB,EAAE,CAAC,CAAA;QACzD,OAAO,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;QAC3B,OAAO,CAAC,KAAK,EAAE,CAAA;QACf,IAAI,EAAE;YAAE,MAAM,CAAC,KAAK,EAAE,CAAA;IACxB,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAER,OAAO,CACL,cAAK,SAAS,EAAC,oDAAoD,EAAC,KAAK,EAAE,EAAE,UAAU,EAAE,mBAAmB,EAAE,KAAK,EAAE,sBAAsB,EAAE,YAC3I,YAAG,SAAS,EAAC,8BAA8B,YACxC,EAAE;gBACD,CAAC,CAAC,uCAAuC;gBACzC,CAAC,CAAC,oEAAoE,GACtE,GACA,CACP,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SsoTestResult.d.ts","sourceRoot":"","sources":["../../src/pages/SsoTestResult.tsx"],"names":[],"mappings":"AAwCA,MAAM,CAAC,OAAO,UAAU,iBAAiB,gCAyDxC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useQuery } from '@tanstack/react-query';
|
|
3
|
+
import { useSearchParams } from 'react-router-dom';
|
|
4
|
+
import { api } from '../api/client';
|
|
5
|
+
import { uiConfig } from '../config';
|
|
6
|
+
import { Alert, ErrorState, LoadingState, PageContainer, PageHeader, DataTable, DataTh } from '../components/ui';
|
|
7
|
+
import { formatDateTime } from '../lib/dateFormat';
|
|
8
|
+
// Claims that decide the outcome, shown first.
|
|
9
|
+
const KEY_CLAIMS = ['sub', 'email', 'email_verified', 'xms_edov', 'preferred_username', 'name'];
|
|
10
|
+
function formatClaim(value) {
|
|
11
|
+
return typeof value === 'string' ? value : JSON.stringify(value);
|
|
12
|
+
}
|
|
13
|
+
function Outcome({ result }) {
|
|
14
|
+
if (result.outcome === 'sign_in') {
|
|
15
|
+
return _jsxs(Alert, { tone: "success", title: "Sign-in would succeed", children: ["Signs in as ", _jsx("strong", { children: result.user }), ", matched by their linked identity-provider account."] });
|
|
16
|
+
}
|
|
17
|
+
if (result.outcome === 'link') {
|
|
18
|
+
return _jsxs(Alert, { tone: "success", title: "Sign-in would succeed", children: ["Signs in as ", _jsx("strong", { children: result.user }), ", matched by email. The first real sign-in links this identity-provider account to the user."] });
|
|
19
|
+
}
|
|
20
|
+
if (result.outcome === 'provision') {
|
|
21
|
+
return _jsx(Alert, { tone: "success", title: "Sign-in would succeed", children: newAccountNote(result.user) });
|
|
22
|
+
}
|
|
23
|
+
return (_jsx(Alert, { tone: "error", title: `Sign-in would be refused (${result.denial?.code})`, children: result.denial?.reason }));
|
|
24
|
+
}
|
|
25
|
+
export default function SsoTestResultPage() {
|
|
26
|
+
const [params] = useSearchParams();
|
|
27
|
+
const id = params.get('result') ?? '';
|
|
28
|
+
const { data, isLoading, error } = useQuery({
|
|
29
|
+
queryKey: ['sso-test', id],
|
|
30
|
+
queryFn: () => api.get(`/admin/oidc/test-sign-in/${encodeURIComponent(id)}`),
|
|
31
|
+
enabled: !!id,
|
|
32
|
+
retry: false,
|
|
33
|
+
});
|
|
34
|
+
const claims = data?.claims ? Object.entries(data.claims) : [];
|
|
35
|
+
const ordered = [
|
|
36
|
+
...KEY_CLAIMS.flatMap((key) => claims.filter(([name]) => name === key)),
|
|
37
|
+
...claims.filter(([name]) => !KEY_CLAIMS.includes(name)).sort(([a], [b]) => a.localeCompare(b)),
|
|
38
|
+
];
|
|
39
|
+
return (_jsxs(PageContainer, { className: "max-w-3xl", children: [_jsx(PageHeader, { title: "Single sign-on test", subtitle: "Nobody was signed in and nothing was saved. Close this tab when you are done." }), !id ? _jsx(ErrorState, { message: "No test result to show. Start a test sign-in from Users \u2192 Single sign-on." })
|
|
40
|
+
: isLoading ? _jsx(LoadingState, { label: "Loading the test result\u2026" })
|
|
41
|
+
: error || !data ? _jsx(ErrorState, { message: error instanceof Error ? error.message : 'Could not load the test result.' })
|
|
42
|
+
: (_jsxs(_Fragment, { children: [_jsx(Outcome, { result: data }), _jsxs("p", { className: "text-sm", style: { color: 'var(--m3-secondary)' }, children: ["Issuer ", _jsx("code", { children: data.issuer }), " \u00B7 tested ", formatDateTime(data.testedAt)] }), ordered.length > 0 && (_jsx("div", { className: "rounded-2xl overflow-x-auto", style: { background: 'var(--m3-surface-container-low)', border: '1px solid var(--m3-outline-variant)' }, children: _jsxs(DataTable, { className: "w-full text-sm", children: [_jsx("caption", { className: "sr-only", children: "ID token claims" }), _jsx("thead", { children: _jsx("tr", { style: { borderBottom: '1px solid var(--m3-outline-variant)' }, children: ['Claim', 'Value'].map((h) => (_jsx(DataTh, { className: "px-4 py-3 font-mono text-xs uppercase tracking-wider text-left", style: { color: 'var(--m3-secondary)', background: 'var(--m3-surface-container)' }, children: h }, h))) }) }), _jsx("tbody", { children: ordered.map(([name, value], i) => (_jsxs("tr", { style: { borderTop: i > 0 ? '1px solid var(--m3-outline-variant)' : 'none' }, children: [_jsx("td", { className: "px-4 py-2 font-mono text-xs whitespace-nowrap align-top", style: { color: 'var(--m3-secondary)' }, children: name }), _jsx("td", { className: "px-4 py-2 font-mono text-xs break-all", style: { color: 'var(--m3-on-surface)' }, children: formatClaim(value) })] }, name))) })] }) }))] }))] }));
|
|
43
|
+
}
|
|
44
|
+
/** The note for a test sign-in that would create an account, worded by the application. */
|
|
45
|
+
function newAccountNote(user) {
|
|
46
|
+
const [before, after] = uiConfig().texts.ssoNewAccount.split('{user}');
|
|
47
|
+
return _jsxs(_Fragment, { children: [before, _jsx("strong", { children: user }), after] });
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=SsoTestResult.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SsoTestResult.js","sourceRoot":"","sources":["../../src/pages/SsoTestResult.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
export interface UserRole {
|
|
3
|
+
value: string;
|
|
4
|
+
label: string;
|
|
5
|
+
desc: string;
|
|
6
|
+
}
|
|
7
|
+
/** A button in the header of the page that opens a dialog of the application's own (say, access settings). */
|
|
8
|
+
export interface UsersPageAction {
|
|
9
|
+
label: string;
|
|
10
|
+
icon: string;
|
|
11
|
+
dialog: (close: () => void) => ReactNode;
|
|
12
|
+
}
|
|
13
|
+
export interface UsersPageProps {
|
|
14
|
+
roles: readonly UserRole[];
|
|
15
|
+
/** Higher number = more access; moving a user to a lower rank is a demotion and needs confirmation. */
|
|
16
|
+
roleRank: Readonly<Record<string, number>>;
|
|
17
|
+
/** The role a new user starts with. */
|
|
18
|
+
defaultRole: string;
|
|
19
|
+
actions?: readonly UsersPageAction[];
|
|
20
|
+
}
|
|
21
|
+
export default function UsersPage({ roles: ROLES, roleRank: ROLE_RANK, defaultRole, actions }: UsersPageProps): import("react").JSX.Element;
|
|
22
|
+
//# sourceMappingURL=Users.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Users.d.ts","sourceRoot":"","sources":["../../src/pages/Users.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAwC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAsB5E,MAAM,WAAW,QAAQ;IAAG,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE;AAExE,8GAA8G;AAC9G,MAAM,WAAW,eAAe;IAAG,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,IAAI,KAAK,SAAS,CAAA;CAAE;AAE1G,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAA;IAC1B,uGAAuG;IACvG,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IAC1C,uCAAuC;IACvC,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,CAAC,EAAE,SAAS,eAAe,EAAE,CAAA;CACrC;AAQD,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,OAAY,EAAE,EAAE,cAAc,+BA+XjH"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useId, useState } from 'react';
|
|
3
|
+
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
|
|
4
|
+
import { api, getCurrentUser } from '../api/client';
|
|
5
|
+
import { ConfirmIdentityModal } from '../components/ConfirmIdentityModal';
|
|
6
|
+
import { ConfirmModal } from '../components/ConfirmModal';
|
|
7
|
+
import { CopyButton } from '../components/CopyButton';
|
|
8
|
+
import { ResetTwoFactorModal } from '../components/ResetTwoFactorModal';
|
|
9
|
+
import { SingleSignOnModal } from '../components/SingleSignOnModal';
|
|
10
|
+
import { useSsoConfirmation } from '../components/SsoConfirmation';
|
|
11
|
+
import { Alert, EmptyStateLink, EmptyTableRow, ErrorState, LoadingState, PageContainer, PageHeader, useToast, DataTable, DataTh, useTableSort } from '../components/ui';
|
|
12
|
+
import { formatDate } from '../lib/dateFormat';
|
|
13
|
+
function errorMessage(err, fallback) {
|
|
14
|
+
return err instanceof Error && err.message ? err.message : fallback;
|
|
15
|
+
}
|
|
16
|
+
const ROW_ACTION = 'w-8 h-8 flex items-center justify-center rounded-lg transition-colors text-xs focus-ring';
|
|
17
|
+
export default function UsersPage({ roles: ROLES, roleRank: ROLE_RANK, defaultRole, actions = [] }) {
|
|
18
|
+
const roleLabel = (role) => ROLES.find((r) => r.value === role)?.label ?? role;
|
|
19
|
+
const qc = useQueryClient();
|
|
20
|
+
const ssoConfirmation = useSsoConfirmation();
|
|
21
|
+
const toast = useToast();
|
|
22
|
+
const emailInputId = useId();
|
|
23
|
+
const [showCreate, setShowCreate] = useState(false);
|
|
24
|
+
const [showSso, setShowSso] = useState(false);
|
|
25
|
+
const [openAction, setOpenAction] = useState(null);
|
|
26
|
+
const [newEmail, setNewEmail] = useState('');
|
|
27
|
+
const [newRole, setNewRole] = useState(defaultRole);
|
|
28
|
+
const [createdUser, setCreatedUser] = useState(null);
|
|
29
|
+
const [resetResult, setResetResult] = useState(null);
|
|
30
|
+
const [identityPrompt, setIdentityPrompt] = useState(null);
|
|
31
|
+
const [deleteTarget, setDeleteTarget] = useState(null);
|
|
32
|
+
const [twoFactorResetTarget, setTwoFactorResetTarget] = useState(null);
|
|
33
|
+
const [message, setMessage] = useState('');
|
|
34
|
+
const { data: users = [], isLoading, isError, refetch } = useQuery({
|
|
35
|
+
queryKey: ['users'],
|
|
36
|
+
queryFn: () => api.get('/admin/users'),
|
|
37
|
+
});
|
|
38
|
+
const { rows: sortedUsers, sort } = useTableSort(users, {
|
|
39
|
+
email: (u) => u.email,
|
|
40
|
+
role: (u) => ROLE_RANK[u.role] ?? 0,
|
|
41
|
+
status: (u) => u.pendingTemporaryPassword,
|
|
42
|
+
created: (u) => u.createdAt,
|
|
43
|
+
});
|
|
44
|
+
function confirmCreateUser() {
|
|
45
|
+
const email = newEmail;
|
|
46
|
+
setIdentityPrompt({
|
|
47
|
+
title: 'Create user',
|
|
48
|
+
message: `Create ${email} as ${roleLabel(newRole)}? They will be able to sign in with a temporary password.`,
|
|
49
|
+
confirmLabel: 'Create user',
|
|
50
|
+
pendingLabel: 'Creating…',
|
|
51
|
+
action: async (currentPassword) => {
|
|
52
|
+
const created = await api.post('/admin/users', { email, role: newRole, currentPassword });
|
|
53
|
+
qc.invalidateQueries({ queryKey: ['users'] });
|
|
54
|
+
setCreatedUser(created);
|
|
55
|
+
setShowCreate(false);
|
|
56
|
+
setNewEmail('');
|
|
57
|
+
},
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
function confirmResetPassword(user) {
|
|
61
|
+
setIdentityPrompt({
|
|
62
|
+
title: 'Reset password',
|
|
63
|
+
message: `Reset password for ${user.email}? Their current password will stop working.`,
|
|
64
|
+
confirmLabel: 'Reset password',
|
|
65
|
+
pendingLabel: 'Resetting…',
|
|
66
|
+
danger: true,
|
|
67
|
+
action: async (currentPassword) => {
|
|
68
|
+
const reset = await api.post(`/admin/users/${user.id}/reset-password`, { currentPassword });
|
|
69
|
+
setResetResult({ email: user.email, temporaryPassword: reset.temporaryPassword });
|
|
70
|
+
qc.invalidateQueries({ queryKey: ['users'] });
|
|
71
|
+
},
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
const deleteMutation = useMutation({
|
|
75
|
+
mutationFn: (id) => api.delete(`/admin/users/${id}`),
|
|
76
|
+
onSuccess: (_data, id) => {
|
|
77
|
+
const user = users.find((u) => u.id === id);
|
|
78
|
+
toast.success(user ? `Deleted ${user.email}.` : 'User deleted.');
|
|
79
|
+
setDeleteTarget(null);
|
|
80
|
+
qc.invalidateQueries({ queryKey: ['users'] });
|
|
81
|
+
},
|
|
82
|
+
onError: (err) => {
|
|
83
|
+
setDeleteTarget(null);
|
|
84
|
+
toast.error(errorMessage(err, 'Failed to delete user'));
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
const resetTwoFactorMutation = useMutation({
|
|
88
|
+
mutationFn: ({ id, currentPassword }) => ssoConfirmation.run(() => api.post(`/admin/users/${id}/reset-2fa`, currentPassword === undefined ? {} : { currentPassword })),
|
|
89
|
+
onSuccess: (_data, variables) => {
|
|
90
|
+
const user = users.find((candidate) => candidate.id === variables.id);
|
|
91
|
+
setMessage(user ? `Two-factor authentication reset for ${user.email}.` : 'Two-factor authentication reset.');
|
|
92
|
+
setTwoFactorResetTarget(null);
|
|
93
|
+
qc.invalidateQueries({ queryKey: ['users'] });
|
|
94
|
+
},
|
|
95
|
+
});
|
|
96
|
+
function changeRole(user, role) {
|
|
97
|
+
if (user.role === role)
|
|
98
|
+
return;
|
|
99
|
+
const demotion = (ROLE_RANK[role] ?? 0) < (ROLE_RANK[user.role] ?? 0);
|
|
100
|
+
setIdentityPrompt({
|
|
101
|
+
title: 'Change role',
|
|
102
|
+
message: `Change ${user.email} from ${roleLabel(user.role)} to ${roleLabel(role)}?${demotion ? ' They will lose access to some areas immediately.' : ''}`,
|
|
103
|
+
confirmLabel: `Make ${roleLabel(role)}`,
|
|
104
|
+
pendingLabel: 'Saving…',
|
|
105
|
+
danger: demotion,
|
|
106
|
+
action: async (currentPassword) => {
|
|
107
|
+
await api.patch(`/admin/users/${user.id}/role`, { role, currentPassword });
|
|
108
|
+
toast.success(`${user.email} is now ${roleLabel(role)}.`);
|
|
109
|
+
qc.invalidateQueries({ queryKey: ['users'] });
|
|
110
|
+
},
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
const currentUser = getCurrentUser();
|
|
114
|
+
return (_jsxs(PageContainer, { children: [_jsx(PageHeader, { title: "Users", subtitle: isLoading || isError ? undefined : `${users.length} user${users.length !== 1 ? 's' : ''}`, actions: _jsxs(_Fragment, { children: [actions.map((action, index) => (_jsxs("button", { type: "button", onClick: () => setOpenAction(index), className: "btn btn-secondary", children: [_jsx("span", { className: "material-symbols-outlined", "aria-hidden": "true", children: action.icon }), action.label] }, action.label))), _jsxs("button", { type: "button", onClick: () => setShowSso(true), className: "btn btn-secondary", children: [_jsx("span", { className: "material-symbols-outlined", "aria-hidden": "true", children: "passkey" }), "Single sign-on"] }), _jsxs("button", { type: "button", onClick: () => setShowCreate(true), className: "btn btn-primary", children: [_jsx("span", { className: "material-symbols-outlined", "aria-hidden": "true", children: "person_add" }), "New User"] })] }) }), showSso && _jsx(SingleSignOnModal, { onClose: () => setShowSso(false) }), openAction !== null && actions[openAction]?.dialog(() => setOpenAction(null)), message && (_jsx(Alert, { tone: "success", onDismiss: () => setMessage(''), className: "max-w-2xl", children: message })), showCreate && (_jsxs("div", { className: "rounded-2xl p-5", style: { background: 'var(--m3-surface-container-low)', border: '1px solid var(--m3-outline-variant)' }, children: [_jsx("p", { className: "font-headline font-semibold text-sm mb-3", style: { color: 'var(--m3-on-surface)' }, children: "New User" }), _jsx("label", { htmlFor: emailInputId, className: "block text-xs mb-1.5", style: { color: 'var(--m3-secondary)' }, children: "Email" }), _jsxs("div", { className: "flex flex-wrap gap-3", children: [_jsx("input", { id: emailInputId, type: "email", value: newEmail, onChange: (e) => setNewEmail(e.target.value), placeholder: "user@example.com", className: "input-sig flex-1 min-w-[200px]", onKeyDown: (e) => e.key === 'Enter' && newEmail && confirmCreateUser() }), _jsx("select", { "aria-label": "Role", value: newRole, onChange: (e) => setNewRole(e.target.value), className: "input-sig w-auto", children: ROLES.map((r) => _jsx("option", { value: r.value, children: r.label }, r.value)) }), _jsx("button", { type: "button", onClick: () => newEmail && confirmCreateUser(), disabled: !newEmail, className: "btn btn-primary", children: "Create" }), _jsx("button", { type: "button", onClick: () => setShowCreate(false), className: "btn btn-ghost", children: "Cancel" })] }), _jsx("p", { className: "text-xs mt-2", style: { color: 'var(--m3-secondary)' }, children: "A temporary password will be generated. Share it with the user \u2014 they will be required to change it on first login." })] })), createdUser && (_jsxs(Alert, { tone: "success", title: _jsxs(_Fragment, { children: ["User ", _jsx("strong", { children: createdUser.email }), " created"] }), onDismiss: () => setCreatedUser(null), children: [_jsx("p", { className: "text-xs mb-3", style: { color: 'var(--m3-secondary)' }, children: "Share this temporary password. It will not be shown again." }), _jsxs("div", { className: "flex flex-wrap items-center gap-3", children: [_jsx("code", { className: "font-mono text-base px-4 py-2 rounded-xl select-all", style: { background: 'var(--m3-surface-container)', color: 'var(--m3-on-surface)', letterSpacing: '0.05em' }, children: createdUser.temporaryPassword }), _jsx(CopyButton, { value: createdUser.temporaryPassword })] })] })), resetResult && (_jsxs(Alert, { tone: "info", title: _jsxs(_Fragment, { children: ["Password reset for ", _jsx("strong", { children: resetResult.email })] }), onDismiss: () => setResetResult(null), children: [_jsx("p", { className: "text-xs mb-3", style: { color: 'var(--m3-secondary)' }, children: "New temporary password (shown once):" }), _jsxs("div", { className: "flex flex-wrap items-center gap-3", children: [_jsx("code", { className: "font-mono text-base px-4 py-2 rounded-xl select-all", style: { background: 'var(--m3-surface-container)', color: 'var(--m3-on-surface)', letterSpacing: '0.05em' }, children: resetResult.temporaryPassword }), _jsx(CopyButton, { value: resetResult.temporaryPassword })] })] })), isLoading ? (_jsx(LoadingState, { label: "Loading users\u2026" })) : isError ? (_jsx(ErrorState, { message: "Could not load users.", onRetry: () => void refetch() })) : (_jsx("div", { className: "rounded-2xl overflow-x-auto", style: { background: 'var(--m3-surface-container-low)', border: '1px solid var(--m3-outline-variant)' }, children: _jsxs(DataTable, { sort: sort, className: "w-full min-w-[720px] text-sm", children: [_jsx("thead", { children: _jsx("tr", { style: { borderBottom: '1px solid var(--m3-outline-variant)' }, children: ['Email', 'Role', 'Status', 'Created', ''].map((h) => (_jsx(DataTh, { resizable: h !== '', ...(h !== '' && { sortKey: h.toLowerCase() }), className: `px-4 py-3 font-mono text-xs uppercase tracking-wider ${h === '' ? 'text-right' : 'text-left'}`, style: { color: 'var(--m3-secondary)', background: 'var(--m3-surface-container)' }, children: h === '' ? _jsx("span", { className: "sr-only", children: "Actions" }) : h }, h))) }) }), _jsxs("tbody", { children: [sortedUsers.map((user, i) => (_jsxs("tr", { style: { borderTop: i > 0 ? '1px solid var(--m3-outline-variant)' : 'none' }, onMouseEnter: (e) => (e.currentTarget.style.background = 'var(--m3-surface-container)'), onMouseLeave: (e) => (e.currentTarget.style.background = ''), children: [_jsx("td", { className: "px-4 py-3 font-medium", style: { color: 'var(--m3-on-surface)' }, children: user.email }), _jsx("td", { className: "px-4 py-3", children: currentUser?.userId === user.id ? (_jsx("span", { className: "text-xs font-semibold px-2.5 py-1 rounded-lg", style: { background: 'var(--m3-surface-container)', color: 'var(--m3-on-surface)' }, children: roleLabel(user.role) })) : (_jsx("div", { role: "group", "aria-label": `Role for ${user.email}`, className: "flex rounded-lg overflow-hidden", style: { border: '1px solid var(--m3-outline-variant)', width: 'fit-content' }, children: ROLES.map((r) => {
|
|
115
|
+
const active = user.role === r.value;
|
|
116
|
+
return (_jsx("button", { type: "button", title: r.desc, "aria-pressed": active, onClick: () => changeRole(user, r.value), className: `text-xs font-medium px-3 py-1.5 transition-colors focus-ring ${active ? 'selection-active' : ''}`, style: {
|
|
117
|
+
background: 'transparent',
|
|
118
|
+
color: 'var(--m3-secondary)',
|
|
119
|
+
cursor: active ? 'default' : 'pointer',
|
|
120
|
+
}, children: r.label }, r.value));
|
|
121
|
+
}) })) }), _jsx("td", { className: "px-4 py-3", children: _jsxs("div", { className: "flex items-center gap-2 flex-wrap", children: [user.pendingTemporaryPassword ? (_jsx("span", { className: "text-xs font-medium px-2 py-0.5 rounded-full whitespace-nowrap", style: { background: 'var(--m3-degraded-bg)', color: 'var(--m3-degraded)' }, children: "Temp password" })) : (_jsx("span", { className: "text-xs font-medium px-2 py-0.5 rounded-full whitespace-nowrap", style: { background: 'var(--m3-up-bg)', color: 'var(--m3-up)' }, children: "Active" })), !!user.twoFactorEnabled && (_jsx("span", { className: "text-xs font-medium px-2 py-0.5 rounded-full", style: { background: 'var(--m3-surface-container-high)', color: 'var(--m3-on-surface)' }, children: "2FA" })), user.ssoLinked && (_jsx("span", { className: "text-xs font-medium px-2 py-0.5 rounded-full", title: "Signed in through single sign-on; matched by their identity-provider account", style: { background: 'var(--m3-surface-container-high)', color: 'var(--m3-on-surface)' }, children: "SSO" }))] }) }), _jsx("td", { className: "px-4 py-3 font-mono text-xs", style: { color: 'var(--m3-secondary)' }, children: formatDate(user.createdAt) }), _jsx("td", { className: "px-4 py-3", children: _jsxs("div", { className: "flex items-center justify-end gap-1", children: [!!user.twoFactorEnabled && currentUser?.userId !== user.id && (_jsx("button", { type: "button", onClick: () => { resetTwoFactorMutation.reset(); setTwoFactorResetTarget(user); setMessage(''); }, title: "Reset 2FA", "aria-label": `Reset 2FA for ${user.email}`, className: ROW_ACTION, style: { color: 'var(--m3-secondary)' }, onMouseEnter: (event) => { event.currentTarget.style.background = 'var(--m3-down-bg)'; event.currentTarget.style.color = 'var(--m3-down)'; }, onMouseLeave: (event) => { event.currentTarget.style.background = ''; event.currentTarget.style.color = 'var(--m3-secondary)'; }, children: _jsx("span", { className: "material-symbols-outlined", "aria-hidden": "true", style: { fontSize: '16px' }, children: "no_encryption" }) })), _jsx("button", { type: "button", onClick: () => confirmResetPassword(user), title: "Reset password", "aria-label": `Reset password for ${user.email}`, className: ROW_ACTION, style: { color: 'var(--m3-secondary)' }, onMouseEnter: (e) => { (e.currentTarget).style.background = 'var(--m3-surface-container-high)'; (e.currentTarget).style.color = 'var(--m3-on-surface)'; }, onMouseLeave: (e) => { (e.currentTarget).style.background = ''; (e.currentTarget).style.color = 'var(--m3-secondary)'; }, children: _jsx("span", { className: "material-symbols-outlined", "aria-hidden": "true", style: { fontSize: '16px' }, children: "lock_reset" }) }), currentUser?.userId !== user.id && (_jsx("button", { type: "button", onClick: () => setDeleteTarget(user), title: "Delete user", "aria-label": `Delete ${user.email}`, className: ROW_ACTION, style: { color: 'var(--m3-secondary)' }, onMouseEnter: (e) => { (e.currentTarget).style.background = 'var(--m3-error-container)'; (e.currentTarget).style.color = 'var(--m3-on-error-container)'; }, onMouseLeave: (e) => { (e.currentTarget).style.background = ''; (e.currentTarget).style.color = 'var(--m3-secondary)'; }, children: _jsx("span", { className: "material-symbols-outlined", "aria-hidden": "true", style: { fontSize: '16px' }, children: "delete" }) }))] }) })] }, user.id))), users.length === 0 && (_jsx(EmptyTableRow, { colSpan: 5, icon: "group", title: "No users yet.", description: _jsxs(_Fragment, { children: [_jsx(EmptyStateLink, { onClick: () => setShowCreate(true), children: "Add a user" }), " to share access to the admin panel."] }) }))] })] }) })), identityPrompt && _jsx(ConfirmIdentityModal, { ...identityPrompt, onClose: () => setIdentityPrompt(null) }), deleteTarget && (_jsx(ConfirmModal, { title: "Delete user", message: `Delete user "${deleteTarget.email}"? This action cannot be undone.`, confirmLabel: "Delete", pending: deleteMutation.isPending, pendingLabel: "Deleting\u2026", onConfirm: () => deleteMutation.mutate(deleteTarget.id), onCancel: () => setDeleteTarget(null) })), twoFactorResetTarget && (_jsx(ResetTwoFactorModal, { email: twoFactorResetTarget.email, pending: resetTwoFactorMutation.isPending, ...(resetTwoFactorMutation.error ? { error: errorMessage(resetTwoFactorMutation.error, 'Failed to reset two-factor authentication') } : {}), ssoConfirmation: ssoConfirmation, onConfirm: (currentPassword) => resetTwoFactorMutation.mutate({ id: twoFactorResetTarget.id, currentPassword }), onCancel: () => { if (!resetTwoFactorMutation.isPending)
|
|
122
|
+
setTwoFactorResetTarget(null); } }))] }));
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=Users.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Users.js","sourceRoot":"","sources":["../../src/pages/Users.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Vault.d.ts","sourceRoot":"","sources":["../../src/pages/Vault.tsx"],"names":[],"mappings":"AAwGA,MAAM,CAAC,OAAO,UAAU,SAAS,gCAqPhC"}
|