mirror of
https://github.com/immich-app/immich.git
synced 2025-02-03 01:22:44 +01:00
rudimentary switch sorting order
This commit is contained in:
parent
9b495e55ff
commit
fd94741698
3 changed files with 61 additions and 11 deletions
mobile/lib
|
@ -31,11 +31,24 @@ class FolderPage extends HookConsumerWidget {
|
|||
[],
|
||||
);
|
||||
|
||||
void onToggleSortOrder() {
|
||||
if (folder != null) {
|
||||
ref.read(folderRenderListProvider(folder!).notifier).toggleSortOrder();
|
||||
}
|
||||
ref.read(folderStructureProvider.notifier).toggleSortOrder();
|
||||
}
|
||||
|
||||
return Scaffold(
|
||||
appBar: AppBar(
|
||||
title: Text(folder?.name ?? 'Root'),
|
||||
elevation: 0,
|
||||
centerTitle: false,
|
||||
actions: [
|
||||
IconButton(
|
||||
icon: const Icon(Icons.swap_vert),
|
||||
onPressed: onToggleSortOrder,
|
||||
),
|
||||
],
|
||||
),
|
||||
body: folderState.when(
|
||||
data: (rootFolder) {
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||
import 'package:immich_mobile/constants/enums.dart';
|
||||
import 'package:immich_mobile/models/folder/root_folder.model.dart';
|
||||
import 'package:immich_mobile/services/folder.service.dart';
|
||||
import 'package:immich_mobile/widgets/asset_grid/asset_grid_data_structure.dart';
|
||||
|
@ -8,17 +9,24 @@ class FolderStructureNotifier extends StateNotifier<AsyncValue<RootFolder>> {
|
|||
final FolderService _folderService;
|
||||
final Logger _log = Logger("FolderStructureNotifier");
|
||||
|
||||
var sortOrder = SortOrder.asc;
|
||||
|
||||
FolderStructureNotifier(this._folderService) : super(const AsyncLoading());
|
||||
|
||||
Future<void> fetchFolders() async {
|
||||
try {
|
||||
final folders = await _folderService.getFolderStructure();
|
||||
final folders = await _folderService.getFolderStructure(sortOrder);
|
||||
state = AsyncData(folders);
|
||||
} catch (e, stack) {
|
||||
_log.severe("Failed to build folder structure", e, stack);
|
||||
state = AsyncError(e, stack);
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> toggleSortOrder() {
|
||||
sortOrder = sortOrder == SortOrder.asc ? SortOrder.desc : SortOrder.asc;
|
||||
return fetchFolders();
|
||||
}
|
||||
}
|
||||
|
||||
final folderStructureProvider =
|
||||
|
@ -34,12 +42,15 @@ class FolderRenderListNotifier extends StateNotifier<AsyncValue<RenderList>> {
|
|||
final RootFolder _folder;
|
||||
final Logger _log = Logger("FolderAssetsNotifier");
|
||||
|
||||
var sortOrder = SortOrder.asc;
|
||||
|
||||
FolderRenderListNotifier(this._folderService, this._folder)
|
||||
: super(const AsyncLoading());
|
||||
|
||||
Future<void> fetchAssets() async {
|
||||
try {
|
||||
final assets = await _folderService.getFolderAssets(_folder);
|
||||
final assets = await _folderService.getFolderAssets(_folder, sortOrder);
|
||||
|
||||
state =
|
||||
AsyncData(await RenderList.fromAssets(assets, GroupAssetsBy.none));
|
||||
} catch (e, stack) {
|
||||
|
@ -47,6 +58,11 @@ class FolderRenderListNotifier extends StateNotifier<AsyncValue<RenderList>> {
|
|||
state = AsyncError(e, stack);
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> toggleSortOrder() {
|
||||
sortOrder = sortOrder == SortOrder.asc ? SortOrder.desc : SortOrder.asc;
|
||||
return fetchAssets();
|
||||
}
|
||||
}
|
||||
|
||||
final folderRenderListProvider = StateNotifierProvider.family<
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||
import 'package:immich_mobile/constants/enums.dart';
|
||||
import 'package:immich_mobile/entities/asset.entity.dart';
|
||||
import 'package:immich_mobile/models/folder/recursive_folder.model.dart';
|
||||
import 'package:immich_mobile/models/folder/root_folder.model.dart';
|
||||
|
@ -15,7 +16,7 @@ class FolderService {
|
|||
|
||||
FolderService(this._folderApiRepository);
|
||||
|
||||
Future<RootFolder> getFolderStructure() async {
|
||||
Future<RootFolder> getFolderStructure(SortOrder order) async {
|
||||
final paths = await _folderApiRepository.getAllUniquePaths();
|
||||
|
||||
// Create folder structure
|
||||
|
@ -51,8 +52,12 @@ class FolderService {
|
|||
subfolders: [],
|
||||
),
|
||||
);
|
||||
// Sort folders alphanumerically after adding new folder
|
||||
folderMap[parentPath]!.sort((a, b) => a.name.compareTo(b.name));
|
||||
// Sort folders based on order parameter
|
||||
folderMap[parentPath]!.sort(
|
||||
(a, b) => order == SortOrder.desc
|
||||
? b.name.compareTo(a.name)
|
||||
: a.name.compareTo(b.name),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -64,8 +69,12 @@ class FolderService {
|
|||
|
||||
if (folderMap.containsKey(fullPath)) {
|
||||
folder.subfolders.addAll(folderMap[fullPath]!);
|
||||
// Sort subfolders alphanumerically
|
||||
folder.subfolders.sort((a, b) => a.name.compareTo(b.name));
|
||||
// Sort subfolders based on order parameter
|
||||
folder.subfolders.sort(
|
||||
(a, b) => order == SortOrder.desc
|
||||
? b.name.compareTo(a.name)
|
||||
: a.name.compareTo(b.name),
|
||||
);
|
||||
for (var subfolder in folder.subfolders) {
|
||||
attachSubfolders(subfolder);
|
||||
}
|
||||
|
@ -73,8 +82,12 @@ class FolderService {
|
|||
}
|
||||
|
||||
List<RecursiveFolder> rootSubfolders = folderMap['_root_'] ?? [];
|
||||
// Sort root subfolders alphanumerically
|
||||
rootSubfolders.sort((a, b) => a.name.compareTo(b.name));
|
||||
// Sort root subfolders based on order parameter
|
||||
rootSubfolders.sort(
|
||||
(a, b) => order == SortOrder.desc
|
||||
? b.name.compareTo(a.name)
|
||||
: a.name.compareTo(b.name),
|
||||
);
|
||||
|
||||
for (var folder in rootSubfolders) {
|
||||
attachSubfolders(folder);
|
||||
|
@ -85,13 +98,21 @@ class FolderService {
|
|||
);
|
||||
}
|
||||
|
||||
Future<List<Asset>> getFolderAssets(RootFolder folder) async {
|
||||
Future<List<Asset>> getFolderAssets(
|
||||
RootFolder folder, SortOrder order) async {
|
||||
try {
|
||||
if (folder is RecursiveFolder) {
|
||||
String fullPath =
|
||||
folder.path.isEmpty ? folder.name : '${folder.path}/${folder.name}';
|
||||
fullPath = fullPath[0] == '/' ? fullPath.substring(1) : fullPath;
|
||||
final result = await _folderApiRepository.getAssetsForPath(fullPath);
|
||||
var result = await _folderApiRepository.getAssetsForPath(fullPath);
|
||||
|
||||
if (order == SortOrder.desc) {
|
||||
result.sort((a, b) => b.fileCreatedAt.compareTo(a.fileCreatedAt));
|
||||
} else {
|
||||
result.sort((a, b) => a.fileCreatedAt.compareTo(b.fileCreatedAt));
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
final result = await _folderApiRepository.getAssetsForPath('/');
|
||||
|
|
Loading…
Reference in a new issue