Skip to content
Snippets Groups Projects
viewevents.dart 8.79 KiB
Newer Older
import 'dart:io';
import 'package:flutter/material.dart';
import 'datamodel.dart';
import 'sensorconnector.dart';
Maximilian Betz's avatar
Maximilian Betz committed
import 'databaseconnector.dart';
Maximilian Betz's avatar
Maximilian Betz committed
class ViewEvents extends StatefulWidget {
  const ViewEvents({Key? key}) : super(key: key);
Maximilian Betz's avatar
Maximilian Betz committed
  @override
  _ViewEvents createState() => _ViewEvents();
}
Maximilian Betz's avatar
Maximilian Betz committed
class _ViewEvents extends State<ViewEvents> {
Maximilian Betz's avatar
Maximilian Betz committed
  // Get singleton to access locally stored events:
  final EventStoreInstance _events = EventStoreInstance();
  String _status = '';
  TextStyle _statusStyle = const TextStyle(color: Colors.black);
Maximilian Betz's avatar
Maximilian Betz committed
  var database = DatabaseInstance();
  List<Event> _localEvents = [];
Maximilian Betz's avatar
Maximilian Betz committed


  Future<void> fetchEventsFromDb() async{
    _localEvents = await database.getEvents();
    int pendingEvents = await database.getPendingEventCnt();
    _status = pendingEvents.toString() + ' event(s) pending';
    _statusStyle = const TextStyle(color: Colors.black);
Maximilian Betz's avatar
Maximilian Betz committed
    setState(() {});  //Got events from database, so update UI
  }
Maximilian Betz's avatar
Maximilian Betz committed

  @override
  void initState() {
    super.initState();
Maximilian Betz's avatar
Maximilian Betz committed
    fetchEventsFromDb();
  Future<void> syncEvents() async {
Maximilian Betz's avatar
Maximilian Betz committed
    final ConfigurationStoreInstance configuration = ConfigurationStoreInstance();
    SensorConnector connection = SensorConnector();
Maximilian Betz's avatar
Maximilian Betz committed

    List<Event> events = await database.getPendingEvents();
    int syncCounter = events.length;
Maximilian Betz's avatar
Maximilian Betz committed
    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');
Maximilian Betz's avatar
Maximilian Betz committed
        }
        _status = 'export success';
        _statusStyle = const TextStyle(color: Colors.green);
      } catch (e) {
        debugPrint('Exception: $e');
        _status = '$e';
        _statusStyle = const TextStyle(color: Colors.red);
        setState(() {});
Maximilian Betz's avatar
Maximilian Betz committed
      }
    }else{
      debugPrint('No PENDING event(s)');
Maximilian Betz's avatar
Maximilian Betz committed
    }
  }
Maximilian Betz's avatar
Maximilian Betz committed

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text("View & Sync"),
Maximilian Betz's avatar
Maximilian Betz committed
      body: Container(
        margin: const EdgeInsets.symmetric(horizontal: 5.0),
        child:
        SingleChildScrollView(
          scrollDirection: Axis.horizontal,
          child: SingleChildScrollView(
            scrollDirection: Axis.vertical,
            child: DataTable(
Maximilian Betz's avatar
Maximilian Betz committed

              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),
                  ),
              ],
              rows: <DataRow>[
                for (var event in _localEvents)
                  DataRow(
                    cells: <DataCell>[
                      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
                          },
                        ),
                      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,
                          controller: TextEditingController(  //Required to update field here
Maximilian Betz's avatar
Maximilian Betz committed
                            text: event.status,
                          ),
                          onFieldSubmitted: (val) {
                            event.status = val; //Update Database
                          },
Maximilian Betz's avatar
Maximilian Betz committed
                        ),
      bottomNavigationBar: Row(
        mainAxisAlignment: MainAxisAlignment.end,
        children: [
          const SizedBox(width: 10),
          Text(_status, style: _statusStyle),
          const SizedBox(width: 50),
          Container(
            margin: const EdgeInsets.symmetric(vertical: 10.0),
            child:
            FloatingActionButton.extended(
              heroTag: null,
              tooltip: 'Upload Events',
              icon: null,
              label: const Text('Sync'),
              onPressed: () {
                syncEvents();
              },
            ),
Maximilian Betz's avatar
Maximilian Betz committed
          const SizedBox(width: 5.0),
Maximilian Betz's avatar
Maximilian Betz committed
//TODO: allow editing fields here.