diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index 2fa845e..3b04dec 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -59,7 +59,7 @@ "pickDate": "Aufstellung", "pickTime": "Zeit auswählen", "delAll": "Alle Standorte löschen", - "fieldEmpty": "Folgende Felder sind leer:", + "fieldEmpty": "Pflichtfeld(er) nicht ausgefüllt", "cancel": "Abbrechen", "template": "Als Unvollständig speichern", "openMap": "Karte öffnen", diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 074fafd..af00158 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -297,7 +297,7 @@ "@delAll": { "description": "Delete all Places" }, - "fieldEmpty": "Following Field is empty:", + "fieldEmpty": "Required field(s) empty", "@fieldEmpty": { "description": "field empty error message" }, diff --git a/lib/screens/addCam/add_cam_main.dart b/lib/screens/addCam/add_cam_main.dart index d1f286e..3d31a7d 100644 --- a/lib/screens/addCam/add_cam_main.dart +++ b/lib/screens/addCam/add_cam_main.dart @@ -1,9 +1,11 @@ import 'package:fforte/enums/databases.dart'; import 'package:fforte/screens/addCam/cam_widgets.dart'; +import 'package:fforte/screens/helper/dialog_helper.dart'; import 'package:fforte/screens/helper/snack_bar_helper.dart'; import 'package:fforte/screens/addCam/exceptions/location_disabled_exception.dart'; import 'package:fforte/screens/addCam/exceptions/location_forbidden_exception.dart'; import 'package:fforte/screens/addCam/services/geolocator_service.dart'; +import 'package:fforte/screens/sharedMethods/check_required.dart'; import 'package:fforte/screens/sharedMethods/save_template.dart'; import 'package:fforte/screens/sharedWidgets/datum.dart'; import 'package:fforte/screens/sharedWidgets/var_text_field.dart'; @@ -17,7 +19,7 @@ class AddCamMain extends StatefulWidget { final bool isTemplate; final bool isFinished; final bool isSent; - final Map? existingData; + final Map? existingData; const AddCamMain( {super.key, @@ -80,61 +82,105 @@ class _AddCamMainState extends State { DateTime? kontDat = DateTime.now(); DateTime? protoAm = DateTime.now(); - Map getFieldsController() { - Map rmap = { + static Map> rmap = { // Step 1 - "Status": TextEditingController(), - "Betreuung": TextEditingController(), - "Standort": TextEditingController(), - "CID": TextEditingController(), - "FFTyp": TextEditingController(), - "Mez": TextEditingController(), - "KSchloNr": TextEditingController(), - "Rudel": TextEditingController(), + "Standort": { "controller": TextEditingController(), "required": true, }, + "Status": { "controller": TextEditingController(), "required": true, }, + "Betreuung": { "controller": TextEditingController(), "required": false, }, + "CID": { "controller": TextEditingController(), "required": true, }, + "FFTyp": { "controller": TextEditingController(), "required": true, }, + "Mez": { "controller": TextEditingController(), "required": true, }, + "KSchloNr": { "controller": TextEditingController(), "required": false, }, + "Rudel": { "controller": TextEditingController(), "required": true, }, // Step 2 - "OrtInfo": TextEditingController(), - "BeiOrt": TextEditingController(), - "Bland": TextEditingController(), - "Lkr": TextEditingController(), - "Platzung": TextEditingController(), + "DECLNG": { "controller": TextEditingController(), "required": false, }, + "DECLAT": { "controller": TextEditingController(), "required": false, }, + "Bland": { "controller": TextEditingController(), "required": true, }, + "Lkr": { "controller": TextEditingController(), "required": true, }, + "BeiOrt": { "controller": TextEditingController(), "required": true, }, + "OrtInfo": { "controller": TextEditingController(), "required": false, }, + "Platzung": { "controller": TextEditingController(), "required": true, }, // Step 3 - "DECLNG": TextEditingController(), - "DECLAT": TextEditingController(), - "Datum": TextEditingController(), - "KontDat": TextEditingController(), - "KTage1": TextEditingController(), - "KTage2": TextEditingController(), - "AbbauDat": TextEditingController(), - "Auftrag": TextEditingController(), - "KontAbsp": TextEditingController(), - "SonstBem": TextEditingController(), + "Datum": { "controller": TextEditingController(), "required": false, }, + "KontDat": { "controller": TextEditingController(), "required": false, }, + "KTage1": { "controller": TextEditingController(), "required": true, }, + "KTage2": { "controller": TextEditingController(), "required": true, }, + "AbbauDat": { "controller": TextEditingController(), "required": false, }, + "Auftrag": { "controller": TextEditingController(), "required": false, }, + "KontAbsp": { "controller": TextEditingController(), "required": false, }, + "SonstBem": { "controller": TextEditingController(), "required": false, }, // Step 4 - "Adresse1": TextEditingController(), - "Adresse2": TextEditingController(), - "Adresse3": TextEditingController(), - "FKontakt1": TextEditingController(), - "FKontakt2": TextEditingController(), - "FKontakt3": TextEditingController(), - "IntKomm": TextEditingController(), + "Adresse1": { "controller": TextEditingController(), "required": true, }, + "Adresse2": { "controller": TextEditingController(), "required": false, }, + "Adresse3": { "controller": TextEditingController(), "required": false, }, + "FKontakt1": { "controller": TextEditingController(), "required": false, }, + "FKontakt2": { "controller": TextEditingController(), "required": false, }, + "FKontakt3": { "controller": TextEditingController(), "required": false, }, + "IntKomm": { "controller": TextEditingController(), "required": false, }, // Gone? - "ProtoAm": TextEditingController(), - "FotoFilm": TextEditingController(), + "ProtoAm": { "controller": TextEditingController(), "required": false, }, + "FotoFilm": { "controller": TextEditingController(), "required": false, }, }; - return rmap; - } + + // Map> rmap { + // Map> rmap = { + // // Step 1 + // "Standort": { "controller": betreuungC, "required": true, }, + // "Status": { "controller": TextEditingController(), "required": true, }, + // "Betreuung": { "controller": TextEditingController(), "required": false, }, + // "CID": { "controller": TextEditingController(), "required": true, }, + // "FFTyp": { "controller": TextEditingController(), "required": true, }, + // "Mez": { "controller": TextEditingController(), "required": true, }, + // "KSchloNr": { "controller": TextEditingController(), "required": false, }, + // "Rudel": { "controller": TextEditingController(), "required": true, }, + // + // // Step 2 + // "DECLNG": { "controller": TextEditingController(), "required": false, }, + // "DECLAT": { "controller": TextEditingController(), "required": false, }, + // "Bland": { "controller": TextEditingController(), "required": true, }, + // "Lkr": { "controller": TextEditingController(), "required": true, }, + // "BeiOrt": { "controller": TextEditingController(), "required": true, }, + // "OrtInfo": { "controller": TextEditingController(), "required": false, }, + // "Platzung": { "controller": TextEditingController(), "required": true, }, + // + // // Step 3 + // "Datum": { "controller": TextEditingController(), "required": false, }, + // "KontDat": { "controller": TextEditingController(), "required": false, }, + // "KTage1": { "controller": TextEditingController(), "required": true, }, + // "KTage2": { "controller": TextEditingController(), "required": true, }, + // "AbbauDat": { "controller": TextEditingController(), "required": false, }, + // "Auftrag": { "controller": TextEditingController(), "required": false, }, + // "KontAbsp": { "controller": TextEditingController(), "required": false, }, + // "SonstBem": { "controller": TextEditingController(), "required": false, }, + // + // // Step 4 + // "Adresse1": { "controller": TextEditingController(), "required": true, }, + // "Adresse2": { "controller": TextEditingController(), "required": false, }, + // "Adresse3": { "controller": TextEditingController(), "required": false, }, + // "FKontakt1": { "controller": TextEditingController(), "required": false, }, + // "FKontakt2": { "controller": TextEditingController(), "required": false, }, + // "FKontakt3": { "controller": TextEditingController(), "required": false, }, + // "IntKomm": { "controller": TextEditingController(), "required": false, }, + // + // // Gone? + // "ProtoAm": { "controller": TextEditingController(), "required": false, }, + // "FotoFilm": { "controller": TextEditingController(), "required": false, }, + // }; + // return rmap; + // } Map getFieldsText() { - Map rmap = {}; + Map puff = {}; - for (var itemKey in getFieldsController().keys) { - rmap[itemKey] = getFieldsController()["key"]!.text; + for (var itemKey in rmap.keys) { + puff[itemKey] = rmap[itemKey]!["controller"]!.text; } - return rmap; + return puff; } // Map getPlace() { @@ -177,11 +223,9 @@ class _AddCamMainState extends State { // return place; // } - bool empty = false; @override void initState() { - super.initState(); // updates the currentPosition var after the _determine position has finished. Means user view updates with his live location try { @@ -194,6 +238,11 @@ class _AddCamMainState extends State { SnackBarHelper.showSnackBarMessage( context, AppLocalizations.of(context)!.locationForbidden); } + // select initial werte + rmap["Mez"]!["controller"]!.text = selectedMEZ; + rmap["Status"]!["controller"]!.text = selectedStatus; + + // TODO ADD THIS AGAIN BUT RIGHT // If a template is edited this fills in the existing values // if (widget.isTemplate || widget.isFinished && widget.existingData != null) { @@ -234,6 +283,7 @@ class _AddCamMainState extends State { // intKommC.text = widget.existingData!['IntKomm'] ?? ""; // betreuungC.text = widget.existingData!['Betreuung'] ?? ""; // } + super.initState(); } // checks if required fields are not empty. If one is the name will be returned @@ -290,7 +340,8 @@ class _AddCamMainState extends State { child: VarTextField( required: true, dbName: "Standort", - textController: getFieldsController()["Standort"]!, + textController: rmap["Standort"]!["controller"]!, + // textController: betreuungC, localization: AppLocalizations.of(context)!.altstort, dbDesignation: DatabasesEnum.place, ), @@ -314,13 +365,13 @@ class _AddCamMainState extends State { initialStatus: selectedStatus, onStatusChanged: (status) { setState(() { - getFieldsController()["Status"]!.text = status; + rmap["Status"]!["controller"]!.text = status; }); }, ), // -------------------- VarTextField( - textController: getFieldsController()["Betreuung"]!, + textController: rmap["Betreuung"]!["controller"]!, localization: AppLocalizations.of(context)!.betreuung, dbName: "Betreuung", required: false, @@ -331,7 +382,7 @@ class _AddCamMainState extends State { ), // -------------------- VarTextField( - textController: getFieldsController()["CID"]!, + textController: rmap["CID"]!["controller"], localization: AppLocalizations.of(context)!.camLink, dbName: "CID", required: true, @@ -339,7 +390,7 @@ class _AddCamMainState extends State { ), // -------------------- VarTextField( - textController: getFieldsController()["FFTyp"]!, + textController: rmap["FFTyp"]!["controller"], localization: AppLocalizations.of(context)!.fftyp, dbName: "FFTyp", required: true, @@ -365,7 +416,7 @@ class _AddCamMainState extends State { onMEZChanged: (mez) { setState(() { selectedMEZ = mez; - getFieldsController()["Mez"]!.text = mez; + rmap["Mez"]!["controller"]!.text = mez; }); }, ), @@ -374,7 +425,7 @@ class _AddCamMainState extends State { ), // -------------------- VarTextField( - textController: getFieldsController()["KSchloNr"]!, + textController: rmap["KSchloNr"]!["controller"], localization: AppLocalizations.of(context)!.kschlonr, dbName: "KSchloNr", required: false, @@ -385,7 +436,7 @@ class _AddCamMainState extends State { ), // -------------------- VarTextField( - textController: getFieldsController()["Rudel"]!, + textController: rmap["Rudel"]!["controller"], localization: AppLocalizations.of(context)!.rudel, dbName: "Rudel", required: true, @@ -420,15 +471,15 @@ class _AddCamMainState extends State { .push( MaterialPageRoute(builder: (context) { return Karte( - ortInfoC: getFieldsController()["OrtInfo"]!, - beiOrtC: getFieldsController()["BeiOrt"]!, + ortInfoC: rmap["OrtInfo"]!["controller"], + beiOrtC: rmap["BeiOrt"]!["controller"], currentPosition: currentPosition, onPositionChange: (updatedPosition) { setState(() { currentPosition = updatedPosition; - getFieldsController()["DECLNG"]!.text = + rmap["DECLNG"]!["controller"]!.text = updatedPosition.longitude.toString(); - getFieldsController()["DECLAT"]!.text = + rmap["DECLAT"]!["controller"]!.text = updatedPosition.latitude.toString(); }); }, @@ -456,7 +507,7 @@ class _AddCamMainState extends State { ), // -------------------- VarTextField( - textController: getFieldsController()["Bland"]!, + textController: rmap["Bland"]!["controller"]!, localization: AppLocalizations.of(context)!.bland, dbName: "BLand", required: true, @@ -465,7 +516,7 @@ class _AddCamMainState extends State { ), // -------------------- VarTextField( - textController: getFieldsController()["Lkr"]!, + textController: rmap["Lkr"]!["controller"]!, localization: AppLocalizations.of(context)!.lkr, dbName: "Lkr", required: true, @@ -473,7 +524,7 @@ class _AddCamMainState extends State { ), // -------------------- VarTextField( - textController: getFieldsController()["BeiOrt"]!, + textController: rmap["BeiOrt"]!["controller"]!, localization: AppLocalizations.of(context)!.beiort, dbName: "BeiOrt", required: true, @@ -481,7 +532,7 @@ class _AddCamMainState extends State { ), // -------------------- VarTextField( - textController: getFieldsController()["OrtInfo"]!, + textController: rmap["OrtInfo"]!["controller"]!, localization: AppLocalizations.of(context)!.ortinfo, dbName: "OrtInfo", required: false, @@ -507,7 +558,7 @@ class _AddCamMainState extends State { onPlatzungChanged: (platzung) { setState(() { selectedPlatzung = platzung; - getFieldsController()["Platzung"]!.text = platzung; + rmap["Platzung"]!["controller"]!.text = platzung; }); }, ), @@ -522,7 +573,7 @@ class _AddCamMainState extends State { initDatum: datum, onDateChanged: (value) { datum = value; - getFieldsController()["Datum"]!.text = + rmap["Datum"]!["controller"]!.text = value.toString().split(" ").first; }, name: AppLocalizations.of(context)!.pickDate, @@ -533,7 +584,7 @@ class _AddCamMainState extends State { onDateChanged: (value) { setState(() { kontDat = value; - getFieldsController()["KontDat"]!.text = + rmap["KontDat"]!["controller"]!.text = value.toString().split(" ").first; }); }, @@ -565,7 +616,7 @@ class _AddCamMainState extends State { flex: 4, child: VarTextField( otherDefault: "24", - textController: getFieldsController()["KTage1"]!, + textController: rmap["KTage1"]!["controller"]!, localization: AppLocalizations.of(context)!.ktage1, dbName: "KTage1", required: true, @@ -584,7 +635,7 @@ class _AddCamMainState extends State { flex: 4, child: VarTextField( otherDefault: "48", - textController: getFieldsController()["KTage2"]!, + textController: rmap["KTage2"]!["controller"]!, localization: AppLocalizations.of(context)!.ktage2, dbName: "KTage2", required: true, @@ -602,7 +653,7 @@ class _AddCamMainState extends State { initAbbauDat: abbauDat, onDateChanged: (value) { abbauDat = value; - getFieldsController()["AbbauDat"]!.text = + rmap["AbbauDat"]!["controller"]!.text = value.toString().split(" ").first; }, ), @@ -613,7 +664,7 @@ class _AddCamMainState extends State { ), // -------------------- VarTextField( - textController: getFieldsController()["Auftrag"]!, + textController: rmap["Auftrag"]!["controller"]!, localization: AppLocalizations.of(context)!.auftrag, dbName: "Auftrag", required: false, @@ -621,7 +672,7 @@ class _AddCamMainState extends State { ), // -------------------- VarTextField( - textController: getFieldsController()["KontAbsp"]!, + textController: rmap["KontAbsp"]!["controller"]!, localization: AppLocalizations.of(context)!.kontabsp, dbName: "KontAbsp", required: false, @@ -629,7 +680,7 @@ class _AddCamMainState extends State { ), // -------------------- VarTextField( - textController: getFieldsController()["SonstBem"]!, + textController: rmap["SonstBem"]!["controller"]!, localization: AppLocalizations.of(context)!.sonstbemerkungen, dbName: "SonstBem", @@ -643,7 +694,7 @@ class _AddCamMainState extends State { content: Column( children: [ VarTextField( - textController: getFieldsController()["Adresse1"]!, + textController: rmap["Adresse1"]!["controller"]!, localization: AppLocalizations.of(context)!.adresse1, dbName: "Adresse1", dbDesignation: DatabasesEnum.place, @@ -652,7 +703,7 @@ class _AddCamMainState extends State { ), // -------------------- VarTextField( - textController: getFieldsController()["Adresse2"]!, + textController: rmap["Adresse2"]!["controller"]!, localization: AppLocalizations.of(context)!.adresse2, dbName: "Adresse2", required: false, @@ -660,7 +711,7 @@ class _AddCamMainState extends State { ), // -------------------- VarTextField( - textController: getFieldsController()["Adresse3"]!, + textController: rmap["Adresse3"]!["controller"]!, localization: AppLocalizations.of(context)!.adresse3, dbName: "Adresse3", required: false, @@ -671,7 +722,7 @@ class _AddCamMainState extends State { ), // -------------------- VarTextField( - textController: getFieldsController()["FKontakt1"]!, + textController: rmap["FKontakt1"]!["controller"]!, localization: AppLocalizations.of(context)!.fkontakt1, dbName: "FKontakt1", required: false, @@ -679,7 +730,7 @@ class _AddCamMainState extends State { ), // -------------------- VarTextField( - textController: getFieldsController()["FKontakt2"]!, + textController: rmap["FKontakt2"]!["controller"]!, localization: AppLocalizations.of(context)!.fkontakt2, dbName: "FKontakt2", required: false, @@ -687,7 +738,7 @@ class _AddCamMainState extends State { ), // -------------------- VarTextField( - textController: getFieldsController()["FKontakt3"]!, + textController: rmap["FKontakt3"]!["controller"]!, localization: AppLocalizations.of(context)!.fkontakt3, dbName: "FKontakt3", required: false, @@ -695,7 +746,7 @@ class _AddCamMainState extends State { ), // -------------------- VarTextField( - textController: getFieldsController()["IntKomm"]!, + textController: rmap["IntKomm"]!["controller"]!, localization: AppLocalizations.of(context)!.intkomm, dbName: "IntKomm", required: false, @@ -741,21 +792,24 @@ class _AddCamMainState extends State { currentStep += 1; }); } else { - // TODO implement validateData again - // List emptyFields = validateData(); // ! always filled out - // empty = false; - // if (widget.isSent) { - // Navigator.pushNamedAndRemoveUntil( - // context, '/home', (route) => false); - // } else if (empty == true) { - // DialogHelper.showTemplateDialog( - // context, emptyFields, getFieldsText(); - // return; - // } else if (empty == false) { - // await DialogHelper.showSaveOptionsDialog( - // context, getFieldsText(), widget.isTemplate); - // } + + if (widget.isSent) { + Navigator.pushNamedAndRemoveUntil( + context, '/home', (route) => false); + return; + } + + bool empty = CheckRequired.checkRequired(rmap); + + if (empty == true) { + DialogHelper.showTemplateDialog( + context, getFieldsText()); + return; + } else if (empty == false) { + await DialogHelper.showSaveOptionsDialog( + context, getFieldsText(), widget.isTemplate); + } } }, onStepCancel: () { diff --git a/lib/screens/helper/dialog_helper.dart b/lib/screens/helper/dialog_helper.dart index 7afd31e..cdc984e 100644 --- a/lib/screens/helper/dialog_helper.dart +++ b/lib/screens/helper/dialog_helper.dart @@ -10,16 +10,13 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart'; class DialogHelper { // Function to show the dialog where the user has to choose if he want to safe his values as a template static Future showTemplateDialog(BuildContext context, - List emptyField, Map saveData) async { + Map saveData) async { return showDialog( context: context, barrierDismissible: false, builder: (BuildContext context) { return AlertDialog( title: Text(AppLocalizations.of(context)!.fieldEmpty), - content: SingleChildScrollView( - child: ListBody(children: [Text(emptyField.join("; "))]), - ), actions: [ TextButton( onPressed: () { diff --git a/lib/screens/sharedMethods/check_required.dart b/lib/screens/sharedMethods/check_required.dart new file mode 100644 index 0000000..8ad3967 --- /dev/null +++ b/lib/screens/sharedMethods/check_required.dart @@ -0,0 +1,12 @@ +class CheckRequired { + static bool checkRequired(Map> fieldsList) { + for (String key in fieldsList.keys) { + if (fieldsList[key]!["required"]! && fieldsList[key]!["controller"]!.text.isEmpty) { + return true; + } + } + + return false; + } +} +