From d154e0149057bfb1e3295bfa43049a7e7cd0901b Mon Sep 17 00:00:00 2001 From: schroda <50052685+schroda@users.noreply.github.com> Date: Sat, 16 May 2026 01:53:58 +0200 Subject: [PATCH] Sort bulk migration search entries --- CHANGELOG.md | 1 + .../migration/screens/MigrationSearch.tsx | 26 +++++++------------ 2 files changed, 10 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2c5fb8f7..883770d2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). - (**Migration**) Allow only 2 tracker requests per second - (**Migration**) Sort manga to migrate selection by title and by recently added to the library - (**Migration**) Sort destination source selection by same order as browse source page +- (**Migration**) Sort entries in search page by title ### Fixed diff --git a/src/features/migration/screens/MigrationSearch.tsx b/src/features/migration/screens/MigrationSearch.tsx index 17537ebe..1be21f1c 100644 --- a/src/features/migration/screens/MigrationSearch.tsx +++ b/src/features/migration/screens/MigrationSearch.tsx @@ -17,10 +17,14 @@ import { defaultPromiseErrorHandler } from '@/lib/DefaultPromiseErrorHandler.ts' import { DEFAULT_FULL_FAB_HEIGHT } from '@/base/components/buttons/StyledFab.tsx'; import { useMemo } from 'react'; import Stack from '@mui/material/Stack'; +import type { TMigrationEntry } from '@/features/migration/Migration.types.ts'; import { MigrationEntryStatus } from '@/features/migration/Migration.types.ts'; import { MigrationEntryGroup } from '@/features/migration/components/MIgrationEntryGroup.tsx'; import { plural } from '@lingui/core/macro'; +const getEntries = (status: MigrationEntryStatus, entries: TMigrationEntry[]): TMigrationEntry[] => + entries.filter((entry) => entry.status === status).toSorted((a, b) => a.mangaTitle.localeCompare(b.mangaTitle)); + export const MigrationSearch = () => { const { t } = useLingui(); const entries = MigrationManager.useEntries(); @@ -46,26 +50,14 @@ export const MigrationSearch = () => { return 1; } - return entryList.indexOf(a) - entryList.indexOf(b); + return a.mangaTitle.localeCompare(b.mangaTitle); }), [entryList], ); - const failedEntries = useMemo( - () => entryList.filter((entry) => entry.status === MigrationEntryStatus.SEARCH_FAILED), - [entryList], - ); - const noMatchEntries = useMemo( - () => entryList.filter((entry) => entry.status === MigrationEntryStatus.NO_MATCH), - [entryList], - ); - const outdatedEntries = useMemo( - () => entryList.filter((entry) => entry.status === MigrationEntryStatus.OUTDATED), - [entryList], - ); - const matchedEntries = useMemo( - () => entryList.filter((entry) => entry.status === MigrationEntryStatus.SEARCH_COMPLETE), - [entryList], - ); + const failedEntries = useMemo(() => getEntries(MigrationEntryStatus.SEARCH_FAILED, entryList), [entryList]); + const noMatchEntries = useMemo(() => getEntries(MigrationEntryStatus.NO_MATCH, entryList), [entryList]); + const outdatedEntries = useMemo(() => getEntries(MigrationEntryStatus.OUTDATED, entryList), [entryList]); + const matchedEntries = useMemo(() => getEntries(MigrationEntryStatus.SEARCH_COMPLETE, entryList), [entryList]); const hasMigratableEntries = useMemo(() => !!MigrationManager.getMigratableEntries().length, [entryList]);