From a50701ee6d705c101fdccbcfb99adf27c8829895 Mon Sep 17 00:00:00 2001 From: Bryan Van Deusen Date: Sat, 16 May 2026 13:42:46 -0400 Subject: [PATCH] feat(frontend): inline tag rename, merge confirm dialog, TagsView wiring Co-Authored-By: Claude Opus 4.7 (1M context) --- .../discovery/MergeConfirmDialog.vue | 40 +++++++++++++ frontend/src/components/discovery/TagCard.vue | 59 +++++++++++++++++-- frontend/src/views/TagsView.vue | 23 +++++++- 3 files changed, 115 insertions(+), 7 deletions(-) create mode 100644 frontend/src/components/discovery/MergeConfirmDialog.vue diff --git a/frontend/src/components/discovery/MergeConfirmDialog.vue b/frontend/src/components/discovery/MergeConfirmDialog.vue new file mode 100644 index 0000000..c253746 --- /dev/null +++ b/frontend/src/components/discovery/MergeConfirmDialog.vue @@ -0,0 +1,40 @@ + + + diff --git a/frontend/src/components/discovery/TagCard.vue b/frontend/src/components/discovery/TagCard.vue index 8438dd2..b841ec2 100644 --- a/frontend/src/components/discovery/TagCard.vue +++ b/frontend/src/components/discovery/TagCard.vue @@ -1,5 +1,5 @@ diff --git a/frontend/src/views/TagsView.vue b/frontend/src/views/TagsView.vue index c82a018..8381763 100644 --- a/frontend/src/views/TagsView.vue +++ b/frontend/src/views/TagsView.vue @@ -25,7 +25,8 @@
@@ -33,6 +34,13 @@
+ + @@ -41,6 +49,7 @@ import { ref, watch, onMounted, onUnmounted } from 'vue' import { useRouter } from 'vue-router' import { useTagDirectoryStore } from '../stores/tagDirectory.js' import TagCard from '../components/discovery/TagCard.vue' +import MergeConfirmDialog from '../components/discovery/MergeConfirmDialog.vue' const KINDS = ['artist', 'character', 'copyright', 'general', 'series', 'meta'] const store = useTagDirectoryStore() @@ -49,6 +58,18 @@ const router = useRouter() const search = ref('') const kind = ref(null) const sentinelEl = ref(null) +const pendingMerge = ref(null) + +async function onRename({ id, name }) { + const res = await store.rename(id, name) + if (res.collision) pendingMerge.value = res.collision +} + +async function confirmMerge() { + const c = pendingMerge.value + pendingMerge.value = null + if (c) await store.merge(c.sourceId, c.target.id) +} let debounce = null watch(search, (v) => {