add detail page

This commit is contained in:
2026-03-03 09:56:06 +01:00
parent 18c156c9d1
commit 4e385c28bf
11 changed files with 1863 additions and 144 deletions

View File

@@ -1,17 +1,17 @@
import 'package:get/get.dart';
import '../models/home_model.dart';
import '../models/filament_model.dart';
import '../services/appwrite_service.dart';
import '../widgets/add_weight_dialog.dart';
import '../widgets/add_filament_dialog.dart';
class HomeController extends GetxController {
final isloading = false.obs;
final List<WeightModel> weights = <WeightModel>[].obs;
final filaments = <FilamentModel>[].obs;
final appwriteService = AppwriteService();
@override
void onInit() {
_loadDataList();
_loadFilaments();
super.onInit();
}
@@ -21,85 +21,73 @@ class HomeController extends GetxController {
@override
void onClose() {}
void _loadDataList() async {
void _loadFilaments() async {
isloading.value = true;
if (weights.isNotEmpty) {
weights.clear();
}
final loggedIn = await appwriteService.login();
if (!loggedIn) {
print('Login fehlgeschlagen Daten können nicht geladen werden.');
filaments.clear();
try {
final loggedIn = await appwriteService.login();
if (!loggedIn) {
print('Login fehlgeschlagen Daten können nicht geladen werden.');
return;
}
final documents = await appwriteService.getFilamentDocuments();
if (documents.isEmpty) {
print('Keine Filamente gefunden.');
} else {
print('${documents.length} Filamente geladen.');
filaments.assignAll(
documents.map(
(doc) => FilamentModel.fromJson({'\$id': doc.$id, ...doc.data}),
),
);
}
} catch (e, st) {
print('Fehler beim Laden der Filamente: $e\n$st');
} finally {
isloading.value = false;
return;
}
final documents = await appwriteService.getDocumentsFromCollection();
if (documents.isEmpty) {
print('Keine Dokumente gefunden.');
} else {
print('${documents.length} Einträge geladen.');
weights.assignAll(documents.map((doc) => WeightModel.fromJson(doc.data)));
}
isloading.value = false;
update();
}
void addWeightEntry(WeightModel entry) {
weights.add(entry);
var map = WeightModel.toMapForAppwrite(entry);
appwriteService.createDocumentInCollection(map);
update();
}
void editWeightEntry(WeightModel updated) {
final idx = weights.indexWhere(
(w) => w.documentId == updated.documentId && w.date == updated.date,
);
if (idx != -1) {
weights[idx] = updated;
var map = WeightModel.toMapForAppwrite(updated);
appwriteService.updateDocumentInCollection(updated.documentId, map);
update();
}
}
/// Gewicht des Eintrags unmittelbar VOR [date] einer Person.
/// Wird für die weightChange-Berechnung beim Bearbeiten genutzt.
double getPreviousWeight(String personName, DateTime date) {
final before = weights
.where((w) => w.name == personName && w.date.isBefore(date))
.toList();
if (before.isEmpty) return 0.0;
before.sort((a, b) => b.date.compareTo(a.date));
return before.first.weight;
}
/// Gibt das zuletzt eingetragene Gewicht einer Person zurück.
/// 0.0 wenn noch kein Eintrag existiert (wird als "erster Eintrag" behandelt).
double getLastWeight(String personName) {
final personEntries = weights.where((w) => w.name == personName).toList();
if (personEntries.isEmpty) return 0.0;
personEntries.sort((a, b) => b.date.compareTo(a.date));
return personEntries.first.weight;
}
void addWeight(String personName) {}
// ── Dialog-Logik ─────────────────────────────────────────────────────────
Future<void> openAddDialog(String personName, String userId) async {
final entry = await AddWeightDialog.show(
userId: userId,
personName: personName,
lastWeight: getLastWeight(personName),
void addFilament(FilamentModel entry) {
filaments.add(entry);
appwriteService.createFilamentDocument(
FilamentModel.toMapForAppwrite(entry),
);
if (entry != null) addWeightEntry(entry);
update();
}
Future<void> openEditDialog(WeightModel existing) async {
final updated = await AddWeightDialog.showEdit(
entry: existing,
previousWeight: getPreviousWeight(existing.name, existing.date),
);
if (updated != null) editWeightEntry(updated);
void editFilament(FilamentModel updated) {
final idx = filaments.indexWhere((f) => f.documentId == updated.documentId);
if (idx != -1) {
filaments[idx] = updated;
appwriteService.updateFilamentDocument(
updated.documentId,
FilamentModel.toMapForAppwrite(updated),
);
update();
}
}
void deleteFilament(FilamentModel filament) {
filaments.remove(filament);
appwriteService.deleteFilamentDocument(filament.documentId);
update();
}
/// Nur lokal löschen (Appwrite wurde bereits vom DetailController aufgerufen).
void deleteFilamentLocal(FilamentModel filament) {
filaments.removeWhere((f) => f.documentId == filament.documentId);
update();
}
Future<void> openAddDialog() async {
final entry = await AddFilamentDialog.show();
if (entry != null) addFilament(entry);
}
Future<void> openEditDialog(FilamentModel existing) async {
final updated = await AddFilamentDialog.showEdit(entry: existing);
if (updated != null) editFilament(updated);
}
}