diff --git a/frontend/src/views/SeriesManageView.vue b/frontend/src/views/SeriesManageView.vue
index 35cc619..ad9d4e2 100644
--- a/frontend/src/views/SeriesManageView.vue
+++ b/frontend/src/views/SeriesManageView.vue
@@ -2,6 +2,12 @@
{{ store.series?.name || 'Series' }}
+
{{ store.chapters.length }} part(s) · {{ store.pageCount }} page(s)
@@ -214,6 +220,14 @@
+
+
+
+
@@ -223,6 +237,7 @@ import { useRoute } from 'vue-router'
import { useSeriesManageStore, moveItem } from '../stores/seriesManage.js'
import { useInfiniteScroll } from '../composables/useInfiniteScroll.js'
import KebabMenu from '../components/common/KebabMenu.vue'
+import TagRenameDialog from '../components/modal/TagRenameDialog.vue'
const route = useRoute()
const store = useSeriesManageStore()
@@ -231,6 +246,14 @@ const drag = ref(null) // { chapterId, idx }
const titleDraft = reactive({}) // chapterId -> draft title
const partDraft = reactive({}) // chapterId -> draft stated_part (string)
const pickerOpen = ref(false)
+const renameOpen = ref(false)
+
+// A series IS a Tag(kind=series); TagRenameDialog PATCHes /api/tags/ and
+// handles the same-name collision→merge flow. Reflect the new name in place.
+function onRenamed(updated) {
+ renameOpen.value = false
+ if (store.series && updated?.name) store.series.name = updated.name
+}
// Keep local drafts in sync with loaded chapters. Edits commit on blur/Enter,
// which refreshes and resets the draft to the saved value.