diff --git a/frontend/src/App.vue b/frontend/src/App.vue index b6e15ff..c6e43f5 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -2,9 +2,13 @@ import { computed, onBeforeUnmount, onMounted, reactive, ref, watch } from "vue"; import { GnActionList, + GnAlert, GnBadge, GnButton, - GnCheckbox, + GnChip, + GnChipGroup, + GnConfirmDialog, + GnCopyButton, GnDescriptionList, GnDropdown, GnEmptyState, @@ -17,11 +21,16 @@ GnPagination, GnSearchField, GnSkeleton, + GnStatusCard, + GnSwitch, GnTable, + GnTagInput, GnTextarea, GnTimeline, GnToastProvider, - GnToolbar + GnToolbar, + GnTooltip, + GnUserCard } from "gnexus-ui-kit/vue"; import { api } from "./api"; @@ -51,7 +60,6 @@ const loading = ref(false); const error = ref(""); const toastProvider = ref(null); -const copiedFieldKey = ref(""); const secrets = ref([]); const total = ref(0); const query = ref(""); @@ -108,7 +116,7 @@ category: "", source: "", notes: "", - tags: "", + tags: [], allow_ui: true, allow_rest_api: true, allow_mcp: false @@ -122,7 +130,7 @@ category: "", source: "", notes: "", - tags: "", + tags: [], status: "actual", archived: false, allow_ui: true, @@ -383,7 +391,7 @@ form.category = ""; form.source = ""; form.notes = ""; - form.tags = ""; + form.tags = []; form.allow_ui = true; form.allow_rest_api = true; form.allow_mcp = false; @@ -495,7 +503,7 @@ editForm.category = secret.category || ""; editForm.source = secret.source || ""; editForm.notes = secret.notes || ""; - editForm.tags = secret.tags?.join(", ") || ""; + editForm.tags = secret.tags || []; editForm.status = secret.status || "actual"; editForm.archived = Boolean(secret.archived); editForm.allow_ui = Boolean(secret.allow_ui); @@ -586,7 +594,7 @@ category: form.category || null, source: form.source || null, notes: form.notes || null, - tags: form.tags.split(",").map((tag) => tag.trim()).filter(Boolean), + tags: form.tags, allow_ui: form.allow_ui, allow_rest_api: form.allow_rest_api, allow_mcp: form.allow_mcp, @@ -605,7 +613,7 @@ category: editForm.category || null, source: editForm.source || null, notes: editForm.notes || null, - tags: editForm.tags.split(",").map((tag) => tag.trim()).filter(Boolean), + tags: editForm.tags, status: editForm.status, archived: editForm.archived, allow_ui: editForm.allow_ui, @@ -659,18 +667,6 @@ revealedVisibleFields.value = new Set(); } -async function copyValue(value, key) { - if (!value) return; - await navigator.clipboard.writeText(value); - toastProvider.value?.success({ title: "Copied", text: "Value copied to clipboard.", lifetime: 1800 }); - if (key) { - copiedFieldKey.value = key; - setTimeout(() => { - if (copiedFieldKey.value === key) copiedFieldKey.value = ""; - }, 2000); - } -} - function maskValue(value) { return "*".repeat(Math.max(8, String(value || "").length)); } @@ -1009,7 +1005,7 @@
-

{{ error }}

+ {{ error }} @@ -1249,7 +1241,7 @@ accept="application/json,.json" @change="handleImportFiles" /> -

{{ importError }}

+ {{ importError }}
{{ importPreview.secrets?.length || 0 }} secrets ready {{ importFile?.name }} @@ -1309,20 +1301,28 @@ Check diagnostics - - - - - +
+ + + +
+ -
- +
Available from the web interface after login.
- +
Available to external clients using API tokens.
- +
Available to MCP clients when token scopes allow it.
@@ -1480,7 +1481,13 @@ - +
@@ -1500,22 +1507,22 @@ > Outdated - +
diff --git a/frontend/src/styles.css b/frontend/src/styles.css index 614778c..6359e01 100644 --- a/frontend/src/styles.css +++ b/frontend/src/styles.css @@ -308,6 +308,11 @@ overflow: auto; } +.admin-user-cards { + display: grid; + gap: 10px; +} + .revealed-fields-list.list-actions { max-width: none; gap: 0;