diff --git a/frontend/messages/de.json b/frontend/messages/de.json
index 427baf85..3cf6c8c9 100644
--- a/frontend/messages/de.json
+++ b/frontend/messages/de.json
@@ -604,6 +604,7 @@
"admin_tag_delete_only_this_sub_root": "Untergeordnete werden zu Root-Schlagwörtern",
"admin_tag_delete_subtree": "Gesamten Teilbaum löschen",
"admin_tag_delete_subtree_warn": "Löscht auch {count} untergeordnete Schlagwörter",
+ "admin_tag_delete_subtree_confirm_btn": "Teilbaum löschen",
"admin_tag_delete_confirm_heading": "Gib «{name}» zur Bestätigung ein:",
"filter_operator_and": "UND",
"filter_operator_or": "ODER",
diff --git a/frontend/messages/en.json b/frontend/messages/en.json
index fdc835e2..983880b0 100644
--- a/frontend/messages/en.json
+++ b/frontend/messages/en.json
@@ -604,6 +604,7 @@
"admin_tag_delete_only_this_sub_root": "Children will become root tags",
"admin_tag_delete_subtree": "Delete entire subtree",
"admin_tag_delete_subtree_warn": "Also deletes {count} child tags",
+ "admin_tag_delete_subtree_confirm_btn": "Delete subtree",
"admin_tag_delete_confirm_heading": "Type «{name}» to confirm:",
"filter_operator_and": "AND",
"filter_operator_or": "OR",
diff --git a/frontend/messages/es.json b/frontend/messages/es.json
index 04180d98..cfe3c850 100644
--- a/frontend/messages/es.json
+++ b/frontend/messages/es.json
@@ -604,6 +604,7 @@
"admin_tag_delete_only_this_sub_root": "Las subordinadas se convertirán en etiquetas raíz",
"admin_tag_delete_subtree": "Eliminar todo el subárbol",
"admin_tag_delete_subtree_warn": "También elimina {count} etiquetas subordinadas",
+ "admin_tag_delete_subtree_confirm_btn": "Eliminar subárbol",
"admin_tag_delete_confirm_heading": "Escribe «{name}» para confirmar:",
"filter_operator_and": "Y",
"filter_operator_or": "O",
diff --git a/frontend/src/routes/admin/tags/[id]/TagDeleteGuard.svelte b/frontend/src/routes/admin/tags/[id]/TagDeleteGuard.svelte
index 9238e769..f3d9498f 100644
--- a/frontend/src/routes/admin/tags/[id]/TagDeleteGuard.svelte
+++ b/frontend/src/routes/admin/tags/[id]/TagDeleteGuard.svelte
@@ -91,10 +91,11 @@ const descendantCount = $derived.by(() => {
diff --git a/frontend/src/routes/admin/tags/[id]/TagDeleteGuard.svelte.spec.ts b/frontend/src/routes/admin/tags/[id]/TagDeleteGuard.svelte.spec.ts
index 3f8565b0..86abf0aa 100644
--- a/frontend/src/routes/admin/tags/[id]/TagDeleteGuard.svelte.spec.ts
+++ b/frontend/src/routes/admin/tags/[id]/TagDeleteGuard.svelte.spec.ts
@@ -23,22 +23,27 @@ describe('TagDeleteGuard', () => {
it('delete button is disabled initially', async () => {
render(TagDeleteGuard, { tag, allTags });
- const btn = document.querySelector('button[type="submit"]');
- expect(btn?.disabled).toBe(true);
+ await expect.element(page.getByTestId('delete-submit-btn')).toBeDisabled();
});
it('delete button is enabled after selecting single radio', async () => {
render(TagDeleteGuard, { tag, allTags });
await page.getByRole('radio', { name: /Nur dieses/i }).click();
- const btn = document.querySelector('button[type="submit"]');
- expect(btn?.disabled).toBe(false);
+ await expect.element(page.getByTestId('delete-submit-btn')).not.toBeDisabled();
});
it('delete button is enabled after selecting subtree radio', async () => {
render(TagDeleteGuard, { tag, allTags });
await page.getByRole('radio', { name: /Gesamten Teilbaum/i }).click();
- const btn = document.querySelector('button[type="submit"]');
- expect(btn?.disabled).toBe(false);
+ await expect.element(page.getByTestId('delete-submit-btn')).not.toBeDisabled();
+ });
+
+ it('delete button shows subtree-specific text when subtree mode is selected', async () => {
+ render(TagDeleteGuard, { tag, allTags });
+ await page.getByRole('radio', { name: /Gesamten Teilbaum/i }).click();
+ await expect
+ .element(page.getByTestId('delete-submit-btn'))
+ .toHaveTextContent(/Teilbaum löschen/i);
});
it('shows descendant count in impact summary', async () => {