import 'package:flutter/material.dart'; import 'package:marianum_mobile/api/marianumcloud/webdav/queries/listFiles/cacheableFile.dart'; import 'package:marianum_mobile/widget/errorView.dart'; import '../../../api/marianumcloud/webdav/queries/listFiles/listFilesCache.dart'; import '../../../api/marianumcloud/webdav/queries/listFiles/listFilesResponse.dart'; import '../../../data/files/filesProps.dart'; import 'fileElement.dart'; class Files extends StatefulWidget { List path; Files(this.path, {Key? key}) : super(key: key); @override State createState() => _FilesState(); } class BetterSortOption { String displayName; int Function(CacheableFile, CacheableFile) compare; IconData icon; BetterSortOption({required this.displayName, required this.icon, required this.compare}); } enum SortOption { name, date, size } class SortOptions { static Map options = { SortOption.name: BetterSortOption( displayName: "Name", icon: Icons.sort_by_alpha, compare: (CacheableFile a, CacheableFile b) => a.name.compareTo(b.name) ), SortOption.date: BetterSortOption( displayName: "Datum", icon: Icons.more_time_outlined, compare: (CacheableFile a, CacheableFile b) => a.modifiedAt!.compareTo(b.modifiedAt!) ), SortOption.size: BetterSortOption( displayName: "Größe", icon: Icons.monitor_weight, compare: (CacheableFile a, CacheableFile b) { if(a.isDirectory || b.isDirectory) return a.isDirectory ? 1 : 0; if(a.size == null) return 0; if(b.size == null) return 1; return a.size!.compareTo(b.size!); } ) }; static BetterSortOption getOption(SortOption option) { return options[option]!; } } class _FilesState extends State { FilesProps props = FilesProps(); ListFilesResponse? data; SortOption currentSort = SortOption.name; bool currentSortDirection = true; @override void initState() { super.initState(); ListFilesCache( path: widget.path.isEmpty ? "/" : widget.path.join("/"), onUpdate: (ListFilesResponse d) => { setState(() { data = d; }), } ); } @override Widget build(BuildContext context) { List files = (data?.files.toList() ?? List.empty())..sort(SortOptions.getOption(currentSort).compare); if(currentSortDirection) files = files.reversed.toList(); return Scaffold( appBar: AppBar( title: Text(widget.path.isNotEmpty ? widget.path.last : "Dateien"), actions: [ IconButton( icon: const Icon(Icons.search), onPressed: () => {}, ), PopupMenuButton( icon: Icon(currentSortDirection ? Icons.text_rotate_up : Icons.text_rotation_down), itemBuilder: (context) { return [true, false].map((e) => PopupMenuItem( value: e, enabled: e != currentSortDirection, child: Row( children: [ Icon(e ? Icons.text_rotate_up : Icons.text_rotation_down, color: Colors.black), const SizedBox(width: 15), Text(e ? "Aufsteigend" : "Absteigend") ], ) )).toList(); }, onSelected: (e) { setState(() { currentSortDirection = e; }); }, ), PopupMenuButton( icon: const Icon(Icons.sort), itemBuilder: (context) { return SortOptions.options.keys.map((key) => PopupMenuItem( value: key, enabled: key != currentSort, child: Row( children: [ Icon(SortOptions.getOption(key).icon, color: Colors.black), const SizedBox(width: 15), Text(SortOptions.getOption(key).displayName) ], ) )).toList(); }, onSelected: (e) { setState(() { currentSort = e; }); }, ), ], ), body: data == null ? const Center(child: CircularProgressIndicator()) : data!.files.isEmpty ? const ErrorView(icon: Icons.folder_off_rounded, text: "Der Ordner ist leer") : ListView.builder( itemCount: files.length, itemBuilder: (context, index) { CacheableFile file = files.toList().skip(index).first; return FileElement(file, widget.path); }, ), ); } }