Commit Graph
100 Commits
Author SHA1 Message Date
adrianbonpin 5db88b25cb fix: add syncCompleted reset, Escape key handler, and a11y attributes to sync overlay 2026-04-29 12:44:02 +08:00
adrianbonpin b2be929f63 fix: sync modal now fills viewport via portal and persists after completion 2026-04-29 12:26:08 +08:00
adrianbonpin e49908cd73 feat: add sync progress visualization with real-time status updates 2026-04-29 12:01:29 +08:00
adrianbonpin d79a2605ed fix: resolve type errors and lint warnings in sync system 2026-04-29 11:46:35 +08:00
adrianbonpin a4cf2636e7 feat: add image validation and SteamGridDB fallback to game stub creation 2026-04-29 11:36:38 +08:00
adrianbonpin caae92ca4f fix: clear selection on pagination/search, add error handling for bulk sync 2026-04-29 11:32:25 +08:00
adrianbonpin 1215aca41a feat: add checkbox selection and bulk sync to manage games page 2026-04-29 11:25:00 +08:00
adrianbonpin 06e811613d fix: add bulk sync limit (100), fix N+1 queries, improve route ordering and responses 2026-04-29 11:19:19 +08:00
adrianbonpin 5d388f6f49 feat: add sync API endpoints (single + bulk) 2026-04-29 10:58:21 +08:00
adrianbonpin 3388d3225a fix: use exponential backoff for sync retry instead of fixed 7-day interval 2026-04-29 10:55:21 +08:00
adrianbonpin 5227b1fd90 feat: enhance sync with error tracking, image validation, and SteamGridDB fallback 2026-04-29 10:44:49 +08:00
adrianbonpin 861ac7dfdc schema: add sync error tracking columns to games table 2026-04-29 10:33:53 +08:00
adrianbonpin 133a4a9cc2 fix: resolve lint warnings - remove unused imports and fix type annotations 2026-04-29 01:47:11 +08:00
adrianbonpin 7903c9fbbd Tasks 12-13: Fix release date input to type=date, add sort direction toggle to games page 2026-04-29 01:45:04 +08:00
adrianbonpin 8a063bfb6c fix: include benchmark games in device filter and exclude soft-deleted entries from search
Task 10: Device filter now combines games with platform support entries
AND games with performance entries for the selected hardware, instead of
only checking gamePlatformSupport. This ensures games that have benchmarks
but no explicit platform support entry still appear in filtered results.

Task 11: The benchmark count query (bCounts) in unified search now filters
out soft-deleted performance entries using isRemoved = false. The pCounts
and perfStats queries already had this filter; only bCounts was missing it.
2026-04-29 01:43:37 +08:00
adrianbonpin dfae540fd4 feat(manage): add manual resync button for games 2026-04-29 01:39:58 +08:00
adrianbonpin b64e55157e fix: add horizontal scroll to benchmarks table, add hard delete functionality
- Wrap table in overflow-x-auto container with min-w-[800px] to prevent overflow on smaller screens
- Add hard delete (purge) button to actions column for each benchmark entry
- Add confirmation dialog for permanent deletion with warning
- Add handleHardDelete handler that calls DELETE /api/admin/performance/:id/hard-delete
- Add DELETE endpoint for hard-deleting performance entries from the database
- Expand confirmAction state type to include 'hardDelete'
2026-04-29 01:38:29 +08:00
adrianbonpin 2fed5a3964 feat: improve users management UI with card-based layout 2026-04-29 01:34:59 +08:00
adrianbonpin f7d825f5b3 tasks 5 & 6: update /admin UI refs to /manage, full-width manage layout 2026-04-29 01:33:07 +08:00
adrianbonpin 6642501b91 refactor: rename admin to manage in layout, sidebar, and redirects 2026-04-29 01:31:44 +08:00
adrianbonpin b68bf36bff refactor: rename admin route group to manage 2026-04-29 01:25:00 +08:00
adrianbonpin fcfcce614a chore: fix lint and type errors from feature bundle implementation 2026-04-29 00:54:39 +08:00
adrianbonpin 2101dfef08 feat: compare page with game selector, stats comparison, and charts 2026-04-29 00:45:16 +08:00
adrianbonpin 0f0176ae39 feat: add compare API endpoints for games and presets 2026-04-29 00:36:21 +08:00
adrianbonpin 0a6f5ac8d2 feat: non-Steam game edit page and edit button on game details 2026-04-29 00:32:44 +08:00
adrianbonpin b8173bd8f8 feat: non-Steam game editing API, createdBy tracking, and source badges in search 2026-04-29 00:16:43 +08:00
adrianbonpin c6d4e7b3d1 feat: non-Steam game submission wizard with SteamGridDB integration 2026-04-29 00:00:10 +08:00
adrianbonpin 74fe0447ee feat: add SteamGridDB proxy API for non-Steam game images 2026-04-28 23:36:00 +08:00
adrianbonpin cc34fd17ef feat: add pinned presets with admin pin/unpin and dedicated section 2026-04-28 23:32:32 +08:00
adrianbonpin 23fa7be89f feat: display system requirements and store stats on game details page 2026-04-28 23:24:33 +08:00
adrianbonpin 799bfbbf31 feat: add system requirements, store stats, and pricing to game schema and steam sync 2026-04-28 23:13:08 +08:00
adrianbonpin 7e2ab978e1 feat: add performance tier and stability scatter charts 2026-04-28 23:08:01 +08:00
adrianbonpin 741c19e840 feat: display 1% low FPS in presets, stats API, and game details 2026-04-28 22:56:43 +08:00
adrianbonpin 4d759160db feat: add 1% low FPS field to benchmark submission wizard 2026-04-28 22:43:46 +08:00
adrianbonpin 943fcff12b feat: add fps_one_percent_low column to performance entries 2026-04-28 22:39:23 +08:00
adrianbonpin ab27ba948f fix: add image fallback chain for missing game covers in search 2026-04-28 22:30:19 +08:00
adrianbonpin 59e3ca338b fix(search): correct PriceTag logic for free pricing
- Return null when price is missing instead of showing 'Free'
- Show green 'Free' badge only when initial === 0 && final === 0
- Show emerald 'Free*' badge with tooltip for promotional free (final === 0, initial > 0)
- Fixes incorrect 'Free' label for games like Days Gone during free weekends
2026-04-28 22:28:01 +08:00
adrianbonpin c91433958b fix: remove SteamOS prefix doubling on osVersion display 2026-04-28 22:26:04 +08:00
adrianbonpin 748a9fa8c8 fix: tiptap duplicate link extension warning + settings editor number inputs to text+inputMode 2026-04-28 10:07:03 +08:00
adrianbonpin d6a9601591 fix: refactor wizard edit mode to use lazy state init instead of effect setState 2026-04-28 09:51:26 +08:00
adrianbonpin d8d0e8f826 fix: use vote-based reputation instead of contributions*10 2026-04-28 09:38:38 +08:00
adrianbonpin a2ff39c1b0 feat: add share and edit links to preset modal, sync URL preset param 2026-04-28 09:32:18 +08:00
adrianbonpin f502d120a7 refactor: replace preset detail modal layoutId morph with bottom sheet slide-up + category crossfade
- Remove layoutId from preset card in game-page-client.tsx and modal in preset-detail-modal.tsx to eliminate text smearing during morph animation.
- Replace modal scale/opacity spring animation with bottom sheet y-slide spring (y: 100% → 0).
- Wrap settings table content in AnimatePresence mode='wait' with keyed motion.div for crossfade when switching categories.
2026-04-28 09:24:08 +08:00
adrianbonpin 1e41531834 fix: improve performance details modal mobile responsiveness 2026-04-28 08:49:14 +08:00
adrianbonpin 45ae0162eb fix: refresh game page data after benchmark deletion 2026-04-28 08:48:01 +08:00
adrianbonpin b4db4d8ab8 feat: redesign admin sidebar with grouped sections
- Add Management and Moderation sections with labeled groups
- Section labels: muted uppercase micro text
- Section dividers: horizontal on desktop, vertical on mobile
- Active state: bg-primary/10 text-primary rounded-lg
- Widen desktop sidebar from md:w-48 to md:w-56
- Add desktop-only Admin Panel header with LayoutDashboardIcon
- Expand nav to cover all 6 admin pages (users, hardware, games,
  reports, benchmarks, comments)
- Update admin layout description to 'Manage your platform'
2026-04-28 08:47:03 +08:00
adrianbonpin 635e9fa46c feat: add admin comments page with search, filters, pagination, remove/restore 2026-04-28 08:39:55 +08:00
adrianbonpin 37c5d87baa Add admin benchmarks page with search, filter tabs, pagination, verify/remove/restore actions 2026-04-28 08:31:36 +08:00
adrianbonpin a109e47f33 feat(admin): add reports admin page with searchable, paginated table 2026-04-28 08:04:17 +08:00
adrianbonpin 2ab4ac5ebc feat: add admin comments API route
- GET /admin/comments: list all comments with pagination, removed filter, and author search
- PATCH /admin/comments/:id/remove: admin-only soft delete
- PATCH /admin/comments/:id/restore: admin-only restore
2026-04-28 07:55:57 +08:00
adrianbonpin 6d27ec03ab Task 2: Admin Performance Entries API Route
- GET /admin/performance — paginated listing with removed/verified/search filters,
  joining games, gameVersions, hardware, and user tables
- PATCH /admin/performance/:id/verify — verify entry (contributor or admin)
- PATCH /admin/performance/:id/remove — soft-delete entry (admin only)
- PATCH /admin/performance/:id/restore — restore entry (admin only)
- Registered route in app/api/[[...slugs]]/route.ts and lib/api/index.ts
2026-04-28 07:52:49 +08:00
adrianbonpin 1108264e4c feat: add admin reports API route
- GET /admin/reports with pagination, status filtering, joins, and batch author name lookup
- PATCH /admin/reports/:id/status to review (soft-delete entry) or dismiss
- Register route in lib/api/index.ts and app/api/[[...slugs]]/route.ts
2026-04-28 07:44:39 +08:00
adrianbonpin 37e51f4d48 fix: gracefaul fallback + force-dynamic for build 2026-04-28 07:14:25 +08:00
adrianbonpin d375112c8e fix: resolve SQL ambiguity in subquery, remove unused imports, fix lint errors 2026-04-28 02:14:13 +08:00
adrianbonpin 175a58b9d5 feat: update sitemap with new pages and game images, add robots.txt disallow rules 2026-04-28 02:10:51 +08:00
adrianbonpin 7bcee83d03 feat: add Contact route to navigation 2026-04-28 02:10:28 +08:00
adrianbonpin e14dafde62 feat: add contact/report page with Discord webhook integration 2026-04-28 02:09:55 +08:00
adrianbonpin b1cdfae6b7 feat: add contact form API with Discord webhook, rate limiting, and anti-bot checks 2026-04-28 02:04:25 +08:00
adrianbonpin a36c5c2510 feat: add games list page with search, filters, and infinite scroll 2026-04-28 02:02:03 +08:00
adrianbonpin 3aa8ecd94f fix: resolve benchmark sort alias mismatch and prioritize Steam Deck in deckStatus 2026-04-28 01:55:21 +08:00
adrianbonpin 4f1f654024 feat: add games listing API endpoint with search, genre/device filter, and sort 2026-04-28 01:45:13 +08:00
adrianbonpin 35ee0fd308 docs: add implementation plan for games list, contact page, and SEO updates 2026-04-28 01:37:07 +08:00
adrianbonpin e50eef52e8 docs: add design spec for games list, contact page, and SEO updates 2026-04-28 01:32:40 +08:00
adrianbonpin f35b6aee1e feat: transfer admin check to middleware and add vertical padding 2026-04-27 23:47:24 +08:00
adrianbonpin 647a26db94 chore: fix build errors and lint warnings from devices/admin implementation
- Fix setRole type error (cast to admin-accepted role type)
- Fix OG image edge runtime → nodejs (Drizzle needs Node.js)
- Fix eslint set-state-in-effect warnings
- Fix img → next/image in admin users client
- Remove unused eslint-disable directives
2026-04-27 22:22:52 +08:00
adrianbonpin cfb5940f3c feat: add admin games management page
- Game list with search and pagination
- Source and sync status badges
- View on site link and delete action
- Uses existing games CRUD API
2026-04-27 21:31:48 +08:00
adrianbonpin c0c624c2ae feat: add admin hardware management page with CRUD
- Device list fetched from /api/hardware/stats
- Create/edit devices via modal form
- Delete with confirmation dialog
- Uses existing hardware CRUD API endpoints
2026-04-27 21:20:01 +08:00
adrianbonpin b6c3070854 feat: add admin users management page
- User list with search by name/email
- Change role (user/contributor/admin) via dropdown
- Ban/unban users with status indicators
- Uses better-auth admin plugin client methods
2026-04-27 21:08:40 +08:00
adrianbonpin 012ad64a0d feat: add admin layout with sidebar, auth guard, and navbar link
- Admin layout with server-side auth guard (redirects non-admins)
- Reusable sidebar component with active state detection
- Navbar profile dropdown shows admin link for admin users
- Admin routes are noindexed (robots: false)
- /admin redirects to /admin/users
2026-04-27 21:02:28 +08:00
adrianbonpin e4e78cc578 feat: add per-device OG image generator for device detail pages
- Renders device name, type badge, and stats on branded dark background
- Uses Edge runtime for fast generation
- References OG image in device detail page metadata
2026-04-27 20:58:43 +08:00
adrianbonpin 060911e29d feat: redesign device detail page with fixes and improvements
- Fix upscalerBreakdown/fsrBreakdown property name mismatch
- Fix deviceTypeLabel map (handled → handheld)
- Fix device color to use per-device colorIndex instead of hardcoded 0
- Add image/icon hero section with device color accent
- Add error state with retry button
- Add generateStaticParams with ISR (1-hour revalidation)
- Enhanced SEO metadata with keywords, OG, Twitter cards
- Fix JSON-LD to use 'Handheld' label instead of raw enum value
2026-04-27 20:55:15 +08:00
adrianbonpin eb944c2b3c feat: redesign devices list page with filter tabs, image/icon, verified stats
- Server component fetches data and passes as props (RSC pattern)
- Add device-type filter pills (All/Handheld/Console)
- Add device image with icon fallback
- Add verified count to stats row
- Fix deviceTypeLabel to use 'handheld' key
- Cap stagger animation delay at 0.5s
- Enhanced SEO metadata with keywords and OpenGraph
2026-04-27 20:48:15 +08:00
adrianbonpin ab076a92c8 refactor: remove broken Community Trust chart (TrustBar)
- Remove TrustBar component and chart
- Remove trust data from game-stats API response
- Remove trust section from game detail page
- DB columns and vote endpoints preserved for future voting system
2026-04-27 20:41:28 +08:00
adrianbonpin 599cb024c9 fix: exclude null FPS entries from avgFps calculation in device stats API 2026-04-27 20:36:29 +08:00
adrianbonpin ecd83b1d70 fix: rename device_type enum 'handled' to 'handheld', add image column 2026-04-27 20:33:25 +08:00
adrianbonpin de858081e0 docs: add implementation plan tasks 7-12 (admin panel + cleanup) 2026-04-27 20:13:14 +08:00
adrianbonpin cd3c671d14 docs: add implementation plan tasks 4-6 (devices redesign + OG image) 2026-04-27 20:04:35 +08:00
adrianbonpin 2bdcbb0c1f docs: add implementation plan (tasks 1-3) for devices redesign & admin 2026-04-27 19:47:24 +08:00
adrianbonpin bce2f1fcd5 docs: add design spec for devices redesign & admin panel 2026-04-27 18:23:02 +08:00
adrianbonpin 421807b56b fix: remove gradient fade edges from preset scroll — cleaner horizontal list 2026-04-27 16:51:19 +08:00
adrianbonpin 1e42cdd39e fix: preset UX — gradient fade edges, Tiptap notes renderer, two-column modal layout with stats/settings, upvote/downvote buttons 2026-04-27 16:26:05 +08:00
adrianbonpin a6eb50a555 fix: use createdAt instead of updatedAt for hardware in sitemap 2026-04-27 16:07:39 +08:00
adrianbonpin 713b309f74 feat: SEO overhaul — expanded sitemap, JSON-LD, canonical URLs, search metadata 2026-04-27 16:05:31 +08:00
adrianbonpin 9a6db98d42 feat: add dynamic OG image generation for game pages 2026-04-27 16:02:20 +08:00
adrianbonpin d2a4e58b74 feat: horizontal preset layout, detail modal integration, reorder above stats 2026-04-27 15:58:35 +08:00
adrianbonpin 830c14fd3e feat: add PresetDetailModal component with settings view, delete, and report 2026-04-27 15:49:25 +08:00
adrianbonpin e40417a02d feat: add generateMetadata, enriched preset data, and JSON-LD to game page 2026-04-27 15:40:27 +08:00
adrianbonpin f228800593 feat: change user-delete to soft delete for performance entries 2026-04-27 15:36:12 +08:00
adrianbonpin 27cd5e3321 feat: add POST /api/performance/:id/report endpoint 2026-04-27 15:34:17 +08:00
adrianbonpin b94c29da61 feat: add reports table schema for preset reporting 2026-04-27 15:30:51 +08:00
adrianbonpin 5087f3370d docs: add implementation plan for community presets UX + SEO overhaul 2026-04-27 15:05:35 +08:00
adrianbonpin 5da82694cc docs: add community presets UX + SEO overhaul design spec 2026-04-27 15:01:25 +08:00
adrianbonpin ce6b014f20 fix: use useSyncExternalStore for hydration guard to satisfy React lint rule 2026-04-27 14:31:50 +08:00
adrianbonpin 0ad8e37df1 migrate: drop community_presets table 2026-04-27 14:29:58 +08:00
adrianbonpin 07467a4812 refactor: remove communityPresets schema, API, and routes 2026-04-27 14:29:30 +08:00
adrianbonpin 5100888216 refactor: game page reads presets from performanceEntries where settingsJson is not null 2026-04-27 14:28:03 +08:00
adrianbonpin 2ff54e58b3 refactor: replace communityPresets count with performanceEntries preset count 2026-04-27 14:11:27 +08:00
adrianbonpin aa098ebaf8 feat: add owner-scoped hard delete for performance entries 2026-04-27 14:10:01 +08:00
adrianbonpin 7db930302c docs: add consolidation spec — merge communityPresets into performanceEntries 2026-04-27 14:03:03 +08:00
adrianbonpin 9e551acd54 fix(settings-editor): let user type custom category name instead of auto-naming it 'Custom' 2026-04-27 13:37:04 +08:00