Add Search to Game List Pages #853

Closed
opened 2026-07-30 13:00:00 -05:00 by Veilor · 2 comments
Member

Game list pages should let members search within their list so they can quickly find a specific game without paging through status tabs and incremental loading.

The current game list view is status-tab driven and rendered through GameListSections. Each section is cursor-paginated and load-more URLs only carry status, section, and cursor state. Search should filter list entries by game/list title while still fitting that incremental loading model.

Scope

  • Signed-in user game list page and public user game list page.
  • Status tabs, All view sections, and selected-status partial responses.
  • GameListSections query filtering and cursor pagination.
  • Load-more URLs and AJAX responses for searched results.
  • Desktop table and mobile card empty/populated states.
  • Existing owner-only edit/delete actions and public read-only views.

Acceptance Criteria

  • Members can search game list entries by game/list title.
  • Search works on the signed-in owner list and public user list pages.
  • Search combines correctly with status tabs, including the All view.
  • Load-more requests preserve the active search query.
  • Empty searched sections show a clear no-results state without hiding the surrounding list UI.
  • Search input preserves the submitted query after navigation or partial reloads.
  • Existing status counts, owner actions, and incremental loading behavior continue to work for non-search views.

Test Coverage Required

  • Extend GameListPageTest to cover searched results on the owner game list page.
  • Cover searched results on a public user game list page.
  • Cover search combined with at least one status tab and the All view.
  • Cover load-more URL/query preservation for searched results.
  • Cover empty search results and escaping of special characters or markup-like input.
  • Preserve existing coverage for status tabs, preloaded panels, load-more responses, and owner actions.
  • Run focused GameListPageTest coverage before closing the issue.
  • Run vendor/bin/pint --dirty --format agent before implementation closeout if PHP files change.

Progress Checklist

  • Define the accepted game-list search query parameter and validation rules
  • Add search filtering to GameListSections queries
  • Add accessible search controls to the game list page
  • Preserve search state across status tabs and load-more requests
  • Add searched empty-state messaging for desktop and mobile views
  • Add focused game-list search regression coverage
  • Run focused GameListPageTest coverage
  • Run vendor/bin/pint --dirty --format agent if PHP files changed
  • Move the issue out of Codex review once verification is complete

Implementation and verification — 2026-10-27

Submit-based title search now filters saved and canonical titles, updates matching status counts, and persists through tabs, preloaded panels, sorting, cursors, partial responses, and load-more requests. Search/Clear preserve the selected tab and sorting; empty results retain surrounding controls.

Local branch: codex/issue-47-853-game-list-export-search, based on refreshed origin/master. Changes are local and awaiting review; no PR, merge, push, or deployment has been performed.

Validation:

  • php artisan test --env=testing --compact tests/Feature/GameListPageTest.php tests/Feature/GameListExportTest.php tests/Feature/UserPrivacyTest.php — 224 tests passed, 2,670 assertions (SQLite).
  • vendor/bin/pint --dirty --format agent — passed.
  • composer stan — passed with zero errors.
  • npm run build — passed.
  • node_modules/.bin/playwright test tests/browser/game-list-sort.spec.js --workers=1 --output=/tmp/mvgl-list-browser-final — all 8 browser tests passed at 375px/1440px for owner/public views, with no application console errors. Light/dark screenshots inspected.

Browser checks use isolated in-memory SQLite fixtures and stub external assets. MariaDB CI and live-environment validation have not run. The issue remains open in progress pending review.

Acceptance re-review — 2026-10-27

Re-review found and fixed an accented-uppercase search regression on SQLite: PHP Unicode lowercasing could disagree with SQLite and hide an exact title match such as ÉCOLE. Both the bound search term and stored title now use the database’s LOWER function. Four regression cases cover canonical/saved titles and selected/All views. Searched pagination tests now exercise 205 matching entries over three pages, including successive AJAX next_url query preservation, All-section state and excluded rows. Existing owner/public, empty-state, markup, sorting, preloaded-panel, count and owner-action tests remain passing. The final workflow checkbox is satisfied because the issue already has status/in progress and is outside Codex review; it remains open.

Verification after the search fix and expanded coverage:

  • Focused list/export/privacy suite: 230 tests passed, 3,078 assertions (SQLite).
  • Export suite rerun after making authorization fixtures explicitly private: all 19 tests passed, 440 assertions.
  • Pint and PHPStan passed; git diff --check passed.
  • All 8 game-list browser tests passed again at 375px/1440px for owner/public views.
  • The prior asset build remains valid; this re-review changed backend search and tests only.

All progress checkboxes are now complete. Implementation remains local and uncommitted on codex/issue-47-853-game-list-export-search, awaiting user review. No PR, push, merge, deployment or issue closure was performed. MariaDB CI and live-environment validation remain unrun.

Game list pages should let members search within their list so they can quickly find a specific game without paging through status tabs and incremental loading. The current game list view is status-tab driven and rendered through `GameListSections`. Each section is cursor-paginated and load-more URLs only carry status, section, and cursor state. Search should filter list entries by game/list title while still fitting that incremental loading model. ## Scope - Signed-in user game list page and public user game list page. - Status tabs, All view sections, and selected-status partial responses. - `GameListSections` query filtering and cursor pagination. - Load-more URLs and AJAX responses for searched results. - Desktop table and mobile card empty/populated states. - Existing owner-only edit/delete actions and public read-only views. ## Acceptance Criteria - Members can search game list entries by game/list title. - Search works on the signed-in owner list and public user list pages. - Search combines correctly with status tabs, including the All view. - Load-more requests preserve the active search query. - Empty searched sections show a clear no-results state without hiding the surrounding list UI. - Search input preserves the submitted query after navigation or partial reloads. - Existing status counts, owner actions, and incremental loading behavior continue to work for non-search views. ## Test Coverage Required - Extend `GameListPageTest` to cover searched results on the owner game list page. - Cover searched results on a public user game list page. - Cover search combined with at least one status tab and the All view. - Cover load-more URL/query preservation for searched results. - Cover empty search results and escaping of special characters or markup-like input. - Preserve existing coverage for status tabs, preloaded panels, load-more responses, and owner actions. - Run focused `GameListPageTest` coverage before closing the issue. - Run `vendor/bin/pint --dirty --format agent` before implementation closeout if PHP files change. ## Progress Checklist - [x] Define the accepted game-list search query parameter and validation rules - [x] Add search filtering to `GameListSections` queries - [x] Add accessible search controls to the game list page - [x] Preserve search state across status tabs and load-more requests - [x] Add searched empty-state messaging for desktop and mobile views - [x] Add focused game-list search regression coverage - [x] Run focused `GameListPageTest` coverage - [x] Run `vendor/bin/pint --dirty --format agent` if PHP files changed - [x] Move the issue out of Codex review once verification is complete ## Implementation and verification — 2026-10-27 Submit-based title search now filters saved and canonical titles, updates matching status counts, and persists through tabs, preloaded panels, sorting, cursors, partial responses, and load-more requests. Search/Clear preserve the selected tab and sorting; empty results retain surrounding controls. Local branch: `codex/issue-47-853-game-list-export-search`, based on refreshed `origin/master`. Changes are local and awaiting review; no PR, merge, push, or deployment has been performed. Validation: - `php artisan test --env=testing --compact tests/Feature/GameListPageTest.php tests/Feature/GameListExportTest.php tests/Feature/UserPrivacyTest.php` — 224 tests passed, 2,670 assertions (SQLite). - `vendor/bin/pint --dirty --format agent` — passed. - `composer stan` — passed with zero errors. - `npm run build` — passed. - `node_modules/.bin/playwright test tests/browser/game-list-sort.spec.js --workers=1 --output=/tmp/mvgl-list-browser-final` — all 8 browser tests passed at 375px/1440px for owner/public views, with no application console errors. Light/dark screenshots inspected. Browser checks use isolated in-memory SQLite fixtures and stub external assets. MariaDB CI and live-environment validation have not run. The issue remains open in progress pending review. ## Acceptance re-review — 2026-10-27 Re-review found and fixed an accented-uppercase search regression on SQLite: PHP Unicode lowercasing could disagree with SQLite and hide an exact title match such as ÉCOLE. Both the bound search term and stored title now use the database’s LOWER function. Four regression cases cover canonical/saved titles and selected/All views. Searched pagination tests now exercise 205 matching entries over three pages, including successive AJAX next_url query preservation, All-section state and excluded rows. Existing owner/public, empty-state, markup, sorting, preloaded-panel, count and owner-action tests remain passing. The final workflow checkbox is satisfied because the issue already has status/in progress and is outside Codex review; it remains open. Verification after the search fix and expanded coverage: - Focused list/export/privacy suite: 230 tests passed, 3,078 assertions (SQLite). - Export suite rerun after making authorization fixtures explicitly private: all 19 tests passed, 440 assertions. - Pint and PHPStan passed; git diff --check passed. - All 8 game-list browser tests passed again at 375px/1440px for owner/public views. - The prior asset build remains valid; this re-review changed backend search and tests only. All progress checkboxes are now complete. Implementation remains local and uncommitted on codex/issue-47-853-game-list-export-search, awaiting user review. No PR, push, merge, deployment or issue closure was performed. MariaDB CI and live-environment validation remain unrun.
Codex changed title from Add search function for the list to Add Search to Game List Pages 2026-07-30 19:09:13 -05:00
Codex self-assigned this 2026-10-27 14:00:05 -05:00
Member

Merged in PR #1001 at 7d34d5ab.

  • Search uses the shareable q parameter (trimmed, maximum 200 characters) and matches saved list titles or canonical game titles. Submit with Search or Enter; Clear restores the list while preserving the selected status and sort.
  • Tab counts reflect matching entries. Search is retained through status tabs, All sections, desktop/mobile sorting, cached/preloaded panels, partial responses and successive cursor pages. SQL wildcard characters are searched literally.
  • Both search operands use the database’s LOWER function, avoiding PHP/SQLite Unicode-case mismatches for exact accented-uppercase matches. Existing privacy checks and owner-only actions remain intact.
  • Verification: 230 list/export/privacy tests (3,078 assertions), 8 desktop/mobile browser tests, Pint, PHPStan, asset build and diff checks passed. All issue checkboxes, including movement out of Codex review, are complete.

Dev and production deployment is now being performed; deployment verification and rollback locations will follow.

Merged in PR #1001 at `7d34d5ab`. - Search uses the shareable `q` parameter (trimmed, maximum 200 characters) and matches saved list titles or canonical game titles. Submit with Search or Enter; Clear restores the list while preserving the selected status and sort. - Tab counts reflect matching entries. Search is retained through status tabs, All sections, desktop/mobile sorting, cached/preloaded panels, partial responses and successive cursor pages. SQL wildcard characters are searched literally. - Both search operands use the database’s LOWER function, avoiding PHP/SQLite Unicode-case mismatches for exact accented-uppercase matches. Existing privacy checks and owner-only actions remain intact. - Verification: 230 list/export/privacy tests (3,078 assertions), 8 desktop/mobile browser tests, Pint, PHPStan, asset build and diff checks passed. All issue checkboxes, including movement out of Codex review, are complete. Dev and production deployment is now being performed; deployment verification and rollback locations will follow.
Member

PR #1001 is now deployed to development and production from merge revision 7d34d5ab62e2ff6e3fef4a0f2107f7f047737f8d.

  • Installed the 10 feature runtime/source files plus the Vite manifest and versioned JS/CSS assets. Rebuilt route and Blade caches, verified all deployed file checksums, and preserved 440 unrelated runtime/configuration/dependency files per environment. No migrations or dependency installations were needed.
  • Read-only MariaDB smoke tests passed on both hosts: owner-scoped CSV and JSON returned the expected 11 entries, all exported IDs belonged to the authenticated owner, the export route requires authentication, and searched All views rendered correctly for matching and empty queries. The smoke tests ran inside read-only transactions and did not alter user data.
  • Live HTTPS checks passed on both hosts: homepage and searched public lists returned 200, public lists remained read-only, guest CSV/JSON requests returned 302 to login, and publicly served asset checksums matched the package. Production's edge rejected an initial Python-default-header probe; normal HTML/browser-style requests passed without any edge configuration changes.
  • Release manifests record the scoped rollout as ee6b2847+issue992-3d129125+pr1000-c0341df2+pr1001-7d34d5ab, preserving the actual deployed baseline rather than claiming unrelated master dependency updates were installed.

Rollback backups (original files, checksums and deployment receipts):

  • Dev: /home/mvgldev/deploy-backups/pr1001-7d34d5ab-fa4rd7lv
  • Production: /home/mvgl/deploy-backups/pr1001-7d34d5ab-0opyeowo

Local checkout is clean on master at the merge revision. All progress checkboxes remain checked; this issue is closed with status/done.

PR #1001 is now deployed to development and production from merge revision `7d34d5ab62e2ff6e3fef4a0f2107f7f047737f8d`. - Installed the 10 feature runtime/source files plus the Vite manifest and versioned JS/CSS assets. Rebuilt route and Blade caches, verified all deployed file checksums, and preserved 440 unrelated runtime/configuration/dependency files per environment. No migrations or dependency installations were needed. - Read-only MariaDB smoke tests passed on both hosts: owner-scoped CSV and JSON returned the expected 11 entries, all exported IDs belonged to the authenticated owner, the export route requires authentication, and searched All views rendered correctly for matching and empty queries. The smoke tests ran inside read-only transactions and did not alter user data. - Live HTTPS checks passed on both hosts: homepage and searched public lists returned 200, public lists remained read-only, guest CSV/JSON requests returned 302 to login, and publicly served asset checksums matched the package. Production's edge rejected an initial Python-default-header probe; normal HTML/browser-style requests passed without any edge configuration changes. - Release manifests record the scoped rollout as `ee6b2847+issue992-3d129125+pr1000-c0341df2+pr1001-7d34d5ab`, preserving the actual deployed baseline rather than claiming unrelated master dependency updates were installed. Rollback backups (original files, checksums and deployment receipts): - Dev: `/home/mvgldev/deploy-backups/pr1001-7d34d5ab-fa4rd7lv` - Production: `/home/mvgl/deploy-backups/pr1001-7d34d5ab-0opyeowo` Local checkout is clean on `master` at the merge revision. All progress checkboxes remain checked; this issue is closed with `status/done`.
Sign in to join this conversation.
No milestone
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
MyVideoGameList/myvideogamelist.com#853
No description provided.