import 'dart:convert'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:hexcolor/hexcolor.dart'; import 'package:http/http.dart' as http; import 'package:idrocap/api/api_service.dart'; import 'package:idrocap/private/dettaglio_pratica.dart'; import 'package:idrocap/private/model/pratiche_model.dart'; import 'package:idrocap/private/notifiche.dart'; import 'package:idrocap/utility/utility.dart'; import 'constant/globals.dart' as globals; import 'widget/menu.dart'; class Pratiche extends StatefulWidget { const Pratiche({Key? key}) : super(key: key); @override State createState() => _PraticheState(); } class _PraticheState extends State { late Future> shows; String searchString = ""; TextEditingController provincia = TextEditingController(); TextEditingController cod = TextEditingController(); TextEditingController codRar = TextEditingController(); TextEditingController concessionario = TextEditingController(); List provinceSicilia = ['', 'Agrigento', 'Caltanissetta', 'Catania', 'Enna', 'Messina', 'Palermo', 'Ragusa', 'Siracusa', 'Trapani']; bool nextPage = false; bool prevPage = false; int page = 1; int pageCount = 0; bool visibleList = false; Color coloreNotifica = Colors.white; @override void initState() { EasyLoading.dismiss(); super.initState(); shows = fetchShows(context, "", "", this.page, "", ""); updateNotificationColor(); } void updateNotificationColor() { setState(() { coloreNotifica = globals.userAccess.user.notifications ? Colors.red : Colors.white; }); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( iconTheme: IconThemeData(color: Colors.white), backgroundColor: HexColor(globals.colorAppbar), title: Center( child: Text( "Pratiche", style: TextStyle(color: Colors.white), ), ), actions: [ IconButton( onPressed: () { Navigator.push(context, MaterialPageRoute(builder: (context) => Notifiche())).then((value) { updateNotificationColor(); }); }, icon: Icon( Icons.notifications, color: coloreNotifica, ), ) ], ), drawer: Menu(), body: SingleChildScrollView( child: Column( children: [ Padding( padding: EdgeInsets.all(8), child: Container( child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ TextButton.icon( onPressed: () { clearFilters(); dialogFilter(context); }, icon: Icon(Icons.filter_list_rounded), label: Text("Filtri"), ), ], ), ), ), Visibility( visible: !visibleList, child: Padding( padding: EdgeInsets.symmetric(horizontal: 20), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( "Pagina $page di $pageCount", style: TextStyle(fontSize: 11, fontWeight: FontWeight.w600, fontStyle: FontStyle.italic), ), if (prevPage) TextButton.icon( onPressed: () => navigatePage(-1), icon: Icon(Icons.arrow_back_ios), label: Text(""), ), if (nextPage) TextButton.icon( onPressed: () => navigatePage(1), icon: Icon(Icons.arrow_forward_ios_rounded), label: Text(""), ), ], ), ), ), Visibility( visible: !visibleList, child: FutureBuilder>( future: shows, builder: (context, snapshot) { if (snapshot.connectionState != ConnectionState.done) { return Center( child: Padding( padding: EdgeInsets.only(top: 80), child: CircularProgressIndicator(), ), ); } if (snapshot.hasData) { return ListView.separated( physics: NeverScrollableScrollPhysics(), shrinkWrap: true, itemCount: snapshot.data!.length, itemBuilder: (context, index) => buildPraticaCard(snapshot.data![index]), separatorBuilder: (context, index) => Divider(), ); } else if (snapshot.hasError) { return Center( child: Padding( padding: EdgeInsets.all(20), child: Text('Nessuna corrispondenza trovata.'), ), ); } return Center( child: CircularProgressIndicator(), ); }, ), ), Visibility( visible: visibleList, child: Padding( padding: EdgeInsets.all(50), child: Center( child: ListTile( leading: Icon(Icons.warning), title: Text("La ricerca non ha fornito alcun risultato"), ), ), ), ), ], ), ), floatingActionButtonLocation: FloatingActionButtonLocation.miniEndFloat, floatingActionButton: Column( mainAxisAlignment: MainAxisAlignment.end, children: [ FloatingActionButton( onPressed: reloadList, tooltip: 'Ricarica la lista', child: Icon(Icons.refresh, color: HexColor(globals.colorAppbar)), backgroundColor: Colors.white, ), SizedBox(height: 10), ], ), ); } void clearFilters() { setState(() { provincia.text = ""; cod.text = ""; codRar.text = ""; concessionario.text = ""; }); } void navigatePage(int direction) { setState(() { page += direction; shows = fetchShows(context, provincia.text, cod.text, page, codRar.text, concessionario.text); }); } void reloadList() { setState(() { shows = fetchShows(context, "", "", 1, "", ""); }); } Widget buildPraticaCard(PraticheModel pratica) { return GestureDetector( onTap: () => showPraticaDetail(pratica), child: Card( elevation: 10, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(15.0)), margin: EdgeInsets.all(20), child: Column( children: [ Container( decoration: BoxDecoration( borderRadius: BorderRadius.only(topRight: Radius.circular(10), topLeft: Radius.circular(10)), color: HexColor(globals.coloreCard), ), padding: EdgeInsets.all(15), child: Column( children: [ Row( children: [ Text("ID: ${pratica.id}", style: TextStyle(color: Colors.white)), ], ), Row( children: [ Text("Codice identificativo: ${pratica.authority_identification_code_civil_engineering_office}", style: TextStyle(color: Colors.white)), ], ) ], ), ), Container( decoration: BoxDecoration( borderRadius: BorderRadius.only(bottomLeft: Radius.circular(10), bottomRight: Radius.circular(10)), color: Colors.white, ), padding: EdgeInsets.all(15), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text("Stato: ${pratica.water_drawing_paperwork_status.description}"), Text("Provincia: ${pratica.authority_province}"), Text("Data di rilascio: ${pratica.release_date.toString()}"), Text("Scadenza: ${pratica.expiration_date}"), Text("Creata il: ${pratica.controllable_object.created}"), Text("Modificata il: ${pratica.controllable_object.modified}"), Divider(height: 5), ], ), ), ], ), ), ); } void showPraticaDetail(PraticheModel pratica) { EasyLoading.show(status: "Caricamento in corso..."); ApiService().getData(pratica.id, "", 0).then((value) { EasyLoading.dismiss(); if (value['statusCode'].toString() == "200") { Navigator.push(context, MaterialPageRoute(builder: (context) => PraticheDettaglio(oggettoRicevuto: value))); } else { if (value['statusCode'].toString() == "401") { Utility().dialogAlert(this.context); } else { ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text(value["result"]))); } } }); } Future> fetchShows( BuildContext context, String provinciaScelta, String codice, int paginazione, String codiceDrar, String conc) async { String urlRiferimento = globals.url_endpoint + globals.listaPratica + "?page=$paginazione"; if (codice.isNotEmpty) urlRiferimento += "&cod=${codice.trim()}"; if (provinciaScelta.isNotEmpty) urlRiferimento += "&province=${provinciaScelta.trim()}"; if (codiceDrar.isNotEmpty) urlRiferimento += "&cod_drar=${codiceDrar.trim()}"; if (conc.isNotEmpty) urlRiferimento += "&surname=${conc.trim()}"; var response = await http.get(Uri.parse(urlRiferimento), headers: globals.headers); var data = json.decode(utf8.decode(response.bodyBytes)); print("###################"); print(data); print("###################"); if (response.statusCode == 200) { setState(() { prevPage = data['pagination']['hasPrevPage']; nextPage = data['pagination']['hasNextPage']; pageCount = data['pagination']['pageCount']; visibleList = ((data['waterDrawingPaperworks'] as List).isEmpty || !data.toString().contains("waterDrawingPaperworks")); }); var topShowsJson = data['waterDrawingPaperworks'] as List; return topShowsJson.map((show) => PraticheModel.fromJson(show)).toList(); } else if (response.statusCode == 401) { EasyLoading.dismiss(); Utility().dialogAlert(context); throw Exception('Unauthorized'); } else { throw Exception('Problemi nel caricare i dati: ${data["result"]}'); // Gestisce altri problemi di risposta } } void dialogFilter(BuildContext context) { showDialog( context: context, builder: (context) { return StatefulBuilder( builder: (context, setState) { return CupertinoAlertDialog( title: Text(''), content: Column( mainAxisSize: MainAxisSize.min, children: [ Row( children: [ Icon(Icons.filter_alt), Text("Filtri", style: TextStyle(fontSize: 18)), ], ), SizedBox(height: 10), TextField( decoration: InputDecoration(labelText: "Numero Pratica (GC)"), keyboardType: TextInputType.text, controller: cod, ), TextField( decoration: InputDecoration(labelText: "Numero Pratica (DRAR)"), keyboardType: TextInputType.text, controller: codRar, ), TextField( decoration: InputDecoration(labelText: "Cognome Concessionario:"), keyboardType: TextInputType.text, controller: concessionario, ), SizedBox(height: 20), SizedBox( width: double.infinity, child: DropdownButton( isExpanded: true, value: provincia.text.isNotEmpty ? provincia.text : null, hint: Text("Seleziona la provincia"), icon: Icon(Icons.arrow_downward), elevation: 16, underline: Container(height: 1, color: Colors.black), onChanged: (String? value) { setState(() { provincia.text = value!; }); }, items: provinceSicilia.map((String value) { return DropdownMenuItem( value: value, child: Text(value), ); }).toList(), ), ), ], ), actions: [ TextButton( onPressed: () { clearFilters(); Navigator.of(context).pop(); }, child: const Text('Annulla'), ), TextButton( onPressed: () { setState(() { page = 1; shows = fetchShows(context, provincia.text, cod.text, page, codRar.text, concessionario.text); }); Navigator.of(context).pop(); }, child: const Text('Avvia ricerca'), ), ], ); }, ); }, ); } }