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

@@ -0,0 +1,129 @@
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import '../models/filament_model.dart';
import '../services/appwrite_service.dart';
import '../widgets/add_filament_dialog.dart';
class DetailController extends GetxController {
final appwriteService = AppwriteService();
/// Das aktuell angezeigte Filament wird beim Öffnen der Seite gesetzt.
final filament = Rx<FilamentModel>(FilamentModel.empty);
final isLoading = false.obs;
@override
void onInit() {
super.onInit();
// Filament kommt via Get.arguments von der HomeView
if (Get.arguments != null && Get.arguments is FilamentModel) {
filament.value = Get.arguments as FilamentModel;
}
}
@override
void onReady() {}
@override
void onClose() {}
double get remaining => (filament.value.weight - filament.value.weightUsed)
.clamp(0, filament.value.weight);
double get progress =>
filament.value.weight > 0 ? remaining / filament.value.weight : 0;
/// Öffnet den Bearbeitungs-Dialog und aktualisiert lokal + in Appwrite.
Future<void> openEditDialog() async {
final updated = await AddFilamentDialog.showEdit(entry: filament.value);
if (updated == null) return;
isLoading.value = true;
try {
final success = await appwriteService.updateFilamentDocument(
updated.documentId,
FilamentModel.toMapForAppwrite(updated),
);
if (success) filament.value = updated; // bleibt auf Detail-Seite
} catch (e) {
print('Fehler beim Aktualisieren: $e');
} finally {
isLoading.value = false;
}
}
/// Löscht das Filament und navigiert zurück.
Future<void> deleteFilament() async {
final confirm = await Get.dialog<bool>(
AlertDialog(
backgroundColor: const Color(0xFF1A2035),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16)),
title: const Text(
'Filament löschen?',
style: TextStyle(color: Colors.white),
),
content: Text(
'${filament.value.name} wird dauerhaft gelöscht.',
style: const TextStyle(color: Colors.white70),
),
actions: [
TextButton(
onPressed: () => Get.back(result: false),
child: const Text(
'Abbrechen',
style: TextStyle(color: Colors.white60),
),
),
TextButton(
onPressed: () => Get.back(result: true),
child: const Text(
'Löschen',
style: TextStyle(color: Color(0xFFFF6B6B)),
),
),
],
),
);
if (confirm != true) return;
isLoading.value = true;
try {
await appwriteService.deleteFilamentDocument(filament.value.documentId);
} catch (e) {
print('Fehler beim Löschen: $e');
} finally {
isLoading.value = false;
}
Get.back(result: 'deleted');
}
/// Aktualisiert nur das verbrauchte Gewicht.
Future<void> updateWeightUsed(double newWeightUsed) async {
final updated = FilamentModel(
documentId: filament.value.documentId,
name: filament.value.name,
type: filament.value.type,
color: filament.value.color,
weight: filament.value.weight,
weightUsed: newWeightUsed,
price: filament.value.price,
manufacturer: filament.value.manufacturer,
purchaseDate: filament.value.purchaseDate,
notes: filament.value.notes,
printingTemp: filament.value.printingTemp,
bedTemp: filament.value.bedTemp,
);
isLoading.value = true;
try {
final success = await appwriteService.updateFilamentDocument(
updated.documentId,
FilamentModel.toMapForAppwrite(updated),
);
if (success) filament.value = updated;
} catch (e) {
print('Fehler beim Aktualisieren des Gewichts: $e');
} finally {
isLoading.value = false;
}
}
}