From fedfa8df3a18eaafcf3b7222f03f8528cb53cb2e Mon Sep 17 00:00:00 2001 From: Masahiko AMANO Date: Thu, 11 Jun 2026 21:47:55 +0300 Subject: [PATCH] feat(frontend): tie-break category-name tag sort by tag name Mirror the server's secondary sort in the client-side sortTags (used for a file's assigned tags) so the assigned and available lists agree. Co-Authored-By: Claude Opus 4.8 --- frontend/src/lib/api/tags.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/frontend/src/lib/api/tags.ts b/frontend/src/lib/api/tags.ts index 85e9c22..10e6189 100644 --- a/frontend/src/lib/api/tags.ts +++ b/frontend/src/lib/api/tags.ts @@ -54,5 +54,11 @@ function tagSortKey(t: Tag, field: TagSortField): string { */ export function sortTags(tags: Tag[], { sort, order }: SortState): Tag[] { const dir = order === 'asc' ? 1 : -1; - return [...tags].sort((a, b) => dir * tagSortKey(a, sort).localeCompare(tagSortKey(b, sort))); + return [...tags].sort((a, b) => { + const primary = dir * tagSortKey(a, sort).localeCompare(tagSortKey(b, sort)); + if (primary !== 0 || sort !== 'category_name') return primary; + // Same category: break the tie by the tag's own name (same direction), so + // tags are grouped by category then alphabetical — matching the server. + return dir * (a.name ?? '').localeCompare(b.name ?? ''); + }); }