diff --git a/lib/addevent.dart b/lib/addevent.dart index 32e44f63223a3faa884078a1688146e5d3ff1afd..3a5582e119cf8a5021256b500491b914b24f02ac 100644 --- a/lib/addevent.dart +++ b/lib/addevent.dart @@ -1,9 +1,13 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:flutter_datetime_picker/flutter_datetime_picker.dart'; import 'datamodel.dart'; import 'dart:async'; import 'package:geolocator/geolocator.dart'; +import 'package:intl/intl.dart'; +import 'package:datetime_picker_formfield/datetime_picker_formfield.dart'; + class AddEvent extends StatefulWidget { const AddEvent({Key? key}) : super(key: key); @@ -105,10 +109,11 @@ class _AddEventPageState extends State<AddEvent> { eventsStore.currentEvent.type, eventsStore.currentEvent.description, eventsStore.currentEvent.status, + eventsStore.currentEvent.startDate, + eventsStore.currentEvent.endDate, eventsStore.currentEvent.latitude, eventsStore.currentEvent.longitude, eventsStore.currentEvent.elevation - //TODO: add timestamp! Begin & End )); } @@ -209,6 +214,40 @@ class _AddEventPageState extends State<AddEvent> { eventsStore.currentEvent.description = value; }, ), + TextFormField( + controller: TextEditingController(text: eventsStore.currentEvent.startDate), + readOnly: true, + decoration: const InputDecoration( + labelText: 'Timestamp', + //helperText: '', //Adds some space below field + border: OutlineInputBorder(), + ), + onTap: () { + DatePicker.showDateTimePicker(context, + showTitleActions: true, + onConfirm: (date) { + //Only one field for start and end date. + eventsStore.currentEvent.startDate = '$date'; + eventsStore.currentEvent.endDate = '$date'; + debugPrint('Date set to : $date'); + setState(() { + }); + }, + currentTime: DateTime.now().toUtc(), + locale: LocaleType.en); + }, + ), + ElevatedButton( + onPressed: () { + var date = DateTime.now().toUtc(); + eventsStore.currentEvent.startDate = '$date'; + eventsStore.currentEvent.endDate = '$date'; + debugPrint('Date set to : ' + eventsStore.currentEvent.endDate.toString()); + setState(() { + }); + }, + child: Text('Now'), + ), TextFormField( readOnly: false, enabled: !syncGNSSData, diff --git a/lib/datamodel.dart b/lib/datamodel.dart index cc65b9b66475b4e85f5629cbd638168e82487e84..6f161b4983dd45dd330c8d1daed9bc816f0e87d5 100644 --- a/lib/datamodel.dart +++ b/lib/datamodel.dart @@ -52,6 +52,8 @@ class Event{ String type; String description; String status; + String startDate; + String endDate; String latitude; String longitude; String elevation; @@ -63,6 +65,8 @@ class Event{ this.type, this.description, this.status, + this.startDate, + this.endDate, [this.latitude = "", this.longitude = "", this.elevation = ""] @@ -75,6 +79,8 @@ class Event{ parsedJson['type'] as String, parsedJson['description'] as String, parsedJson['status'] as String, + parsedJson['startDate'] as String, + parsedJson['endDate'] as String, "", "", "", @@ -195,7 +201,7 @@ class ConfigurationStoreInstance extends ConfigurationStoreBase { abstract class EventStoreBase{ List<Event> events = []; - Event currentEvent = Event(0, 'urn0', '', '', '', 'PENDING'); + Event currentEvent = Event(0, 'urn0', '', '', '', 'PENDING', '', ''); } class EventStoreInstance extends EventStoreBase { @@ -207,11 +213,11 @@ class EventStoreInstance extends EventStoreBase { EventStoreInstance._internal() { events = []; - currentEvent = Event(0, 'urn0', '', '', '', 'PENDING'); + currentEvent = Event(0, 'urn0', '', '', '', 'PENDING', '', ''); } void reset(){ events = []; - currentEvent = Event(0, 'urn0', '', '', '', 'PENDING'); + currentEvent = Event(0, 'urn0', '', '', '', 'PENDING', '', ''); } } diff --git a/lib/login.dart b/lib/login.dart index 4cb9efe624e2ac6ac94be34ffba8b37e60ca246d..16a3884b331a84ec4637eef2f959874f7df57158 100644 --- a/lib/login.dart +++ b/lib/login.dart @@ -11,7 +11,6 @@ Future<int> login() async { String url = 'https://sandbox.sensor.awi.de/rest/sensors/contacts/login'; debugPrint("Start login to : " + url); - // New Test: https://stackoverflow.com/questions/58197496/flutter-post-login-with-email-and-password-with-content-type-application-x-www-f Map<String, dynamic> body = {'username': configuration.loginInformation.mail, 'authPassword': configuration.loginInformation.password}; String encodedBody = body.keys.map((key) => "$key=${body[key]}").join("&"); debugPrint(encodedBody); @@ -40,8 +39,6 @@ Future<int> login() async { debugPrint('Body: ' + response.body.toString()); debugPrint('StatusCode: ' + response.statusCode.toString()); throw Exception('Failed to login'); - - } return 0; diff --git a/lib/main.dart b/lib/main.dart index 74c9d15dc7acc9d031d196fded72bde769042496..456ee90ad7e62163b23c2b41a5b28eea1809963e 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -34,6 +34,9 @@ void main() { events.currentEvent.description = 'blabla'; events.currentEvent.label = 'PS129_ABC'; events.currentEvent.type = 'Deployment'; + events.currentEvent.startDate = '2022-03-09 15:06:00.000Z'; + events.currentEvent.endDate = '2022-03-09 15:08:00.000Z'; + //Add some dummy events to event store. Just development purpose. TODO: Remove after development. events.events.add(Event.fromJson({ @@ -42,7 +45,9 @@ void main() { 'label': 'SML_KO21_SC01', 'type': 'Deployment', 'description': 'Remi tool Tag1 1 Traverse', - 'status': 'PENDING' + 'status': 'PENDING', + 'startDate': '2022-03-08T05:29:26Z', + 'endDate': '2022-03-08T06:29:26Z' })); events.events.add(Event.fromJson({ 'id': 8311, @@ -50,7 +55,9 @@ void main() { 'label': 'SML_KO21_SC01', 'type': 'Deployment', 'description': 'Remi tool Tag1 1 Traverse', - 'status': 'PENDING' + 'status': 'PENDING', + 'startDate': '2022-03-08T05:29:26Z', + 'endDate': '2022-03-08T06:29:26Z' })); events.events.add(Event.fromJson({ 'id': 8311, @@ -58,7 +65,9 @@ void main() { 'label': 'SML_KO21_SC01', 'type': 'Deployment', 'description': 'Remi tool Tag1 1 Traverse', - 'status': 'PENDING' + 'status': 'PENDING', + 'startDate': '2022-03-08T05:29:26Z', + 'endDate': '2022-03-08T06:29:26Z' })); events.events.add(Event.fromJson({ 'id': 8311, @@ -66,7 +75,9 @@ void main() { 'label': 'SML_KO21_SC01', 'type': 'Deployment', 'description': 'Remi tool Tag1 1 Traverse', - 'status': 'PENDING' + 'status': 'PENDING', + 'startDate': '2022-03-08T05:29:26Z', + 'endDate': '2022-03-08T06:29:26Z' })); //Add some dummy eventtypes. diff --git a/lib/viewevents.dart b/lib/viewevents.dart index 2e1988f591eba8c4b13d53c27019d63b513037af..2280ff4fda0749119155fa3d85fab8ef37037511 100644 --- a/lib/viewevents.dart +++ b/lib/viewevents.dart @@ -160,7 +160,7 @@ class ViewEvents extends StatelessWidget { icon: null, label: const Text('Upload'), onPressed: () { - // Login + }, ), ], diff --git a/pubspec.lock b/pubspec.lock index bcd47c7b2eacdcddc8cd8f45744aa748fee869b9..a025b83c8f90ce5e0a8a3aa67f2e21fb7da1b30e 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -64,6 +64,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.4" + datetime_picker_formfield: + dependency: "direct main" + description: + name: datetime_picker_formfield + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.0" fake_async: dependency: transitive description: @@ -90,6 +97,13 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_datetime_picker: + dependency: "direct main" + description: + name: flutter_datetime_picker + url: "https://pub.dartlang.org" + source: hosted + version: "1.5.1" flutter_lints: dependency: "direct dev" description: @@ -184,6 +198,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "4.0.0" + intl: + dependency: transitive + description: + name: intl + url: "https://pub.dartlang.org" + source: hosted + version: "0.17.0" js: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 75a049dd672103a0d9fe6d19a48c357062315101..ef189761812de6ecded8f76f9fce2e3e7a6b82f8 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -34,6 +34,8 @@ dependencies: http: ^0.13.4 geolocator: ^8.1.1 flutter_login: ^3.1.0 + datetime_picker_formfield: ^2.0.0 + flutter_datetime_picker: ^1.5.1 # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons.