diff --git a/lib/home.dart b/lib/home.dart index def2f1f..0341342 100644 --- a/lib/home.dart +++ b/lib/home.dart @@ -86,13 +86,14 @@ class HomePage extends StatelessWidget { onPressed: () => Navigator.pushNamed(context, '/viewCams'), child: Text(AppLocalizations.of(context)!.viewplaces), ), + const SizedBox(height: 10), ElevatedButton( style: ElevatedButton.styleFrom( minimumSize: const Size(250, 40), ), onPressed: () => Navigator.pushNamed(context, '/viewExcursionen'), - child: Text(AppLocalizations.of(context)!.viewplaces), + child: Text(AppLocalizations.of(context)!.viewExcursionen), ), const SizedBox(height: 10), diff --git a/lib/interfaces/i_db.dart b/lib/interfaces/i_db.dart index 1dff8d1..1639481 100644 --- a/lib/interfaces/i_db.dart +++ b/lib/interfaces/i_db.dart @@ -13,7 +13,7 @@ abstract interface class IDb { Future updateSent(int id); - Future addTemplate(Map templates); + Future addTemplate(Map templates); Future updateTemplate(Map template); diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index 0ea7d58..447ec18 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -90,6 +90,7 @@ "sendfile": "Datei zum Server senden", "pickfile": "Datei auswählen", "placedata": "Standortdaten", + "excursionData": "Exursions daten", "sent": "Gesendet", "fileSaved": "Datei gespeichtert bei: ", "savefilefailed": "Fehler. Bitte nochmal versuchen", diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 30d02d0..2e9343c 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -429,7 +429,12 @@ "description": "Pick file button" }, - "placedata": "Placedata", + "placedata": "Place data", + "@camdata": { + "description": "view data placedata header" + }, + + "excursionData": "Excursion data", "@camdata": { "description": "view data placedata header" }, diff --git a/lib/l10n/app_localizations.dart b/lib/l10n/app_localizations.dart index 1bbfd55..53f94b7 100644 --- a/lib/l10n/app_localizations.dart +++ b/lib/l10n/app_localizations.dart @@ -638,9 +638,15 @@ abstract class AppLocalizations { /// No description provided for @placedata. /// /// In en, this message translates to: - /// **'Placedata'** + /// **'Place data'** String get placedata; + /// No description provided for @excursionData. + /// + /// In en, this message translates to: + /// **'Excursion data'** + String get excursionData; + /// view data sent header /// /// In en, this message translates to: diff --git a/lib/l10n/app_localizations_de.dart b/lib/l10n/app_localizations_de.dart index abfba5a..f87d82b 100644 --- a/lib/l10n/app_localizations_de.dart +++ b/lib/l10n/app_localizations_de.dart @@ -281,6 +281,9 @@ class AppLocalizationsDe extends AppLocalizations { @override String get placedata => 'Standortdaten'; + @override + String get excursionData => 'Exursions daten'; + @override String get sent => 'Gesendet'; diff --git a/lib/l10n/app_localizations_en.dart b/lib/l10n/app_localizations_en.dart index cae4dae..c1166ff 100644 --- a/lib/l10n/app_localizations_en.dart +++ b/lib/l10n/app_localizations_en.dart @@ -279,7 +279,10 @@ class AppLocalizationsEn extends AppLocalizations { String get pickfile => 'Pick file'; @override - String get placedata => 'Placedata'; + String get placedata => 'Place data'; + + @override + String get excursionData => 'Excursion data'; @override String get sent => 'Sent'; diff --git a/lib/main.dart b/lib/main.dart index 859a60a..f84ca3d 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -3,7 +3,7 @@ import 'package:fforte/screens/excursion/excursion_main.dart'; import 'package:fforte/screens/addCam/add_cam_main.dart'; import 'package:fforte/screens/intro_screen.dart'; import 'package:fforte/screens/settings.dart'; -import 'package:fforte/screens/viewCam/view_cams.dart'; +import 'package:fforte/screens/viewEntries/view_cams.dart'; import 'package:flutter/material.dart'; import 'package:flex_color_scheme/flex_color_scheme.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; diff --git a/lib/methods/excursion_db_helper.dart b/lib/methods/excursion_db_helper.dart index c2b997f..08ca10a 100644 --- a/lib/methods/excursion_db_helper.dart +++ b/lib/methods/excursion_db_helper.dart @@ -37,10 +37,10 @@ class ExcursionDBHelper implements IDb { @override onCreateDatabases(Database excursionDB, int version) async { await excursionDB.execute( - 'CREATE TABLE excursion (ID INTEGER PRIMARY KEY AUTOINCREMENT, LogDat TEXT, Rudel TEXT, Teilnehmer TEXT, Jahr TEXT, Dauer TEXT, MHund INTEGER, MLeine TEXT, BLand TEXT, Lkr TEXT, BeiOrt, TEXT, BimaName TEXT, Wetter TEXT, Temperat TEXT, RegenVor TEXT, KmRad TEXT, KmAuto TEXT, KmFuss TEXT, KmTotal TEXT, KmAuProz TEXT, KmFuProz TEXT, KmRaProz TEXT, SpGut TEXT, SpMittel, SpSchlecht TEXT, SpurFund TEXT, SpurLang TEXT, SpurTiere Text, SpSicher TEXT, WelpenSp TEXT, WelpenAnz TEXT, WpSicher TEXT, LosungGes TEXT, LosungAnz TEXT, LosungGen TEXT, UrinAnz TEXT, UrinGen TEXT, OestrAnz TEXT, OestrGen TEXT, HaarAnz TEXT, HaarGen TEXT, LosungKm TEXT, GenetiKm TEXT, Hinweise TEXT, Bemerk TEXT, IntKomm TEXT, BimaNr TEXT, BimaNutzer TEXT, BimaAGV TEXT, FallNum INTEGER, HinweiseSonstiges TEXT, Sent INTEGER DEFAULT 0)', + 'CREATE TABLE excursion (ID INTEGER PRIMARY KEY AUTOINCREMENT, LogDat TEXT, Rudel TEXT, Teilnehmer TEXT, Jahr TEXT, Dauer TEXT, MHund INTEGER, MLeine TEXT, BLand TEXT, Lkr TEXT, BeiOrt TEXT, BimaName TEXT, Wetter TEXT, Temperat TEXT, RegenVor TEXT, KmRad TEXT, KmAuto TEXT, KmFuss TEXT, KmTotal TEXT, KmAuProz TEXT, KmFuProz TEXT, KmRaProz TEXT, SpGut TEXT, SpMittel, SpSchlecht TEXT, SpurFund TEXT, SpurLang TEXT, SpurTiere Text, SpSicher TEXT, WelpenSp TEXT, WelpenAnz TEXT, WpSicher TEXT, LosungGes TEXT, LosungAnz TEXT, LosungGen TEXT, UrinAnz TEXT, UrinGen TEXT, OestrAnz TEXT, OestrGen TEXT, HaarAnz TEXT, HaarGen TEXT, LosungKm TEXT, GenetiKm TEXT, Hinweise TEXT, Bemerk TEXT, IntKomm TEXT, BimaNr TEXT, BimaNutzer TEXT, BimaAGV TEXT, FallNum INTEGER, Sent INTEGER DEFAULT 0)', ); await excursionDB.execute( - 'CREATE TABLE excursionTemplates (ID INTEGER PRIMARY KEY AUTOINCREMENT, LogDat TEXT, Rudel TEXT, Teilnehmer TEXT, Jahr TEXT, Dauer TEXT, MHund INTEGER, MLeine TEXT, BLand TEXT, Lkr TEXT, BeiOrt, TEXT, BimaName TEXT, Wetter TEXT, Temperat TEXT, RegenVor TEXT, KmRad TEXT, KmAuto TEXT, KmFuss TEXT, KmTotal TEXT, KmAuProz TEXT, KmFuProz TEXT, KmRaProz TEXT, SpGut TEXT, SpMittel, SpSchlecht TEXT, SpurFund TEXT, SpurLang TEXT, SpurTiere Text, SpSicher TEXT, WelpenSp TEXT, WelpenAnz TEXT, WpSicher TEXT, LosungGes TEXT, LosungAnz TEXT, LosungGen TEXT, UrinAnz TEXT, UrinGen TEXT, OestrAnz TEXT, OestrGen TEXT, HaarAnz TEXT, HaarGen TEXT, LosungKm TEXT, GenetiKm TEXT, Hinweise TEXT, Bemerk TEXT, IntKomm TEXT, BimaNr TEXT, BimaNutzer TEXT, BimaAGV TEXT, FallNum INTEGER, HinweiseSonstiges TEXT)', + 'CREATE TABLE excursionTemplates (ID INTEGER PRIMARY KEY AUTOINCREMENT, LogDat TEXT, Rudel TEXT, Teilnehmer TEXT, Jahr TEXT, Dauer TEXT, MHund INTEGER, MLeine TEXT, BLand TEXT, Lkr TEXT, BeiOrt TEXT, BimaName TEXT, Wetter TEXT, Temperat TEXT, RegenVor TEXT, KmRad TEXT, KmAuto TEXT, KmFuss TEXT, KmTotal TEXT, KmAuProz TEXT, KmFuProz TEXT, KmRaProz TEXT, SpGut TEXT, SpMittel, SpSchlecht TEXT, SpurFund TEXT, SpurLang TEXT, SpurTiere Text, SpSicher TEXT, WelpenSp TEXT, WelpenAnz TEXT, WpSicher TEXT, LosungGes TEXT, LosungAnz TEXT, LosungGen TEXT, UrinAnz TEXT, UrinGen TEXT, OestrAnz TEXT, OestrGen TEXT, HaarAnz TEXT, HaarGen TEXT, LosungKm TEXT, GenetiKm TEXT, Hinweise TEXT, Bemerk TEXT, IntKomm TEXT, BimaNr TEXT, BimaNutzer TEXT, BimaAGV TEXT, FallNum INTEGER)', ); } @@ -95,7 +95,7 @@ class ExcursionDBHelper implements IDb { // same thing as before but with templatews @override - Future addTemplate(Map templates) async { + Future addTemplate(Map templates) async { var excursionDBClient = await dB; // final existingCID = await excursionDBClient.query( @@ -107,11 +107,12 @@ class ExcursionDBHelper implements IDb { // return; // } - await excursionDBClient.insert( + int id = await excursionDBClient.insert( 'excursionTemplates', templates, // conflictAlgorithm: ConflictAlgorithm.replace, ); + return id; } // Updates a existing template diff --git a/lib/methods/place_db_helper.dart b/lib/methods/place_db_helper.dart index b3c98f3..08fb8f2 100644 --- a/lib/methods/place_db_helper.dart +++ b/lib/methods/place_db_helper.dart @@ -82,7 +82,7 @@ class PlaceDBHelper implements IDb{ // same thing as before but with templatews @override - Future addTemplate(Map templates) async { + Future addTemplate(Map templates) async { var placeDBClient = await dB; // final existingCID = await placeDBClient.query( @@ -94,11 +94,12 @@ class PlaceDBHelper implements IDb{ // return; // } - await placeDBClient.insert( + int id = await placeDBClient.insert( 'placeTemplates', templates, // conflictAlgorithm: ConflictAlgorithm.replace, ); + return id; } // Updates a existing template diff --git a/lib/screens/addCam/add_cam_main.dart b/lib/screens/addCam/add_cam_main.dart index 999d466..ae50733 100644 --- a/lib/screens/addCam/add_cam_main.dart +++ b/lib/screens/addCam/add_cam_main.dart @@ -40,6 +40,7 @@ class AddCamMain extends StatefulWidget { class _AddCamMainState extends State { // var declaration int currentStep = 0; + late bool isTemplate; String selectedStatus = 'aktiv'; String selectedFotoFilm = 'Foto'; @@ -149,6 +150,8 @@ class _AddCamMainState extends State { rmap["DECLAT"]!["controller"]!.text = currentPosition.latitude.toString(); rmap["DECLNG"]!["controller"]!.text = currentPosition.longitude.toString(); + isTemplate = widget.isTemplate; + // If a template is edited this fills in the existing values if (widget.existingData?.isNotEmpty ?? false) { for (var key in widget.existingData!.keys) { @@ -595,11 +598,14 @@ class _AddCamMainState extends State { final isLastStep = currentStep == getSteps().length - 1; if (!isLastStep) { - saveTemplate( + var res = await saveTemplate( getFieldsText(), DatabasesEnum.place, ); + + isTemplate = true; setState(() { + rmap["ID"]!["controller"]!.text = res.toString(); currentStep += 1; }); } else { @@ -614,7 +620,7 @@ class _AddCamMainState extends State { } bool empty = CheckRequired.checkRequired(rmap); - // TODO for debugging always true + // TODO for debugging always false empty = false; if (empty == true) { @@ -627,7 +633,7 @@ class _AddCamMainState extends State { await AddEntriesDialogHelper.showSaveOptionsDialog( context, getFieldsText(), - widget.isTemplate, + isTemplate, DatabasesEnum.place, ); } diff --git a/lib/screens/excursion/excursion_main.dart b/lib/screens/excursion/excursion_main.dart index 223c1b4..5443618 100644 --- a/lib/screens/excursion/excursion_main.dart +++ b/lib/screens/excursion/excursion_main.dart @@ -33,9 +33,11 @@ class ExcursionMain extends StatefulWidget { class _ExcursionMainState extends State { int currentStep = 0; + late bool isTemplate; // all TextEditingController because its easier Map> rmap = { + "ID": {"controller": TextEditingController(), "required": false}, // Step 1 "LogDat": {"controller": TextEditingController(), "required": false}, "Rudel": {"controller": TextEditingController(), "required": false}, @@ -93,6 +95,7 @@ class _ExcursionMainState extends State { "Bemerk": {"controller": TextEditingController(), "required": false}, "IntKomm": {"controller": TextEditingController(), "required": false}, "FallNum": {"controller": TextEditingController(), "required": false}, + "Sent": {"controller": TextEditingController(), "required": false}, }; @override @@ -103,6 +106,9 @@ class _ExcursionMainState extends State { widget.existingData?[key].toString() ?? ""; } } + + isTemplate = widget.isTemplate; + super.initState(); } @@ -373,11 +379,14 @@ class _ExcursionMainState extends State { final isLastStep = currentStep == getSteps().length - 1; if (!isLastStep) { - saveTemplate( + var res = await saveTemplate( getFieldsText(), DatabasesEnum.excursion, ); + + isTemplate = true; setState(() { + rmap["ID"]!["controller"]!.text = res.toString(); currentStep += 1; }); } else { @@ -392,7 +401,7 @@ class _ExcursionMainState extends State { } bool empty = CheckRequired.checkRequired(rmap); - // TODO for debugging always true + // TODO for debugging always false empty = false; if (empty == true) { diff --git a/lib/screens/sharedMethods/save_main_entry.dart b/lib/screens/sharedMethods/save_main_entry.dart index 2cc014b..c239b4e 100644 --- a/lib/screens/sharedMethods/save_main_entry.dart +++ b/lib/screens/sharedMethods/save_main_entry.dart @@ -22,7 +22,7 @@ class SaveMainEntryMethod { if (isTemplate) await placeDB!.deleteTemplateById(entryData["ID"]!); int entryId; - if (entryData["ID"] == "") { + if (entryData["ID"] == "" || isTemplate) { entryData.remove("ID"); entryId = await placeDB!.addMainEntry(entryData); // await placeDB.deleteTemplateById(entryData["CID"]!); diff --git a/lib/screens/sharedMethods/save_template.dart b/lib/screens/sharedMethods/save_template.dart index b6e0789..bd1c6ec 100644 --- a/lib/screens/sharedMethods/save_template.dart +++ b/lib/screens/sharedMethods/save_template.dart @@ -3,22 +3,25 @@ import 'package:fforte/interfaces/i_db.dart'; import 'package:fforte/methods/excursion_db_helper.dart'; import 'package:fforte/methods/place_db_helper.dart'; -void saveTemplate(Map templateData, DatabasesEnum dbType,) async { +Future saveTemplate(Map templateData, DatabasesEnum dbType,) async { IDb dbHelper; + int id =templateData["ID"]! != "" ? int.parse(templateData["ID"]!) : -1; if (dbType == DatabasesEnum.place) { dbHelper = PlaceDBHelper(); } else if (dbType == DatabasesEnum.excursion) { dbHelper = ExcursionDBHelper(); } else { - return; + return -1; } templateData.remove("Sent"); - if (templateData["ID"]! == "") { + if (templateData["ID"]! == "" || templateData["ID"]! == "-1") { templateData.remove("ID"); - await dbHelper.addTemplate(templateData); + id = await dbHelper.addTemplate(templateData); } else { await dbHelper.updateTemplate(templateData); } + + return id; } diff --git a/lib/screens/viewCam/view_cams.dart b/lib/screens/viewCam/view_cams.dart deleted file mode 100644 index f3a3582..0000000 --- a/lib/screens/viewCam/view_cams.dart +++ /dev/null @@ -1,338 +0,0 @@ -import 'package:fforte/enums/databases.dart'; -import 'package:fforte/interfaces/i_db.dart'; -import 'package:fforte/methods/excursion_db_helper.dart'; -import 'package:fforte/screens/addCam/add_cam_main.dart'; -import 'package:fforte/methods/place_db_helper.dart'; -import 'package:fforte/screens/helper/view_entries_dialog_helper.dart'; -import 'package:fforte/screens/sharedMethods/delete_main_entries.dart'; -import 'package:fforte/screens/sharedMethods/delete_templates.dart'; -import 'package:flutter/material.dart'; -import 'package:fforte/l10n/app_localizations.dart'; -import 'package:flutter_map/flutter_map.dart'; -import 'package:flutter_slidable/flutter_slidable.dart'; -import 'package:latlong2/latlong.dart'; -// * Site that shows all entries in the databases - -class ViewEntries extends StatefulWidget { - final DatabasesEnum dbType; - const ViewEntries({super.key, required this.dbType}); - - @override - State createState() => _ViewEntriesState(); -} - -class _ViewEntriesState extends State { - // var declaration - List> mainEntries = []; - List> templates = []; - late List markers; - - // loads the entries - @override - void initState() { - super.initState(); - reloadAllEntries(); - } - - Future reloadAllEntries() async { - IDb? db; - - if (widget.dbType == DatabasesEnum.place) { - db = PlaceDBHelper(); - } else if (widget.dbType == DatabasesEnum.excursion) { - db = ExcursionDBHelper(); - } - - mainEntries = await db!.getAllMainEntries(); - templates = await db.getAllTemplates(); - - - setState(() {}); - } - - // The widet tree with taps to differentiate between templates and finished entries - @override - Widget build(BuildContext context) { - return DefaultTabController( - length: 2, - child: Scaffold( - appBar: AppBar( - bottom: TabBar( - tabs: [ - Tab(text: AppLocalizations.of(context)!.completed), - Tab(text: AppLocalizations.of(context)!.uncompleted), - // Tab(text: AppLocalizations.of(context)!.map), - ], - ), - title: Text(AppLocalizations.of(context)!.viewplacesappbar), - ), - body: TabBarView( - children: [ - Tab( - // child: FutureBuilder>>( - // future: mainEntries, - // builder: (context, snapshot) { - // if (snapshot.connectionState == ConnectionState.waiting) { - // return const CircularProgressIndicator(); - // } else if (snapshot.hasError) { - // return Text('Error: ${snapshot.error}'); - // } else { - // List> placeList = List.of( - // snapshot.data!, - // ); - // return - child: Scaffold( - floatingActionButton: FloatingActionButton( - child: const Icon(Icons.delete), - onPressed: () { - ViewEntriesDialogHelper.deleteAllMainEntries( - context, - widget.dbType, - ); - }, - ), - body: Column( - children: [ - const SizedBox(height: 10), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Row( - children: [ - const SizedBox(width: 10), - if (widget.dbType == DatabasesEnum.place) - Text( - style: const TextStyle( - decoration: TextDecoration.underline, - ), - AppLocalizations.of(context)!.placedata, - ), - if (widget.dbType == DatabasesEnum.excursion) - Text( - style: const TextStyle( - decoration: TextDecoration.underline, - ), - // TODO localization - AppLocalizations.of(context)!.homePageTitle, - ), - ], - ), - Row( - children: [ - Text( - style: const TextStyle( - decoration: TextDecoration.underline, - ), - AppLocalizations.of(context)!.sent, - ), - const SizedBox(width: 10), - ], - ), - ], - ), - const SizedBox(height: 15), - Expanded( - child: ListView.builder( - itemCount: mainEntries.length, - itemBuilder: (context, index) { - return Slidable( - startActionPane: ActionPane( - motion: const ScrollMotion(), - children: [ - SlidableAction( - onPressed: (context) { - DeleteMainEntries.deleteSingle( - widget.dbType, - mainEntries[index]['ID'.toString()], - ); - setState(() { - reloadAllEntries(); - }); - }, - backgroundColor: Colors.red, - foregroundColor: Colors.white, - icon: Icons.delete, - label: - AppLocalizations.of(context)!.justdelete, - ), - ], - ), - child: ListTile( - title: Text('Standort ${index + 1}'), - subtitle: Text( - 'ID: ${mainEntries[index]['ID']} DATUM: ${mainEntries[index]['Datum']}', - ), - trailing: Checkbox( - value: mainEntries[index]['Sent'] == 0 ? false : true, - onChanged: null, - ), - onTap: () async { - Navigator.push( - context, - MaterialPageRoute( - builder: - (context) => AddCamMain( - isSent: - mainEntries[index]['Sent'] == 1 - ? true - : false, - existingData: mainEntries[index], - ), - ), - ); - }, - ), - ); - }, - ), - ), - ], - ), - ), - // } // REMOVE - // }, // REMOVE - // ), // REMOVE - ), - Tab( - // child: FutureBuilder>>( - // future: templates, - // builder: (context, snapshot) { - // if (snapshot.connectionState == ConnectionState.waiting) { - // return const CircularProgressIndicator(); - // } else if (snapshot.hasError) { - // return Text('Error: ${snapshot.error}'); - // } else { - // return Scaffold( - child: Scaffold( - floatingActionButton: FloatingActionButton( - child: const Icon(Icons.delete), - onPressed: () { - ViewEntriesDialogHelper.deleteAllTemplates( - context, - widget.dbType, - ); - }, - ), - body: Column( - children: [ - Expanded( - child: ListView.builder( - itemCount: templates.length, - itemBuilder: (context, index) { - return Slidable( - startActionPane: ActionPane( - motion: const ScrollMotion(), - children: [ - SlidableAction( - onPressed: (context) { - DeleteTemplates.deleteSingle( - widget.dbType, - templates[index]['ID'].toString(), - ); - setState(() { - reloadAllEntries(); - }); - }, - backgroundColor: Colors.red, - foregroundColor: Colors.white, - icon: Icons.delete, - label: - AppLocalizations.of(context)!.justdelete, - ), - ], - ), - child: ListTile( - onTap: () { - Navigator.push( - context, - MaterialPageRoute( - builder: - (context) => AddCamMain( - isTemplate: true, - existingData: templates[index], - ), - ), - ); - }, - title: Text('Place ${index + 1}'), - subtitle: Text( - 'ID: ${templates[index]['CID']} DATUM: ${templates[index]['Datum']} RUDEL: ${templates[index]['Rudel']} STATUS: ${templates[index]['Status']}', - ), - ), - ); - }, - ), - ), - ], - ), - ), - // } // REMOVE - // }, // REMOVE - // ), // REMOVE - ), - // Tab( - // child: FutureBuilder( - // future: mainEntries, - // builder: (context, snapshot) { - // if (snapshot.connectionState == ConnectionState.waiting) { - // return const CircularProgressIndicator(); - // } else if (snapshot.hasError) { - // return Text("Error ${snapshot.error}"); - // } else { - // if (snapshot.data != null) { - // markers = - // snapshot.data!.map((e) { - // return Marker( - // width: 80.0, - // height: 80.0, - // point: LatLng( - // double.parse(e['DECLAT'].toString()), - // double.parse(e['DECLNG'].toString()), - // ), - // child: Column( - // children: [ - // const Icon( - // Icons.location_on, - // color: Colors.red, - // ), - // Text( - // "ID: ${e['ID'].toString()}", - // style: const TextStyle(color: Colors.black), - // ), - // ], - // ), - // ); - // }).toList(); - // } - // return FlutterMap( - // options: MapOptions( - // initialCenter: - // markers.isEmpty - // ? const LatLng(50, 10) - // : markers.first.point, - // interactionOptions: const InteractionOptions( - // flags: - // InteractiveFlag.pinchZoom | - // InteractiveFlag.drag | - // InteractiveFlag.pinchMove, - // ), - // ), - // children: [ - // TileLayer( - // urlTemplate: - // 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', - // userAgentPackageName: 'com.example.app', - // ), - // MarkerLayer(markers: markers), - // ], - // ); - // } // REMOVE - // }, // REMOVE - // ), // REMOVE - // ), - ], - ), - ), - ); - } -} diff --git a/lib/screens/viewEntries/view_cams.dart b/lib/screens/viewEntries/view_cams.dart new file mode 100644 index 0000000..8021c09 --- /dev/null +++ b/lib/screens/viewEntries/view_cams.dart @@ -0,0 +1,410 @@ +import 'package:fforte/enums/databases.dart'; +import 'package:fforte/interfaces/i_db.dart'; +import 'package:fforte/methods/excursion_db_helper.dart'; +import 'package:fforte/screens/addCam/add_cam_main.dart'; +import 'package:fforte/methods/place_db_helper.dart'; +import 'package:fforte/screens/excursion/excursion_main.dart'; +import 'package:fforte/screens/helper/view_entries_dialog_helper.dart'; +import 'package:fforte/screens/sharedMethods/delete_main_entries.dart'; +import 'package:fforte/screens/sharedMethods/delete_templates.dart'; +import 'package:flutter/material.dart'; +import 'package:fforte/l10n/app_localizations.dart'; +import 'package:flutter_map/flutter_map.dart'; +import 'package:flutter_slidable/flutter_slidable.dart'; +import 'package:latlong2/latlong.dart'; +// * Site that shows all entries in the databases + +class ViewEntries extends StatefulWidget { + final DatabasesEnum dbType; + const ViewEntries({super.key, required this.dbType}); + + @override + State createState() => _ViewEntriesState(); +} + +class _ViewEntriesState extends State { + // var declaration + List> mainEntries = []; + List> templates = []; + List marker = []; + + // loads the entries + @override + void initState() { + super.initState(); + reloadAllEntries(); + } + + Future reloadAllEntries() async { + IDb? db; + + if (widget.dbType == DatabasesEnum.place) { + db = PlaceDBHelper(); + } else if (widget.dbType == DatabasesEnum.excursion) { + db = ExcursionDBHelper(); + } + + mainEntries = await db!.getAllMainEntries(); + templates = await db.getAllTemplates(); + + if (widget.dbType == DatabasesEnum.place) { + for (var element in mainEntries) { + marker.add( + Marker( + width: 80.0, + height: 80.0, + point: LatLng( + double.parse(element['DECLAT'].toString()), + double.parse(element['DECLNG'].toString()), + ), + child: Column( + children: [ + const Icon(Icons.location_on, color: Colors.red), + Text( + "ID: ${element['ID'].toString()}", + style: const TextStyle(color: Colors.black), + ), + ], + ), + ), + ); + } + } + + setState(() {}); + } + + // The widet tree with taps to differentiate between templates and finished entries + @override + Widget build(BuildContext context) { + return DefaultTabController( + length: widget.dbType == DatabasesEnum.place ? 3 : 2, + child: Scaffold( + appBar: AppBar( + bottom: TabBar( + tabs: [ + Tab(text: AppLocalizations.of(context)!.completed), + Tab(text: AppLocalizations.of(context)!.uncompleted), + if (widget.dbType == DatabasesEnum.place) + Tab(text: AppLocalizations.of(context)!.map), + ], + ), + title: Text(AppLocalizations.of(context)!.viewplacesappbar), + ), + body: TabBarView( + children: [ + Tab( + child: Scaffold( + floatingActionButton: FloatingActionButton( + child: const Icon(Icons.delete), + onPressed: () { + ViewEntriesDialogHelper.deleteAllMainEntries( + context, + widget.dbType, + ); + }, + ), + body: Column( + children: [ + const SizedBox(height: 10), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + children: [ + const SizedBox(width: 10), + if (widget.dbType == DatabasesEnum.place) + Text( + style: const TextStyle( + decoration: TextDecoration.underline, + ), + AppLocalizations.of(context)!.placedata, + ), + if (widget.dbType == DatabasesEnum.excursion) + Text( + style: const TextStyle( + decoration: TextDecoration.underline, + ), + AppLocalizations.of(context)!.excursionData, + ), + ], + ), + Row( + children: [ + Text( + style: const TextStyle( + decoration: TextDecoration.underline, + ), + AppLocalizations.of(context)!.sent, + ), + const SizedBox(width: 10), + ], + ), + ], + ), + const SizedBox(height: 15), + Expanded( + child: ListView.builder( + itemCount: mainEntries.length, + itemBuilder: (context, index) { + return Slidable( + startActionPane: ActionPane( + motion: const ScrollMotion(), + children: [ + SlidableAction( + onPressed: (context) { + DeleteMainEntries.deleteSingle( + widget.dbType, + mainEntries[index]['ID'.toString()], + ); + setState(() { + reloadAllEntries(); + }); + }, + backgroundColor: Colors.red, + foregroundColor: Colors.white, + icon: Icons.delete, + label: + AppLocalizations.of(context)!.justdelete, + ), + ], + ), + child: ListTile( + title: Text('Standort ${index + 1}'), + subtitle: Text( + 'ID: ${mainEntries[index]['ID']} DATUM: ${widget.dbType == DatabasesEnum.place ? mainEntries[index]['Datum'] : mainEntries[index]["LogDat"]}', + ), + trailing: Checkbox( + value: + mainEntries[index]['Sent'] == 0 + ? false + : true, + onChanged: null, + ), + onTap: () async { + if (widget.dbType == DatabasesEnum.place) { + Navigator.push( + context, + MaterialPageRoute( + builder: + (context) => AddCamMain( + isSent: + mainEntries[index]['Sent'] == 1 + ? true + : false, + existingData: mainEntries[index], + ), + ), + ); + } else if (widget.dbType == + DatabasesEnum.excursion) { + Navigator.push( + context, + MaterialPageRoute( + builder: + (context) => ExcursionMain( + isSent: + mainEntries[index]['Sent'] == 1 + ? true + : false, + existingData: mainEntries[index], + ), + ), + ); + } + }, + ), + ); + }, + ), + ), + ], + ), + ), + ), + Tab( + child: Scaffold( + floatingActionButton: FloatingActionButton( + child: const Icon(Icons.delete), + onPressed: () { + ViewEntriesDialogHelper.deleteAllTemplates( + context, + widget.dbType, + ); + }, + ), + body: Column( + children: [ + Expanded( + child: ListView.builder( + itemCount: templates.length, + itemBuilder: (context, index) { + return Slidable( + startActionPane: ActionPane( + motion: const ScrollMotion(), + children: [ + SlidableAction( + onPressed: (context) { + DeleteTemplates.deleteSingle( + widget.dbType, + templates[index]['ID'].toString(), + ); + setState(() { + reloadAllEntries(); + }); + }, + backgroundColor: Colors.red, + foregroundColor: Colors.white, + icon: Icons.delete, + label: + AppLocalizations.of(context)!.justdelete, + ), + ], + ), + child: ListTile( + onTap: () { + + if (widget.dbType == DatabasesEnum.place) { + Navigator.push( + context, + MaterialPageRoute( + builder: + (context) => AddCamMain( + isTemplate: true, + existingData: templates[index], + ), + ), + ); + } else if (widget.dbType == + DatabasesEnum.excursion) { + Navigator.push( + context, + MaterialPageRoute( + builder: + (context) => ExcursionMain( + isTemplate: true, + existingData: templates[index], + ), + ), + ); + } + + + + // Navigator.push( + // context, + // MaterialPageRoute( + // builder: + // (context) => AddCamMain( + // isTemplate: true, + // existingData: templates[index], + // ), + // ), + // ); + }, + + + + title: Text('Place ${index + 1}'), + subtitle: Text( + 'ID: ${templates[index]['CID']} DATUM: ${templates[index]['Datum']} RUDEL: ${templates[index]['Rudel']} STATUS: ${templates[index]['Status']}', + ), + ), + ); + }, + ), + ), + ], + ), + ), + ), + if (widget.dbType == DatabasesEnum.place) + Tab( + child: FlutterMap( + options: MapOptions( + initialCenter: + marker.isEmpty + ? const LatLng(50, 10) + : marker.first.point, + interactionOptions: const InteractionOptions( + flags: + InteractiveFlag.pinchZoom | + InteractiveFlag.drag | + InteractiveFlag.pinchMove, + ), + ), + children: [ + TileLayer( + urlTemplate: + 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', + userAgentPackageName: 'com.example.app', + ), + MarkerLayer(markers: marker), + ], + ), + // ), + // child: FutureBuilder( + // future: mainEntries, + // builder: (context, snapshot) { + // if (snapshot.connectionState == ConnectionState.waiting) { + // return const CircularProgressIndicator(); + // } else if (snapshot.hasError) { + // return Text("Error ${snapshot.error}"); + // } else { + // if (snapshot.data != null) { + // markers = + // snapshot.data!.map((e) { + // return Marker( + // width: 80.0, + // height: 80.0, + // point: LatLng( + // double.parse(e['DECLAT'].toString()), + // double.parse(e['DECLNG'].toString()), + // ), + // child: Column( + // children: [ + // const Icon( + // Icons.location_on, + // color: Colors.red, + // ), + // Text( + // "ID: ${e['ID'].toString()}", + // style: const TextStyle(color: Colors.black), + // ), + // ], + // ), + // ); + // }).toList(); + // } + // return FlutterMap( + // options: MapOptions( + // initialCenter: + // markers.isEmpty + // ? const LatLng(50, 10) + // : markers.first.point, + // interactionOptions: const InteractionOptions( + // flags: + // InteractiveFlag.pinchZoom | + // InteractiveFlag.drag | + // InteractiveFlag.pinchMove, + // ), + // ), + // children: [ + // TileLayer( + // urlTemplate: + // 'https://tile.openstreetmap.org/{z}/{x}/{y}.png', + // userAgentPackageName: 'com.example.app', + // ), + // MarkerLayer(markers: markers), + // ], + // ); + // } // REMOVE + // }, // REMOVE + // ), // REMOVE + ), + ], + ), + ), + ); + } +} diff --git a/time.txt b/time.txt index ead6324..a21e47a 100644 --- a/time.txt +++ b/time.txt @@ -81,3 +81,4 @@ 10.mai 4h 15min 11.mai 1h 15min 12.mai 5h 30min +13.mai 1h 50min