From 2a21ede9120664ca53e5c4e4548c67d03113cfb4 Mon Sep 17 00:00:00 2001 From: Bryan Van Deusen Date: Fri, 15 May 2026 07:56:22 -0400 Subject: [PATCH] feat(fc2b): wire SuggestionsPanel + rename into TagPanel; reject-on-remove MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit TagPanel now renders SuggestionsPanel below the current-tags area and adds a per-chip kebab → Rename… (TagRenameDialog). modal store's removeTag now also POSTs suggestions/dismiss after the delete so removing an auto-applied tag records a per-image rejection and the allowlist maintenance sweep won't re-apply it (closes the remove→re-apply loop identified in the spec). Co-Authored-By: Claude Opus 4.7 (1M context) --- frontend/src/components/modal/TagPanel.vue | 41 ++++++++++++++++++++++ frontend/src/stores/modal.js | 6 ++++ 2 files changed, 47 insertions(+) diff --git a/frontend/src/components/modal/TagPanel.vue b/frontend/src/components/modal/TagPanel.vue index 7ca5e08..4b3066a 100644 --- a/frontend/src/components/modal/TagPanel.vue +++ b/frontend/src/components/modal/TagPanel.vue @@ -10,6 +10,19 @@ > {{ iconFor(tag.kind) }} {{ tag.name }} + + + + + Rename… + + + No tags yet. @@ -23,6 +36,19 @@ {{ errorMsg }} + + + + + + @@ -31,6 +57,8 @@ import { ref } from 'vue' import { useModalStore } from '../../stores/modal.js' import { useTagStore } from '../../stores/tags.js' import TagAutocomplete from './TagAutocomplete.vue' +import SuggestionsPanel from './SuggestionsPanel.vue' +import TagRenameDialog from './TagRenameDialog.vue' const modal = useModalStore() const store = useTagStore() @@ -58,6 +86,19 @@ async function onPickNew(payload) { try { await modal.createAndAdd(payload) } catch (e) { errorMsg.value = e.message } } + +const renameDialog = ref(false) +const renameTarget = ref(null) + +function openRename(tag) { + renameTarget.value = tag + renameDialog.value = true +} +async function onRenamed() { + renameDialog.value = false + // Reflect the new name in the modal's current tag list without a full reload. + await modal.reloadTags() +}