feat(ui): make stat numbers clickable to open games
Build, Test & Push Frontend / quality-check (push) Successful in 28s
Build, Test & Push Frontend / docker (push) Successful in 26s

StatDrill context holds one dialog for a page. StatCount wraps a number:
total and status counts link to the library filter, other numbers open
StatGamesDialog. DrillRow and DrillButton support drill-down in tag bars
(genres, platforms, moods) and other stat displays. Dialog shows 40 games
per page with bottom-sheet layout on phones, handles pagination and errors
(403 not shared, 401 expired, 400 bad argument).
This commit is contained in:
lobo committed 2026-10-03 18:51:59 +02:00
1 parent ed5df8c40d
commit 777ba87fd6
31 files changed
+1026 -261

No files matched your search

+32
View File
@@ -89,4 +89,36 @@ describe('StatsPage', () => {
await waitFor(() => expect(fetch).toHaveBeenCalledTimes(2));
});
it('opensTheGamesBehindARowWithTheRawName', async () => {
fetchRoutes({
'GET /api/library/stats': json(200, stats()),
'GET /api/library/stats/games': json(200, {content: [{appid: 620, name: 'Portal 2', status: 'BACKLOG', playtimeMinutes: 60}],
page: 0, size: 40, totalElements: 1, totalPages: 1}),
});
renderPage();
fireEvent.click(await screen.findByRole('button', {name: /STATS\.GENRE/}));
expect(await screen.findByRole('dialog')).toBeTruthy();
await waitFor(() => expect(fetch.mock.calls.at(-1)[0]).toMatch(/stats\/games\?key=GENRE&arg=Shooter&page=0$/));
});
it('linksAStatusCountToTheFilteredLibrary', async () => {
answerStats(json(200, stats()));
renderPage();
const link = await screen.findByRole('link', {name: 'BACKLOG.STATUS.BACKLOG: 5'});
expect(link.getAttribute('href')).toBe('/library?hideDuplicates=true&status=BACKLOG');
});
it('leavesTheMoonTripsAlone', async () => {
answerStats(json(200, stats()));
renderPage();
await screen.findByText('STATS.HABITS.MOON');
expect(screen.queryByRole('button', {name: /STATS.HABITS.MOON/})).toBeNull();
});
});