Files
filament-tracker/lib/controllers/detail_controller.dart
2026-03-03 09:56:06 +01:00

130 lines
3.8 KiB
Dart
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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;
}
}
}