feat: implement filtered book navigation and improve author sorting

- Sort authors by surname (last word in name) instead of first name
- Create FilteredLibraryItemsPage to display books filtered by author/genre/series
- Add navigation from authors/genres/series pages to filtered book lists
- Use AuthorFilter, GenreFilter, and SeriesFilter from shelfsdk
- Add libraryFiltered route with filter parameter support

Users can now:
- Browse authors sorted by surname
- Tap on an author to see all their books
- Tap on a genre to see all books in that genre
- Tap on a series to see all books in that series
This commit is contained in:
Claude 2025-11-20 16:43:21 +00:00
parent f60ea72659
commit 43712643a2
No known key found for this signature in database
6 changed files with 275 additions and 20 deletions

View file

@ -101,6 +101,12 @@ class Routes {
parentRoute: libraryBrowser,
);
static const libraryFiltered = _SimpleRoute(
pathName: 'filtered',
name: 'libraryFiltered',
parentRoute: libraryBrowser,
);
// you page for the user
static const you = _SimpleRoute(
pathName: 'you',

View file

@ -4,6 +4,7 @@ import 'package:vaani/features/downloads/view/downloads_page.dart';
import 'package:vaani/features/explore/view/explore_page.dart';
import 'package:vaani/features/explore/view/search_result_page.dart';
import 'package:vaani/features/item_viewer/view/library_item_page.dart';
import 'package:vaani/features/library_browser/view/filtered_library_items_page.dart';
import 'package:vaani/features/library_browser/view/library_authors_page.dart';
import 'package:vaani/features/library_browser/view/library_browser_page.dart';
import 'package:vaani/features/library_browser/view/library_genres_page.dart';
@ -140,6 +141,31 @@ class MyAppRouter {
name: Routes.librarySeries.name,
pageBuilder: defaultPageBuilder(const LibrarySeriesPage()),
),
GoRoute(
path: Routes.libraryFiltered.pathName,
name: Routes.libraryFiltered.name,
pageBuilder: (context, state) {
final extra = state.extra as Map<String, dynamic>?;
final filter = extra?['filter'] as Filter?;
final title = extra?['title'] as String? ?? 'Filtered Items';
if (filter == null) {
return MaterialPage(
child: Scaffold(
appBar: AppBar(title: const Text('Error')),
body: const Center(
child: Text('Invalid filter'),
),
),
);
}
return MaterialPage(
child: FilteredLibraryItemsPage(
filter: filter,
title: title,
),
);
},
),
],
),
],