Add server-side column sorting to the Tickets page#72
Open
NanakiEmi wants to merge 5 commits into
Open
Conversation
Adds whitelisted order/order_direction query param handling to TicketController@index, mirroring the existing admin tickets sort convention (default: newest event first). Covers reference, type, seat, and event columns with join-based sorting and a stable tickets.id tiebreaker; invalid inputs fall back to the default.
Reuse the existing partials/_sortheader partial for the Reference, Type, Seat, and Event column headers so they become clickable sort links (Event defaults to desc on first click for newest-first). Adds an HTTP feature test proving the headers render sort links and that rows are ordered accordingly.
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## develop #72 +/- ##
===========================================
Coverage 100.00% 100.00%
- Complexity 1155 1166 +11
===========================================
Files 136 137 +1
Lines 4053 4046 -7
===========================================
- Hits 4053 4046 -7 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
mintopia
requested changes
Jul 11, 2026
Address PR review feedback:
- Move sort param validation into TicketIndexRequest FormRequest, so the
controller just reads the validated value. Invalid/missing params are
coerced to defaults in prepareForValidation so a bad query string still
renders the page rather than 422ing.
- Replace explicit joins and select('tickets.*') with withAggregate()
correlated subqueries; the ORM selects tickets.* and orders by the
related column without manual joins.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
mintopia
reviewed
Jul 11, 2026
| public function index(Request $request) | ||
| public function index(TicketIndexRequest $request) | ||
| { | ||
| $order = $request->validated('order'); |
Owner
There was a problem hiding this comment.
Follow pattern from other pages, just use $request->input('order', 'default');
mintopia
requested changes
Jul 11, 2026
| public function rules(): array | ||
| { | ||
| return [ | ||
| 'order' => ['required', Rule::in(self::SORTABLE)], |
Owner
There was a problem hiding this comment.
This will force the page to require it, even though by default it doesn't need them.
| * Coerce missing or unrecognised sort parameters to sensible defaults, so a | ||
| * bad query string still renders the page rather than failing validation. | ||
| */ | ||
| protected function prepareForValidation(): void |
Owner
There was a problem hiding this comment.
prepareForValidation() is an antipattern, and not used by the rest of the site. Remove this, make the parameters optional. Then just access them with a default value in the controller.
- Make order/order_direction optional (drop required) and remove the prepareForValidation() hook. - Read sort params in the controller with $request->input(key, default), matching the pattern used by the other index pages. Invalid values are now rejected by the FormRequest rather than silently coerced; the fallback unit tests are replaced by feature tests asserting the validation errors. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
The user Tickets page (
TicketController@index) paginates with noorderBy, so tickets are shown in database insertion order. With 15 rows per page a user's most recent tickets can land on page 2, and the Reference / Type / Seat / Event columns can't be reordered.Change
Adds server-side sorting to
/tickets, mirroring the existing Admin tickets convention (sameorder/order_directionquery params and the sharedpartials/_sortheader.blade.phppartial):order=event,order_direction=desc), so recent tickets appear on page 1.->appends().->select('tickets.*')avoids column collisions and atickets.idtiebreaker keeps ordering deterministic. Existing eager loads and the non-admin draft filter are unchanged.Tests
TicketController@index: default order, each column ascending/descending, invalidorder/directionfall back to defaults, pagination preserves the sort, and seat sort keeps unseated tickets.phpcsclean.🤖 Generated with Claude Code