import 'dart:convert'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'datamodel.dart'; import 'package:http/http.dart' as http; class ViewEvents extends StatefulWidget { const ViewEvents({Key? key}) : super(key: key); @override _ViewEvents createState() => _ViewEvents(); } class _ViewEvents extends State<ViewEvents> { int _synccounter = 0; //For displaying progress during event upload Future<bool> syncEvents() async { final EventStoreInstance events = EventStoreInstance(); final ConfigurationStoreInstance configuration = ConfigurationStoreInstance(); String baseUrl = 'https://sandbox.sensor.awi.de/rest/sensors/events/putEvent/'; String url = ''; _synccounter = events.getPendingEventCount(); debugPrint('Number of Events: ' + events.events.length.toString()); debugPrint('Number of Pending Events: ' + _synccounter.toString()); var index = 0; for (var event in events.events){ if (event.status == 'PENDING') { debugPrint('Idx: ' + index.toString() + ' ' + event.toSensorJson().toString()); index++; url = baseUrl + event.id.toString() + '?createVersion=false'; debugPrint('XXX ' + Uri.parse(url).toString()); final response = await http.put(Uri.parse(url), headers: { "Content-Type": "application/json", "Cookie": "x-auth-token=72d9d4d20a33f87edca7e1ba01ce8db8" }, body: event.toSensorJson().toString(), encoding: Encoding.getByName("utf-8"), ); if (response.statusCode == 201) { _synccounter--; debugPrint('put success, remaining events: ' +_synccounter.toString()); event.status = 'EXPORTED'; //Update event status so that it is only exported once. //if(mounted){ // setState(() { //refresh the UI // });} setState(() { }); debugPrint(response.body.toString()); debugPrint(response.headers.toString()); debugPrint(response.headers['set-cookie']); } else { debugPrint('Header: ' + response.headers.toString()); debugPrint('Body: ' + response.body.toString()); debugPrint('StatusCode: ' + response.statusCode.toString()); throw Exception('Failed to put.'); } } } return true; } @override Widget build(BuildContext context) { // Get singleton to access locally stored events: final EventStoreInstance events = EventStoreInstance(); return Scaffold( appBar: AppBar( title: const Text("View Added Events"), ), body: SingleChildScrollView( scrollDirection: Axis.horizontal, child: SingleChildScrollView( scrollDirection: Axis.vertical, child: DataTable( columns: const <DataColumn>[ DataColumn( label: Text( 'Id', style: TextStyle(fontStyle: FontStyle.italic), ), ), DataColumn( label: Text( 'URN', style: TextStyle(fontStyle: FontStyle.italic), ), ), DataColumn( label: Text( 'Label', style: TextStyle(fontStyle: FontStyle.italic), ), ), DataColumn( label: Text( 'Type', style: TextStyle(fontStyle: FontStyle.italic), ), ), DataColumn( label: Text( 'Description', style: TextStyle(fontStyle: FontStyle.italic), ), ), DataColumn( label: Text( 'StartDate', style: TextStyle(fontStyle: FontStyle.italic), ), ), DataColumn( label: Text( 'EndDate', style: TextStyle(fontStyle: FontStyle.italic), ), ), DataColumn( label: Text( 'Latitude', style: TextStyle(fontStyle: FontStyle.italic), ), ), DataColumn( label: Text( 'Longitude', style: TextStyle(fontStyle: FontStyle.italic), ), ), DataColumn( label: Text( 'Elevation', style: TextStyle(fontStyle: FontStyle.italic), ), ), DataColumn( label: Text( 'Status', style: TextStyle(fontStyle: FontStyle.italic), ), ), ], rows: <DataRow>[ for (var event in events.events) DataRow( cells: <DataCell>[ DataCell(Text(event.id.toString())), DataCell(Text(event.urn)), DataCell( TextFormField( readOnly: true, initialValue: event.label, onFieldSubmitted: (val) { event.label = val; //Update Database }, ), ), DataCell(Text(event.type)), DataCell( TextFormField( readOnly: true, initialValue: event.description, onFieldSubmitted: (val) { event.description = val; //Update Database }, ), ), DataCell(Text(event.startDate)), DataCell(Text(event.endDate)), DataCell( TextFormField( readOnly: true, initialValue: event.latitude, onFieldSubmitted: (val) { event.latitude = val; //Update Database }, ), ), DataCell( TextFormField( readOnly: true, initialValue: event.longitude, onFieldSubmitted: (val) { event.longitude = val; //Update Database }, ), ), DataCell( TextFormField( readOnly: true, initialValue: event.elevation, onFieldSubmitted: (val) { event.elevation = val; //Update Database }, ), ), DataCell( TextFormField( readOnly: true, initialValue: event.status, onFieldSubmitted: (val) { event.status = val; //Update Database }, ), ), ], ), ], ), ), ), bottomNavigationBar: Row( mainAxisAlignment: MainAxisAlignment.end, children: [ FloatingActionButton.extended( heroTag: null, tooltip: 'Upload Events', icon: null, label: const Text('Sync'), onPressed: () { syncEvents(); //showDialog( // barrierDismissible: false, // context: context, // builder: (BuildContext context) => _buildPopupDialog(context), //); }, ), ], ), ); } Widget _buildPopupDialog(BuildContext context) { return AlertDialog( title: const Text('Uploading Events'), content: Column( mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.center, children: <Widget>[ //Text("Progress"), const CircularProgressIndicator(), const SizedBox(height: 10), Text('Remaining events to sync: ' + _synccounter.toString()), ], ), actions: <Widget>[ TextButton( onPressed: () { //syncEvents(); setState(() { }); //Navigator.of(context).pop(); }, //textColor: Theme.of(context).primaryColor, child: const Text('Close'), ), ], ); } } //TODO: allow editing fields here. Check validation of input value!