diff --git a/app-release.apk b/app-release.apk index efcb6fd..36de5ca 100644 Binary files a/app-release.apk and b/app-release.apk differ diff --git a/lib/home.dart b/lib/home.dart index ccfc8ef..2480d4b 100644 --- a/lib/home.dart +++ b/lib/home.dart @@ -68,8 +68,16 @@ class HomePage extends StatelessWidget { }, child: Text(AppLocalizations.of(context)!.addplace), ), - - const SizedBox(height: 10), + ElevatedButton( + style: ElevatedButton.styleFrom( + minimumSize: const Size(250, 40), + ), + onPressed: () => Navigator.pushNamed(context, '/viewCams'), + child: Text(AppLocalizations.of(context)!.viewplaces), + ), + const SizedBox(height: 20), + const Divider(), + const SizedBox(height: 20), ElevatedButton( style: ElevatedButton.styleFrom( minimumSize: const Size(250, 40), @@ -78,14 +86,6 @@ class HomePage extends StatelessWidget { child: Text(AppLocalizations.of(context)!.excursion), ), // Excursion - const SizedBox(height: 10), - ElevatedButton( - style: ElevatedButton.styleFrom( - minimumSize: const Size(250, 40), - ), - onPressed: () => Navigator.pushNamed(context, '/viewCams'), - child: Text(AppLocalizations.of(context)!.viewplaces), - ), const SizedBox(height: 10), ElevatedButton( @@ -96,7 +96,9 @@ class HomePage extends StatelessWidget { child: Text(AppLocalizations.of(context)!.viewExcursionen), ), - const SizedBox(height: 10), + const SizedBox(height: 20), + const Divider(), + const SizedBox(height: 20), ElevatedButton( style: ElevatedButton.styleFrom( minimumSize: const Size(250, 40), diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index 40720b2..e7c4ef6 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -80,7 +80,8 @@ "viewplaces": "Standorte anzeigen", "viewExcursionen": "Exkursionen anzeigen", "showloginscreen": "Login-Bildschirm Anzeigen", - "apiaddress": "Api-Adresse", + "ffApiAddress": "Fotofallen Api-Adresse", + "exApiAddress": "Exkursions Api-Adresse", "benutzername": "Benutzername", "filelocation": "Ort der zuletzt gespeicherten Datei:", "open": "öffnen", @@ -90,6 +91,7 @@ "pickfile": "Datei auswählen", "placedata": "Standortdaten", "excursionData": "Exkursions daten", + "excursion": "Exkursion", "sent": "Gesendet", "fileSaved": "Datei gespeichtert bei: ", "savefilefailed": "Fehler. Bitte nochmal versuchen", @@ -140,13 +142,14 @@ "schlecht": "Schlecht", "spurGefunden": "Spur gefunden", "gesLaengeAllerDokSpuren": "Gesamte Länge aller dok. Spuren", - "maxAnzahlZusGefaehrdeterTiere": "Max. Anzahl zus. gefährdeter Tiere", + "gesLaengeAllerDokWelpenSpuren": "Länge aller dok. Welpenspuren", + "maxAnzahlZusGefaehrdeterTiere": "Max. Anz. zus. gefährdeter Tiere", "sicher": "Sicher", - "welpenSpurGefunden": "Welpenspur gefunden", + "welpenSpurGefunden": "Welpenspur", "anzahlLosungen": "Anzahl losungen", "davonEingesammelt": "Davon eingesammelt", "davonGenetikproben": "Davon Genetikproben", - "anzahlUrinMakierstellen": "Anzahl Urin-/Makierstellen", + "anzahlUrinMakierstellen": "Anz. Urin-/Makierstellen", "anzahlOestrusblut": "Anzahl Oestrusblut", "anzahlHaarproben": "Anzahl Haarproben", "liegestelle": "Liegestelle", @@ -159,8 +162,14 @@ "tracking": "Tracking", "couldntDeterminePosition": "Position konnte nicht ermittelt werden", "trackingRunningInBackground": "Die Tracking funktion läuft im Hintergrund", - "needsAlwaysLocation": "Diese app braucht die Standort berechtigung auf immer gesetzt", + "needsAlwaysLocation": "Diese app braucht die Standortberechtigung auf \"immer\" gesetzt", "deleteWholeRouteBody": "Sind Sie sicher, dass die gesamte bisher gegangene Route gelöscht werden soll?", "oder": "oder", - "bedingungenGroesserAlsStrecke": "Summe der Spurbedingungen ist größer als die der zurueckgelegten Strecke" + "bedingungenGroesserAlsStrecke": "Summe der Spurbedingungen ist größer als die der zurueckgelegten Strecke", + "einstellungenOeffnen": "Einstellungen öffnen", + "erfolgreich": "Erfolgreich", + "trackingAnAusschalten": "Tracking an/aus-schalten", + "trackingStart": "Tracking starten", + "trackingStop": "Tracking stoppen", + "trackingPause": "Tracking pausieren" } diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 226db87..940c915 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -385,10 +385,8 @@ "description": "show login screen popup menu item" }, - "apiaddress": "Api-address", - "@apiaddress": { - "description": "api address hint" - }, + "ffApiAddress": "Traps api-adress", + "exApiAddress": "Excursions api-adress", "benutzername": "Username", "@benutzername": { @@ -627,11 +625,13 @@ "gesLaengeAllerDokSpuren": "Total length of documented tracks", + "gesLaengeAllerDokWelpenSpuren": "Gesamte Länge aller dok. Spuren", + "maxAnzahlZusGefaehrdeterTiere": "Max count of additonal dangered animals", "sicher": "Certain", - "welpenSpurGefunden": "Puppy track Found", + "welpenSpurGefunden": "Puppy track", "anzahlLosungen": "Losung count", @@ -671,5 +671,15 @@ "oder": "or", - "bedingungenGroesserAlsStrecke": "Sum of the track conditions is bigger then sum of the distance traveled" + "bedingungenGroesserAlsStrecke": "Sum of the track conditions is bigger then sum of the distance traveled", + + "erfolgreich": "Successful", + + "trackingAnAusschalten": "Turn tracking on/off", + + "trackingStart": "Start tracking", + + "trackingStop": "Stop tracking", + + "trackingPause": "Pause Tracking" } diff --git a/lib/l10n/app_localizations.dart b/lib/l10n/app_localizations.dart index 3c7116c..67d3c70 100644 --- a/lib/l10n/app_localizations.dart +++ b/lib/l10n/app_localizations.dart @@ -581,11 +581,17 @@ abstract class AppLocalizations { /// **'Show login Screen'** String get showloginscreen; - /// api address hint + /// No description provided for @ffApiAddress. /// /// In en, this message translates to: - /// **'Api-address'** - String get apiaddress; + /// **'Traps api-adress'** + String get ffApiAddress; + + /// No description provided for @exApiAddress. + /// + /// In en, this message translates to: + /// **'Excursions api-adress'** + String get exApiAddress; /// intro screen benutzername hint /// @@ -947,6 +953,12 @@ abstract class AppLocalizations { /// **'Total length of documented tracks'** String get gesLaengeAllerDokSpuren; + /// No description provided for @gesLaengeAllerDokWelpenSpuren. + /// + /// In en, this message translates to: + /// **'Gesamte Länge aller dok. Spuren'** + String get gesLaengeAllerDokWelpenSpuren; + /// No description provided for @maxAnzahlZusGefaehrdeterTiere. /// /// In en, this message translates to: @@ -962,7 +974,7 @@ abstract class AppLocalizations { /// No description provided for @welpenSpurGefunden. /// /// In en, this message translates to: - /// **'Puppy track Found'** + /// **'Puppy track'** String get welpenSpurGefunden; /// No description provided for @anzahlLosungen. @@ -1084,6 +1096,36 @@ abstract class AppLocalizations { /// In en, this message translates to: /// **'Sum of the track conditions is bigger then sum of the distance traveled'** String get bedingungenGroesserAlsStrecke; + + /// No description provided for @erfolgreich. + /// + /// In en, this message translates to: + /// **'Successful'** + String get erfolgreich; + + /// No description provided for @trackingAnAusschalten. + /// + /// In en, this message translates to: + /// **'Turn tracking on/off'** + String get trackingAnAusschalten; + + /// No description provided for @trackingStart. + /// + /// In en, this message translates to: + /// **'Start tracking'** + String get trackingStart; + + /// No description provided for @trackingStop. + /// + /// In en, this message translates to: + /// **'Stop tracking'** + String get trackingStop; + + /// No description provided for @trackingPause. + /// + /// In en, this message translates to: + /// **'Pause Tracking'** + String get trackingPause; } class _AppLocalizationsDelegate extends LocalizationsDelegate { diff --git a/lib/l10n/app_localizations_de.dart b/lib/l10n/app_localizations_de.dart index 78ba490..3eb2bf9 100644 --- a/lib/l10n/app_localizations_de.dart +++ b/lib/l10n/app_localizations_de.dart @@ -252,7 +252,10 @@ class AppLocalizationsDe extends AppLocalizations { String get showloginscreen => 'Login-Bildschirm Anzeigen'; @override - String get apiaddress => 'Api-Adresse'; + String get ffApiAddress => 'Fotofallen Api-Adresse'; + + @override + String get exApiAddress => 'Exkursions Api-Adresse'; @override String get benutzername => 'Benutzername'; @@ -324,7 +327,7 @@ class AppLocalizationsDe extends AppLocalizations { String get notest => 'Kein Test'; @override - String get excursion => 'Excursion'; + String get excursion => 'Exkursion'; @override String get dateandtime => 'Datum und Zeit'; @@ -435,13 +438,16 @@ class AppLocalizationsDe extends AppLocalizations { String get gesLaengeAllerDokSpuren => 'Gesamte Länge aller dok. Spuren'; @override - String get maxAnzahlZusGefaehrdeterTiere => 'Max. Anzahl zus. gefährdeter Tiere'; + String get gesLaengeAllerDokWelpenSpuren => 'Länge aller dok. Welpenspuren'; + + @override + String get maxAnzahlZusGefaehrdeterTiere => 'Max. Anz. zus. gefährdeter Tiere'; @override String get sicher => 'Sicher'; @override - String get welpenSpurGefunden => 'Welpenspur gefunden'; + String get welpenSpurGefunden => 'Welpenspur'; @override String get anzahlLosungen => 'Anzahl losungen'; @@ -453,7 +459,7 @@ class AppLocalizationsDe extends AppLocalizations { String get davonGenetikproben => 'Davon Genetikproben'; @override - String get anzahlUrinMakierstellen => 'Anzahl Urin-/Makierstellen'; + String get anzahlUrinMakierstellen => 'Anz. Urin-/Makierstellen'; @override String get anzahlOestrusblut => 'Anzahl Oestrusblut'; @@ -492,7 +498,7 @@ class AppLocalizationsDe extends AppLocalizations { String get trackingRunningInBackground => 'Die Tracking funktion läuft im Hintergrund'; @override - String get needsAlwaysLocation => 'Diese app braucht die Standort berechtigung auf immer gesetzt'; + String get needsAlwaysLocation => 'Diese app braucht die Standortberechtigung auf \"immer\" gesetzt'; @override String get deleteWholeRouteBody => 'Sind Sie sicher, dass die gesamte bisher gegangene Route gelöscht werden soll?'; @@ -502,4 +508,19 @@ class AppLocalizationsDe extends AppLocalizations { @override String get bedingungenGroesserAlsStrecke => 'Summe der Spurbedingungen ist größer als die der zurueckgelegten Strecke'; + + @override + String get erfolgreich => 'Erfolgreich'; + + @override + String get trackingAnAusschalten => 'Tracking an/aus-schalten'; + + @override + String get trackingStart => 'Tracking starten'; + + @override + String get trackingStop => 'Tracking stoppen'; + + @override + String get trackingPause => 'Tracking pausieren'; } diff --git a/lib/l10n/app_localizations_en.dart b/lib/l10n/app_localizations_en.dart index 5144ddd..c9fabb7 100644 --- a/lib/l10n/app_localizations_en.dart +++ b/lib/l10n/app_localizations_en.dart @@ -252,7 +252,10 @@ class AppLocalizationsEn extends AppLocalizations { String get showloginscreen => 'Show login Screen'; @override - String get apiaddress => 'Api-address'; + String get ffApiAddress => 'Traps api-adress'; + + @override + String get exApiAddress => 'Excursions api-adress'; @override String get benutzername => 'Username'; @@ -434,6 +437,9 @@ class AppLocalizationsEn extends AppLocalizations { @override String get gesLaengeAllerDokSpuren => 'Total length of documented tracks'; + @override + String get gesLaengeAllerDokWelpenSpuren => 'Gesamte Länge aller dok. Spuren'; + @override String get maxAnzahlZusGefaehrdeterTiere => 'Max count of additonal dangered animals'; @@ -441,7 +447,7 @@ class AppLocalizationsEn extends AppLocalizations { String get sicher => 'Certain'; @override - String get welpenSpurGefunden => 'Puppy track Found'; + String get welpenSpurGefunden => 'Puppy track'; @override String get anzahlLosungen => 'Losung count'; @@ -502,4 +508,19 @@ class AppLocalizationsEn extends AppLocalizations { @override String get bedingungenGroesserAlsStrecke => 'Sum of the track conditions is bigger then sum of the distance traveled'; + + @override + String get erfolgreich => 'Successful'; + + @override + String get trackingAnAusschalten => 'Turn tracking on/off'; + + @override + String get trackingStart => 'Start tracking'; + + @override + String get trackingStop => 'Stop tracking'; + + @override + String get trackingPause => 'Pause Tracking'; } diff --git a/lib/main.dart b/lib/main.dart index 4ee11a3..c674663 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -20,8 +20,8 @@ void main() async { bool isFirstLaunch = prefs.getBool('isFirstLaunch') ?? true; await prefs.setString('kTage1', "28"); await prefs.setString('kTage2', "48"); - await prefs.setString( - 'apiAddress', 'http://192.168.1.106/www.dbb-wolf.de/data/app24.php'); + await prefs.setString('fotofallenApiAddress', 'http://192.168.1.170/www.dbb-wolf.de/data/app24.php'); + await prefs.setString('exkursionenApiAddress', 'http://192.168.1.170/www.dbb-wolf.de/data/api_exkursion.php'); runApp(MyApp(isFirstLaunch: isFirstLaunch)); } diff --git a/lib/screens/excursion/excursion_main.dart b/lib/screens/excursion/excursion_main.dart index 7facc77..bcfad61 100644 --- a/lib/screens/excursion/excursion_main.dart +++ b/lib/screens/excursion/excursion_main.dart @@ -147,16 +147,19 @@ class _ExcursionMainState extends State { return currentPosition; }); + if (widget.existingData?.isNotEmpty ?? false) { for (var key in widget.existingData!.keys) { rmap[key]!["controller"]!.text = widget.existingData?[key].toString() ?? ""; } } else { - // Set BLand if there is no existing data + // Set BLand and default values if there is no existing data SharedPreferences.getInstance().then((prefs) { rmap["BLand"]!["controller"]!.text = prefs.getString('bLand') ?? ""; }); + + rmap["Datum"]!["controller"]!.text = DateTime.now().toString(); } isTemplate = widget.isTemplate; @@ -343,7 +346,7 @@ class _ExcursionMainState extends State { }, ), ), - child: Text(AppLocalizations.of(context)!.tracking), + child: Text(AppLocalizations.of(context)!.trackingAnAusschalten), ), const SizedBox(height: 10), @@ -382,12 +385,12 @@ class _ExcursionMainState extends State { // ---------- Track found SpurGefunden( spurFund: rmap["SpurFund"]!["controller"]!, - // spurLang: rmap["SpurLang"]!["controller"]!, - // spurTiere: rmap["SpurTiere"]!["controller"]!, - // spSicher: rmap["SpSicher"]!["controller"]!, + spurLang: rmap["SpurLang"]!["controller"]!, + spurTiere: rmap["SpurTiere"]!["controller"]!, + spSicher: rmap["SpSicher"]!["controller"]!, welpenSp: rmap["WelpenSp"]!["controller"]!, - // welpenAnz: rmap["WelpenAnz"]!["controller"]!, - // wpSicher: rmap["WpSicher"]!["controller"]!, + welpenAnz: rmap["WelpenAnz"]!["controller"]!, + wpSicher: rmap["WpSicher"]!["controller"]!, ), const Divider(), const SizedBox(height: 20), @@ -505,13 +508,14 @@ class _ExcursionMainState extends State { DatabasesEnum.excursion, ); return; - } else if (!empty) { - await AddEntriesDialogHelper.showSaveOptionsDialog( + } else { + bool pop = await AddEntriesDialogHelper.showSaveOptionsDialog( context, getFieldsText(), widget.isTemplate, DatabasesEnum.excursion, ); + if (pop && context.mounted) Navigator.of(context).pop(); } } }, diff --git a/lib/screens/excursion/widgets/bima_nutzer.dart b/lib/screens/excursion/widgets/bima_nutzer.dart index 73096d4..938d5b7 100644 --- a/lib/screens/excursion/widgets/bima_nutzer.dart +++ b/lib/screens/excursion/widgets/bima_nutzer.dart @@ -63,7 +63,7 @@ class _StatusState extends State { visualDensity: const VisualDensity(vertical: -4), title: Text(AppLocalizations.of(context)!.nneBund), leading: Radio( - value: 'NNE-Bund', + value: 'NNE Bund', groupValue: _selectedStatus, onChanged: (value) { setState(() { diff --git a/lib/screens/excursion/widgets/hinweise.dart b/lib/screens/excursion/widgets/hinweise.dart index 33fe5fb..4a4e872 100644 --- a/lib/screens/excursion/widgets/hinweise.dart +++ b/lib/screens/excursion/widgets/hinweise.dart @@ -66,6 +66,8 @@ class _HinweiseState extends State { for (String key in props.keys) { if (!firstRun && props[key]!) { widget.hinweise.text += ","; + } else if (firstRun && props[key]!) { + firstRun = false; } if (key == "sonstiges") { widget.hinweise.text += sonstigesController.text; @@ -73,7 +75,6 @@ class _HinweiseState extends State { widget.hinweise.text += key; } - firstRun = false; } debugPrint(widget.hinweise.text); } diff --git a/lib/screens/excursion/widgets/hund_u_leine.dart b/lib/screens/excursion/widgets/hund_u_leine.dart index 2a817ef..766cbd5 100644 --- a/lib/screens/excursion/widgets/hund_u_leine.dart +++ b/lib/screens/excursion/widgets/hund_u_leine.dart @@ -24,6 +24,7 @@ class HundULeineState extends State { _selectedMHundValue = "nein"; } else { _selectedMHundValue = widget.mHund.text; + visible = true; } if (widget.mLeine.text == "") { diff --git a/lib/screens/excursion/widgets/spur_gefunden.dart b/lib/screens/excursion/widgets/spur_gefunden.dart index 48af687..eb6e628 100644 --- a/lib/screens/excursion/widgets/spur_gefunden.dart +++ b/lib/screens/excursion/widgets/spur_gefunden.dart @@ -3,23 +3,23 @@ import 'package:fforte/l10n/app_localizations.dart'; class SpurGefunden extends StatefulWidget { final TextEditingController spurFund; - // final TextEditingController spurLang; - // final TextEditingController spurTiere; - // final TextEditingController spSicher; + final TextEditingController spurLang; + final TextEditingController spurTiere; + final TextEditingController spSicher; final TextEditingController welpenSp; - // final TextEditingController welpenAnz; - // final TextEditingController wpSicher; + final TextEditingController welpenAnz; + final TextEditingController wpSicher; - const SpurGefunden( - {super.key, - required this.spurFund, - // required this.spurLang, - // required this.spurTiere, - // required this.spSicher, - required this.welpenSp, - // required this.welpenAnz, - // required this.wpSicher, - }); + const SpurGefunden({ + super.key, + required this.spurFund, + required this.spurLang, + required this.spurTiere, + required this.spSicher, + required this.welpenSp, + required this.welpenAnz, + required this.wpSicher, + }); @override State createState() => _SpurGefundenState(); @@ -27,21 +27,27 @@ class SpurGefunden extends StatefulWidget { class _SpurGefundenState extends State { late bool _spurFundChecked; - // bool _spSicher = false; - // bool _wpSicher = false; + bool _spSicher = false; + bool _wpSicher = false; late bool _welpenSpFundChecked; @override - void initState() { - if (widget.spurFund.text == "") { - _spurFundChecked = false; - _welpenSpFundChecked = false; - } else { - _spurFundChecked = true; - _welpenSpFundChecked = true; + void initState() { + if (widget.spurFund.text == "") { + _spurFundChecked = false; + _welpenSpFundChecked = false; + } else { + _spurFundChecked = true; + _welpenSpFundChecked = true; + if (widget.wpSicher.text != "") { + _wpSicher = true; + } + if (widget.spSicher.text != "") { + _spSicher = true; } - super.initState(); } + super.initState(); + } @override Widget build(BuildContext context) { @@ -59,106 +65,166 @@ class _SpurGefundenState extends State { }); }, ), - Text(AppLocalizations.of(context)!.welpenSpurGefunden), - Checkbox( - value: _welpenSpFundChecked, - onChanged: (val) { - setState(() { - _welpenSpFundChecked = val ?? false; - widget.welpenSp.text = val ?? false ? "WelpenSp" : ""; - }); - }, - ), + // Text(AppLocalizations.of(context)!.welpenSpurGefunden), + // Checkbox( + // value: _welpenSpFundChecked, + // onChanged: (val) { + // setState(() { + // _welpenSpFundChecked = val ?? false; + // widget.welpenSp.text = val ?? false ? "WelpenSp" : ""; + // }); + // }, + // ), ], ), - // Visibility( - // visible: _spurFundChecked, - // child: Column( - // children: [ - // Align( - // alignment: Alignment.bottomLeft, - // child: Text(AppLocalizations.of(context)!.gesLaengeAllerDokSpuren)), - // TextField( - // keyboardType: TextInputType.number, - // controller: widget.spurLang, - // ), - // const SizedBox( - // height: 30, - // ), - // Align( - // alignment: Alignment.bottomLeft, - // child: Text(AppLocalizations.of(context)!.maxAnzahlZusGefaehrdeterTiere)), - // TextField( - // keyboardType: TextInputType.number, - // controller: widget.spurTiere, - // ), - // Row( - // children: [ - // Text(AppLocalizations.of(context)!.sicher), - // Checkbox( - // value: _spSicher, - // onChanged: (val) { - // setState(() { - // _spSicher = val ?? false; - // widget.spSicher.text = _spSicher ? "sicher" : "unsicher"; - // }); - // }), - // ], - // ), - // const SizedBox( - // height: 10, - // ), - // Row( - // children: [ - // Text(AppLocalizations.of(context)!.welpenSpurGefunden), - // Checkbox( - // value: _welpenSp, - // onChanged: (val) { - // setState(() { - // _welpenSp = val ?? false; - // }); - // }, - // ), - // ], - // ), - // Visibility( - // visible: _welpenSp, - // child: Column( - // children: [ - // Align( - // alignment: Alignment.bottomLeft, - // child: Text(AppLocalizations.of(context)!.gesLaengeAllerDokSpuren)), - // TextField( - // keyboardType: TextInputType.number, - // controller: widget.welpenSp, - // ), - // const SizedBox(height: 20,), - // Align( - // alignment: Alignment.bottomLeft, - // child: Text(AppLocalizations.of(context)!.maxAnzahlZusGefaehrdeterTiere)), - // TextField( - // keyboardType: TextInputType.number, - // controller: widget.welpenAnz, - // ), - // Row( - // children: [ - // Text(AppLocalizations.of(context)!.sicher), - // Checkbox( - // value: _wpSicher, - // onChanged: (val) { - // setState(() { - // _wpSicher = val ?? false; - // widget.spSicher.text = - // _spSicher ? "sicher" : "unsicher"; - // }); - // }), - // ], - // ), - // ], - // )), - // ], - // ), - // ), + Visibility( + visible: _spurFundChecked, + child: Column( + children: [ + Row( + children: [ + Expanded( + flex: 7, + child: Align( + alignment: Alignment.bottomLeft, + child: Text( + AppLocalizations.of(context)!.gesLaengeAllerDokSpuren, + ), + ), + ), + Expanded( + flex: 2, + child: TextField( + keyboardType: TextInputType.number, + controller: widget.spurLang, + ), + ), + ], + ), + // const SizedBox(height: 10), + Row( + children: [ + Expanded( + flex: 7, + child: Align( + alignment: Alignment.bottomLeft, + child: Text( + AppLocalizations.of( + context, + )!.maxAnzahlZusGefaehrdeterTiere, + ), + ), + ), + Expanded( + flex: 2, + child: TextField( + keyboardType: TextInputType.number, + controller: widget.spurTiere, + ), + ), + ], + ), + Row( + children: [ + Text(AppLocalizations.of(context)!.sicher), + Checkbox( + value: _spSicher, + onChanged: (val) { + setState(() { + _spSicher = val ?? false; + widget.spSicher.text = + _spSicher ? "sicher" : "unsicher"; + }); + }, + ), + ], + ), + // const SizedBox(height: 10), + Row( + children: [ + Text(AppLocalizations.of(context)!.welpenSpurGefunden), + Checkbox( + value: _welpenSpFundChecked, + onChanged: (val) { + setState(() { + _welpenSpFundChecked = val ?? false; + }); + }, + ), + ], + ), + Visibility( + visible: _welpenSpFundChecked, + child: Column( + children: [ + Row( + children: [ + Expanded( + flex: 7, + child: Align( + alignment: Alignment.bottomLeft, + child: Text( + AppLocalizations.of( + context, + )!.gesLaengeAllerDokWelpenSpuren, + ), + ), + ), + Expanded( + flex: 2, + child: TextField( + keyboardType: TextInputType.number, + controller: widget.welpenSp, + ), + ), + ], + ), + + // const SizedBox(height: 10), + + Row( + children: [ + Expanded( + flex: 7, + child: Align( + alignment: Alignment.bottomLeft, + child: Text( + AppLocalizations.of( + context, + )!.maxAnzahlZusGefaehrdeterTiere, + ), + ), + ), + Expanded( + flex: 2, + child: TextField( + keyboardType: TextInputType.number, + controller: widget.welpenAnz, + ), + ), + ], + ), + Row( + children: [ + Text(AppLocalizations.of(context)!.sicher), + Checkbox( + value: _wpSicher, + onChanged: (val) { + setState(() { + _wpSicher = val ?? false; + widget.spSicher.text = + _spSicher ? "sicher" : "unsicher"; + }); + }, + ), + ], + ), + ], + ), + ), + ], + ), + ), ], ); } diff --git a/lib/screens/excursion/widgets/tracking.dart b/lib/screens/excursion/widgets/tracking.dart index 96c47d0..fcca49b 100644 --- a/lib/screens/excursion/widgets/tracking.dart +++ b/lib/screens/excursion/widgets/tracking.dart @@ -175,7 +175,7 @@ class _TrackingState extends State { ), ), if (positionStreamRunning) - IconButton( + TextButton( onPressed: () { setState(() { positionStreamRunning = false; @@ -183,12 +183,9 @@ class _TrackingState extends State { NotificationService().deleteNotification(); }); }, - icon: Icon( - Icons.stop_rounded, - color: Theme.of(context).colorScheme.errorContainer, - ), + child: Text(AppLocalizations.of(context)!.trackingStop), ), - IconButton( + TextButton( onPressed: () { if (positionStreamRunning) { positionStreamRunning = false; @@ -199,10 +196,10 @@ class _TrackingState extends State { } setState(() {}); }, - icon: + child: positionStreamRunning - ? Icon(Icons.pause) - : Icon(Icons.play_arrow), + ? Text(AppLocalizations.of(context)!.trackingPause) + : Text(AppLocalizations.of(context)!.trackingStart) ), ], ), diff --git a/lib/screens/helper/add_entries_dialog_helper.dart b/lib/screens/helper/add_entries_dialog_helper.dart index ea32faa..5a880c1 100644 --- a/lib/screens/helper/add_entries_dialog_helper.dart +++ b/lib/screens/helper/add_entries_dialog_helper.dart @@ -4,7 +4,6 @@ import 'package:fforte/screens/sharedMethods/http_request.dart'; import 'package:fforte/screens/sharedMethods/save_file.dart'; import 'package:fforte/screens/sharedMethods/save_template.dart'; import 'package:fforte/screens/sharedMethods/save_main_entry.dart'; -import 'package:file_picker/file_picker.dart'; import 'package:flutter/material.dart'; import 'package:fforte/l10n/app_localizations.dart'; import 'package:geolocator/geolocator.dart'; @@ -106,15 +105,16 @@ class AddEntriesDialogHelper { ); } - static Future showSaveOptionsDialog( + static Future showSaveOptionsDialog( BuildContext context, Map saveData, bool isTemplate, DatabasesEnum dbType, ) async { bool isLoading = false; + bool pop = false; - return showDialog( + await showDialog( context: context, barrierDismissible: false, builder: (BuildContext context) { @@ -136,6 +136,7 @@ class AddEntriesDialogHelper { if (!isLoading) TextButton( onPressed: () async { + pop = true; setState(() => isLoading = true); saveTemplate(saveData, dbType); Navigator.pushNamedAndRemoveUntil( @@ -143,6 +144,13 @@ class AddEntriesDialogHelper { '/home', (route) => false, ); + + if (context.mounted) { + SnackBarHelper.showSnackBarMessage( + context, + AppLocalizations.of(context)!.erfolgreich, + ); + } }, child: Text(AppLocalizations.of(context)!.template), ), @@ -177,6 +185,7 @@ class AddEntriesDialogHelper { sent: true, ); showSuccessDialog(context); + pop = true; } }, child: Text(AppLocalizations.of(context)!.sendtoserver), @@ -187,7 +196,7 @@ class AddEntriesDialogHelper { setState(() => isLoading = true); try { - SaveMainEntryMethod.saveEntry( + int id = await SaveMainEntryMethod.saveEntry( entryData: saveData, isTemplate: isTemplate, dbType: dbType, @@ -196,12 +205,20 @@ class AddEntriesDialogHelper { if (context.mounted) { await SaveFileMethod.saveFile( saveData, + id, dbType == DatabasesEnum.place ? AppLocalizations.of(context)!.justplace : AppLocalizations.of(context)!.excursion, dbType, ); - if (context.mounted) Navigator.of(context).pop(); + if (context.mounted) { + Navigator.of(context).pop(); + SnackBarHelper.showSnackBarMessage( + context, + AppLocalizations.of(context)!.erfolgreich, + ); + } + pop = true; } } catch (_) { // User cancelled the dialog @@ -233,6 +250,13 @@ class AddEntriesDialogHelper { '/home', (route) => false, ); + pop = true; + if (context.mounted) { + SnackBarHelper.showSnackBarMessage( + context, + AppLocalizations.of(context)!.erfolgreich, + ); + } } catch (e) { debugPrint(e.toString()); } @@ -252,6 +276,8 @@ class AddEntriesDialogHelper { ); }, ); + + return pop; } static Future showSuccessDialog(BuildContext context) async { diff --git a/lib/screens/intro_screen.dart b/lib/screens/intro_screen.dart index 5ae8d44..99a1a90 100644 --- a/lib/screens/intro_screen.dart +++ b/lib/screens/intro_screen.dart @@ -12,17 +12,20 @@ class IntroScreen extends StatefulWidget { class _IntroScreenState extends State { TextEditingController addresse1C = TextEditingController(); TextEditingController bLandC = TextEditingController(); - TextEditingController apiAddress = TextEditingController(); + TextEditingController ffApiAddress = TextEditingController(); + TextEditingController exApiAddress = TextEditingController(); - String selectedApiAddress = "Test"; - String? selectedBLand; + String selectedFFApiAddress = "Test"; + String selectedEXApiAddress = "Test"; + String? selectedBLand = "Sachsen"; Future _saveData() async { SharedPreferences prefs = await SharedPreferences.getInstance(); await prefs.setString('addresse1', addresse1C.text); await prefs.setString('bLand', bLandC.text); await prefs.setBool('isFirstLaunch', false); - await prefs.setString('apiAddress', apiAddress.text); + await prefs.setString('fotofallenApiAddress', ffApiAddress.text); + await prefs.setString('exkursionenApiAddress', exApiAddress.text); } @override @@ -35,9 +38,10 @@ class _IntroScreenState extends State { Future.delayed(Duration.zero, () async { SharedPreferences prefs = await SharedPreferences.getInstance(); setState(() { - apiAddress.text = prefs.getString('apiAddress') ?? ""; + ffApiAddress.text = prefs.getString('fotofallenApiAddress') ?? ""; + exApiAddress.text = prefs.getString('exkursionenApiAddress') ?? ""; addresse1C.text = prefs.getString('addresse1') ?? ""; - bLandC.text = prefs.getString('bLand') ?? ""; + bLandC.text = prefs.getString('bLand') ?? "Sachsen"; }); }); } @@ -71,88 +75,89 @@ class _IntroScreenState extends State { Expanded( flex: 4, child: TextField( + readOnly: true, controller: bLandC, ), ), - Expanded( - flex: 1, - child: PopupMenuButton( - icon: const Icon(Icons.arrow_drop_down), - initialValue: selectedBLand, - onSelected: (value) { - setState(() { - selectedBLand = value; - bLandC.text = value; - }); - }, - itemBuilder: (context) => const [ - PopupMenuItem( - value: 'Baden-Württemberg', - child: Text('Baden-Württemberg'), - ), - PopupMenuItem( - value: 'Bayern', - child: Text('Bayern'), - ), - PopupMenuItem( - value: 'Berlin', - child: Text('Berlin'), - ), - PopupMenuItem( - value: 'Brandenburg', - child: Text('Brandenburg'), - ), - PopupMenuItem( - value: 'Bremen', - child: Text('Bremen'), - ), - PopupMenuItem( - value: 'Hamburg', - child: Text('Hamburg'), - ), - PopupMenuItem( - value: 'Hessen', - child: Text('Hessen'), - ), - PopupMenuItem( - value: 'Mecklenburg-Vorpommern', - child: Text('Mecklenburg-Vorpommern'), - ), - PopupMenuItem( - value: 'Niedersachsen', - child: Text('Niedersachsen'), - ), - PopupMenuItem( - value: 'Nordrhein-Westfalen', - child: Text('Nordrhein-Westfalen'), - ), - PopupMenuItem( - value: 'Rheinland-Pfalz', - child: Text('Rheinland-Pfalz'), - ), - PopupMenuItem( - value: 'Saarland', - child: Text('Saarland'), - ), - PopupMenuItem( - value: 'Sachsen', - child: Text('Sachsen'), - ), - PopupMenuItem( - value: 'Sachsen-Anhalt', - child: Text('Sachsen-Anhalt'), - ), - PopupMenuItem( - value: 'Schleswig-Holstein', - child: Text('Schleswig-Holstein'), - ), - PopupMenuItem( - value: 'Thüringen', - child: Text('Thüringen'), - ), - ], - ), - ), + // Expanded( + // flex: 1, + // child: PopupMenuButton( + // icon: const Icon(Icons.arrow_drop_down), + // initialValue: selectedBLand, + // onSelected: (value) { + // setState(() { + // selectedBLand = value; + // bLandC.text = value; + // }); + // }, + // itemBuilder: (context) => const [ + // PopupMenuItem( + // value: 'Baden-Württemberg', + // child: Text('Baden-Württemberg'), + // ), + // PopupMenuItem( + // value: 'Bayern', + // child: Text('Bayern'), + // ), + // PopupMenuItem( + // value: 'Berlin', + // child: Text('Berlin'), + // ), + // PopupMenuItem( + // value: 'Brandenburg', + // child: Text('Brandenburg'), + // ), + // PopupMenuItem( + // value: 'Bremen', + // child: Text('Bremen'), + // ), + // PopupMenuItem( + // value: 'Hamburg', + // child: Text('Hamburg'), + // ), + // PopupMenuItem( + // value: 'Hessen', + // child: Text('Hessen'), + // ), + // PopupMenuItem( + // value: 'Mecklenburg-Vorpommern', + // child: Text('Mecklenburg-Vorpommern'), + // ), + // PopupMenuItem( + // value: 'Niedersachsen', + // child: Text('Niedersachsen'), + // ), + // PopupMenuItem( + // value: 'Nordrhein-Westfalen', + // child: Text('Nordrhein-Westfalen'), + // ), + // PopupMenuItem( + // value: 'Rheinland-Pfalz', + // child: Text('Rheinland-Pfalz'), + // ), + // PopupMenuItem( + // value: 'Saarland', + // child: Text('Saarland'), + // ), + // PopupMenuItem( + // value: 'Sachsen', + // child: Text('Sachsen'), + // ), + // PopupMenuItem( + // value: 'Sachsen-Anhalt', + // child: Text('Sachsen-Anhalt'), + // ), + // PopupMenuItem( + // value: 'Schleswig-Holstein', + // child: Text('Schleswig-Holstein'), + // ), + // PopupMenuItem( + // value: 'Thüringen', + // child: Text('Thüringen'), + // ), + // ], + // ), + // ), ], ), const SizedBox( @@ -165,25 +170,61 @@ class _IntroScreenState extends State { child: TextField( decoration: InputDecoration( hintText: - AppLocalizations.of(context)!.apiaddress), - controller: apiAddress, + AppLocalizations.of(context)!.ffApiAddress), + controller: ffApiAddress, ), ), Expanded( flex: 1, child: PopupMenuButton( icon: const Icon(Icons.arrow_drop_down), - initialValue: selectedApiAddress, + initialValue: selectedFFApiAddress, onSelected: (value) { setState(() { - selectedApiAddress = value; - apiAddress.text = value; + selectedFFApiAddress = value; + ffApiAddress.text = value; }); }, itemBuilder: (context) => [ PopupMenuItem( value: - "http://192.168.1.106/www.dbb-wolf.de/data/app24.php", + "http://192.168.1.106/www.dbb-wolf.de/data/app24.php", + child: + Text(AppLocalizations.of(context)!.test)), + PopupMenuItem( + value: "...", + child: Text( + AppLocalizations.of(context)!.notest)) + ], + )) + ], + ), + Row( + children: [ + Expanded( + flex: 4, + child: TextField( + decoration: InputDecoration( + hintText: + AppLocalizations.of(context)!.exApiAddress), + controller: exApiAddress, + ), + ), + Expanded( + flex: 1, + child: PopupMenuButton( + icon: const Icon(Icons.arrow_drop_down), + initialValue: selectedEXApiAddress, + onSelected: (value) { + setState(() { + selectedEXApiAddress = value; + exApiAddress.text = value; + }); + }, + itemBuilder: (context) => [ + PopupMenuItem( + value: + "http://192.168.1.106/www.dbb-wolf.de/data/app24.php", child: Text(AppLocalizations.of(context)!.test)), PopupMenuItem( diff --git a/lib/screens/sharedMethods/http_request.dart b/lib/screens/sharedMethods/http_request.dart index 0f82503..4ebdbd1 100644 --- a/lib/screens/sharedMethods/http_request.dart +++ b/lib/screens/sharedMethods/http_request.dart @@ -19,8 +19,13 @@ class HttpRequest { Response(requestOptions: RequestOptions(path: ''), statusCode: 400); try { - response = await dio.post(prefs.getString('apiAddress') ?? "", + if (saveDataMap != null && saveDataMap.containsKey("CID") || saveDataString != null && saveDataString.contains("CID")) { + response = await dio.post(prefs.getString('fotofallenApiAddress') ?? "", data: saveDataMap == null ? saveDataString : jsonEncode(saveDataMap)); + } else { + response = await dio.post(prefs.getString('exkursionenApiAddress') ?? "", + data: saveDataMap == null ? saveDataString : jsonEncode(saveDataMap)); + } return response.statusCode!; } on DioException { diff --git a/lib/screens/sharedMethods/save_file.dart b/lib/screens/sharedMethods/save_file.dart index 7cfbbb3..695d312 100644 --- a/lib/screens/sharedMethods/save_file.dart +++ b/lib/screens/sharedMethods/save_file.dart @@ -10,6 +10,7 @@ import 'package:shared_preferences/shared_preferences.dart'; class SaveFileMethod { static Future saveFile( Map place, + int id, String fileNameLocalization, DatabasesEnum dbType, ) async { @@ -26,7 +27,7 @@ class SaveFileMethod { await prefs.setString('saveDir', selectedDirectory); File file = File( - '$selectedDirectory/$fileNameLocalization-${dbType == DatabasesEnum.place ? place["CID"] : place["LogDat"]}.txt', + '$selectedDirectory/$fileNameLocalization-$id-${dbType == DatabasesEnum.place ? place["CID"] : place["Datum"]!.split(" ").first}.txt', ); await file.writeAsString(jsonPlace); diff --git a/lib/screens/sharedMethods/save_main_entry.dart b/lib/screens/sharedMethods/save_main_entry.dart index c239b4e..9b998b1 100644 --- a/lib/screens/sharedMethods/save_main_entry.dart +++ b/lib/screens/sharedMethods/save_main_entry.dart @@ -4,7 +4,7 @@ import 'package:fforte/methods/excursion_db_helper.dart'; import 'package:fforte/methods/place_db_helper.dart'; class SaveMainEntryMethod { - static void saveEntry({ + static Future saveEntry({ required Map entryData, required bool isTemplate, required DatabasesEnum dbType, @@ -34,5 +34,7 @@ class SaveMainEntryMethod { placeDB.updateSent(entryId); // Update 'Sent' using the correct ID } + return entryId; + } } diff --git a/lib/screens/sharedMethods/send_file.dart b/lib/screens/sharedMethods/send_file.dart index 4bec55b..c777ef0 100644 --- a/lib/screens/sharedMethods/send_file.dart +++ b/lib/screens/sharedMethods/send_file.dart @@ -39,8 +39,7 @@ class _SendFileState extends State { ElevatedButton( onPressed: () async { final dio = Dio(); - final SharedPreferences prefs = - await SharedPreferences.getInstance(); + final SharedPreferences prefs = await SharedPreferences.getInstance(); String? fileContent = await pickedFile?.readAsString(); dio.options.responseType = ResponseType.plain; diff --git a/time.txt b/time.txt index f3bca2e..8172b47 100644 --- a/time.txt +++ b/time.txt @@ -91,3 +91,7 @@ 27.mai 1h 30min 27.mai 1h 30min 2.jun 1h +3.jun 5h + +-- Abgerechnet -- + diff --git a/untranslated.txt b/untranslated.txt index 0962be1..9e26dfe 100644 --- a/untranslated.txt +++ b/untranslated.txt @@ -1,5 +1 @@ -{ - "de": [ - "excursion" - ] -} +{} \ No newline at end of file