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 ViewCams extends StatefulWidget { final DatabasesEnum dbType; const ViewCams({super.key, required this.dbType}); @override State createState() => _ViewCamsState(); } class _ViewCamsState extends State { // var declaration late Future>> mainEntries; late Future>> templates; late List markers; IDb? db; // loads the entries @override void initState() { super.initState(); if (widget.dbType == DatabasesEnum.place) { db = PlaceDBHelper(); } else if (widget.dbType == DatabasesEnum.excursion) { db = ExcursionDBHelper(); } reloadAllEntries(); } Future reloadAllEntries() async { mainEntries = db!.getAllMainEntries(); templates = db!.getAllTemplates(); } // 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: [ 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 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), 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) { DeleteMainEntries.deleteSingle( widget.dbType, place['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: ${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, existingData: place, ), ), ); }, ), ); }, ), ), ], ), ); } }, ), ), 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( floatingActionButton: FloatingActionButton( child: const Icon(Icons.delete), onPressed: () { ViewEntriesDialogHelper.deleteAllTemplates( context, widget.dbType, ); }, ), body: Column( children: [ Expanded( child: ListView.builder( itemCount: snapshot.data!.length, itemBuilder: (context, index) { Map templates = snapshot.data![index]; return Slidable( startActionPane: ActionPane( motion: const ScrollMotion(), children: [ SlidableAction( onPressed: (context) { DeleteTemplates.deleteSingle( widget.dbType, templates['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, ), ), ); }, title: Text('Place ${index + 1}'), subtitle: Text( 'ID: ${templates['CID']} DATUM: ${templates['Datum']} RUDEL: ${templates['Rudel']} STATUS: ${templates['Status']}', ), ), ); }, ), ), ], ), ); } }, ), ), 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), ], ); } }, ), ), ], ), ), ); } }