From 94591dfda40950afe7aedbbb4edf2316ae361094 Mon Sep 17 00:00:00 2001 From: MechaCat02 Date: Thu, 25 Jun 2026 20:05:42 +0200 Subject: [PATCH] fix(manga): show force-resync result on mobile, not just desktop MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `.resync-msg` (the admin Force-resync result) was display:none under 640px, so mobile admins — who trigger resync from the overflow sheet — got no success or error feedback. The element is already a sibling of `.action-row` (not a child), so it survives the row being hidden; the only thing hiding it was an explicit mobile rule. Drop that rule. e2e: a mobile admin triggers Force resync from the overflow sheet and now sees the "Metadata updated" result (written test-first against the hidden element, then unhidden). Co-Authored-By: Claude Opus 4.8 (1M context) --- frontend/e2e/mobile-manga-detail.spec.ts | 45 +++++++++++++++++++++ frontend/src/routes/manga/[id]/+page.svelte | 6 +-- 2 files changed, 48 insertions(+), 3 deletions(-) diff --git a/frontend/e2e/mobile-manga-detail.spec.ts b/frontend/e2e/mobile-manga-detail.spec.ts index 1d8c74c..d71b8cd 100644 --- a/frontend/e2e/mobile-manga-detail.spec.ts +++ b/frontend/e2e/mobile-manga-detail.spec.ts @@ -236,6 +236,51 @@ test.describe('mobile manga detail', () => { await expect(sheet.getByTestId('overflow-add-to-collection')).toBeVisible(); }); + test('phone viewport: force resync from the overflow sheet surfaces a result message', async ({ + page + }) => { + await mockDetail(page, { authed: true }); + // Upgrade the session to admin so the Force resync action is offered. + // Registered after mockDetail so this auth/me wins (Playwright routes + // resolve most-recently-registered first). + await page.route('**/api/v1/auth/me', (route) => + route.fulfill({ + status: 200, + contentType: 'application/json', + body: JSON.stringify({ + user: { + id: 'u1', + username: 'admin', + created_at: '2026-01-01T00:00:00Z', + is_admin: true + } + }) + }) + ); + await page.route(`**/api/v1/admin/mangas/${mangaId}/resync`, (route) => + route.fulfill({ + status: 200, + contentType: 'application/json', + body: JSON.stringify({ + manga: mangaFixture(), + cover_fetched: true, + metadata_status: 'updated' + }) + }) + ); + await page.setViewportSize(MOBILE); + await page.goto(`/manga/${mangaId}`); + + await page.getByTestId('detail-overflow').click(); + await page.getByTestId('overflow-force-resync').click(); + + // The result was previously display:none under 640px, leaving mobile + // admins with no feedback. It must now be visible. + const msg = page.getByTestId('force-resync-message'); + await expect(msg).toBeVisible(); + await expect(msg).toContainText(/Metadata updated/i); + }); + test('desktop viewport: mobile hero is hidden, existing layout + action-row stays', async ({ page }) => { diff --git a/frontend/src/routes/manga/[id]/+page.svelte b/frontend/src/routes/manga/[id]/+page.svelte index b339f70..25339b8 100644 --- a/frontend/src/routes/manga/[id]/+page.svelte +++ b/frontend/src/routes/manga/[id]/+page.svelte @@ -1243,9 +1243,9 @@ display: none; } - .resync-msg { - display: none; - } + /* `.resync-msg` is a sibling of `.action-row`, not a child, so it + survives the row being hidden. Keep it visible on mobile: admins + trigger Force resync from the overflow sheet and need the result. */ .continue { display: none;