Newer
Older
import 'package:flutter/material.dart';
import 'datamodel.dart';
import 'sensorconnector.dart';
class ViewEvents extends StatefulWidget {
const ViewEvents({Key? key}) : super(key: key);
@override
_ViewEvents createState() => _ViewEvents();
}
final EventStoreInstance _events = EventStoreInstance();
String _status = '';
TextStyle _statusStyle = const TextStyle(color: Colors.black);

Maximilian Betz
committed
String _appBarText = '';

Maximilian Betz
committed
final EventStoreInstance event = EventStoreInstance();
int pendingEvents = 0;
if (event.showAllEvents == false) {
_appBarText = 'Pending Events';
//Get only pending events
_localEvents = await database.getPendingEvents();
pendingEvents = _localEvents.length;
}else {
_appBarText = 'All Events';
_localEvents = await database.getEvents();
pendingEvents = await database.getPendingEventCnt();
}
_status = pendingEvents.toString() + ' event(s) pending';
_statusStyle = const TextStyle(color: Colors.black);

Maximilian Betz
committed
setState(() {}); //Got events from database, so update UI
@override
void initState() {
super.initState();
@override
void dispose() async {
/*Async update current configuration to shared preferences*/
final EventStoreInstance event = EventStoreInstance();
event.storeToSharedPrefs();
super.dispose();
}
final ConfigurationStoreInstance configuration = ConfigurationStoreInstance();
SensorConnector connection = SensorConnector();
List<Event> events = await database.getPendingEvents();
int syncCounter = events.length;
debugPrint('Pending Events');
for (var event in events){
debugPrint(event.toString());
}
if(syncCounter > 0) {
try {
String? token = await connection.getAuthToken(
configuration.loginInformation.mail,
configuration.loginInformation.password);
var index = 0;
for (var event in events) {
debugPrint('Idx: ' + index.toString() + ' ' +
event.toSensorJson().toString());
index++;
if (await connection.putEvent(event, token) == true) {
//Event has been posted to Sensor.
syncCounter--;
debugPrint(
'put success, remaining events: ' + syncCounter.toString());
event.status = 'EXPORTED'; //Update event to export only once
database.updateEvent(event); //Update Event as exported in SQL Database
await fetchEventsFromDb(); //update view list //TODO: this is bad for the sync performance!
setState(() {});
} else {
throw Exception('Sync for ' + event.urn + 'failed');
_status = 'export success';
_statusStyle = const TextStyle(color: Colors.green);
String errorText = e.toString();
errorText = errorText.substring(10, errorText.length); //Remove 'Exception' from string.
_status = errorText;
_statusStyle = const TextStyle(color: Colors.red);
debugPrint('No PENDING event(s)');
@override
Widget build(BuildContext context) {

Maximilian Betz
committed
final EventStoreInstance event = EventStoreInstance();
return Scaffold(
appBar: AppBar(

Maximilian Betz
committed
actions: <Widget>[
Text(_appBarText, style: const TextStyle(fontStyle: FontStyle.italic),),
Switch( //Enable showing all or only pending events. Default is to show only pending events
value: event.showAllEvents,
onChanged: (value) {
event.showAllEvents = value;
fetchEventsFromDb();
setState(() {});
}),
],
margin: const EdgeInsets.symmetric(horizontal: 5.0),
child:
SingleChildScrollView(
scrollDirection: Axis.horizontal,
child: SingleChildScrollView(
scrollDirection: Axis.vertical,
child: DataTable(
columns: const <DataColumn>[
DataColumn(
label: Text(
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),
),
DataCell(Text(event.urnId.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
},
),

Maximilian Betz
committed
//Do not show microseconds
DataCell(Text(event.startDate.substring(0, 19) + 'Z')),
DataCell(Text(event.endDate.substring(0, 19) + 'Z')),
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 == '' ? '' : double.parse(event.elevation).toStringAsFixed(2),
onFieldSubmitted: (val) {
event.elevation = val; //Update Database
},
),
DataCell(
TextFormField(
readOnly: true,
controller: TextEditingController( //Required to update field here
),
onFieldSubmitted: (val) {
event.status = val; //Update Database
},
bottomNavigationBar: Container(
margin: const EdgeInsets.symmetric(vertical: 10.0, horizontal: 5.0),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
const SizedBox(width: 1),
Text(_status, style: _statusStyle),
FloatingActionButton.extended(
heroTag: null,
tooltip: 'Upload Events',
icon: null,
label: const Text('Sync'),
onPressed: () {
syncEvents();
},
),
],
),