@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,372 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useEffect, useId, useState } from 'react';
|
|
3
|
+
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
|
|
4
|
+
import { api } from '../api/client';
|
|
5
|
+
import { ConfirmModal } from '../components/ConfirmModal';
|
|
6
|
+
import { CopyButton } from '../components/CopyButton';
|
|
7
|
+
import { Modal, ModalFooter, ModalHeader, ModalShell } from '../components/ModalShell';
|
|
8
|
+
import { SidePanelFrame, SideTabStrip } from '../components/SidePanel';
|
|
9
|
+
import { VAULT_TYPE_ICONS, VaultTypePicker, isReferenceVault } from '../components/VaultTypePicker';
|
|
10
|
+
import { Alert, EmptyState, EmptyStateLink, ErrorState, Field, LoadingState, useToast } from '../components/ui';
|
|
11
|
+
import { CredentialSection } from '../components/CredentialSection';
|
|
12
|
+
import { uiConfig } from '../config';
|
|
13
|
+
import { formatDate } from '../lib/dateFormat';
|
|
14
|
+
const EMPTY_CONNECTION = {
|
|
15
|
+
address: '', namespace: '', mount: 'secret', authMethod: 'token', token: '', roleId: '', secretId: '', approleMount: 'approle', caCert: '', credentialsRef: undefined,
|
|
16
|
+
};
|
|
17
|
+
/** The request body for a connection: a chosen secret replaces the typed credentials, direct input clears it. */
|
|
18
|
+
function connectionPayload(form) {
|
|
19
|
+
return { ...form, credentialsRef: form.credentialsRef ? { vaultId: form.credentialsRef.vaultId, secretId: form.credentialsRef.secretId, ...(Object.keys(form.credentialsRef.fieldMapping ?? {}).length > 0 && { fieldMapping: form.credentialsRef.fieldMapping }) } : null };
|
|
20
|
+
}
|
|
21
|
+
const VAULT_TYPE_LABELS = { local: 'LOCAL', hashicorp: 'HASHICORP VAULT' };
|
|
22
|
+
/**
|
|
23
|
+
* Local-vault secrets a HashiCorp connection can take its credentials from. Only local vaults are offered,
|
|
24
|
+
* so a connection never depends on another external vault.
|
|
25
|
+
*/
|
|
26
|
+
function useLocalSecretPicker(vaults) {
|
|
27
|
+
const [secretsByVault, setSecretsByVault] = useState({});
|
|
28
|
+
const loadSecrets = useCallback(async (vaultId) => {
|
|
29
|
+
try {
|
|
30
|
+
const secrets = await api.get(`/admin/vaults/${vaultId}/secrets`);
|
|
31
|
+
setSecretsByVault((prev) => ({ ...prev, [vaultId]: secrets }));
|
|
32
|
+
}
|
|
33
|
+
catch { /* the picker simply stays empty */ }
|
|
34
|
+
}, []);
|
|
35
|
+
return { vaults: vaults.filter((v) => v.type === 'local'), secretsByVault, onLoadSecrets: loadSecrets };
|
|
36
|
+
}
|
|
37
|
+
function errorMessage(err, fallback) {
|
|
38
|
+
return err instanceof Error && err.message ? err.message : fallback;
|
|
39
|
+
}
|
|
40
|
+
// ── Main page ──────────────────────────────────────────────────────────────────
|
|
41
|
+
export default function VaultPage() {
|
|
42
|
+
const qc = useQueryClient();
|
|
43
|
+
const toast = useToast();
|
|
44
|
+
const [selectedVaultId, setSelectedVaultId] = useState(null);
|
|
45
|
+
const [showCreateVault, setShowCreateVault] = useState(false);
|
|
46
|
+
const [showCreateSecret, setShowCreateSecret] = useState(false);
|
|
47
|
+
const [revealedSecret, setRevealedSecret] = useState(null);
|
|
48
|
+
const [revealing, setRevealing] = useState(null);
|
|
49
|
+
const [deleteVaultTarget, setDeleteVaultTarget] = useState(null);
|
|
50
|
+
const [deleteSecretTarget, setDeleteSecretTarget] = useState(null);
|
|
51
|
+
const [showConnection, setShowConnection] = useState(false);
|
|
52
|
+
const vaultsQuery = useQuery({
|
|
53
|
+
queryKey: ['vaults'],
|
|
54
|
+
queryFn: () => api.get('/admin/vaults'),
|
|
55
|
+
});
|
|
56
|
+
const vaults = vaultsQuery.data ?? [];
|
|
57
|
+
const secretsQuery = useQuery({
|
|
58
|
+
queryKey: ['vault-secrets', selectedVaultId],
|
|
59
|
+
queryFn: () => api.get(`/admin/vaults/${selectedVaultId}/secrets`),
|
|
60
|
+
enabled: selectedVaultId !== null,
|
|
61
|
+
});
|
|
62
|
+
const secrets = secretsQuery.data ?? [];
|
|
63
|
+
const deleteVault = useMutation({
|
|
64
|
+
mutationFn: (id) => api.delete(`/admin/vaults/${id}`),
|
|
65
|
+
onSuccess: (_, id) => {
|
|
66
|
+
const vault = vaults.find((v) => v.id === id);
|
|
67
|
+
toast.success(vault ? `Deleted vault "${vault.name}".` : 'Vault deleted.');
|
|
68
|
+
setDeleteVaultTarget(null);
|
|
69
|
+
qc.invalidateQueries({ queryKey: ['vaults'] });
|
|
70
|
+
if (selectedVaultId === id)
|
|
71
|
+
setSelectedVaultId(null);
|
|
72
|
+
},
|
|
73
|
+
onError: (err) => {
|
|
74
|
+
setDeleteVaultTarget(null);
|
|
75
|
+
toast.error(errorMessage(err, 'Failed to delete vault'));
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
const deleteSecret = useMutation({
|
|
79
|
+
mutationFn: ({ vaultId, secretId }) => api.delete(`/admin/vaults/${vaultId}/secrets/${secretId}`),
|
|
80
|
+
onSuccess: () => {
|
|
81
|
+
toast.success('Secret deleted.');
|
|
82
|
+
setDeleteSecretTarget(null);
|
|
83
|
+
qc.invalidateQueries({ queryKey: ['vault-secrets', selectedVaultId] });
|
|
84
|
+
},
|
|
85
|
+
onError: (err) => {
|
|
86
|
+
setDeleteSecretTarget(null);
|
|
87
|
+
toast.error(errorMessage(err, 'Failed to delete secret'));
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
const testConnection = useMutation({
|
|
91
|
+
mutationFn: (id) => api.post(`/admin/vaults/${id}/test`),
|
|
92
|
+
onSuccess: (res) => toast.success(res.ttlSeconds ? `Connected to HashiCorp Vault. Token valid for ${res.ttlSeconds} s.` : 'Connected to HashiCorp Vault.'),
|
|
93
|
+
onError: (err) => toast.error(`Connection failed: ${errorMessage(err, 'unknown error')}`),
|
|
94
|
+
});
|
|
95
|
+
async function handleReveal(secret) {
|
|
96
|
+
setRevealing(secret.id);
|
|
97
|
+
try {
|
|
98
|
+
const data = await api.get(`/admin/vaults/${secret.vaultId}/secrets/${secret.id}/reveal`);
|
|
99
|
+
setRevealedSecret(data);
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
toast.error(`Could not reveal "${secret.name}": ${errorMessage(err, 'unknown error')}`);
|
|
103
|
+
}
|
|
104
|
+
finally {
|
|
105
|
+
setRevealing(null);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
const selectedVault = vaults.find((v) => v.id === selectedVaultId);
|
|
109
|
+
return (_jsxs("div", { className: "flex flex-col md:flex-row h-full md:overflow-hidden fade-up", children: [_jsxs("aside", { "aria-label": "Vaults", className: "w-full md:w-64 flex flex-col shrink-0 md:overflow-y-auto border-b md:border-b-0 md:border-r", style: { borderColor: 'var(--m3-outline-variant)', background: 'var(--m3-surface-container-low)' }, children: [_jsxs("div", { className: "flex items-center justify-between px-4 py-4", style: { borderBottom: '1px solid var(--m3-outline-variant)' }, children: [_jsxs("div", { children: [_jsx("h1", { className: "font-headline font-bold text-base", style: { color: 'var(--m3-on-surface)' }, children: "Vaults" }), vaultsQuery.data && (_jsxs("p", { className: "text-xs mt-0.5", style: { color: 'var(--m3-secondary)' }, children: [vaults.length, " vault", vaults.length !== 1 ? 's' : ''] }))] }), _jsx("button", { type: "button", onClick: () => setShowCreateVault(true), className: "btn btn-primary btn-sm px-2", "aria-label": "Create vault", title: "Create vault", children: _jsx("span", { className: "material-symbols-outlined", "aria-hidden": "true", children: "add" }) })] }), _jsx("div", { className: "flex-1 p-2 space-y-1", children: vaultsQuery.isLoading ? (_jsx(LoadingState, { label: "Loading vaults\u2026", className: "py-6" })) : vaultsQuery.isError ? (_jsx(ErrorState, { message: "Could not load vaults.", onRetry: () => void vaultsQuery.refetch(), className: "px-3 py-6" })) : (_jsxs(_Fragment, { children: [vaults.map((vault) => (_jsx(VaultRow, { vault: vault, isSelected: selectedVaultId === vault.id, onClick: () => setSelectedVaultId(vault.id), onDelete: () => setDeleteVaultTarget(vault) }, vault.id))), vaults.length === 0 && (_jsx("p", { className: "text-xs text-center py-6", style: { color: 'var(--m3-secondary)' }, children: "No vaults yet" }))] })) })] }), _jsx("main", { className: "flex-1 flex flex-col md:overflow-hidden min-w-0", children: selectedVault ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-3 px-4 md:px-6 py-4 shrink-0", style: { borderBottom: '1px solid var(--m3-outline-variant)' }, children: [_jsxs("div", { className: "min-w-0", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "material-symbols-outlined", "aria-hidden": "true", style: { fontSize: '20px', color: 'var(--m3-primary)' }, children: VAULT_TYPE_ICONS[selectedVault.type] }), _jsx("h2", { className: "font-headline font-bold text-lg break-all", style: { color: 'var(--m3-on-surface)' }, children: selectedVault.name }), _jsx("span", { className: "text-[10px] px-2 py-0.5 rounded-full font-bold uppercase tracking-wide", style: { background: 'var(--m3-primary-fixed)', color: 'var(--m3-primary)' }, children: VAULT_TYPE_LABELS[selectedVault.type] })] }), selectedVault.description && (_jsx("p", { className: "text-sm mt-1", style: { color: 'var(--m3-secondary)' }, children: selectedVault.description }))] }), _jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [selectedVault.type === 'hashicorp' && (_jsxs(_Fragment, { children: [_jsxs("button", { type: "button", onClick: () => testConnection.mutate(selectedVault.id), disabled: testConnection.isPending, className: "btn btn-secondary", children: [_jsx("span", { className: "material-symbols-outlined", "aria-hidden": "true", children: "network_check" }), testConnection.isPending ? 'Testing…' : 'Test connection'] }), _jsxs("button", { type: "button", onClick: () => setShowConnection(true), className: "btn btn-secondary", children: [_jsx("span", { className: "material-symbols-outlined", "aria-hidden": "true", children: "settings" }), "Connection settings"] })] })), _jsxs("button", { type: "button", onClick: () => setShowCreateSecret(true), className: "btn btn-primary", children: [_jsx("span", { className: "material-symbols-outlined", "aria-hidden": "true", children: isReferenceVault(selectedVault.type) ? 'add_link' : 'add' }), isReferenceVault(selectedVault.type) ? 'Add Reference' : 'New Secret'] })] })] }), _jsx("div", { className: "flex-1 overflow-y-auto p-4 md:p-6", children: secretsQuery.isLoading ? (_jsx(LoadingState, { label: "Loading secrets\u2026" })) : secretsQuery.isError ? (_jsx(ErrorState, { message: "Could not load the secrets in this vault.", onRetry: () => void secretsQuery.refetch() })) : secrets.length === 0 ? (_jsx(EmptyState, { icon: "key_off", title: isReferenceVault(selectedVault.type) ? 'No references in this vault' : 'No secrets in this vault', description: isReferenceVault(selectedVault.type)
|
|
110
|
+
? _jsxs(_Fragment, { children: [_jsx(EmptyStateLink, { onClick: () => setShowCreateSecret(true), children: "Add a reference" }), " to a path in HashiCorp Vault that ", uiConfig().texts.secretConsumers, " can use. ", uiConfig().texts.appName, " only reads from HashiCorp Vault; it never creates or changes secrets there."] })
|
|
111
|
+
: _jsxs(_Fragment, { children: [_jsx(EmptyStateLink, { onClick: () => setShowCreateSecret(true), children: "Add a secret" }), " to store credentials, tokens or JSON configuration that ", uiConfig().texts.secretConsumers, " can reference."] }) })) : (_jsx("div", { className: "space-y-2", children: secrets.map((secret) => (_jsx(SecretRow, { secret: secret, isRevealing: revealing === secret.id, onReveal: () => handleReveal(secret), onDelete: () => setDeleteSecretTarget(secret) }, secret.id))) })) })] })) : (_jsxs("div", { className: "flex-1 flex flex-col items-center justify-center gap-3 py-16", style: { color: 'var(--m3-secondary)' }, children: [_jsx("span", { className: "material-symbols-outlined", "aria-hidden": "true", style: { fontSize: '56px', opacity: 0.3 }, children: "shield_lock" }), _jsx("p", { className: "text-sm", children: "Select a vault to view its secrets" })] })) }), showCreateVault && (_jsx(CreateVaultModal, { vaults: vaults, onClose: () => setShowCreateVault(false), onCreated: (v) => { qc.invalidateQueries({ queryKey: ['vaults'] }); setSelectedVaultId(v.id); setShowCreateVault(false); toast.success(`Created vault "${v.name}".`); } })), showCreateSecret && selectedVaultId !== null && (_jsx(CreateSecretModal, { vaultId: selectedVaultId, vaultType: selectedVault?.type ?? 'local', onClose: () => setShowCreateSecret(false), onCreated: () => { qc.invalidateQueries({ queryKey: ['vault-secrets', selectedVaultId] }); setShowCreateSecret(false); toast.success('Secret saved.'); } })), showConnection && selectedVault?.type === 'hashicorp' && (_jsx(ConnectionSettingsModal, { vaultId: selectedVault.id, vaults: vaults, onClose: () => setShowConnection(false), onSaved: () => { qc.invalidateQueries({ queryKey: ['vaults'] }); setShowConnection(false); toast.success('Connection settings saved.'); } })), revealedSecret && (_jsx(RevealModal, { secret: revealedSecret, onClose: () => setRevealedSecret(null) })), deleteVaultTarget && (_jsx(DeleteVaultModal, { vault: deleteVaultTarget, secretCount: deleteVaultTarget.id === selectedVaultId && secretsQuery.data ? secrets.length : null, pending: deleteVault.isPending, onClose: () => setDeleteVaultTarget(null), onConfirm: () => deleteVault.mutate(deleteVaultTarget.id) })), deleteSecretTarget && (_jsx(ConfirmModal, { title: "Delete secret", message: `Delete secret "${deleteSecretTarget.name}"? This action cannot be undone.`, confirmLabel: "Delete", pending: deleteSecret.isPending, pendingLabel: "Deleting\u2026", onConfirm: () => deleteSecret.mutate({ vaultId: deleteSecretTarget.vaultId, secretId: deleteSecretTarget.id }), onCancel: () => setDeleteSecretTarget(null) }))] }));
|
|
112
|
+
}
|
|
113
|
+
// ── Vault row ──────────────────────────────────────────────────────────────────
|
|
114
|
+
function VaultRow({ vault, isSelected, onClick, onDelete }) {
|
|
115
|
+
return (_jsxs("div", { className: `group flex items-center gap-1 rounded-xl transition-colors ${isSelected ? '' : 'hover:bg-[var(--m3-surface-container)]'}`, style: {
|
|
116
|
+
background: isSelected ? 'var(--m3-surface-container-lowest)' : undefined,
|
|
117
|
+
boxShadow: isSelected ? '0 1px 4px rgba(19,27,46,0.08)' : 'none',
|
|
118
|
+
}, children: [_jsxs("button", { type: "button", onClick: onClick, "aria-current": isSelected ? 'true' : undefined, className: "flex-1 min-w-0 flex items-center gap-3 px-3 py-2.5 rounded-xl text-left focus-ring", children: [_jsx("span", { className: "material-symbols-outlined shrink-0", "aria-hidden": "true", style: { fontSize: '18px', color: isSelected ? 'var(--m3-primary)' : 'var(--m3-secondary)', fontVariationSettings: isSelected ? "'FILL' 1" : "'FILL' 0" }, children: VAULT_TYPE_ICONS[vault.type] }), _jsxs("span", { className: "flex-1 min-w-0", children: [_jsx("span", { className: "block text-sm font-medium truncate", style: { color: 'var(--m3-on-surface)' }, children: vault.name }), vault.description && (_jsx("span", { className: "block text-[10px] truncate", style: { color: 'var(--m3-secondary)' }, children: vault.description }))] })] }), _jsx("button", { type: "button", onClick: onDelete, "aria-label": `Delete vault ${vault.name}`, title: "Delete vault", className: "btn-icon w-7 h-7 mr-1.5 shrink-0 opacity-100 md:opacity-0 md:group-hover:opacity-100 md:group-focus-within:opacity-100 hover:!text-[color:var(--m3-down)]", children: _jsx("span", { className: "material-symbols-outlined", "aria-hidden": "true", style: { fontSize: '16px' }, children: "close" }) })] }));
|
|
119
|
+
}
|
|
120
|
+
// ── Secret row ─────────────────────────────────────────────────────────────────
|
|
121
|
+
const TYPE_LABELS = { userpass: 'User/Pass', value: 'Value', json: 'JSON' };
|
|
122
|
+
const TYPE_ICONS = { userpass: 'person', value: 'key', json: 'data_object' };
|
|
123
|
+
function SecretRow({ secret, isRevealing, onReveal, onDelete }) {
|
|
124
|
+
return (_jsxs("div", { className: "flex flex-wrap items-center gap-x-4 gap-y-2 px-4 py-3 rounded-xl", style: { background: 'var(--m3-surface-container)', border: '1px solid var(--m3-outline-variant)' }, children: [_jsx("span", { className: "material-symbols-outlined shrink-0", "aria-hidden": "true", style: { fontSize: '20px', color: 'var(--m3-secondary)' }, children: TYPE_ICONS[secret.type] ?? 'key' }), _jsxs("div", { className: "flex-1 min-w-0", children: [_jsx("p", { className: "text-sm font-semibold break-all", style: { color: 'var(--m3-on-surface)' }, children: secret.name }), _jsxs("p", { className: "text-xs mt-0.5", style: { color: 'var(--m3-secondary)' }, children: [TYPE_LABELS[secret.type], " \u00B7 Updated ", formatDate(secret.updatedAt)] })] }), _jsxs("div", { className: "flex items-center gap-2 shrink-0", children: [_jsxs("button", { type: "button", onClick: onReveal, disabled: isRevealing, className: "btn btn-secondary btn-sm", children: [_jsx("span", { className: `material-symbols-outlined ${isRevealing ? 'animate-spin' : ''}`, "aria-hidden": "true", children: isRevealing ? 'progress_activity' : 'visibility' }), isRevealing ? 'Loading…' : 'Reveal'] }), _jsx("button", { type: "button", onClick: onDelete, "aria-label": `Delete secret ${secret.name}`, title: "Delete secret", className: "btn-icon hover:!text-[color:var(--m3-down)]", children: _jsx("span", { className: "material-symbols-outlined", "aria-hidden": "true", style: { fontSize: '16px' }, children: "delete" }) })] })] }));
|
|
125
|
+
}
|
|
126
|
+
// ── Delete Vault modal (with checkbox when secrets exist) ─────────────────────
|
|
127
|
+
function DeleteVaultModal({ vault, secretCount, pending, onClose, onConfirm }) {
|
|
128
|
+
const hasSecrets = secretCount === null || secretCount > 0;
|
|
129
|
+
const isReference = isReferenceVault(vault.type);
|
|
130
|
+
const [confirmed, setConfirmed] = useState(false);
|
|
131
|
+
return (_jsx(ModalShell, { onClose: pending ? undefined : onClose, children: _jsxs("div", { role: "dialog", "aria-modal": "true", "aria-label": "Delete vault", "aria-busy": pending || undefined, className: "rounded-2xl w-full max-w-sm", style: { background: 'var(--m3-surface-container-low)', border: '1px solid var(--m3-outline-variant)' }, children: [_jsx(ModalHeader, { icon: "warning", title: "Delete vault", onClose: pending ? () => { } : onClose }), _jsxs("div", { className: "p-6 space-y-4", children: [_jsxs("p", { className: "text-sm", style: { color: 'var(--m3-on-surface-variant)' }, children: ["You are about to delete ", _jsx("span", { className: "font-semibold", style: { color: 'var(--m3-on-surface)' }, children: vault.name }), "."] }), hasSecrets && (_jsxs("div", { className: "rounded-xl px-4 py-3 space-y-3", style: { background: 'var(--m3-error-container)' }, children: [_jsx("p", { className: "text-sm font-medium", style: { color: 'var(--m3-on-error-container)' }, children: isReference
|
|
132
|
+
? (secretCount !== null && secretCount > 0
|
|
133
|
+
? `This vault contains ${secretCount} reference${secretCount !== 1 ? 's' : ''}. They will be removed from ${uiConfig().texts.appName}. Nothing is deleted in HashiCorp Vault.`
|
|
134
|
+
: `This vault may contain references. They will be removed from ${uiConfig().texts.appName}. Nothing is deleted in HashiCorp Vault.`)
|
|
135
|
+
: (secretCount !== null && secretCount > 0
|
|
136
|
+
? `This vault contains ${secretCount} secret${secretCount !== 1 ? 's' : ''}. All secrets will be permanently deleted.`
|
|
137
|
+
: 'This vault may contain secrets. All secrets will be permanently deleted.') }), _jsxs("label", { className: "flex items-center gap-2.5 cursor-pointer select-none", children: [_jsx("input", { type: "checkbox", checked: confirmed, disabled: pending, onChange: (e) => setConfirmed(e.target.checked), className: "w-4 h-4 rounded" }), _jsx("span", { className: "text-sm font-medium", style: { color: 'var(--m3-on-error-container)' }, children: isReference ? 'I understand the references will be removed' : 'I understand all secrets will be permanently deleted' })] })] }))] }), _jsxs(ModalFooter, { children: [_jsx("button", { type: "button", onClick: onClose, disabled: pending, className: "btn btn-secondary", children: "Cancel" }), _jsx("button", { type: "button", onClick: onConfirm, disabled: pending || (hasSecrets && !confirmed), className: "btn btn-danger", children: pending ? 'Deleting…' : 'Delete vault' })] })] }) }));
|
|
138
|
+
}
|
|
139
|
+
// ── Create Vault modal ─────────────────────────────────────────────────────────
|
|
140
|
+
function CreateVaultModal({ vaults, onClose, onCreated }) {
|
|
141
|
+
const [name, setName] = useState('');
|
|
142
|
+
const [description, setDescription] = useState('');
|
|
143
|
+
const [type, setType] = useState('local');
|
|
144
|
+
const [connection, setConnection] = useState(EMPTY_CONNECTION);
|
|
145
|
+
const [error, setError] = useState('');
|
|
146
|
+
const [loading, setLoading] = useState(false);
|
|
147
|
+
const test = useConnectionTest(connection);
|
|
148
|
+
const pickers = useLocalSecretPicker(vaults);
|
|
149
|
+
async function handleSubmit(e) {
|
|
150
|
+
e.preventDefault();
|
|
151
|
+
setError('');
|
|
152
|
+
setLoading(true);
|
|
153
|
+
try {
|
|
154
|
+
const vault = await api.post('/admin/vaults', {
|
|
155
|
+
name,
|
|
156
|
+
description: description || undefined,
|
|
157
|
+
...(type === 'hashicorp' ? { type, connection: connectionPayload(connection) } : {}),
|
|
158
|
+
});
|
|
159
|
+
onCreated(vault);
|
|
160
|
+
}
|
|
161
|
+
catch (err) {
|
|
162
|
+
setError(errorMessage(err, 'Failed to create vault'));
|
|
163
|
+
}
|
|
164
|
+
finally {
|
|
165
|
+
setLoading(false);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
const hashicorp = type === 'hashicorp';
|
|
169
|
+
return (_jsxs(ConnectionDialog, { title: "Create Vault", icon: "shield_lock", onClose: onClose, onSubmit: handleSubmit, advanced: hashicorp ? { connection, onChange: setConnection } : null, footer: _jsx(ModalActions, { onClose: onClose, loading: loading, submitLabel: "Create Vault", test: hashicorp ? test : undefined }), children: [error && _jsx(Alert, { tone: "error", children: error }), _jsx(Field, { label: "Vault name", required: true, children: _jsx("input", { value: name, onChange: (e) => setName(e.target.value), required: true, className: "input-sig", placeholder: "My Credentials", autoFocus: true }) }), _jsx(Field, { label: "Description (optional)", children: _jsx("input", { value: description, onChange: (e) => setDescription(e.target.value), className: "input-sig", placeholder: "What this vault stores\u2026" }) }), _jsx(VaultTypePicker, { value: type, onChange: setType }), hashicorp && _jsx(ConnectionFields, { value: connection, onChange: setConnection, pickers: pickers }), hashicorp && test.result && _jsx(Alert, { tone: test.result.ok ? 'success' : 'error', children: test.result.text })] }));
|
|
170
|
+
}
|
|
171
|
+
// ── Create Secret modal ────────────────────────────────────────────────────────
|
|
172
|
+
function CreateSecretModal({ vaultId, vaultType, onClose, onCreated }) {
|
|
173
|
+
const [name, setName] = useState('');
|
|
174
|
+
const [path, setPath] = useState('');
|
|
175
|
+
const [secretKey, setSecretKey] = useState('');
|
|
176
|
+
const isReference = isReferenceVault(vaultType);
|
|
177
|
+
const [type, setType] = useState('userpass');
|
|
178
|
+
const [username, setUsername] = useState('');
|
|
179
|
+
const [password, setPassword] = useState('');
|
|
180
|
+
const [value, setValue] = useState('');
|
|
181
|
+
const [json, setJson] = useState('');
|
|
182
|
+
const [jsonError, setJsonError] = useState('');
|
|
183
|
+
const [error, setError] = useState('');
|
|
184
|
+
const [loading, setLoading] = useState(false);
|
|
185
|
+
const typeLabelId = useId();
|
|
186
|
+
function validateJson(v) {
|
|
187
|
+
try {
|
|
188
|
+
JSON.parse(v);
|
|
189
|
+
setJsonError('');
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
setJsonError('Invalid JSON');
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
async function handleSubmit(e) {
|
|
196
|
+
e.preventDefault();
|
|
197
|
+
if (type === 'json' && jsonError)
|
|
198
|
+
return;
|
|
199
|
+
setError('');
|
|
200
|
+
setLoading(true);
|
|
201
|
+
try {
|
|
202
|
+
const body = { name, type };
|
|
203
|
+
if (isReference) {
|
|
204
|
+
body['path'] = path;
|
|
205
|
+
if (type === 'value')
|
|
206
|
+
body['key'] = secretKey;
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
if (type === 'userpass')
|
|
210
|
+
body['userpass'] = { username, password };
|
|
211
|
+
if (type === 'value')
|
|
212
|
+
body['value'] = value;
|
|
213
|
+
if (type === 'json')
|
|
214
|
+
body['json'] = json;
|
|
215
|
+
}
|
|
216
|
+
await api.post(`/admin/vaults/${vaultId}/secrets`, body);
|
|
217
|
+
onCreated();
|
|
218
|
+
}
|
|
219
|
+
catch (err) {
|
|
220
|
+
setError(errorMessage(err, 'Failed to create secret'));
|
|
221
|
+
}
|
|
222
|
+
finally {
|
|
223
|
+
setLoading(false);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
const types = [
|
|
227
|
+
{ value: 'userpass', label: 'User / Password', desc: 'Username + password pair' },
|
|
228
|
+
{ value: 'value', label: 'Secure Value', desc: 'Token, connection string…' },
|
|
229
|
+
{ value: 'json', label: 'JSON', desc: 'Arbitrary JSON object' },
|
|
230
|
+
];
|
|
231
|
+
return (_jsx(Modal, { title: isReference ? 'Add Secret Reference' : 'New Secret', icon: isReference ? 'link' : 'key', onClose: onClose, flush: true, children: _jsxs("form", { onSubmit: handleSubmit, children: [_jsxs("div", { className: "p-6 space-y-4", children: [error && _jsx(Alert, { tone: "error", children: error }), isReference && _jsxs(Alert, { tone: "info", children: ["This only points at a secret that already exists in HashiCorp Vault. ", uiConfig().texts.appName, " reads it when needed and never creates, changes or deletes anything there."] }), _jsx(Field, { label: isReference ? 'Reference name' : 'Secret name', required: true, children: _jsx("input", { value: name, onChange: (e) => setName(e.target.value), required: true, className: "input-sig", placeholder: "my-api-key", autoFocus: true }) }), _jsxs("div", { role: "group", "aria-labelledby": typeLabelId, children: [_jsx("p", { id: typeLabelId, className: "block font-mono text-xs uppercase tracking-wider mb-2", style: { color: 'var(--m3-secondary)' }, children: "Type" }), _jsx("div", { className: "grid grid-cols-1 sm:grid-cols-3 gap-2", children: types.map((t) => (_jsxs("button", { type: "button", "aria-pressed": type === t.value, onClick: () => setType(t.value), className: `px-3 py-2.5 rounded-xl text-left transition-all focus-ring ${type === t.value ? 'selection-active' : ''}`, style: { background: 'var(--m3-surface-container)', color: 'var(--m3-secondary)', border: '1px solid var(--m3-outline-variant)' }, children: [_jsx("span", { className: "block text-xs font-bold", children: t.label }), _jsx("span", { className: "block text-[10px] mt-0.5 opacity-80", children: t.desc })] }, t.value))) })] }), isReference && (_jsxs(_Fragment, { children: [_jsx(Field, { label: "Path", required: true, hint: type === 'userpass' ? 'Reads the keys "username" and "password" at this path.' : type === 'json' ? 'Reads every key at this path.' : 'Path of the KV v2 secret, relative to the mount.', children: _jsx("input", { value: path, onChange: (e) => setPath(e.target.value), required: true, className: "input-sig font-mono", placeholder: uiConfig().texts.vaultPathExample, autoComplete: "off" }) }), type === 'value' && (_jsx(Field, { label: "Key", required: true, children: _jsx("input", { value: secretKey, onChange: (e) => setSecretKey(e.target.value), required: true, className: "input-sig font-mono", placeholder: "api_key", autoComplete: "off" }) }))] })), !isReference && type === 'userpass' && (_jsxs(_Fragment, { children: [_jsx(Field, { label: "Username", required: true, children: _jsx("input", { value: username, onChange: (e) => setUsername(e.target.value), required: true, className: "input-sig", placeholder: "admin", autoComplete: "off" }) }), _jsx(Field, { label: "Password", required: true, children: _jsx("input", { type: "password", value: password, onChange: (e) => setPassword(e.target.value), required: true, className: "input-sig", placeholder: "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022", autoComplete: "new-password" }) })] })), !isReference && type === 'value' && (_jsx(Field, { label: "Value", required: true, children: _jsx("input", { value: value, onChange: (e) => setValue(e.target.value), required: true, className: "input-sig", placeholder: "Bearer eyJ\u2026", autoComplete: "off" }) })), !isReference && type === 'json' && (_jsx(Field, { label: "JSON", required: true, error: jsonError || undefined, children: _jsx("textarea", { value: json, onChange: (e) => { setJson(e.target.value); validateJson(e.target.value); }, required: true, rows: 5, className: "input-sig font-mono text-xs resize-none", placeholder: '{\n "key": "value"\n}', style: { borderColor: jsonError ? 'var(--m3-error)' : undefined } }) }))] }), _jsx(ModalActions, { onClose: onClose, loading: loading, submitLabel: isReference ? 'Save Reference' : 'Save Secret' })] }) }));
|
|
232
|
+
}
|
|
233
|
+
// ── HashiCorp connection ───────────────────────────────────────────────────────
|
|
234
|
+
/** Fields that decide where credentials are sent. */
|
|
235
|
+
const TARGET_FIELDS = ['address', 'namespace', 'mount', 'authMethod', 'approleMount', 'caCert'];
|
|
236
|
+
const DEFAULT_MOUNT = 'secret';
|
|
237
|
+
const DEFAULT_APPROLE_MOUNT = 'approle';
|
|
238
|
+
/** The fields every connection needs; the rarely changed options live in the side panel (`ConnectionAdvanced`). */
|
|
239
|
+
function ConnectionFields({ value, onChange, pickers, keepHint }) {
|
|
240
|
+
const set = (patch) => onChange({ ...value, ...patch });
|
|
241
|
+
const authLabelId = useId();
|
|
242
|
+
const credentialHint = keepHint ? 'Leave blank to keep the saved value. Re-enter it when you change the address, namespace, mount, CA certificate or auth method.' : undefined;
|
|
243
|
+
const insecure = value.address.trim().toLowerCase().startsWith('http://');
|
|
244
|
+
return (_jsxs("div", { className: "space-y-4", children: [_jsx(Field, { label: "Address", required: true, children: _jsx("input", { type: "url", value: value.address, onChange: (e) => set({ address: e.target.value }), required: true, className: "input-sig font-mono", placeholder: "https://vault.example.com:8200", autoComplete: "off" }) }), insecure && _jsx(Alert, { tone: "warning", children: "The token is sent unencrypted over http://. Use https:// unless Vault is on a trusted private network." }), _jsxs("div", { role: "group", "aria-labelledby": authLabelId, children: [_jsx("p", { id: authLabelId, className: "block font-mono text-xs uppercase tracking-wider mb-2", style: { color: 'var(--m3-secondary)' }, children: "Auth method" }), _jsx("div", { className: "flex gap-2", children: ['token', 'approle'].map((method) => (_jsx("button", { type: "button", "aria-pressed": value.authMethod === method, onClick: () => set({ authMethod: method, credentialsRef: undefined }), className: `flex-1 px-3 py-2 rounded-lg text-sm font-medium focus-ring ${value.authMethod === method ? 'selection-active' : ''}`, style: { border: '1px solid var(--m3-outline-variant)' }, children: method === 'token' ? 'Token' : 'AppRole' }, method))) })] }), _jsx(CredentialSection, { ...pickers, vault: value.credentialsRef, onVaultChange: (credentialsRef) => set({ credentialsRef }), mappingFields: value.authMethod === 'token' ? [{ key: 'token', label: 'Token' }] : [{ key: 'roleId', label: 'Role ID' }, { key: 'secretId', label: 'Secret ID' }], secretTypes: value.authMethod === 'token' ? ['value', 'json'] : ['userpass', 'json'], valueLabel: "token", userpassNote: "The username is used as the Role ID and the password as the Secret ID.", note: value.authMethod === 'token'
|
|
245
|
+
? 'Read the token from a local vault secret.'
|
|
246
|
+
: 'Read the Role ID and Secret ID from a local vault secret.', children: value.authMethod === 'token' ? (_jsx(Field, { label: "Token", required: !keepHint, hint: credentialHint, children: _jsx("input", { type: "password", value: value.token, onChange: (e) => set({ token: e.target.value }), required: !keepHint, className: "input-sig font-mono", autoComplete: "new-password" }) })) : (_jsxs(_Fragment, { children: [_jsx(Field, { label: "Role ID", required: true, children: _jsx("input", { value: value.roleId, onChange: (e) => set({ roleId: e.target.value }), required: true, className: "input-sig font-mono", autoComplete: "off" }) }), _jsx(Field, { label: "Secret ID", required: !keepHint, hint: credentialHint, children: _jsx("input", { type: "password", value: value.secretId, onChange: (e) => set({ secretId: e.target.value }), required: !keepHint, className: "input-sig font-mono", autoComplete: "new-password" }) })] })) })] }));
|
|
247
|
+
}
|
|
248
|
+
/** Options that rarely change from their defaults: namespace, mounts and the CA certificate. */
|
|
249
|
+
function ConnectionAdvanced({ value, onChange }) {
|
|
250
|
+
const set = (patch) => onChange({ ...value, ...patch });
|
|
251
|
+
return (_jsxs("div", { className: "space-y-4", children: [_jsx(Field, { label: "Namespace (optional)", children: _jsx("input", { value: value.namespace, onChange: (e) => set({ namespace: e.target.value }), className: "input-sig font-mono", placeholder: "team-a", autoComplete: "off" }) }), _jsx(Field, { label: "KV v2 mount", required: true, children: _jsx("input", { value: value.mount, onChange: (e) => set({ mount: e.target.value }), required: true, className: "input-sig font-mono", placeholder: DEFAULT_MOUNT, autoComplete: "off" }) }), value.authMethod === 'approle' && (_jsx(Field, { label: "AppRole mount", children: _jsx("input", { value: value.approleMount, onChange: (e) => set({ approleMount: e.target.value }), className: "input-sig font-mono", placeholder: DEFAULT_APPROLE_MOUNT, autoComplete: "off" }) })), _jsx(Field, { label: "CA certificate (optional)", hint: "PEM. Only for a private CA; include the full chain.", children: _jsx("textarea", { value: value.caCert, onChange: (e) => set({ caCert: e.target.value }), rows: 5, className: "input-sig font-mono text-xs resize-none", placeholder: "-----BEGIN CERTIFICATE-----" }) })] }));
|
|
252
|
+
}
|
|
253
|
+
const ADVANCED_META = { icon: 'tune', label: 'Connection options' };
|
|
254
|
+
/** Number of options in the side panel that differ from their defaults, shown as the tab badge. */
|
|
255
|
+
function advancedCount(c) {
|
|
256
|
+
return [
|
|
257
|
+
c.namespace.trim() !== '',
|
|
258
|
+
c.mount.trim() !== DEFAULT_MOUNT,
|
|
259
|
+
c.authMethod === 'approle' && c.approleMount.trim() !== DEFAULT_APPROLE_MOUNT,
|
|
260
|
+
c.caCert.trim() !== '',
|
|
261
|
+
].filter(Boolean).length;
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* A modal form with the connection options in a collapsible side panel.
|
|
265
|
+
* Without `advanced` (a local vault) it is a plain narrow dialog with no tab strip.
|
|
266
|
+
*/
|
|
267
|
+
function ConnectionDialog({ title, icon, onClose, onSubmit, advanced, footer, children }) {
|
|
268
|
+
const hasAdvanced = advanced !== null;
|
|
269
|
+
// Open whenever the dialog has connection options, since they include a required field.
|
|
270
|
+
const [open, setOpen] = useState(hasAdvanced);
|
|
271
|
+
useEffect(() => setOpen(hasAdvanced), [hasAdvanced]);
|
|
272
|
+
const showPanel = open && advanced !== null;
|
|
273
|
+
const count = advanced ? advancedCount(advanced.connection) : 0;
|
|
274
|
+
return (_jsx(ModalShell, { align: "top", onClose: onClose, label: title, children: _jsxs("div", { className: "rounded-2xl my-8 flex flex-col lg:flex-row", style: {
|
|
275
|
+
width: showPanel ? 'min(900px, calc(100vw - 32px))' : advanced ? 'min(492px, calc(100vw - 32px))' : 'min(448px, calc(100vw - 32px))',
|
|
276
|
+
background: 'var(--m3-surface-container-low)',
|
|
277
|
+
border: '1px solid var(--m3-outline-variant)',
|
|
278
|
+
transition: 'width 0.2s ease',
|
|
279
|
+
}, children: [_jsxs("div", { className: `flex-none min-w-0 w-full ${showPanel ? 'lg:w-[460px]' : advanced ? 'lg:w-[calc(100%-44px)]' : 'lg:w-full'}`, children: [_jsx(ModalHeader, { icon: icon, title: title, onClose: onClose }), _jsxs("form", { onSubmit: onSubmit, children: [_jsx("div", { className: "p-6 space-y-4", children: children }), footer] })] }), showPanel && (_jsx(SidePanelFrame, { meta: ADVANCED_META, layout: "responsive", children: _jsx(ConnectionAdvanced, { value: advanced.connection, onChange: advanced.onChange }) })), advanced && (_jsx(SideTabStrip, { tabs: [{ key: 'advanced', badge: count > 0 ? String(count) : null }], meta: { advanced: ADVANCED_META }, active: open ? 'advanced' : null, onToggle: (key) => setOpen(key !== null), layout: "responsive" }))] }) }));
|
|
280
|
+
}
|
|
281
|
+
function ConnectionSettingsModal({ vaultId, vaults, onClose, onSaved }) {
|
|
282
|
+
const [form, setForm] = useState(null);
|
|
283
|
+
const [error, setError] = useState('');
|
|
284
|
+
const [loading, setLoading] = useState(false);
|
|
285
|
+
const query = useQuery({
|
|
286
|
+
queryKey: ['vault-connection', vaultId],
|
|
287
|
+
queryFn: () => api.get(`/admin/vaults/${vaultId}`),
|
|
288
|
+
gcTime: 0,
|
|
289
|
+
});
|
|
290
|
+
const saved = query.data?.connection;
|
|
291
|
+
const current = form ?? (saved ? { ...EMPTY_CONNECTION, ...saved, credentialsRef: saved.credentialsRef ? { fieldMapping: {}, ...saved.credentialsRef } : undefined, token: '', secretId: '' } : null);
|
|
292
|
+
const pickers = useLocalSecretPicker(vaults);
|
|
293
|
+
const savedVaultId = saved?.credentialsRef?.vaultId;
|
|
294
|
+
const { onLoadSecrets } = pickers;
|
|
295
|
+
useEffect(() => { if (savedVaultId)
|
|
296
|
+
void onLoadSecrets(savedVaultId); }, [savedVaultId, onLoadSecrets]);
|
|
297
|
+
// The saved secret must not follow a changed target to a new server: the admin picks it again, as typed credentials are.
|
|
298
|
+
const change = (next) => {
|
|
299
|
+
const moved = current !== null && TARGET_FIELDS.some((f) => next[f] !== current[f]);
|
|
300
|
+
setForm(moved && next.credentialsRef === current?.credentialsRef ? { ...next, credentialsRef: undefined } : next);
|
|
301
|
+
};
|
|
302
|
+
const hasSavedDirect = !!current && (current.authMethod === 'token' ? saved?.hasToken : saved?.hasSecretId) === true;
|
|
303
|
+
const test = useConnectionTest(current ?? EMPTY_CONNECTION, vaultId);
|
|
304
|
+
async function handleSubmit(e) {
|
|
305
|
+
e.preventDefault();
|
|
306
|
+
if (!current)
|
|
307
|
+
return;
|
|
308
|
+
setError('');
|
|
309
|
+
setLoading(true);
|
|
310
|
+
try {
|
|
311
|
+
await api.patch(`/admin/vaults/${vaultId}`, { connection: connectionPayload(current) });
|
|
312
|
+
onSaved();
|
|
313
|
+
}
|
|
314
|
+
catch (err) {
|
|
315
|
+
setError(errorMessage(err, 'Failed to save connection settings'));
|
|
316
|
+
}
|
|
317
|
+
finally {
|
|
318
|
+
setLoading(false);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
if (!current) {
|
|
322
|
+
return (_jsx(Modal, { title: "Connection settings", icon: "settings", onClose: onClose, children: query.isError
|
|
323
|
+
? _jsx(ErrorState, { message: "Could not load the connection settings.", onRetry: () => void query.refetch() })
|
|
324
|
+
: _jsx(LoadingState, { label: "Loading\u2026" }) }));
|
|
325
|
+
}
|
|
326
|
+
return (_jsxs(ConnectionDialog, { title: "Connection settings", icon: "settings", onClose: onClose, onSubmit: handleSubmit, advanced: { connection: current, onChange: change }, footer: _jsx(ModalActions, { onClose: onClose, loading: loading, submitLabel: "Save", test: test }), children: [error && _jsx(Alert, { tone: "error", children: error }), _jsx(ConnectionFields, { value: current, onChange: change, pickers: pickers, keepHint: hasSavedDirect }), test.result && _jsx(Alert, { tone: test.result.ok ? 'success' : 'error', children: test.result.text })] }));
|
|
327
|
+
}
|
|
328
|
+
// ── Reveal modal ───────────────────────────────────────────────────────────────
|
|
329
|
+
/** Pretty-prints stored JSON; falls back to the raw text when it cannot be parsed so the modal never crashes. */
|
|
330
|
+
function formatJson(raw) {
|
|
331
|
+
try {
|
|
332
|
+
return { text: JSON.stringify(JSON.parse(raw), null, 2), valid: true };
|
|
333
|
+
}
|
|
334
|
+
catch {
|
|
335
|
+
return { text: raw, valid: false };
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
function RevealModal({ secret, onClose }) {
|
|
339
|
+
const [showPassword, setShowPassword] = useState(false);
|
|
340
|
+
const json = secret.type === 'json' ? formatJson(secret.value.value ?? '{}') : null;
|
|
341
|
+
return (_jsxs(Modal, { title: secret.name, icon: TYPE_ICONS[secret.type] ?? 'key', onClose: onClose, flush: true, children: [_jsxs("div", { className: "p-6 space-y-3", children: [_jsx("div", { className: "flex items-center gap-2", children: _jsx("span", { className: "text-[10px] uppercase tracking-wider font-bold px-2 py-0.5 rounded-full", style: { background: 'var(--m3-surface-container-high)', color: 'var(--m3-secondary)' }, children: TYPE_LABELS[secret.type] }) }), secret.source && (_jsxs("p", { className: "text-xs font-mono break-all", style: { color: 'var(--m3-secondary)' }, children: ["Source: ", secret.source.path, secret.source.key ? ` (${secret.source.key})` : ''] })), secret.type === 'userpass' && (_jsxs(_Fragment, { children: [_jsx(RevealField, { label: "Username", value: secret.value.username ?? '', mono: true }), _jsx(RevealField, { label: "Password", value: secret.value.password ?? '', hidden: !showPassword, mono: true, action: _jsx("button", { type: "button", onClick: () => setShowPassword((p) => !p), "aria-pressed": showPassword, className: "btn btn-ghost btn-sm py-1 text-xs", children: showPassword ? 'Hide' : 'Show' }) })] })), (secret.type === 'value') && (_jsx(RevealField, { label: "Value", value: secret.value.value ?? '', mono: true })), json && (_jsxs("div", { children: [_jsxs("div", { className: "flex items-center justify-between mb-1.5", children: [_jsx("p", { className: "text-[10px] uppercase tracking-wider", style: { color: 'var(--m3-secondary)' }, children: "JSON" }), _jsx(CopyButton, { value: json.text, iconOnly: true })] }), !json.valid && (_jsx(Alert, { tone: "warning", className: "mb-2", children: "The stored value is not valid JSON; showing it as plain text." })), _jsx("pre", { className: "text-xs p-3 rounded-xl overflow-auto max-h-64", style: { background: 'var(--m3-surface-container-high)', color: 'var(--m3-on-surface)', fontFamily: 'monospace' }, children: json.text })] }))] }), _jsx(ModalFooter, { children: _jsx("button", { type: "button", onClick: onClose, className: "btn btn-secondary", children: "Close" }) })] }));
|
|
342
|
+
}
|
|
343
|
+
function RevealField({ label, value, mono, hidden, action }) {
|
|
344
|
+
return (_jsxs("div", { children: [_jsxs("div", { className: "flex items-center justify-between mb-1", children: [_jsx("p", { className: "text-[10px] uppercase tracking-wider", style: { color: 'var(--m3-secondary)' }, children: label }), action] }), _jsxs("div", { className: "px-3 py-2 rounded-xl flex items-center justify-between gap-2", style: { background: 'var(--m3-surface-container-high)' }, children: [_jsx("span", { className: `text-sm flex-1 break-all ${mono ? 'font-mono' : ''}`, style: { color: 'var(--m3-on-surface)', filter: hidden ? 'blur(6px)' : 'none', userSelect: hidden ? 'none' : undefined }, children: value || '(empty)' }), !hidden && _jsx(CopyButton, { value: value, label: `Copy ${label.toLowerCase()}`, iconOnly: true })] })] }));
|
|
345
|
+
}
|
|
346
|
+
// ── Shared primitives ──────────────────────────────────────────────────────────
|
|
347
|
+
/** Tests the connection form as it is filled in, before it is saved. */
|
|
348
|
+
function useConnectionTest(connection, vaultId) {
|
|
349
|
+
const [result, setResult] = useState(null);
|
|
350
|
+
const [pending, setPending] = useState(false);
|
|
351
|
+
async function run() {
|
|
352
|
+
setPending(true);
|
|
353
|
+
setResult(null);
|
|
354
|
+
try {
|
|
355
|
+
const res = await api.post('/admin/vaults/test-connection', { vaultId, connection: connectionPayload(connection) });
|
|
356
|
+
setResult({ ok: true, text: res.ttlSeconds ? `Connected. Token valid for ${res.ttlSeconds} s.` : 'Connected.' });
|
|
357
|
+
}
|
|
358
|
+
catch (err) {
|
|
359
|
+
setResult({ ok: false, text: `Connection failed: ${errorMessage(err, 'unknown error')}` });
|
|
360
|
+
}
|
|
361
|
+
finally {
|
|
362
|
+
setPending(false);
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
return { result, pending, run };
|
|
366
|
+
}
|
|
367
|
+
function ModalActions({ onClose, loading, submitLabel, test }) {
|
|
368
|
+
return (_jsxs(ModalFooter, { start: test ? (_jsx("button", { type: "button", onClick: () => void test.run(), disabled: test.pending || loading, className: "btn btn-outline", children: test.pending
|
|
369
|
+
? _jsxs(_Fragment, { children: [_jsx("span", { className: "material-symbols-outlined animate-spin", "aria-hidden": "true", children: "progress_activity" }), " Testing\u2026"] })
|
|
370
|
+
: _jsxs(_Fragment, { children: [_jsx("span", { className: "material-symbols-outlined", "aria-hidden": "true", children: "network_check" }), " Test connection"] }) })) : undefined, children: [_jsx("button", { type: "button", onClick: onClose, className: "btn btn-secondary", children: "Cancel" }), _jsx("button", { type: "submit", disabled: loading, className: "btn btn-primary", children: loading ? 'Saving…' : submitLabel })] }));
|
|
371
|
+
}
|
|
372
|
+
//# sourceMappingURL=Vault.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Vault.js","sourceRoot":"","sources":["../../src/pages/Vault.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export interface NavItem {
|
|
2
|
+
to: string;
|
|
3
|
+
label: string;
|
|
4
|
+
icon: string;
|
|
5
|
+
/** The lowest role that sees the item (see `roleRank`). */
|
|
6
|
+
minRole: string;
|
|
7
|
+
}
|
|
8
|
+
export interface NavSection {
|
|
9
|
+
label: string;
|
|
10
|
+
items: NavItem[];
|
|
11
|
+
}
|
|
12
|
+
/** A link below the sections that leaves the interface (the public page, the documentation). */
|
|
13
|
+
export interface ExternalLink {
|
|
14
|
+
label: string;
|
|
15
|
+
icon: string;
|
|
16
|
+
href: () => string;
|
|
17
|
+
}
|
|
18
|
+
export interface AdminShellConfig {
|
|
19
|
+
sections: NavSection[];
|
|
20
|
+
/** Roles from the lowest to the highest rank: a user sees an item when their rank reaches the item's `minRole`. */
|
|
21
|
+
roleRank: Readonly<Record<string, number>>;
|
|
22
|
+
brand: {
|
|
23
|
+
iconUrl: string;
|
|
24
|
+
name: string;
|
|
25
|
+
title: string;
|
|
26
|
+
subtitle: string;
|
|
27
|
+
};
|
|
28
|
+
/** The page the first item leads to: it is highlighted only when it is exactly the current one. */
|
|
29
|
+
homePath: string;
|
|
30
|
+
settingsPath: string;
|
|
31
|
+
loginPath: string;
|
|
32
|
+
externalLinks: readonly ExternalLink[];
|
|
33
|
+
/** The release notes shown once to a user who last saw an older version. */
|
|
34
|
+
whatsNew: {
|
|
35
|
+
changelog: string;
|
|
36
|
+
version: string;
|
|
37
|
+
docsUrl: string;
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* The signed-in shell of an admin interface: a sidebar (a drawer on a phone) with the sections the user's role may see,
|
|
42
|
+
* the footer links, the theme switch and logout, and the page below it. The sections, roles, brand and links are the
|
|
43
|
+
* application's; the page is whatever the router renders in the `Outlet`.
|
|
44
|
+
*/
|
|
45
|
+
export declare function createAdminShell(config: AdminShellConfig): () => import("react").JSX.Element;
|
|
46
|
+
//# sourceMappingURL=AdminShell.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdminShell.d.ts","sourceRoot":"","sources":["../../src/shell/AdminShell.tsx"],"names":[],"mappings":"AAQA,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,2DAA2D;IAC3D,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,UAAU;IAAG,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,EAAE,CAAA;CAAE;AAE/D,gGAAgG;AAChG,MAAM,WAAW,YAAY;IAAG,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,MAAM,CAAA;CAAE;AAEjF,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,UAAU,EAAE,CAAA;IACtB,mHAAmH;IACnH,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IAC1C,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAA;IACzE,mGAAmG;IACnG,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,SAAS,YAAY,EAAE,CAAA;IACtC,4EAA4E;IAC5E,QAAQ,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;CAClE;AAqID;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,qCAoFxD"}
|