fix(mangas): address review on sort feature — alias, index, validation, a11y
Backend - sort=recent stays a back-compat alias for created (parse_sort); invalid sort/order now return the structured 422 envelope instead of plain-text 400 - per-field default direction on omitted order (dates desc, text asc), matching the frontend so a bare ?sort=<field> reads the same in UI and API - migration 0033: index mangas(updated_at DESC, id) backing the default sort and its id tie-break; NULLS LAST now applied only to the nullable author key - tests: recent alias, per-field default (title+author), invalid-value 422, and a tie-break test that pins ordering by ascending id (mutation-verified) Frontend - pure sort helpers extracted to $lib/mangaSort with unit tests; coerceSort honors the recent alias so pasted/legacy URLs resolve to the same field - SegmentedControl: roving tabindex + arrow/Home/End keyboard nav, anchored on focus so rapid keypresses don't stick - UX: visible "Direction" labels (desktop + mobile), mobile sort-sheet section headings and a "Done" button; README sort/order contract updated Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -185,5 +185,10 @@ test.describe('mobile catalog chrome', () => {
|
||||
await page.getByTestId('sort-order-mobile-desc').click();
|
||||
await expect(page).toHaveURL(/order=desc/);
|
||||
expect(lastOrderParam).toBe('desc');
|
||||
|
||||
// The Done button gives an explicit dismissal affordance once the
|
||||
// field + direction are set.
|
||||
await page.getByTestId('sort-done').click();
|
||||
await expect(page.getByTestId('sort-sheet')).toBeHidden();
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user