@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,71 @@
|
|
|
1
|
+
const RELEASE_HEADING = /^## \[(\d+\.\d+\.\d+)\](?: - (\S+))?\s*$/;
|
|
2
|
+
const GROUP_HEADING = /^### (.+?)\s*$/;
|
|
3
|
+
const ITEM = /^- (?:\*\*(.+?)\*\*:?\s*)?(.*)$/;
|
|
4
|
+
function plain(text) {
|
|
5
|
+
return text.replace(/\[([^\]]+)\]\([^)]*\)/g, '$1').replace(/[`*]/g, '').trim();
|
|
6
|
+
}
|
|
7
|
+
function firstSentence(text) {
|
|
8
|
+
const match = /^(.+?[.!?])(?:\s|$)/.exec(text);
|
|
9
|
+
return plain(match ? match[1] : text);
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Released sections of docs/changelog.md, newest first; each top-level bullet is cut down to its bold title and
|
|
13
|
+
* the first sentence of its text. The Unreleased section and nested bullets are left out.
|
|
14
|
+
*/
|
|
15
|
+
export function parseChangelog(markdown) {
|
|
16
|
+
const releases = [];
|
|
17
|
+
let release = null;
|
|
18
|
+
let group = null;
|
|
19
|
+
for (const line of markdown.split(/\r?\n/)) {
|
|
20
|
+
const releaseMatch = RELEASE_HEADING.exec(line);
|
|
21
|
+
if (releaseMatch) {
|
|
22
|
+
release = { version: releaseMatch[1], date: releaseMatch[2] ?? '', groups: [] };
|
|
23
|
+
releases.push(release);
|
|
24
|
+
group = null;
|
|
25
|
+
}
|
|
26
|
+
else if (line.startsWith('## ')) {
|
|
27
|
+
release = null;
|
|
28
|
+
}
|
|
29
|
+
else if (release) {
|
|
30
|
+
const groupMatch = GROUP_HEADING.exec(line);
|
|
31
|
+
if (groupMatch) {
|
|
32
|
+
group = { heading: groupMatch[1], items: [] };
|
|
33
|
+
release.groups.push(group);
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
const item = group ? ITEM.exec(line) : null;
|
|
37
|
+
if (item && group)
|
|
38
|
+
group.items.push({ title: plain(item[1] ?? ''), summary: firstSentence(item[2] ?? '') });
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return releases.map((r) => ({ ...r, groups: r.groups.filter((g) => g.items.length > 0) }));
|
|
42
|
+
}
|
|
43
|
+
/** Negative, zero or positive like a sort comparator; plain x.y.z versions only. */
|
|
44
|
+
export function compareVersions(a, b) {
|
|
45
|
+
const left = a.split('.').map(Number);
|
|
46
|
+
const right = b.split('.').map(Number);
|
|
47
|
+
for (let i = 0; i < 3; i++) {
|
|
48
|
+
const diff = (left[i] ?? 0) - (right[i] ?? 0);
|
|
49
|
+
if (diff !== 0)
|
|
50
|
+
return diff;
|
|
51
|
+
}
|
|
52
|
+
return 0;
|
|
53
|
+
}
|
|
54
|
+
/** Releases after `seen` up to and including `current`, newest first. */
|
|
55
|
+
export function releasesBetween(releases, seen, current) {
|
|
56
|
+
return releases.filter((r) => compareVersions(r.version, seen) > 0 && compareVersions(r.version, current) <= 0);
|
|
57
|
+
}
|
|
58
|
+
/** One release sorted by the kind of change; fixes are only counted. */
|
|
59
|
+
export function summarizeRelease(release) {
|
|
60
|
+
const summary = { version: release.version, added: [], changed: [], fixed: [] };
|
|
61
|
+
for (const group of release.groups) {
|
|
62
|
+
if (group.heading === 'Added')
|
|
63
|
+
summary.added.push(...group.items);
|
|
64
|
+
else if (group.heading === 'Fixed')
|
|
65
|
+
summary.fixed.push(...group.items);
|
|
66
|
+
else
|
|
67
|
+
summary.changed.push(...group.items);
|
|
68
|
+
}
|
|
69
|
+
return summary;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=changelog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"changelog.js","sourceRoot":"","sources":["../../src/lib/changelog.ts"],"names":[],"mappings":"AAgBA,MAAM,eAAe,GAAG,0CAA0C,CAAA;AAClE,MAAM,aAAa,GAAG,gBAAgB,CAAA;AACtC,MAAM,IAAI,GAAG,iCAAiC,CAAA;AAE9C,SAAS,KAAK,CAAC,IAAY;IACzB,OAAO,IAAI,CAAC,OAAO,CAAC,wBAAwB,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;AACjF,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,MAAM,KAAK,GAAG,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC9C,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;AACxC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,MAAM,QAAQ,GAAmB,EAAE,CAAA;IACnC,IAAI,OAAO,GAAwB,IAAI,CAAA;IACvC,IAAI,KAAK,GAAwB,IAAI,CAAA;IACrC,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3C,MAAM,YAAY,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC/C,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,GAAG,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC,CAAE,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAA;YAChF,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YACtB,KAAK,GAAG,IAAI,CAAA;QACd,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAClC,OAAO,GAAG,IAAI,CAAA;QAChB,CAAC;aAAM,IAAI,OAAO,EAAE,CAAC;YACnB,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAC3C,IAAI,UAAU,EAAE,CAAC;gBACf,KAAK,GAAG,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAA;gBAC9C,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;gBAC1B,SAAQ;YACV,CAAC;YACD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;YAC3C,IAAI,IAAI,IAAI,KAAK;gBAAE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAA;QAC7G,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;AAC5F,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,eAAe,CAAC,CAAS,EAAE,CAAS;IAClD,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IACrC,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;QAC7C,IAAI,IAAI,KAAK,CAAC;YAAE,OAAO,IAAI,CAAA;IAC7B,CAAC;IACD,OAAO,CAAC,CAAA;AACV,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,eAAe,CAAC,QAAwB,EAAE,IAAY,EAAE,OAAe;IACrF,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,eAAe,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;AACjH,CAAC;AAUD,wEAAwE;AACxE,MAAM,UAAU,gBAAgB,CAAC,OAAqB;IACpD,MAAM,OAAO,GAAmB,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAA;IAC/F,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnC,IAAI,KAAK,CAAC,OAAO,KAAK,OAAO;YAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAA;aAC5D,IAAI,KAAK,CAAC,OAAO,KAAK,OAAO;YAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAA;;YACjE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAA;IAC3C,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/** Admin date and time display, chosen per browser in Settings. */
|
|
2
|
+
export type DateFormat = 'dmy' | 'dmyDash' | 'mdy' | 'ymd' | 'ymdDot';
|
|
3
|
+
export type TimeFormat = '24h' | '12h';
|
|
4
|
+
export interface DatePrefs {
|
|
5
|
+
date: DateFormat;
|
|
6
|
+
time: TimeFormat;
|
|
7
|
+
}
|
|
8
|
+
export declare const DATE_FORMATS: {
|
|
9
|
+
value: DateFormat;
|
|
10
|
+
label: string;
|
|
11
|
+
}[];
|
|
12
|
+
export declare const TIME_FORMATS: ReadonlyArray<{
|
|
13
|
+
value: TimeFormat;
|
|
14
|
+
label: string;
|
|
15
|
+
}>;
|
|
16
|
+
export declare function getDatePrefs(): DatePrefs;
|
|
17
|
+
export declare function setDatePrefs(next: DatePrefs): void;
|
|
18
|
+
export declare function useDatePrefs(): DatePrefs;
|
|
19
|
+
/** `utc` formats the UTC calendar day instead of the local one (for UTC-bucketed data). */
|
|
20
|
+
export declare function formatDate(ms: number, utc?: boolean): string;
|
|
21
|
+
export declare function formatDayMonth(ms: number): string;
|
|
22
|
+
export declare function formatClock(ms: number, seconds?: boolean): string;
|
|
23
|
+
export declare function formatDateTime(ms: number, seconds?: boolean): string;
|
|
24
|
+
//# sourceMappingURL=dateFormat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dateFormat.d.ts","sourceRoot":"","sources":["../../src/lib/dateFormat.ts"],"names":[],"mappings":"AAIA,mEAAmE;AACnE,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,SAAS,GAAG,KAAK,GAAG,KAAK,GAAG,QAAQ,CAAA;AACrE,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,KAAK,CAAA;AACtC,MAAM,WAAW,SAAS;IAAG,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CAAE;AAYjE,eAAO,MAAM,YAAY;;;GAA8G,CAAA;AACvI,eAAO,MAAM,YAAY,EAAE,aAAa,CAAC;IAAE,KAAK,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAG5E,CAAA;AAmBD,wBAAgB,YAAY,IAAI,SAAS,CAA8B;AAEvE,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI,CAIlD;AAOD,wBAAgB,YAAY,IAAI,SAAS,CAExC;AAID,2FAA2F;AAC3F,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,UAAQ,GAAG,MAAM,CAO1D;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAGjD;AAED,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,UAAQ,GAAG,MAAM,CAS/D;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,UAAQ,GAAG,MAAM,CAElE"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { safeLocalStorage } from '@better-forge/contracts';
|
|
2
|
+
import { useSyncExternalStore } from 'react';
|
|
3
|
+
import { storageKey } from '../config';
|
|
4
|
+
const DATE_PATTERNS = {
|
|
5
|
+
dmy: { label: 'dd.mm.yyyy', full: (y, m, d) => `${d}.${m}.${y}`, dayMonth: (m, d) => `${d}.${m}` },
|
|
6
|
+
dmyDash: { label: 'dd-mm-yyyy', full: (y, m, d) => `${d}-${m}-${y}`, dayMonth: (m, d) => `${d}-${m}` },
|
|
7
|
+
mdy: { label: 'mm/dd/yyyy', full: (y, m, d) => `${m}/${d}/${y}`, dayMonth: (m, d) => `${m}/${d}` },
|
|
8
|
+
ymd: { label: 'yyyy-mm-dd', full: (y, m, d) => `${y}-${m}-${d}`, dayMonth: (m, d) => `${m}-${d}` },
|
|
9
|
+
ymdDot: { label: 'yyyy.mm.dd', full: (y, m, d) => `${y}.${m}.${d}`, dayMonth: (m, d) => `${m}.${d}` },
|
|
10
|
+
};
|
|
11
|
+
export const DATE_FORMATS = Object.keys(DATE_PATTERNS).map((value) => ({ value, label: DATE_PATTERNS[value].label }));
|
|
12
|
+
export const TIME_FORMATS = [
|
|
13
|
+
{ value: '24h', label: '24-hour' },
|
|
14
|
+
{ value: '12h', label: '12-hour' },
|
|
15
|
+
];
|
|
16
|
+
const DEFAULTS = { date: 'dmy', time: '24h' };
|
|
17
|
+
function load() {
|
|
18
|
+
try {
|
|
19
|
+
const raw = JSON.parse(safeLocalStorage.get(storageKey('date-format')) ?? 'null');
|
|
20
|
+
return {
|
|
21
|
+
date: DATE_FORMATS.some((f) => f.value === raw?.date) ? raw.date : DEFAULTS.date,
|
|
22
|
+
time: TIME_FORMATS.some((f) => f.value === raw?.time) ? raw.time : DEFAULTS.time,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return DEFAULTS;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
let prefs = null;
|
|
30
|
+
const listeners = new Set();
|
|
31
|
+
export function getDatePrefs() { return (prefs ??= load()); }
|
|
32
|
+
export function setDatePrefs(next) {
|
|
33
|
+
prefs = next;
|
|
34
|
+
safeLocalStorage.set(storageKey('date-format'), JSON.stringify(next));
|
|
35
|
+
listeners.forEach((listener) => listener());
|
|
36
|
+
}
|
|
37
|
+
function subscribe(listener) {
|
|
38
|
+
listeners.add(listener);
|
|
39
|
+
return () => { listeners.delete(listener); };
|
|
40
|
+
}
|
|
41
|
+
export function useDatePrefs() {
|
|
42
|
+
return useSyncExternalStore(subscribe, getDatePrefs);
|
|
43
|
+
}
|
|
44
|
+
const pad = (n) => String(n).padStart(2, '0');
|
|
45
|
+
/** `utc` formats the UTC calendar day instead of the local one (for UTC-bucketed data). */
|
|
46
|
+
export function formatDate(ms, utc = false) {
|
|
47
|
+
const d = new Date(ms);
|
|
48
|
+
return DATE_PATTERNS[getDatePrefs().date].full(utc ? d.getUTCFullYear() : d.getFullYear(), pad((utc ? d.getUTCMonth() : d.getMonth()) + 1), pad(utc ? d.getUTCDate() : d.getDate()));
|
|
49
|
+
}
|
|
50
|
+
export function formatDayMonth(ms) {
|
|
51
|
+
const d = new Date(ms);
|
|
52
|
+
return DATE_PATTERNS[getDatePrefs().date].dayMonth(pad(d.getMonth() + 1), pad(d.getDate()));
|
|
53
|
+
}
|
|
54
|
+
export function formatClock(ms, seconds = false) {
|
|
55
|
+
const d = new Date(ms);
|
|
56
|
+
const mm = pad(d.getMinutes());
|
|
57
|
+
const ss = seconds ? `:${pad(d.getSeconds())}` : '';
|
|
58
|
+
if (getDatePrefs().time === '12h') {
|
|
59
|
+
const h = d.getHours();
|
|
60
|
+
return `${h % 12 || 12}:${mm}${ss} ${h < 12 ? 'AM' : 'PM'}`;
|
|
61
|
+
}
|
|
62
|
+
return `${pad(d.getHours())}:${mm}${ss}`;
|
|
63
|
+
}
|
|
64
|
+
export function formatDateTime(ms, seconds = false) {
|
|
65
|
+
return `${formatDate(ms)} ${formatClock(ms, seconds)}`;
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=dateFormat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dateFormat.js","sourceRoot":"","sources":["../../src/lib/dateFormat.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../src/navigation.ts"],"names":[],"mappings":"AAAA,gGAAgG;AAChG,eAAO,MAAM,UAAU;gBACT,MAAM,GAAG,IAAI;CAG1B,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"navigation.js","sourceRoot":"","sources":["../src/navigation.ts"],"names":[],"mappings":"AAAA,gGAAgG;AAChG,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,MAAM,CAAC,GAAW;QAChB,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IAC7B,CAAC;CACF,CAAA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
import { type TokenPreset, type TokenResource } from '@better-forge/contracts';
|
|
3
|
+
/** The parts of the API a token can be given, and the ready-made sets of permissions, are the application's. */
|
|
4
|
+
export default function ApiTokensPage({ resources, presets, actions }: {
|
|
5
|
+
resources: readonly TokenResource[];
|
|
6
|
+
presets: readonly TokenPreset[]; /** Buttons shown next to New token, for what a product adds to tokens. */
|
|
7
|
+
actions?: ReactNode;
|
|
8
|
+
}): import("react").JSX.Element;
|
|
9
|
+
//# sourceMappingURL=ApiTokens.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApiTokens.d.ts","sourceRoot":"","sources":["../../src/pages/ApiTokens.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AACvD,OAAO,EAAmB,KAAK,WAAW,EAAE,KAAK,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAoD/F,gHAAgH;AAChH,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;IAAE,SAAS,EAAE,SAAS,aAAa,EAAE,CAAC;IAAC,OAAO,EAAE,SAAS,WAAW,EAAE,CAAC,CAAC,0EAA0E;IAAC,OAAO,CAAC,EAAE,SAAS,CAAA;CAAE,+BAkT9O"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useId, useState } from 'react';
|
|
3
|
+
import { VAULT_USE_SCOPE } from '@better-forge/contracts';
|
|
4
|
+
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
|
|
5
|
+
import { api } from '../api/client';
|
|
6
|
+
import { uiConfig } from '../config';
|
|
7
|
+
import { ConfirmIdentityModal } from '../components/ConfirmIdentityModal';
|
|
8
|
+
import { ConfirmModal } from '../components/ConfirmModal';
|
|
9
|
+
import { ModalFooter, ModalHeader, ModalShell } from '../components/ModalShell';
|
|
10
|
+
import { CopyButton } from '../components/CopyButton';
|
|
11
|
+
import { Alert, EmptyStateLink, EmptyTableRow, ErrorState, LoadingState, PageContainer, PageHeader, useToast, DataTable, DataTh, useTableSort } from '../components/ui';
|
|
12
|
+
import { formatDate } from '../lib/dateFormat';
|
|
13
|
+
/** Ninety days unless a person decides otherwise: a forgotten token should not work forever. */
|
|
14
|
+
const DEFAULT_EXPIRY = '90';
|
|
15
|
+
const EXPIRIES = [
|
|
16
|
+
{ value: '30', label: '30 days' },
|
|
17
|
+
{ value: '90', label: '90 days' },
|
|
18
|
+
{ value: '365', label: '1 year' },
|
|
19
|
+
{ value: 'never', label: 'Never expires' },
|
|
20
|
+
];
|
|
21
|
+
const read = (key) => `${key}:read`;
|
|
22
|
+
const write = (key) => `${key}:write`;
|
|
23
|
+
/** What a token may do, for the list: each part with its highest level, the vault permission last. */
|
|
24
|
+
function permissionLabels(scopes, resources) {
|
|
25
|
+
const labels = resources.flatMap((resource) => {
|
|
26
|
+
if (scopes.includes(write(resource.key)))
|
|
27
|
+
return [`${resource.label} · write`];
|
|
28
|
+
if (scopes.includes(read(resource.key)))
|
|
29
|
+
return [`${resource.label} · read`];
|
|
30
|
+
return [];
|
|
31
|
+
});
|
|
32
|
+
return scopes.includes(VAULT_USE_SCOPE) ? [...labels, 'Vault secrets'] : labels;
|
|
33
|
+
}
|
|
34
|
+
function errorMessage(err, fallback) {
|
|
35
|
+
return err instanceof Error && err.message ? err.message : fallback;
|
|
36
|
+
}
|
|
37
|
+
function expiry(token) {
|
|
38
|
+
if (token.expiresAt === null)
|
|
39
|
+
return 'Never';
|
|
40
|
+
return token.expiresAt <= Date.now() ? `Expired ${formatDate(token.expiresAt)}` : formatDate(token.expiresAt);
|
|
41
|
+
}
|
|
42
|
+
/** The parts of the API a token can be given, and the ready-made sets of permissions, are the application's. */
|
|
43
|
+
export default function ApiTokensPage({ resources, presets, actions }) {
|
|
44
|
+
const qc = useQueryClient();
|
|
45
|
+
const toast = useToast();
|
|
46
|
+
const nameInputId = useId();
|
|
47
|
+
const [showCreate, setShowCreate] = useState(false);
|
|
48
|
+
const [name, setName] = useState('');
|
|
49
|
+
const [scopes, setScopes] = useState([]);
|
|
50
|
+
const [expiresInDays, setExpiresInDays] = useState(DEFAULT_EXPIRY);
|
|
51
|
+
const [created, setCreated] = useState(null);
|
|
52
|
+
const [revokeTarget, setRevokeTarget] = useState(null);
|
|
53
|
+
const [confirming, setConfirming] = useState(false);
|
|
54
|
+
const { data: tokens = [], isLoading, isError, refetch } = useQuery({
|
|
55
|
+
queryKey: ['api-tokens'],
|
|
56
|
+
queryFn: () => api.get('/admin/api-tokens'),
|
|
57
|
+
});
|
|
58
|
+
const { rows: sortedTokens, sort } = useTableSort(tokens, {
|
|
59
|
+
name: (t) => t.name,
|
|
60
|
+
token: (t) => t.prefix,
|
|
61
|
+
expires: (t) => t.expiresAt ?? Number.MAX_SAFE_INTEGER,
|
|
62
|
+
'last used': (t) => t.lastUsedAt,
|
|
63
|
+
});
|
|
64
|
+
async function createToken(currentPassword) {
|
|
65
|
+
const data = await api.post('/admin/api-tokens', {
|
|
66
|
+
name,
|
|
67
|
+
scopes,
|
|
68
|
+
expiresInDays: expiresInDays === 'never' ? null : Number(expiresInDays),
|
|
69
|
+
currentPassword,
|
|
70
|
+
});
|
|
71
|
+
qc.invalidateQueries({ queryKey: ['api-tokens'] });
|
|
72
|
+
setCreated({ name: data.name, token: data.token });
|
|
73
|
+
setShowCreate(false);
|
|
74
|
+
setName('');
|
|
75
|
+
setScopes([]);
|
|
76
|
+
setExpiresInDays(DEFAULT_EXPIRY);
|
|
77
|
+
}
|
|
78
|
+
const revokeMutation = useMutation({
|
|
79
|
+
mutationFn: (id) => api.delete(`/admin/api-tokens/${id}`),
|
|
80
|
+
onSuccess: () => {
|
|
81
|
+
toast.success(revokeTarget ? `Revoked ${revokeTarget.name}.` : 'Token revoked.');
|
|
82
|
+
setRevokeTarget(null);
|
|
83
|
+
qc.invalidateQueries({ queryKey: ['api-tokens'] });
|
|
84
|
+
},
|
|
85
|
+
onError: (err) => {
|
|
86
|
+
setRevokeTarget(null);
|
|
87
|
+
toast.error(errorMessage(err, 'Failed to revoke token'));
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
function openCreate() {
|
|
91
|
+
setShowCreate(true);
|
|
92
|
+
setCreated(null);
|
|
93
|
+
}
|
|
94
|
+
/** Writing a part includes reading it, so ticking Write ticks Read and unticking Read unticks Write. */
|
|
95
|
+
function toggle(scope, on) {
|
|
96
|
+
setScopes((current) => {
|
|
97
|
+
const next = new Set(current);
|
|
98
|
+
const [key, level] = scope.split(':');
|
|
99
|
+
if (on) {
|
|
100
|
+
next.add(scope);
|
|
101
|
+
if (level === 'write')
|
|
102
|
+
next.add(read(key));
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
next.delete(scope);
|
|
106
|
+
if (level === 'read')
|
|
107
|
+
next.delete(write(key));
|
|
108
|
+
}
|
|
109
|
+
return [...next];
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
const canCreate = name.trim().length > 0 && scopes.length > 0;
|
|
113
|
+
return (_jsxs(PageContainer, { children: [_jsx(PageHeader, { title: "API tokens", subtitle: isLoading || isError ? undefined : `${tokens.length} token${tokens.length !== 1 ? 's' : ''}`, actions: _jsxs(_Fragment, { children: [actions, _jsxs("button", { type: "button", onClick: openCreate, className: "btn btn-primary", children: [_jsx("span", { className: "material-symbols-outlined", "aria-hidden": "true", children: "add" }), "New token"] })] }) }), _jsxs("p", { className: "text-sm max-w-2xl", style: { color: 'var(--m3-secondary)' }, children: ["Tokens let scripts and CI call the admin API with ", _jsx("code", { className: "font-mono", children: "Authorization: Bearer <token>" }), ". A token has only the permissions you tick. It cannot manage ", uiConfig().texts.tokenCannotManage, ". It belongs to no user, so revoke the tokens of an administrator who leaves."] }), showCreate && (_jsx(ModalShell, { align: "top", onClose: () => setShowCreate(false), label: "New token", children: _jsxs("div", { className: "rounded-2xl w-full max-w-2xl my-8", style: { background: 'var(--m3-surface-container-low)', border: '1px solid var(--m3-outline-variant)' }, children: [_jsx(ModalHeader, { icon: "key", title: "New token", onClose: () => setShowCreate(false) }), _jsxs("form", { onSubmit: (e) => { e.preventDefault(); if (canCreate)
|
|
114
|
+
setConfirming(true); }, children: [_jsxs("div", { className: "p-4 sm:p-6", children: [_jsx("label", { htmlFor: nameInputId, className: "block text-xs mb-1.5", style: { color: 'var(--m3-secondary)' }, children: "Name" }), _jsxs("div", { className: "flex flex-wrap gap-3", children: [_jsx("input", { id: nameInputId, value: name, onChange: (e) => setName(e.target.value), maxLength: 80, placeholder: "GitHub Actions", className: "input-sig flex-1 min-w-[200px]" }), _jsx("select", { "aria-label": "Expires", value: expiresInDays, onChange: (e) => setExpiresInDays(e.target.value), className: "input-sig w-auto", children: EXPIRIES.map((x) => _jsx("option", { value: x.value, children: x.label }, x.value)) })] }), _jsxs("fieldset", { className: "mt-4", children: [_jsx("legend", { className: "text-xs mb-1.5", style: { color: 'var(--m3-secondary)' }, children: "Permissions" }), _jsxs("div", { className: "flex flex-wrap gap-2 mb-3", children: [presets.map((preset) => (_jsx("button", { type: "button", title: preset.description, onClick: () => setScopes([...preset.scopes]), className: "btn btn-secondary btn-sm", children: preset.label }, preset.label))), _jsx("button", { type: "button", onClick: () => setScopes([]), className: "btn btn-ghost btn-sm", children: "Clear" })] }), _jsx("div", { className: "rounded-xl overflow-x-auto", style: { border: '1px solid var(--m3-outline-variant)' }, children: _jsxs("table", { className: "w-full min-w-[480px] text-sm", children: [_jsx("thead", { children: _jsxs("tr", { style: { background: 'var(--m3-surface-container)' }, children: [_jsx("th", { className: "px-4 py-2 text-left font-mono text-xs uppercase tracking-wider", style: { color: 'var(--m3-secondary)' }, children: "Part" }), _jsx("th", { className: "px-4 py-2 w-20 font-mono text-xs uppercase tracking-wider", style: { color: 'var(--m3-secondary)' }, children: "Read" }), _jsx("th", { className: "px-4 py-2 w-20 font-mono text-xs uppercase tracking-wider", style: { color: 'var(--m3-secondary)' }, children: "Write" })] }) }), _jsx("tbody", { children: resources.map((resource, index) => (_jsxs("tr", { style: { borderTop: index > 0 ? '1px solid var(--m3-outline-variant)' : 'none' }, children: [_jsxs("td", { className: "px-4 py-2", children: [_jsx("span", { style: { color: 'var(--m3-on-surface)' }, children: resource.label }), _jsx("span", { className: "block text-xs", style: { color: 'var(--m3-secondary)' }, children: resource.description })] }), ['read', 'write'].map((level) => (_jsx("td", { className: "px-4 py-2 text-center", children: resource.levels.includes(level) && (_jsx("input", { type: "checkbox", "aria-label": `${resource.label} ${level}`, checked: scopes.includes(`${resource.key}:${level}`), onChange: (e) => toggle(`${resource.key}:${level}`, e.target.checked) })) }, level)))] }, resource.key))) })] }) }), _jsxs("label", { className: "flex items-start gap-3 mt-3 text-sm", style: { color: 'var(--m3-on-surface)' }, children: [_jsx("input", { type: "checkbox", className: "mt-1", checked: scopes.includes(VAULT_USE_SCOPE), onChange: (e) => toggle(VAULT_USE_SCOPE, e.target.checked) }), _jsxs("span", { children: ["Use vault secrets", _jsxs("span", { className: "block text-xs", style: { color: 'var(--m3-secondary)' }, children: ["Lets the token attach a vault secret to ", uiConfig().texts.tokenVaultTargets, ", or change one that already uses a vault. Without it the token cannot read or use credentials from a vault."] })] })] })] })] }), _jsxs(ModalFooter, { children: [_jsx("button", { type: "button", onClick: () => setShowCreate(false), className: "btn btn-secondary", children: "Cancel" }), _jsx("button", { type: "submit", disabled: !canCreate, className: "btn btn-primary", children: "Create" })] })] })] }) })), confirming && (_jsx(ConfirmIdentityModal, { title: "Create token", message: "A token can act on the admin API without you being signed in. Confirm it's you to create it.", confirmLabel: "Create token", pendingLabel: "Creating\u2026", action: createToken, onClose: () => setConfirming(false) })), created && (_jsxs(Alert, { tone: "success", title: _jsxs(_Fragment, { children: ["Token ", _jsx("strong", { children: created.name }), " created"] }), onDismiss: () => setCreated(null), children: [_jsx("p", { className: "text-xs mb-3", style: { color: 'var(--m3-secondary)' }, children: "Copy it now. It will not be shown again; if you lose it, revoke it and create a new one." }), _jsxs("div", { className: "flex flex-wrap items-center gap-3", children: [_jsx("code", { className: "font-mono text-sm px-4 py-2 rounded-xl select-all break-all", style: { background: 'var(--m3-surface-container)', color: 'var(--m3-on-surface)' }, children: created.token }), _jsx(CopyButton, { value: created.token })] })] })), isLoading ? (_jsx(LoadingState, { label: "Loading tokens\u2026" })) : isError ? (_jsx(ErrorState, { message: "Could not load tokens.", 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-[760px] text-sm", children: [_jsx("thead", { children: _jsx("tr", { style: { borderBottom: '1px solid var(--m3-outline-variant)' }, children: ['Name', 'Token', 'Permissions', 'Expires', 'Last used', ''].map((h) => (_jsx(DataTh, { resizable: h !== '', ...(h !== '' && h !== 'Permissions' && { 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: [sortedTokens.map((token, i) => (_jsxs("tr", { style: { borderTop: i > 0 ? '1px solid var(--m3-outline-variant)' : 'none' }, children: [_jsx("td", { className: "px-4 py-3 font-medium", style: { color: 'var(--m3-on-surface)' }, children: token.name }), _jsxs("td", { className: "px-4 py-3 font-mono text-xs", style: { color: 'var(--m3-secondary)' }, children: [token.prefix, "\u2026"] }), _jsx("td", { className: "px-4 py-3", children: _jsx("ul", { className: "flex flex-wrap gap-1.5", "aria-label": `Permissions of ${token.name}`, children: permissionLabels(token.scopes, resources).map((label) => (_jsx("li", { className: "text-xs font-semibold px-2 py-0.5 rounded-lg", style: { background: 'var(--m3-surface-container)', color: 'var(--m3-on-surface)' }, children: label }, label))) }) }), _jsx("td", { className: "px-4 py-3 font-mono text-xs", style: { color: 'var(--m3-secondary)' }, children: expiry(token) }), _jsx("td", { className: "px-4 py-3 font-mono text-xs", style: { color: 'var(--m3-secondary)' }, children: token.lastUsedAt === null ? 'Never' : formatDate(token.lastUsedAt) }), _jsx("td", { className: "px-4 py-3", children: _jsx("div", { className: "flex items-center justify-end", children: _jsx("button", { type: "button", onClick: () => setRevokeTarget(token), title: "Revoke token", "aria-label": `Revoke ${token.name}`, className: "w-8 h-8 flex items-center justify-center rounded-lg transition-colors text-xs focus-ring", 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" }) }) }) })] }, token.id))), tokens.length === 0 && (_jsx(EmptyTableRow, { colSpan: 7, icon: "key", title: "No API tokens yet.", description: _jsxs(_Fragment, { children: [_jsx(EmptyStateLink, { onClick: openCreate, children: "Create a token" }), " to call the admin API from scripts and CI."] }) }))] })] }) })), revokeTarget && (_jsx(ConfirmModal, { title: "Revoke token", message: `Revoke "${revokeTarget.name}"? Anything still using it stops working immediately.`, confirmLabel: "Revoke", pending: revokeMutation.isPending, pendingLabel: "Revoking\u2026", onConfirm: () => revokeMutation.mutate(revokeTarget.id), onCancel: () => setRevokeTarget(null) }))] }));
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=ApiTokens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApiTokens.js","sourceRoot":"","sources":["../../src/pages/ApiTokens.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAkB,MAAM,OAAO,CAAA;AACvD,OAAO,EAAE,eAAe,EAAwC,MAAM,yBAAyB,CAAA;AAC/F,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAC7E,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAA;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAA;AACzE,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AACzD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAC/E,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AACrD,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AACvK,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAY9C,gGAAgG;AAChG,MAAM,cAAc,GAAG,IAAI,CAAA;AAC3B,MAAM,QAAQ,GAAG;IACf,EAAE,KAAK,EAAE,IAAI,EAAG,KAAK,EAAE,SAAS,EAAE;IAClC,EAAE,KAAK,EAAE,IAAI,EAAG,KAAK,EAAE,SAAS,EAAE;IAClC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE;IACjC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE;CAC3C,CAAA;AAED,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,GAAG,OAAO,CAAA;AAC3C,MAAM,KAAK,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,GAAG,QAAQ,CAAA;AAE7C,sGAAsG;AACtG,SAAS,gBAAgB,CAAC,MAAgB,EAAE,SAAmC;IAC7E,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;QAC5C,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,UAAU,CAAC,CAAA;QAC9E,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,SAAS,CAAC,CAAA;QAC5E,OAAO,EAAE,CAAA;IACX,CAAC,CAAC,CAAA;IACF,OAAO,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;AACjF,CAAC;AAED,SAAS,YAAY,CAAC,GAAY,EAAE,QAAgB;IAClD,OAAO,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAA;AACrE,CAAC;AAED,SAAS,MAAM,CAAC,KAAe;IAC7B,IAAI,KAAK,CAAC,SAAS,KAAK,IAAI;QAAE,OAAO,OAAO,CAAA;IAC5C,OAAO,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,WAAW,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;AAC/G,CAAC;AAED,gHAAgH;AAChH,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAA4K;IAC7O,MAAM,EAAE,GAAG,cAAc,EAAE,CAAA;IAC3B,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAA;IACxB,MAAM,WAAW,GAAG,KAAK,EAAE,CAAA;IAC3B,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IACnD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAA;IACpC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAW,EAAE,CAAC,CAAA;IAClD,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAA;IAClE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAyC,IAAI,CAAC,CAAA;IACpF,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAkB,IAAI,CAAC,CAAA;IACvE,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAEnD,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAa;QAC9E,QAAQ,EAAE,CAAC,YAAY,CAAC;QACxB,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,mBAAmB,CAAC;KAC5C,CAAC,CAAA;IACF,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,GAAG,YAAY,CAAC,MAAM,EAAE;QACxD,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI;QACnB,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM;QACtB,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,MAAM,CAAC,gBAAgB;QACtD,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU;KACjC,CAAC,CAAA;IAEF,KAAK,UAAU,WAAW,CAAC,eAAmC;QAC5D,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,CAA+B,mBAAmB,EAAE;YAC7E,IAAI;YACJ,MAAM;YACN,aAAa,EAAE,aAAa,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC;YACvE,eAAe;SAChB,CAAC,CAAA;QACF,EAAE,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,CAAA;QAClD,UAAU,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAA;QAClD,aAAa,CAAC,KAAK,CAAC,CAAA;QACpB,OAAO,CAAC,EAAE,CAAC,CAAA;QACX,SAAS,CAAC,EAAE,CAAC,CAAA;QACb,gBAAgB,CAAC,cAAc,CAAC,CAAA;IAClC,CAAC;IAED,MAAM,cAAc,GAAG,WAAW,CAAC;QACjC,UAAU,EAAE,CAAC,EAAU,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,qBAAqB,EAAE,EAAE,CAAC;QACjE,SAAS,EAAE,GAAG,EAAE;YACd,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,YAAY,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAA;YAChF,eAAe,CAAC,IAAI,CAAC,CAAA;YACrB,EAAE,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,CAAA;QACpD,CAAC;QACD,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACf,eAAe,CAAC,IAAI,CAAC,CAAA;YACrB,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,EAAE,wBAAwB,CAAC,CAAC,CAAA;QAC1D,CAAC;KACF,CAAC,CAAA;IAEF,SAAS,UAAU;QACjB,aAAa,CAAC,IAAI,CAAC,CAAA;QACnB,UAAU,CAAC,IAAI,CAAC,CAAA;IAClB,CAAC;IAED,wGAAwG;IACxG,SAAS,MAAM,CAAC,KAAa,EAAE,EAAW;QACxC,SAAS,CAAC,CAAC,OAAO,EAAE,EAAE;YACpB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAA;YAC7B,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAqB,CAAA;YACzD,IAAI,EAAE,EAAE,CAAC;gBACP,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;gBACf,IAAI,KAAK,KAAK,OAAO;oBAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;YAC5C,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;gBAClB,IAAI,KAAK,KAAK,MAAM;oBAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAA;YAC/C,CAAC;YACD,OAAO,CAAC,GAAG,IAAI,CAAC,CAAA;QAClB,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,CAAA;IAE7D,OAAO,CACL,MAAC,aAAa,eACZ,KAAC,UAAU,IACT,KAAK,EAAC,YAAY,EAClB,QAAQ,EAAE,SAAS,IAAI,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,SAAS,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,EACtG,OAAO,EACL,8BACG,OAAO,EACR,kBAAQ,IAAI,EAAC,QAAQ,EAAC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAC,iBAAiB,aACpE,eAAM,SAAS,EAAC,2BAA2B,iBAAa,MAAM,oBAAW,iBAElE,IACR,GAEL,EAEF,aAAG,SAAS,EAAC,mBAAmB,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,mEACpB,eAAM,SAAS,EAAC,WAAW,8CAA2C,oEAC3D,QAAQ,EAAE,CAAC,KAAK,CAAC,iBAAiB,qFAC7F,EAEH,UAAU,IAAI,CACb,KAAC,UAAU,IAAC,KAAK,EAAC,KAAK,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,KAAK,EAAC,WAAW,YAC9E,eAAK,SAAS,EAAC,mCAAmC,EAAC,KAAK,EAAE,EAAE,UAAU,EAAE,iCAAiC,EAAE,MAAM,EAAE,qCAAqC,EAAE,aAC1J,KAAC,WAAW,IAAC,IAAI,EAAC,KAAK,EAAC,KAAK,EAAC,WAAW,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,GAAI,EACjF,gBAAM,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,IAAI,SAAS;gCAAE,aAAa,CAAC,IAAI,CAAC,CAAA,CAAC,CAAC,aACjF,eAAK,SAAS,EAAC,YAAY,aACzB,gBAAO,OAAO,EAAE,WAAW,EAAE,SAAS,EAAC,sBAAsB,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,qBAAc,EACnH,eAAK,SAAS,EAAC,sBAAsB,aACnC,gBACE,EAAE,EAAE,WAAW,EACf,KAAK,EAAE,IAAI,EACX,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACxC,SAAS,EAAE,EAAE,EACb,WAAW,EAAC,gBAAgB,EAC5B,SAAS,EAAC,gCAAgC,GAC1C,EACF,+BAAmB,SAAS,EAAC,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,SAAS,EAAC,kBAAkB,YAC/H,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAsB,KAAK,EAAE,CAAC,CAAC,KAAK,YAAG,CAAC,CAAC,KAAK,IAAjC,CAAC,CAAC,KAAK,CAAoC,CAAC,GACvE,IACL,EAEN,oBAAU,SAAS,EAAC,MAAM,aACxB,iBAAQ,SAAS,EAAC,gBAAgB,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,4BAAsB,EAChG,eAAK,SAAS,EAAC,2BAA2B,aACvC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CACvB,iBAEE,IAAI,EAAC,QAAQ,EACb,KAAK,EAAE,MAAM,CAAC,WAAW,EACzB,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAC5C,SAAS,EAAC,0BAA0B,YAEnC,MAAM,CAAC,KAAK,IANR,MAAM,CAAC,KAAK,CAOV,CACV,CAAC,EACF,iBAAQ,IAAI,EAAC,QAAQ,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,SAAS,EAAC,sBAAsB,sBAAe,IAC/F,EACN,cAAK,SAAS,EAAC,4BAA4B,EAAC,KAAK,EAAE,EAAE,MAAM,EAAE,qCAAqC,EAAE,YAClG,iBAAO,SAAS,EAAC,8BAA8B,aAC7C,0BACE,cAAI,KAAK,EAAE,EAAE,UAAU,EAAE,6BAA6B,EAAE,aACtD,aAAI,SAAS,EAAC,gEAAgE,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,qBAAW,EACjI,aAAI,SAAS,EAAC,2DAA2D,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,qBAAW,EAC5H,aAAI,SAAS,EAAC,2DAA2D,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,sBAAY,IAC1H,GACC,EACR,0BACG,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,CAClC,cAAuB,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,qCAAqC,CAAC,CAAC,CAAC,MAAM,EAAE,aACrG,cAAI,SAAS,EAAC,WAAW,aACvB,eAAM,KAAK,EAAE,EAAE,KAAK,EAAE,sBAAsB,EAAE,YAAG,QAAQ,CAAC,KAAK,GAAQ,EACvE,eAAM,SAAS,EAAC,eAAe,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,YAAG,QAAQ,CAAC,WAAW,GAAQ,IACnG,EACH,CAAC,MAAM,EAAE,OAAO,CAAW,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAC3C,aAAgB,SAAS,EAAC,uBAAuB,YAC9C,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAClC,gBACE,IAAI,EAAC,UAAU,gBACH,GAAG,QAAQ,CAAC,KAAK,IAAI,KAAK,EAAE,EACxC,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,GAAG,IAAI,KAAK,EAAE,CAAC,EACpD,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,IAAI,KAAK,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GACrE,CACH,IARM,KAAK,CAST,CACN,CAAC,KAhBK,QAAQ,CAAC,GAAG,CAiBhB,CACN,CAAC,GACI,IACF,GACJ,EACN,iBAAO,SAAS,EAAC,qCAAqC,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,sBAAsB,EAAE,aAC7F,gBACE,IAAI,EAAC,UAAU,EACf,SAAS,EAAC,MAAM,EAChB,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,EACzC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAC1D,EACF,gDAEE,gBAAM,SAAS,EAAC,eAAe,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,yDAC5B,QAAQ,EAAE,CAAC,KAAK,CAAC,iBAAiB,oHACtE,IACF,IACD,IACC,IAEP,EAEN,MAAC,WAAW,eACV,iBAAQ,IAAI,EAAC,QAAQ,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,SAAS,EAAC,mBAAmB,uBAAgB,EACxG,iBAAQ,IAAI,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,SAAS,EAAC,iBAAiB,uBAE9D,IACG,IACP,IACD,GACO,CACd,EAEA,UAAU,IAAI,CACb,KAAC,oBAAoB,IACnB,KAAK,EAAC,cAAc,EACpB,OAAO,EAAC,8FAA8F,EACtG,YAAY,EAAC,cAAc,EAC3B,YAAY,EAAC,gBAAW,EACxB,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,GACnC,CACH,EAEA,OAAO,IAAI,CACV,MAAC,KAAK,IAAC,IAAI,EAAC,SAAS,EAAC,KAAK,EAAE,wCAAQ,2BAAS,OAAO,CAAC,IAAI,GAAU,gBAAW,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,aAChH,YAAG,SAAS,EAAC,cAAc,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,yGAE/D,EACJ,eAAK,SAAS,EAAC,mCAAmC,aAChD,eACE,SAAS,EAAC,6DAA6D,EACvE,KAAK,EAAE,EAAE,UAAU,EAAE,6BAA6B,EAAE,KAAK,EAAE,sBAAsB,EAAE,YAElF,OAAO,CAAC,KAAK,GACT,EACP,KAAC,UAAU,IAAC,KAAK,EAAE,OAAO,CAAC,KAAK,GAAI,IAChC,IACA,CACT,EAEA,SAAS,CAAC,CAAC,CAAC,CACX,KAAC,YAAY,IAAC,KAAK,EAAC,sBAAiB,GAAG,CACzC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CACZ,KAAC,UAAU,IAAC,OAAO,EAAC,wBAAwB,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,OAAO,EAAE,GAAI,CAC/E,CAAC,CAAC,CAAC,CACF,cAAK,SAAS,EAAC,6BAA6B,EAAC,KAAK,EAAE,EAAE,UAAU,EAAE,iCAAiC,EAAE,MAAM,EAAE,qCAAqC,EAAE,YAClJ,MAAC,SAAS,IAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAC,8BAA8B,aAC7D,0BACE,aAAI,KAAK,EAAE,EAAE,YAAY,EAAE,qCAAqC,EAAE,YAC/D,CAAC,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CACvE,KAAC,MAAM,IAEL,SAAS,EAAE,CAAC,KAAK,EAAE,KACf,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,aAAa,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,EACrE,SAAS,EAAE,wDAAwD,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,EAAE,EAC1G,KAAK,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,UAAU,EAAE,6BAA6B,EAAE,YAEjF,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,eAAM,SAAS,EAAC,SAAS,wBAAe,CAAC,CAAC,CAAC,CAAC,IANnD,CAAC,CAOC,CACV,CAAC,GACC,GACC,EACR,4BACG,YAAY,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAC9B,cAAmB,KAAK,EAAE,EAAE,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,qCAAqC,CAAC,CAAC,CAAC,MAAM,EAAE,aAC7F,aAAI,SAAS,EAAC,uBAAuB,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,sBAAsB,EAAE,YAAG,KAAK,CAAC,IAAI,GAAM,EACjG,cAAI,SAAS,EAAC,6BAA6B,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,aAAG,KAAK,CAAC,MAAM,cAAO,EACzG,aAAI,SAAS,EAAC,WAAW,YACvB,aAAI,SAAS,EAAC,wBAAwB,gBAAa,kBAAkB,KAAK,CAAC,IAAI,EAAE,YAC9E,gBAAgB,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CACxD,aAAgB,SAAS,EAAC,8CAA8C,EAAC,KAAK,EAAE,EAAE,UAAU,EAAE,6BAA6B,EAAE,KAAK,EAAE,sBAAsB,EAAE,YACzJ,KAAK,IADC,KAAK,CAET,CACN,CAAC,GACC,GACF,EACL,aAAI,SAAS,EAAC,6BAA6B,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,YAAG,MAAM,CAAC,KAAK,CAAC,GAAM,EACzG,aAAI,SAAS,EAAC,6BAA6B,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,YAChF,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,UAAU,CAAC,GAChE,EACL,aAAI,SAAS,EAAC,WAAW,YACvB,cAAK,SAAS,EAAC,+BAA+B,YAC5C,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,EACrC,KAAK,EAAC,cAAc,gBACR,UAAU,KAAK,CAAC,IAAI,EAAE,EAClC,SAAS,EAAC,0FAA0F,EACpG,KAAK,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,EACvC,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,GAAG,2BAA2B,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,GAAG,8BAA8B,CAAA,CAAC,CAAC,EACrJ,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,GAAG,qBAAqB,CAAA,CAAC,CAAC,YAEnH,eAAM,SAAS,EAAC,2BAA2B,iBAAa,MAAM,EAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,uBAAe,GAClG,GACL,GACH,KA/BE,KAAK,CAAC,EAAE,CAgCZ,CACN,CAAC,EACD,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,CACtB,KAAC,aAAa,IACZ,OAAO,EAAE,CAAC,EACV,IAAI,EAAC,KAAK,EACV,KAAK,EAAC,oBAAoB,EAC1B,WAAW,EAAE,8BAAE,KAAC,cAAc,IAAC,OAAO,EAAE,UAAU,+BAAiC,mDAA8C,GACjI,CACH,IACK,IACE,GACR,CACP,EAEA,YAAY,IAAI,CACf,KAAC,YAAY,IACX,KAAK,EAAC,cAAc,EACpB,OAAO,EAAE,WAAW,YAAY,CAAC,IAAI,uDAAuD,EAC5F,YAAY,EAAC,QAAQ,EACrB,OAAO,EAAE,cAAc,CAAC,SAAS,EACjC,YAAY,EAAC,gBAAW,EACxB,SAAS,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,EACvD,QAAQ,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,GACrC,CACH,IACa,CACjB,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** How an application names the things its audit log is about: labels and icons by type, and the sections of the filter. */
|
|
2
|
+
export interface AuditEntities {
|
|
3
|
+
labels: Readonly<Record<string, string>>;
|
|
4
|
+
icons: Readonly<Record<string, string>>;
|
|
5
|
+
/** Filter sections, most used first. */
|
|
6
|
+
groups: ReadonlyArray<{
|
|
7
|
+
label: string;
|
|
8
|
+
types: readonly string[];
|
|
9
|
+
}>;
|
|
10
|
+
}
|
|
11
|
+
export default function AuditLogPage({ entities }: {
|
|
12
|
+
entities: AuditEntities;
|
|
13
|
+
}): import("react").JSX.Element;
|
|
14
|
+
//# sourceMappingURL=AuditLog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AuditLog.d.ts","sourceRoot":"","sources":["../../src/pages/AuditLog.tsx"],"names":[],"mappings":"AAQA,4HAA4H;AAC5H,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IACxC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IACvC,wCAAwC;IACxC,MAAM,EAAE,aAAa,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,CAAC,CAAA;CACnE;AAmFD,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,aAAa,CAAA;CAAE,+BAkS7E"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { useId, useMemo, useState } from 'react';
|
|
3
|
+
import { formatDateTime } from '../lib/dateFormat';
|
|
4
|
+
import { useQuery } from '@tanstack/react-query';
|
|
5
|
+
import { api } from '../api/client';
|
|
6
|
+
import { EmptyState, EmptyStateLink, ErrorState, LoadingState, PageContainer, PageHeader, Pagination, ResizeHandle } from '../components/ui';
|
|
7
|
+
import { useDebouncedValue } from '../hooks/useDebouncedValue';
|
|
8
|
+
const ACTION_COLORS = {
|
|
9
|
+
create: { bg: 'var(--audit-create-bg)', color: 'var(--audit-create-text)', label: 'Create' },
|
|
10
|
+
update: { bg: 'var(--audit-update-bg)', color: 'var(--audit-update-text)', label: 'Update' },
|
|
11
|
+
delete: { bg: 'var(--audit-delete-bg)', color: 'var(--audit-delete-text)', label: 'Delete' },
|
|
12
|
+
allow: { bg: 'var(--audit-create-bg)', color: 'var(--audit-create-text)', label: 'Allowed' },
|
|
13
|
+
deny: { bg: 'var(--audit-delete-bg)', color: 'var(--audit-delete-text)', label: 'Denied' },
|
|
14
|
+
};
|
|
15
|
+
function formatTs(ms) {
|
|
16
|
+
return formatDateTime(ms, true);
|
|
17
|
+
}
|
|
18
|
+
function DiffView({ diff }) {
|
|
19
|
+
const entries = Object.entries(diff);
|
|
20
|
+
if (entries.length === 0)
|
|
21
|
+
return _jsx("span", { style: { color: 'var(--m3-outline)' }, children: "\u2014" });
|
|
22
|
+
// Detect if values are {from, to} pairs (update diff) or a flat snapshot
|
|
23
|
+
const isUpdateDiff = entries.every(([, v]) => v !== null && typeof v === 'object' && 'from' in v && 'to' in v);
|
|
24
|
+
if (isUpdateDiff) {
|
|
25
|
+
return (_jsxs("table", { style: { borderCollapse: 'collapse', fontSize: '11px', width: '100%' }, children: [_jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { style: { textAlign: 'left', padding: '2px 8px 2px 0', color: 'var(--m3-outline)', fontWeight: 600, whiteSpace: 'nowrap' }, children: "Field" }), _jsx("th", { style: { textAlign: 'left', padding: '2px 8px', color: 'var(--m3-outline)', fontWeight: 600 }, children: "Before" }), _jsx("th", { style: { textAlign: 'left', padding: '2px 0', color: 'var(--m3-outline)', fontWeight: 600 }, children: "After" })] }) }), _jsx("tbody", { children: entries.map(([key, val]) => {
|
|
26
|
+
const { from, to } = val;
|
|
27
|
+
return (_jsxs("tr", { children: [_jsx("td", { style: { padding: '2px 8px 2px 0', color: 'var(--m3-secondary)', whiteSpace: 'nowrap', verticalAlign: 'top' }, children: key }), _jsx("td", { style: { padding: '2px 8px', verticalAlign: 'top' }, children: _jsx("span", { style: { color: 'var(--audit-delete-text)', background: 'var(--audit-delete-bg)', borderRadius: 4, padding: '0 4px', display: 'inline-block', wordBreak: 'break-all' }, children: from === null ? 'null' : String(from) }) }), _jsx("td", { style: { padding: '2px 0', verticalAlign: 'top' }, children: _jsx("span", { style: { color: 'var(--audit-create-text)', background: 'var(--audit-create-bg)', borderRadius: 4, padding: '0 4px', display: 'inline-block', wordBreak: 'break-all' }, children: to === null ? 'null' : String(to) }) })] }, key));
|
|
28
|
+
}) })] }));
|
|
29
|
+
}
|
|
30
|
+
// Flat snapshot (create/delete)
|
|
31
|
+
return (_jsx("div", { style: { display: 'flex', flexWrap: 'wrap', gap: '4px 12px' }, children: entries.map(([key, val]) => (_jsxs("span", { style: { fontSize: '11px' }, children: [_jsxs("span", { style: { color: 'var(--m3-outline)' }, children: [key, ": "] }), _jsx("span", { style: { color: 'var(--m3-on-surface)' }, children: val === null ? 'null' : String(val) })] }, key))) }));
|
|
32
|
+
}
|
|
33
|
+
const HEADERS = ['Timestamp', 'User', 'Action', 'Entity'];
|
|
34
|
+
const DEFAULT_WIDTHS = [168, 220, 100, 200];
|
|
35
|
+
const DETAILS_MIN = 160;
|
|
36
|
+
const FILTER_LABEL = 'font-mono text-[10px] uppercase tracking-widest';
|
|
37
|
+
export default function AuditLogPage({ entities }) {
|
|
38
|
+
const [page, setPage] = useState(1);
|
|
39
|
+
const [emailInput, setEmailInput] = useState('');
|
|
40
|
+
const [userEmail, flushEmail] = useDebouncedValue(emailInput, 300);
|
|
41
|
+
const [entityType, setEntityType] = useState('');
|
|
42
|
+
const [action, setAction] = useState('');
|
|
43
|
+
const [fromDate, setFromDate] = useState('');
|
|
44
|
+
const [toDate, setToDate] = useState('');
|
|
45
|
+
const [expanded, setExpanded] = useState(null);
|
|
46
|
+
const [widths, setWidths] = useState(DEFAULT_WIDTHS);
|
|
47
|
+
const idPrefix = useId();
|
|
48
|
+
const gridColumns = `${widths.map((w) => `${w}px`).join(' ')} minmax(${DETAILS_MIN}px, 1fr)`;
|
|
49
|
+
const tableMinWidth = widths.reduce((a, b) => a + b, 0) + DETAILS_MIN + 40;
|
|
50
|
+
function resizeColumn(index, width) {
|
|
51
|
+
setWidths((prev) => prev.map((w, i) => (i === index ? width : w)));
|
|
52
|
+
}
|
|
53
|
+
// Reset to page 1 when filters change
|
|
54
|
+
const filters = useMemo(() => ({
|
|
55
|
+
page,
|
|
56
|
+
limit: 50,
|
|
57
|
+
...(userEmail ? { userEmail } : {}),
|
|
58
|
+
...(entityType ? { entityType } : {}),
|
|
59
|
+
...(action ? { action } : {}),
|
|
60
|
+
...(fromDate ? { from: String(new Date(fromDate).getTime()) } : {}),
|
|
61
|
+
...(toDate ? { to: String(new Date(toDate + 'T23:59:59').getTime()) } : {}),
|
|
62
|
+
}), [page, userEmail, entityType, action, fromDate, toDate]);
|
|
63
|
+
const qs = new URLSearchParams(Object.fromEntries(Object.entries(filters).map(([k, v]) => [k, String(v)]))).toString();
|
|
64
|
+
const { data, isFetching, isLoading, isError, refetch } = useQuery({
|
|
65
|
+
queryKey: ['audit', qs],
|
|
66
|
+
queryFn: () => api.get(`/admin/audit?${qs}`),
|
|
67
|
+
refetchOnMount: 'always',
|
|
68
|
+
});
|
|
69
|
+
function clearFilters() {
|
|
70
|
+
setEmailInput('');
|
|
71
|
+
flushEmail('');
|
|
72
|
+
setEntityType('');
|
|
73
|
+
setAction('');
|
|
74
|
+
setFromDate('');
|
|
75
|
+
setToDate('');
|
|
76
|
+
setPage(1);
|
|
77
|
+
}
|
|
78
|
+
const entries = data?.entries ?? [];
|
|
79
|
+
const filtered = !!(emailInput || entityType || action || fromDate || toDate);
|
|
80
|
+
const totalPages = data?.pages ?? 1;
|
|
81
|
+
return (_jsxs(PageContainer, { children: [_jsx(PageHeader, { title: "Audit Log", subtitle: data ? `${data.total} entries` : undefined }), _jsxs("div", { className: "rounded-2xl p-4 flex flex-wrap gap-3 items-end", style: { background: 'var(--m3-surface-container-low)', border: '1px solid var(--m3-outline-variant)' }, children: [_jsxs("div", { className: "flex flex-col gap-1 min-w-[180px] flex-1", children: [_jsx("label", { htmlFor: `${idPrefix}-user`, className: FILTER_LABEL, style: { color: 'var(--m3-outline)' }, children: "User" }), _jsx("input", { id: `${idPrefix}-user`, value: emailInput, onChange: (e) => { setEmailInput(e.target.value); setPage(1); }, onKeyDown: (e) => { if (e.key === 'Enter')
|
|
82
|
+
flushEmail(); }, placeholder: "Filter by email\u2026", className: "input-sig", style: { height: '36px', fontSize: '13px' } })] }), _jsxs("div", { className: "flex flex-col gap-1", children: [_jsx("label", { htmlFor: `${idPrefix}-entity`, className: FILTER_LABEL, style: { color: 'var(--m3-outline)' }, children: "Entity" }), _jsxs("select", { id: `${idPrefix}-entity`, value: entityType, onChange: (e) => { setEntityType(e.target.value); setPage(1); }, className: "input-sig", style: { height: '36px', fontSize: '13px', width: '180px' }, children: [_jsx("option", { value: "", children: "All entities" }), entities.groups.map((group) => (_jsx("optgroup", { label: group.label, children: group.types.map((t) => _jsx("option", { value: t, children: entities.labels[t] }, t)) }, group.label)))] })] }), _jsxs("div", { className: "flex flex-col gap-1", children: [_jsx("label", { htmlFor: `${idPrefix}-action`, className: FILTER_LABEL, style: { color: 'var(--m3-outline)' }, children: "Action" }), _jsxs("select", { id: `${idPrefix}-action`, value: action, onChange: (e) => { setAction(e.target.value); setPage(1); }, className: "input-sig", style: { height: '36px', fontSize: '13px', width: '130px' }, children: [_jsx("option", { value: "", children: "All actions" }), _jsx("option", { value: "create", children: "Create" }), _jsx("option", { value: "update", children: "Update" }), _jsx("option", { value: "delete", children: "Delete" }), _jsx("option", { value: "allow", children: "Allowed" }), _jsx("option", { value: "deny", children: "Denied" })] })] }), _jsxs("div", { className: "flex flex-col gap-1", children: [_jsx("label", { htmlFor: `${idPrefix}-from`, className: FILTER_LABEL, style: { color: 'var(--m3-outline)' }, children: "From" }), _jsx("input", { id: `${idPrefix}-from`, type: "date", value: fromDate, onChange: (e) => { setFromDate(e.target.value); setPage(1); }, className: "input-sig", style: { height: '36px', fontSize: '13px', width: '150px' } })] }), _jsxs("div", { className: "flex flex-col gap-1", children: [_jsx("label", { htmlFor: `${idPrefix}-to`, className: FILTER_LABEL, style: { color: 'var(--m3-outline)' }, children: "To" }), _jsx("input", { id: `${idPrefix}-to`, type: "date", value: toDate, onChange: (e) => { setToDate(e.target.value); setPage(1); }, className: "input-sig", style: { height: '36px', fontSize: '13px', width: '150px' } })] }), (emailInput || entityType || action || fromDate || toDate) && (_jsx("button", { type: "button", onClick: clearFilters, className: "btn btn-ghost btn-sm self-end", style: { height: '36px' }, children: "Clear" }))] }), isLoading ? (_jsx(LoadingState, { label: "Loading audit log\u2026" })) : isError ? (_jsx(ErrorState, { message: "Could not load the audit log.", onRetry: () => void refetch() })) : (_jsx("div", { className: "rounded-2xl overflow-x-auto", style: { border: '1px solid var(--m3-outline-variant)', opacity: isFetching ? 0.7 : 1, transition: 'opacity 0.15s' }, children: _jsxs("div", { style: { minWidth: tableMinWidth }, children: [_jsxs("div", { className: "grid font-mono text-xs uppercase tracking-wider px-5 py-2.5", style: {
|
|
83
|
+
gridTemplateColumns: gridColumns,
|
|
84
|
+
color: 'var(--m3-outline)',
|
|
85
|
+
borderBottom: '1px solid var(--m3-outline-variant)',
|
|
86
|
+
background: 'var(--m3-surface-container)',
|
|
87
|
+
}, children: [HEADERS.map((label, i) => (_jsxs("span", { className: "relative -my-2.5 py-2.5 pr-3", children: [label, _jsx(ResizeHandle, { label: label, width: widths[i], measure: () => widths[i] ?? 0, onResize: (w) => resizeColumn(i, w), onReset: () => resizeColumn(i, DEFAULT_WIDTHS[i] ?? 0) })] }, label))), _jsx("span", { children: "Details" })] }), entries.map((entry) => {
|
|
88
|
+
const ac = ACTION_COLORS[entry.action];
|
|
89
|
+
const entityLabel = entities.labels[entry.entityType] ?? entry.entityType;
|
|
90
|
+
const entityIcon = entities.icons[entry.entityType] ?? 'article';
|
|
91
|
+
const isExpanded = expanded === entry.id;
|
|
92
|
+
const hasDiff = entry.diff && Object.keys(entry.diff).length > 0;
|
|
93
|
+
const diffId = `${idPrefix}-diff-${entry.id}`;
|
|
94
|
+
const fieldCount = hasDiff ? Object.keys(entry.diff).length : 0;
|
|
95
|
+
return (_jsxs("div", { style: { borderBottom: '1px solid var(--m3-outline-variant)' }, children: [_jsxs("div", { className: "grid items-center px-5 py-3", style: { gridTemplateColumns: gridColumns }, children: [_jsx("span", { className: "font-mono text-xs", style: { color: 'var(--m3-secondary)' }, children: formatTs(entry.timestamp) }), _jsx("span", { className: "text-sm truncate", style: { color: 'var(--m3-on-surface)' }, title: entry.userEmail, children: entry.userEmail }), _jsx("span", { className: "text-xs font-bold px-2 py-0.5 rounded-full w-fit", style: { background: ac.bg, color: ac.color }, children: ac.label }), _jsxs("div", { className: "flex items-center gap-1.5 min-w-0", children: [_jsx("span", { className: "material-symbols-outlined flex-shrink-0", "aria-hidden": "true", style: { fontSize: '14px', color: 'var(--m3-secondary)' }, children: entityIcon }), _jsxs("div", { className: "min-w-0", children: [_jsx("div", { className: "font-mono text-[10px] uppercase tracking-wider", style: { color: 'var(--m3-outline)' }, children: entityLabel }), _jsx("div", { className: "text-xs truncate", style: { color: 'var(--m3-on-surface)' }, title: entry.entityName, children: entry.entityName })] })] }), hasDiff ? (_jsxs("button", { type: "button", onClick: () => setExpanded(isExpanded ? null : entry.id), "aria-expanded": isExpanded, "aria-controls": isExpanded ? diffId : undefined, className: "focus-ring flex items-center justify-between gap-2 min-w-0 -mx-2 px-2 py-1.5 rounded-lg text-left transition-colors hover:bg-[var(--m3-surface-container-low)]", children: [_jsx("span", { className: "text-xs", style: { color: 'var(--m3-secondary)' }, children: isExpanded ? 'Hide details' : entry.action === 'deny' ? 'Show reason' : entry.action === 'allow' ? 'Show details' : `${fieldCount} field${fieldCount !== 1 ? 's' : ''} changed` }), _jsx("span", { className: "material-symbols-outlined", "aria-hidden": "true", style: {
|
|
96
|
+
fontSize: '16px', color: 'var(--m3-secondary)',
|
|
97
|
+
transform: isExpanded ? 'rotate(180deg)' : 'none',
|
|
98
|
+
transition: 'transform 0.2s',
|
|
99
|
+
}, children: "expand_more" })] })) : (_jsx("span", { className: "text-xs", style: { color: 'var(--m3-outline)' }, children: "\u2014" }))] }), isExpanded && hasDiff && (_jsx("div", { id: diffId, className: "px-5 py-3", style: { borderTop: '1px solid var(--m3-outline-variant)', background: 'var(--m3-surface-container-lowest)' }, children: _jsx(DiffView, { diff: entry.diff }) }))] }, entry.id));
|
|
100
|
+
}), entries.length === 0 && (_jsx(EmptyState, { variant: "row", className: "px-5 py-7", icon: "history", title: "No audit entries found.", description: filtered
|
|
101
|
+
? _jsxs(_Fragment, { children: ["Try widening the date range, or ", _jsx(EmptyStateLink, { onClick: clearFilters, children: "clear all filters" }), "."] })
|
|
102
|
+
: 'Changes made in the admin panel and every sign-in, allowed or denied, are recorded here.' }))] }) })), _jsx(Pagination, { page: page, pageCount: totalPages, onPageChange: setPage, summary: `Page ${page} of ${totalPages} · ${data?.total ?? 0} entries` })] }));
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=AuditLog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AuditLog.js","sourceRoot":"","sources":["../../src/pages/AuditLog.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Backups.d.ts","sourceRoot":"","sources":["../../src/pages/Backups.tsx"],"names":[],"mappings":"AAgBA,MAAM,CAAC,OAAO,UAAU,WAAW,gCAyJlC"}
|