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 () => {