Skip to content
Snippets Groups Projects
viewevents.dart 7.72 KiB
Newer Older
import 'dart:convert';
import 'package:flutter/material.dart';
import 'datamodel.dart';
import 'package:http/http.dart' as http;
import 'sensorconnector.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:
  EventStoreInstance _events = EventStoreInstance();
  String _sync_status = '';
Maximilian Betz's avatar
Maximilian Betz committed
  //TODO: add exception handling and display exceptions to user.
Maximilian Betz's avatar
Maximilian Betz committed

  @override
  void initState() {
    _sync_status = _events.getPendingEventCount().toString() + ' event(s) pending';
    super.initState();
  }

Maximilian Betz's avatar
Maximilian Betz committed
  Future<bool> syncEvents() async {
Maximilian Betz's avatar
Maximilian Betz committed
    //final EventStoreInstance events = EventStoreInstance();
Maximilian Betz's avatar
Maximilian Betz committed
    final ConfigurationStoreInstance configuration = ConfigurationStoreInstance();
    SensorConnector connection = SensorConnector();
Maximilian Betz's avatar
Maximilian Betz committed
    int _synccounter = 0;  //For displaying progress during event upload
    String? token = await connection.getAuthToken(configuration.loginInformation.mail,
        configuration.loginInformation.password);
    if (token != null) {
      _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++;
          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 status so that it is only exported once.
Maximilian Betz's avatar
Maximilian Betz committed
            setState(() {});
          }else{
            _sync_status = 'export failed: ' + event.urn;
Maximilian Betz's avatar
Maximilian Betz committed
        }
      }
      _sync_status = 'export success';
      return true;
Maximilian Betz's avatar
Maximilian Betz committed
    }
    return false;
Maximilian Betz's avatar
Maximilian Betz committed
  }
Maximilian Betz's avatar
Maximilian Betz committed

  @override
  Widget build(BuildContext context) {
Maximilian Betz's avatar
Maximilian Betz committed

    return Scaffold(
      appBar: AppBar(
        title: const Text("View Added Events"),
      ),
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(
                  '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)),
                      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,
Maximilian Betz's avatar
Maximilian Betz committed
                        controller: TextEditingController(  //Required to update field here
                            text: event.status,
                        ),
                        onFieldSubmitted: (val) {
                          event.status = val; //Update Database
                        },
Maximilian Betz's avatar
Maximilian Betz committed
      ),
      bottomNavigationBar: Row(
Maximilian Betz's avatar
Maximilian Betz committed
        mainAxisAlignment: MainAxisAlignment.spaceBetween,
        children: [
          const SizedBox(width: 10),
          Text(_sync_status),
          FloatingActionButton.extended(
            heroTag: null,
            tooltip: 'Upload Events',
            icon: null,
            label: const Text('Sync'),
            onPressed: () {
Maximilian Betz's avatar
Maximilian Betz committed
              syncEvents();
//TODO: allow editing fields here. Check validation of input value!