feat(frontend): inline tag rename, merge confirm dialog, TagsView wiring

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-16 13:42:46 -04:00
parent 1d1574e586
commit a50701ee6d
3 changed files with 115 additions and 7 deletions
+22 -1
View File
@@ -25,7 +25,8 @@
<div class="fc-tags__grid">
<TagCard
v-for="c in store.cards" :key="c.id" :card="c" @open="openTag"
v-for="c in store.cards" :key="c.id" :card="c"
@open="openTag" @rename="onRename"
/>
</div>
@@ -33,6 +34,13 @@
<v-progress-circular indeterminate color="accent" size="28" />
</div>
<div v-else-if="store.hasMore" ref="sentinelEl" class="fc-tags__sentinel" />
<MergeConfirmDialog
:model-value="pendingMerge !== null"
:collision="pendingMerge"
@confirm="confirmMerge"
@cancel="pendingMerge = null"
/>
</v-container>
</template>
@@ -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) => {