add import export and items
This commit is contained in:
@@ -36,13 +36,22 @@ class AnwendungController extends GetxController {
|
||||
filament.value = filamente.firstWhereOrNull(
|
||||
(item) => item.filamentId == filamentId,
|
||||
);
|
||||
anwendungen.assignAll(
|
||||
storage
|
||||
.getModelList(storageKey)
|
||||
.map(AnwendungModel.fromJson)
|
||||
.where((item) => item.filamentId == filamentId),
|
||||
);
|
||||
anwendungen.sort((a, b) => b.erstelltAm.compareTo(a.erstelltAm));
|
||||
final profiles =
|
||||
storage
|
||||
.getModelList(storageKey)
|
||||
.map(AnwendungModel.fromJson)
|
||||
.where((item) => item.filamentId == filamentId)
|
||||
.toList()
|
||||
..sort((a, b) => b.erstelltAm.compareTo(a.erstelltAm));
|
||||
if (profiles.isNotEmpty) {
|
||||
final profile = profiles.first;
|
||||
anwendungen.assignAll([profile]);
|
||||
druckbettController.text = profile.druckbettTemperatur.toString();
|
||||
druckController.text = profile.druckTemperatur.toString();
|
||||
bauraumController.text = profile.bauraumTemperatur?.toString() ?? '';
|
||||
sonstigesController.text = profile.sonstiges;
|
||||
bauraumGeschlossen.value = profile.bauraumGeschlossen;
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> saveAnwendung() async {
|
||||
@@ -51,10 +60,11 @@ class AnwendungController extends GetxController {
|
||||
isSaving.value = true;
|
||||
message.value = null;
|
||||
try {
|
||||
final existing = anwendungen.firstOrNull;
|
||||
final entry = AnwendungModel(
|
||||
anwendungId: const Uuid().v4(),
|
||||
anwendungId: existing?.anwendungId ?? const Uuid().v4(),
|
||||
filamentId: filamentId,
|
||||
erstelltAm: DateTime.now(),
|
||||
erstelltAm: existing?.erstelltAm ?? DateTime.now(),
|
||||
druckbettTemperatur: InputValidators.number(druckbettController.text)!,
|
||||
druckTemperatur: InputValidators.number(druckController.text)!,
|
||||
bauraumGeschlossen: bauraumGeschlossen.value,
|
||||
@@ -62,9 +72,11 @@ class AnwendungController extends GetxController {
|
||||
sonstiges: sonstigesController.text.trim(),
|
||||
);
|
||||
final entries = storage.getModelList(storageKey);
|
||||
await storage.saveModelList(storageKey, [...entries, entry.toJson()]);
|
||||
anwendungen.insert(0, entry);
|
||||
resetForm();
|
||||
await storage.saveModelList(storageKey, [
|
||||
...entries.where((item) => item['filamentId'] != filamentId),
|
||||
entry.toJson(),
|
||||
]);
|
||||
anwendungen.assignAll([entry]);
|
||||
hasError.value = false;
|
||||
message.value = 'Verarbeitungsprofil gespeichert.';
|
||||
} catch (_) {
|
||||
@@ -75,15 +87,6 @@ class AnwendungController extends GetxController {
|
||||
}
|
||||
}
|
||||
|
||||
void resetForm() {
|
||||
formKey.currentState?.reset();
|
||||
druckbettController.clear();
|
||||
druckController.clear();
|
||||
bauraumController.clear();
|
||||
sonstigesController.clear();
|
||||
bauraumGeschlossen.value = false;
|
||||
}
|
||||
|
||||
@override
|
||||
void onClose() {
|
||||
druckbettController.dispose();
|
||||
|
||||
@@ -0,0 +1,105 @@
|
||||
import 'package:get/get.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
|
||||
import '../models/backup_model.dart';
|
||||
import '../services/backup_file_service.dart';
|
||||
import '../services/get_storage_services.dart';
|
||||
import 'home_controller.dart';
|
||||
|
||||
class ExportController extends GetxController {
|
||||
ExportController({BackupFileService? fileService})
|
||||
: fileService = fileService ?? BackupFileService();
|
||||
|
||||
final BackupFileService fileService;
|
||||
final storage = Get.find<GetStorageService>();
|
||||
final isBusy = false.obs;
|
||||
final message = RxnString();
|
||||
final hasError = false.obs;
|
||||
final pendingBackup = Rxn<BackupModel>();
|
||||
|
||||
Future<void> exportData() async {
|
||||
if (isBusy.value) return;
|
||||
isBusy.value = true;
|
||||
message.value = null;
|
||||
try {
|
||||
final backup = BackupModel({
|
||||
for (final key in BackupModel.keys) key: storage.getModelList(key),
|
||||
});
|
||||
final name =
|
||||
'filament_backup_${DateFormat('yyyy-MM-dd_HH-mm-ss').format(DateTime.now())}.json';
|
||||
if (await fileService.save(backup.encode(), name)) {
|
||||
hasError.value = false;
|
||||
message.value = 'Datensicherung als JSON-Datei exportiert.';
|
||||
}
|
||||
} catch (_) {
|
||||
_error('Export fehlgeschlagen. Bitte erneut versuchen.');
|
||||
} finally {
|
||||
isBusy.value = false;
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> selectImport() async {
|
||||
if (isBusy.value) return;
|
||||
isBusy.value = true;
|
||||
message.value = null;
|
||||
pendingBackup.value = null;
|
||||
try {
|
||||
final source = await fileService.open();
|
||||
if (source != null) pendingBackup.value = BackupModel.decode(source);
|
||||
} on FormatException catch (error) {
|
||||
_error(error.message);
|
||||
} catch (_) {
|
||||
_error('Datei konnte nicht gelesen werden. Bitte erneut versuchen.');
|
||||
} finally {
|
||||
isBusy.value = false;
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> importData() async {
|
||||
final backup = pendingBackup.value;
|
||||
if (isBusy.value || backup == null) return;
|
||||
isBusy.value = true;
|
||||
message.value = null;
|
||||
final previous = <String, List<Map<String, dynamic>>>{};
|
||||
final attempted = <String>[];
|
||||
try {
|
||||
for (final key in BackupModel.keys) {
|
||||
previous[key] = storage.getModelList(key);
|
||||
}
|
||||
for (final key in BackupModel.keys) {
|
||||
attempted.add(key);
|
||||
await storage.saveModelList(key, backup.data[key]!);
|
||||
}
|
||||
if (Get.isRegistered<HomeController>()) {
|
||||
final home = Get.find<HomeController>();
|
||||
home.loadFilamente();
|
||||
home.loadMaterialien();
|
||||
home.resetForm();
|
||||
}
|
||||
pendingBackup.value = null;
|
||||
hasError.value = false;
|
||||
message.value = 'Alle Daten wurden importiert.';
|
||||
} catch (_) {
|
||||
var restored = true;
|
||||
for (final key in attempted.reversed) {
|
||||
try {
|
||||
await storage.saveModelList(key, previous[key]!);
|
||||
} catch (_) {
|
||||
restored = false;
|
||||
}
|
||||
}
|
||||
_error(
|
||||
restored
|
||||
? 'Import fehlgeschlagen. Die bisherigen Daten wurden beibehalten.'
|
||||
: 'Import und Wiederherstellung fehlgeschlagen. Bitte die Datensicherung erneut importieren.',
|
||||
);
|
||||
} finally {
|
||||
isBusy.value = false;
|
||||
}
|
||||
}
|
||||
|
||||
void _error(String text) {
|
||||
hasError.value = true;
|
||||
message.value = text;
|
||||
}
|
||||
}
|
||||
@@ -43,17 +43,17 @@ class HomeController extends GetxController {
|
||||
final preisController = TextEditingController();
|
||||
final markeController = TextEditingController();
|
||||
final gewichtController = TextEditingController();
|
||||
final materialController = TextEditingController(text: 'PLA');
|
||||
|
||||
final kaufdatum = DateTime.now().obs;
|
||||
final material = 'PLA'.obs;
|
||||
final editingId = RxnString();
|
||||
|
||||
final materialien = [
|
||||
static const defaultMaterialien = [
|
||||
'PLA',
|
||||
'PLA+',
|
||||
'PLA light',
|
||||
'PLA-CF',
|
||||
'PLA+',
|
||||
'PETG',
|
||||
'PETG-CF',
|
||||
'ABS',
|
||||
@@ -61,11 +61,74 @@ class HomeController extends GetxController {
|
||||
'TPU',
|
||||
'Sonstiges',
|
||||
];
|
||||
final materialien = defaultMaterialien.toList().obs;
|
||||
final materialMessage = RxnString();
|
||||
final isSavingMaterial = false.obs;
|
||||
|
||||
@override
|
||||
void onInit() {
|
||||
super.onInit();
|
||||
loadFilamente();
|
||||
loadMaterialien();
|
||||
selectMaterial(materialien.firstOrNull ?? '');
|
||||
}
|
||||
|
||||
void loadMaterialien() {
|
||||
final saved = storage.getModelList(StorageKeys.materialien);
|
||||
if (saved.isNotEmpty) {
|
||||
materialien.assignAll((saved.single['werte'] as List).cast<String>());
|
||||
} else {
|
||||
materialien.assignAll({
|
||||
...defaultMaterialien,
|
||||
...filamente.map((filament) => filament.material),
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
void selectMaterial(String value) {
|
||||
material.value = value;
|
||||
materialController.text = value;
|
||||
}
|
||||
|
||||
Future<bool> addMaterial() async {
|
||||
final value = materialController.text.trim();
|
||||
if (value.isEmpty) {
|
||||
materialMessage.value = 'Bitte eine Materialart eingeben.';
|
||||
return false;
|
||||
}
|
||||
final existing = materialien.firstWhereOrNull(
|
||||
(item) => item.toLowerCase() == value.toLowerCase(),
|
||||
);
|
||||
if (existing != null) {
|
||||
materialMessage.value = null;
|
||||
selectMaterial(existing);
|
||||
return true;
|
||||
}
|
||||
final saved = await _saveMaterialien([...materialien, value]);
|
||||
if (saved) selectMaterial(value);
|
||||
return saved;
|
||||
}
|
||||
|
||||
Future<bool> removeMaterial(String value) =>
|
||||
_saveMaterialien(materialien.where((item) => item != value).toList());
|
||||
|
||||
Future<bool> _saveMaterialien(List<String> values) async {
|
||||
if (isSavingMaterial.value) return false;
|
||||
isSavingMaterial.value = true;
|
||||
materialMessage.value = null;
|
||||
try {
|
||||
await storage.saveModelList(StorageKeys.materialien, [
|
||||
{'werte': values},
|
||||
]);
|
||||
materialien.assignAll(values);
|
||||
return true;
|
||||
} catch (_) {
|
||||
materialMessage.value =
|
||||
'Artenliste konnte nicht gespeichert werden. Bitte erneut versuchen.';
|
||||
return false;
|
||||
} finally {
|
||||
isSavingMaterial.value = false;
|
||||
}
|
||||
}
|
||||
|
||||
void loadFilamente() {
|
||||
@@ -116,6 +179,8 @@ class HomeController extends GetxController {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!await addMaterial()) return;
|
||||
material.value = materialController.text.trim();
|
||||
final filament = KaufFilamentModel(
|
||||
filamentId: editingId.value ?? uuid.v4(),
|
||||
marke: markeController.text.trim(),
|
||||
@@ -152,7 +217,7 @@ class HomeController extends GetxController {
|
||||
kaufdatum.value = filament.kaufdatum;
|
||||
markeController.text = filament.marke;
|
||||
haendlerController.text = filament.haendler;
|
||||
material.value = filament.material;
|
||||
selectMaterial(filament.material);
|
||||
preisController.text = filament.preis.toStringAsFixed(2);
|
||||
farbeController.text = filament.farbe;
|
||||
gewichtController.text = filament.gewichtGramm == null
|
||||
@@ -185,15 +250,16 @@ class HomeController extends GetxController {
|
||||
}
|
||||
|
||||
void resetForm() {
|
||||
formKey.currentState?.reset();
|
||||
editingId.value = null;
|
||||
haendlerController.clear();
|
||||
markeController.clear();
|
||||
farbeController.clear();
|
||||
preisController.clear();
|
||||
kaufdatum.value = DateTime.now();
|
||||
material.value = 'PLA';
|
||||
selectMaterial(materialien.firstOrNull ?? '');
|
||||
materialMessage.value = null;
|
||||
gewichtController.clear();
|
||||
formKey.currentState?.reset();
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -205,6 +271,7 @@ class HomeController extends GetxController {
|
||||
farbeController.dispose();
|
||||
preisController.dispose();
|
||||
gewichtController.dispose();
|
||||
materialController.dispose();
|
||||
super.onClose();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user