import 'package:fforte/addCam/add_cam_main.dart'; import 'package:fforte/other/db_helper.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_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 ViewCams extends StatefulWidget { const ViewCams({super.key}); @override State createState() => _ViewCamsState(); } class _ViewCamsState extends State { // var declaration late Future>> place; late Future>> templates; late List markers; // loads the entries @override void initState() { super.initState(); place = DBHelper().getPlace(); templates = DBHelper().getTemplates(); } // functions to delete all entries LOCALLY void delAllPlaces() async { return showDialog( context: context, barrierDismissible: false, builder: (BuildContext context) { return AlertDialog( title: Text(AppLocalizations.of(context)!.deleteEverything), content: SingleChildScrollView( child: ListBody(children: [ Text(AppLocalizations.of(context)!.deleteEverythingContent) ]), ), actions: [ TextButton( onPressed: () { var placeDB = DBHelper(); placeDB.deleteAllPlaces(); setState(() { place = DBHelper().getPlace(); }); Navigator.of(context).pop(); }, child: Text(AppLocalizations.of(context)!.deleteEverything)), TextButton( onPressed: () { Navigator.of(context).pop(); }, child: Text(AppLocalizations.of(context)!.cancel)) ], ); }); } void delSinglePlace(int id) async { DBHelper().deletePlace(id.toString()); setState(() { place = DBHelper().getPlace(); }); } void delAllTemplates() async { return showDialog( context: context, barrierDismissible: false, builder: (BuildContext context) { return AlertDialog( title: Text(AppLocalizations.of(context)!.deleteEverything), content: SingleChildScrollView( child: ListBody(children: [ Text(AppLocalizations.of(context)!.deleteEverythingContent) ]), ), actions: [ TextButton( onPressed: () { var placeDB = DBHelper(); placeDB.deleteAllTemplates(); setState(() { templates = DBHelper().getTemplates(); }); Navigator.of(context).pop(); }, child: Text(AppLocalizations.of(context)!.deleteEverything)), TextButton( onPressed: () { Navigator.of(context).pop(); }, child: Text(AppLocalizations.of(context)!.cancel)) ], ); }); } // The widet tree with taps to differentiate between templates and finished entries @override Widget build(BuildContext context) { return DefaultTabController( length: 3, 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: [ FutureBuilder>>( future: place, 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 Scaffold( floatingActionButton: FloatingActionButton( child: const Icon(Icons.delete), onPressed: () { delAllPlaces(); }, ), body: Column( children: [ const SizedBox( height: 10, ), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Row( children: [ const SizedBox( width: 10, ), Text( style: const TextStyle( decoration: TextDecoration.underline), AppLocalizations.of(context)!.placedata), ], ), 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: placeList.length, itemBuilder: (context, index) { Map place = snapshot.data![index]; return Slidable( startActionPane: ActionPane( motion: const ScrollMotion(), children: [ SlidableAction( onPressed: (context) { delSinglePlace( place['ID'.toString()]); }, backgroundColor: Colors.red, foregroundColor: Colors.white, icon: Icons.delete, label: AppLocalizations.of(context)! .justdelete, ) ]), child: ListTile( title: Text('Standort ${index + 1}'), subtitle: Text( 'ID: ${place['ID']} DATUM: ${place['Datum']}'), trailing: Checkbox( value: place['Sent'] == 0 ? false : true, onChanged: null, ), onTap: () async { Navigator.push( context, MaterialPageRoute( builder: (context) => AddCamMain( isSent: place['Sent'] == 1 ? true : false, isFinished: true, existingData: place, ))); }, ), ); }, )) ], ), ); } }, ), 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( floatingActionButton: FloatingActionButton( child: const Icon(Icons.delete), onPressed: () { delAllTemplates(); }, ), body: Column( children: [ Expanded( child: ListView.builder( itemCount: snapshot.data!.length, itemBuilder: (context, index) { Map templates = snapshot.data![index]; return ListTile( onTap: () { Navigator.push( context, MaterialPageRoute( builder: (context) => AddCamMain( isTemplate: true, isFinished: false, existingData: templates, ))); }, title: Text('Place ${index + 1}'), subtitle: Text( 'ID: ${templates['CID']} DATUM: ${templates['Datum']} RUDEL: ${templates['Rudel']} STATUS: ${templates['Status']}'), ); }), ) ], ), ); } }), FutureBuilder( future: place, builder: (context, snapshot) { if (snapshot.connectionState == ConnectionState.waiting) { return const CircularProgressIndicator(); } else if (snapshot.hasError) { return Text("Error ${snapshot.error}"); } else { 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) ]); } }) ], )), ); } }